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,标头修改的主要内容,如果未能解决你的问题,请参考以下文章

Appsync 的 graphql 订阅不适用于 PHP5

pdf.js 不适用于 Safari

Flexbox CSS 不适用于 Safari

视频不适用于 Safari 和 iOS

为啥 jQuery 选择器适用于 Chrome,但不适用于 Safari?

Safari flex 不适用于 clearfix hack