2016-12-20 76 views
3

我是PHP新手,並試圖瞭解如何調試代碼。我正在使用ini_setini_get函數。PHP致命錯誤未顯示在瀏覽器屏幕上

這裏是我的代碼:

<?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

是PHP運行什麼模式? apache/mod_php或fpm? – mkaatman

+0

它在Apache模式下運行 服務器API:\t Apache 2.0處理程序 –

回答

1

對於PHP來說,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 
} 

命令行使用效果:$>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)); 

(!) Fatal error: Allowed memory size of 262144 bytes exhausted (tried to allocate 32 bytes) in ...


Linux環境中的PHP 5.6 64 NTS + PHP-FPM +阿帕奇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)); 

(!) Fatal error: Allowed memory size of 524288 bytes exhausted (tried to allocate 32 bytes) in ...

+0

不能!仍然得到死亡的屏幕:( –

+0

@PritamBohra更新的答案與Linux環境配置,以及完整的腳本。然而'memory_limit'太低是在這兩種情況下的問題,所以不斷增加它,直到它顯示 – fyrye

+0

它的工作當增加到2048K時,我不太明白原因。你能否詳細解釋爲什麼? –