php多进程pcntl学习(采集新浪微博)
2016-07-08 09:56
951 查看
上面2篇文都简明了多进程中一些需要注意的地方,这次用多进程配合curl_mulit_*来做新浪微博的采集。
先把知识点和值得注意的坑列出
主要的执行代码如下:
ps:当url多的时候,redis的hMset会报错 send 太大的数据。这里就不解决了,不影响正常使用。
整个实例下载:http://files.cnblogs.com/files/loveyouyou616/caiji.zip
先把知识点和值得注意的坑列出
/* 需求:开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 */
主要的执行代码如下:
for ($j=0;$j<3;$j++){ $pid = pcntl_fork(); if ($pid == 0){ //$redis = cache::get(); 无法单利模式 ->PHP Fatal error: Uncaught exception 'RedisException' with message 'read error on connection' $redis = new Redis(); $redis->connect('127.0.0.1'); $spider->setRedis($redis); while (true){ if ($redis->setnx('job',1)==1) {//加锁 $spider->friend(); $count = $redis->incr(1); file_put_contents('count2.log',$count); } } exit(); } }
ps:当url多的时候,redis的hMset会报错 send 太大的数据。这里就不解决了,不影响正常使用。
整个实例下载:http://files.cnblogs.com/files/loveyouyou616/caiji.zip
相关文章推荐
- php文件上传
- 我的简单PHP框架——LabPHP v1.0.1
- Yii2.0MVC中的view笔记
- Ftp端口详解及修改
- layer2-STP_BPDU特性
- nfs,ftp,telnet区别
- Yii框架开发问题总结
- php多进程pcntl学习(二)
- layer2-RSTP和MSTP
- Win8上搭建IIS8+PHP+MySQL+phpMyAdmin
- ViewGroup.LayoutParams设置setMargins
- php的运行方式及vc6和vc9,ts和nts区别
- vsftp搭建方法
- php实现批量删除挂马文件及批量替换页面内容完整实例
- PHP线程的内存回收问题
- EditPlus的编码自动完成功能及配置文件下载
- Layer2-STP生成树协议
- Layer2交换机QinQ和VTP
- Layer2-3 VLAN和DTP
- 【腾讯云】腾讯云服务器搭建ftp服务器