Как запустить файл php в фоновом режиме
Возможный дубликат:
Лучший способ управлять долгосрочным PHP-скриптом?
Я должен создать большой список адресов электронной почты. Все работает отлично, но когда я отправляю, страница формы загружается до тех пор, пока каждое письмо не будет отправлено. Так что я хочу, чтобы этот сценарий отправки электронной почты запускался в фоновом режиме. И обратите внимание пользователя, что сценарий выполняется в фоновом режиме. Я не могу использовать Ajax.
я хочу что-то вроде.. proc_open,exec,shell_exec..
8 ответов
У вас может быть задание cron, которое будет запускать скрипт php, который будет получать очередь из базы данных и отправлять электронную почту
По основному сценарию нужно просто добавить электронные письма в очередь
Я бы использовал ajax, только если вам нужен индикатор прогресса. При использовании решения ajax вы должны будете держать окно открытым до тех пор, пока оно не закончится.
В PHP есть функция, которая может поддерживать процесс, даже если пользователь, который запросил страницу, покидает страницу: ignore_user_abort, если вы проверите там комментарии, вы увидите следующий пример:
<?php
ignore_user_abort(1); // run script in background
set_time_limit(0); // run script forever
$interval=60*15; // do every 15 minutes...
do{
// add the script that has to be ran every 15 minutes here
// ...
sleep($interval); // wait 15 minutes
}while(true);
?>
Это чистая работа php cron НО, риск с этим скриптом заключается в том, что он будет работать бесконечно или по крайней мере, пока вы не сбросите / не убьете php.
Настройка set_time_limit(0);
в set_time_limit(86400);
убил бы сценарий через день.
Это должно указать вам правильное направление.
ВАЖНО! После проблемы с OP рекомендуется запускать этот скрипт, только если у вас есть SSH-доступ к серверу, чтобы вы могли KILL/RESTART php apache в случае, если сервер продолжает зависать. Также не запускайте скрипт на сервере LIVE.
Например - напишите в какое-то место "A"(дБ или файл) текущее состояние времени выполнения вашего скрипта: "Complete"/"Complete". После запуска скрипта в фоновом режиме отправьте вашему пользователю страницу ожидания, которая при обработке AJAX изменяется на "A".
Вы можете попробовать запустить скрипт через функцию ajax, если вы не хотите устанавливать скрипт cron.
Этот Ajax-скрипт будет выполнять PHP-файл в фоновом режиме. Он также может отправить ответ на элемент HTML, если хотите.
<script type="text/javascript" language="javascript">
function execute(filename,var1,var2,var3)
{
var xmlhttp;
if(window.XMLHttpRequest)
{
//Code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
}
else if(window.ActiveXObject)
{
//Code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else
{
alert("Your browser does not support AJAX!");
}
var url = filename+"?";
var params = "var1="+var1+"&var2="+var2+"&var3="+var3;
xmlhttp.open("POST", url, true);
xmlhttp.onreadystatechange=function()
{
if(xmlhttp.readyState==4)
{
//Below line will fill a DIV with ID 'response'
//with the reply from the server. You can use this to troubleshoot
//document.getElementById('response').innerHTML=xmlhttp.responseText;
xmlhttp.close;
}
}
//Send the proper header information along with the request
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.setRequestHeader("Content-length", params.length);
xmlhttp.setRequestHeader("Connection", "close");
xmlhttp.send(params);
}
</script>
Вы можете создать AJAX-вызов, который вызывает скрипт php. Таким образом, ваш сайт будет работать, пока запрос будет выполнен. И когда он закончится, ваш AJAX вернется, и вы сможете показать окно сообщения пользователю.
Для получения дополнительной информации, проверьте хотя бы это, и если вы понимаете, что такое AJAX и что он делает, используйте его вместе с этим
Ajax запрос будет лучшим выбором для этого. Вы можете отправить запрос, используя JavaScript, и даже сообщить о прогрессе пользователю (что может потребовать дополнительной работы)
Если вы находите ajax слишком сложным - запустите скрипт в iframe. Это не самый элегантный, но самый простой метод.