php多进程pcntl学习(二)

  多进程中数据独立,变量无法共享,所以可以使用shmop共享内存实现(cli模式不支持APC扩展),或者存储到redis这种nosql中。

  下面实例,开10个进程结合redis集合,做一些简单的任务处理。

 1 <?php
 2 for ($i=0;$i<10;$i++){//开10个进程
 3     $ret = pcntl_fork(); //生成进程
 4 
 5     if ($ret == 0){
 6 
 7         $redis = new Redis();
 8         $redis->connect('127.0.0.1',6379);
 9 
10         while (true){ //做一个循环,让进程反复运行
11 
12             if ($redis->setnx('job',1)==1) {//加锁
13 
14                 if (count($redis->keys('webpub')) == 0){//集合中没有数据跳出继续循环
15                     $redis->del('job'); //解锁
16                     continue;
17                 }
18 
19                 $getjob = $redis->zRange('webpub',0,0);//取出一个
20                 var_dump($getjob);
21                 //开启事务
22                 $redis->multi();
23 
24                 //有序集合删除
25                 $redis->zRem('webpub',$getjob[0]);//删除
26                 $redis->del('job'); //解锁
27 
28                 //执行事务代码
29                 $redis->exec();
30 
31                 //下列代表为要执行的任务
32                 file_put_contents('./job/'.$getjob[0].'.html',$getjob[0]);
33 
34                 echo $getjob[0].' is done'.PHP_EOL;
35 
36                 sleep(1);
37             }
38         }
39     }
40 }

  上面代码 开启10个进程来处理 redis中 webpub集合中的任务,这里的任务比较简单就是生成文件。值得注意的是,为了防止多个进程之间同时处理一个任务,必须加上锁来限制。

  ps: 不知道上面代码是否有坑,像我这样野生码农涉及点深的东西 就可能会出现各种坑。

原文地址:https://www.cnblogs.com/loveyouyou616/p/5652251.html