以下のソースhttps://github.com/kallaspriit/PHP-HTML5-WebSocket-Serverを使用して、描画でWebソケットを実行しました
FF および chrome ブラウザーでは機能するが、サファリでは機能しないスクリプトを実行できました。私の知る限り、これはサファリで使用されているハンドシェイクに関連している可能性があります(FFやクロムとは異なります)。
クラス 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 には ヘッダーに chrome が存在し、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 は接続と切断を同時に行います。問題はこれらの見出しが原因であると考えられます。適切に機能するようにカスタマイズする方法がわかりません。サファリや他のブラウザをサポートするようにコードを変更する方法を知っている人はいますか?