Layar putih kematian: Kesalahan fatal: Ukuran memori yang diizinkan dari X byte habis


21

Saya memiliki masalah dengan instalasi Drupal saya, misalnya:

  • ketika saya mengaktifkan atau menonaktifkan modul, Ini mengarahkan saya ke halaman kosong,
  • ketika saya membuat jenis konten baru dan menyimpannya, mengarahkan saya ke halaman kosong,
  • ketika saya menambahkan tampilan baru dan menyimpannya, itu mengarahkan saya ke halaman kosong,
  • ketika saya mencoba untuk menghapus cache, itu mengarahkan saya kembali ke halaman kosong,
  • atau dalam kasus serupa.

Pada dasarnya semua halaman konfirmasi mengarahkan saya ke layar putih. Ketika saya menyegarkan kembali, itu menunjukkan kepada saya halaman. Saya mencoba untuk meningkatkan nilai memori PHP tetapi tidak membantu.

Apakah ada solusi lain untuk ini?

Kesalahan yang saya alami:

Kesalahan fatal: Ukuran memori yang diijinkan 100663296 byte habis (mencoba mengalokasikan 8192 byte) di situs / semua / modul / tampilan / plugin / views_plugin_localization_none.inc pada baris 1


2
Selalu periksa log kesalahan, itu akan memiliki semua info yang dibutuhkan. Kedengarannya seperti dalam kasus Anda Anda kehabisan Memori. Drupal 7 membutuhkan lebih dari 32MB yang ditetapkan oleh banyak penyedia host sebagai default.
GoodSp33d

Jawaban:


20

Saya tahu ini mungkin terlambat, tetapi itu membantu saya. Seringkali sebuah modul menyebabkan WSOD, saya tidak bisa hanya menonaktifkan modul untuk menguji yang mana, karena saya mungkin telah kehilangan data dalam proses. Apa yang saya lakukan adalah mengedit sementara fungsi ini di module.inc, di includesdirektori inti

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;
}

Dan saya menambahkan 2 pernyataan cetak dalam kode di atas, kemudian me-refresh halaman, modul yang tidak mencapai pernyataan "Selesai memuat $ modul" adalah yang bermasalah ... itu berkembang dalam kasus saya.

Setelah menemukan modul, Anda bisa masuk ke tabel sistem dan mencari modul itu, atur statusnya = 0 dan bootstrap = 0 atau jalankan kueri:

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

Referensi: Debugging Drupal White Screen of Death (WSOD)


1
Menambahkan pernyataan cetak ke module_invoke_all memungkinkan saya menemukan modul yang menyinggung dengan cepat. Lalu saya menggunakan drush untuk menonaktifkannya. Sungguh penyelamat hidup!
Dan Meigs

Terima kasih @DanMeigs. Saya hanya menggunakan metode ini hari ini untuk memperbaiki blog saya cleverlogic.net . Mungkin saya harus menulis artikel tentang ini, karena saya yakin saya sudah membaca banyak ketika mencoba untuk memperbaiki WSOD
Joshua Kissoon

11

Tempel kode ini di index.phpfile Anda . Ini akan menampilkan pesan kesalahan bukan halaman kosong. Setidaknya akar masalahnya bisa diketahui. Rekatkan tepat setelah tag php.

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

Semoga ini akan menunjukkan jalannya kepada Anda !.

http://drupal.org/node/158043


1
Itu tidak berhasil, saya mencoba kemarin untuk melihat kesalahannya, tetapi tidak mencetak apa pun
Jayaram

3
Sudahkah Anda memeriksa log kesalahan Anda? Jika Anda menjalankan Apache pada Linux, coba perintah ini di terminal: tail /var/log/apache2/error.log. Itu akan menunjukkan kepada Anda 10 baris terbaru dari file itu.
Charlie Schliesser

Sebenarnya, itu mulai menunjukkan saya kesalahan .. Kesalahan yang saya dapatkan adalah Kesalahan fatal: Ukuran memori yang diizinkan dari 100663296 byte habis (mencoba mengalokasikan 8192 byte) di *** / situs / semua / modul / views / plugins / views_plugin_localization_none.inc on line 1
Jayaram

1
Menambahkan ini ke index.phpadalah ide yang buruk (bahkan sementara, karena kebanyakan orang malas untuk menghapusnya nanti jika ini berfungsi), lebih baik untuk menempelkannya langsung ke file pengaturan Anda.
kenorb

10

Alasan kematian layar putih kosong adalah pelaporan kesalahan dimatikan, untuk memeriksa kesalahan tambahkan baris berikut dalam file setting.php Anda:

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

Untuk kesalahan yang Anda hadapi ("Ukuran memori yang diizinkan dari XXX byte habis"), Anda dapat mencoba hal-hal berikut:

  1. Pangkas cache secara manual dan periksa apakah itu memperbaiki masalah (Mungkin baik untuk membuat cadangan DB Anda sebelum melakukan itu):

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

  2. Menambah batas memori (karena alasan utama kesalahan di atas adalah kehabisan memori oleh server yang menyebabkan pemuatan sebagian modul dan yang menyebabkan masalah) dengan menambahkan baris berikut di file settings.php Anda: ini_set('memory_limit', '-1');
    Menambahkan ini_set('memory_limit', '-1'); menimpa batas memori PHP default.
    Jika Anda ingin membatasi memori daripada -1Anda dapat memberikan ukuran memori seperti '256M' ATAU '512M'.


