2017-06-01 14 views
0

たとえば、次のようなindex.phpがあります。また、このPHPコードは決して実行を終了せず、永遠に実行されることを前提としています。私は、このページからこのPHPの書き出しをインターフェースから取り消す方法を欲しがっています。このウェブサイトを見ているユーザによって引き起こされたアクション。 Webサーバー上で動作するPHPスクリプトの内部からではありません。WebインターフェイスからPHP execを停止する方法

<html lang="en"> 
<head> 
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"> 
    <meta http-equiv="x-ua-compatible" content="ie=edge"> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <title>Main</title> 
</head> 
<body> 
    <a href="#" class="button">Cancel PHP execution</a> 

    <?php 
    // magic that takes time 
    ?> 

</body> 
</html> 

クライアント側で発生するボタンやイベントからPHPの実行を停止するにはどうしたらいいですか?私はすべての種類のソリューションajax、jsに開放されています...

アルゴリズムは時間の複雑さを持つ重い計算をします!どこで私はそのPHPロジックをチェックしたくないですか?実行がどこになるのかわかりませんし、どの部分がもっと時間を取るのかも分かりません。それは、私のルーチンを止めるコマンドです。

+0

あなたがいない問題バッファをフラッシュすることができます。 @ Don'tPanic – KALALEX

+0

真実、良い点。 –

+0

'php.ini'で' ignore_user_abort'設定が有効になっていない限り、ユーザがウィンドウを閉じるとスクリプトは中止されます。私は、ボタン押しでそれを行う方法はないと思う。 – Barmar

答えて

2

無制限の「魔法」を使用するには、何らかのループが必要です。

while (1==1) { 
    if ($flag){ 
    break; 
    } 
} 

、ユーザーが$ _GETや$ _POSTでそのフラグを埋めてみましょう:ループの内部のように、旗を置きます。

PS:これらのループルーチンを避けることを強くお勧めします。スクリプトであるためPHPがうまく動作しません。ブラウザを過負荷で壊す危険があります。 Btw、ちょうどあなたがPHPに頼っている場合、いくつかの提出でページをリフレッシュするには、スクリプトの実行を中断する(ページがそれまでに壊れていない場合)。 Webへの連続的なルーチンを使用するにはjavascriptを使用します(何かを保存したり、何らかの情報を持ってAJAXを追加する必要がある場合)。

編集:あなたのルーチン/計算から各プロセスを検証するコールバック付きのAJAXを使用しています(好きなときは、最後の計算プロセスを保存できるため、キャッシュを使用して次の計算時間を改善します。このアルゴリズムはとても重いです)、またはいくつかのボタンまたはスタッフにユーザーがクリックするときだけのAJAX呼び出しを停止します。あなたのPHPファイルで

var strongcalcs = $.ajax({ 
    type: 'POST', 
    url: 'magic.php', 
    success: function(result){} 
}); 

<?php 
// magic that takes time 
?> 

は、その後、あなたがリクエストを中止することができます

<html lang="en"> 
<head> 
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"> 
    <meta http-equiv="x-ua-compatible" content="ie=edge"> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <title>Main</title> 
</head> 
<body> 
    <button class="button">Cancel PHP execution</button> 

</body> 
</html> 
<script> 
$('button').on('click', function(){ 
    strongcalcs.abort(); 
}); 
</script> 

FINAL:

<html lang="en"> 
<head> 
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"> 
    <meta http-equiv="x-ua-compatible" content="ie=edge"> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <title>Main</title> 
</head> 
<body> 
    <button id="cancel" class="button">Cancel PHP execution</button> 

    <script language="javascript"> 

    var strongcalcs = $.ajax({ 
     type: 'POST', 
     url: 'execute.php', 
     success: function(result){ 
      alert(result); 
     }, 
     error: function() { 
      alert("ABORT!"); 
     } 
    }); 

    $('#cancel').click(function() { 
     strongcalcs.abort(); 

    }); 
    </script> 
</body> 
</html> 
+1

私は、時間の複雑さを持っている重い計算をしていると想像してください!私は実行がどこになるかわからないので、終了する場合は毎回そのPHPロジックをチェックしたくありません。より多くの時間がかかる。変数をチェックする。 – KALALEX

+0

私はちょっとあなたに戻ってくるようなことを試してみます。 – KALALEX

関連する問題