PHP使用PCNTL系列的函数也能做到多进程处理一个事务。比如我需要从数据库中获取80w条的数据,再做一系列后续的处理,这个时候,用单进程?你可以等到明年今天了。。。所以应该使用pcntl函数了。
假设我想要启动20个进程,将1-80w的数据分成20份来做,主进程等待所有子进程都结束了才退出:
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
<code>$max</code> <code>= 800000;</code>
<code>$workers</code> <code>= 20;</code>
<code>$pids</code> <code>=</code><code>array</code><code>();</code>
<code>for</code><code>(</code><code>$i</code> <code>= 0;</code><code>$i</code> <code><</code><code>$workers</code><code>;</code><code>$i</code><code>++){</code>
<code> </code><code>$pids</code><code>[</code><code>$i</code><code>] = pcntl_fork();</code>
<code> </code><code>switch</code> <code>(</code><code>$pids</code><code>[</code><code>$i</code><code>]) {</code>
<code> </code><code>case</code> <code>-1:</code>
<code> </code><code>echo</code> <code>"fork error : {$i} \r\n"</code><code>;</code>
<code> </code><code>exit</code><code>;</code>
<code> </code><code>case</code> <code>0:</code>
<code> </code><code>$param</code> <code>=</code><code>array</code><code>(</code>
<code> </code><code>'lastid'</code> <code>=></code><code>$max</code> <code>/</code><code>$workers</code> <code>*</code><code>$i</code><code>,</code>
<code> </code><code>'maxid'</code> <code>=></code><code>$max</code> <code>/</code><code>$workers</code> <code>* (</code><code>$i</code><code>+1),</code>
<code> </code><code>);</code>
<code> </code><code>$this</code><code>->executeWorker(</code><code>$input</code><code>,</code><code>$output</code><code>,</code><code>$param</code><code>);</code>
<code> </code><code>default</code><code>:</code>
<code> </code><code>break</code><code>;</code>
<code> </code><code>}</code>
<code>}</code>
<code>foreach</code> <code>(</code><code>$pids</code> <code>as</code> <code>$i</code> <code>=></code><code>$pid</code><code>) {</code>
<code> </code><code>if</code><code>(</code><code>$pid</code><code>) {</code>
<code> </code><code>pcntl_waitpid(</code><code>$pid</code><code>,</code><code>$status</code><code>);</code>
这里当pcntl_fork出来以后,会返回一个pid值,这个pid在子进程中看是0,在父进程中看是子进程的pid(>0),如果pid为-1说明fork出错了。
使用一个$pids数组就可以让主进程等候所有进程完结之后再结束了
本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/p/3217615.html,如需转载请自行联系原作者