6

Bisa jadi salah satu modul Anda kehabisan memori.

Anda dapat menambahkan satu baris kode ke file index.php Anda untuk memungkinkan Drupal berjalan dengan lebih banyak memori daripada pengaturan default:

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

Tambahkan kode di atas pada baris setelah? Php di file /drupal/index.php Anda. Jika semuanya mulai berfungsi dengan baik, maka Anda dapat mengidentifikasi apa yang menyebabkan masalah memori (sangat mungkin itu adalah modul).

Nonaktifkan modul, dan kemudian komentar ini_set ('memory_limit', '256M'); dan lihat apakah sudah dimuat sekarang.

Tidak disarankan untuk meninggalkan ini_set ('memory_limit', '256M'); ada di tempat sebagai solusi, tetapi setidaknya dapat memungkinkan Anda untuk masuk ke halaman daftar modul Anda.

Anda mungkin perlu melakukan debug_backtrace () untuk menentukan apa yang menggunakan memori.


Ini tidak membantu
Jayaram

Juga, saya dapat melihat halaman daftar modul, itu hanya terjadi ketika saya mengaktifkan / menonaktifkan modul, saya harus me-refresh lagi untuk melihat halaman konfirmasi.
Jayaram

2
Daripada menempatkan panggilan ini_set () di index.php, di mana mereka akan terhapus pada pembaruan, jika Anda harus kode mereka dalam PHP Anda harus menempatkan mereka di file settings.php Anda, yang merupakan tempat yang tepat untuk situs-spesifik menimpa.
Alfred Armstrong

Menambahkan ini ke index.phpadalah ide yang buruk (bahkan sementara, karena kebanyakan orang malas untuk menghapusnya nanti jika ini berfungsi), lebih baik untuk menempelkannya langsung ke file pengaturan Anda.
kenorb

6

Kesalahan:

Kesalahan fatal: Ukuran memori yang diizinkan dari X byte habis (mencoba mengalokasikan byte Y)

Untuk mengkonversi byte X ke MB, bagi dengan 1024 * 1024 atau periksa di Wolfram .

terjadi ketika PHP mencoba mengalokasikan byte Y, tetapi ada batas keras pada X byte yang ditetapkan oleh memory_limitpengaturan konfigurasi PHP .

Batas saat ini dapat diperiksa dengan masuk ke Administrasi »Laporan» Laporan Status »PHP (URL:) /admin/reports/status/phpatau dengan mencetak ini_get('memory_limit')dalam PHP (perhatikan bahwa batasnya berbeda untuk UI dan CLI).

Untuk memperbaikinya, Anda perlu menurunkan penggunaan sumber daya Anda, misalnya:

  • menonaktifkan modul pengembangan yang saat ini tidak Anda gunakan (disarankan),

    Ini termasuk: Devel, Devel Themer (jika diaktifkan).

  • nonaktifkan semua modul yang tidak Anda gunakan,

  • nonaktifkan variabel debug tertentu yang dapat berdampak pada sumber daya memori Anda, misalnya beberapa contoh dengan drush:

    drush -y vset rules_debug 0
    drush -y vset rules_debug_log 0
  • nonaktifkan ekstensi PHP tertentu, seperti XDebug,

  • aktifkan cache redis / memcached dan beberapa cache PHP (mis. OPCache / XCache),
  • akhirnya jika di atas tidak akan membantu - meningkatkan memory_limitkonfigurasi PHP Anda .

Jika Anda memutuskan untuk meningkatkan batas memori, banyak orang di sini menyarankan untuk benar-benar meretas inti Anda dengan menempelkan kode PHP ke Anda index.phpuntuk meningkatkan memori PHP Anda - jangan pernah lakukan itu ! Ini praktik yang sangat buruk.

Alih-alih mengedit settings.php(atau settings.local.phpjika Anda memasukkannya) dan rekatkan kode berikut di sana di bagian akhir:

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

atau cara yang lebih baik untuk melakukan ini adalah mengedit file konfigurasi PHP Anda ( php.ini) dan mengubah baris berikut:

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

Jika Anda tidak yakin di mana Anda berada php.ini, periksa dengan:

  • drush status perintah
  • atau dengan pergi /admin/reports/status/php.

Untuk menyelidiki lebih lanjut halaman / komponen mana yang paling banyak menggunakan memori, Anda memiliki kemungkinan berikut:

Untuk informasi lebih lanjut, periksa:


1
+1 untuk menekankan bahwa php UI dan CLI dapat berbeda memory_limit. Saya memiliki masalah yang dilaporkan hanya dengan drushtepat karena saya memiliki kesalahan /etc/php/7.0/cli/php.initetapi tidak dalam /etc/php/7.0/cli/php.ini, jadi UI drupal bekerja dengan baik. Terima kasih!
miro marchi

1

Anda dapat menggunakan modul untuk mengontrol batas memori ini. Modul PHP Runtime Configurator menyediakan banyak opsi untuk dikonfigurasikan tanpa mengubah file php.ini Anda dan restart Apache.

Anda dapat mengkonfigurasi parameter berikut:

  • Batas Upload File
  • Batas Memori
  • Batas Waktu Eksekusi Maksimum
  • Batas Variabel Input Maksimum

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.