PHP ทำการแยกวิเคราะห์ไฟล์ php.ini หรือไม่?


24

ใช้งาน PHP เวอร์ชั่น 7.1.30 ภายใต้ RHEL 7.7

ฉันต้องการที่จะชน memory_limit แต่ไม่แน่ใจว่าฉันมีไวยากรณ์ที่ถูกต้อง (เช่น 256M หรือ 256MB) ดังนั้นเริ่มต้นด้วยฉันใส่ค่าที่ไม่ดี "Hugo" ในการตั้งค่า memory_limit ปัญหานี้เป็นผลมาจาก phpinfo () (ทำงานภายใต้ httpd) แท้จริงมีสตริง "Hugo" ในสถานที่เช่น:

ป้อนคำอธิบายรูปภาพที่นี่

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

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


4
คำถามที่ยอดเยี่ยม
ทิงค์

3
จากนี้: php.net/manual/en/faq.using.php#faq.using.shorthandbytes(int) 'HUGO'; // => 0ฉันถือว่ามันเป็นเช่นเดียวกับ ซึ่งเริ่มทำงานล้มเหลวในเครื่องที่ใช้หน่วยความจำ 2MB
โยชิ

สำหรับบันทึกที่ไวยากรณ์ที่ถูกต้องคือ memory_limit 256M
ทิกเกอร์

@Yoshi ฉันคิดว่าคุณควรเปิดเผยคำตอบของคุณ มันเป็นคำอธิบายที่ดี
Maksym Fedorov

@MaksymFedorov ฉันลังเลเพราะฉันไม่มีการอ้างอิงจริงสำหรับข้อสันนิษฐานของฉัน สำหรับตอนนี้มันเป็นเพียงการสังเกต
โยชิ

คำตอบ:


19

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

คุณสามารถเห็นสิ่งนี้ในแหล่งที่มา:

ไวยากรณ์ที่รองรับถูกกำหนดไว้ในท้ายที่สุดzend_atolซึ่ง:

  1. วิเคราะห์คำสตริงสำหรับค่าตัวเลขละเว้นข้อความเพิ่มเติมใด ๆ
  2. รูปลักษณ์ที่ตัวอักษรตัวสุดท้ายของสตริงและคูณค่าก่อนหน้านี้ถ้ามันเป็นg, G, m, M, kหรือK

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

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

# Invalid string; sets to compiled minimum
php -r 'ini_set("memory_limit", "HUGO"); while(true) $a[]=$a;'
# -> PHP Fatal error:  Allowed memory size of 2097152 bytes exhausted

# Number followed by a string; takes the number
php -r 'ini_set("memory_limit", "4000000 HUGO"); while(true) $a[]=$a;'
# -> PHP Fatal error:  Allowed memory size of 4000000 bytes exhausted

# Number followed by a string, but ending in one of the recognised suffixes
# This finds both the number and the suffix, so is equivalent to "4M", i.e. 4MiB
php -r 'ini_set("memory_limit", "4 HUGO M"); while(true) $a[]=$a;'
# -> PHP Fatal error:  Allowed memory size of 4194304 bytes exhausted

ขอบคุณ @IMSoP สำหรับการประเมินที่ยอดเยี่ยม ควรรายงานสิ่งนี้ในเครื่องมือติดตามบั๊กประเภทใด? ฉันพบการตอบสนองที่ phpinfo () สร้างการตอบโต้อย่างง่าย และบาง debug output สำหรับสิ่งที่ php ทำเมื่อพบค่าที่ไม่คาดคิดก็ไม่ผิดพลาดเช่นกัน
tink

1
@tink ฉันคิดว่าคุณสามารถส่งคำขอคุณสมบัติในbugs.php.netหรือส่งข้อความไปยังรายการส่งจดหมายInternalsซึ่งเป็นจุดที่การประสานงานส่วนใหญ่เกิดขึ้น ฉันพบคำขอที่คล้ายกันเมื่อหลายปีก่อนแต่ดูเหมือนจะไม่ได้รับคำตอบใด ๆ
IMSoP

ขอขอบคุณอีกครั้งจะดูว่า! :)
tink

0

สิ่งแรกอันดับแรกเราต้องเข้าใจว่า PHP.ini ทำงานอย่างไรในการตีความเวิร์กโฟลว์ memory_limit เป็นคำสั่งสำหรับ PHP

เมื่อใช้กับฟังก์ชัน PHP ini_set(‘memory_limit’,’256MB’)ที่คุณต้องทำอะไรเช่นนี้ ดังนั้นฟังก์ชั่นนี้จะตั้งค่าของคุณเป็นตัวแปรล่ามชั่วคราว หากคุณเห็นอย่างใกล้ชิดคุณสามารถรับสองคอลัมน์หนึ่งได้สำหรับ Local และ One สำหรับ Global นั่นแสดงให้เห็นถึงความสามารถของคุณค่าต่อบุคคลตามลำดับ

แต่เมื่อคุณกำหนดทั่วโลกคุณต้องตั้งเป็นคำต่อท้ายด้วย K, M, G ตามลำดับ หากเรามีค่าเกินกว่านี้โดยใช้ apache .htaccess ค่านี้ต้องเหมือนกันสำหรับ PHP fpm


3
ผมอยากจะออกจากจุดที่กรุณา OP จะไม่ถามถึงวิธีการตั้งค่าการ จำกัด หน่วยความจำ :)
Karolis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.