หน้าจอสีขาวแห่งความตาย: ข้อผิดพลาดร้ายแรง: ขนาดหน่วยความจำที่อนุญาตของ X ไบต์หมดลง


21

ฉันมีปัญหากับการติดตั้ง Drupal ของฉันตัวอย่างเช่น:

  • เมื่อฉันเปิดใช้งานหรือปิดการใช้งานโมดูลมันเปลี่ยนเส้นทางฉันไปที่หน้าว่าง
  • เมื่อฉันสร้างประเภทเนื้อหาใหม่และบันทึกเปลี่ยนเส้นทางฉันไปยังหน้าว่าง
  • เมื่อฉันเพิ่มมุมมองใหม่และบันทึกมันจะเปลี่ยนเส้นทางฉันไปยังหน้าว่าง
  • เมื่อฉันพยายามล้างแคชมันจะพาฉันกลับไปที่หน้าว่าง
  • หรือในกรณีที่คล้ายกัน

โดยทั่วไปหน้าการยืนยันทั้งหมดจะพาฉันไปที่หน้าจอสีขาว เมื่อฉันรีเฟรชอีกครั้งมันจะแสดงหน้าฉัน ฉันพยายามเพิ่มค่าหน่วยความจำ PHP แต่ก็ไม่ช่วย

มีวิธีแก้ไขปัญหาอื่นอีกไหมสำหรับเรื่องนี้?

ข้อผิดพลาดที่ฉันมี:

ข้อผิดพลาดร้ายแรง: ขนาดหน่วยความจำที่อนุญาตของ 100663296 ไบต์หมดลง (พยายามจัดสรร 8192 ไบต์) ในไซต์ / ทั้งหมด / modules / views / plugins / views_plugin_localization_none.inc ที่บรรทัดที่ 1


2
ตรวจสอบบันทึกข้อผิดพลาดทุกครั้งซึ่งจะมีข้อมูลทั้งหมดที่จำเป็น เสียงเหมือนในกรณีของคุณคุณมีหน่วยความจำหมด Drupal 7 ต้องการมากกว่า 32MB ซึ่งผู้ให้บริการโฮสต์หลายรายตั้งเป็นค่าเริ่มต้น
GoodSp33d

คำตอบ:


20

ฉันรู้ว่ามันอาจจะสาย แต่มันก็ช่วยฉัน เวลาส่วนใหญ่ที่โมดูลทำให้ WSOD ฉันไม่สามารถปิดการใช้งานโมดูลเพื่อทดสอบว่าเป็นเพราะฉันอาจสูญเสียข้อมูลในกระบวนการ สิ่งที่ฉันทำคือแก้ไขฟังก์ชั่นนี้ชั่วคราวmodule.incในincludesไดเรกทอรีหลัก

function module_invoke_all($hook) {
  $args = func_get_args();
  // Remove $hook from the arguments.
  unset($args[0]);
  $return = array();
  foreach (module_implements($hook) as $module) {

        print "Starting loading $module <br />";

        $function = $module . '_' . $hook;
        if (function_exists($function)) {
          $result = call_user_func_array($function, $args);
          if (isset($result) && is_array($result)) {
            $return = array_merge_recursive($return, $result);
          }
          elseif (isset($result)) {
            $return[] = $result;
          }
        }

        print "Finished loading $module <br />";

  }

  return $return;
}

และฉันได้เพิ่มคำแถลงการพิมพ์ 2 ข้อในรหัสด้านบนแล้วรีเฟรชหน้าโมดูลที่ไม่ถึงคำสั่ง "เสร็จสิ้นการโหลด $ module" เป็นคำสั่งที่มีปัญหา ... มันเป็น devel ในกรณีของฉัน

หลังจากค้นหาโมดูลคุณสามารถเข้าไปในตารางระบบและค้นหาโมดูลนั้นตั้งค่าเป็น status = 0 และ bootstrap = 0 หรือเรียกใช้แบบสอบถาม:

