Использует ли file_get_contents кеш? Если это так, как я могу предотвратить?

С этим кодом:

for($i = 1; $i <= $times; $i++){
$milliseconds = round(microtime(true) * 1000);
$res = file_get_contents($url);
$milliseconds2 = round(microtime(true) * 1000);

$milisecondsCount = $milliseconds2 - $milliseconds;
echo 'miliseconds=' . $milisecondsCount . ' ms' . "\n";
}

Я получаю этот вывод:

miliseconds=1048 ms
miliseconds=169 ms
miliseconds=229 ms
miliseconds=209 ms
....

Но со сном

for($i = 1; $i <= $times; $i++){
$milliseconds = round(microtime(true) * 1000);
$res = file_get_contents($url);
$milliseconds2 = round(microtime(true) * 1000);

$milisecondsCount = $milliseconds2 - $milliseconds;
echo 'miliseconds=' . $milisecondsCount . ' ms' . "\n";
sleep(2);
}

Это :

miliseconds=1172 ms
miliseconds=1157 ms
miliseconds=1638 ms
....

Так что здесь происходит?

1

Решение

Мои вопросы:

1) Почему бы вам не проверить это самостоятельно, используя clearstatcache и проверять время подписи с и без него?

2) Ваш метод тестирования ужасен, как первое исправление — пробовали ли вы менять местами, чтобы функция чтения из «сна» воспроизводилась первой, а не второй?

3) Сколько итераций вашего теста вы сделали?
Если оно меньше 10 000, я предлагаю вам повторить тесты, чтобы сначала определить среднюю задержку (или ее отсутствие), а затем, что заставляет вас думать, что это вызвано именно кешированием?

4) Каковы спецификации. вашей машины, вашей оперативной памяти и свободной и доступной памяти на каждой итерации?

5) Ваш сервер жив? Можете ли вы удалить внешние службы в качестве возможных причин временного неравенства? (например, антивирус, загрузка фоновых процессов, трафик сервера и т. д. и т. д.)?

Мой ответ:

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

Многократный вызов ссылки на файл только прочитает файл
с диска один раз, последующие вызовы будут читать значение из
статическая переменная внутри функции. Обратите внимание, что вы не должны рассчитывать на
этот подход для больших файлов или тех, которые используются только один раз на страницу, так как
память, используемая статической переменной, будет сохраняться до конца
запрос. Хранение содержимого файлов без необходимости в статическом
Переменные — это хороший способ превратить ваш скрипт в память.

Цитируется из Этот ответ.

  • Для удаленных (не локальных файловых систем) файлов существует так много возможных причин переменных задержек, которые на самом деле file_get_contents Кэширование — долгий путь вниз по списку опций.

  • Как вы утверждаете, что подключение с помощью localhost/ ссылочная структура, я бы рискнул (но не уверен), что ваш сервер будет использовать различные брандмауэры и методы проверки для проверки входящего запроса, который добавит большую переменную к затраченному времени.

1

Другие решения

Объединить случайную строку запроса с URL.
Например: $url = 'http://example.com/file.html?r=' . rand(0, 9999);

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector