Zend Framework 1.12中的Http客户端太慢了

时间:2013-07-03 09:56:32

标签: php zend-framework zend-http-client zend-dom-query

我想将~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');         //
}

有什么方法可以加快速度吗?

2 个答案:

答案 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

}

[...]