我需要将一些数据从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做到这一点吗?
答案 0 :(得分: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;
}