2016-11-03 89 views
1

我需要將一些數據從PHP服務器發送到節點服務器。在再次寫入之前等待socket_write完成

這裏是我迄今爲止在PHP端的簡化版本:

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
$result = socket_connect($socket, '127.0.0.1', '3000'); 
socket_write($socket, "Hello World", 11); 
socket_close($socket); 

運行這段代碼成功地將消息發送到我的節點服務器並輸出。

但是我需要發送多個消息回到套接字。我實際上需要發送數千個響應。但如果我打電話給socket_write()功能的循環中,像這樣:

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
$result = socket_connect($socket, '127.0.0.1', '3000'); 
for($i=0;$i<1000;$i++){ 
    socket_write($socket, "Hello World", 11); 
} 
socket_close($socket); 

似乎一起追加的所有數據,並一次性在腳本結束髮送。我需要實時發回數據。有什麼辦法可以在PHP中做到這一點?

+0

你的套接字發送成功的答案在哪裏?如何確保資源可用?發送,取得成功的消息,再次發送。如果你不需要回答爲什麼使用套接字?作爲靜態文件。 – dsgdfg

+0

@dsgdfg我不需要收到節點服務器收到數據的確認信息。如果與套接字的連接失敗,我會拋出異常 –

+0

@dsgdfg您認爲我應該讓Node服務器返回成功響應嗎?也許這將是我唯一的方式告訴PHP,去循環的下一次迭代是很酷 –

回答

1

在瀏覽了很多PHP套接字庫後,我發現幾乎所有的套接字在發送套接字後都實現了usleep(1000000)。我不確定這是否是最好的方法,但也許這是由於PHP的限制而導致的唯一方法。

最後,我決定存儲數據最後寫入套接字的時間。然後,計算從那以後經過的時間,並從1000000微秒中減去該時間。這樣,腳本不會等待超過必要的時間。

public function send(array $payload){ 
    $json = json_encode($payload); 
    $write = socket_write($this->socket, $json, strlen($json); 
    $sleep_time = 1000000 - (microtime(true) - $this->last_sent); 
    if($sleep_time > 0) usleep($sleep_time); 
    $this->last_sent = microtime(true); 
    return $write !== false ? true : false; 
} 
+0

我也遇到了'socket_write'似乎已經將多個JSON對象附加在一起的問題。你有沒有搞清楚爲什麼會發生這種情況?正在實施'usleep(1000000)'解決方案一切正常。 –

+0

@ Stephan-v我的模糊猜測是,當套接字被髮送時,如果仍然有人被髮送,它們最終會混雜在一起。我實際上寫了一個使用上述解決方案的小類:https://github.com/danjohnson95/PHP-Socket-Emitter –

+0

好東西,謝謝。它會幫助我完成我的項目。我仍然想知道究竟是什麼原因造成的:) –