Màn hình trắng của cái chết: Lỗi nghiêm trọng: Kích thước bộ nhớ cho phép của X byte đã hết


21

Tôi có một vấn đề với cài đặt Drupal của tôi, ví dụ:

  • Khi tôi bật hoặc tắt các mô-đun, Nó sẽ chuyển hướng tôi đến một trang trống,
  • Khi tôi tạo một loại nội dung mới và lưu nó, hãy chuyển hướng tôi đến một trang trống,
  • Khi tôi thêm chế độ xem mới và lưu nó, nó sẽ chuyển hướng tôi đến một trang trống,
  • Khi tôi cố gắng xóa bộ nhớ cache, nó sẽ chuyển hướng tôi trở lại một trang trống,
  • hoặc trong trường hợp tương tự.

Về cơ bản tất cả các trang xác nhận chuyển hướng tôi đến một màn hình trắng. Khi tôi làm mới nó một lần nữa, nó hiển thị cho tôi trang. Tôi đã cố gắng tăng giá trị bộ nhớ PHP nhưng không được.

Có giải pháp nào khác cho việc này không?

Lỗi mà tôi gặp phải:

Lỗi nghiêm trọng: Kích thước bộ nhớ cho phép hết 100663296 byte (đã cố phân bổ 8192 byte) trong các trang web / tất cả / mô-đun / lượt xem / plugin / lượt xem_plugin_localization_none.inc trên dòng 1


2
Luôn luôn kiểm tra các bản ghi lỗi, nó sẽ có tất cả các thông tin cần thiết. Âm thanh như trong trường hợp của bạn, bạn đang hết Bộ nhớ. Drupal 7 yêu cầu nhiều hơn 32 MB mà nhiều nhà cung cấp máy chủ lưu trữ đặt làm mặc định.
GoodSp33d

Câu trả lời:


20

Tôi biết điều này có thể là muộn, nhưng nó đã giúp tôi. Hầu hết các mô-đun gây ra WSOD, tôi không thể vô hiệu hóa các mô-đun để kiểm tra xem nó là gì, vì tôi có thể bị mất dữ liệu trong quy trình. Những gì tôi đã làm là tạm thời chỉnh sửa chức năng này trong thư mục module.inclõiincludes

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

Và tôi đã thêm 2 câu lệnh in vào đoạn mã trên, sau đó làm mới trang, mô-đun không đạt được câu lệnh "Hoàn tất tải mô-đun $" là câu lệnh có vấn đề ... trong trường hợp của tôi.

Sau khi tìm thấy mô-đun, bạn có thể đi vào bảng hệ thống và tìm mô-đun đó, đặt trạng thái = 0 và bootstrap = 0 hoặc chạy truy vấn:

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

Tham khảo: Gỡ lỗi màn hình trắng chết chóc của Drupal (WSOD)


1
Thêm các câu lệnh in vào module_invoke_all cho phép tôi nhanh chóng tìm thấy mô-đun vi phạm. Sau đó, tôi đã sử dụng drush để vô hiệu hóa nó. Thật là một sự cứu rỗi!
Dan Meigs

Bạn được chào đón @DanMeigs. Tôi đã sử dụng phương pháp này chỉ ngày hôm nay để sửa chữa blog của tôi smartlogic.net . Có lẽ tôi nên viết một bài báo về điều này, vì tôi chắc chắn đã đọc rất nhiều người cố gắng sửa WSOD
Joshua Kisreeze

11

Dán mã này vào index.phptập tin của bạn . Nó sẽ hiển thị cho bạn thông báo lỗi thay vì trang trống. Ít nhất là gốc rễ của vấn đề có thể được biết. Dán nó ngay sau thẻ php.

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

Hy vọng nó sẽ chỉ cho bạn con đường!.

http://drupal.org/node/158043


1
Điều đó không hiệu quả, tôi đã cố gắng vào ngày hôm qua để xem các lỗi, nhưng nó không in bất cứ điều gì
Jayaram

