การจัดการหน่วยความจำและเคล็ดลับด้านประสิทธิภาพ
คืนหน่วยความจำตั้งแต่เนิ่น ๆ หลีกเลี่ยงการคัดลอกอาร์เรย์ขนาดใหญ่ และใช้เจเนอเรเตอร์กับชุดข้อมูลขนาดใหญ่
การจัดการหน่วยความจำและเคล็ดลับด้านประสิทธิภาพ เป็นบทเรียน PHP Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน PHP Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส PHP Academy มีบทเรียนทั้งหมด 4 บทเรียน
การจัดการหน่วยความจำของ PHP
PHP ใช้การนับจำนวนการอ้างอิงร่วมกับตัวเก็บรวบรวมวงจรสำหรับการเก็บขยะ ทุกคำขอจะเริ่มต้นด้วยฮีปใหม่ กระบวนการที่ทำงานต่อเนื่องเป็นเวลานาน (ผู้ปฏิบัติงาน, Horizon) อาจสะสมหน่วยความจำรั่วได้
memory_limit
กำหนดขีดจำกัดหน่วยความจำที่เหมาะสมใน php.ini หากใช้หน่วยความจำเกินขีดจำกัด จะเกิดข้อผิดพลาดร้ายแรง
# php.ini:
memory_limit = 256M
// Check at runtime:
echo memory_get_usage(true) / 1024 / 1024 . " MB";
echo memory_get_peak_usage(true) / 1024 / 1024 . " MB peak";ปล่อยตัวแปรขนาดใหญ่
คืนหน่วยความจำอย่างชัดเจนเมื่อไม่จำเป็นต้องใช้แอเรย์หรืออ็อบเจ็กต์ขนาดใหญ่ภายในฟังก์ชันที่ทำงานเป็นเวลานานแล้ว
<?php
$data = loadLargeDataset();
processData($data);
unset($data); // free immediately, do not wait for end of scope
gc_collect_cycles(); // force garbage collection if circular referencesตัวสร้างสำหรับชุดข้อมูลขนาดใหญ่
ใช้ตัวสร้างเพื่อประมวลผลไฟล์ขนาดใหญ่หรือผลลัพธ์การค้นหาทีละแถว โดยไม่โหลดทุกอย่างเข้าไปในหน่วยความจำ
<?php
function readCsvLines(string $file): Generator {
$fh = fopen($file, "r");
while (($line = fgetcsv($fh)) !== false) {
yield $line;
}
fclose($fh);
}
foreach (readCsvLines("large.csv") as $row) {
importRow($row);
}หลีกเลี่ยงการคัดลอกแอเรย์ขนาดใหญ่
PHP ใช้การคัดลอกเมื่อเขียนสำหรับแอเรย์ การกำหนดแอเรย์ให้ตัวแปรจะไม่คัดลอกแอเรย์จนกว่าจะมีการแก้ไขตัวใดตัวหนึ่ง ส่งแอเรย์ขนาดใหญ่แบบอ้างอิงเมื่อจำเป็นต้องเปลี่ยนแปลงค่า
<?php
function processArray(array &$data): void {
// & avoids a copy when the parameter is modified
}การต่อสตริงในลูป
การสร้างสตริงด้วยการต่อค่าในลูปไม่มีประสิทธิภาพเมื่อสตริงมีขนาดใหญ่มาก ให้ใช้แอเรย์และ implode()
<?php
// Slow for large N:
$str = "";
foreach ($items as $item) $str .= $item->format()."\n";
// Faster:
$parts = [];
foreach ($items as $item) $parts[] = $item->format();
$str = implode("\n", $parts);การแคชการสร้างอ็อบเจ็กต์
การสร้างอ็อบเจ็กต์ (โดยเฉพาะเมื่อมีตรรกะในตัวสร้าง) ภายในลูปที่ทำงานถี่มีต้นทุนสูง หากทำได้ ให้แคชอินสแตนซ์ไว้หรือใช้อ็อบเจ็กต์แบบใช้ร่วมกัน
หลีกเลี่ยงการเรียกฟังก์ชันซ้ำ
ย้ายการเรียกฟังก์ชันที่ให้ค่าคงที่ออกจากลูป เมื่อผลลัพธ์ไม่เปลี่ยนแปลงในแต่ละรอบ
<?php
// Slow:
for ($i = 0; $i < count($items); $i++) { ... }
// Fast (count() called once):
$n = count($items);
for ($i = 0; $i < $n; $i++) { ... }การปรับแต่งเวิร์กเกอร์ PHP-FPM
กำหนดจำนวนเวิร์กเกอร์ของ PHP-FPM ตามหน่วยความจำที่มีและจำนวนการทำงานพร้อมกันที่คาดไว้ กฎคร่าว ๆ คือ workers = RAM / (หน่วยความจำเฉลี่ยที่เวิร์กเกอร์ใช้)
OPcache และการโหลดล่วงหน้า
เปิดใช้ OPcache (ซึ่งกล่าวถึงในบทเรียนก่อนหน้า) และโหลดคลาสของเฟรมเวิร์กที่ใช้บ่อยล่วงหน้า วิธีนี้จะขจัดต้นทุนการแยกวิเคราะห์และคอมไพล์ในแต่ละคำขอ
วิเคราะห์ประสิทธิภาพก่อน
วิเคราะห์ประสิทธิภาพก่อนปรับปรุงเสมอ การปรับปรุงจุดเล็ก ๆ ในโค้ดที่ไม่ใช่คอขวดทำให้เสียเวลาและอ่านโค้ดได้ยากขึ้น ใช้ Xdebug หรือ Blackfire เพื่อค้นหาเส้นทางการทำงานที่ใช้เวลาสูงจริง
สรุป
ใช้ตัวสร้างข้อมูลกับชุดข้อมูลขนาดใหญ่ ยกเลิกการใช้งานตัวแปรเมื่อเสร็จแล้ว หลีกเลี่ยงการคัดลอกอาร์เรย์ขนาดใหญ่ ย้ายการเรียกที่ให้ค่าคงที่ออกนอกลูป วิเคราะห์ประสิทธิภาพด้วย Xdebug เพื่อค้นหาคอขวดจริงก่อนปรับปรุง
ตรวจสอบความเข้าใจ
ประโยชน์หลักของตัวสร้างข้อมูล PHP สำหรับชุดข้อมูลขนาดใหญ่คืออะไร
คำถามที่พบบ่อย
บทเรียน “การจัดการหน่วยความจำและเคล็ดลับด้านประสิทธิภาพ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การจัดการหน่วยความจำและเคล็ดลับด้านประสิทธิภาพ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส PHP Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส PHP Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การจัดการหน่วยความจำและเคล็ดลับด้านประสิทธิภาพ”
คืนหน่วยความจำตั้งแต่เนิ่น ๆ หลีกเลี่ยงการคัดลอกอาร์เรย์ขนาดใหญ่ และใช้เจเนอเรเตอร์กับชุดข้อมูลขนาดใหญ่ คุณปฏิบัติ PHP Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน PHP Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน PHP Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การจัดการหน่วยความจำและเคล็ดลับด้านประสิทธิภาพ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน PHP Academy นี้ได้ไหม
ได้ บทเรียน PHP Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การทำโปรไฟล์ PHP ด้วย Xdebug
- OPcache: การแคชไบต์โค้ด
- การปรับปรุงประสิทธิภาพคำสืบค้นฐานข้อมูล
- การจัดการหน่วยความจำและเคล็ดลับด้านประสิทธิภาพ