การติดตั้งและกำหนดค่า Memcached ตัวอย่างโปรแกรมในตัวอย่าง PHP PHP memcached

บทความสำหรับผู้เริ่มต้น- Memcached เป็นสิ่งสำหรับการแคชข้อมูลใน RAM ของเซิร์ฟเวอร์

ประเด็นคืออะไร? โดยปกติไซต์จะรับข้อมูลจากฐานข้อมูล และฐานข้อมูลเป็นไฟล์ขนาดใหญ่บนดิสก์ และการอ่านจากดิสก์จะช้ากว่าจากหน่วยความจำ สิ่งนี้จะไม่ปรากฏทันที - ทันทีที่มีผู้เข้าร่วมเกินหลายหมื่นคนและตารางในฐานข้อมูลก็เพิ่มขึ้นเป็นหลายแสนแถว นอกจากนี้ฐานข้อมูลเองก็ไม่มีประสิทธิภาพตามคำจำกัดความ สมมติว่าเราเก็บโพสต์ไว้ 1,000,000 โพสต์ในฐานข้อมูล แต่ในช่วงไม่กี่วันที่ผ่านมา 95% ของการดูทั้งหมดมีเพียง 100 โพสต์ แต่ทุกครั้งที่เราต้องเข้าไปในไฟล์ฐานข้อมูลขนาดใหญ่และค้นหาบันทึกที่มีการร้องขอบ่อยครั้งในนั้น - และนี่จะเป็นการเพิ่มภาระบนเซิร์ฟเวอร์และเวลาที่ใช้ในการเปิดไซต์ หากเราใส่รายการเหล่านี้ไว้ในแคช เราจะเร่งความเร็วไซต์และไม่จำเป็นต้องซื้อเซิร์ฟเวอร์ที่มีประสิทธิภาพ สรุป, เงินสดคือกำไร!

การแคชมาในรูปแบบที่แตกต่างกัน สิ่งที่ง่ายที่สุดคือการแคชบน. ข้อเสียคือข้อมูลยังคงถูกจัดเก็บไว้ในดิสก์ และอาจนำไปสู่ผลลัพธ์ที่ร้ายแรงได้ คุณสามารถแคชผลลัพธ์ระดับกลางในฐานข้อมูลได้ (เช่น ผลการค้นหาในกลไกฟอรัมบางตัวจะถูกจัดเก็บไว้ในฐานข้อมูล) แน่นอนว่าสิ่งที่มีประสิทธิภาพที่สุดคือที่เก็บข้อมูลใน RAM มีโปรแกรมของบุคคลที่สามมากมายสำหรับสิ่งนี้: Memcached, eAccelerator, APC, XCache อย่างไรก็ตาม MySQL ยังสามารถจัดเก็บข้อมูลไว้ในแคชได้ (เราไม่ได้พูดถึงดัชนีในหน่วยความจำ)

โดยทั่วไป พวกเขาเขียนว่า eAccelerator และ XCache มีประสิทธิภาพมากกว่า Memcached หากคุณใช้เซิร์ฟเวอร์เดียว เนื่องจากในกรณีของ Memcached คุณต้องเปิดการเชื่อมต่อ TCP แต่ Memcached มีข้อได้เปรียบหลัก นั่นคือความสามารถในการกระจายข้อมูลไปยังเซิร์ฟเวอร์หลายเครื่อง ตัวอย่างเช่นแคช LiveJournal จะไม่พอดีกับหน่วยความจำของเซิร์ฟเวอร์ที่ทรงพลังที่สุด จริงๆ แล้ว Memcached ถูกคิดค้นขึ้นสำหรับ LiveJournal เพื่อให้สามารถจัดเก็บข้อมูลบนเซิร์ฟเวอร์หลายเครื่องได้ แต่สำหรับพวกเรามือใหม่ ยังเร็วเกินไปที่จะคิดเรื่องนี้

คุณสมบัติของ Memcached

  • โครงสร้างการจัดเก็บข้อมูลอย่างง่าย (คีย์-ค่า)
  • อายุการใช้งานแคชสูงสุดคือ 30 วัน
  • ปริมาณสูงสุดขององค์ประกอบหนึ่งคือ 1 Mb
  • คุณสามารถจัดเก็บวัตถุและอาร์เรย์ตามที่เป็นอยู่ เมื่อทำการแคชในไฟล์หรือในฐานข้อมูล สิ่งเหล่านี้จะต้องใส่ลงในสตริงโดยใช้การทำให้เป็นอนุกรมก่อนที่จะบันทึก
  • ไม่มีการอนุญาต (รหัสผ่านเข้าสู่ระบบ) เหล่านั้น. หากเซิร์ฟเวอร์มี Memcached ผู้ใช้บนเซิร์ฟเวอร์เดียวกันก็สามารถเข้าถึงได้
  • ความเร็วของการเข้าถึงข้อมูลไม่ได้ขึ้นอยู่กับจำนวนองค์ประกอบในแคช ใช่ ใช่ เป๊ะเลย

การติดตั้ง

มีคำแนะนำในการติดตั้งมากมายบนเน็ต ไม่ว่าจะเป็นบน Unix หรือ Windows นอกจาก Memcached แล้ว คุณยังต้องติดตั้ง lib เพื่อเข้าถึง Memcached ผ่าน PHP (โดยการเปรียบเทียบกับฐานข้อมูล MySQL - นอกเหนือจากฐานข้อมูลแล้ว คุณยังต้องติดตั้งส่วนขยาย mysql หรือ mysqli ด้วย)

แต่วิธีที่ง่ายที่สุดคือเขียนถึงโฮสต์ บน fastvps เมื่อสั่งซื้อเซิร์ฟเวอร์ Memcached จะถูกติดตั้งตามค่าเริ่มต้น สิ่งสำคัญคือการระบุจำนวนหน่วยความจำที่ต้องจัดสรรให้กับแคช โดยค่าเริ่มต้นคือ 67 Mb ฉันมี RAM 4 Gb ดังนั้นฉันจึงสามารถจัดสรร 1 Gb ได้อย่างปลอดภัย โดยทั่วไป วิธีที่ง่ายที่สุดในการประมาณจำนวนหน่วยความจำที่จำเป็นสำหรับแคชคือการคูณขนาดของฐานข้อมูลด้วย 2 ตัวอย่างเช่น ฐานข้อมูลบนไซต์ทั้งหมดของเรามีน้ำหนัก 300 MB จากนั้นเราจะจัดสรร 600 MB สำหรับแคช หรือ ควรใช้ 1 GB โดยมีระยะขอบดีกว่า

Memcached สามารถดูได้ใน phpinfo

การตรวจสอบ

โดยปกติแล้ว Memcached จะทำงานบน localhost และสามารถเข้าถึงได้ผ่านพอร์ต 11211
มาดูสถิติกัน

เชื่อมต่อ("localhost",11211); print_r($memcache->getStats()); -

ผลลัพธ์:
อาร์เรย์
=> 5915
=> 583
=> 1309538445
=> 1.2.2
=> 64
=> 0.000000
=> 0.004000
=> 0
=> 0
=> 0
=> 1
=> 2
=> 2
=> 0
=> 0
=> 0
=> 0
=> 0
=> 7
=> 0
=> 1073741824
=> 1
)

สักพักสถิติจะออกมาประมาณนี้

อาร์เรย์
=> 5915
=> 6202245
=> 1315740107
=> 1.2.2
=> 64
=> 3.464216
=> 10.868679
=> 298
=> 17728
=> 120366
=> 1
=> 28654
=> 4
=> 133296
=> 17728
=> 124758
=> 8538
=> 0
=> 11125692
=> 103815319
=> 1073741824
=> 1
)

พารามิเตอร์พื้นฐาน:
=> 298 - จำนวนองค์ประกอบปัจจุบันที่อยู่ในแคช
=> 17728 - จำนวนองค์ประกอบทั้งหมดที่อยู่ในแคช (รวมถึงองค์ประกอบที่ถูกลบ)
=> 120366 - ปัจจุบันมีไบต์จำนวนเท่าใดในแคช
=>1073741824 - โดยทั่วไปมีกี่ไบต์สำหรับแคช (ที่นี่ 1 Gb)
=> 124758 - กี่ครั้งที่เราดึงข้อมูลจากแคช
=> 8538 - กี่ครั้งที่เราพยายามดึงข้อมูลจากแคช แต่ไม่มีข้อมูลนั้นหรือแคชหมดอายุการใช้งาน

อัตราส่วน get_misses/get_hits แสดงประสิทธิภาพของการใช้แคช ยิ่งมีขนาดเล็กเท่าใด แคชก็จะยิ่งมีประสิทธิภาพมากขึ้นเท่านั้น ในกรณีนี้ เราพบว่า 93% ของข้อมูลถูกนำมาจากแคช หากคุณ get_misses/get_hits=1 แสดงว่าคุณกำลังทำอะไรผิด (เป็นไปได้มากว่าคุณจะตั้งค่าอายุการใช้งานแคชต่ำเกินไป)

