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

时间:2016-11-03 12:02:04

标签: php node.js sockets

我需要将一些数据从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做到这一点吗?

1 个答案:

答案 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;
}