ข้อความแสดงข้อผิดพลาดนี้กำลังถูกนำเสนอคำแนะนำใด ๆ ?
ขนาดหน่วยความจำที่อนุญาตของ 33554432 ไบต์หมดลง (พยายามจัดสรร 43148176 ไบต์) ใน php
ข้อความแสดงข้อผิดพลาดนี้กำลังถูกนำเสนอคำแนะนำใด ๆ ?
ขนาดหน่วยความจำที่อนุญาตของ 33554432 ไบต์หมดลง (พยายามจัดสรร 43148176 ไบต์) ใน php
คำตอบ:
ในที่สุดฉันก็พบคำตอบ:
เพียงเพิ่มบรรทัดด้านล่างนี้ก่อนถึงบรรทัดที่คุณได้รับข้อผิดพลาดในไฟล์ของคุณ
ini_set('memory_limit', '-1');
มันจะใช้หน่วยความจำไม่ จำกัด ของเซิร์ฟเวอร์มันทำงานได้ดี
ขอบคุณที่ให้คำแนะนำเพื่อน
UNLIMITED
เป็นโปรแกรมเมอร์ที่ดีคุณควรจะคิดออกเหตุผลที่อยู่เบื้องหลังการบริโภคหน่วยความจำนี้และเพิ่มขึ้นตามความจำเป็นแทนการรักษามัน
ต่อไปนี้เป็นวิธีการง่ายๆสองวิธีในการเพิ่มขีด จำกัด ของการโฮสต์ที่ใช้ร่วมกัน:
หากคุณเข้าถึงไฟล์ PHP.ini ของคุณให้เปลี่ยนบรรทัดใน PHP.ini หากบรรทัดของคุณแสดง 32M ลองใช้ 64M:
memory_limit = 64M ; Maximum amount of memory a script may consume (64MB)
หากคุณไม่มีสิทธิ์เข้าถึง PHP.ini ให้ลองเพิ่มไฟล์นี้ลงในไฟล์. htaccess:
php_value memory_limit 64M
สคริปต์ของคุณใช้หน่วยความจำมากเกินไป สิ่งนี้มักจะเกิดขึ้นใน PHP ถ้าคุณมีลูปที่ควบคุมไม่ได้และคุณกำลังสร้างวัตถุหรือเพิ่มไปยังอาร์เรย์ในแต่ละรอบของลูป
ตรวจสอบลูปไม่สิ้นสุด
หากนั่นไม่ใช่ปัญหาลองและช่วย PHP โดยทำลายวัตถุที่คุณทำเสร็จแล้วด้วยการตั้งค่าให้เป็นโมฆะ เช่น.$OldVar = null;
ตรวจสอบรหัสที่มีข้อผิดพลาดเกิดขึ้นจริงเช่นกัน คุณคาดหวังว่าบรรทัดนั้นจะจัดสรรหน่วยความจำจำนวนมหาศาลหรือไม่ ถ้าไม่ลองและลองคิดดูว่ามีอะไรผิดปกติเกิดขึ้น ...
ทำ:
ini_set('memory_limit', '-1');
ไม่เคยดี หากคุณต้องการอ่านไฟล์ที่มีขนาดใหญ่มากมันเป็นวิธีที่ดีที่สุดในการคัดลอกทีละบิต ลองใช้รหัสต่อไปนี้เพื่อการปฏิบัติที่ดีที่สุด
$path = 'path_to_file_.txt';
$file = fopen($path, 'r');
$len = 1024; // 1MB is reasonable for me. You can choose anything though, but do not make it too big
$output = fread( $file, $len );
while (!feof($file)) {
$output .= fread( $file, $len );
}
fclose($file);
echo 'Output is: ' . $output;
while
วง:fclose($file)
เป็นเรื่องง่ายที่โปรแกรมใน PHP จะใช้หน่วยความจำเร็วกว่าที่คุณคิด การคัดลอกสตริงอาร์เรย์และวัตถุแทนที่จะใช้การอ้างอิงจะทำได้แม้ว่า PHP 5 ควรจะทำสิ่งนี้โดยอัตโนมัติมากกว่าใน PHP 4 แต่การจัดการกับชุดข้อมูลของคุณอย่างครบถ้วนในหลายขั้นตอนก็สิ้นเปลืองเมื่อเปรียบเทียบกับการประมวลผลหน่วยตรรกะที่เล็กที่สุด ขณะนั้น. ตัวอย่างคลาสสิกจะทำงานร่วมกับ resultsets ขนาดใหญ่จากฐานข้อมูล: โปรแกรมเมอร์ส่วนใหญ่เรียก resultset foreach()
ทั้งหมดลงในอาร์เรย์และห่วงมากกว่านั้นแล้วหนึ่งครั้งหรือมากกว่าด้วย หน่วยความจำมีประสิทธิภาพมากขึ้นในการใช้การwhile()
วนซ้ำเพื่อดึงข้อมูลและประมวลผลทีละแถว สิ่งเดียวกันนี้ใช้กับการประมวลผลไฟล์
หากคุณต้องการอ่านไฟล์ขนาดใหญ่คุณควรอ่านทีละไฟล์แทนการอ่านในครั้งเดียว
เป็นเรื่องง่ายคณิตศาสตร์: ถ้าคุณอ่านไฟล์ขนาดใหญ่ 1 MB พร้อมกันต้องใช้หน่วยความจำอย่างน้อย 1 MB ในเวลาเดียวกันเพื่อเก็บข้อมูล
ดังนั้นคุณควรอ่านทีละนิดการใช้งานfopen
fread
$fh = fopen($folder.'/'.$filename, "rb") or die(); $buffer = 1024*1024; while (!feof($fh)) { print(fread($fh, $buffer)); flush(); } fclose($fh);
ฉันประสบปัญหาเดียวกันใน php7.2 ที่มี laravel 5.6 ฉันเพิ่งเพิ่มจำนวนตัวแปรmemory_limit = 128M
ใน php.ini ตามที่แอปพลิเคชันของฉันต้องการ อาจเป็น 256M / 512M / 1048M ..... ตอนนี้มันใช้งานได้ดี
ฉันก็มีปัญหาเดียวกันเช่นกันค้นหาไฟล์ phpinfo.ini, php.ini หรือ. htaccess ไม่เป็นประโยชน์ ในที่สุดฉันก็ดูไฟล์ php เปิดและตรวจสอบรหัสภายในหน่วยความจำ ในที่สุดทางออกนี้คือสิ่งที่ฉันออกมาและมันก็ใช้ได้กับฉัน ฉันใช้ wordpress ดังนั้นวิธีนี้อาจใช้ได้กับปัญหาขีด จำกัด ขนาดหน่วยความจำ wordpress เท่านั้น วิธีการแก้ปัญหาของฉันเปิดเริ่มต้น constants.phpแฟ้มใน/ public_html / WP-รวมถึงโฟลเดอร์ เปิดไฟล์นั้นด้วยโปรแกรมแก้ไขรหัสและค้นหาการตั้งค่าหน่วยความจำภายใต้wp_initial_constants
ขอบเขตหรือเพียง Ctrl + F เพื่อค้นหาคำว่า "หน่วยความจำ" แล้วคุณก็จะมามากกว่าและWP_MEMORY_LIMIT
WP_MAX_MEMORY_LIMIT
เพิ่งเพิ่มมันเป็น 64 MB ในกรณีของฉันฉันเพิ่มเป็น 128 MB แล้วเพิ่มเป็น 200 MB
// Define memory limits.
if ( ! defined( 'WP_MEMORY_LIMIT' ) ) {
if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
define( 'WP_MEMORY_LIMIT', $current_limit );
} elseif ( is_multisite() ) {
define( 'WP_MEMORY_LIMIT', '200M' );
} else {
define( 'WP_MEMORY_LIMIT', '128M' );
}
}
if ( ! defined( 'WP_MAX_MEMORY_LIMIT' ) ) {
if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
} elseif ( -1 === $current_limit_int || $current_limit_int > 268435456 /* = 256M */ ) {
define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
} else {
define( 'WP_MAX_MEMORY_LIMIT', '256M' );
}
}
Btw โปรดอย่าทำโค้ดต่อไปนี้เพราะมันเป็นวิธีปฏิบัติที่ไม่ดี:
ini_set('memory_limit', '-1');
wp-config.php
แทนซึ่งจะไม่ถูกเขียนทับโดยการอัปเดต WordPress ในอนาคต นอกจากนี้การรักษาความปลอดภัยไม่กี่ปลั๊กอิน (เช่น WordFence เป็นต้น) จะบ่นถ้า 'หลัก' ไฟล์ WordPress มีการเปลี่ยนแปลง ...
wp-config.php
และเพิ่มสองบรรทัดที่นั่น (i .e. define( 'WP_MEMORY_LIMIT', '200M' );
และdefine( 'WP_MAX_MEMORY_LIMIT', '256M' );
. ซึ่งแตกต่างจากไฟล์ใน 'core' WP (คือทุกอย่างภายใต้wp-includes
) ซึ่งจะถูกเขียนทับโดยการอัพเกรด WP wp-config.php
จะไม่ - มันมีไว้สำหรับ จุดประสงค์ที่แน่นอนของการเอาชนะค่าคงที่ WP!
-1
ใช้ได้กับกระบวนการที่ทำงานสั้น ๆ ตัวอย่างเช่นคอนเทนเนอร์สร้าง php ที่ใช้สำหรับการทดสอบหน่วยหรือติดตั้งผู้แต่ง / etc อย่าเรียกใช้ไซต์โปรดักชั่นของคุณโดยตั้งเป็นแบบนั้น
คุณสามารถเพิ่มหน่วยความจำที่อนุญาตให้สคริปต์ php โดยดำเนินการบรรทัดต่อไปนี้ด้านบนรหัสทั้งหมดในสคริปต์:
ini_set('memory_limit','-1'); // enabled the full memory available.
และยังจัดสรรตัวแปรที่ไม่พึงประสงค์ในสคริปต์
ตรวจสอบไลบรารี php นี้: การเพิ่มหน่วยความจำด้วย PHP
ฉันสังเกตเห็นคำตอบมากมายพยายามที่จะเพิ่มจำนวนหน่วยความจำของสคริปต์ที่มีอยู่ แต่บ่อยครั้งกว่าไม่ได้หมายความว่ามีบางสิ่งที่เปิดเสรีกับหน่วยความจำมากเกินไปเนื่องจากปริมาณหรือขนาดที่ไม่น่าดู เห็นได้ชัดว่าถ้าคุณไม่ใช่ผู้เขียนสคริปต์ของคุณที่อยู่ในความเมตตาของผู้เขียนเว้นแต่คุณจะรู้สึกทะเยอทะยาน :) เอกสาร PHP แม้จะพูดว่าปัญหาหน่วยความจำเกิดจาก " สคริปต์ที่เขียนไม่ดี "
มันควรจะกล่าวว่าini_set('memory_limit', '-1');
(ไม่ จำกัด ) สามารถทำให้เกิดความไม่แน่นอนของเซิร์ฟเวอร์เป็น0 bytes free = bad things
สามารถก่อให้เกิดความไม่แน่นอนเป็นเซิร์ฟเวอร์ ให้ค้นหาสมดุลที่เหมาะสมจากสิ่งที่สคริปต์ของคุณพยายามทำและจำนวนหน่วยความจำที่มีอยู่ในเครื่อง
วิธีการที่ดีกว่า:ถ้าคุณเป็นคนเขียนสคริปต์ (หรือความทะเยอทะยาน) คุณสามารถแก้ปัญหาปัญหาหน่วยความจำดังกล่าวกับxdebug เวอร์ชันล่าสุด (2.6.0 - วางจำหน่าย 2018-01-29) ดึงการจัดทำโปรไฟล์หน่วยความจำกลับมาซึ่งแสดงให้คุณเห็นว่าการเรียกใช้ฟังก์ชั่นนั้นใช้หน่วยความจำจำนวนมากเท่าใด มันทำให้เกิดปัญหาในสคริปต์ที่หายาก โดยปกติแล้วความไร้ประสิทธิภาพอยู่ในลูปที่ไม่ได้คาดหวังว่าจะได้รับเสียง แต่แต่ละกรณีจะถูกใช้เป็นแบบฝึกหัดต่อผู้อ่าน :)
เอกสาร xdebugเป็นประโยชน์ แต่มันเดือดลงไปขั้นตอนที่ 3:
apt-get
และyum
อื่น ๆxdebug.profiler_enable = 1
,xdebug.profiler_output_dir = /where/ever/
หากคุณพยายามที่จะอ่านไฟล์นั่นจะทำให้หน่วยความจำใน PHP ตัวอย่างเช่นหากคุณพยายามเปิดและอ่านไฟล์ MP3 (เช่นพูดไฟล์ $ data = (" http://mydomain.com/path/sample.mp3 ") มันจะดึงมันทั้งหมดลงในหน่วยความจำ .
ตามที่เนลสันแนะนำคุณสามารถทำงานเพื่อเพิ่มขีด จำกัด หน่วยความจำสูงสุดหากคุณต้องการใช้หน่วยความจำมาก
เรามีสถานการณ์ที่คล้ายกันและเราพยายามหาคำตอบที่ด้านบนของคำตอบ ini_set ('memory_limit', '-1'); และทุกอย่างทำงานได้ดีไฟล์รูปภาพที่บีบอัดซึ่งมีขนาดใหญ่กว่า 1MB ถึง KB
เขียน
ini_set('memory_limit', '-1');
ใน index.php ของคุณที่ด้านบนหลังจากเปิดแท็ก php
ฉันได้รับข้อความแสดงข้อผิดพลาดเดียวกันหลังจากเปลี่ยนเป็นธีมใหม่ใน Wordpress PHP ใช้เวอร์ชั่น 5.3 ดังนั้นฉันเปลี่ยนเป็น 7.2 ที่แก้ไขปัญหา
หากคุณใช้โฮสติ้งที่ใช้ร่วมกันคุณจะไม่สามารถบังคับใช้การเพิ่มขึ้นในขีด จำกัด ของขนาด php
เพียงไปที่ cPanel ของคุณและอัพเกรด php version เป็น 7.1 ขึ้นไปจากนั้นคุณก็พร้อมที่จะไป
ผู้ใช้ wordpress เพิ่มบรรทัด:
@ini_set('memory_limit', '-1');
ใน wp-settings.php ซึ่งคุณสามารถหาได้ในโฟลเดอร์รูทที่ติดตั้ง wordpress
ฉันไม่ได้ต่ออายุโฮสติ้งของฉันและฐานข้อมูลเป็นแบบอ่านอย่างเดียว Joomla จำเป็นต้องเขียนเซสชันและไม่สามารถทำได้
ฉันมีปัญหาเดียวกันกับที่เรียกใช้ php ในบรรทัดคำสั่ง เมื่อเร็ว ๆ นี้ฉันมีการเปลี่ยนแปลงไฟล์ php.ini และทำผิดพลาดในขณะที่เปลี่ยน php.ini
นี่คือ php7.0
เส้นทางไป php.ini ที่ฉันทำผิด:
/etc/php/7.0/cli/php.ini
ฉันได้ตั้งค่าmemory_limit = 256
(ซึ่งหมายถึง256 bytes
)
แทนmemory_limit = 256M
(ซึ่งหมายถึง256 Mega bytes
)
; จำนวนเงินสูงสุดของหน่วยความจำสคริปต์อาจใช้ (128MB)
; http://php.net/memory-limit
memory_limit = 128M
เมื่อฉันแก้ไขมันแล้วกระบวนการของฉันก็เริ่มทำงานได้ดี
เรียกใช้คำสั่งนี้ในไดเรกทอรีรากของวีโอไอพี php -d memory_limit=4G bin/magento
หากคุณกำลังใช้ laravel ให้ใช้วิธีนี้
public function getClientsListApi(Request $request){
print_r($request->all()); //for all request
print_r($request->name); //for all name
}
แทน
public function getClientsListApi(Request $request){
print_r($request); // it show error as above mention
}