3
Bạn đã kiểm tra nhật ký lỗi của bạn? Nếu bạn đang chạy Apache trên Linux, hãy thử lệnh này trong thiết bị đầu cuối : tail /var/log/apache2/error.log. Điều đó sẽ cho bạn thấy 10 dòng gần đây nhất của tập tin đó.
Charlie Schliesser

Trên thực tế, nó bắt đầu hiển thị cho tôi các lỗi .. Lỗi tôi gặp là Lỗi nghiêm trọng: Kích thước bộ nhớ cho phép hết 100663296 byte (đã cố gắng phân bổ 8192 byte) trong *** / site / all / module / view / plugins / Views_plugin_localization_none.inc trên dòng 1
Jayaram

1
Thêm điều này vào index.phplà một ý tưởng tồi (thậm chí là tạm thời, vì hầu hết mọi người đều lười biếng xóa nó sau này nếu điều này hoạt động), tốt hơn là dán thẳng vào tệp cài đặt của bạn.
kenorb

10

Lý do màn hình trắng chết là báo cáo lỗi bị tắt, để kiểm tra lỗi thêm các dòng sau vào tệp settings.php của bạn:

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

Đối với lỗi bạn đang gặp phải ("Kích thước bộ nhớ cho phép hết byte byte"), bạn có thể thử những điều sau:

  1. Cắt bớt bộ nhớ cache theo cách thủ công và kiểm tra xem nó có khắc phục được sự cố không (Có lẽ nên sao lưu DB của bạn trước khi thực hiện việc đó):

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

  2. Tăng giới hạn bộ nhớ (vì lý do chính của lỗi trên là bộ nhớ bị cạn kiệt bởi máy chủ gây ra việc tải một phần các mô-đun và gây ra sự cố) bằng cách thêm dòng sau vào tệp settings.php của bạn: ini_set('memory_limit', '-1');
    Thêm ini_set('memory_limit', '-1'); ghi đè giới hạn bộ nhớ PHP mặc định.
    Nếu bạn muốn hạn chế bộ nhớ hơn thay vì -1bạn có thể cung cấp kích thước bộ nhớ như '256M' HOẶC '512M'.


6

Rất có thể là một trong các mô-đun của bạn sắp hết bộ nhớ.

Bạn có thể thêm một dòng mã vào tệp index.php để cho phép Drupal chạy với nhiều bộ nhớ hơn cài đặt mặc định:

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

Thêm mã ở trên vào dòng sau? Php trong tệp /drupal/index.php của bạn. Nếu mọi thứ bắt đầu hoạt động tốt, thì bạn có thể xác định nguyên nhân gây ra sự cố bộ nhớ (rất có thể đó là mô-đun).

Vô hiệu hóa một mô-đun và sau đó nhận xét ini_set ('memory_limit', '256M'); và xem nếu nó tải bây giờ.

Không nên để ini_set ('memory_limit', '256M'); thay thế như một giải pháp, nhưng ít nhất nó có thể cho phép bạn truy cập trang danh sách mô-đun của mình.

Bạn có thể thấy hữu ích khi thực hiện debug_backtrace () để xác định những gì đã sử dụng bộ nhớ.


Điều này không có ích
Jayaram

Ngoài ra, tôi có thể thấy trang danh sách mô-đun, nó chỉ xảy ra khi tôi bật / tắt mô-đun, tôi sẽ phải làm mới lại để xem trang xác nhận.
Jayaram

2
Thay vì thực hiện các lệnh gọi ini_set () trong tệp index.php, nơi chúng sẽ bị xóa trên một bản cập nhật, nếu bạn phải mã hóa chúng trong PHP, bạn nên đặt chúng vào tệp settings.php, đây là vị trí chính xác cho trang web cụ thể ghi đè.
Alfred Armstrong