สถิติภาพ
โค้ดด้านบนแสดงสถิติในรูปแบบแห้ง เช่น print_r()
มีผลลัพธ์สถิติที่สวยงาม - phpMemcachedAdmin

นี่เป็นสคริปต์ PHP ปกติ คุณเปิดมันบนเว็บไซต์ของคุณและรับการออกแบบที่สวยงาม
ไม่จำเป็นต้องกำหนดค่าอะไรเลย โดยค่าเริ่มต้นจะเชื่อมต่อกับ localhost:11211
คุณสามารถดาวน์โหลดได้ที่หน้าอย่างเป็นทางการ

ตัวอย่างการใช้งาน Memcache

สมมติว่าเรามีสตริง "test111" เราต้องการแคชเป็นเวลา 1 วัน เรามาสร้างคีย์ "key1" ขึ้นมากันดีกว่า

เชื่อมต่อ("localhost",11211); $memcache->set("key1", "test111", false, 86400); // แคชเป็นเวลา 1 วัน $get_result = $memcache->get("key1"); // รับข้อมูล print_r($get_result); -

มาทำให้เรื่องซับซ้อนกันหน่อย

get($key)) ( $get_result = $memcache->get($key); print_r($get_result); ) else ( $result = "test222"; // $result คือผลลัพธ์ของการคำนวณหรือตัวอย่างจาก ฐานข้อมูล $memcache->set($key, $result, false, 86400); echo "บันทึกแคชเป็นเวลา 1 วัน" ?>

เฉพาะการเปิดตัวสคริปต์นี้ครั้งที่สองเท่านั้นที่เราจะดูข้อมูลของเรา

ฉันลืมเพิ่มเกี่ยวกับอายุการใช้งานแคชด้วย Memcached มีขีดจำกัดอายุการใช้งาน 1 เดือน ดังนั้นหากคุณตั้งค่าเป็น 365 วัน Memcached ก็จะไม่บันทึกและจะไม่ทำให้เกิดข้อผิดพลาดใด ๆ ดังนั้น หากข้อมูลของคุณไม่เปลี่ยนแปลงเป็นเวลานาน และคุณต้องการตั้งค่าอายุการใช้งานสูงสุด ให้ระบุเป็นเท็จ
$memcache->set($key, $result, false, false);

คุณสมบัติของการตั้งชื่อคีย์ ควรใช้ md5(key) เป็นคีย์ เนื่องจากความยาวคีย์สูงสุดคือ 250 อักขระ และไม่สามารถใช้ช่องว่างได้ และเมื่อคุณแคชคำสั่ง SQL ด้วยเงื่อนไข คีย์จะเป็นเช่น $key = "blog_id_1 WHERE Activity=1 AND ... AND ... LIMIT 10"

นอกจากนี้คุณยังต้องเพิ่มค่าคงที่ให้กับคีย์ด้วยซึ่งจะกำหนดว่าแคชเป็นของไซต์ใด
$key = md5(โครงการ "key2"); // โดยที่ค่าคงที่คือ PROJECT="site.com"

หากยังไม่เสร็จสิ้น ไซต์ที่สองบนเซิร์ฟเวอร์เดียวกันอาจเขียนทับข้อมูลของไซต์แรกด้วยคีย์เดียวกัน ความจริงก็คือ Memcached ไม่มีสิทธิ์เช่นฐานข้อมูล ดังนั้นคุณต้องจำกัดการเข้าถึงด้วยวิธีนี้ กล่าวโดยสรุป Memcached เป็นการถ่ายโอนข้อมูลคู่คีย์-ค่าจำนวนมาก ดังนั้นไซต์ทั้งหมดจะเก็บแคชไว้ใน Memcached เดียว ในขณะเดียวกัน เราไม่สามารถรับองค์ประกอบที่บันทึกไว้ 10 รายการสุดท้ายได้ (เช่น ในฐานข้อมูล LIMIT 10) โครงสร้างของ Memcached นั้นเรียบง่ายมาก แต่ด้วยเหตุนี้ เราจึงได้รับประสิทธิภาพสูง

การแท็ก

เนื่องจาก Memcached นั้นง่ายมาก (ข้อมูลไม่ได้เชื่อมโยงถึงกัน แต่อย่างใด - มีเพียงความสัมพันธ์ระหว่างคีย์-ค่า) จึงเกิดปัญหาในทางปฏิบัติ สมมติว่าเรามีบล็อกเหมือนในHabré เราเขียนโพสต์และบันทึกไว้ในแคช เราสร้างคู่คีย์-ค่าหลายคู่: แคชสำหรับโพสต์ แคชสำหรับบล็อกที่แสดงโพสต์นี้ แคชสำหรับการถ่ายทอดสด แคชสำหรับแสดงโพสต์ของผู้ใช้ในโปรไฟล์ของผู้ใช้ ฯลฯ

$memcache->set("post_id_2211", "data");
$memcache->set("post_blog_id_11", "data");
$memcache->set("live_posts", "data");
$memcache->set("post_user_id_331", "data");

แต่จู่ๆ ผู้ดูแลก็ลบโพสต์ออกไป เราจำเป็นต้องล้างแคชทั้งหมดที่เกี่ยวข้องกับโพสต์นี้

$memcache->delete("post_id_2211");
$memcache->delete("post_blog_id_11");
$memcache->delete("live_posts");
$memcache->delete("post_user_id_331");

กล่าวโดยสรุป เนื่องจากความเรียบง่ายของ Memcached เราจึงต้องสร้างโค้ดเพิ่มเติมด้วยตนเอง ยิ่งไปกว่านั้น เราต้องจำไว้เสมอว่าแคชใดเชื่อมโยงกับแคชอื่น วิธีแก้ปัญหานั้นง่ายมาก เราแนบแท็กหรือหลายแท็กไว้กับแต่ละองค์ประกอบแคช
คุณสามารถอ่านเพิ่มเติมได้

ฝึกฝน

ในทางปฏิบัติไม่มีใครใช้ Memcached ล้วนๆ โดยปกติแล้วพวกเขาจะใช้คลาส wrapper ที่รองรับการแท็ก วิธีแก้ปัญหาที่พบบ่อยที่สุดคือ ZendCache

ดาวน์โหลดในไฟล์เก็บถาวรเดียวพร้อมตัวอย่างทั้งหมด
มาใส่คลาส ZendCache ลงในโฟลเดอร์ lib

โครงสร้างควรเป็นเช่นนี้เมื่อมองจากราก
/lib/DklabCache/...
/class/แคช.class.php
/stat.php
/get_post.php
/update_post.php

คลาส Wrapper (หรือที่เรียกกันว่า - wrapper) โดยใช้ ZendCache

array(array("host" => MEMCACHED_HOST, "port" => MEMCACHED_PORT, "persistent" => false),), "compression" => false,); self::$instance = แคชใหม่; ตนเอง::$instance->memcache = ใหม่ Dklab_Cache_Backend_TagEmuWrapper(ใหม่ Zend_Cache_Backend_Memcached($aConfigMem)); ) else ( return NULL; ) ) กลับ self::$instance; ) ฟังก์ชั่นสาธารณะ get($key) ( return $this->memcache->load($key); ) public function set($key, $value, $tags=array(), $timeLife=false) ( return $this ->memcache->save($value, $key, $tags, $timeLife); ฟังก์ชั่นสาธารณะลบ($key) ( $this->memcache->remove($key); ) ฟังก์ชั่นสาธารณะสะอาด($cMode = Zend_Cache ::CLEANING_MODE_ALL, $tags = array()) ( return $this->memcache->clean($cMode,$tags); ) ฟังก์ชั่นสาธารณะ __construct() ( ) ฟังก์ชั่นสาธารณะ __clone() ( ) ) ?>

นี่คือคลาสซิงเกิลตันของเรา กล่าวง่ายๆ ก็คือในการเรียกครั้งแรก อินสแตนซ์ของคลาสจะถูกสร้างขึ้น (อ่าน การเชื่อมต่อกับ Memcached) และใช้ในการเรียกครั้งถัดไป ดังนั้นภายในสคริปต์เดียว เราจะไม่สร้างการเชื่อมต่อที่ไม่จำเป็นและประหยัดทรัพยากร

ค่าคงที่ CACHE_USE ถูกระบุแยกต่างหากในการกำหนดค่า คุณสามารถเปิดใช้งาน/ปิดใช้งานการแคชได้

พารามิเตอร์ "compression" => false หมายความว่าเราไม่บีบอัดข้อมูลในแคช การบีบอัดเป็นสิ่งจำเป็นเพื่อประหยัดพื้นที่หน่วยความจำ แต่การบีบอัดจะใช้เวลาระยะหนึ่ง ดังนั้นหากจำนวนหน่วยความจำไม่สำคัญสำหรับคุณ เราจะปิดการใช้งานให้กระชับยิ่งขึ้น

