Как я могу запустить «фоновый» дочерний цикл с PHP?

#php #web-applications

#php #веб-приложения

Вопрос:

Я ищу способ проверить, есть ли какие-либо новые файлы в каталоге. Могу ли я выполнить это в реальном времени с помощью какого-либо дочернего цикла? Когда я говорю:

    <?php
        while (true) {
            $files = glob("../example/*.txt");
          $count_posts = $files !== false ? count($files) : 0;
            if ($count_posts > 0) {
                break;
            print("WE DID IT!!!!!!!");
            }
        }
        ?> 
  

Происходят три странные вещи: 1.) Страница будет продолжать загружаться — чего у меня не может быть 2.) Он не будет печатать «МЫ СДЕЛАЛИ ЭТО!!!!!!!!!» и 3.) Содержимое не будет отображаться, пока не появится новый файл. Как я могу это сделать?

Комментарии:

1. моя идея — поместить внутреннюю часть (без цикла) в функцию и вызывать ее один раз после загрузки страницы и один раз при каждом изменении, которое может привести к тому, что это будет true, или каждые пару секунд (с JS) … для этого вам нужно поместить это в другой файл и получить к нему доступ из вашего файла.

2. Как я мог это сделать? Что касается доступа к нему из другого файла?

Ответ №1:

Что касается перебора каталога для проверки наличия файлов, используйте DirectoryIterator, или, если есть вложенные папки, RecursiveDirectoryIterator. Ваш цикл while будет захвачен бесконечным циклом, если оператор glob вернет false или 0.

Например:

 $iterator = new DirectoryIterator('../example');
foreach ($iterator as $path) {
  if ($path->isFile()) {
     if (strpos($path->getFilename(), '.txt') !== false) {
         print("WE DID IT!!!!!!!");
         break;
     }
}
  

Или с помощью рекурсивного итератора каталогов..

 $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('../example'));
foreach ($iterator as $path) {
   ...
}
  

Если вам нужно запустить это как фоновую задачу, вам нужно использовать AJAX, как предлагает Бен. Обычный PHP-запрос через веб-страницу предназначен для загрузки всего и отображения содержимого обратно на страницу. AJAX-запросы — это единственный способ выполнять асинхронные запросы в Интернете. Смотрите http://api.jquery.com/jQuery.ajax /

Комментарии:

1. Как я могу сделать это с помощью ajax? В ссылке это не упоминается.

2. AJAX в основном работает путем отправки асинхронных HTTP-запросов на сервер (т. Е. PHP) через JavaScript. Затем PHP возвращает что-то (обычно строку или JSON, что немного более гибко), и ваш JavaScript затем что-то с этим делает (т. Е. Обновляет HTML страницы). Вы можете прочитать руководство о том, как начать работу с jQuery, которое включает раздел об использовании AJAX с PHP по адресу docs.jquery.com /…

Ответ №2:

Простой ответ заключается в том, что вы не можете сделать это без использования сокетов и / или Javascript. PHP не вернет никакой информации, пока вся страница не будет полностью загружена, в этом случае ничего не будет отображаться, пока не будет вызвано предложение break.

У меня был бы отдельный скрипт, который проверяет наличие новых файлов в папке, опрашиваемой javascript через setTimeout и AJAX каждые X секунд.

Комментарии:

1. PHP может возвращать данные, если вы используете команду flush(), а сервер не буферизует содержимое. example.preinheimer.com/flush.php