2014-01-30 41 views
13

是否有辦法立即停止PHP代碼執行?如何停止PHP代碼執行?

我知道exit但它明確規定:

終止腳本的執行。即使退出被調用,關閉函數和對象析構函數也會一直執行。

所以我想實現的是停止PHP代碼執行正是當我打電話退出或什麼的。

任何幫助?

編輯:簡森的答案

試驗1後:

function newExit() { 
    __halt_compiler(); 
}  
echo "start"; 
newExit();  
echo "you should not see this"; 

顯示Fatal error: __HALT_COMPILER() can only be used from the outermost scope in這是相當期待。

試驗2:

function newExit() { 
    include 'e.php'; 
} 
echo "start"; 
newExit(); 
echo "you should not see this"; 

e.php只包含__halt_compiler();

這說明startyou不應該看到這個

編輯:我爲什麼要這麼做?

我正在研究一個包含專有庫(通過虛擬主機配置文件無法訪問)的應用程序,該應用程序以加密代碼形式提供。是一種用於安全目的的監視庫。其中它的行爲是它註冊了登錄的實例狀態(它保存的統計信息數據庫)

我想要做的是禁用這個記錄基於某些特定條件的一些關機功能(遠程IP)

+0

模具();可能會有幫助 –

+0

@ArthurYakovlev退出和死亡之間的行爲幾乎沒有區別 –

+4

>此語言結構等同於exit()。 – skafandri

回答

0

可以使用__halt_compiler功能,將暫停執行編譯

http://www.php.net/manual/en/function.halt-compiler.php

+0

編譯器將不會在'__halt_compiler '但它真的不會調用析構函數和關閉函數嗎?我沒有真正檢查,但我想它會打電話給他們(想不出任何原因)。 –

+0

編譯器在該語句之後是否仍然可以看到類/函數定義? PHP中的編譯時間和運行時間之間存在差異,這可能是一個問題。 – ToBe

+0

還要注意以下錯誤,來自文檔的註釋:'__halt_compiler()只能從最外層的範圍使用。「# – CompuChip

0

你可以嘗試殺死PHP程序:

exec('kill -9 ' . getmypid()); 
+3

高度依賴於執行方法(cgi,fcgi,webserver模塊...)和權限雖然 – ToBe

12

請參閱從用戶佩卡웃

以下信息,根據手冊,即使腳本被使用終止的析構函數執行die()exit()

析構函數會被調用即使腳本執行使用 exit()停止。在析構函數中調用exit()將阻止其餘的關閉例程執行。
根據此 PHP: destructor vs register_shutdown_function,析構函數確實 而不是在達到PHP的執行時間限制(在Apache 2上確認,PHP 7在Windows 7上確認)時執行。

析構函數也是而不是當腳本因爲達到內存限制而終止時得到執行。 (剛剛測試)

確實得到致命錯誤執行的析構函數(只是測試)更新:OP無法證實這一點 - 似乎有致命錯誤那裏的東西是不同的

它確實在解析錯誤時被執行(因爲整個腳本不會被解釋)

如果服務器進程崩潰或者PHP控件出現其他異常,那麼析構函數肯定不會執行。

引用在這個問題 Are there any instances when the destructor in PHP is NOT called?

0

我不知道你明白什麼是「退出」規定

Terminates execution of the script. Shutdown functions and object destructors will always be executed even if exit is called. 

這是正常做到這一點,就必須清除它的memmory所有的變量和之前調用的函數。不這樣做會意味着你的內存將在你的內存中保持卡住狀態,如果這種情況發生好幾次,你需要重新啓動並刷新你的內存纔能有剩餘的內存。

0

,或者嘗試

trigger_error('Die', E_ERROR); 
+0

應該等同於exit()或die(),但也取決於使用的錯誤處理程序。 – ToBe

1
從明顯 die()exit()

除此之外,這也適用:

<?php 
echo "start"; 
__halt_compiler(); 
echo "you should not see this"; 
?>