พารามิเตอร์ "persistent" => false หมายถึงการปิดใช้งานการเชื่อมต่อแบบถาวร (คล้ายกับ mysql_pconnect())

คุณสามารถดูวิธีใช้เซิร์ฟเวอร์หลายเครื่องได้ที่นี่ หากเรามี 1 เซิร์ฟเวอร์

"เซิร์ฟเวอร์" => array(array("host" => "localhost", "port" => 11211, "persistent" => false),)

ตัวอย่างเช่น เรามีเซิร์ฟเวอร์ Memcached 3 เครื่อง

"เซิร์ฟเวอร์" => array(array("host" => "11.33.45.11", "port" => 11211, "persistent" => false), array("host" => "11.33.45.12", "port " => 11211, "ถาวร" => false), array("host" => "11.33.45.13", "port" => 11211, "persistent" => false),)

ในทางที่ดี สิ่งเหล่านี้จะต้องถูกย้ายออกจากคลาสไปยังการกำหนดค่า

ตอนนี้เราเชื่อมต่อคลาสนี้กับสคริปต์ที่เราต้องการแคชบางอย่าง
สมมติว่าสคริปต์เอาต์พุตโพสต์ (ในไฟล์เก็บถาวรนี่คือ get_post.php)
ตัวอย่างอาจไม่ใช่ตัวอย่างที่ดีที่สุด แต่ก็ดีกว่าไม่มีอะไรเลย
ฉันปิดการใช้งานฐานข้อมูลโดยเฉพาะเพื่อให้คุณมีปัญหาน้อยลง

get($key_cache)))( echo "ข้อมูลที่นำมาจากแคช"; return $data; ) else ( // ค้นหาโพสต์ในฐานข้อมูล (ดำเนินการเลือก) //$data = $DB->selectRow("SELECT * FROM post WHERE id=?d", $postID); // เพื่อให้ตัวอย่างง่ายขึ้น เราใช้อาร์เรย์สำเร็จรูป (โพสต์เชื่อมโยงกับบล็อกที่มี ID=3) $data = array("id"=>$ postID, "blog_id"=>3, "title "=>"News 111", "text"=>"บางข้อความ"); if (!empty($data)) ( if (isset($Cache)) ($ แคช->set($key_cache, $ data, array("post_update", "post_update_".$postID, "post_blog_".$data["blog_id"]), 3600*24*10); echo "ข้อมูลที่บันทึกไว้ในแคช " ) return $data ) else; return null; ) ) $postID = 25; $โพสต์ = get_post($postID); print_r($โพสต์); ?> เราต้องการโพสด้วย id=25 ครั้งแรกที่คุณโทร คุณจะเห็นข้อความ “ข้อมูลที่บันทึกไว้ในแคช” เมื่อคุณโทรอีกครั้ง คุณจะเห็นข้อความ “ข้อมูลที่นำมาจากแคช” ตอนนี้เรามาลองอัปเดตโพสต์ (เรียกใช้สคริปต์ update_post.php)แบบสอบถาม ("อัปเดตโพสต์ SET blog_id =?d, title=?, text=? WHERE id=?d", $blogID, $title, $text, $postID); // ล้างแท็กที่เกี่ยวข้องกับโพสต์นี้ $Cache = Cache::getInstance(); if (isset($Cache)) ( $Cache->clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array("post_update", "post_update_".$postID, "post_blog_".$blogID)); ) ส่งคืน จริง; ) $postID = 25; update_post($postID, 3, "ทดสอบ", "ทดสอบทดสอบ"); -

จากนั้นเรารันสคริปต์ get_post.php และพบว่าไม่มีข้อมูลในแคชและเราบันทึกไว้ที่นั่นอีกครั้ง: “บันทึกข้อมูลลงในแคช”

จริงๆ แล้วสิ่งที่ยากที่สุดเกี่ยวกับการแคชก็คือ การใส่แท็กที่ถูกต้อง- ดังนั้นเมื่อคุณอัปเดตโพสต์ ข้อมูลที่โพสต์นี้อยู่จะได้รับการอัปเดต

ในตัวอย่างข้างต้นแท็กเหล่านี้เป็นแท็ก

  • "post_update_".$postID - ตัวโพสต์ (โดยปกติจะเป็นหน้าเอาต์พุตโพสต์)
  • "post_blog_".$blogID - หน้าบล็อกที่แสดงรายการโพสต์จากบล็อกนี้
  • "post_update" - แท็กที่เกี่ยวข้องกับหน้าหลักหรือรายการโพสต์ที่ดีที่สุด

เอฟเฟกต์กองสุนัข

แปลว่า “ฝูงสุนัข” สมมติว่าคุณมีตัวอย่างที่ซับซ้อนจากฐานข้อมูลเป็นเวลา 2 วินาที มันไม่ได้อยู่ในแคช (หรือเรารีเซ็ตแคช) ผู้ใช้คนแรกมาถึง คำขอจะถูกส่งไปยังฐานข้อมูล และหลังจากผ่านไป 2 วินาที ข้อมูลนี้จะปรากฏในแคช ดังนั้นใน 2 วินาทีนี้ ผู้คนอีก 10 คนสามารถเยี่ยมชมไซต์ได้ ซึ่งเริ่มต้นคำขอที่ซับซ้อนเดียวกันอีก 10 รายการไปยังฐานข้อมูล (เนื่องจากยังไม่มีข้อมูลในแคชและคำขอแรกยังคงดำเนินการอยู่) ส่งผลให้ฝูงสุนัขโหลดเซิร์ฟเวอร์

มันดูเหมือนสิ่งนี้ :)

มีการอธิบายวิธีแก้ไขปัญหาไว้
โค้ดด้านบนไม่ได้ให้การป้องกันเอฟเฟกต์ dog-pile ในกรณีของฉัน ไม่มีปริมาณการใช้งานสูงและคำขอที่ยาวนานขนาดนี้

วันนี้เราจะมาจัดการกับกลไกการแคชข้อมูลที่น่าสนใจ: Memcache php.ini- ข้อดีของ memcahe คือเราสามารถแคชอะไรก็ได้ ตั้งแต่คำสั่ง SQL ไปจนถึงอ็อบเจ็กต์และโครงสร้างข้อมูลอื่นๆ

Memcache คืออะไร

เมมแคช- นี่ไม่ใช่เทคโนโลยีแคชหรืออัลกอริธึมอย่างง่าย ประการแรกคือเป็นโปรแกรมเซิร์ฟเวอร์ที่ทำงานบนเว็บเซิร์ฟเวอร์ หากคุณใช้บริการโฮสติ้ง ก่อนที่จะใช้ memcahe ในแอปพลิเคชันของคุณ คุณต้องตรวจสอบให้แน่ใจว่า memcahe พร้อมใช้งาน ซึ่งสามารถทำได้โดยใช้ฟังก์ชัน phpinfo()

แนวคิด

หลังจากตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์ memcahe พร้อมใช้งานแล้ว มาทำความคุ้นเคยกับแนวคิดของกลไกการแคชนี้กันดีกว่า สิ่งที่น่าสนใจที่สุดเกี่ยวกับการใช้ memcahe php คือข้อมูลที่แคชไว้ทั้งหมดจะถูกจัดเก็บไว้ใน RAM ของเซิร์ฟเวอร์ หลักการจัดเก็บข้อมูลนี้ไม่เพียงช่วยประหยัดเวลาของโปรเซสเซอร์ในการสร้างข้อมูลซ้ำแล้วซ้ำอีก แต่ยังเพิ่มความเร็วในการเข้าถึงข้อมูลอีกด้วย

ในเวอร์ชันที่เรียบง่าย แนวคิดของ memcahe สามารถระบุได้ดังนี้: อ็อบเจ็กต์ PHP ที่ใช้บ่อยจะถูกแคชและจัดเก็บไว้ใน RAM ของเซิร์ฟเวอร์เป็นชุดของคู่คีย์-อ็อบเจ็กต์ หากจำเป็น อ็อบเจ็กต์ที่บันทึกไว้ก่อนหน้านี้จะถูกพรากจากหน่วยความจำเซิร์ฟเวอร์ โดยข้าม การเชื่อมต่อกับการตรวจสอบและรอบฐานข้อมูลมากมาย ในกรณีที่อัลกอริทึม memcahe php ตรวจไม่พบอ็อบเจ็กต์ที่ร้องขอในหน่วยความจำ ออบเจ็กต์ที่ต้องการจะถูกสร้างขึ้นตามปกติและเก็บไว้ในแคช

วิธีทำงานกับเซิร์ฟเวอร์ Memcache ใน PHP

หากต้องการทำงานกับเซิร์ฟเวอร์ Memcache เราจำเป็นต้องมีไลบรารี PHP php-memcache หรือ php-memcached อันใดอันหนึ่ง

