ขนาดหน่วยความจำที่อนุญาตของ 33554432 ไบต์หมดลง (พยายามจัดสรร 43148176 ไบต์) ใน php


279

ข้อความแสดงข้อผิดพลาดนี้กำลังถูกนำเสนอคำแนะนำใด ๆ ?

ขนาดหน่วยความจำที่อนุญาตของ 33554432 ไบต์หมดลง (พยายามจัดสรร 43148176 ไบต์) ใน php


5
เพิ่มขีด จำกัด หน่วยความจำสูงสุดของคุณเป็น 64MB ในไฟล์ php.ini ของคุณ การค้นหาของ Googleแต่ฉันขอถามได้ไหมว่าทำไมคุณถึงพยายามจัดสรรความทรงจำนั้น? บรรทัดใดของโค้ดที่ล้มเหลว

1
สคริปต์ทำอะไรเมื่อสคริปต์ล้มเหลว คุณสามารถโพสต์รหัสได้หรือไม่
Neil Aitken

3
ดูเหมือนว่าไฟล์ txt ที่มีขนาดใหญ่มาก
macbirdie

10
ตามอัตภาพคุณอ่านไฟล์ที่มีขนาดใหญ่หรือขนาดที่อาจเกิดขึ้นครั้งละหนึ่งบรรทัดเขียนทับหน่วยความจำบรรทัดก่อนหน้าด้วยการอ่านแต่ละบรรทัด หรือคุณอาจต้องการตัดหรือมุ่งหน้าไฟล์เพื่อรับรายการล่าสุด การเพิ่มการจัดสรรหน่วยความจำของคุณเมื่อไฟล์เติบโตขึ้น
ekerner

คำตอบ:


319

ในที่สุดฉันก็พบคำตอบ:

เพียงเพิ่มบรรทัดด้านล่างนี้ก่อนถึงบรรทัดที่คุณได้รับข้อผิดพลาดในไฟล์ของคุณ

ini_set('memory_limit', '-1');

มันจะใช้หน่วยความจำไม่ จำกัด ของเซิร์ฟเวอร์มันทำงานได้ดี

ขอบคุณที่ให้คำแนะนำเพื่อน


125
คุณควรตรวจสอบสาเหตุที่หน่วยความจำหมด บางทีคุณไม่จำเป็นต้องอ่านไฟล์ทั้งหมดอาจจะอ่านตามลำดับ
macbirdie

8
- @panidarapu และ @Don Jones: ขึ้นอยู่กับปริมาณของหน่วยความจำและวิธีการใช้งานสคริปต์นี้อาจเป็นอันตรายได้หากอนุญาตให้มีการเปลี่ยนแปลงการใช้หน่วยความจำด้วยวิธีนี้ อย่าในกรณีของคุณคุณอาจแบ่งฟีดออกเป็นชิ้นเล็ก ๆ แล้วแยกวิเคราะห์สิ่งที่คุณต้องการ ดีใจที่มันได้ผล แต่ต้องระวัง
คนขี้ขลาดนิรนาม

5
คำแนะนำนี้ใช้ได้สำหรับฉัน การเพิ่มขีด จำกัด หน่วยความจำในสคริปต์แบบไดนามิกทำได้ผ่านฟังก์ชั่น ini_set (): ini_set ('memory_limit', '128M');
mente

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

113
ว้าวคำตอบที่โพสต์ได้อย่างหนาแน่นนี้ดูเหมือนจะเป็นแนวปฏิบัติที่ไม่ดีสำหรับฉัน -1!
Ambidex

59

ต่อไปนี้เป็นวิธีการง่ายๆสองวิธีในการเพิ่มขีด จำกัด ของการโฮสต์ที่ใช้ร่วมกัน:

  1. หากคุณเข้าถึงไฟล์ PHP.ini ของคุณให้เปลี่ยนบรรทัดใน PHP.ini หากบรรทัดของคุณแสดง 32M ลองใช้ 64M: memory_limit = 64M ; Maximum amount of memory a script may consume (64MB)

  2. หากคุณไม่มีสิทธิ์เข้าถึง PHP.ini ให้ลองเพิ่มไฟล์นี้ลงในไฟล์. htaccess: php_value memory_limit 64M


