上面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 太大的数据。这里就不解决了,不影响正常使用。
整个实例下载:https://files.cnblogs.com/files/loveyouyou616/caiji.zip