【发布时间】:2014-03-31 17:00:05
【问题描述】:
我有两个通过本地 UNIX 套接字进行通信的 PHP 脚本。一个脚本上的代码如下所示:
socket_write($client, "SomeData\n");
socket_write($client, "OtherData\n");
//wait for input, or do some 'lengthy' calculations
socket_write($client, "LastData\n");
而客户端的代码很简单
@socket_select($read,$write,$except,null);
foreach ($read as $socket) {
echo "Received from socket: ".socket_recv($socket, $buffer, $maxBuffer, 0)."\n";
}
我的问题是对 socket_write() 的两次连续调用似乎被缓冲了,因此输出看起来像这样:
Received from socket: SomeData
OtherData
Received from socket: LastData
显然上面这没什么大不了的,但实际上,我正在传递 JSON 对象,它们是这样碰撞的:
{"response":"loginOK", "token":"123456"}{"response":"data","x":12, "y":34}
这会导致客户端出现解析错误。我不能保证某些函数会一个接一个地被调用,或者在两者之间有延迟,所以我无法可靠地将结果整理到一个 JSON 对象中。有没有办法让每个 socket_write() 调用在客户端产生一个接收事件?
【问题讨论】:
-
你试过指定socket_write传递的数据长度吗?
socket_write(resource $socket,string $buffer [,int $length=0]) -
@JBES 不,没有调用
socket_write($socket, $buffer, str_len($buffer))的 bean。最后,客户端由 WebSockets 客户端控制,所以我已经“修复”了大约 100 毫秒延迟的问题,但我显然更喜欢不那么丑陋的东西。 -
您需要一些东西来刷新套接字,而 socket_ 函数没有这种能力。请参阅stackoverflow.com/questions/2917584/… - 虽然解决方案意味着更改为 fsock - php.net/manual/en/function.fsockopen.php