RatchetPHP + WebSockets - 字符编码问题

时间:2017-04-12 11:30:35

标签: php encoding websocket ratchet phpwebsocket

我在使用棘轮PHP和WebSockets时遇到了一些字符编码问题。

守则

我使用Racthet PHP设置服务器。我从中删除了任何不相关的代码:

<?php

require __DIR__.'/bootstrap/autoload.php';

// Ensure correct character encoding...
ini_set('default_charset', 'utf-8');
setlocale(LC_CTYPE, 'en_GB.UTF-8');
mb_internal_encoding("UTF-8");

use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use Ratchet\Http\HttpServerInterface;
use Guzzle\Http\Message\RequestInterface;

class WebSocketDelegate implements MessageComponentInterface {
    protected $clients;

    public function __construct() {
        $this->clients = new \SplObjectStorage;
    }

    public function onOpen(ConnectionInterface $connection) {
        // 
    }

    public function onMessage(ConnectionInterface $from, $msg) {
        // 
    }

    public function onClose(ConnectionInterface $connection) {
        //
    }

    public function onError(ConnectionInterface $connection, \Exception $e) {
        //
    }
}

class RequestInterceptor implements HttpServerInterface {
    private $delegate;

    public function __construct(HttpServerInterface $httpServer) {
        $this->delegate = $httpServer;
    }

    public function onOpen(ConnectionInterface $connection, RequestInterface $request = null) {
        $this->delegate->onOpen($connection, $request);
    }

    public function onMessage(ConnectionInterface $connection, $message) {
        print PHP_EOL . 'Message received, dumping data...' . PHP_EOL;
        var_dump($message);
    }

    public function onClose(ConnectionInterface $connection) {
        //
    }

    public function onError(ConnectionInterface $connection, \Exception $e) {
        //
    }
}

$hostname = 'localhost';
$port = 8889;

$app = \Ratchet\Server\IoServer::factory(
    new \Ratchet\Http\HttpServer(
        new RequestInterceptor(
            new \Ratchet\WebSocket\WsServer(
                new WebSocketDelegate()
            )
        )
    ),
    $port,
    $hostname
);

$app->run();

它位于我的HTML的<head>

<meta charset="utf-8" />

我还围绕WebSocket JavaScript类创建了一个包装类,除了其他无关的东西之外,它还将我的请求转换为JSON并通过WebSocket发送。

问题

以下是JS Console日志的屏幕截图,其中显示了通过连接发送的确切JSON字符串。一切都很好:

enter image description here

这是PHP WebSocket服务器输出命令行的屏幕截图。正如您所看到的,var_dump&#d; d}信息格式不正确。我也尝试用print清楚地打印它,这没什么区别。

enter image description here

但是,这里需要注意的有趣的是,每次格式不正确的字符都是完全不同的。当使用var_dump转储第四条消息时,表示前置变量的类型和大小的部分由var_dump函数也是格式错误的。我不确定这是否意味着什么,或者只是畸形人物的神器。

我还尝试将字符串'test'通过WebSocket发送到服务器,然后将该消息打印出来。同样,每次打印消息时,格式错误的字符每次都不同,每次字符串'test'的假设长度为10个字符。

其他细节

当我将格式错误的字符串传递给mb_detect_encoding时,无法确定编码。

我知道这必须与Ratchet PHP有关,因为之前我使用的是另一个名为“Hoa&#39;”的PHP WebSocket库。这没有表现出任何上述字符编码问题,但确实有另一个问题让我转向RatchetPHP。

我不确定,但可能相关的事实是,当我使用Composer安装RatchetPHP时,它警告我RacthedPHP正在使用被放弃的Guzzle版本&#39;。但我无法想象,因为放弃了RatchetPHP的更新已被释放,我想如果它出现问题,RatchetPHP的开发者会把它改成新的Guzzle。

另请注意,当我打印在初始握手时发送的标题时,一切正常,并且没有格式错误的字符。只有此后发送的消息格式不正确。

环境

  • Windows 10 x64
  • 主要是添加一些vhosts的XAMPP安装,memory_limit增加,默认MySQL排序规则改变等。
  • PHP 7.1.1

我尝试过的事情

  • 如上面的PHP所示,我已经用几种不同的方式设置编码,以确保PHP设置正确的编码。
  • 尝试了不同的浏览器,结果相同
  • 所有建议here
  • 捕获输出并写入文件以确保它与命令提示符无关。写入文件并在文本编辑器中打开时的结果相同。

如果我知道还有什么可以尝试,我会尝试更多的事情。我有点失落。

究竟是什么造成这种情况?

0 个答案:

没有答案