多进程中数据独立,变量无法共享,所以可以使用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: 不知道上面代码是否有坑,像我这样野生码农涉及点深的东西 就可能会出现各种坑。