ทางเลือกของไลบรารีหนึ่งหรืออีกไลบรารีหนึ่งขึ้นอยู่กับความต้องการส่วนบุคคลของนักพัฒนา โดยส่วนใหญ่แล้วจะคล้ายกันมาก โดยมีความแตกต่างกัน php-memcached.phpมอบโอกาสดีๆ มากมายในการทำงาน เช่น:

  • โทเค็น CAS สำหรับการกำหนดเวอร์ชันคีย์
  • โทรกลับ
  • เมธอด getDelayed() ช่วยให้คุณลดเวลารอโดยชะลอการอ่านคีย์จริง
  • รองรับโปรโตคอลไบนารี
  • ความสามารถในการหลีกเลี่ยงการทำให้เป็นอนุกรมโดยใช้ igbinary

ทั้งสองโมดูล php-memcach.phpและ php-memcached.phpไม่ใช่มาตรฐานสำหรับ php แต่มีอยู่ในที่เก็บ PECL

หากคุณไม่ได้ทำงานบนเซิร์ฟเวอร์ของคุณเอง แต่ทำงานบนเซิร์ฟเวอร์โฮสติ้ง คุณไม่จำเป็นต้องเลือก ทุกอย่างจะถูกกำหนดค่าไว้แล้ว

ตัวอย่างงาน

ฉันขอดึงความสนใจของคุณทันทีว่าตัวอย่างนี้จะทำงานได้ดีพอๆ กันบน php-memcach และ php-memcached

Memcach php ใช้วิธีการต่อไปนี้เพื่อทำงานกับข้อมูล:

  1. รับ - เพื่อรับวัตถุจากแคช
  2. ชุด — เขียนวัตถุด้วยคีย์ไปยังแคช;
  3. เพิ่ม — การเขียนวัตถุลงในแคชหากไม่มีรหัสดังกล่าว
  4. แทนที่ — เขียนวัตถุลงในแคชหากมีคีย์อยู่แล้ว

ฉันจะยกตัวอย่างดั้งเดิมของการใช้แคชโดยใช้เซิร์ฟเวอร์ memcache

1
2
3
4
5
6
7

$memcache = Memcache ใหม่() ;
$memcache -> pconnect ("localhost" , 3211 ) ; //เชื่อมต่อ. ตามค่าเริ่มต้น คุณสามารถใช้พอร์ตใดก็ได้
$คีย์ = "key_1" ;
$value = อาร์เรย์ (1, 2, 3, 4, 5);
$หมดอายุ = 600 ;
$memcache -> set ($key , $value , 0 , $expire ) ; // บันทึกค่าเป็นเวลา 10 นาที
$memcache -> รับ ("key_1" ) ; // รับอาร์เรย์ที่เขียนไว้ก่อนหน้านี้

เมื่อใช้เซิร์ฟเวอร์ Memcache สำหรับหลายโปรเจ็กต์พร้อมกัน โปรดทราบว่าข้อมูลถูกเขียนลงใน RAM หนึ่งตัว ซึ่งหมายความว่าหากคุณเขียนค่าใหม่โดยใช้คีย์เดียวกันจากโปรเจ็กต์ต่างๆ ค่าสุดท้ายที่ป้อนหน่วยความจำจะพร้อมใช้งานสำหรับทั้งคู่

บทความนี้อยู่ในลักษณะของ "การปฐมพยาบาล" คำอธิบายโดยละเอียดของการดำเนินการเฉพาะที่อนุญาตให้คุณติดตั้งและกำหนดค่า memcached บนเซิร์ฟเวอร์

เริ่มต้นด้วยคำจำกัดความ

เมคแคช- ซอฟต์แวร์ที่ใช้บริการแคชข้อมูลใน RAM ตามตารางแฮช

ข้อมูลเริ่มต้น:

  • วีพีเอสทำงานบนระบบปฏิบัติการ เดเบียน;
  • เว็บไซต์ที่ถูกต้องซึ่งสามารถเข้าถึงได้ผ่าน FTP, SSH

เริ่มจากจุดสุดท้ายกันก่อน ด้วยทรัพยากรอินเทอร์เน็ตที่ทำงานอยู่ (หรือบางอย่างที่คล้ายกัน) เราจึงสามารถค้นหาสิ่งที่เราติดตั้งได้อย่างรวดเร็วและง่ายดาย (บางทีเราอาจพบว่ามี memcached เหนือสิ่งอื่นใด) มาสร้างไฟล์ชื่อ info.php ซึ่งเราจะเขียน:

มารันโค้ดโดยไปที่ http://example.com/info.php:

เหนือสิ่งอื่นใด หากคุณพบรายการที่คล้ายกัน แสดงว่าทุกอย่างเป็นไปตามลำดับและงานได้เสร็จสิ้นแล้ว มิฉะนั้นเราจะได้รับผลลัพธ์นี้ตามการดำเนินการที่อธิบายไว้ในเอกสารนี้

การติดตั้งเซิร์ฟเวอร์ Memcached

มาเริ่มการติดตั้งด้วยคำสั่งกัน

Apt-get ติดตั้ง memcached php5-memcache

เรากำลังรอการติดตั้งให้เสร็จสิ้น จากนั้นเราจะตรวจสอบผลลัพธ์ด้วยคำสั่ง เน็ตสแตท

เป็นผลให้เราได้รับ:

Tcp 0 0 *:11211 *:* ฟัง 13053/memcached

ดังที่เราเห็น โดยค่าเริ่มต้น memcached จะ “ฟัง” ไปที่พอร์ต 11211 ดังนั้น ทุกคนสามารถเชื่อมต่อและใช้เซิร์ฟเวอร์ memcached ของเราผ่านพอร์ตนี้ได้ มาป้องกันตัวเองด้วยการให้สิทธิ์นี้แก่เซิร์ฟเวอร์ของเราเท่านั้น (localhost) เปิดไฟล์ /etc/memcached.conf ผ่านแผงควบคุมหรือผ่านคอนโซล:

Vi /etc/memcached.conf

ไฟล์นี้มีความคิดเห็นโดยละเอียด อย่าลืมตรวจสอบพวกเขา

เพิ่มบรรทัด -l 127.0.0.1

รีบูตเซิร์ฟเวอร์ memcached ด้วยคำสั่ง:

/etc/init.d/memcached รีสตาร์ท

และมาตรวจสอบอีกครั้ง:

Netstat -แตะ | grep memcached

เป็นผลให้เราควรได้รับสิ่งที่ต้องการ

Tcp 0 0 localhost.localdo:11211 *:* ฟัง 13092/memcached

ตอนนี้ memcached ใช้งานได้บนเซิร์ฟเวอร์ภายในเครื่องเท่านั้น

กำลังติดตั้ง Memcache

รายการคำสั่ง (เวอร์ชัน memcache อาจแตกต่างกัน!):

Apt-get ติดตั้ง php5-dev libmemcache-dev pecl ดาวน์โหลด memcache tar xzvf memcache-2.2.6.tgz cd memcache-2.2.6/ phpize && ./configure --enable-memcache && สร้างโมดูล cp/memcache.so /usr/ lib/php5/20060613/ echo "extension=memcache.so" >> /etc/php5/apache2/php.ini

รีสตาร์ทอาปาเช่:

Apachectl สง่างาม

เรามาตรวจสอบสคริปต์ที่เราโพสต์ไว้ก่อนหน้านี้ที่ http://example.com/info.php ตอนนี้เราควรหารายการ Memcache ที่นั่น

มาตรวจสอบการทำงานของ Memcached กัน

มาสร้างไฟล์ result.php และรันมันกัน

เชื่อมต่อ ("localhost", 11211) หรือออก ("ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ Memcached"); $version = $memcache->getVersion(); echo เวอร์ชันของเซิร์ฟเวอร์: ".$version"
\n"; $tmp_object = new stdClass; $tmp_object->str_attr = "test"; $tmp_object->int_attr = 123; $memcache->set("key", $tmp_object, false, 10) or die ("ไม่ใช่ ฉันจัดการทิ้งรายการไว้ใน Memcached"); echo "เราเขียนข้อมูลลงในแคช Memcached (ข้อมูลจะถูกเก็บไว้เป็นเวลา 10 วินาที)
\n"; $get_result = $memcache->get("key"); echo "ข้อมูลที่เขียนถึง Memcached:
\n"; var_dump($get_result); ?>

ผลลัพธ์ของสคริปต์:

เวอร์ชันของเซิร์ฟเวอร์: 1.4.13 เขียนข้อมูลลงในแคช Memcached (ข้อมูลจะถูกเก็บไว้เป็นเวลา 10 วินาที) ข้อมูลที่เขียนไปยัง Memcached: object(stdClass)#3 (2) ( ["str_attr"]=> string(4) "test" ["int_attr"]=> int(123) )

