2

我有这样的事情:

<?php
  $perform_check = 1; #Checks data with ID : 1
  while(true)
  {
    #code
  }
?> 

但是在这个过程中必须更新一些数据,是否可以从另一个文档更新这些数据?

我试过这样的事情:

索引.php

<?php
  setcookie("data", 19, time()+3600);
?>

循环.php

<?php
  while(true)
  {
    if($perform_check!=$_COOKIE[data]) $perform_check = $_COOKIE[data];
    #rest of code
    flush();
    sleep(0.3);
  }
?>

但它不起作用。我也试过$_SESSION,但页面崩溃了session_start()

有可能吗?

4

6 回答 6

2

当 PHP 通过 Web 服务器(例如 Apache2)发送响应时,Cookie 会作为HTTP 标头发送。

所有 HTTP 标头都在任何输出之前发送。如果您输出任何内容,则会在输出之前发送标头(包括set-cookie 标头)。

在您flush()第一次之后,您将无法再设置 cookie 或其他标题。

如果您需要进度指示器或更新,则需要使用 javascript 启动您正在执行的任何操作并每隔一段时间进行轮询。在使用循环的过程中,您需要将进度保存在共享内存、文件或数据库中(按此优先顺序),然​​后使用 javascript 进度检查/更新检查启动的过程读取该数据。

于 2012-06-07T16:52:37.963 回答
1

您可以使用文件的存在来标记进程的结束。例如,创建一个锁定文件,

$lock_file = <some unique name>
fopen($lock_file, 'w') or die("can't open file");
while ( file_exists($lock_file)) {

.
.
doStuff();
.
.

}

如果文件被其他进程删除,它应该终止。

于 2012-06-07T16:23:01.567 回答
1

我认为while循环在这里没有任何好处。你应该看看php websocket 实现。它是 PHP 中的一种实现,具有 websockets 并与您的用户建立开放连接。如果你有,你可以用双方的听众来管理事情。

于 2012-06-08T13:18:48.263 回答
0

如果您希望在代码循环时更改值,则需要检查值是否在循环内更改,而不是之前更改。

只有在同一个用户/浏览器同时运行这两个脚本时,cookie 或会话才会起作用。写入文件或数据库是更常用的方法。

于 2012-06-07T16:10:15.360 回答
0

我不太确定你真的想在这里做什么..但我想你可以这样做..

<?php
  $perform_check = 1; #Checks data with ID : 1
  while(true) : ?>
    $.ajax({
        type:'post',
        data: //your data to be passed to ajax script..
        url: //the script wherein you want to run the query..
        onSuccess: function(data) {

             if(data==test) {
             //if you have data that you want then you could stop the loop
              <?php $perform_check = false; ?>

             }

        }
    });
  <?php endwhile: ?>

希望这可以帮助。

于 2012-06-07T16:16:33.270 回答
0

如果你需要经常检查,你应该使用一个 CRON 来调用你用来检查的函数。

于 2012-06-07T16:17:46.900 回答