zoukankan      html  css  js  c++  java
  • swoole进程-2

    --------进程通讯 场景  父子进程通讯

    https://wiki.swoole.com/wiki/page/214.html

    <?php
    
    
    use SwooleProcess;
    
    echo "当前进程ID:".posix_getpid().PHP_EOL; //获取了进程ID
    cli_set_process_title("mymain"); //设置了进程名称
    
    
    $child1=new Process(function(Process $p){
        while(true){
            sleep(1);
            $p->write("[进程1:12345]");
            echo "进程1发送数据:[进程1:12345]".PHP_EOL;
        }
    },false,1,true);
    $child1->start();
    
    $child2 = new Process(function(Process $p){
        while(true){
    //        usleep(0.5*1000*1000);
            sleep(0.5);
            echo "进程2获取数据:".$p->read().PHP_EOL;
    
        }
    });
    $child2->start();
    
    while(true){
        $child1_data = $child1->read();
        $child2->write($child1_data);
        sleep(1);
    }
    
    
    Process::signal(SIGCHLD, function($sig) {
        //必须为false,非阻塞模式
        while($ret =  Process::wait(false)) {
            var_dump($ret);
        }
    });
    [root@bogon swoole]# php7  ./poll.php
    当前进程ID:2409
    进程1发送数据:[进程1:12345]
    进程2获取数据:[进程1:12345]
    进程1发送数据:[进程1:12345]
    进程2获取数据:[进程1:12345]
    进程1发送数据:[进程1:12345]
    进程2获取数据:[进程1:12345]
    进程1发送数据:[进程1:12345]
    进程2获取数据:[进程1:12345]
    进程1发送数据:[进程1:12345]
    进程2获取数据:[进程1:12345]

    队列queue

    <?php
    
    
    use SwooleProcess;
    
    echo "当前进程ID:".posix_getpid().PHP_EOL; //获取了进程ID
    cli_set_process_title("mymain"); //设置了进程名称
    
    
    $child1=new Process(function(Process $p){
        while(true){
            sleep(3);
            for($i = 0 ;$i<=5;$i++){
                $p->push($i);
            }
        }
    },false,1,true);
    $child1->useQueue(1,2);
    $child1->start();
    
    $child2 = new Process(function(Process $p){
        while(true){
            sleep(0.5);
            echo "进程2获取数据:".$p->pop().PHP_EOL;
    
        }
    },false,1,true);
    $child2->useQueue(1);
    $child2->start();
    
    $child3 = new Process(function(Process $p){
        while(true){
            sleep(0.5);
            echo "进程3获取数据:".$p->pop().PHP_EOL;
    
        }
    },false,1,true);
    $child3->useQueue(1);
    $child3->start();
    
    
    Process::signal(SIGCHLD, function($sig) {
        //必须为false,非阻塞模式
        while($ret =  Process::wait(false)) {
            var_dump($ret);
        }
    });
    [root@bogon swoole]# php7  ./poll.php
    当前进程ID:2735
    进程2获取数据:0
    进程2获取数据:2
    进程2获取数据:3
    进程2获取数据:4
    进程2获取数据:5
    进程3获取数据:1
    进程2获取数据:0
    进程2获取数据:2
    进程2获取数据:3
    进程2获取数据:4
    进程2获取数据:5
    进程3获取数据:1
    进程2获取数据:0
    进程2获取数据:2
    进程2获取数据:3
    进程2获取数据:4
    进程2获取数据:5
    进程3获取数据:1
    进程2获取数据:0
    进程2获取数据:2
    进程2获取数据:3
    进程2获取数据:4
    进程2获取数据:5
    进程3获取数据:1

    执行 外部程序

    <?php
    require "vendor/autoload.php";
    use SwooleProcess;
    use SwooleCoroutineMysql as MySQL;
    echo "当前进程ID:".posix_getpid().PHP_EOL; //获取了进程ID
    cli_set_process_title("mymain"); //设置了进程名称
    
    
    $child1=new Process(function(Process $p){
    
        $p->exec("/application/php7/bin/php",['./test.php']);
    },true,0,true);
    $child1->start();
    
    while(true){
        $ret=$child1->read();
        echo $ret;
        usleep(0.5*1000*1000);
    }
    
    
    Process::signal(SIGCHLD, function($sig) {
        //必须为false,非阻塞模式
        while($ret =  Process::wait(false)) {
            //var_dump($ret);
        }
    });

    crontab表达式

    <?php
    date_default_timezone_set('PRC'); //设置中国时区
    require_once 'vendor/autoload.php';
    
    
    $config=[
        "job1"=>[
            "cron"=> CronCronExpression::factory('* * * * *'),
            "func"=>function(){
                echo "job1".date("Y-m-d h:i").PHP_EOL;
            },
            "current"=>date("Y-m-d H:i"),
            "nth"=>0
        ]
    ];
    while(true){
    
        foreach($config as $key=>&$value){
            $cron=$value["cron"];
            $func=$value["func"];
            $current=$value["current"];
            $nth=$value['nth'];
            $time=$cron->getNextRunDate($value["current"],$nth,false)->getTimestamp()-strtotime(date("Y-m-d H:i"));
            if($time===0){
                //执行业务逻辑
                $func();
                $value['nth']=$value['nth']+1;
            }
        }
    
    
        sleep(1);
    }
    View Code

    多进程创建任务并回收

    <?php
    use SwooleProcess;
    
    cli_set_process_title("mymaster");
    $manger = new Process(function(Process $process){
        cli_set_process_title("mymanager");
        while(true){
            sleep(0.1);
            $process->write(json_encode(["a"=>123,"b"=>456]));
            Process::kill(posix_getppid(),SIGUSR1);
        }
    },false,1);
    
    $manger->start();
    
    
    Process::signal(SIGUSR1, function($sig) use($manger) {
        $data[] = $manger->read();
        $child=new Process(function(Process $process) use($data){
            sleep(1);
            echo $data.PHP_EOL;
        });
        $child->start();
    });
    
    Process::signal(SIGCHLD, function($sig) {
        //必须为false,非阻塞模式
        while($ret =  Process::wait(false)) {
            //var_dump($ret);
        }
    });

    上述代码 无法会不断开启进程执行任务  需要新方案改进

    swoole4.4.x之后子进程回收代码的问题处理:

  • 相关阅读:
    hdu 1017 A Mathematical Curiosity 解题报告
    hdu 2069 Coin Change 解题报告
    hut 1574 组合问题 解题报告
    hdu 2111 Saving HDU 解题报
    hut 1054 Jesse's Code 解题报告
    hdu1131 Count the Trees解题报告
    hdu 2159 FATE 解题报告
    hdu 1879 继续畅通工程 解题报告
    oracle的系统和对象权限
    oracle 自定义函数 返回一个表类型
  • 原文地址:https://www.cnblogs.com/sunlong88/p/11487270.html
Copyright © 2011-2022 走看看