并行运行file_put_contents?

时间:2012-10-05 22:58:02

标签: php arrays curl foreach

正在搜索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倍,但是无法想到如何以最佳和最佳性能方式处理它。有关如何进行的任何帮助或指示?

3 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

我用paralel请求guzzle pool;)(你可以发送x paralel请求)

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