47

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

ตรวจสอบลูปไม่สิ้นสุด

หากนั่นไม่ใช่ปัญหาลองและช่วย PHP โดยทำลายวัตถุที่คุณทำเสร็จแล้วด้วยการตั้งค่าให้เป็นโมฆะ เช่น.$OldVar = null;

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


3
ฉันมีปัญหาตรงนี้ - กลายเป็นว่าฉันได้สร้างฟังก์ชั่นวนซ้ำโดยไม่ได้ตั้งใจ - และทำให้หน่วยความจำหมดในเวลาสุ่มระหว่างการเรียกใช้โค้ด นี่เป็นข้อผิดพลาดของฉันตอนนี้ที่มีรหัสหน่วยความจำที่มีประสิทธิภาพที่สุดในโลกสร้างขึ้นเพื่อตามหาหน่วยความจำรั่ว
Kris Selbekk

1
เพื่อประโยชน์ของผู้อื่นที่จะไล่กระต่ายลงหลุม หลักคำสอนใน Symfony ฉันคิดว่ามีปัญหาเกี่ยวกับการพูดคนเดียวและเมื่อมีข้อยกเว้น PDO มันจะสร้างวนยกเว้นที่ไม่สิ้นสุดเนื่องจากมันจะลองข้อยกเว้นสำหรับข้อยกเว้นทำให้ซ่อนปัญหาจริง (ไฟล์ db ที่เสียหายในกรณีของฉัน)
Desislav Kamenov

39

ทำ:

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;

6
ไม่อยากจะเชื่อเลยว่าคนเหล่านี้แนะนำให้ตั้ง memory_limit เป็น -1 ... สิ่งที่บ้าที่ต้องทำบนเซิร์ฟเวอร์ที่ใช้งานจริง ขอบคุณสำหรับโซลูชันที่สะอาดกว่ามาก
JohnWolf

2
ในขณะที่ "การปฏิบัติที่ดีที่สุด" มันเป็นสิ่งที่ดีที่จะปิดตัวจัดการไฟล์หลังจากที่whileวง:fclose($file)
kodeart

2
@assetCorp วิธีนี้ช่วยได้อย่างไรหากไฟล์มีตัวอย่างเช่น 100MiB และขีด จำกัด หน่วยความจำ PHP ยังคงตั้งไว้ที่ 32 MiB คุณอ่านโดยใช้ชิ้นที่ปลอดภัยขนาด 1MiB แต่ต่อท้ายมันลงในตัวแปรที่จะใช้หน่วยความจำที่มีอยู่ทั้งหมดเมื่อวนมาถึง 31 การวนซ้ำ มันจะดีกว่านี้อย่างไร? เฉพาะการแสดงผลชิ้นในทำนองเดียวกันที่ไม่ต้องการให้จัดเก็บทั้งหมดในตัวแปรเดียวจะช่วยในการแก้ปัญหา
helvete

17

เป็นเรื่องง่ายที่โปรแกรมใน PHP จะใช้หน่วยความจำเร็วกว่าที่คุณคิด การคัดลอกสตริงอาร์เรย์และวัตถุแทนที่จะใช้การอ้างอิงจะทำได้แม้ว่า PHP 5 ควรจะทำสิ่งนี้โดยอัตโนมัติมากกว่าใน PHP 4 แต่การจัดการกับชุดข้อมูลของคุณอย่างครบถ้วนในหลายขั้นตอนก็สิ้นเปลืองเมื่อเปรียบเทียบกับการประมวลผลหน่วยตรรกะที่เล็กที่สุด ขณะนั้น. ตัวอย่างคลาสสิกจะทำงานร่วมกับ resultsets ขนาดใหญ่จากฐานข้อมูล: โปรแกรมเมอร์ส่วนใหญ่เรียก resultset foreach()ทั้งหมดลงในอาร์เรย์และห่วงมากกว่านั้นแล้วหนึ่งครั้งหรือมากกว่าด้วย หน่วยความจำมีประสิทธิภาพมากขึ้นในการใช้การwhile()วนซ้ำเพื่อดึงข้อมูลและประมวลผลทีละแถว สิ่งเดียวกันนี้ใช้กับการประมวลผลไฟล์