UPDATE system SET status = 0, bootstrap = 0 WHERE name = 'module_name' LIMIT 1

ข้อมูลอ้างอิง: การดีบักหน้าจอ Drupal White Screen of Death (WSOD)


1
การเพิ่มคำสั่งการพิมพ์ไปที่ module_invoke_all ทำให้ฉันสามารถค้นหาโมดูลที่ละเมิดได้อย่างรวดเร็ว จากนั้นฉันใช้ drush เพื่อปิดการใช้งาน ช่างเป็นผู้ช่วยชีวิตได้!
Dan Meigs

คุณยินดีต้อนรับ @DanMeigs ฉันได้ใช้วิธีการนี้เฉพาะวันนี้เพื่อแก้ไขบล็อกของฉันcleverlogic.net บางทีฉันอาจจะทำควรจะเขียนบทความเกี่ยวกับเรื่องนี้เพราะว่าผมไม่แน่ใจว่าอ่าน whiles จำนวนมากพยายามที่จะได้รับการแก้ไข WSOD
โจชัว Kissoon

11

วางรหัสนี้ในindex.phpไฟล์ของคุณ มันจะแสดงข้อความข้อผิดพลาดแทนหน้าเปล่า อย่างน้อยสามารถทราบถึงรากของปัญหาได้ วางไว้ด้านหลังแท็ก php

    error_reporting(E_ALL);
    ini_set('display_errors', TRUE);
    ini_set('display_startup_errors', TRUE);

หวังว่ามันจะแสดงวิธีการ!

http://drupal.org/node/158043


1
ไม่ได้ผลฉันลองใช้เมื่อวานนี้เพื่อดูข้อผิดพลาด แต่ไม่ได้พิมพ์อะไรเลย
Jayaram

3
คุณตรวจสอบบันทึกข้อผิดพลาดของคุณแล้วหรือยัง? หากคุณกำลังใช้ Apache บน Linux tail /var/log/apache2/error.logลองคำสั่งนี้ในสถานี: นั่นจะแสดง 10 บรรทัดล่าสุดของไฟล์นั้น
Charlie Schliesser

ที่จริงแล้วมันเริ่มแสดงให้ฉันเห็นข้อผิดพลาด .. ข้อผิดพลาดที่ฉันได้รับคือข้อผิดพลาดร้ายแรง: ขนาดหน่วยความจำที่อนุญาตของ 100663296 ไบต์หมดลง (พยายามจัดสรร 8192 ไบต์) ใน *** / sites / all / modules / views / plugins / views_plugin_localization_none.inc ในบรรทัด 1
Jayaram

1
การเพิ่มสิ่งนี้index.phpเป็นความคิดที่ไม่ดี (แม้ชั่วคราวเพราะคนส่วนใหญ่จะขี้เกียจที่จะลบมันในภายหลังหากใช้งานได้) จะเป็นการดีกว่าที่จะวางลงในไฟล์การตั้งค่าของคุณ
kenorb

10

เหตุผลที่หน้าจอว่างเปล่าสีขาวแห่งความตายคือการรายงานข้อผิดพลาดปิดเพื่อตรวจสอบข้อผิดพลาดเพิ่มบรรทัดต่อไปนี้ในไฟล์ setting.php ของคุณ:

error_reporting(E_ALL);
$conf['error_level'] = 2;
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

