2010-10-29 148 views
0

我試圖做一個排序PHP BOT的。這個想法是必須要php文件,名爲a.php和b.php。 a.php做一些事情,然後睡30秒,調用b.php,b.php結束Http請求,做一些處理,然後調用一個結束Http請求的.php,等等。現在結束捲曲請求

唯一的問題是如何結束的Http傳請求,使用捲曲發。我用盡下面這段代碼:

<?php 
ob_end_clean(); 
header("Connection: close"); 
ignore_user_abort(); // optional 
ob_start(); 
echo ('Text the user will see'); 
$size = ob_get_length(); 
header("Content-Length: $size"); 
ob_end_flush();  // Will not work 
flush();   // Unless both are called ! 

// At this point, the browser has closed connection to the web server 

// Do processing here 
echo('Text user will never see'); 

輕微的問題是,它不工作,我居然看到「文本的用戶將永遠不會看到」。我試過cron作業等,但主機不允許它。我無法發送腳本超時限制。所以我唯一的選擇是創建重複的PHP腳本。那麼我將如何發送Http請求?根據你的問題的新認識

+1

我看不出捲曲參與。此外,如果您的主機發現您正在使兩個PHP腳本在循環中互相呼叫,您的主機將非常不高興。 – kijin 2010-10-29 22:03:18

+0

我不知道爲什麼連接應該在此時關閉,瀏覽器已關閉連接到Web服務器。現在我重讀了你的問題,爲什麼你不試圖關閉連接把數據放在一個數據庫中,並有一個單獨的線程(腳本)執行作業。 asp.net是我更好的。它不好使用php – 2010-10-29 22:14:43

+0

cURL用於在腳本之間發送請求。我不允許在服務器上執行腳本*嘆息* – LostInTheCode 2010-10-29 22:25:33

回答

1

。您正在創建一個系統,每隔30秒檢查一次遠程URL以監控內容片段。爲此,我推薦一個CRON,它可以是基於服務器的:http://en.wikipedia.org/wiki/Cron或基於Web的,如果您的主機不允許它:http://www.webbasedcron.com/(示例)。在這種情況下

+0

退出關閉腳本。我想要做的是結束兩個腳本之間的連接,因此一個腳本不必等待另一個腳本完成,否則我將創建一個無限循環。我沒有試圖關閉腳本,只是結束它的輸出,並讓瀏覽器知道在腳本繼續處理時關閉它的連接。我無法使用無限的while循環/ goto循環,php腳本有30秒的超時限制,由我的主機設置。 – LostInTheCode 2010-10-29 22:27:11

+0

我使用Google App Engine遇到了類似的問題,它只有30秒的窗口。現在從腳本轉換到腳本可能會計入相同的請求中。你有沒有想過使用:http://en.wikipedia.org/wiki/Meta_refresh在腳本之間導航。 – 2010-10-29 22:40:14

+0

那麼,這需要某種客戶端來運行它,每隔一段時間重新加載頁面。我正在嘗試創建一個自動系統,以便每30秒自動記錄一次網站上的號碼,只能從我的服務器上記錄。 – LostInTheCode 2010-10-29 22:44:29

0

PHP腳本的上下文中運行,如果Web服務器的請求,因此你不能停止談論到網絡連接,然後繼續做的東西,這是我認爲你正在試圖做的連接關閉。

您在最後看到輸出的原因是因爲在腳本的末尾PHP將調用隱式刷新(請參閱手冊中的ob_implicit_flush),但通過結束PHP腳本來關閉與瀏覽器的連接。

方式解決此問題:

你也許能夠使用的set_time_limit延長執行限制。不要使用零。人們很容易說「把你需要的所有時間」在後處理腳本,但出路在於瘋狂和痛苦的系統管理員,加上記得你還在上捲曲的超時秒錶運行(儘管你可以擴展爲一個選項)。 set_time_limit(5)會再給你五秒鐘的時間,所以定期做這些事情可以讓你做後期處理,但是如果你小心的話,仍然可以保護你免受無限循環的影響。在Apache請求的上下文中沒有執行限制的infinate循環也可能使你不受系統管理員歡迎。

在應用程序中構建一個shell腳本,將其保存到磁盤,在後臺執行,然後在後臺刪除它自己。這樣它將在Web請求上下文之外運行,並且如果在下一次執行請求時該腳本仍然存在,則可以知道其他處理仍在進行。要小心處理可能需要比處決之間的差距更長的事情,因爲這樣會導致悲傷和更苦的系統管理員。如果你這樣做了,那麼這個過程就會讓你擺脫我的託管環境,儘管它沒有先與我談論它,因爲這是一個帶有無數可能的安全問題的可怕黑客攻擊。

但是你似乎試圖在一個他們不想讓你這麼做的系統上運行常規的批處理過程 - 或者他們會讓你訪問cron--所以你最好也是最可靠的方法是找到一個真正支持你想要做的事情的主機。

+0

偉大的一套想法。我一定會考慮所有這些。 – LostInTheCode 2010-10-30 14:43:46