• PHP操作多进程


    在以往的开发项目中,要操作进程就会使用PHP自带的pcntl拓展。但是pcntl存在着许多的不足:

    • pcntl没有提供进程间通信的功能
    • pcntl不支持重定向标准输入和输出
    • pcntl只提供了fork这样原始的接口,容易使用错误

    这边我们使用swoole进程管理模块,用来替代PHPpcntl

    场景:日常任务中,有时需要通过php脚本执行一些日志分析,队列处理等任务,当数据量比较大时,可以使用多进程来处理。

    准备:安装PHP_swoole拓展;

    write($data)

      向管道内写入数据。$data的长度在Linux系统下最大不超过8KMacOS/FreeBSD下最大不超过2K

     start():

       执行fork调用,启动子进程。

    /** 创建子进程,将数据写入管道,然后启动子进程 */
    
    $process = new swoole_process([$this, 'sonProcessWork']);
    $process->write(json_encode($data_pop));
    $pid = $process->start();
    
    

     swoole_event_add():  将一个socket加入到底层的reactor事件监听中;在子进程中处理一些耗时的计算或者操作;

    /** 获取管道的业务数据,进行相关的操作 */
    
    public function sonProcessWork(swoole_process $worker){
      $GLOBALS['worker'] = $worker;
      swoole_event_add($worker->pipe, function($pipe) {
       /******start*你的业务逻辑 *******/
        .....
       /******end*你的业务逻辑 *******/
      $worker->exit(0);
      })
    }

    wait(false)

      回收结束运行的子进程

    /** 根据信号处理紫禁城 */
    
    private function sig_handler($signo) { 
     
    Process::signal(SIGCHLD, function($sig) { //必须为false,非阻塞模式 while($ret = Process::wait(false)) { echo "PID={$ret['pid']} "; } });
    }

     以上就是php_swoole 对进程的基本操作,在实际开发过程中,业务会比较复杂;我们应当配合队列来进行使用。下一章节我们讲解 swoole+redis对列来进行批量发送短信的功能,并记录每条短信发送状态和记录发送日志;

  • 相关阅读:
    Winform+SignalR
    LogBack日志异步推送kafka并规范日志输出格式
    springboot集成微信支付APIv3接口 实现小程序和公众号支付
    服务器mysql的CPU占用超过100%
    nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module
    seata@GlobalTransactional注解失效
    微信小程序CRC16校验,通过测试,好用
    vue2和vue3项目的初始结构对比
    监控平台前端SDK开发实践
    jQuery LigerUI V1.2.0 (包括API和全部源码) 发布
  • 原文地址:https://www.cnblogs.com/hhwww/p/10394719.html
Copyright © 2020-2023  润新知