5

正在寻找stackoverflow的解决方案,但找不到任何接近我想要实现的东西。也许我只是幸福地没有意识到每个人都在解决这个问题的一些神奇的 PHP 酱...... ;)

基本上我有一个数组,包含几百个 URL,指向远程服务器上的不同 XML 文件。我正在做一些神奇的文件检查以查看 XML 文件的内容是否已更改,如果更改了,我会将更新的 XML 下载到我的服务器。

PHP代码:

$urls = array(
    'http://stackoverflow.com/a-really-nice-file.xml',
    'http://stackoverflow.com/another-cool-file2.xml'
);
foreach($urls as $url){
    set_time_limit(0);
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_FAILONERROR, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, false);
    $contents = curl_exec($ch);
    curl_close($ch);
    file_put_contents($filename, $contents);
}

现在, $filename 设置在其他地方,并根据我的逻辑为每个 xml 提供它自己的 ID。到目前为止,该脚本运行良好,并且运行正常,但运行速度非常慢。我知道我的服务器可以处理更多,我怀疑我的 foreach 正在减慢这个过程。

有什么办法可以加快 foreach 的速度吗?目前我正在考虑将每个 foreach 循环中的 file_put_contents 提高到 10 或 20,基本上将我的执行时间缩短了 10 或 20 倍,但想不出如何以最佳和最高性能的方式来解决这个问题。有关如何进行的任何帮助或指示?

4

3 回答 3

6

您的瓶颈(很可能)是您的 curl 请求,您只能在每个请求完成后写入文件,没有办法(在单个脚本中)加速该过程。

我不知道这一切是如何工作的,但您可以并行执行 curl 请求:http: //php.net/manual/en/function.curl-multi-exec.php

也许您可以获取数据(如果有可用的内存来存储它),然后在它们完成时填写数据。

于 2012-10-05T23:38:38.853 回答
2

只需运行更多脚本。每个脚本都会下载一些 url。

您可以在此处获取有关此模式的更多信息:http ://en.wikipedia.org/wiki/Thread_pool_pattern

您运行的脚本越多,您获得的并行度就越多

于 2012-10-05T23:07:57.563 回答
0

我在并行请求上使用 guzzle pool ;)(您可以发送 x 并行请求)

http://docs.guzzlephp.org/en/stable/quickstart.html

于 2017-12-15T11:35:27.747 回答