PHP websocket不适用于safari,标头修改
Posted
技术标签:
【中文标题】PHP websocket不适用于safari,标头修改【英文标题】:PHP websocket doesn't work on safari, headers modyfication 【发布时间】:2012-12-11 10:08:16 【问题描述】:我使用下面的源代码https://github.com/kallaspriit/php-html5-WebSocket-Server执行了带有绘图的网络套接字
我能够运行适用于 FF 和 chrome 浏览器但不能在 safari 中运行的脚本。据我所知,这可能与 safari 中使用的握手有关(与 FF 和 chrome 不同)。
在 SocketServer.php 类中,我发现了以下规则:
$headers = $this->parseRequestHeader($buffer);
if (isset($headers['Sec-WebSocket-Key']))
$key = $headers['Sec-WebSocket-Key'];
else
$key = $headers['Sec-WebSocket-Key1'];
$hash = base64_encode(
sha1($key . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true)
);
/在ff和header中的chrome存在Sec-WebSocket-Key,safari有Sec-WebSocket-Key1和Sec-WebSocket-Key2/
if (isset($headers['Sec-WebSocket-Key']))
$headers = array(
'HTTP/1.1 101 Switching Protocols',
'Upgrade: websocket',
'Connection: Upgrade',
'Sec-WebSocket-Accept: ' . $hash
);
else
$headers = array(
"HTTP/1.1 101 Web Socket Protocol Handshake",
"Upgrade: WebSocket",
"Connection: Upgrade",
"WebSocket-Origin: http://localhost",
"WebSocket-Location: ws://localhost:9300",
);
$headers = implode("\r\n", $headers) . "\r\n\r\n";
$left = strlen($headers);
do
$sent = @socket_send($this->socket, $headers, $left, 0);
if ($sent === false)
$error = $this->server->getLastError();
throw new Exception(
'Sending handshake failed: : ' . $error->message .
' [' . $error->code . ']'
);
$left -= $sent;
if ($sent > 0)
$headers = substr($headers, $sent);
while ($left > 0);
$this->state = self::STATE_OPEN;
我试图更改 safari 的标题,但没有任何效果。 Safari 同时连接我并断开连接 - 我认为问题是由这些头条新闻引起的,我不知道如何自定义它们以正常工作。 有谁知道如何修改代码以支持 safari 以及其他浏览器?
【问题讨论】:
在哪个版本中你可以在这里看到讨论***.com/questions/1253683/… 【参考方案1】:看起来 WebSocket 服务器已经 9 个月没有更新了。因此,我建议您查看替代 PHP WebSocket 解决方案,例如 Ratchet,它正在积极开发中。
【讨论】:
以上是关于PHP websocket不适用于safari,标头修改的主要内容,如果未能解决你的问题,请参考以下文章