使用会话的重型PHP的进展

时间:2010-11-29 01:01:14

标签: php ajax session progress

我正在php中进行一些繁重的图像处理,我想向用户展示事情的进展情况。所以我尝试做这样的事情:

for($i = 0; $i < $rowCount; $i++) {
     session_start();
     $_SESSION['progress'] = $i/ $rowCount;
     session_write_close();

     processLine($i);
}

然后我使用AJAX调用另一个php文件,它基本上返回$ _SESSION ['progress']的值。问题是,它没有设置。这是因为你不应该每个文件多次启动会话吗?如果我只是打开会话并且不在每一行之间关闭它,则SESSION变量被锁定,并且在完成整个图像操作之前不会处理我的轮询文件。

使用会话以任何方式使其工作?我认为如果我将进度放在数据库或文件中可能会有效,但这很慢,我们将不得不做一些工作来识别用户(使用ips或会话ID)。使用会话会处理这些事情。

2 个答案:

答案 0 :(得分:1)

这是因为php会锁定会话文件。仍然使用相同会话的第一个进程锁定文件,ajax调用使用相同的会话ID,因此尝试访问相同的会话文件,但它不能,因为它在第一个进程完成之前被php锁定。

这是你问题的答案。如果你想知道如何修复它,我不确定,我必须考虑它。

答案 1 :(得分:0)

说实话,你应该只在每个使用函数的PHP脚本的顶部放置session_start();函数,而只使用那个函数。删除所有其他session_start和您可能拥有的所有其他会话功能session_write_close();

不要关闭会话或使用其他任何内容,因为它不是必需的。如果该值未返回,您可能需要在浏览器中仔细检查JavaScript控制台以检查返回的PHP错误或文件目录中名为error_log的文件。

否则一切都应该按预期工作。我过去做过类似的事情,但效果很好。我希望这可以帮助您调试问题。