我是PHP新手并试图了解如何调试代码。我使用的是ini_set
和ini_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。
答案 0 :(得分:1)
1K太低,PHP无法在浏览器中呈现错误。
<强> [更新] 强>
PHP需要有足够的可用内存才能触发在浏览器中显示错误消息的错误处理程序。所以在这种情况下,当php试图将消息输出到浏览器并且刚刚停止时,它没有足够的内存。
所需的内存量取决于加载的扩展,服务器环境和其他php.ini设置。
例如,当分配1 MB时触发内存不足错误时,需要1.5 MB才能在浏览器中显示错误消息。请参阅:Tracking Memory Usage in PHP
<?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
}
命令行使用结果:$>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个字节)...