Javascript PHP主机未从标头接收Websocket密钥

Javascript PHP主机未从标头接收Websocket密钥,javascript,php,websocket,Javascript,Php,Websocket,我正在尝试在我的页面中实现WebSocket,它在开发环境中工作得很好,但是当我部署到其他位置时,php主机没有收到握手所需的密钥。(Sec WebSocket密钥在标题中丢失,即使它正在发送(我确认它是在chrome的开发者工具中发送的)) 我正在运行一个php websocket服务器,客户端是javascript 要获取客户端发送的标头,我将执行以下操作: $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_set_

我正在尝试在我的页面中实现WebSocket,它在开发环境中工作得很好,但是当我部署到其他位置时,php主机没有收到握手所需的密钥。(Sec WebSocket密钥在标题中丢失,即使它正在发送(我确认它是在chrome的开发者工具中发送的))

我正在运行一个php websocket服务器,客户端是javascript

要获取客户端发送的标头,我将执行以下操作:

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($socket, 0, $port);
socket_listen($socket);
然后,一旦用户连接:

$socketNew = socket_accept($socket); //accept new socket
$header = socket_read($socketNew, 1024); //read data sent by the socket
下面是正在发送的标题:

Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8,ja;q=0.6
Cache-Control:no-cache
Connection:Upgrade
Cookie:--long jumble of text--
Host:--hidden--:8080
Origin:--hidden--
Pragma:no-cache
Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits
Sec-WebSocket-Key:BuiFne7w8lCA5qt4ojEjgg==
Sec-WebSocket-Version:13
Upgrade:websocket
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
下面是PHP主机接收到的标头:

GET / HTTP/1.1
Host: ---hidden---:8080
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: ---hidden---
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8,ja;q=0.6
Cookie:  ---really long jumble of text---

这是相当令人沮丧和耗时的解决,所以希望这将有助于某人

socket_read中的第二个参数是从标头读取的最大长度。我不明白你为什么不想要所有的标题。我注意到在很多websockets的基本教程中,第二个参数是1024,我不想查看文档来了解这个数字的用途。事实证明,在我的情况下,这个数字太低了。我只是大大提高了这个数字,这样以后就不会有问题了,现在效果很好

因此,要明确的是:

如果这不起作用:

$header = socket_read($socketNew, 1024); //read data sent by the socket
增加要读取的最大长度:

$header = socket_read($socketNew, 5000); //read data sent by the socket

一旦我更改了这里的编号(以及其他带有“最大长度”参数的位置),它立即生效。

您从哪里获得标题?从浏览器或其他地方?从(php)套接字主机。我在新连接的套接字上运行socket\u accept,然后通过socket\u read获取头。(然后连接失败,因为标头缺少键)调试的第一条规则:首先检查源上的数据。“这是正在发送的邮件头”-您不能声明,您只能声明这些邮件头“正在接收”。你仍然不知道发送了什么。在发送之前,我如何才能看到标题?@zerkms感谢您帮助调查标题。它最终让我找到了问题所在——这实际上是我在问题中发布的最后一行PHP代码。我现在就发布答案。