【问题标题】:PHP Fatal Error not getting displayed on browser screenPHP致命错误未显示在浏览器屏幕上
【发布时间】:2017-05-06 01:56:52
【问题描述】:

我是 PHP 新手,正在尝试了解如何调试代码。我正在使用ini_setini_get 函数。

这是我的代码:

<?php
 error_reporting(E_ALL);

 ini_set('display_errors', 1);
 ini_set('log_errors', 1);
 ini_set('log_errors_max_len', 0); // 0 = unlimited length
 ini_set('error_log', '/var/www/html/debugging/php_errors.log');

 echo $error->abc; // should give error


 // E_ERROR - run out of memory
 ini_set('memory_limit', '1K');
 var_dump((object) range(0, 100000));
 require 'abc.php';

?>

所有错误都会记录到 php_errors.log 文件中,也会显示在浏览器上。但是当我使用var_dump((object) range(0, 100000)); 引入致命错误以耗尽内存时,我在浏览器上看到一个空白屏幕,而错误被记录到 php_errors.log

我是否需要更改任何其他设置才能在浏览器上显示错误并登录文件。我只是想在这里玩 PHP。

【问题讨论】:

  • PHP运行在什么模式下? apache/mod_php 还是 fpm?
  • 它运行在 Apache 模式 Server API: Apache 2.0 Handler

标签: php


【解决方案1】:

1K 太低,PHP 无法在浏览器中呈现错误。

[更新]

PHP 需要有足够的可用内存才能触发在浏览器中显示错误消息的错误处理程序。所以在这种情况下,php在尝试将消息输出到浏览器时没有足够的内存而只是停止了。

所需的内存量取决于加载的扩展、服务器环境和其他 php.ini 设置。

例如,如果在分配 1 MB 时触发内存不足错误,则需要 1.5 MB 才能在浏览器中显示错误消息。见:Tracking Memory Usage in PHP

演示:http://ideone.com/VmPO0w

<?php
// error.php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$x = str_repeat(' ', 1024 * 1024); //store 1 MB to a string
ini_set('memory_limit', '1535K'); //minimum of 1536K (1.5 MB) needed to display error
while (true) {
    echo 'not real: ' . (memory_get_peak_usage(false) / 1024 / 1024) . " MB\n";
    echo 'real: ' . (memory_get_peak_usage(true) / 1024 / 1024) . " MB\n\n";
    $x .= str_repeat(' ', 1024 * 500); //store 500K more to string
}

命令行使用结果:$&gt;php error.php

not real: 1.2208786010742 MB
real: 1.5 MB


Fatal error: Allowed memory size of 1571840 bytes exhausted (tried to allocate 512001 bytes) in error.php on line 10

当在浏览器中加载时,结果将是一个空白页面。


Windows 环境 php 5.6 x64 NTS + 内置网络服务器。至少使用256K

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
echo $error->abc; // should give error
// E_ERROR - run out of memory
ini_set('memory_limit', '256K'); //tested with 255K - blank page
var_dump((object) range(0, 100000));

( ! ) 致命错误:允许的 262144 字节内存大小已用尽 (试图分配 32 个字节)在 ...


Linux 环境 php 5.6 x64 NTS + php-fpm + Apache FCGI。至少使用512K

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
echo $error->abc; // should give error
// E_ERROR - run out of memory
ini_set('memory_limit', '512K'); //test with 511K - blank page
var_dump((object) range(0, 100000));

( ! ) 致命错误:允许的 524288 字节内存大小已用尽 (试图分配 32 个字节)在 ...

【讨论】:

  • 不!仍然得到死亡的白屏:(
  • @PritamBohra 更新了 Linux 环境配置的答案以及完整的脚本。然而,无论哪种情况,memory_limit 太低都是问题所在。所以继续增加它直到它显示出来。
  • 它在增加到 2048K 时起作用。我真的不明白其中的原因。能详细解释一下原因吗?
猜你喜欢
  • 2020-10-11
  • 2013-01-02
  • 1970-01-01
  • 2019-08-08
  • 2014-01-22
  • 2015-02-17
  • 2011-06-30
  • 2016-12-24
  • 1970-01-01
相关资源
最近更新 更多