ANGZHEN
  • 2
  • 新人请关照

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

阅读 622
评论 更新于 2019-07-25
    1 个回答
    ANGZHEN
    • 2
    • 新人请关照

    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();
    };

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

    评论 赞赏 2019-07-25
      撰写回答

      登录后参与交流、获取后续更新提醒