0Pricing
PHP Academy · บทเรียน

การจัดการหน่วยความจำและเคล็ดลับด้านประสิทธิภาพ

คืนหน่วยความจำตั้งแต่เนิ่น ๆ หลีกเลี่ยงการคัดลอกอาร์เรย์ขนาดใหญ่ และใช้เจเนอเรเตอร์กับชุดข้อมูลขนาดใหญ่

การจัดการหน่วยความจำและเคล็ดลับด้านประสิทธิภาพ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การทำโปรไฟล์ PHP ด้วย Xdebug
  2. OPcache: การแคชไบต์โค้ด
  3. การปรับปรุงประสิทธิภาพคำสืบค้นฐานข้อมูล
  4. การจัดการหน่วยความจำและเคล็ดลับด้านประสิทธิภาพ
← กลับไปที่ PHP Academy