2

私はphpを初めて使用し、ボタン(開始/停止)を使用してphp whileループスクリプトを制御したいのですが、開始ボタンはループを定義して実行するstart.phpスクリプトへのajax呼び出しを$_SESSION['loop'] = TRUE行い、停止ボタンはに変更されたstop.phpスクリプトへの ajax 呼び出し。$_SESSION['loop']FALSE

以下はこれまでのコードですが、停止ボタンを押すと、whileループがループを終了した後にのみアラート(成功停止)になりました。つまり、ループは想定どおりに壊れませんでした。

ループの実行中にロックされているのはセッションにあると思います。もしそうなら、どのように値を変更し、ループに毎回$_SESSION['loop']その値を読み込ませるのですか?

index.php

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
    $(document).ready(function(){
        $('#start').click(function(){
            $.ajax({
                url: "start.php"
            });
        });

        $('#stop').click(function(){
            $.ajax({
                url: "stop.php",
                success: function(){
                    alert('success stop');
                },
                error: function(){
                    alert('failure stop');
                }
            });
        });
    });
</script>

<button id="start">Start</button>
<button id="stop">Stop</button>

start.php

<?php
    session_start();
    $_SESSION['loop'] = TRUE;

    ini_set('max_execution_time', 300);
    $i = 0;
    while($i < 100) {

        if ($_SESSION['loop'] == TRUE) {

            //query to save some variables

            // Pause 10s after saving 2
            if ($i != 0 && $i%2 == 0) {
                sleep(10);
            }

            $i++;

        } else {
            break;
        }
    }
?>

stop.php

<?php
    session_start();

    if(isset($_SESSION['loop'])) {
        $_SESSION['loop'] = FALSE;
    }
?>
4

3 に答える 3

1

開始操作と停止操作は 2 つの異なるセッションにあるため、一方の $SESSION を変更しても、他方に違いはありません。

于 2013-03-25T13:23:55.700 に答える
0

そのようなことを行うにはマルチスレッドを使用する必要があると思います。

于 2013-03-25T13:26:01.443 に答える
0

時間をかけて読んでください:

「通常、セッション データは、session_write_close() を呼び出す必要なくスクリプトが終了した後に保存されますが、同時書き込みを防ぐためにセッション データがロックされるため、いつでも 1 つのスクリプトしかセッションで操作できません。」

http://php.net/manual/en/function.session-write-close.php

したがって、最後に $_SESSION['loop'] がセッション ファイルに書き込まれているように見えます。

セッションファイルに明示的にデータを書き込みたい場合は、$_SESSION['loop'] = TRUE の後に session_write_close を追加します。同じスクリプトでいくつかのセッション データを再度読み書きする必要がある場合は、セッションを開始してからデータを読み書きする必要があることに注意してください。

于 2013-03-25T13:31:06.087 に答える