PHP执行采集任务,程序写的步骤是
1.先从数据库中提取出url,
2.php远程获取URL标题title,通过http下载远程网址。
3.下载完之后下载另外一个网站B的数据,http。
4.下载完之后再次下载另外一个站C的数据,http。
5.每条记录总共下载远程四个网站A、B、C、D的数据后更新数据表的对应记录,然后循环下一条记录。
结果的现象是:
如果刷新一次页面一次10条都一直在加载,但是却始终都没有完成一条(三个小时候过去了,一条都没有完成)。
但是如果每次只操作一条,却很快的就完成了。一直难以明白,代码都没有改过。
1.先从数据库中提取出url,
2.php远程获取URL标题title,通过http下载远程网址。
3.下载完之后下载另外一个网站B的数据,http。
4.下载完之后再次下载另外一个站C的数据,http。
5.每条记录总共下载远程四个网站A、B、C、D的数据后更新数据表的对应记录,然后循环下一条记录。
结果的现象是:
如果刷新一次页面一次10条都一直在加载,但是却始终都没有完成一条(三个小时候过去了,一条都没有完成)。
但是如果每次只操作一条,却很快的就完成了。一直难以明白,代码都没有改过。
没有停止,就是很慢,统计出来的都是远程获取这里非常慢。如果对方网站有time out,那更会慢。但是如果一条条的请求就还勉强不超过10s(如果对方网站快的话那就不超过1s)。
用的是dedecms的下载的类。php的fsocket的-- ORDER BY alltaken DESC +-----+---------------------------------+----------------+--------------+--------------+---------------+--------------+----------------+
| id | CONCAT(LEFT(indexurl,8),'****') | siteA | BsiteUse | CsiteUse | DsiteUse | SelfsiteUse | alltakenS |
+-----+---------------------------------+----------------+--------------+--------------+---------------+--------------+----------------+
| 116 | http://w**** | 312.6209980000 | 0.1027460000 | 0.7083260000 | 0.1019220000 | 0.0001310000 | 313.5347100000 |
| 192 | http://b**** | 131.7439090000 | 0.1065950000 | 0.1032040000 | 0.1218960000 | 0.0001460000 | 132.0764180000 |
| 208 | http://p**** | 129.1037910000 | 0.1067140000 | 1.9131520000 | 0.0999170000 | 0.0001550000 | 131.2365740000 |
| 274 | http://w**** | 128.9867080000 | 0.0914060000 | 0.2133490000 | 0.0072880000 | 0.0001290000 | 129.2995460000 |
| 72 | http://w**** | 121.8476540000 | 0.3580050000 | 0.8115200000 | 0.1271520000 | 0.0001290000 | 123.1452500000 |
| 136 | http://b**** | 120.3886700000 | 0.0976120000 | 1.2840520000 | 0.2518970000 | 0.0001520000 | 122.0230590000 |
| 133 | http://b**** | 105.1644020000 | 0.1114830000 | 0.1085140000 | 0.1326280000 | 0.0001610000 | 105.5177820000 |
| 42 | http://w**** | 104.3177670000 | 0.1232750000 | 0.2724820000 | 0.1189370000 | 0.0001350000 | 104.8334620000 |
| 120 | http://s**** | 65.3187010000 | 0.2496840000 | 1.4335560000 | 0.1150520000 | 0.0001540000 | 67.1178350000 |
| 278 | http://b**** | 61.1772180000 | 0.1108920000 | 0.2042260000 | 0.1191600000 | 0.0001710000 | 61.6123010000 |
| 132 | http://b**** | 60.5103830000 | 0.1067460000 | 0.0922900000 | 0.1117640000 | 0.0001430000 | 60.8220210000 |
| 123 | http://w**** | 10.3734350000 | 0.0937580000 | 0.1644970000 | 40.6561520000 | 0.0001400000 | 51.2885540000 |
| 53 | http://w**** | 38.1353850000 | 0.1011540000 | 0.2341760000 | 0.1139470000 | 0.0001320000 | 38.5854690000 |
| 122 | http://w**** | 26.4192670000 | 0.0918600000 | 1.2295260000 | 0.1289520000 | 0.0001490000 | 27.8703320000 |
| 87 | http://w**** | 20.5397840000 | 0.1029720000 | 2.3649450000 | 0.1102360000 | 0.0001370000 | 23.1189480000 |
+-----+---------------------------------+----------------+--------------+--------------+---------------+--------------+----------------+
15 rows in set (0.03 sec)
用的是DEDECMS的下载类。socket方式的。文件全部源码如下:
因为写不下,所以发链接:http://blog.csdn.net/default7/article/details/8333410
用到的地方是这里:fsockopen
/**
* 打开连接
*
* @access public
* @return bool
*/
function PrivateOpenHost()
{
if($this->m_host=="")
{
return FALSE;
}
$errno = "";
$errstr = "";
$this->m_fp = @fsockopen($this->m_host, $this->m_port, $errno, $errstr,10);
if(!$this->m_fp)
{
$this->m_error = $errstr;
return FALSE;
}
else
{
return TRUE;
}
}
本地测试的,PHP采集网址indexurl的charset编码和<title>的内容,siteA就是这个indexurl对应的网站的。现在认为是indexurl这个对应的网站服务器不行导致的。现在只能用每次采集一条的方法了。
siteA就是那个indexurl对应的那个网站的。
6#楼中 “SelfsiteUse ”就是localhost本地函数运算所需要花费的。
不过就是给出了代码,也不一定有心情去看和测试
对此类应用提点我哥个人意见:
1、通常页面中都有返回到首页,返回到栏目之类的连接。
应注意排除,否则极易造成死循环
2、页面采集程序应是单一的
即运行一次,采集一个页面
3、采集控制程序用于调度页面采集程序
可用 fsockopen 打开 页面采集程序 后即可返回,目标页url只作为参数传递给页面采集程序
这样可就模拟了一个多进程系统
4、具体是实现时以数据库为中介,所有从页面中析出的url都入库(当然要排重)
采集控制程序读取数据库,以决定是否继续采集和每次采集的规模
网上找一下类似功能的function或者CLASS。
其实的discuz的curl 和 fsocket也不行,会被有的服务器判断出来是非正常访问。只有dede的那个类成功的最多。。其他的也试了,也是很慢!
还是采用每次采集获取一条的方法比较好一点。
内牛满面....师兄你成仙了啊~~自己写个采集的curl 封装一下 有多难哪...采集其实麻烦就麻烦在各种正则上的分析校对.
用的是dede的 /include/dedehttpdown.class.php采集的类。测试了很多,感觉跟对方服务器的性能有很大关系。有的域名很快,基本上可以忽略时间有的就非常卡(但是有的卡的他的域名直接使用浏览器是打开很快的)。很奇怪的问题。另外一个问题是有的域名他指向的主机是不存在的,然后程序一直在不停的执行直到超时,APACHE和CPU全都占用卡死了。后来设置了time_limit 为20,貌似缓解了不少。(用的是fsockopen)听说过那个stream创建的可以中断请求(如果对方服务器有问题的话),不过没有用,不清楚如何使用。dedehttpdown.class.php下载类:
http://blog.csdn.net/default7/article/details/8512294
你先ping一下,看看响应时间是多少。别用dedecms的那个类,自己用curl写个,很简单的。
给每个请求设置timeout。别拿自己的pc机跑,找一台配置高的服务器去跑,开多个进程,把你的任务分类,这样可以提高好几倍的效率。