ดูเหมือนว่ามีแนวโน้มว่านี่คือสิ่งที่มันเป็น
Kzqai

13

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

ดังนั้นคุณควรอ่านทีละนิดการใช้งานfopenfread


1
แก้ไขปัญหานี้โดยใช้:$fh = fopen($folder.'/'.$filename, "rb") or die(); $buffer = 1024*1024; while (!feof($fh)) { print(fread($fh, $buffer)); flush(); } fclose($fh);
Kai Noack

12

ฉันประสบปัญหาเดียวกันใน php7.2 ที่มี laravel 5.6 ฉันเพิ่งเพิ่มจำนวนตัวแปรmemory_limit = 128Mใน php.ini ตามที่แอปพลิเคชันของฉันต้องการ อาจเป็น 256M / 512M / 1048M ..... ตอนนี้มันใช้งานได้ดี


6

ฉันก็มีปัญหาเดียวกันเช่นกันค้นหาไฟล์ 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');

1
ใช้งานได้กับเว็บไซต์เวิร์ดเพรสที่ไม่สามารถเข้าถึงไฟล์. htaccess และ php.ini +1
Mustafa sabir

ฉันว่าการเปลี่ยนข้อ จำกัด เหล่านั้นในไฟล์ WordPress เป็น 'core' ไม่ใช่ความคิดที่ดี คุณสามารถเพิ่มขีด จำกัด เหล่านั้นได้อย่างง่ายดายwp-config.phpแทนซึ่งจะไม่ถูกเขียนทับโดยการอัปเดต WordPress ในอนาคต นอกจากนี้การรักษาความปลอดภัยไม่กี่ปลั๊กอิน (เช่น WordFence เป็นต้น) จะบ่นถ้า 'หลัก' ไฟล์ WordPress มีการเปลี่ยนแปลง ...
กวินเน็ ธ เวลีน

1
@GwynethLlewelyn ฉันไม่รู้วิธีการทำเช่นนั้นคุณช่วยอธิบายได้ไหม?
garakchy

1
โอ้ ... เพียงแค่แก้ไข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!
Gwyneth Llewelyn

1
"การปฏิบัติที่ไม่ดี" เป็นสถานการณ์ -1ใช้ได้กับกระบวนการที่ทำงานสั้น ๆ ตัวอย่างเช่นคอนเทนเนอร์สร้าง php ที่ใช้สำหรับการทดสอบหน่วยหรือติดตั้งผู้แต่ง / etc อย่าเรียกใช้ไซต์โปรดักชั่นของคุณโดยตั้งเป็นแบบนั้น
emmdee

5

คุณสามารถเพิ่มหน่วยความจำที่อนุญาตให้สคริปต์ php โดยดำเนินการบรรทัดต่อไปนี้ด้านบนรหัสทั้งหมดในสคริปต์:

ini_set('memory_limit','-1'); // enabled the full memory available.

และยังจัดสรรตัวแปรที่ไม่พึงประสงค์ในสคริปต์

ตรวจสอบไลบรารี php นี้: การเพิ่มหน่วยความจำด้วย PHP



3

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

มันควรจะกล่าวว่าini_set('memory_limit', '-1');(ไม่ จำกัด ) สามารถทำให้เกิดความไม่แน่นอนของเซิร์ฟเวอร์เป็น0 bytes free = bad thingsสามารถก่อให้เกิดความไม่แน่นอนเป็นเซิร์ฟเวอร์ ให้ค้นหาสมดุลที่เหมาะสมจากสิ่งที่สคริปต์ของคุณพยายามทำและจำนวนหน่วยความจำที่มีอยู่ในเครื่อง

