首页 > Web开发 > 详细

php多进程pcntl学习(采集新浪微博)

时间:2016-07-08 10:20:19      阅读:241      评论:0      收藏:0      [点我收藏+]

  上面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

    

  

php多进程pcntl学习(采集新浪微博)

原文:http://www.cnblogs.com/loveyouyou616/p/5652367.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!