Thêm điều này vào index.phplà một ý tưởng tồi (thậm chí là tạm thời, vì hầu hết mọi người đều lười biếng xóa nó sau này nếu điều này hoạt động), tốt hơn là dán thẳng vào tệp cài đặt của bạn.
kenorb

6

Lỗi:

Lỗi nghiêm trọng: Kích thước bộ nhớ cho phép của các byte X hết (đã cố gắng phân bổ byte Y)

Để chuyển đổi byte X thành MB, chia cho 1024 * 1024 hoặc kiểm tra tại Wolfram .

xảy ra khi PHP cố gắng phân bổ byte Y, nhưng có giới hạn cứng đối với byte X được đặt bởi memory_limitcài đặt cấu hình PHP .

Có thể kiểm tra giới hạn hiện tại bằng cách đi tới Quản trị »Báo cáo» Báo cáo trạng thái »PHP (URL /admin/reports/status/php:) hoặc bằng cách in ini_get('memory_limit')bằng PHP (lưu ý rằng giới hạn đó khác nhau đối với UI và CLI).

Để khắc phục, bạn cần giảm mức sử dụng tài nguyên của mình, ví dụ:

  • vô hiệu hóa mọi mô-đun phát triển mà bạn hiện không sử dụng (được khuyến nghị),

    Điều này bao gồm: Devel, Devel Themer (nếu được bật).

  • vô hiệu hóa bất kỳ mô-đun nào bạn không sử dụng,

  • vô hiệu hóa các biến gỡ lỗi nhất định có thể ảnh hưởng đến tài nguyên bộ nhớ của bạn, ví dụ như một vài ví dụ với drush:

    drush -y vset rules_debug 0
    drush -y vset rules_debug_log 0
  • vô hiệu hóa các phần mở rộng PHP nhất định, chẳng hạn như XDebug,

  • cho phép bộ nhớ cache redis / memcached và một số bộ đệm PHP (ví dụ: OPCache / XCache),
  • cuối cùng nếu ở trên sẽ không giúp - tăng memory_limitcấu hình PHP của bạn .

Nếu bạn quyết định tăng giới hạn bộ nhớ, rất nhiều người ở đây khuyên bạn nên thực sự hack lõi của bạn bằng cách dán mã PHP vào index.phpđể tăng bộ nhớ PHP của bạn - đừng bao giờ làm thế ! Đó là một thực tế rất xấu.

Thay vào đó hãy chỉnh sửa settings.php(hoặc settings.local.phpnếu bạn có nó) và dán đoạn mã sau vào cuối:

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

hoặc cách tốt hơn để làm điều này là chỉnh sửa tệp cấu hình PHP của bạn ( php.ini) và thay đổi dòng sau:

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

Nếu bạn không chắc chắn bạn đang ở đâu php.ini, hãy kiểm tra:

  • drush status chỉ huy
  • hoặc bằng cách đi tại /admin/reports/status/php.

Để điều tra thêm về những trang / thành phần nào đang sử dụng nhiều bộ nhớ nhất, bạn có các khả năng sau:

Để biết thêm thông tin, kiểm tra:


1
+1 để nhấn mạnh rằng php UI và CLI có thể khác nhau memory_limit. Tôi đã gặp sự cố được báo cáo chỉ với drushchính xác vì tôi có lỗi /etc/php/7.0/cli/php.ininhưng không xảy ra /etc/php/7.0/cli/php.ini, vì vậy UI drupal đã hoạt động tốt. Cảm ơn!
miro marchi

1

Bạn có thể sử dụng một mô-đun để kiểm soát giới hạn bộ nhớ này. Mô-đun Trình cấu hình Thời gian chạy PHP cung cấp nhiều tùy chọn để định cấu hình mà không thay đổi tệp php.ini và khởi động lại Apache.

Bạn có thể cấu hình các tham số sau:

  • Giới hạn tải lên tệp
  • Giới hạn bộ nhớ
  • Giới hạn thời gian thực hiện tối đa
  • Giới hạn biến đầu vào tối đa

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.