一个用于消息队列的并发式php进程管理程序-进程管理

进程管理

用于保存进程队列

进程启动

关闭进程

 1 class ProcessManager
 2 {
 3     protected $executable = "/bin/php";
 4     protected $_processes = array();
 5     protected $_proc_max  = 100;
 6     protected $_queues = array();
 7 
 8     public function add_process($script) {
 9         if ( !isset($script["executable"]) ) {
10             $script["executable"] = $this->executable;
11         }
12         _print_log("current process num:".count($this->_processes));
13         if ( count($this->_processes) == $this->_proc_max) {
14             TimeRecorder::add($script['message_id'], IndexTag::Waiting);
15             _print_log("process is max, push in queue :".count($this->_queues));
16             array_push($this->_queues, $script);
17         } else {
18             _print_log("exec :".$script["name"]);
19             TimeRecorder::add($script['message_id'], IndexTag::StartExec);
20             $this->_processes[] =  new Process($script["executable"], $script["name"], $script);
21         }
22     }
23 
24     public function clear() {
25         while( count($this->_processes) > 0 ) {
26             _print_log("waiting for close processes...");
27             $this->close_processes();
28         }
29     }
30 
31     public function close_processes($kill = false) {
32         // close is done process
33         foreach ($this->_processes as $i => $process) {
34             if (!$process->is_running() || $process->is_over_executed() || $kill) {
35                 $error = $process->get_error();
36                 _print_dividing_lines();
37                 if ($error != '') {
38                     _print_log($process->get_script(). " error:".$error);
39                 }
40 
41                 if (!$process->is_running()) {
42                     $result = $process->get_result();
43                     _print_log("Done: ".$process->get_script(). "\nreturn:[".$result."]");
44                 } else {
45                     _print_log("Killed: ".$process->get_script());
46                 }
47                 TimeRecorder::add($process->message_id, IndexTag::EndExec);
48                 $ret = $process->close();
49                 TimeRecorder::show($process->message_id);
50                 _print_log("exitcode: ".$ret);
51                 _print_dividing_lines();
52                 unset($this->_processes[$i]);
53             }
54         }
55 
56         if ( count($this->_processes) < $this->_proc_max && count($this->_queues) > 1 ) {
57             _print_log("queues into processes...");
58             do {
59                 $script = array_shift($this->_queues);
60                 if ( is_null($script) ) {
61                     break;
62                 }
63                 $this->add_process($script);
64             } while(count($this->_processes) < $this->_proc_max);
65         }
66     }
67 
68     public function __destruct() {
69         $this->close_processes(true);
70     }
71 }

 

posted on 2017-06-14 15:05  在这个肆意的青春岁月  阅读(169)  评论(0)    收藏  举报