ทุกอย่างเป็นเช่นนี้หรือเกือบเช่นนี้? จากนั้นทุกอย่างก็เรียบร้อยดี ถ้าไม่เช่นนั้น ให้ลองทำตามขั้นตอนซ้ำ

จากการใช้ข้อมูลที่ให้ไว้ในบทความนี้ คุณจะสามารถติดตั้งและกำหนดค่าเซิร์ฟเวอร์ Memcached และส่วนขยาย php ที่จำเป็นเพื่อโต้ตอบกับเซิร์ฟเวอร์ได้ รวมถึงบริการการวิเคราะห์และสถิติ phpMemcachedAdmin

การติดตั้งจะเกิดขึ้นภายใต้ Debian พร้อมเซิร์ฟเวอร์แบ็กเอนด์ หากคุณมีบันเดิลที่ใช้งานได้ + php5-fpm เพียงแทนที่ apache2 ด้วย php5-fpm ในคำสั่ง
เครื่องมือในการทำงาน: ตัวจัดการไฟล์สำหรับเชื่อมต่อซอฟต์แวร์ด้วยโปรแกรมแก้ไขหรือสีโป๊วในตัว

ตอนนี้ สมมติว่าเรามีเว็บไซต์ http://example.com บนโฮสติ้งนี้อยู่แล้ว

ขั้นแรก คุณต้องพิจารณาว่า PHP ได้รับการกำหนดค่าอย่างไร (จะเป็นอย่างไรหากติดตั้ง Memcached ไว้แล้ว)) ในการดำเนินการนี้ เราจะสร้างไฟล์ info.php พร้อมโค้ดชั่วคราวที่รากของไซต์

ตอนนี้เรามาดูกันดีกว่า http://example.com/info.php

หากเราเห็นว่ามีรายการที่คล้ายกันแสดงว่าทุกอย่างเป็นไปตามลำดับ ติดตั้งส่วนขยาย php ที่จำเป็นแล้ว
ถ้าไม่เช่นนั้นคุณต้องทำงาน

วิธีการติดตั้งเซิร์ฟเวอร์ Memcached

ก่อนการติดตั้งคุณต้องอัพเดตพื้นที่เก็บข้อมูล

Apt-get อัปเดต && apt-get อัปเกรด

ตอนนี้เรามาติดตั้ง memcached และโมดูล php กันดีกว่า

Apt-get ติดตั้ง memcached php5-memcache

อยู่ระหว่างดำเนินการติดตั้ง. หลังจากเสร็จสิ้นเราจะตรวจสอบสิ่งที่เกิดขึ้น

ผลที่ตามมาเราจะเห็นอะไรประมาณนั้น

Tcp 0 0 *:11211 *:* ฟัง 13053/memcached

ตอนนี้คุณต้องรีสตาร์ท Apache หรือ php-fpm

บริการ apache2 รีสตาร์ท

การตั้งค่า Memcached

เมื่อติดตั้งเซิร์ฟเวอร์แล้ว จะต้องกำหนดค่าเซิร์ฟเวอร์ ไม่ใช่เรื่องยากและใช้เวลาไม่นาน

การปิด Memcached จากการเข้าถึงภายนอก

อย่างที่คุณเห็น memcached ค้างอยู่ที่พอร์ต 11211 โดยค่าเริ่มต้น เนื่องจาก memcached ไม่มีกลไกการตรวจสอบสิทธิ์ในตัว ปรากฎว่าใครๆ ก็สามารถเชื่อมต่อจากภายนอกและใช้เพื่อวัตถุประสงค์ของตนเองได้ เพื่อหลีกเลี่ยงปัญหานี้ คุณสามารถปิดพอร์ต 11211 โดยใช้ไฟร์วอลล์ หรือกำหนดค่าเซิร์ฟเวอร์ memcached เพื่อให้สามารถใช้งานได้จาก localhost เท่านั้น วิธีสุดท้ายอธิบายไว้ด้านล่าง

  1. เพิ่มบรรทัด -l 127.0.0.1
  2. รีบูต memcached

    บริการ memcached เริ่มระบบใหม่

    /etc/init.d/memcached รีสตาร์ท

และเราตรวจสอบอีกครั้ง

Netstat -แตะ | grep memcached

ในที่สุดเราก็ควรเห็นอะไรเช่นนี้

Tcp 0 0 localhost.localdo:11211 *:* ฟัง 13092/memcached

นอกจากนี้ หลังจากการเปลี่ยนแปลงทั้งหมด อย่าลืมรีสตาร์ท Apache

บริการ apache2 รีสตาร์ท

การเพิ่มจำนวนหน่วยความจำในการทำงาน Memcached

ตามค่าเริ่มต้น Memcached จะถูกจัดสรรให้ใช้ RAM ขนาด 64 เมกะไบต์ ฉันจะเพิ่มเป็น 1,024 คุณดำเนินการต่อจากพารามิเตอร์เซิร์ฟเวอร์ของคุณ

  1. เปิดไฟล์คอนฟิกูเรชัน vi /etc/memcached.conf
  2. ค้นหาค่า -m 64
  3. เปลี่ยนเป็น -m 1024
  4. รีสตาร์ทบริการ memcached รีสตาร์ท memcached

การจัดเก็บเซสชัน PHP ใน Memcached

หากหลายไซต์ใช้เซิร์ฟเวอร์หรือคลัสเตอร์ Memcached เดียวกัน ไซต์เหล่านั้นสามารถสกัดกั้นเซสชันของกันและกันและเข้าถึงบัญชีผู้ใช้ของตนได้ ซึ่งอาจทำให้เกิดอันตรายได้

คุณสามารถเร่งความเร็ว PHP ได้โดยการย้ายที่เก็บข้อมูลเซสชันจาก hdd ไปยัง RAM โดยใช้ memcached

คุณควรรู้ว่าคุณกำลังใช้ส่วนขยาย php ใด memcache หรือ memcached และคุณสามารถค้นหาสิ่งที่คุณมีได้โดยใช้ phpinfo() การตั้งค่ามีรายละเอียดปลีกย่อย โปรดใช้ความระมัดระวัง

วิธีการขยาย Memcache

  1. เปิด /etc/php5/mods-available/memcache.ini
  2. เพิ่ม session.save_handler = memcache session.save_path = "tcp://127.0.0.1:11211"

วิธีการขยาย memcacheD

  1. เปิด /etc/php5/mods-available/memcached.ini
  2. เพิ่ม session.save_handler = memcached session.save_path = "127.0.0.1:11211"
  3. เริ่มบริการ apache ใหม่ apache2 รีสตาร์ท

กำลังตรวจสอบ phpinfo.php

ตอนนี้เราต้องตรวจสอบสิ่งที่เรามีที่เอาต์พุต ในการดำเนินการนี้ ให้เปิดหน้าเว็บด้วย phpinfo() และค้นหา session.save_path ในโค้ดในคอลัมน์ที่มีค่าในเครื่อง ค่าควรเป็น tcp://127.0.0.1:11211 หรือ 127.0.0.1:11211 ..conf) และเรากำลังมองหา
php_admin_value เซสชัน.save_path

อย่างไรก็ตาม คุณยังสามารถใช้คำสั่ง php_value เพื่อกำหนดค่าไม่ใช่เซิร์ฟเวอร์ทั้งหมดทั่วโลก แต่เฉพาะบางไซต์เท่านั้น ในการดำเนินการนี้ คุณสามารถแก้ไข .htaccess ในรากของไซต์ของคุณได้

php_value session.save_handler "memcache" php_value session.save_path "tcp://127.0.0.1:11211"

ไฟล์การกำหนดค่า Memcached ที่พร้อมใช้งาน

คุณยังสามารถปรับแต่งทุกอย่างให้เหมาะกับความต้องการของคุณได้ ไฟล์การกำหนดค่าประกอบด้วยความคิดเห็นโดยละเอียด:

