PHP file_get_contents timeout & quot; локальный файл & quot; (NFS / монтаж)

Я хотел бы знать, как установить тайм-аут для локального файла с file_get_content (не HTTP URI),
Иногда раздел монтирования NFS очень медленный, и я предпочитаю сдаваться через некоторое время (например, 5 секунд),

file_get_contents("/mnt/photo/photo.jpg");

Я читаю ответы на другие подобные вопросы, но думаю, что решения работают только с HTTP, а не для локальных файлов:

$ctx = stream_context_create(array('http'=>array('timeout' => 1200)));

Я также полагаю, что это решение не для меня, это также для Web, верно?

ini_set('default_socket_timeout', 900);

2

Решение

Боюсь, вы не можете контролировать тайм-ауты NFS через PHP, так как параметры протокола NFS контролируются только через параметры монтирования. PHP не знает, находится ли файл в NFS или на локальном жестком диске. Я считаю, что есть способы определить факт наличия файла в NFS, но это не даст нам контроль над таймаутами.

В NFS есть два типа таймаутов: незначительный а также основной. Незначительное время ожидания возникает, когда с сервера не получено подтверждение в течение времени ожидания, указанного в параметрах монтирования (timeo). Затем операция повторяется, и время ожидания удваивается. Основной таймаут происходит, когда интервал тайм-аута достигает 60 секунд. Что будет дальше, зависит от других вариантов.

По умолчанию исходное время ожидания удваивается, а повторные попытки продолжаются бесконечно. Говорят, что объем жестко установлен (hard опция включена по умолчанию). Если том смонтирован с soft опция, большой тайм-аут вызовет ошибку ввода-вывода. Вы должны рассмотреть мягкий монтаж. Тем не менее, обратите внимание, что время ожидания по умолчанию только 7(0,7 секунды), что, вероятно, немного слишком мало для мягкого монтажа. Вы должны оценить возможное время ожидания и скорректировать timeo вариант соответственно.

Еще один интересный вариант intr, который должен позволять прерывание ожидающих операций NFS. Однако, эта опция устарела после версии ядра 2.6.25. Только SIGKILL может прервать операцию NFS. Вы можете захотеть реализовать сторожевой процесс, используя fork() функция. Дочерний процесс может запустить операцию NFS, а родительский процесс может убийство это через определенный промежуток времени.

1

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

Вы можете установить поток в неблокирующем режиме с помощью stream_set_blocking и попробуйте прочитать файл до истечения времени ожидания. Что-то вроде:

function readReallyBigFile($path, $timeoutSeconds = 5) {
if (false === $stream = fopen($path, "r")) {
throw new \RuntimeException('Cannot open file');
}

stream_set_blocking($stream, 0);

$timeout = time();

$contents = '';
while (!feof($stream)) {
$contents .= fread($stream, 8192);
if ((time() > $timeout + $timeoutSeconds)) {
throw new \RuntimeException('Timeout reached out');
}
}

fclose($stream);

return $contents;
}

$img = readReallyBigFile('/mnt/photo/photo.jpg');
1

По вопросам рекламы [email protected]