PHP websockets - 不正确的 Sec-WebSocket-Accept

PHP websockets - incorrect Sec-WebSocket-Accept

我正在尝试使用 PHP websockets 创建服务器应用程序。 我写了这个脚本来帮助详细说明我的问题。 Mozilla 的 WebSocket 教程中提供了此处的正确值。

<?php
     define('GUID','258EAFA5-E914-47DA-95CA-C5AB0DC85B11');
     $hypkey = "dGhlIHNhbXBsZSBub25jZQ==";
     $concat = $hypkey . GUID;
     $sha1 = sha1($concat); 
     $base64 = base64_encode($sha1);

     echo $hypkey . "\n" . $concat . "\n" . $sha1 . "\n" . $base64;


    if ($base64 == "s3pPLMBiTxaQ9kYGzzhZRbK+xOo=")
        echo "all is right";

?>

这个脚本的输出是

dGhlIHNhbXBsZSBub25jZQ==
dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11
b37a4f2cc0624f1690f64606cf385945b2bec4ea
ZEdobElITmhiWEJzWlNCdWIyNWpaUT09MjU4RUFGQTUtRTkxNC00N0RBLTk1Q0EtQzVBQjBEQzg1QjEx

如您所见,如果它是正确的,最后一行将是 "all is right",所以我哪里出错了。这部分教程和 Websocket 草稿我已经重读了好几遍,没看出我做错了什么。

虽然在Mozilla关于编写WebSocket服务器的文章中没有明确说明,但是sha1需要是raw binary digest才能输出正确的websocket 握手的价值。

根据PHP manualsha1()函数将$str作为第一个参数,一个布尔值$raw_output作为第二个参数,它决定了输出类型.默认情况下,$raw_output 设置为 FALSE,其中 returns 是一个十六进制值。

因此,为了在这种情况下获得正确的值,将 true 作为第二个参数传递给 sha1():

$sha1 = sha1($concat, true);