วิธีการที่ดีกว่า:ถ้าคุณเป็นคนเขียนสคริปต์ (หรือความทะเยอทะยาน) คุณสามารถแก้ปัญหาปัญหาหน่วยความจำดังกล่าวกับxdebug เวอร์ชันล่าสุด (2.6.0 - วางจำหน่าย 2018-01-29) ดึงการจัดทำโปรไฟล์หน่วยความจำกลับมาซึ่งแสดงให้คุณเห็นว่าการเรียกใช้ฟังก์ชั่นนั้นใช้หน่วยความจำจำนวนมากเท่าใด มันทำให้เกิดปัญหาในสคริปต์ที่หายาก โดยปกติแล้วความไร้ประสิทธิภาพอยู่ในลูปที่ไม่ได้คาดหวังว่าจะได้รับเสียง แต่แต่ละกรณีจะถูกใช้เป็นแบบฝึกหัดต่อผู้อ่าน :)

เอกสาร xdebugเป็นประโยชน์ แต่มันเดือดลงไปขั้นตอนที่ 3:

  1. ติดตั้ง - มีให้ผ่านapt-getและyumอื่น ๆ
  2. กำหนดค่า - xdebug.ini: xdebug.profiler_enable = 1,xdebug.profiler_output_dir = /where/ever/
  3. ดูโปรไฟล์ในเครื่องมือเช่นQCacheGrind , KCacheGrind

2

หากคุณพยายามที่จะอ่านไฟล์นั่นจะทำให้หน่วยความจำใน PHP ตัวอย่างเช่นหากคุณพยายามเปิดและอ่านไฟล์ MP3 (เช่นพูดไฟล์ $ data = (" http://mydomain.com/path/sample.mp3 ") มันจะดึงมันทั้งหมดลงในหน่วยความจำ .

ตามที่เนลสันแนะนำคุณสามารถทำงานเพื่อเพิ่มขีด จำกัด หน่วยความจำสูงสุดหากคุณต้องการใช้หน่วยความจำมาก


2

เรามีสถานการณ์ที่คล้ายกันและเราพยายามหาคำตอบที่ด้านบนของคำตอบ ini_set ('memory_limit', '-1'); และทุกอย่างทำงานได้ดีไฟล์รูปภาพที่บีบอัดซึ่งมีขนาดใหญ่กว่า 1MB ถึง KB


1

เขียน

ini_set('memory_limit', '-1');

ใน index.php ของคุณที่ด้านบนหลังจากเปิดแท็ก php


1

ฉันได้รับข้อความแสดงข้อผิดพลาดเดียวกันหลังจากเปลี่ยนเป็นธีมใหม่ใน Wordpress PHP ใช้เวอร์ชั่น 5.3 ดังนั้นฉันเปลี่ยนเป็น 7.2 ที่แก้ไขปัญหา


1

หากคุณใช้โฮสติ้งที่ใช้ร่วมกันคุณจะไม่สามารถบังคับใช้การเพิ่มขึ้นในขีด จำกัด ของขนาด php

เพียงไปที่ cPanel ของคุณและอัพเกรด php version เป็น 7.1 ขึ้นไปจากนั้นคุณก็พร้อมที่จะไป


0

ผู้ใช้ wordpress เพิ่มบรรทัด:

@ini_set('memory_limit', '-1');

ใน wp-settings.php ซึ่งคุณสามารถหาได้ในโฟลเดอร์รูทที่ติดตั้ง wordpress


0

ฉันไม่ได้ต่ออายุโฮสติ้งของฉันและฐานข้อมูลเป็นแบบอ่านอย่างเดียว Joomla จำเป็นต้องเขียนเซสชันและไม่สามารถทำได้


0

ฉันมีปัญหาเดียวกันกับที่เรียกใช้ 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

เมื่อฉันแก้ไขมันแล้วกระบวนการของฉันก็เริ่มทำงานได้ดี



-1

หากคุณกำลังใช้ 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 }

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