【发布时间】:2021-07-21 23:43:21
【问题描述】:
我在 laravel 应用程序中使用PHP-WSS,需要保持 websocket 客户端打开以接收来自 websocket 服务器的各种消息。
到目前为止,我构建了一个可以执行并等待消息到达的 CLI php 脚本。
我构建了以下函数来测试...
问题是,要为可能从服务器发送的任何消息保持连接打开,使用 while(true) 循环执行以下操作是否是一种好方法?无论如何我可以做得更好吗? (对我来说它看起来很脏,希望改进它并正确地做)
function testWebsocketClient() {
$url = 'wss://example.com/?token=xyz123456';
$client = new WebSocketClient($url, new ClientConfig());
while(true){
sleep(5);
$client->send('test');
$return = $client->receive(); // test received OK
}
return $return;
}
更新:任何使用 PHP-WSS 的人我都在 BroadCast 方法中的 Connection.php 中发现了一个错误。
原始函数尝试在死连接上发送,显示以下错误 空读;连接死了? (注意 EOF = true)
public function broadCast(string $data): void
{
foreach ($this->clients as $client) {
if (is_resource($client) ) { // check if not yet closed/broken etc
fwrite($client, $this->encode($data));
} else {
echo 'Skipping a closed connection';
}
}
}
我改成
public function broadCast(string $data): void
{
foreach ($this->clients as $client) {
//echo PHP_EOL. stream_get_status($client) .PHP_EOL;
$clientMeta = ( stream_get_meta_data($client) );
$clientEof = $clientMeta['eof'];
if (is_resource($client) && $clientEof == false ) { // check if not yet closed/broken etc
fwrite($client, $this->encode($data));
} else {
echo 'Skipping a closed connection';
}
}
}
【问题讨论】:
-
谁在关闭你的连接?
-
Websocket 应该提供持久连接。为什么要在这里使用长轮询?
-
如您所见,这是一个 PHP 脚本,如果我省略了无限循环,脚本将在可能的响应之前结束。不确定我是否在这里无法理解某些内容。