【问题标题】:How to speed up file_get_contents()? or any alternative way如何加快 file_get_contents()?或任何替代方式
【发布时间】:2013-07-13 08:44:54
【问题描述】:

我有一个网站抓取项目。看这段代码:

<?php
include('db.php');
$r = mysql_query("SELECT * FROM urltable");
$rows=  mysql_num_rows($r);
for ($j = 0; $j <$rows; ++$j) {
$row = mysql_fetch_row($r);
$html = file_get_contents(mysql_result($r,$j,'url'));
$file = fopen($j.".txt", "w");
fwrite($file,$html);
fclose($file);
}
?>

我有一个网址列表。此代码意味着,使用每个 url 中的内容(HTML)制作文本文件。

运行这段代码时,我每秒只能制作一个文件[每个文件大小~20KB]。我的互联网提供 3mbps 的下载速度,但我无法通过此代码使用该速度。

如何加快file_get_contents() 的速度?或者如何使用线程或配置 php.ini 文件或任何其他方法加速此代码?

【问题讨论】:

标签: php performance download file-get-contents


【解决方案1】:

由于这不是重复页面上的建议之一,我将在此处添加。

仔细查看 Curl Multi PHP Manual page

它并不完全直截了当,但一旦你让它运行得非常快。 基本上,您发出多个 curl 请求,然后在返回时收集返回的数据。它以任何顺序返回,因此需要一些控制。 我在数据收集过程中使用了它,将 3-4 小时的处理时间减少到 30 分钟。

唯一的问题可能是您淹没了一个包含多个请求的网站,而所有者认为这是一个问题并禁止您访问。但是,在您的进程中添加一些明智的 sleep()'ing,您应该能够将这种可能性降至最低。

【讨论】:

  • 不超载一个站点是这里的主要问题。如果涉及多个域,则对这些域的请求应该是随机的,例如不要遍历第一个域,然后是第二个等,而是混合它们。这样,性能也会得到提高。
【解决方案2】:

您可以在流中添加一些控件。 但是如果可以的话,cURL 应该会更好。

$stream_options = array(
    'http' => array(
    'method' => 'GET',
    'header' => 'Accept-language: en',
    'timeout' => 30,
    'ignore_errors' => true,
));
$stream_context = stream_context_create($stream_options);
$fc = file_get_contents($url, false, $stream_context);

【讨论】:

    猜你喜欢
    • 2012-11-20
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 2014-01-28
    • 2011-04-28
    相关资源
    最近更新 更多