在再次写入之前等待socket_write完成

我需要从PHP服务器发送一些数据到节点服务器。

以下是我目前在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中做到这一点?

看过很多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; }