2015-11-27 110 views
0

不幸的是,在php-fpm/nginx配置上調用php exit()不會立即停止腳本,而文件句柄可能沒有關閉。如何停止在php-fpm/nginx上執行php腳本?

有些開發者建議調用fastcgi_finish_request(),但這也不會停止腳本。

其他建議包裝所有的代碼在catch塊:

<?php 
    class SystemExit extends Exception {} 
    try { 
     /* PUT ALL THE CODE HERE */ 
    } catch (SystemExit $e) { /* do nothing */ } 
?> 

和投擲在需要的代碼停止異常:

if (SOME_EXIT_CONDITION) 
    throw new SystemExit(); // instead of exit() 

這意味着編輯所有的PHP文件包含的try/catch對我來說似乎很乏味。

有沒有其他的清潔解決方案?

+1

'exit'適合我。你的情況究竟發生了什麼? – ksimka

+0

嘗試以下代碼:'echo「您必須等待10秒才能看到此內容。」
「; register_shutdown_function( '關斷');出口; function shutdown(){sleep(10); echo「因爲exit()不立即終止php-fpm調用。」
「; '' –

回答

0

所以我們發現它是一個register_shutdown_function回調,它可以防止腳本立即退出。

PHP關機功能旨在儘可能在任何腳本關閉時調用。但它有一個特點:如果一個關閉回調函數調用exit - 腳本正在退出而不調用任何其他回調函數。

所以如果你真的想在某些情況下跳過關閉功能,你應該註冊一些殺手函數作爲第一次關機回調。在那個殺手功能裏面,你會檢查一種單態的狀態:我們想退出嗎? - 致電exit(),否則 - 退貨。

<?php 

function killer_function() { 
    if ($someGlobalThing->needToExitRightNow()) { 
     exit(); 
    } 
} 

register_shutdown_function('killer_function'); 

// ... 

function exit_now() { 
    $someGlobalThing->exitNow(); 
    exit(); 
} 

$someGlobalThing可以是單身或者一些超級全局變量或全局註冊表或任何你喜歡)

然後調用exit_now()會做的伎倆。