สำหรับข้อผิดพลาดที่คุณเผชิญ ("ขนาดหน่วยความจำที่อนุญาตของ XXX ไบต์หมดลง") คุณสามารถลองทำสิ่งต่อไปนี้:

  1. ตัดทอนแคชด้วยตนเองและตรวจสอบว่าสามารถแก้ไขปัญหาได้หรือไม่ (เป็นการดีที่จะสำรองฐานข้อมูลของคุณก่อนที่จะทำเช่นนั้น):

    Access phpMyAdmin and truncate all tables starting by cache_ from the database.

  2. เพิ่มขีด จำกัด ของหน่วยความจำ (เป็นเหตุผลหลักของความผิดพลาดดังกล่าวเป็นหน่วยความจำหมดโดยเซิร์ฟเวอร์ซึ่งก่อให้เกิดการโหลดบางส่วนของโมดูลและที่เป็นสาเหตุของปัญหา) โดยการเพิ่มบรรทัดต่อไปนี้ในไฟล์ settings.php คุณ: ini_set('memory_limit', '-1');
    เพิ่มini_set('memory_limit', '-1'); แทนที่ ขีด จำกัด หน่วยความจำ PHP เริ่มต้น
    หากคุณต้องการ จำกัด หน่วยความจำแทนคุณ-1สามารถกำหนดขนาดหน่วยความจำเช่น '256M' หรือ '512M'


6

เป็นไปได้อย่างยิ่งที่หนึ่งในโมดูลของคุณมีหน่วยความจำไม่เพียงพอ

คุณสามารถเพิ่มโค้ดหนึ่งบรรทัดในไฟล์ index.php ของคุณเพื่อให้ Drupal สามารถเรียกใช้หน่วยความจำได้มากกว่าการตั้งค่าเริ่มต้น:

ini_set('memory_limit','256M');

เพิ่มรหัสข้างต้นในบรรทัดหลัง? php ในไฟล์ /drupal/index.php ของคุณ หากทุกอย่างเริ่มทำงานได้ดีคุณสามารถระบุสิ่งที่ทำให้เกิดปัญหาหน่วยความจำ (มีโอกาสสูงที่มันเป็นโมดูล)

ปิดใช้งานโมดูลแล้วคอมเม้นต์ ini_set ('memory_limit', '256M'); และดูว่ามันโหลดตอนนี้

ไม่แนะนำให้ปล่อย ini_set ('memory_limit', '256M'); ในสถานที่เป็นทางออก แต่อย่างน้อยก็สามารถช่วยให้คุณไปที่หน้ารายการโมดูลของคุณ

คุณอาจพบว่ามีประโยชน์ในการทำdebug_backtrace ()เพื่อตรวจสอบสิ่งที่ใช้หน่วยความจำ


สิ่งนี้ไม่ได้ช่วย
Jayaram

นอกจากนี้ฉันสามารถดูหน้ารายการโมดูลจะเกิดขึ้นเฉพาะเมื่อฉันเปิดใช้งาน / ปิดใช้งานโมดูลฉันจะต้องรีเฟรชอีกครั้งเพื่อดูหน้าการยืนยัน
Jayaram

2
แทนที่จะใส่ ini_set () การเรียกใน index.php ซึ่งพวกมันจะถูกลบออกจากการอัพเดทหากคุณต้องเขียนโค้ดใน PHP คุณควรวางมันไว้ในไฟล์ settings.php ซึ่งเป็นตำแหน่งที่ถูกต้องสำหรับไซต์เฉพาะ แทนที่
Alfred Armstrong

การเพิ่มสิ่งนี้index.phpเป็นความคิดที่ไม่ดี (แม้ชั่วคราวเพราะคนส่วนใหญ่จะขี้เกียจที่จะลบมันในภายหลังหากใช้งานได้) จะเป็นการดีกว่าที่จะวางลงในไฟล์การตั้งค่าของคุณ
kenorb

6

ความผิดพลาด:

ข้อผิดพลาดร้ายแรง: ขนาดหน่วยความจำที่อนุญาตเป็น X ไบต์หมดไป (พยายามจัดสรร Y ไบต์)

การแปลงไบต์ X ลงใน MB หาร 1024 * 1024 หรือตรวจสอบที่วุลแฟรม

เกิดขึ้นเมื่อ PHP พยายามจัดสรร Y ไบต์ แต่มีข้อ จำกัด อย่างหนักใน X ไบต์ที่กำหนดโดยmemory_limitการตั้งค่าการกำหนดค่าPHP

