重複の可能性:
長時間実行される php スクリプトを管理する最良の方法は?
大きなメーリング リストを作成する必要があります。すべてが完全に機能しますが、フォーム ページを送信すると、すべてのメールが送信されるまで読み込まれます。したがって、このメール送信スクリプトをバックグラウンドで実行し、スクリプトがバックグラウンドで実行されていることをユーザーに通知します。Ajaxは使えません。
私は.. proc_open、exec、shell_exec ..のようなものが欲しい..
重複の可能性:
長時間実行される php スクリプトを管理する最良の方法は?
大きなメーリング リストを作成する必要があります。すべてが完全に機能しますが、フォーム ページを送信すると、すべてのメールが送信されるまで読み込まれます。したがって、このメール送信スクリプトをバックグラウンドで実行し、スクリプトがバックグラウンドで実行されていることをユーザーに通知します。Ajaxは使えません。
私は.. proc_open、exec、shell_exec ..のようなものが欲しい..
PHP has an function that can keep an process running even if the user that requested the page leaves the page : ignore_user_abort if you check the comments there you can see this example :
<?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);
?>
It IS an pure php cron job BUT, the risk with this script is that it continues indefinitely or atleast untill you reset/kill php.
Setting the set_time_limit(0);
to set_time_limit(86400);
would kill the script after an day.
This should point you in the right direction/.
IMPORTANT After the problem by the OP, it is advisable to only run this script if you have SSH access to the server so you can KILL/RESTART php apache in case the server keeps hanging. Also do not run the script on a LIVE server.
データベースからキューを取得して電子メールを送信するphpスクリプトを実行するcronジョブを持つことができます
メインスクリプトでは、メールをキューに追加するだけです
プログレスバーが必要な場合にのみajaxを使用します。ajax ソリューションでは、終了するまでウィンドウを開いたままにしておく必要があります。
cronスクリプトを設定したくない場合は、ajax関数を使用してスクリプトを実行することもできます。
でフォームを送信AJAX
し、Divの進捗状況を更新します
たとえば、スクリプトランタイムの現在の状態「A」(dbまたはファイル)に「complete」/「incomplete」と書き込みます。バックグラウンドでスクリプトを開始した後、AJAX処理を使用して「A」で変更されるユーザー待機ページに送信します。
この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>
php スクリプトを呼び出す AJAX 呼び出しを作成できます。このようにして、リクエストが満たされている間、サイトは引き続き機能します。完了すると、AJAX が返され、ユーザーにメッセージ ボックスを表示できます。
詳細については、少なくともこれを確認してください。AJAX とは何か、それが何をするのかを理解している場合は、これを使用してください。
これにはAjaxリクエストが最適です。JavaScript を使用してリクエストを送信し、進行状況をユーザーに報告することもできます (追加の作業が必要になる場合があります)。
ajax が難しすぎる場合は、iframe でスクリプトを実行してください。これは最も洗練された方法ではありませんが、最も単純な方法です。