Swoole-src: 在swoole_websocket_server start回调启动的swoole_process中无法向客户端push消息?

Created on 15 Nov 2016  ·  3Comments  ·  Source: swoole/swoole-src

实例代码如下:

<?php
$server = new \swoole_websocket_server("0.0.0.0", 9443);

$server->set(array(
    'worker_num' => 1,
    'max_request' => 500,
    'task_worker_num' => 1,
    'max_connection' => 1024
));

$server->on('start', function (\swoole_websocket_server $server) {
    $pid = getmypid();
    $mPid = getmypid();
    echo "this is Master pid: $mPid\n";

    $process = new swoole_process('process');
    $pid = $process->start();
});

$server->on('message', function (\swoole_websocket_server $server, $frame) {
    echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish} workerid: {$server->worker_id}\n";
});

$server->on('task', function (\swoole_server $serv, $task_id, $from_id, $data) {});
$server->on('finish', function (\swoole_server $serv, $task_id, $from_id, $data) {});

$server->start();

function process(swoole_process $process)
{
    global $server;
    swoole_set_process_name("php processor");
    // 等待客户端连接, 20秒后向客户端循环发送数据
    swoole_timer_after(20 * 1000, function() use ($server){
        foreach ($server->connections as $fd) {
            var_dump($fd);
            $server->push($fd, 'hello');
        }
    });

}

20秒后, var_dump出了fd, 但是客户端没有收到数据.

question

Most helpful comment

贴上修改后的实例代码:

<?php
$server = new \swoole_websocket_server("0.0.0.0", 9443);

$server->set(array(
    'worker_num' => 1,
    'max_request' => 500,
    'task_worker_num' => 1,
    'max_connection' => 1024
));

$process = new swoole_process('process');
$pid = $process->start();
$server->addProcess($process);


$server->on('start', function (\swoole_websocket_server $server) {
    $pid = getmypid();
    echo "this is Master pid: $pid\n";
});

$server->on('message', function (\swoole_websocket_server $server, $frame) {
    echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish} workerid: {$server->worker_id}\n";
});

$server->on('task', function (\swoole_server $serv, $task_id, $from_id, $data) {});
$server->on('finish', function (\swoole_server $serv, $task_id, $from_id, $data) {});

$server->start();

function process(swoole_process $process)
{
    global $server;
    swoole_set_process_name("php processor");

    swoole_timer_after(10 * 1000, function() use ($server){
        foreach ($server->connections as $fd) {
            var_dump($fd);
            $server->push($fd, 'hello');
        }
    });

}

All 3 comments

使用addProcess,不要在onStart回调函数中创建process

ok, 可以了, 多谢.

贴上修改后的实例代码:

<?php
$server = new \swoole_websocket_server("0.0.0.0", 9443);

$server->set(array(
    'worker_num' => 1,
    'max_request' => 500,
    'task_worker_num' => 1,
    'max_connection' => 1024
));

$process = new swoole_process('process');
$pid = $process->start();
$server->addProcess($process);


$server->on('start', function (\swoole_websocket_server $server) {
    $pid = getmypid();
    echo "this is Master pid: $pid\n";
});

$server->on('message', function (\swoole_websocket_server $server, $frame) {
    echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish} workerid: {$server->worker_id}\n";
});

$server->on('task', function (\swoole_server $serv, $task_id, $from_id, $data) {});
$server->on('finish', function (\swoole_server $serv, $task_id, $from_id, $data) {});

$server->start();

function process(swoole_process $process)
{
    global $server;
    swoole_set_process_name("php processor");

    swoole_timer_after(10 * 1000, function() use ($server){
        foreach ($server->connections as $fd) {
            var_dump($fd);
            $server->push($fd, 'hello');
        }
    });

}
Was this page helpful?
0 / 5 - 0 ratings

Related issues

jobs-git picture jobs-git  ·  3Comments

daslicht picture daslicht  ·  4Comments

andreybolonin picture andreybolonin  ·  4Comments

pthreat picture pthreat  ·  3Comments

nick-zh picture nick-zh  ·  3Comments