2010-11-06 92 views
0

我有兩個PHP文件,它們運行很長時間(沒有執行限制)。其中一個文件用於檢查遠程服務器上的一些數據。爲了使它更有效,我運行了文件#1的幾個實例。第二個文件應該是規範行爲,一旦任何文件#1收到有效的響應。PHP - 將數據從一個進程發送到其他進程

問題 - 如何將數據從一個正在執行的文件傳遞給其他人?第一個想法是通過文件#1和文件#2將數據保存到文件定期檢查文件修改時間。問題是它會給服務器造成很大的負載,如果我通過使用睡眠函數來限制它,那麼我能夠達到的最小睡眠時間是1ms(Linux系統的時間量 - 是否有任何方法可以改變它)?所以 - 也許任何人有任何想法如何將信息從一個過程傳遞給其他人?

$last = filemtime('action.txt'); 
while(!$stop) { 
    if($last != filemtime('action.txt')) { echo microtime(true); $stop = 1; } 
    clearstatcache('action.txt'); 
    usleep(100); 
    $i++; 
} 

任何低於< usleep(1000)的工作原理是相同的 - 它睡覺1ms的只有1000迭代每秒完成的。

問候, 喬納斯

+0

感謝您的評論 - 在我的情況下,似乎流將是最合理和最有效的解決方案,因爲我也能夠在不需要讀取/寫入文件的情況下傳遞數據。 – flyeris 2010-11-06 16:49:50

回答

1

使用PHP的inotify擴展(http://www.php.net/manual/en/intro.inotify.php,擴展URL是http://pecl.php.net/package/inotify)。當文件改變時它會提醒你的進程。否則你可以使用一個簡單的套接字來引發第二個腳本。

1

使用streams創建或連接到套接字,然後在套接字上選擇。

1

很多反饋。

首先,我正確地假設您將這些文件託管在Web服務器中,並通過在Web瀏覽器中「打開」它們來調用它們。我在問這個問題是因爲問題中提到的「不執行限制」。你應該考慮在cli上編寫和運行你的php腳本,除非你的主機架構有一些限制。如果您已經將它們作爲cli腳本運行,請忽略此操作。

秒,正如其他人建議你應該使用tcp/ip套接字API在PHP中連接兩個腳本之間,一個腳本是服務器和第二個客戶端。如果您對此不熟悉,則可能需要一段時間才能正確執行。所以你現在可以忽略這個。

第三,爲什麼最小睡眠時間是1ms是一個問題。這讓我感到困惑,因爲一方面你說你正在睡覺,因爲沒有它,負載就會很高。另一方面,你想睡不到1ms ......理想情況下,你應該睡5秒,10秒或更長時間,這取決於文件更新的頻率以及你需要什麼樣的時間來響應到它。如果你想要近乎立竿見影的響應,你可以嘗試做一下linux尾巴實用程序。這是梨inotify擴展(在我之前提到的其他海報)。如果這是一個非常嚴重的應用程序,並且您需要真正的快速響應時間,則應考慮使用實時操作系統。一個實時操作系統會給你睡眠少於1ms。

第四,如果這兩個腳本要在同一臺服務器上(並且總是在同一臺服務器上),那麼可以考慮其他選項,如共享內存。

+0

1.是的,腳本將在CLI上運行; 2.套接字將是以後使用的方法。謝謝你的提示! 3。好吧 - 如果我沒有睡覺的話,它會每秒進行17000次迭代(檢查),PHP文件消耗高達40%的服務器CPU。如果我使用任何睡眠,它將變爲1ms,並且只有1000次迭代完成。這就是爲什麼我想在這之間做一個短暫的睡眠,將其限制在〜5000次左右。 – flyeris 2010-11-06 16:53:23

+0

4.共享內存?以某種方式來完成PHP? – flyeris 2010-11-06 16:54:00

+0

用php完成共享內存.. http://www.php.net/manual/en/ref.sem.php – 2010-11-06 17:00:58

相關問題