service_init.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. <?php
  2. defined('ONLY_ONLY_ONLY') or exit('Access Denied');
  3. function myecho($content){
  4. echo date("Y-m-d H:i:s")." ".$content."\r\n";
  5. }
  6. define('WEB_PHY_ROOT', str_replace("\\",'/', dirname(dirname(__FILE__))));
  7. function service_init($WsAjaxPrj,$taskname,$interval,$runfunc){
  8. try{
  9. //php 允许模式 cli 命令行模式/ fpm-fcgi web模式用于跟踪测试
  10. $php_runmode = php_sapi_name();
  11. $php_is_climode=(php_sapi_name()=="cli");
  12. $nowProcessGuid=time();//本次处理标识
  13. echo "\r\n";
  14. echo date("Y-m-d H:i:s")." ###{$taskname}进程开始### proc_id={$nowProcessGuid} proc_start ---->\r\n";
  15. if(1){
  16. /****基本环境初始化*******start**/
  17. include_once WEB_PHY_ROOT."/base/const.php";
  18. require WEB_PHY_ROOT.'/exception2log.php';
  19. echo date("Y-m-d H:i:s")." ###环境初始化-引入异常处理功能集### proc_id={$nowProcessGuid} end ---->\r\n";
  20. include_once WEB_PHY_ROOT."/base/base.php";
  21. echo date("Y-m-d H:i:s")." ###环境初始化-引入基本函数库### proc_id={$nowProcessGuid} end ----->\r\n";
  22. include_once WEB_PHY_ROOT."/base/mysql.php";
  23. echo date("Y-m-d H:i:s")." ###环境初始化-引入mysql-DAC类### proc_id={$nowProcessGuid} end ----->\r\n";
  24. $prjRoot=WEB_PHY_ROOT."/prjcenter/prj$WsAjaxPrj";
  25. include_once $prjRoot."/base/entry.php";
  26. echo date("Y-m-d H:i:s")." ###环境初始化-引入项目entry### proc_id={$nowProcessGuid} end ----->\r\n";
  27. define('WEB_PHY_FILEROOT', $prjRoot.'/fileroot/uploads');
  28. define('WEB_URL_FILEROOT', "/prjcenter/prj$WsAjaxPrj".'/fileroot/uploads');
  29. echo date("Y-m-d H:i:s")." ###环境初始化-引入项目uploads目录位置### proc_id={$nowProcessGuid} end ----->\r\n";
  30. /****基本环境初始化******finish**/
  31. }
  32. if($php_is_climode){//cli模式下附加进程信号
  33. /****进程信号初始化***start**/
  34. echo date("Y-m-d H:i:s")." ###进程信号初始化### proc_id={$nowProcessGuid} start ---->\r\n";
  35. //信号ID和信号名称对应关系,没注释掉的信号都是可以通过pcntl_signal函数注册的
  36. $GLOBALS['G_SIG_MAP'] = array(
  37. // 1 => 'SIGHUP',
  38. // 2 => 'SIGINT',
  39. 3 => 'SIGQUIT',
  40. // 4 => 'SIGILL',
  41. // 5 => 'SIGTRAP',
  42. // 6 => 'SIGABRT',
  43. // 7 => 'SIGEMT',
  44. // 8 => 'SIGFPE',
  45. //9 => 'SIGKILL',
  46. // 10 => 'SIGBUS',
  47. // 11 => 'SIGSEGV',
  48. // 12 => 'SIGSYS',
  49. // 13 => 'SIGPIPE',
  50. // 14 => 'SIGALRM',
  51. 15 => 'SIGTERM',
  52. // 16 => 'SIGURG',
  53. //17 => 'SIGSTOP',
  54. // 18 => 'SIGTSTP',
  55. // 19 => 'SIGCONT',
  56. // 20 => 'SIGCHLD',
  57. // 21 => 'SIGTTIN',
  58. // 22 => 'SIGTTOU',
  59. // 23 => 'SIGIO',
  60. // 24 => 'SIGXCPU',
  61. // 25 => 'SIGXFSZ',
  62. // 26 => 'SIGVTALRM',
  63. // 27 => 'SIGPROF',
  64. // 28 => 'SIGWINCH',
  65. // 29 => 'SIGINFO',
  66. // 30 => 'SIGUSR1',
  67. // 31 => 'SIGUSR2',
  68. );
  69. //信号处理器逻辑,主要用于在父进程退出后,本进程必要的清理工作;
  70. function global_procsignal_handler($signo) {
  71. switch($signo){
  72. case 3://QUIT
  73. case 15://TERM
  74. echo "父进程发送了终止信号,开始进行退出处理工作[".date("Y-m-d H:i:s")."]... \n";
  75. echo "清理内容1\n";
  76. echo "清理内容2\n";
  77. exit(0);
  78. break;
  79. }
  80. }
  81. //注册信号处理器
  82. foreach ($GLOBALS['G_SIG_MAP'] as $id => $name) {
  83. pcntl_signal($id, 'global_procsignal_handler');
  84. }
  85. echo date("Y-m-d H:i:s")." ###进程信号初始化### proc_id={$nowProcessGuid} end --->\n";
  86. /****进程信号初始化***finish**/
  87. }
  88. while (1) {
  89. /****超时处理主体逻辑***周期 start**/
  90. if($php_is_climode) pcntl_signal_dispatch(); //信号监测捕获并分发处理
  91. $runfunc();
  92. if($php_is_climode) pcntl_signal_dispatch(); //信号监测捕获并分发处理
  93. sleep(intval($interval));
  94. /****超时处理主体逻辑***周期finish**/
  95. }
  96. }catch(Exception $ex){
  97. echo $ex->getMessage()." stack trace=>".$ex->getTraceAsString();
  98. throw $ex;//向上抛出异常
  99. }
  100. }
  101. ?>