• 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

        

      

  • 相关阅读:
    1113.层级 Walker
    118.防止高度塌陷 Walker
    1114.实战移入切换 Walker
    116.清除浮动 Walker
    Vue使用——vue设置浏览器显示图标
    MFC如何高效地绘图(转)
    Ugly Windows HDU2487 ACM算法设计
    CImage类的介绍与使用 【图像打开,另存为,转为灰度图像(利用cimage方法实现)】
    Ogre 3D 配置
    WPF文本框只允许输入数字[转]
  • 原文地址:https://www.cnblogs.com/loveyouyou616/p/5652367.html
Copyright © 2020-2023  润新知