我在使用棘轮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字符串。一切都很好:
这是PHP WebSocket服务器输出命令行的屏幕截图。正如您所看到的,var_dump
&#d; d}信息格式不正确。我也尝试用print
清楚地打印它,这没什么区别。
但是,这里需要注意的有趣的是,每次格式不正确的字符都是完全不同的。当使用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。
另请注意,当我打印在初始握手时发送的标题时,一切正常,并且没有格式错误的字符。只有此后发送的消息格式不正确。
如果我知道还有什么可以尝试,我会尝试更多的事情。我有点失落。
究竟是什么造成这种情况?