美文网首页
Swoole Process进程初级

Swoole Process进程初级

作者: 骑蚂蚁上高速_jun | 来源:发表于2020-03-06 15:29 被阅读0次

    Swoole 初级教程

    1 . swoole 进程模块 process,模拟并发处理不同任务的案例
    直接上代码

    #!/usr/bin/php
    <?php
    
    use Swoole\Process;
    
    class swoole
    {
        private $daemon;
    
        public function __construct(){
            $getopt = getopt("d:");
            $this->daemon = ($getopt["d"] ?? "") == "true" ? true : false;
        }
    
        public function main(){
            $redis = new redis();
            $redis->connect("127.0.0.1");
            $redis->setOption(Redis::OPT_READ_TIMEOUT,-1);
            $this->daemon && Process::daemon();
            while(true){
                try {
                    if ($redis->ping() != "+PONG") {
                        $redis = new redis();
                        $redis->connect("127.0.0.1");
                        $redis->setOption(redis::OPT_READ_TIMEOUT, -1);
                    }
                } catch (Exception $e) {
                }
                echo "启动监听任务 \n";
                // redis阻塞进程,  等待任务进入
                $data = $redis->brPop("list:swoole",0);
                $forks = [];
                for ($i=1;$i<=6;++$i){
                    // 将接受到的任务放到redis中执行
                    $process = $this->createProcess($data[1] ?? "");
                    $forks[$process->pid] = $process;
                }
                // 等待任务完成
                while($ret = swoole_process::wait(true)) {
                    $pid = $ret['pid'];
                    $process = $forks[$pid];
                    // 保存结果到文件
                    // 重点:父进程 $process->read(); 读取子进程的结果执行执行一次。否则会阻塞父进程
                    file_put_contents("/data/wwwroot/php-cli/swoole.log",$process->read()."\n",FILE_APPEND);
                }
            }
        }
    
        /**
         * 创建子进程并执行业务逻辑
         * @param string $taskString
         * @return Process
         */
        private function createProcess(string $taskString){
            $process = new Process(function(Process $worker)use($taskString) {
                $pid = $worker->pid; // 获取当前子工作进程号
                $worker->name("opop:{$pid}"); // 设置进程别名
                co::sleep(rand(4,8)); // 模拟任务执行 耗时
                $worker->write("成功 {$pid}->".$taskString); // 将业务逻辑写入管道, 通知主(父)进程
                // 检测子进程存活的话,直接杀死退出子进程
                if(Process::kill($pid,0)){
                    $worker->exit(0); // 杀死子进程
                }
            },false,1,true);
    
            $process->start();
            return $process;
        }
    }
    
    (new swoole())->main();
    

    启动及状态查看

    # 守护进程启动,最好使用 nohup再加守护进程
    $ nohup php swoole -d=true &  
    $ ps -ef | grep php
    
    

    相关文章

      网友评论

          本文标题:Swoole Process进程初级

          本文链接:https://www.haomeiwen.com/subject/ayvrrhtx.html