一,创建守候进程,因为这里不需要Server,也没有Client,数据交换通过redis进行

  1. <?php
  2. namespace Kuba\Saas;
  3. require_once __DIR__ . '/Core/ErrorHandle.php';
  4. use \Swoole\Timer;
  5. use \Swoole\Process;
  6. use Kuba\Saas\Core\ErrorHandle;
  7.  
  8. final class Services {
  9.  
  10. private $m_workers = [];
  11. private $m_pid = 0;
  12.  
  13. public function __construct() {
  14. try {
  15. $this->m_pid = posix_getpid();
  16.  
  17. echo "moolan_services start:".$this->m_pid.PHP_EOL;
  18. echo date("Y-m-d H:i:s").PHP_EOL;
  19.  
  20. \swoole_set_process_name("moolan_services");
  21.  
  22. $this->create_error_monitor_process($this->m_pid);
  23.  
  24. //监控子进程的状态,如果子进程异常退出,则重启该子进程
  25. $this->process_monitor();
  26. }catch (\Exception $e){
  27. die('ALL ERROR: '.$e->getMessage());
  28. }
  29. }
  30.  
  31. private function process_monitor()
  32. {
  33. //检测子进程是否结束,如果结束,则重新启动子进程
  34. while(1) {
  35. if(count($this->m_workers)){
  36. //这里会一直等待,一次接收一个子进程,所以外面必须有循环
  37. $ret = \swoole_process::wait();
  38. if ($ret) {
  39. $this->process_reboot($ret);
  40. }
  41. }
  42. }
  43. }
  44.  
  45. private function process_reboot($ret){
  46. try
  47. {
  48. $pid=$ret['pid'];
  49.  
  50. if(in_array($pid, $this->m_workers)){
  51. $method_name = $this->m_workers[$pid];
  52. unset($this->m_workers[$pid]);
  53.  
  54. echo $method_name." restart:".$pid.PHP_EOL;
  55. echo date("Y-m-d H:i:s").PHP_EOL;
  56.  
  57. $method = new \ReflectionMethod($this, $method_name);
  58. $method->invoke($this, [$this->m_pid]);
  59.  
  60. return;
  61. }
  62. }
  63. catch (\Exception $e)
  64. {
  65. die('Process_reboot error: '.$e->getMessage());
  66. }
  67. }
  68.  
  69. /**
  70. * 创建监控系统错误的进程
  71. *
  72. * 该进程属于一条一条处理的模式,因为错误不会太多
  73. */
  74. private function create_error_monitor_process($mpid)
  75. {
  76. try
  77. {
  78. $process = new Process(function ($worker) use ($mpid)
  79. {
  80. try
  81. {
  82. \swoole_set_process_name("moolan_error_handle");
  83.  
  84. $obj_error_handle = new ErrorHandle();
  85. while (true)
  86. {
  87. try
  88. {
  89. //从消息队列接收出错消息,接收到一个,就启动一个task去执行
  90. //如果接收不到出错信息,则休息2秒时间
  91. if (!$obj_error_handle->fetch_task())
  92. {
  93. $obj_error_handle->release_task();
  94. unset($obj_error_handle);
  95.  
  96. usleep(2000000);
  97.  
  98. $obj_error_handle = new ErrorHandle();
  99. }
  100. else
  101. {
  102. //启动任务处理接收到的出错信息
  103. $obj_error_handle->do_task();
  104. }
  105.  
  106. //执行完一个完成的任务后,
  107. //查看主进程是否已经关闭,如果已经关闭,则子进程也要关闭运行
  108. if(!\swoole_process::kill($mpid,0)){
  109. echo 'moolan service gone'.PHP_EOL;
  110. echo __METHOD__.' process exit'.PHP_EOL;
  111. $worker->exit();
  112. }
  113. }
  114. catch (\Exception $e)
  115. {
  116. echo $e->getMessage();
  117. }
  118. }
  119. }
  120. catch (\Exception $e)
  121. {
  122. die(__METHOD__.' process exec error: '.$e->getMessage());
  123. }
  124. }, false);
  125.  
  126. $pid = $process->start();
  127.  
  128. echo __METHOD__." started:".$pid.PHP_EOL;
  129. echo date("Y-m-d H:i:s").PHP_EOL;
  130.  
  131. $this->m_workers[$pid] = __METHOD__;
  132. }
  133. catch (\Exception $e)
  134. {
  135. die(__METHOD__.' Process Start error: '.$e->getMessage());
  136. }
  137. }
  138.  
  139. }
  140.  
  141. $server = new Services();

  二,创建值守脚本,检测以上主进程持续运行

  1. #! /bin/sh
  2.  
  3. proc_name="***" # 进程名
  4. proc_file="***.php"
  5. log_name="/***/moolan-monitor.log" # 日志文件
  6. pid=0
  7.  
  8. proc_num() # 计算进程数
  9. {
  10. num=`ps -ef | grep $proc_name | grep -v grep | wc -l`
  11. return $num
  12. }
  13.  
  14. proc_id() # 进程号
  15. {
  16. pid=`ps -ef | grep $proc_name | grep -v grep | awk '{print $2}'`
  17. }
  18.  
  19. proc_num
  20. number=$?
  21. if [ $number -eq 0 ] # 判断进程是否存在
  22. then
  23. nohup /usr/local/php5/bin/php /***/$proc_file >>$log_name 2>&1 & # 重启进程的命令,请相应修改
  24. proc_id # 获取新进程号
  25. echo ${pid}, `date` >> $log_name # 将新进程号和重启时间记录
  26. fi

  三,把值守脚本加入到定时器

