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