天天看点

PHP的pcntl多进程

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>&lt;</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>=&gt;</code><code>$max</code> <code>/</code><code>$workers</code> <code>*</code><code>$i</code><code>,</code>

<code>                </code><code>'maxid'</code> <code>=&gt;</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>-&gt;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>=&gt;</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(&gt;0),如果pid为-1说明fork出错了。

使用一个$pids数组就可以让主进程等候所有进程完结之后再结束了

本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/p/3217615.html,如需转载请自行联系原作者