Есть ли способ установить тайм-аут для file_exists или любой другой функции?

Я запускаю веб-сайт, где мы обслуживаем большое количество файлов из папки, установленной над Fuse (cloudfuse - контейнер Rackspace Cloudfiles), он отлично работает большую часть времени, однако время от времени соединение с плавким предохранителем и все мои процессы Apache зависают, ожидая возврата функции file_exists().

Мой вопрос: есть ли когда-либо установить тайм-аут для определенной функции или использовать другую функцию, чтобы проверить, существует ли файл, но возвращать с функцией false, если функция занимает больше времени, чем x секунд?

4 ответа

Я думаю, что file_exists() является только простой функцией и не предназначен для таких операций.

Обходной путь №1 (довольно элегантный)

  • сделать пакетный файл, который проверяет, существует файл
  • используйте system() для выполнения вашего командного файла и результата анализа

Обходной путь №2 (более простой, не элегантный вообще)

  • создайте файл script file_exists.php? file =... возвращающую строку "TRUE" или "FALSE", если существует файл $_GET ['file']. Установите time_limit в этом файле на 1 секунду.
  • получить результаты с помощью fsockopen ('http://localhost/file_exists.php? file ='. $file,...,..., 2) и проанализировать результаты. (пустой или FALSE = файл не существует). 2 - тайм-аут fsockopen. Вы можете использовать систему ('/usr/bin/php/path/to/your/script.php'), а также


Вы можете попробовать:

function file_exists_timeout($file, $timeout) { // try with both, as i mentioned in comment // this is just a shot :( maybe it will works for you ini_set('default_socket_timeout', $timeout); stream_set_timeout($timeout); $file = fopen($file, 'r'); if($file) { fclose($file); return true; }else{ return false; } }

но я не уверен, что он сработает для вас.


Я думаю, вы можете запустить script для сканирования всех файлов в смонтированном облачном флеше, (обычно это будет cronjob)

затем сохранил результаты в хранилище (memcache, database и т.д.), впоследствии ваш PHP script может использовать результаты

чтобы сохранить результат сканирования в актуальном состоянии, вы можете добавить аддон для обновления результатов при обновлении файлов/добавлении/удалении


Вы можете использовать PHP set_time_limit, чтобы ограничить время выполнения "родительского" script. http://php.net/manual/en/function.set-time-limit.php

licensed under cc by-sa 3.0 with attribution.