# ไฟล์กำหนดค่าเริ่มต้น memcached # 2003 - Jay Bonci< ># ไฟล์การกำหนดค่านี้ถูกอ่านโดยสคริปต์ start-memcached ที่ให้มาโดยเป็นส่วนหนึ่งของ # ของการแจกจ่าย Debian GNU/Linux # เรียกใช้ memcached เป็น daemon คำสั่งนี้เป็นคำสั่งโดยนัย และไม่จำเป็นสำหรับ # daemon ที่จะรัน ดู README.Debian ที่มาพร้อมกับแพ็คเกจนี้สำหรับข้อมูลเพิ่มเติม # -d # บันทึกเอาต์พุตของ memcached ไปยัง /var/log/memcached logfile /var/log/memcached.log # เป็น verbose # -v # มีรายละเอียดมากยิ่งขึ้น (พิมพ์คำสั่งไคลเอนต์ด้วย) # -vv # เริ่มต้นด้วยหมวก ของหน่วยความจำ 64 เมกะไบต์ มันสมเหตุสมผลและเป็นค่าเริ่มต้นของ daemon # โปรดทราบว่า daemon จะขยายเป็นขนาดนี้ แต่ไม่ได้เริ่มเก็บ # หน่วยความจำมากขนาดนี้ # จำนวนหน่วยความจำในหน่วยเมกะไบต์ที่จัดสรรไว้สำหรับการแคช โดยค่าเริ่มต้น 64 เมกะไบต์ #-m 64 -m 1024 # พอร์ตที่ Memcached จะหยุดทำงานตามค่าเริ่มต้น 11211 -p 11211 # เรียกใช้ daemon ในฐานะรูท start-memcached จะใช้ค่าเริ่มต้นเป็นรูทหากไม่มีคำสั่ง # -u อยู่ในไฟล์กำหนดค่านี้ -u memcache # ระบุที่อยู่ IP ที่จะฟัง ค่าเริ่มต้นคือการฟังที่อยู่ IP ทั้งหมด # พารามิเตอร์นี้เป็นหนึ่งในมาตรการรักษาความปลอดภัยเดียวที่ memcached มี ดังนั้นตรวจสอบให้แน่ใจว่า # กำลังฟังบนอินเทอร์เฟซไฟร์วอลล์ -l 127.0.0.1 # จำกัด จำนวนการเชื่อมต่อขาเข้าพร้อมกัน ค่าเริ่มต้นของ daemon คือ 1024 # # -c 1024 # ล็อคหน่วยความจำเพจทั้งหมด ปรึกษากับ README และโฮมเพจก่อนที่คุณจะทำเช่นนี้ # -k # ส่งคืนข้อผิดพลาดเมื่อหน่วยความจำหมด (แทนที่จะลบรายการ) # -M # ขยายไฟล์หลักให้ใหญ่สุด ขีด จำกัด # -r

การติดตั้งส่วนขยาย memcache

ด้านล่างนี้คือคำสั่งทีละขั้นตอนที่จะช่วยคุณติดตั้งส่วนขยาย memcache PHP จากคอนโซลด้วยตนเอง

Apt-get ติดตั้ง php5-dev libmemcache-dev pecl ดาวน์โหลด memcache tar xzvf memcache-2.2.6.tgz cd memcache-2.2.6/ phpize && ./configure --enable-memcache && สร้างโมดูล cp/memcache.so /usr/ lib/php5/20060613/ echo "extension=memcache.so" >> /etc/php5/apache2/php.ini

รีบูต Apache เพื่อให้การเปลี่ยนแปลงมีผล

บริการ apache2 รีสตาร์ท

วิธีตรวจสอบว่า Memcached ทำงานหรือไม่

มาสร้างไฟล์ memcachetest.php ในรูทของไซต์แล้วเขียนโค้ดต่อไปนี้ที่นั่น

เชื่อมต่อ ("localhost", 11211) หรือออก ("ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ Memcached"); $version = $memcache->getVersion(); echo เวอร์ชันของเซิร์ฟเวอร์: ".$version"
\n"; $tmp_object = new stdClass; $tmp_object->str_attr = "test"; $tmp_object->int_attr = 123; $memcache->set("key", $tmp_object, false, 10) or die ("ไม่ใช่ ฉันจัดการทิ้งรายการไว้ใน Memcached"); echo "เราเขียนข้อมูลลงในแคช Memcached (ข้อมูลจะถูกเก็บไว้เป็นเวลา 10 วินาที)
\n"; $get_result = $memcache->get("key"); echo "ข้อมูลที่เขียนถึง Memcached:
\n"; var_dump($get_result); ?>

ตอนนี้สิ่งที่เหลืออยู่คือการตรวจสอบผลลัพธ์: http://example.com/memcachetest.php
หากคุณทำทุกอย่างถูกต้องคุณจะเห็นสิ่งที่ต้องการ

phpMemcachedAdmin - การตรวจสอบ สถิติ และการจัดการ Memcached

phpMemcachedAdmin เป็นซอฟต์แวร์ที่มีเว็บอินเตอร์เฟสสำหรับตรวจสอบและจัดการบริการ Memcached บน Linux ช่วยให้คุณเห็นสถิติแบบเรียลไทม์สำหรับการดำเนินการทั้งหมดที่เซิร์ฟเวอร์สนับสนุน: รับ ตั้งค่า ลบ เพิ่ม ลด เรียกคืน การขับไล่ cas รวมถึงสถิติเซิร์ฟเวอร์: เครือข่าย ตำแหน่ง เวอร์ชันการทำงาน พร้อมด้วยแผนภูมิและภายใน การกำหนดค่าเซิร์ฟเวอร์

การติดตั้งและกำหนดค่า phpMemcachedAdmin

คุณสามารถทำได้หลายวิธี: จัดสรรโดเมนหรือโดเมนย่อยแยกต่างหากสำหรับการทำงานของบริการนี้ หรือคุณสามารถสร้างไดเร็กทอรีย่อยบนไซต์งานของคุณและใส่รหัสผ่านหรือ ฉันจะอธิบายวิธีสุดท้ายในการตั้งรหัสผ่านในโฟลเดอร์ให้ง่ายขึ้น

สมมติว่าเรามีไซต์ https://site

ซีดี /var/www/site

สร้างไดเร็กทอรีและไปที่ไดเร็กทอรีนั้น

Mkdir phpMemcachedAdmin && cd phpMemcachedAdmin

ดาวน์โหลดเวอร์ชันล่าสุดของการแจกจ่าย

รับ http://phpmemcacheadmin.googlecode.com/files/phpMemcachedAdmin-1.2.2-r262.tar.gz

คลายและลบไฟล์เก็บถาวรการแจกจ่าย

ทาร์ -xvzf phpMemcachedAdmin-1.2.2-r262.tar.gz && rm -rf phpMemcachedAdmin-1.2.2-r262.tar.gz

ตั้งค่าสิทธิ์การเข้าถึงที่จำเป็นซ้ำในไดเร็กทอรีปัจจุบัน

ค้นหา ./ -type f -exec chmod 0644 () \; ค้นหา ./ -type d -exec chmod 0755 () \;

AuthType Basic AuthName "พื้นที่ส่วนตัว" AuthUserFile .htpasswd ต้องการผู้ใช้ memcachedmanager

Create.htpasswd

Htpasswd -c .htpasswd memcachedmanager

ใส่รหัสผ่านของคุณ

นั่นคือทั้งหมดที่ ล็อกอินเข้าสู่ไดเร็กทอรี memcachedmanager หากคุณไม่ได้เปลี่ยนแปลง เปิด https://site/phpMemcachedAdmin (เปลี่ยนโดเมนเป็นของคุณ) ป้อนข้อมูลเข้าสู่ระบบ/รหัสผ่านแล้วใช้

ในที่สุด

ฉันแนะนำให้อ่านบทความเกี่ยวกับ memcached เปิดเผยข้อมูลทั่วไปเกี่ยวกับเรื่องนี้และรายละเอียดปลีกย่อยบางประการของงาน
นั่นคือทั้งหมดที่ หากมีอะไรไม่ชัดเจนให้ถามคำถามในความคิดเห็น

ด้วยโพสต์นี้ ฉันต้องการเปิดโพสต์ชุดเล็กๆ ตามเนื้อหาของรายงานที่ HighLoad++-2008 ต่อจากนั้น ข้อความทั้งหมดจะถูกเผยแพร่เป็น PDF ขนาดใหญ่ไฟล์เดียว

การแนะนำ

อันดับแรก เกี่ยวกับชื่อเรื่องของชุดโพสต์: โพสต์จะเกี่ยวกับการแคชบนเว็บ (ในโครงการเว็บที่มีโหลดสูง) และเกี่ยวกับการใช้ memcached สำหรับการแคช และเกี่ยวกับการใช้งาน memcached อื่น ๆ ในโครงการเว็บ นั่นคือองค์ประกอบทั้งสามของชื่อในชุดค่าผสมต่างๆ จะกล่าวถึงในโพสต์ชุดนี้

