2013-12-23 2 views
-1

У меня есть сценарий, который я сделал до сих пор, который ищет указанный файл в текущем каталоге, и если его там нет, он перейдет в каталог и снова начнет поиск.Найти и открыть файл

Если файл существует, сценарий отлично работает, однако, если он не выполняется, пока сценарий не будет отменен дольше 30 секунд, даже если счетчик ограничивает выполнение на месте.

$path = 'log.log'; 

$file_exists = 0; 

$search_count = 0; 
$search_limit = 3; 

while($file_exists == 0) { 
    while($search_count < $search_limit) { 
     if(file_exists($path)) { 
      $file_exists = 1; 
      $search_count = $search_limit + 1; 

      $resource = fopen($path, "r"); 
      while (!feof($resource)) { 
       echo fgetss($resource); 
      } 
      fclose($resource); 
     } else { 
      $path = '../'.$path; 
      $search_count++; 
     } 
    } 
} 
+0

Если файл не существует, внешнее while бесконечно, потому что '$ file_exists = 1;' никогда не вызывается. –

ответ

0

Я думаю, что вы ищете что-то вроде этого:

$path = 'log.log'; 
$file_exists = false; 
$search_count = 0; 
$search_limit = 3; 

while (!$file_exists and $search_count < $search_limit) { 
    if(file_exists($path)) { 
     $file_exists = true; 
     $resource = fopen($path, "r"); 
     while (!feof($resource)) { 
      echo fgetss($resource); 
     } 
     fclose($resource); 
    } else { 
     $path = '../'.$path; 
     $search_count++; 
    } 
} 

EDIT: если вы только после того, как содержание log.log -file вы можете использовать file_get_contents($path) как это:

... 
if(file_exists($path)) { 
    $file_exists = true; 
    $contents = file_get_contents($path); 
    echo $contents; 
} 
... 

Найти больше информации о file_get_contents метода here.

+0

А это такое простое исправление! Спасибо! – SteppingHat

+0

Добро пожаловать;) Небольшое примечание: этот код начинает поиск файла журнала в папке _current_. Если вы хотите начать поиск другого пути, например 'folder/log.log', вы должны изменить код. Потому что, если файл не найден в 'папке', строка '$ path = '../'.$ path' даст:' ../ folder/log.log'. Но вы хотите 'folder /../ log.log'. Для этого вы можете разделить в начале переменную '$ path' в:' $ dir = 'folder /' 'и' $ file = 'log.log'' и изменить зависимые строки: 'file_exists ($ dir. $ file) ',' file_get_contents ($ dir. $ file) 'и' $ dir = $ dir. '.. /' ' – cumul

+0

Но если файл не найден' $ path = '../'. $ path'', поэтому он превращает '$ path = 'log.log'' в' $ path =' ../ log.log'', который присваивает его как новый '$ path'. Если он снова не найден, он просто добавляет другой '../' в начало '$ path', поэтому делает его' $ path = '../../ log.log'', в основном, ищет каталог после каждой попытки, пока не найдет ее – SteppingHat

0
while($file_exists == 0) 

будет бесконечным, потому что вы только настройки $file_exists в 1, когда файл найден

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

EDIT:

вы могли бы объединить го условия е, как

while($file_exists == 0 && $search_count < $search_limit) { 

//your entire code 

} 
+0

Ой, мой плохой. Но даже по-прежнему, если бы я должен был поменять файл_exists и счетчик, пока вокруг него все еще не хватает – SteppingHat

+0

, в этом случае, если файл отсутствует, ваш внутренний цикл будет бесконечным. – gaurav5430

Смежные вопросы