2011-07-29 40 views
1

我有一個PHP腳本,需要大約30秒才能完成。當它通過php cli運行時,它會成功完成(迴應一個確認並將相關結果保存在本地文件系統的文件中)。如果我通過Apache運行相同的文件,它似乎超時約30秒左右,而不是預期的確認消息,Firefox提供我下載一個空文件(其他瀏覽器對待它的方式不同,但基本上,沒有按計劃進行)。應該在文件系統上創建的文件不會被創建。PHP腳本在Apache中超時但不在cli中

由於知道執行時間可能很長,我在腳本的開頭設置了set_time_limit(400)

關於如何調試的提示?什麼可能導致腳本在Apache中超時,但不在cli中?

+0

您的主機允許set_time_limit? – Awea

+0

當您從命令行運行腳本時,永遠不會執行PHP執行的限制。這是從命令行運行的PHP和作爲(f)cgi或apache模塊運行的PHP之間的(次要)差異之一。請參閱:http://php.net/manual/en/features.commandline.php – Carpetsmoker

+0

您的服務器是否有權寫入您保存文件的特定位置。 – Ibrahim

回答

0

通過Apache的PHP CLI和PHP使用不同的php.ini文件。檢查Apache版本的php.ini文件並確認max_execution_time足夠高以滿足您的需求。

您可以執行phpinfo()以獲取當前使用的php.ini文件的位置。

+0

好像系統上只有一個php.ini。 – SaltyNuts

+0

@SaltyNuts:請看我更新的答案。如果您找到了正確的php.ini文件,請編輯其'set_time_limit'指令並重新啓動Web服務器以查看執行時間限制是否增加。 –

+0

與您的指示,我已確認在php.ini中將max_execution_time設置爲2000。我假設你的意思是max_execution_time而不是set_time_limit,因爲set_time_limit是一個函數,而不是php.ini指令。 – SaltyNuts

0

附加到php的時間限制cgi可以超時。 如果你使用mod_fcgid和你的apache,你還需要增加那裏的時間。

看看到manual

我認爲你需要增加FcgidIOTimeout 40

+0

它似乎沒有使用mod_fcgid - 無法在文件系統的任何位置找到它,並且在任何apache配置文件中都沒有提及FcgidIOTimeout。 – SaltyNuts

+0

也許你正在使用mod_php。你可以在phpinfo()中看到你的網關。 Server API:CGI/FastCGI和$ _SERVER [「SERVER_SOFTWARE」]顯示(參見結束)Apache/2.2.14(Win32)mod_ssl/2.2.14 OpenSSL/0.9.8k mod_fcgid/2.3.6 –

+0

也未檢測到mod_php。運行它在linux下的centos,順便說一句。 – SaltyNuts

1

這裏閱讀所有的答案和評論後,我相信,你的腳本不會超時。

我認爲它是你應用程序的崩潰。 Apache進程在限制用戶中運行,您的cli沒有。

也許你正在寫一個文件到一個文件夾,你沒有訪問權限(在apache用戶下)。

我也有可能缺少php模塊。 比較你的cli php.ini到apache php.ini。

打開錯誤日誌:

error_log = /tmp/php_error.log 
log_errors = 1 

也許你是在測試環境中您也可以啓用display_errors。 但在生產使用中始終關閉!

查看log爲什麼php中止。

您可以使用su命令從apache帳戶中的cli運行php腳本。 這可以用來檢查權利。

+0

謝謝,會嘗試這個,看看我能得到什麼。 – SaltyNuts