php多进程pcntl学习(二)
2024-08-27 15:06:54
多进程中数据独立,变量无法共享,所以可以使用shmop共享内存实现(cli模式不支持APC扩展),或者存储到redis这种nosql中。
下面实例,开10个进程结合redis集合,做一些简单的任务处理。
<?php
for ($i=0;$i<10;$i++){//开10个进程
$ret = pcntl_fork(); //生成进程 if ($ret == 0){ $redis = new Redis();
$redis->connect('127.0.0.1',6379); while (true){ //做一个循环,让进程反复运行 if ($redis->setnx('job',1)==1) {//加锁 if (count($redis->keys('webpub')) == 0){//集合中没有数据跳出继续循环
$redis->del('job'); //解锁
continue;
} $getjob = $redis->zRange('webpub',0,0);//取出一个
var_dump($getjob);
//开启事务
$redis->multi(); //有序集合删除
$redis->zRem('webpub',$getjob[0]);//删除
$redis->del('job'); //解锁 //执行事务代码
$redis->exec(); //下列代表为要执行的任务
file_put_contents('./job/'.$getjob[0].'.html',$getjob[0]); echo $getjob[0].' is done'.PHP_EOL; sleep(1);
}
}
}
}
上面代码 开启10个进程来处理 redis中 webpub集合中的任务,这里的任务比较简单就是生成文件。值得注意的是,为了防止多个进程之间同时处理一个任务,必须加上锁来限制。
ps: 不知道上面代码是否有坑,像我这样野生码农涉及点深的东西 就可能会出现各种坑。
最新文章
- [LeetCode] Find Right Interval 找右区间
- [LeetCode] Add Digits 加数字
- android模拟器用命令和DDMS模拟来电和短信
- android使用Webview上传图片
- FFT(1)
- Oracle 经典语法(五)
- 怎样做出通用的pos小票打印程序
- Struts的ONGL
- IBM芯片新功能:诊断癌症
- 【Linux】积累笔记
- TCP的发送系列 — tcp_sendmsg()的实现(二)
- 【转】Js正则表达式
- tomcat启动正常,但是访问项目时,404. Eclipse没有正确部署工程项目
- python+Django+test 测试数据库生成报错
- C++ DLL
- MyBatis - 1.入门
- 给新手学习Java的建议
- 最新apache多域名多站点配置
- 关于ArrayAdapter的getCount()的方法会造成空指针异常的分析
- L208