2012-11-06 137 views
4

好了,所以我一直在令人頭大我這個大腦過去三小時,現在已經和谷歌上搜索像瘋了似的,沒有解決的問題。所以,我寫了一個示例腳本來重現這一點,因爲我的原始腳本大約有800行。PHP腳本執行兩次時長超過60秒

<?php 
    set_time_limit(0); 
    ini_set('max_input_time', '-1'); 
    ini_set('max_execution_time', '0'); 

    error_log("executing script... "); 
    $time = time(); 
    for ($t = 0; $t <= 15; $t++) { 
     error_log("Logging: $t (".(time()-$time)." seconds)"); 
     sleep(5); 
    } 
    error_log("execution done (".(time()-$time)." seconds)"); 
?> 

現在,睡眠函數只是用來重新創建頁面的執行時間,並沒有在原始代碼中使用。這將產生以下結果會在error_log文件

[Tue Nov 06 16:24:14 2012] executing script... 
[Tue Nov 06 16:24:14 2012] Logging: 0 (0 seconds) 
[Tue Nov 06 16:24:19 2012] Logging: 1 (5 seconds) 
[Tue Nov 06 16:24:24 2012] Logging: 2 (10 seconds) 
[Tue Nov 06 16:24:29 2012] Logging: 3 (15 seconds) 
[Tue Nov 06 16:24:34 2012] Logging: 4 (20 seconds) 
[Tue Nov 06 16:24:39 2012] Logging: 5 (25 seconds) 
[Tue Nov 06 16:24:44 2012] Logging: 6 (30 seconds) 
[Tue Nov 06 16:24:49 2012] Logging: 7 (35 seconds) 
[Tue Nov 06 16:24:54 2012] Logging: 8 (40 seconds) 
[Tue Nov 06 16:24:59 2012] Logging: 9 (45 seconds) 
[Tue Nov 06 16:25:04 2012] Logging: 10 (50 seconds) 
[Tue Nov 06 16:25:09 2012] Logging: 11 (55 seconds) 
[Tue Nov 06 16:25:14 2012] executing script... 
[Tue Nov 06 16:25:14 2012] Logging: 0 (0 seconds) 
[Tue Nov 06 16:25:14 2012] Logging: 12 (60 seconds) 
[Tue Nov 06 16:25:19 2012] Logging: 1 (5 seconds) 
[Tue Nov 06 16:25:19 2012] Logging: 13 (65 seconds) 
[Tue Nov 06 16:25:24 2012] Logging: 2 (10 seconds) 
[Tue Nov 06 16:25:24 2012] Logging: 14 (70 seconds) 
[Tue Nov 06 16:25:29 2012] Logging: 3 (15 seconds) 
[Tue Nov 06 16:25:29 2012] Logging: 15 (75 seconds) 
[Tue Nov 06 16:25:34 2012] Logging: 4 (20 seconds) 
[Tue Nov 06 16:25:34 2012] execution done (80 seconds) 
[Tue Nov 06 16:25:39 2012] Logging: 5 (25 seconds) 
[Tue Nov 06 16:25:44 2012] Logging: 6 (30 seconds) 
[Tue Nov 06 16:25:49 2012] Logging: 7 (35 seconds) 
[Tue Nov 06 16:25:54 2012] Logging: 8 (40 seconds) 
[Tue Nov 06 16:25:59 2012] Logging: 9 (45 seconds) 
[Tue Nov 06 16:26:04 2012] Logging: 10 (50 seconds) 
[Tue Nov 06 16:26:09 2012] Logging: 11 (55 seconds) 
[Tue Nov 06 16:26:14 2012] Logging: 12 (60 seconds) 
[Tue Nov 06 16:26:19 2012] Logging: 13 (65 seconds) 
[Tue Nov 06 16:26:24 2012] Logging: 14 (70 seconds) 
[Tue Nov 06 16:26:29 2012] Logging: 15 (75 seconds) 
[Tue Nov 06 16:26:34 2012] execution done (80 seconds) 

繼承人一些來自的phpinfo是相關

