为什么file_get_contents需要这么长时间?

时间:2009-06-08 16:03:10

标签: php ajax file

我对我服务器上的PHP脚本发出AJAX POST请求。该脚本反过来向外部服务器上的php脚本发出GET请求,以检查文本文件的内容。但是,返回结果需要很长时间。为什么会这样?

AJAX在我的服务器上发布脚本请求

session_start();
$fileName = $_POST['textFile'];
$result = file_get_contents($_SESSION['serverURL']."fileReader.php?textFile=$fileName");
echo $result;

GET请求不同服务器上的脚本

$fileName = $_GET['textFile'];

if (file_exists('text/'.$fileName.'.txt')) {

    $lines = file('text/'.$fileName.'.txt');

    echo $lines[sizeof($lines)-1];

}
else{
    echo 0;
}

这些是非常简单的脚本,它只检查一个非常小的文本文件,为什么需要这么长时间呢?

我正在我的网站上发出其他AJAX请求,但这些肯定不会导致问题。话虽如此,该文本文件的返回值总是伴随着另一个AJAX请求的完成,该请求启动了在我的服务器上完成需要一段时间的脚本,但这些会如何相互影响?!他们不应该对吗?

3 个答案:

答案 0 :(得分:1)

网络延迟和CPU过载可能是延迟的最大因素。

每次打开新连接时,都会有打开连接的开销,以及降低的传输速率(而不是直接读取文件)。

另外关于你的“其他”AJAX请求需要一段时间才能完成......这实际上可能会影响系统上的其他所有内容。如果需要很长时间才能完成,可以说它占用了大量CPU或磁盘带宽。像这样的任何密集过程都会影响系统上的其他所有过程。特别是如果您使用相同的文件或数据库表,那么您可以在此时颠倒您的文件系统或数据库。

如果没有看到问题就很难说出问题是什么,你应该为系统的每个部分计时,并在请求期间监控CPU和内存负载。试着找出瓶颈所在。

答案 1 :(得分:1)

您不必通过HTTP获取路由来获取文件的最后一行。为什么不留在文件系统中并使用类似的函数来检索最后一行:

function fileGetLine($filename, $line) {
    if (!is_file($filename) || !is_readable($filename)) {
        // invalid file name or not readable
        return false;
    }
    if (!is_int($line)) {
        // invalid line number
        return false;
    }
    $lines = file($filename);
    $lineCount = count($lines);
    if ($line < 0) {
        // negative line number, count from end
        $line = $lineCount + $line;
    }
    if ($line < 0 || $line >= $lineCount) {
        // line number out of bounds
        return false;
    }
    return $lines[$line];
}

session_start();
echo fileGetLine('text/'.basename($_POST['textFile']).'.txt', -1);

答案 2 :(得分:0)

检查服务器上的DNS设置。在我们的服务器上,我们意外地将IP地址作为主DNS服务器。在发出HTTP请求时(使用file_get_contentscurlwget),有5秒的延迟。服务器试图到达第一个DNS服务器并失败,然后改为使用第二个配置的DNS服务器。

在我的情况下,由于我的脚本连续多次发出HTTP请求,因此这5秒变为了整整30-40秒。