2009-11-24 107 views
0

我注意到很多時候一些php腳本退出。在我看來,這將強制退出httpd/apache子進程(當然,如果下一個請求需要,另一個進程將會啓動)。調用'exit'的php腳本的性能影響是什麼?

但是,在CMS中,下一個請求將需要整個init.php初始化,當然只是清理並首先啓動php。

看來,PHP文件通常以

if (!defined('SMARTY_DIR')) { 
include_once('init.php'); 
} 

這表明有人在想象一個PHP的過程將成爲多個請求啓動。但是如果每個腳本都退出,那麼每個php/apache進程只會處理一個請求。

有關刪除許多退出調用(特別是從諸如index.php等最常用腳本的腳本)的性能和安全含義的任何想法,以允許一個進程提供多個請求?

謝謝,彼得

--ADDENDUM -

謝謝你的答案。這(PHP永遠不會超過一個請求)是我最初想到的,直到上週,當我調試一個只能在一個腳本中設置的配置變量(因爲路徑設置的方式),但仍然是設置在另一個腳本(這是一個約20點/秒的網絡服務器)。在那種情況下,我沒有在一個腳本中有一個php退出調用,它的設置稍有不同。但是,當我將PHP退出調用添加到該腳本(在備用目錄中)時,這解決了我在主目錄中的所有主腳本中遇到的配置錯誤(這是由於有一個css目錄變量設置錯誤,頁面執行)。所以現在我又困惑了,因爲到目前爲止所有的答案都說,php應該永遠不會超過一個請求。

回答

8

exit對Apache進程沒有幫助(它肯定不會殺死一個worker!)。它只是結束PHP腳本的執行並將執行返回到 Apache進程,它將結果發送到瀏覽器並繼續進行下一個請求。

您摘錄的Smarty代碼與服務多個請求的PHP進程沒有任何關係。它只是確保Smarty在任何時候都被初始化 - 如果一個PHP腳本可能被另外包含在另一個腳本中或被直接訪問,那麼它很有用。

1

即使您不調用exit,您的PHP腳本仍然會結束執行,此時任何生成的HTML都會返回到Web服務器以發送到您的瀏覽器。

exit關鍵字允許您發信號通知PHP引擎您的工作已完成,無需進一步處理。

還要注意,退出通常用於錯誤處理和流量控制 - 從包含中刪除它可能會破壞您的應用程序。

2

我認爲你的困惑來自include_once。 PHP基本上是一個「無共享」系統,沒有真正的持久服務器對象。 include_once並不意味着每個Apache孩子一次,而是每個Web請求一次。

如果您包含兩次相同的文件,PHP可能會破解毛球。例如,具有特定名稱的函數只能定義一次。這導致人們爲每個包含的文件執行一次舊的C#ifndef-#define-#include idiom。 include_once是解決這個問題的方法。