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

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

    

  

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