2010-10-07 78 views
0

腳本爆裂輸出長時間運行的腳本

<?php 
include('time.php'); //time script 
echo "First 100 users of SO<br/>"; 
for($i=0; $i<100;$i++){ 
$contents=file_get_contents("https://stackoverflow.com/privileges/user/".$i); 
preg_match('!<div class="summarycount al">(.+?)</div>!', $contents, $matches); 
$rep = $matches[1]; 
echo "<br/>".$i.") ".$rep."<br/>"; 

include('timetaken.php'); //script which outputs time difference 
} 
?> 

輸出

First 100 users of SO 

0) 0 
2.3584280014038 
1) 14,436 
4.469074010849 
2) 875 
10.651238918304 
3) 2,431 
12.991086959839 
4) 8,611 
15.451638936996 
5) 14,988 
17.535580873489 
6) 0 
19.686461925507 
7) 0 
21.796992063522 
8) 218 
23.931365013123 
9) 2,569 
26.419286966324 
10) 101 
28.540382862091 
11) 232 
30.755586862564 
12) 0 
32.960548877716 
13) 33,898 
35.163224935532 
14) 0 
37.280658006668 
15) 6,388 
39.425274848938 
16) 143 
41.541421890259 
17) 14,366 
43.655340909958 
18) 0 
45.771246910095 
19) 99 
47.882269859314 
20) 4,204 
49.993322849274 
21) 0 
52.108762979507 
22) 1,517 
54.221307039261 
23) 411 
56.345490932465 
24) 103 
58.892389059067 
Fatal error: Maximum execution time of 60 seconds exceeded in C:\test.php on line 5 

這個腳本的問題: 1.頁面加載後60秒的時候,它timesout

我知道我可以加一個

set_time_limit(500); 

的代碼,並獲得第100個名譽,但是這將導致在後頁面加載說120秒。

如何在短時間內獲得結果,因爲數據是使用PHP或使用任何其他語言(python,java)或其他任何語言收集的。 之前有人說,我已經閱讀Best way to manage long-running php script?,這可能是一個可能的重複,但沒有回答我的問題。 我的問題是沒有完成全部作業,但因爲它正在做顯示結果。

(請處理標籤對我來說)

回答

1

如果樣品是真的,你在做什麼,怎麼樣採集數據,並將其存儲在本地?這會加速很多事情。您可以定期重新採集數據,但除非數據對時間敏感,否則這可能不是您想要在每個頁面加載時執行的操作。

另外,我會認真考慮將一些邏輯移到客戶端。這裏有兩種方法:

1)有一個PHP進程,它需要一個獲取參數的記錄開始。對這個過程進行ajax調用,每個記錄抓取下一組記錄,並將結果添加到dom中。 (JQuery的一個好辦法做到這一點。)根據您的需求,什麼測試表明,你可以有回調每個獲得啓動下GET請求,或者你可以推出多款可獲得某一時間。 2)完全跳過PHP,並在瀏覽器中用JavaScript做所有事情。畢竟,你只是加載和解析HTML(雖然你可能不得不處理一些跨域問題)。

+0

樣品是一個例子,我一直在尋找作爲腳本被處理,而不是在它的端部來顯示輸出。你究竟是什麼意思我的收穫數據。要以這種方式查詢整個SO用戶列表,我必須設置一個非常大的時間限制,然後將其存儲到本地數據庫。無論如何要在服務器的後臺執行此操作。 – abel 2010-10-08 11:10:08

+0

收穫的簡單版本可能會像這樣。存儲最後收穫的ID的變量。有一個查找該變量的腳本,然後開始導入記錄。對於每個導入的記錄,提取並在本地存儲(大概在一個分貝)你想要的信息。在退出之前(或每次完成一條記錄時),更新存儲的最後收集的id變量。設置腳本只能收穫如此多的記錄,比如5分鐘。有cron定期調用腳本,直到所有記錄收穫。然後偶然地獲得自上次收穫以來創建的任何新記錄。 – 2010-10-08 17:19:56

+0

只是要清楚:在Linux機器上,您使用cron來定期運行預定事件。在IIS上,您使用調度程序(我認爲這就是所謂的)。無論哪種情況,這都是在服務器上運行定期發生的後臺php進程的標準方式。 – 2010-10-08 17:24:32

1

當看着這樣的事情時,我喜歡這樣想:你沒有檢索到一百個用戶,你只需要檢索一個任意用戶一百次。我想看看,打破你看(從有問題的例子踏步而去)成一個簡單函數的數據的檢索,然後調用通過Javascript該功能(JS是否這樣做本身,或者如果你有JS調用一個PHP頁面,返回結果由你決定),然後在頁面上更新結果。

這樣,你不需要設置一個巨大的超時時間,並且你可以更新結果會傳播頁面,而不是試圖在一個大塊中完成。