2

我是 php 新手,我想控制一个 php while 循环脚本,使用按钮(开始/停止),开始按钮对定义和执行循环的start.php$_SESSION['loop'] = TRUE脚本进行 ajax 调用,停止按钮进行ajax 调用stop.php脚本,该脚本只是更改$_SESSION['loop']FALSE.

下面是我到目前为止的代码,但是当我点击停止按钮时,我只有在 while 循环完成循环后才成为警报(成功停止),这意味着循环没有像我假设的那样中断。

我认为这是在循环执行时锁定的会话。如果是这样,如何更改$_SESSION['loop']值并使循环每次都读取该值?

索引.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>

开始.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;
        }
    }
?>

停止.php

<?php
    session_start();

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

3 回答 3

1

您的启动和停止操作在两个不同的会话中,因此在一个会话中更改 $SESSION 对另一个会话没有影响。

于 2013-03-25T13:23:55.700 回答
0

我认为,你应该使用多线程来做这些事情。

于 2013-03-25T13:26:01.443 回答
0

请花点时间阅读:

“会话数据通常在脚本终止后存储,无需调用 session_write_close(),但由于会话数据被锁定以防止并发写入,因此只有一个脚本可以随时对会话进行操作。”

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

因此,似乎 $_SESSION['loop'] 最后被写入会话文件。

如果要显式将数据写入会话文件,请在 $_SESSION['loop'] = TRUE 之后添加 session_write_close。注意,如果您需要在同一个脚本中再次读取/写入一些会话数据,您需要启动会话然后读取/写入数据。

于 2013-03-25T13:31:06.087 回答