ตาม รายงานข้อบกพร่องนี้ มันไม่ใช่ข้อบกพร่องจริงๆ แต่เป็นคุณสมบัติใน PHP7+ ภายใต้ การจัดการหน่วยความจำ Zend Engine:
[email protected] : นี่เป็นพฤติกรรมที่คาดหวัง ตามคำขอปิด Zend
ตัวจัดการหน่วยความจำไม่ได้ทำให้ชิ้นส่วนที่จัดสรรทั้งหมดว่าง แต่จะคงไว้
บางส่วน[1] เพื่อหลีกเลี่ยงความจำเป็นในการจัดสรรใหม่สำหรับครั้งต่อไป
ขอ.
วิธีแก้ไขที่แนะนำคือโทร: gc_mem_caches(). คุณสามารถใช้ได้ auto_prepend_file
และ auto_append_file
คำสั่งใน php.ini
เพื่อดำเนินการเสมอหากจำเป็น
อย่างไรก็ตามวิธีแก้ปัญหานั้นไม่ได้ช่วยในสถานการณ์ของฉัน ดังนั้นจึงไม่รับประกันว่าจะใช้งานได้
เนื่องจากไม่มีวิธีที่ง่ายในการเปลี่ยนแปลงพฤติกรรมนั้นในขณะนี้ ฉันพบวิธีอื่นในการแก้ปัญหาหน่วยความจำ (ควรใช้ได้กับ PHP7, PHP8):
- แทนที่จะใช้
php-cgi
, ใช้ php-fpm
- ตั้งค่าการกำหนดค่า FPM เพื่อใช้กระบวนการลูกจำนวนน้อยที่สุด แต่ปล่อยให้สร้างลูกถ้าจำเป็น สำหรับสิ่งนี้ คุณสามารถใช้
ตามความต้องการ
โหมดหรือ พลวัต
:
/etc/php7/php-fpm.d/www.conf
:
pm = ออนดีมานด์
; ปรับตามต้องการ:
pm.max_children = 10
หรือ:
pm = ไดนามิก
; ปรับตามต้องการ:
pm.max_children = 10
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 1
ความแตกต่างที่สำคัญระหว่างพวกเขาก็คือ ตามความต้องการ
จะใช้หน่วยความจำน้อยลงเมื่อไม่ได้ใช้งาน แต่จะช้าลงเมื่อไคลเอนต์เชื่อมต่อ
นี่คือการเปรียบเทียบผลลัพธ์ของฉัน:
พี.เอช.พี |
โหมด |
เด็ก |
สูงสุด |
ไม่ได้ใช้งาน Mem |
เมมสูงสุด |
โหลดเวลา |
เวลาสูงสุด* |
PHP5 |
ซีจี |
4 |
4 |
50MB |
200MB |
5 วินาที |
15 วินาที |
PHP7 |
ซีจี |
4 |
4 |
200MB |
200MB |
5 วินาที |
30 วินาที |
PHP7 |
FPM / ออนดีมานด์ |
0 |
10 |
15MB |
500MB |
7 วินาที |
10 วินาที |
PHP7 |
FPM / ไดนามิก |
1 |
10 |
25MB |
500MB |
6 วินาที |
10 วินาที |
- Max Load Time ได้รับการทดสอบการทำงาน 50 ไคลเอ็นต์พร้อมกัน
ค่าในตารางเป็นค่าโดยประมาณและใช้เพื่อจุดประสงค์ในการอธิบายเท่านั้น (ไม่ใช่เกณฑ์มาตรฐานจริงแต่อย่างใด)