有一个PHP Websocket客户端:https://github.com/symbiose/php-websocket-client存储库。它适用于不安全的连接。
我需要的是通过安全连接从php代码连接到websocket服务器。为了实现这个任务,我采用了上面的代码并对其进行了一些修改。 WebSocketClient的connect()方法现在在我的代码中看起来像这样:
public function connect()
{
$root = $this;
if ($this->getPort() == 443) {
$context = stream_context_create();
stream_context_set_option($context, 'ssl', 'allow_self_signed', true);
stream_context_set_option($context, 'ssl', 'verify_peer', false);
$client = stream_socket_client("tls://{$this->getHost()}:{$this->getPort()}", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);
} else {
$client = stream_socket_client("tcp://{$this->getHost()}:{$this->getPort()}", $errno, $errstr);
}
if (!$client) {
throw new RuntimeException('Cannot connect to socket ([#'.$errno.'] '.$errstr.')');
}
$this->setSocket(new Connection($client, $this->getLoop()));
$this->getSocket()->on('data', function ($data) use ($root) {
$data = $root->parseIncomingRaw($data);
$root->parseData($data);
});
$this->getSocket()->write($this->createHeader());
return $this;
}
结果我几乎设法连接到服务器。 Websocket服务器看到了我的连接,回复说一切正常并将其写入日志。
但不幸的是,图书馆不明白,它已成功连接到服务器。
这个“如果”:
if (base64_encode(pack('H*', sha1($this->key . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'))) === $response['Sec-Websocket-Accept']) {
$this->connected = true;
}
永远不会被执行。所以我无法建立连接。
我还可以确认,如果我们使用80端口 - 一切都像魅力一样。
所以如果你对为什么会发生这种情况有任何想法,我真的很感激他们。因为我已经没有想法了。
祝你好运, 克斯特亚