本文以实例简单解析了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 );
}
|