=== apache2handler === 
Max Requests: Per Child: 1000 - Keep Alive: on - Max Per Connection: 200 
Timeouts: Connection: 300 - Keep-Alive: 2 

=== PHP Version 5.4.5 Core Settings === 
max_execution_time  Local: 0  Master: 30 
max_input_time   Local: -1 Master: -1 

我已經試過所有我能想到的設置。它似乎是一個服務器設置與Apache或PHP,因爲當我在我的本地主機上運行這個相同的腳本,它成功執行,應該沒有雙重負載。並在它被問到之前,是的,每次我做一個INI更改或apache配置更改我一直在重新啓動apache。

也,這裏是對於上面的例子中的訪問日誌條目。

*.*.*.* - - [06/Nov/2012:16:43:56 -0700] "GET /test.php HTTP/1.1" 200 20 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0" *.*.*.* *********.com 80 55050278 1012 321 *.*.*.* 
*.*.*.* - - [06/Nov/2012:16:44:56 -0700] "GET /test.php HTTP/1.1" 200 20 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0" *.*.*.* *********.com 80 60054985 1012 321 *.*.*.* 

肯定也有一些是這樣做一次60秒的執行時間已經達到,因爲當我改變的執行時間說55秒,它運行一次只是因爲它應該。

[Tue Nov 06 16:46:00 2012] executing script... 
[Tue Nov 06 16:46:00 2012] Logging: 0 (0 seconds) 
[Tue Nov 06 16:46:05 2012] Logging: 1 (5 seconds) 
[Tue Nov 06 16:46:10 2012] Logging: 2 (10 seconds) 
[Tue Nov 06 16:46:15 2012] Logging: 3 (15 seconds) 
[Tue Nov 06 16:46:20 2012] Logging: 4 (20 seconds) 
[Tue Nov 06 16:46:25 2012] Logging: 5 (25 seconds) 
[Tue Nov 06 16:46:30 2012] Logging: 6 (30 seconds) 
[Tue Nov 06 16:46:35 2012] Logging: 7 (35 seconds) 
[Tue Nov 06 16:46:40 2012] Logging: 8 (40 seconds) 
[Tue Nov 06 16:46:45 2012] Logging: 9 (45 seconds) 
[Tue Nov 06 16:46:50 2012] Logging: 10 (50 seconds) 
[Tue Nov 06 16:46:55 2012] execution done (55 seconds) 

任何幫助,將非常感謝!

+1

我不認爲它一樣有參與它的延伸,但http://serverfault.com/questions/409100/php-script-times-out-after-60-seconds-on-apache是非常相似,可能值得一看。 – Caltor

+0

我也看到了這種情況 - 我仍然抱着解決方案的希望。 – John

回答

3

只是要排除它,你有沒有嘗試過在另一個瀏覽器中測試?我只提到它,因爲我對這個最近偶然:

https://support.mozilla.org/en-US/questions/922783

+0

有趣......它在chrome中不會重複60秒後的調用,但chrome在執行60秒後不會收到頁面響應。這仍然不能解釋爲什麼當執行超過60秒時,同一腳本在我的localhost apache服務器上工作,除非它與瀏覽器發出外部請求有關,而不是內部。嗯 – Sheac

4

莫非一些諸如缺少圖標會導致你的腳本被調用兩次。請參閱http://www.webdeveloper.com/forum/showthread.php?245809-Script-Running-Twice。它也可以.happen如果你有非www重定向到www或反之亦然。見PHP executes twice on page load when redirecting from non-www to www

+0

不存在一個圖標,否則我會在訪問日誌中看到它失敗。 – Sheac

+0

將phpinfo()放在頂部的3個設置後面,看看它們是否正在生效。 – Caltor

+0

你應該添加一個favico。我沒有,我的網頁被加載兩次。只要我添加一個,它就可以正常工作! –

0

作爲一種變通方法,或許您可以將執行分成兩頁;當你完成第一個時,只需加載第二個。這也可以解決某些資源限制,例如PHP配置中的RAM預算較低。

相關問題