javascript コードを含む php スクリプトがあり、2 番目の php スクリプトに AJAX get() リクエストを送信しています。2 番目のスクリプトが実行を開始します。最初のスクリプトから 2 番目のスクリプトを終了するには?
2 に答える
質問のコメントの説明に基づいて、あなたが持っているのは次のようです:
- ユーザーが JS を使用して対話する HTML ページ (このページはおそらく PHP で生成されたものですが、このシナリオには関係ありません)。
- ページからの AJAX 呼び出し (1) は、画像を生成する PHP スクリプトを呼び出します。これは、遅くてコストのかかるプロセスです。
- 現在実行中のスクリプトを中止する追加の AJAX トリガーが必要です (2)
私がとる基本的なアプローチは、スクリプト(2)が開始時に作成し、ステップ間で定期的にチェックする、ある種の「ロック」または「トリガー」を持つことです。トリガーは、ファイル、またはデータベース内の行などである可能性があります。重要なのは、複数の PHP スクリプトが同時にアクセスできる場所にある必要があるということです。
(3) のスクリプトは、中止したい特定のファイル/データベースの行などを削除する非常に小さな PHP スクリプトにすることができます。(2) のスクリプトが次のチェックを行うと、そのロック/トリガーが存在しないことがわかり、作成された作業データを整理できますexit
。
これを行う際には、必ずセキュリティについて考えてください。トリガーの名前は JS に認識されている必要があるため、ユーザーが操作できます。誰かが悪意を持ってすべてのプロセスを中止できないように、十分にランダムである必要があります。また、中止スクリプトがだまされて関係のないファイルを削除されないように、その形式を十分に制限する必要があります。これは実際にはそれほど難しいことではありません - 数字と文字のランダムな文字列で十分です - しかし削除スクリプトはそれが実際に受け取った形式であることを確認する必要があります.JS を信頼できないからです.
これのバリエーションは、「ハートビート」システムを使用することです。このシステムでは、JS タイマーがロック/トリガーをタイムスタンプで定期的に更新し、「はい、これを処理し続けてください」と言います。(2) のスクリプトがタイムスタンプが古すぎることを検出すると、スクリプトは中止されます。このアプローチは、ユーザーが退屈してページを離れた場合に実行を中止したい場合に有利です。これは、それをイベントとして確実にキャプチャして特定の「中止」要求を送信することができないためです (たとえば、ユーザーが単にプラグを抜いた場合を考えてください)。インターネットからのラップトップ)。
「やめろ!」の先に そして「続けてください!」、ファイルまたはデータベースに書き込むだけで、実際にこのアプローチを使用して、実行中の PHP プロセスに何かを伝えることができます。PHP には「イベント」モデルや、あらゆる種類のスレッド (非常に複雑なサード パーティの拡張機能を使用することなく) がないため、PHP スクリプトが実行を開始した後に変更を検出する唯一の方法は、積極的にクエリを実行することです。実行時間の長いスクリプトは、定期的に「メールをチェック」できるように、可能な限り構造化する必要があります。
ajax クエリを中断できます。
たとえば、file1.php で jQuery を使用する場合、ajax 呼び出しを介して file2.php を要求します。
<script>
var jqxhr = $.get( "file2.php", function( data ) {
// do some thing.
alert( "Get was performed." );
});
</script>
その後、同じ file1.php で、後でボタンまたは他のユーザー アクション/イベント ハンドラーをクリックして、
<script>
//kill the request
jqxhr.abort();
</script>
これは単なる可能性です。