выполняется ли php в цикле?

#php #loops

Вопрос:

Мне нужно удалить filename.html если он существует, создайте новый filename.html и отобразите его, но у меня есть следующая проблема. Когда новый filename.html создается, он сразу же убивается, как будто php запускается заново. Есть ли способ выполнить его один раз? Это мой php.

 <?php

  $filename = 'filename.html';

  if (file_exists($filename)) {       // if filename.html exist i delete it
     unlink($filename);
  }

  do {
    if (file_exists($filename)) {    // waiting for a new filename.html (generated by another process)
         include ($filename);        // i will show it when ready
         break;
    }
  } while(true);

?>
 

Я также попробовал этот обходной путь, чтобы выполнить удаление только в начале, но он не работает:

 if( !defined('ALREADYEXECUTED') ){       
  if (file_exists($filename)) {
     unlink($filename);
  }
}
define('ALREADYEXECUTED', TRUE);
 

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

1. Сколько времени требуется для создания файла? Если это займет больше времени, чем max_execution_time указано в настройках, ваш сценарий будет уничтожен.

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

Ответ №1:

Вы используете бесконечный цикл в своем коде, и это не лучшая практика для того, что вы собираетесь делать!

Вы можете использовать header("Refresh:1") для обновления своей страницы, чтобы проверять наличие файла каждую секунду. Это может сэкономить ваш ресурс, а также сделать то, что вы хотите.

 <?php
header("Refresh:2");
$filename = 'filename.html';

if (file_exists($filename)) { // if filename.html exist i delete it
    unlink($filename);
}

if (file_exists($filename)) { // waiting for a new filename.html (generated by another process)
    include ($filename); // i will show it when ready
}

?>
 

Будьте осторожны при удалении header("Refresh:2") после включения нового файла или используйте условие, чтобы избежать этого после включения.

Ответ №2:

тест с заголовком(«Обновить:2») не сработал для меня, но он помог мне найти решение (наверняка есть и лучшие):

Мне пришлось разделить php на 2 части:

первый:

 <?php

  $filename = 'filename.html';

  if (file_exists($filename)) {       // if filename.html exist i delete it
     unlink($filename);
  }

  header('Location:secondfile.php');
}
 

а второй файл выглядит так:

   <?php
    
      $filename = 'filename.html';
    
      do {
        if (file_exists($filename)) {
          usleep( 100000 );
          include ($filename);
          break;
        }
      } while(true);

  ?>
 

Чтобы ответить на некоторые вопросы:
Имя файла $создается за несколько миллисекунд.
Созданный файл, который был удален непосредственно перед этим, в этом случае больше не удаляется.
Я не специалист по php, если есть лучшее решение для этого в одном файле, я был бы рад узнать.

Ответ №3:

Просто избавьтесь от цикла do while, вот что вызывает ваш бесконечный цикл. Для какой цели это там изначально?

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

1. я не могу удалить do while, так как новый файл создается через переменное время от нескольких мс до 2 секунд, в зависимости от того, что делает сервер