Проверьте, включен ли общий ресурс NFS в PHP

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

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

Мы думаем о а) проверке сервера во время отображения страницы и скрытии части формы для загрузки файла, если сервер не работает, или б) проверке ссылки перед выполнением move_uploaded_file для сохранения загруженного документа.

Можно ли это сделать из PHP, и если да, то как?


person GordonM    schedule 12.11.2010    source источник


Ответы (4)


Оформление заказа http://www.php.net/manual/en/function.stream-set-timeout.php

Вы можете написать простую проверку, которая пытается записать в общий ресурс NFS с двухсекундным тайм-аутом. Если это удастся, перейдите к файлу move_uploaded_file. Если это не удается, дайте пользователю изящную ошибку.

person Martin Schapendonk    schedule 12.11.2010
comment
Я знаю, что это невероятно старо, но можно ли опубликовать какой-либо код для этого? Мой скрипт зависает в точке вызова fopen, поэтому я не могу установить на него stream_set_timeout. - person BT643; 15.01.2014
comment
@BT643 Ознакомьтесь с default_socket_timeout. - person Martin Schapendonk; 27.05.2014

Я не знаю, как выглядит ваша установка... Если вы ее монтируете, не могли бы вы использовать is_writable?

if (!is_writable('/path/to/nfs/share/mount')) {
   die('NFS share is not writable!');
}
person netcoder    schedule 12.11.2010

Я бы попробовал написать небольшой файл по-настоящему на nfs-mountpoint, в случае успеха вы в сети и можете записать опубликованный файл.

Если нет, кэшируйте его на диске веб-сервера для последующего (автоматического) сохранения.

person Teson    schedule 12.11.2010

Проверьте, можете ли вы opendir() каталог?

<?php
$dir = "/etc/php5/";

// Open a known directory, and proceed to read its contents
if (is_dir($dir)) {
    if ($dh = opendir($dir)) {
        // do your stuff
        closedir($dh);
    }
}
?>
person Surfrdan    schedule 12.11.2010