การแคชในปัจจุบันเป็นส่วนสำคัญของโครงการเว็บใดๆ ไม่จำเป็นต้องเป็นโครงการที่มีภาระงานสูง สำหรับแต่ละทรัพยากร คุณลักษณะที่สำคัญสำหรับผู้ใช้คือเวลาตอบสนองของเซิร์ฟเวอร์ การเพิ่มเวลาตอบสนองของเซิร์ฟเวอร์ทำให้ผู้เยี่ยมชมไหลออก ดังนั้นจึงจำเป็นต้องลดเวลาตอบสนองให้เหลือน้อยที่สุด ด้วยเหตุนี้จึงจำเป็นต้องลดเวลาที่ต้องใช้ในการสร้างการตอบกลับไปยังผู้ใช้ และการตอบสนองต่อผู้ใช้จำเป็นต้องรับข้อมูลจากแหล่งข้อมูลภายนอกบางส่วน (แบ็กเอนด์) ทรัพยากรเหล่านี้อาจเป็นฐานข้อมูลหรือแหล่งข้อมูลอื่นที่ค่อนข้างช้า (เช่น เซิร์ฟเวอร์ไฟล์ระยะไกลที่เราตรวจสอบจำนวนพื้นที่ว่าง) หากต้องการสร้างแหล่งข้อมูลที่ค่อนข้างซับซ้อนหนึ่งหน้า เราอาจจำเป็นต้องทำการเรียกที่คล้ายกันหลายสิบครั้ง ส่วนใหญ่จะรวดเร็ว: 20 ms หรือน้อยกว่า แต่มักจะมีแบบสอบถามจำนวนเล็กน้อยที่สามารถคำนวณเวลาในการคำนวณเป็นวินาทีหรือนาทีได้ (แม้ในระบบที่ได้รับการปรับปรุงให้ดีที่สุดก็อาจมีหนึ่งรายการ แม้ว่าจำนวนควรจะน้อยที่สุดก็ตาม) . หากเรารวมเวลาทั้งหมดที่เราใช้ในการรอผลลัพธ์การสืบค้น (หากเราดำเนินการการสืบค้นแบบขนาน เราจะใช้เวลาในการคำนวณของการสืบค้นที่ยาวที่สุด) เราจะได้รับเวลาตอบสนองที่ไม่น่าพอใจ

วิธีแก้ไขปัญหานี้คือการแคช: เราวางผลลัพธ์ของการคำนวณไว้ในที่เก็บข้อมูลบางส่วน (เช่น memcached) ซึ่งมีคุณสมบัติที่ยอดเยี่ยมในแง่ของเวลาในการเข้าถึงข้อมูล ตอนนี้ แทนที่จะเรียกแบ็คเอนด์ที่ช้า ซับซ้อน และหนักหน่วง เราแค่ต้องส่งคำขอไปยังแคชที่รวดเร็ว

Memcached และแคช

หลักการของท้องถิ่น

เราเห็นแคชหรือวิธีการแคชทุกที่ในอุปกรณ์อิเล็กทรอนิกส์และสถาปัตยกรรมซอฟต์แวร์: แคช CPU (ระดับที่หนึ่งและสอง), บัฟเฟอร์ของฮาร์ดดิสก์, แคชของระบบปฏิบัติการ, บัฟเฟอร์ในวิทยุติดรถยนต์ อะไรเป็นตัวกำหนดความสำเร็จของการแคช? คำตอบอยู่ที่หลักการของท้องถิ่น: โปรแกรมหรืออุปกรณ์มีแนวโน้มที่จะทำงานกับชุดข้อมูลย่อยจากชุดทั่วไปในช่วงเวลาหนึ่ง ในกรณีของ RAM หมายความว่าหากโปรแกรมทำงานกับข้อมูลที่อยู่ในที่อยู่ 100 ความน่าจะเป็นที่มากกว่าการเข้าถึงครั้งต่อไปจะอยู่ที่ที่อยู่ 101, 102 เป็นต้น และไม่ใช่ที่ที่อยู่ 10,000 เป็นต้น เช่นเดียวกับฮาร์ดไดรฟ์: บัฟเฟอร์จะเต็มไปด้วยข้อมูลจากพื้นที่ที่อยู่ติดกับเซกเตอร์ที่อ่านครั้งล่าสุด หากโปรแกรมของเราทำงานได้ในช่วงเวลาหนึ่งไม่ใช่กับไฟล์ชุดที่ค่อนข้างเล็ก แต่กับเนื้อหาทั้งหมดของฮาร์ดไดรฟ์ บัฟเฟอร์จะไม่มีความหมาย บัฟเฟอร์สเตอริโอในรถยนต์จะอ่านเพลงจากดิสก์ล่วงหน้านาทีถัดไป เนื่องจากเรามีแนวโน้มที่จะฟังไฟล์เพลงตามลำดับมากกว่าการข้ามผ่านชุดเพลง ฯลฯ

ในกรณีของโครงการเว็บ ความสำเร็จของการแคชนั้นพิจารณาจากข้อเท็จจริงที่ว่าไซต์นั้นมีเพจที่ได้รับความนิยมสูงสุดอยู่เสมอ ข้อมูลบางส่วนจะถูกใช้กับเพจทั้งหมดหรือเกือบทั้งหมด นั่นคือมีตัวเลือกบางอย่างที่ถูกร้องขอบ่อยกว่ามาก กว่าคนอื่นๆ เราแทนที่การเรียกหลายครั้งไปยังแบ็กเอนด์ด้วยการเรียกครั้งเดียวเพื่อสร้างแคช จากนั้นการเรียกที่ตามมาทั้งหมดจะดำเนินการผ่านแคชที่ทำงานอย่างรวดเร็ว

แคชจะดีกว่าแหล่งข้อมูลดั้งเดิมเสมอ: แคช CPU นั้นมีลำดับความสำคัญที่เร็วกว่า RAM แต่เราไม่สามารถทำให้ RAM เร็วเท่ากับแคชได้ เนื่องจากมันไม่มีประสิทธิภาพด้านต้นทุนและยากในทางเทคนิค บัฟเฟอร์ฮาร์ดดิสก์ตอบสนองคำขอสำหรับลำดับข้อมูลที่มีขนาดเร็วกว่าตัวฮาร์ดดิสก์เอง แต่บัฟเฟอร์ไม่มีความสามารถในการจดจำข้อมูลเมื่อปิดเครื่อง - ในแง่นี้มันแย่กว่าตัวอุปกรณ์เอง สถานการณ์คล้ายกับการแคชบนเว็บ: แคชเร็วกว่าและมีประสิทธิภาพมากกว่าแบ็กเอนด์ แต่โดยปกติแล้วในกรณีที่เซิร์ฟเวอร์รีสตาร์ทหรือขัดข้อง แคชจะไม่สามารถบันทึกข้อมูลได้ และยังไม่มีตรรกะในการคำนวณผลลัพธ์ใดๆ: มันสามารถคืนเฉพาะสิ่งที่เราใส่ไว้ก่อนหน้านี้เท่านั้น

เมคแคช

Memcached เป็นตารางแฮชในหน่วยความจำขนาดใหญ่ที่สามารถเข้าถึงได้ผ่านโปรโตคอลเครือข่าย ให้บริการจัดเก็บค่าที่เกี่ยวข้องกับคีย์ เราเข้าถึงแฮชผ่านโปรโตคอลเครือข่ายธรรมดา ไคลเอนต์สามารถเป็นโปรแกรมที่เขียนด้วยภาษาโปรแกรมที่กำหนดเอง (มีไคลเอนต์สำหรับ C/C++, PHP, Perl, Java ฯลฯ )

การดำเนินการที่ง่ายที่สุดคือการรับค่าของคีย์ที่ระบุ (get) ตั้งค่าของคีย์ (set) และลบคีย์ (del) ในการใช้ห่วงโซ่ของการดำเนินการแบบอะตอมมิก (ขึ้นอยู่กับการเข้าถึง memcached โดยกระบวนการแบบขนานพร้อมกัน) การดำเนินการเพิ่มเติมจะถูกนำมาใช้: การเพิ่มขึ้น/การลดค่าคีย์ (incr/decr) ผนวกข้อมูลเข้ากับค่าคีย์ที่จุดเริ่มต้นหรือจุดสิ้นสุด (ผนวก /prepend) การเชื่อมโยงอะตอมมิกการรับ/ตั้งค่า (gets/cas) และอื่นๆ

Memcached ดำเนินการโดย Brad Fitzpatrick ซึ่งเป็นส่วนหนึ่งของงานของเขาในโครงการ LiveJournal มันถูกใช้เพื่อลดฐานข้อมูลจากการร้องขอเมื่อแสดงเนื้อหาของหน้า ปัจจุบัน memcached พบว่ามีการใช้งานในแกนหลักของโปรเจ็กต์ขนาดใหญ่มากมาย เช่น Wikipedia, YouTube, Facebook และอื่นๆ

โดยทั่วไป รูปแบบการแคชมีลักษณะดังนี้: ส่วนหน้า (ส่วนของโครงการที่สร้างการตอบสนองต่อผู้ใช้) จำเป็นต้องรับข้อมูลจากตัวอย่างบางส่วน ส่วนหน้าจะติดต่อกับเซิร์ฟเวอร์ memcached ที่รวดเร็วของ cheetah เพื่อดึงแคช (รับคำขอ) หากพบรหัสที่เกี่ยวข้อง งานจะสิ้นสุดที่นั่น ไม่เช่นนั้น คุณจะต้องหันไปใช้แบ็กเอนด์ที่หนักหน่วง งุ่มง่าม แต่ทรงพลัง (เช่น ช้าง) ซึ่งส่วนใหญ่มักเป็นฐานข้อมูล ผลลัพธ์ที่ได้จะถูกเขียนไปยัง memcached เป็นแคชทันที (ตั้งค่าคำขอ) ในกรณีนี้ โดยปกติคีย์จะถูกตั้งค่าเป็นอายุการใช้งานสูงสุด (วันหมดอายุ) ซึ่งสอดคล้องกับช่วงเวลาที่แคชถูกรีเซ็ต

