× 警告!旧版文档已经暂停维护,请查看新版文档。点击前往新版文档

swoole_http_client->upgrade

发起WebSocket握手请求,并将连接升级为WebSocket。

function swoole_http_client->upgrade(string $path, callable $callback);
  • $path URL路径
  • $callback 握手成功或失败后回调此函数
  • 使用Upgrade方法必须设置onMessage回调函数

使用实例

$cli = new swoole_http_client('127.0.0.1', 9501);

$cli->on('message', function ($_cli, $frame) {
    var_dump($frame);
});

$cli->upgrade('/', function ($cli) {
    echo $cli->body;
    $cli->push("hello world");
});

onMessage回调

function onMessage(swoole_http_client $client, swoole_websocket_frame $frame);

握手失败

某些WebSocket服务器对于客户端要求非常严格,Client需要非常接近Chrome等浏览器才可以握手成功。

可以通过增加参数和Http头,尽可能地让ClientChrome等浏览器行为保持一致。

$client->set([
    'websocket_mask' => true,
    'ssl_host_name' => 'www.yourdomain.com',
]);
$client->setHeaders([
    'Host' =>  'www.yourdomain.com',
    'UserAgent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
]);
  • websocket_mask 启用数据掩码,浏览器总是对数据进行掩码处理,因为存在较多性能消耗,默认未开启
  • ssl_host_name 设置openssl域名,SSL握手时可能会验证此参数
  • Host 设置HttpHost头,某些服务器会验证此项信息

  • jimmy

    update() server端报错: Header Sec-WebSocket-Key: $key is illegal.

  • jimmy

    补充: 以上报错是使用 class WebimServer extends Swoole\Protocol\CometServer 模式, 使用swoole_websocket_server无此错误

  • 15161463553

    $client->upgrade('/', function ($cli) use ($handle) { $handle->handle($cli); }); 这样使用不报错也不好使 我使用的是swoole4.4.12版本 已经安装了相对应的扩展重启了PHP.....请问为什么

  • 18069973217

    $swooleclient = new \swoole_http_client('127.0.0.1', Config::get('swoole.server.port')); $swooleclient->set([ 'timeout' => 3.0, 'keep_alive' => true, 'websocket_mask' => true, ]); $swooleclient->setHeaders([ 'Host' => 'localhost', 'UserAgent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36', ]); $swooleclient->on('message', function ($_cli, $frame) { $this->output->writeln(json_encode($frame, JSON_UNESCAPED_UNICODE)); }); $swooleclient->get('/', function ($cli) { $this->output->writeln('Length: '.strlen($cli->body)); $this->output->writeln($cli->body); }); $iswebsocket = false; $swooleclient->upgrade('/', function ($cli) use (&$iswebsocket) { $this->output->writeln('WebSocket Connection Access'); $iswebsocket = true; }); 没有任何信息打印出来啊(Swoole4.4.12,ext-async4.4.12)