swoole测试子进程时使用异步和同步的区别?为什么输出不一样?


环境php7.2.14 + swoole4.4
代码如下:

composer require symfony/var-dumper

仿照swoole文档编写:https://wiki.swoole.com/wiki/...

<?php
require_once __DIR__ . "/vendor/autoload.php";

use Swoole\Process;
use Swoole\Timer;

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->auth('test');

function callback_function () {
    echo posix_getpid()."\n";
    // 异步
    Timer::after(3000, function () {
        echo posix_getpid()." hello world\n";
    });

    // 同步
    // sleep(3);
    // echo posix_getpid()." hello world\n";
    global $redis;
};

Timer::tick(1000, function () {
    echo posix_getpid()." parent timer\n";
});

Process::signal(SIGCHLD, function ($sig) {
    // dump(posix_getpid());
    while ($ret = Process::wait(false)) {
        dump($ret);
        $p = new Process('callback_function');
        $p->start();
    }
});

$p = new Process('callback_function');

$p->start();

异步Timer::after()输出结果:

clipboard.png
子进程疯狂退出,为什么没有等到3秒后在退出??

同步sleep()输出结果符合预期。

clipboard.png

阅读 2.1k
1 个回答
新手上路,请多包涵

https://segmentfault.com/a/11...

function callback_function () {

echo posix_getpid()."\n";
// 异步
Timer::after(3000, function () {
    echo posix_getpid()." hello world\n";
});

// 同步
// sleep(3);
// echo posix_getpid()." hello world\n";
global $redis;

Event::wait();
};

改写后就可以了!不过为什么之前子进程第一次运行时是正常的?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题