У меня есть рабочий сценарий, который копирует и переименовывает файлы из одного подключенного сетевого ресурса в другой (оба CIFS), и иногда функция copy
зависает на неопределенный срок при считывании ввода-вывода, переводя процесс в непрерывный режим сна, где его можно только уничтожитьс SIGKILL.
(К счастью, TASK_KILLABLE, по-видимому.)
Поскольку операция блокируется при вызове copy
, я не могу корректно обработать сбой ввода-вывода и, что более важно, зарегистрировать его.
$res = copy("/path/to/mount/file.pdf", "/path/to/productionqueue/newfile.pdf");
//This doesn't run because of the process state.
if($res) {
//Report success to the log.
} else {
//Report failure to the log.
}
Это среда, проблема, связанная с файлом, и ручное вмешательство может исправить ее, но мне нужно зарегистрировать ошибку, чтобы администратор мог быть уведомлен об этом состоянии.(Помимо: я думаю, что это состояние блокировки гонки. Я могу решить эту проблему, размонтировав и повторно установив исходный ресурс, но воспроизвести его немного проблематично.)
В идеале мне бы хотелось copy
вызов тайм-аута через 10 секунд, так что я могу записать ошибку, но, похоже, в PHP нет способа сделать это.
Что я рассматриваю, так это делегирование операций копирования или чтения вПодпроцесс отслеживается командой timeout
и отвечает на основании кодов завершения, но есть ли в сценарии PHP более простой способ обработки такого сценария?
Все, что я нашел в своем поиске, предполагает, что есть толькоКонфигурация времени выполнения доступна для сокетов / сетевых таймаутов, а не вызовов файловой системы.