#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 секунд, в зависимости от того, что делает сервер