รูปแบบการแคชมาตรฐานนี้จะถูกนำไปใช้เสมอ แทนที่จะใช้ memcached บางโปรเจ็กต์อาจใช้ไฟล์ในเครื่องหรือวิธีการจัดเก็บอื่น ๆ (ฐานข้อมูลอื่น แคชตัวเร่ง PHP ฯลฯ ) อย่างไรก็ตาม ดังที่แสดงด้านล่าง ในโปรเจ็กต์ที่มีโหลดสูง รูปแบบนี้อาจไม่ทำงานอย่างมีประสิทธิภาพสูงสุด . อย่างไรก็ตาม ในเรื่องต่อไป เราจะใช้แผนนี้

สถาปัตยกรรม memcached

เมคแคชทำงานอย่างไร? มันจัดการให้ทำงานเร็วมากได้อย่างไร แม้กระทั่งคำขอหลายสิบครั้งไปยัง memcached ที่จำเป็นในการประมวลผลหน้าเดียวของไซต์ก็ไม่ทำให้เกิดความล่าช้าอย่างมาก ในเวลาเดียวกัน memcached นั้นไม่ต้องการมากนักในแง่ของทรัพยากรการประมวลผล: ในการติดตั้งที่โหลด เวลาของโปรเซสเซอร์ที่ใช้นั้นแทบจะไม่เกิน 10%

ประการแรก memcached ได้รับการออกแบบเพื่อให้การดำเนินการทั้งหมดมีความซับซ้อนของอัลกอริทึม O (1) เช่น เวลาดำเนินการของการดำเนินการใดๆ ไม่ได้ขึ้นอยู่กับจำนวนคีย์ที่ memcach เก็บไว้ ซึ่งหมายความว่าการดำเนินการบางอย่าง (หรือความสามารถ) จะหายไปหากการใช้งานต้องใช้เวลาเชิงเส้น (O(n)) เท่านั้น ดังนั้น memcached จึงไม่มีความสามารถในการรวมคีย์ "ลงในโฟลเดอร์" เช่น การจัดกลุ่มคีย์ใดๆ และเราจะไม่พบการดำเนินการกลุ่มกับคีย์หรือค่าของคีย์เหล่านั้น

การดำเนินการที่ได้รับการปรับปรุงหลักๆ คือการจัดสรร/ปล่อยบล็อกหน่วยความจำสำหรับจัดเก็บคีย์ โดยกำหนดนโยบายคีย์ที่ใช้น้อยที่สุด (LRU) เพื่อล้างแคชเมื่อมีหน่วยความจำไม่เพียงพอ การค้นหาคีย์เกิดขึ้นผ่านการแฮช ดังนั้นจึงมีความซับซ้อนเท่ากับ O(1)

ใช้ I/O แบบอะซิงโครนัสและไม่ใช้เธรด ซึ่งให้ประสิทธิภาพที่เพิ่มขึ้นและลดความต้องการทรัพยากรลง ในความเป็นจริง memcached สามารถใช้เธรดได้ แต่จำเป็นต้องใช้คอร์หรือโปรเซสเซอร์ทั้งหมดที่มีบนเซิร์ฟเวอร์เท่านั้น ในกรณีที่มีโหลดมากเกินไป - จะไม่สร้างเธรดสำหรับการเชื่อมต่อแต่ละครั้งไม่ว่าในกรณีใด

ในความเป็นจริง เราสามารถพูดได้ว่าเวลาตอบสนองของเซิร์ฟเวอร์ memcached นั้นพิจารณาจากต้นทุนเครือข่ายเท่านั้น และเกือบจะเท่ากับเวลาที่ใช้ในการส่งแพ็กเก็ตจากส่วนหน้าไปยังเซิร์ฟเวอร์ memcached (RTT) ลักษณะดังกล่าวทำให้สามารถใช้ memcached ในโครงการเว็บที่มีการโหลดสูงเพื่อแก้ไขปัญหาต่างๆ รวมถึงการแคชข้อมูล

กุญแจหาย

Memcached ไม่ใช่พื้นที่เก็บข้อมูลที่เชื่อถือได้ เป็นไปได้ว่าคีย์จะถูกลบออกจากแคชก่อนหมดอายุ สถาปัตยกรรมโปรเจ็กต์ต้องเตรียมพร้อมสำหรับสถานการณ์ดังกล่าว และต้องตอบสนองต่อการสูญหายของคีย์อย่างยืดหยุ่น มีสาเหตุหลักสามประการที่ทำให้กุญแจหาย:
  1. คีย์ถูกลบก่อนวันหมดอายุเนื่องจากหน่วยความจำไม่เพียงพอที่จะเก็บค่าของคีย์อื่น ๆ Memcached ใช้นโยบาย LRU ดังนั้นการสูญเสียนี้หมายความว่าคีย์นั้นไม่ค่อยได้ใช้ และหน่วยความจำแคชก็ว่างเพื่อจัดเก็บคีย์ยอดนิยมมากขึ้น
  2. คีย์ถูกลบเนื่องจากหมดอายุการใช้งานแล้ว สถานการณ์นี้พูดอย่างเคร่งครัดไม่ใช่การสูญเสียเนื่องจากเราเองก็จำกัดอายุการใช้งานของคีย์ แต่สำหรับรหัสลูกค้าที่เกี่ยวข้องกับ memcached การสูญเสียดังกล่าวแยกไม่ออกจากกรณีอื่น ๆ - เมื่อเข้าถึง memcached เราได้รับคำตอบ "ที่นั่น ไม่ใช่กุญแจดังกล่าว”
  3. สถานการณ์ที่ไม่พึงประสงค์ที่สุดคือความล้มเหลวของกระบวนการ memcached หรือเซิร์ฟเวอร์ที่กระบวนการนั้นตั้งอยู่ ในสถานการณ์นี้ เราสูญเสียคีย์ทั้งหมดที่ถูกจัดเก็บไว้ในแคช องค์กรคลัสเตอร์ช่วยให้คุณสามารถแก้ไขผลที่ตามมาได้ค่อนข้างราบรื่น: เซิร์ฟเวอร์ memcached จำนวนมากซึ่งมีคีย์โปรเจ็กต์ "กระจาย" อยู่: ด้วยวิธีนี้ ผลที่ตามมาจากการล่มสลายของแคชเดียวจะสังเกตเห็นได้น้อยลง

ต้องคำนึงถึงสถานการณ์ที่อธิบายไว้ทั้งหมดเมื่อพัฒนาซอฟต์แวร์ที่ทำงานร่วมกับ memcached เราสามารถแบ่งข้อมูลที่เราจัดเก็บไว้ใน memcached ตามความรุนแรงของการสูญเสียได้

“คุณอาจจะสูญเสียมันไป”- หมวดหมู่นี้รวมถึงแคชของการเลือกฐานข้อมูล การสูญเสียคีย์ดังกล่าวไม่ใช่เรื่องเลวร้ายเพราะเราสามารถคืนค่าได้อย่างง่ายดายโดยการเข้าถึงแบ็กเอนด์อีกครั้ง อย่างไรก็ตาม การสูญเสียแคชบ่อยครั้งทำให้เกิดการเรียกฐานข้อมูลโดยไม่จำเป็น

“ฉันไม่อยากแพ้”- ที่นี่คุณสามารถพูดถึงจำนวนผู้เยี่ยมชมไซต์ มุมมองทรัพยากร ฯลฯ แม้ว่าบางครั้งจะไม่สามารถกู้คืนค่าเหล่านี้โดยตรงได้ แต่ค่าของคีย์เหล่านี้มีความหมายแบบจำกัดเวลา: หลังจากผ่านไปไม่กี่นาที ค่าของคีย์เหล่านั้นจะไม่เกี่ยวข้องอีกต่อไป และค่าใหม่จะถูกคำนวณ

“เราไม่ควรแพ้เลย”- Memcached สะดวกในการจัดเก็บเซสชันผู้ใช้ - เซสชันทั้งหมดสามารถเข้าถึงได้อย่างเท่าเทียมกันจากเซิร์ฟเวอร์ทั้งหมดที่รวมอยู่ในคลัสเตอร์ส่วนหน้า ดังนั้น ฉันจะไม่ต้องการที่จะสูญเสียเนื้อหาของเซสชัน - มิฉะนั้นผู้ใช้บนไซต์จะถูก "ออกจากระบบ" จะพยายามหลีกเลี่ยงอย่างไร? คุณสามารถทำซ้ำคีย์เซสชันบนเซิร์ฟเวอร์ memcached หลายตัวจากคลัสเตอร์ได้ ดังนั้นโอกาสที่จะสูญเสียจึงลดลง