Как установить тайм-аут для записи в медленную файловую систему в PHP? - PullRequest
0 голосов
/ 30 октября 2019

Я хочу записать в файл из PHP и установить тайм-аут для этой операции на 5 секунд.

Я пишу скрипт PHP, чтобы проверить, установлен ли подключенный сервер NFS. доступно для записи. Мне нужно уведомление, если оно недоступно. Если сервер NFS отключен, различные способы попытки записи на него сразу же потерпят неудачу, и я смогу легко отправить предупреждение. Пока проблем нет.

Но когда он медленный (возможно, из-за перегрузки полосы пропускания или нагрузки на сервер), простой подход, такой как file_put_contents(), может занять несколько минут, так как он не работает по таймауту и ​​в конечном итоге завершается успешно.

Я пробовал различные combinations of file_get_contents(), fwrite(), stream_set_timeout(), ini_set('default_socket_timeout', 5), но безуспешно.

Можно ли установить тайм-аут для записи в файл? Если да, то как?


Вот пример того, что я пробовал:

<?php

$f = '/path/to/file';
$test = 'some large string';

$fp = fopen($f , 'w', false, $ctx);

if (!$fp) {
    echo "Unable to open\n";
} else {

    stream_set_timeout($fp, 0, 1000);
    fwrite($fp, $text);

    $info = stream_get_meta_data($fp);
    print_r($info);
    fclose($fp);

    if ($info['timed_out']) {
        echo 'Connection timed out!';
    }
}

/*
Outputs:
Array
(
    [timed_out] =>
    [blocked] => 1
    [eof] =>
    [wrapper_type] => plainfile
    [stream_type] => STDIO
    [mode] => w
    [unread_bytes] => 0
    [seekable] => 1
    [uri] => /path/to/file
)
*/
...