本文以实例简单解析了php多任务程序的实现方法,具体代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
<?php error_reporting (E_ALL); set_time_limit(0); /** * php多任务程序的实现 * 借助proc_open * 其实该叫进程(process) * 能启动多进程,你可以使用你的想象力做你想做的了,以后再写个能用的 * 如果你是在linux上跑php,并且启用pcntl模块后,使用pcntl函数该更好 * */ class Thread { protected $_pref ; // process reference protected static $_instance = null; protected $_pipes ; private function __construct() { $this ->_pref = 0; } public static function getInstance( $file ) { if (null == self:: $_instance ) { self:: $_instance = new self; } $descriptor = array ( 0 => array ( "pipe" , "r" ), 1 => array ( "pipe" , "w" ), 2 => array ( "file" , "./error-output.txt" , "a" ), ); self:: $_instance ->_pref = proc_open( "php -q $file" , $descriptor , self:: $_instance ->_pipes); return true; } public function __destruct() { proc_close( $this ->_pref); $this ->_pref = null; } } // 测试代码 $file = __FILE__ ; if ( empty ( $argv [1])) { $t2 = Thread::getInstance( "$file 1" ); $t3 = Thread::getInstance( "$file 2" ); $t4 = Thread::getInstance( "$file 3" ); $t5 = Thread::getInstance( "$file 4" ); $t5 = Thread::getInstance( "$file 5" ); $t5 = Thread::getInstance( "$file 6" ); $t2 = Thread::getInstance( "$file 7" ); $t3 = Thread::getInstance( "$file 8" ); $t4 = Thread::getInstance( "$file 9" ); $t5 = Thread::getInstance( "$file 10" ); $t5 = Thread::getInstance( "$file 11" ); $t5 = Thread::getInstance( "$file 12" ); echo "Main thread done\n" ; } else { $somecontent = "\r\n//~~~~~~~~~~~~-这次请求序号是:" . $argv [1]; sleep(mt_rand(0, 3)); $handle = fopen ( $file , 'a+' ); fwrite( $handle , $somecontent ); } |