Почему file_get_contents занимает так много времени? - PullRequest
0 голосов
/ 08 июня 2009

Я делаю запрос AJAX POST к PHP-скрипту на моем сервере. Этот скрипт, в свою очередь, выполняет GET-запрос к php-скрипту на внешнем сервере, чтобы проверить содержимое текстового файла. Тем не менее, это займет очень много времени, чтобы вернуться с результатом. Почему дело?

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 ]

1 голос
/ 08 июня 2009

Вам не нужно выбирать маршрут по 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);
1 голос
/ 08 июня 2009

Задержка сети и перегрузка ЦП, вероятно, являются основными факторами задержки.

Каждый раз, когда вы открываете новое соединение, у вас есть накладные расходы на открытие соединения, а также сниженная скорость передачи (в отличие от чтения файла напрямую).

Также касается вашего "другого" AJAX-запроса, выполнение которого занимает некоторое время ... На самом деле это может повлиять на все остальное в системе. Если для его завершения требуется много времени, можно с уверенностью сказать, что он потребляет много ресурсов ЦП или диска. Любой такой интенсивный процесс может повлиять на все остальное в системе. Особенно, если вы работаете с одними и теми же файлами или таблицами базы данных, вы можете перегрузить свою файловую систему или базу данных в это время.

Трудно сказать, в чем проблема, не видя ее, вы должны рассчитывать каждый элемент вашей системы и следить за загрузкой процессора и памяти во время запросов. Попробуйте выяснить, где находится узкое место.

0 голосов
/ 22 мая 2014

Проверьте настройки DNS на вашем сервере. На нашем сервере у нас случайно был неверный IP-адрес в качестве основного DNS-сервера. При выполнении HTTP-запросов (с использованием file_get_contents, curl или wget) задержка составляла 5 секунд. Сервер пытался подключиться к первому DNS-серверу и отказывал, затем вместо этого использовал второй настроенный DNS-сервер.

В моем случае эти 5 секунд стали полными 30-40 секундами, поскольку мой скрипт выполнял несколько HTTP-запросов подряд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...