crontab

利用定时任务来轮询执行脚本

  1. */1 * * * * /PATH/watch_queue.sh

swoole创建工作进程,执行滞后工作的更多相关文章

  1. 【转】Nginx系列(三)--管理进程、多工作进程设计

    原博文出于:http://blog.csdn.net/liutengteng130/article/details/46700999  感谢! Nginx由一个master进程和多个worker进程组 ...

  2. IIS6与IIS7中的w3wp工作进程

    在IIS6中,每一个网站都有对应的应用程序池,在应用程序池有运行着网站的Application,在默认情况下,所有的网站的应用程序都会分配到默认的应用程序池当中,   当然,我们可以新建一个应用程序池 ...

  3. 从整体上理解进程创建、可执行文件的加载和进程执行进程切换,重点理解分析fork、execve和进程切换

    学号后三位<168> 原创作品转载请注明出处https://github.com/mengning/linuxkernel/ 1.分析fork函数对应的内核处理过程sys_clone,理解 ...

  4. Nginx系列(三)--管理进程、多工作进程设计

    Nginx由一个master进程和多个worker进程组成,但master进程或者worker进程中并不会再创建线程. 一.master进程和worker进程的作用 master进程 不须要处理网络事 ...

  5. Nginx之监控进程和工作进程

    1. 函数调用分析 在开启 master 的情况下,多进程模型的下的入口函数为 ngx_master_process_cycle,如下: int mian() { ... if (ngx_proces ...

  6. Linux内核设计与实现 总结笔记(第八章)下半部和推后执行的工作

    上半部分的中断处理有一些局限,包括: 中断处理程序以异步方式执行,并且它有可能打断其他重要代码的执行. 中断会屏蔽其他程序,所以中断处理程序执行的越快越好. 由于中断处理程序往往需要对硬件进行操作,所 ...

  7. iis最大工作进程数

    IIS 6.0允许将应用程序池配置成一个Web园(Web Garden).要理解Web园的概念,可以设想这样一种情形:假设有一个IIS 5.0服务器和三个Web网站,每一个Web网站运行着相同的应用程 ...

  8. 你真的了解:IIS连接数、IIS并发连接数、IIS最大并发工作线程数、应用程序池的队列长度、应用程序池的最大工作进程数 吗?

    原文链接:http://www.cnblogs.com/yinhaichao/p/4060209.html?utm_source=tuicool&utm_medium=referral 一般购 ...

  9. 【Python】 配置文件相对路径&软件自动执行的工作目录

    今天对监控脚本做了一些变更,然后突然发现监控全部都失效了..排查了半天问题仍然不知所踪.最终发现居然是一个踩过好几次的老坑.. 就是脚本内写的配置文件为了调试方便写成了相对路径,但是在上线时没有意识到 ...

随机推荐

  1. Non-technical Blog Recording on Day of Sep. 19th 2017 in Retrospection.

    Unfortunately, I heard a resignation message verbally from ESU (her name is: Su Yi in Chinese, Su fr ...

  2. sql,取得当前系统时间,算时间区间

    mysql: SELECT * from (SELECT H_TEMPERATURE FROM WENSHIDU  WHERE TH_TIME >=date_sub(NOW(), interva ...

  3. 大数据-01-安装Hadoop

    环境 服务器:ubuntu-16.04.3-desktop-amd64.iso 创建hadoop用户 sudo useradd -m hadoop -s /bin/bash 本文中会大量使用到sudo ...

  4. JavaScript操作符-3---算数,逻辑,赋值,比较,三元

    JavaScript操作符 学习目标 1.掌握什么是表达式 2.掌握javascript操作符的分类 3.掌握算数操作符 什么是表达式 将类型的数据(如常量.变量.函数等),用运算符号按一定的规则链接 ...

  5. HanLP 配置与使用

    https://github.com/hankcs/HanLP 下载 hanlp-1.6.0.jar和 hanlp.properties 放在主目录下 修改 hanlp.properties 参考官网 ...

  6. Logo的制作

    <style> header { width: 1300px; height: 100px; /* background-color: pink; */ margin: 0 auto; p ...

  7. 用jq修改css

    $(".tag_add").css("background","#ffffff"); $(".tag_add").css ...

  8. centos安装jdk1.8

    一.安装Java环境 1. 删除系统预装的opensdk或其他sdk 用命令 java -version 验证是否存在sdk 2. 下载Java JDK约定的版本 版本:Java SE Develop ...

  9. visual studio + opencv + contrib

    经过一天的奋战,终把opencv给用起来了.我是用的工具是vs2017+opencv3.3 上午想用mingw+opencv,结果查了很多资料说gcc不支持opencv.我感觉很奇怪,支不支持以后再说 ...

  10. 将本地项目上传到git/码云

    idea查看任意项目的远程仓库地址: git remote -v git branch -v git branch -d  分支名          删除本地分支 git branch -D  分支名 ...