ขีด จำกัด ปัจจุบันสามารถตรวจสอบได้โดยไปที่การบริหาร»รายงาน»รายงานสถานะ» PHP (URL:) /admin/reports/status/phpหรือโดยการพิมพ์ini_get('memory_limit')ใน PHP (โปรดทราบว่าขีด จำกัด นั้นจะแตกต่างกันสำหรับ UI และ CLI)

ในการแก้ไขปัญหาคุณจะต้องลดการใช้ทรัพยากรเช่น:

  • ปิดใช้งานโมดูลการพัฒนาใด ๆ ที่คุณไม่ได้ใช้ในปัจจุบัน (แนะนำ)

    ซึ่งรวมถึง: Devel, Devel Themer (หากเปิดใช้งาน)

  • ปิดการใช้งานโมดูลใด ๆ ที่คุณไม่ได้ใช้

  • ปิดใช้งานตัวแปรดีบักบางตัวซึ่งอาจส่งผลต่อทรัพยากรหน่วยความจำของคุณเช่นตัวอย่างบางส่วนด้วยdrush:

    drush -y vset rules_debug 0
    drush -y vset rules_debug_log 0
  • ปิดใช้งานส่วนขยาย PHP ที่แน่นอนเช่น XDebug

  • เปิดใช้งานแคช redis / memcached และแคช PHP บางอัน (เช่น OPCache / XCache)
  • ในที่สุดถ้าข้างต้นจะไม่ช่วย - การเพิ่มขึ้นmemory_limitในการกำหนดค่าของ PHP

หากคุณตัดสินใจที่จะเพิ่มขีด จำกัด หน่วยความจำผู้คนจำนวนมากที่นี่แนะนำให้แฮ็คคอร์ของคุณโดยการวางโค้ด PHP ลงในindex.phpเพื่อเพิ่มหน่วยความจำ PHP ของคุณ - อย่าทำอย่างนั้น ! มันเป็นการปฏิบัติที่แย่มาก

แทนที่จะแก้ไขของคุณsettings.php(หรือsettings.local.phpถ้าคุณรวมไว้) และวางรหัสต่อไปนี้ไว้ที่ท้าย:

ini_set('memory_limit', '512M');

หรือวิธีที่ดีกว่าในการทำเช่นนี้คือแก้ไขไฟล์กำหนดค่า PHP ( php.ini) และเปลี่ยนบรรทัดต่อไปนี้:

memory_limit = 512M  ; Maximum amount of memory a script may consume

หากคุณไม่แน่ใจว่าอยู่ที่ไหนphp.iniให้ตรวจสอบโดย:

  • drush status คำสั่ง
  • /admin/reports/status/phpหรือไปที่

เพื่อตรวจสอบเพิ่มเติมว่าหน้า / ส่วนประกอบใดที่ใช้หน่วยความจำมากที่สุดคุณมีความเป็นไปได้ดังต่อไปนี้:

สำหรับข้อมูลเพิ่มเติมตรวจสอบ:


1
+1 สำหรับการเน้นว่า php UI และ CLI สามารถแตกต่างกันmemory_limitได้ ฉันมีปัญหาที่รายงานเพียงdrushเพราะฉันมีข้อผิดพลาด/etc/php/7.0/cli/php.iniแต่ไม่ได้อยู่ใน/etc/php/7.0/cli/php.iniดังนั้น drupal UI ทำงานได้ดี ขอบคุณ!
miro marchi

1

คุณสามารถใช้โมดูลเพื่อควบคุมขีด จำกัด หน่วยความจำนี้ โมดูลPHP Runtime Configuratorมีตัวเลือกมากมายให้ตั้งค่าโดยไม่ต้องเปลี่ยนไฟล์ php.ini ของคุณและรีสตาร์ท Apache

คุณสามารถกำหนดค่าพารามิเตอร์ต่อไปนี้:

  • ขีด จำกัด การอัปโหลดไฟล์
  • ขีด จำกัด หน่วยความจำ
  • จำกัด เวลาดำเนินการสูงสุด
  • ขีด จำกัด ตัวแปรอินพุตสูงสุด

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