2010-04-20 48 views

回答

3

嘗試文件執行後設置一個「完成」標誌和註冊關斷功能的功能將檢查該標誌是否定義

+0

只是打敗了我 - 我正在重寫我的答案沿這些線 – 2010-04-20 21:00:14

+0

;)這很酷,你的回答更加精確 – shfx 2010-04-20 21:05:02

+0

謝謝!那就是訣竅。 – AdamA 2010-04-21 15:39:57

3

我原來的答案是行不通的,因爲你無法捕捉到致命的錯誤。如果您想要閱讀它,請檢查修訂歷史記錄。

我唯一的猜測是你可以使用register_shutdown_function。在腳本的開始處設置一個變量,並在腳本成功完成時將其清除。編寫檢查該變量,並作用於它,如果它仍然設置的功能,然後應用使用register_shutdown_function

http://php.net/manual/en/function.register-shutdown-function.php

9

在閱讀前兩個答案後,我必須自己測試register_shutdown_function() - 我不認爲它會運行。畢竟,一旦沒有更多內存或執行時間已過,用戶函數如何運行?我很驚訝地發現關機功能運行,即使在OOM的情況下,或執行時間已經過時。概念證明:

要測試內存限制:

<?php 
function asdf() { echo "omg\n"; } 
register_shutdown_function('asdf'); 

ini_set('memory_limit', '1000'); 

$x = ''; 
while(true) { 
$x .= 'lkajsdlfkjasldkfjlaskdfjasldkfj'; 
} 

輸出:

PHP Fatal error: Allowed memory size of 262144 bytes exhausted (tried to allocate 169540 bytes) in /home/scratch.php on line 9 
PHP Stack trace: 
PHP 1. {main}() /home/scratch.php:0 

Fatal error: Allowed memory size of 262144 bytes exhausted (tried to allocate 169540 bytes) in /home/scratch.php on line 9 

Call Stack: 
    0.0002  81360 1. {main}() /home/scratch.php:0 

omg 

要測試的執行時間:

cat scratch.php 
<?php 
function asdf() { echo "omg\n"; } 
register_shutdown_function('asdf'); 

set_time_limit(1); 

while(true) {} 

輸出:

PHP Fatal error: Maximum execution time of 1 second exceeded in /home/scratch.php on line 7 
PHP Stack trace: 
PHP 1. {main}() /home/scratch.php:0 

Fatal error: Maximum execution time of 1 second exceeded in /home/scratch.php on line 7 

Call Stack: 
    0.0002  80200 1. {main}() /home/scratch.php:0 

omg 

請注意,要讓您的消息在之前顯示PHP的錯誤輸出,您必須完全禁用PHP的錯誤輸出。無論如何,這是生產場所的最佳實踐。

+0

達到最大執行時間!=允許的內存耗盡 很難讓循環和睡眠函數使腳本達到最大執行時間,睡眠凍結執行時間計數器... – shfx 2010-04-20 21:38:03

+0

我的不好。編輯帖子以測試執行時間限制而不是內存耗盡 – 2010-04-20 22:27:35

0

如果沒有辦法從API級別捕獲錯誤,那麼只要發生致命錯誤,PHP引擎就應該能夠在硬盤上轉儲內存,就像Windows在看到「藍屏」時所做的一樣。