我想将~50个请求发送到同一个域的不同页面然后,我正在使用DOM对象获取文章的URL。
问题是这个请求数超过30秒。
for ($i = 1; $i < 51; $i++)
{
$url = 'http://example.com/page/'.$i.'/';
$client = new Zend_Http_Client($url);
$response = $client->request();
$dom = new Zend_Dom_Query($response); // without this two lines, execution is also too long
$results = $dom->query('li'); //
}
有什么方法可以加快速度吗?
答案 0 :(得分:1)
我想不出加快速度的方法,但如果你担心这个问题,可以增加PHP的超时限制:
for($i=1; $i<51; $i++) {
set_time_limit(30); //This restarts the timer to 30 seconds starting now
//Do long things here
}
答案 1 :(得分:1)
这是设计中的一个问题 - 而不是代码本身。如果你正在进行一个超过50个项目的for循环,每个项目都向远程uri打开一个请求,事情变得非常缓慢,因为每个请求都会等待,直到从远程uri响应。例如:一个请求需要大约0.6秒完成,多达50个,你得到的执行时间为30秒!
其他问题是大多数网络服务器将每个客户端的(开放)连接限制为特定数量。因此,即使您能够同时执行50个请求(当前不是这样),事情也不会明显加快。
在我的选项中,只有一个解决方案(没有任何深刻的变化): 更改每次执行请求的数量。从例如制作块只有5 - 10每(脚本) - 调用并通过外部调用触发它们(例如由cron运行它们)。
TODO: 构建一个包装函数,它能够保存当前运行的状态(“我在上次运行时请求1 - 10,所以现在我必须调用11 - 20)到文件或数据库中并通过cron触发此功能
示例代码(未经测试)以获得更好的声明;
[...]
private static $_chunks = 10; //amout of calls per run
public function cronAction() {
$lastrun = //here get last run parameter saved from local file or database
$this->crawl($lastrun);
}
private function crawl($lastrun) {
$limit = $this->_chunks + $lastrun;
for ($i = $lastrun; $i < limit; $i++)
{
[...] //do stuff here
}
//here set $lastrun parameter to new value inside local file / database
}
[...]