博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php多进程pcntl学习(采集新浪微博)
阅读量:6291 次
发布时间:2019-06-22

本文共 1265 字,大约阅读时间需要 4 分钟。

  上面2篇文都简明了多进程中一些需要注意的地方,这次用多进程配合curl_mulit_*来做新浪微博的采集。

  先把知识点和值得注意的坑列出

/*需求:开3个进程,并且模拟多线程来采集新浪微博用户信息,cookie用本博客模拟登陆微博文章生成的cookie知识要点:1.需要把抓去过的 url放在容器里,请求前比对下即可避免重复抓取。(此程序没有判断,本人比较懒,哎)2.容器不能为变量,开多个进程会出现问题,因为进程之间数据独立,无法共享。可以使用shmop共享内存实现(cli不支持模式APC扩展)3.curl发送http请求,抓取的数据通过正则(也可以使用phpQuery第三方库),放入数据库。4.正则 正则中3个\(即\\\)匹配一个\*//* * 值得注意的是: 在多进程中使用单例模式会报错 (变量无法共享,比如redis链接,有多少个进程就要创建多少个进程。) * 参考: * https://segmentfault.com/q/1010000005023297 * http://blog.csdn.net/towardsyoung/article/details/49245933 */

主要的执行代码如下:  

1 for ($j=0;$j<3;$j++){ 2  3     $pid = pcntl_fork(); 4  5     if ($pid == 0){ 6  7         //$redis = cache::get(); 无法单利模式 ->PHP Fatal error:  Uncaught exception 'RedisException' with message 'read error on connection' 8         $redis = new Redis(); 9         $redis->connect('127.0.0.1');10 11         $spider->setRedis($redis);12 13         while (true){14 15             if ($redis->setnx('job',1)==1) {
//加锁16 17 $spider->friend();18 $count = $redis->incr(1);19 file_put_contents('count2.log',$count);20 }21 }22 exit();23 }24 }

  ps:当url多的时候,redis的hMset会报错 send 太大的数据。这里就不解决了,不影响正常使用。

  整个实例下载:http://files.cnblogs.com/files/loveyouyou616/caiji.zip

    

  

你可能感兴趣的文章
Ruby中类 模块 单例方法 总结
查看>>
jQuery的validate插件
查看>>
5-4 8 管道符 作业控制 shell变量 环境变量配置
查看>>
Enumberable
查看>>
开发者论坛一周精粹(第五十四期) 求购备案服务号1枚!
查看>>
validate表单验证及自定义方法
查看>>
javascript 中出现missing ) after argument list的错误
查看>>
使用Swagger2构建强大的RESTful API文档(2)(二十三)
查看>>
Docker容器启动报WARNING: IPv4 forwarding is disabled. Networking will not work
查看>>
(转)第三方支付参与者
查看>>
程序员修炼之道读后感2
查看>>
DWR实现服务器向客户端推送消息
查看>>
js中forEach的用法
查看>>
Docker之功能汇总
查看>>
!!a标签和button按钮只允许点击一次,防止重复提交
查看>>
(轉貼) Eclipse + CDT + MinGW 安裝方法 (C/C++) (gcc) (g++) (OS) (Windows)
查看>>
还原数据库
查看>>
作业调度框架 Quartz.NET 2.0 beta 发布
查看>>
mysql性能的检查和调优方法
查看>>
项目管理中的导向性
查看>>