重php使用会话的进展

重php使用会话的进展,php,ajax,session,progress,Php,Ajax,Session,Progress,我正在用php做一些繁重的图像处理,我想向用户展示事情的进展情况。所以我试着这样做: for($i = 0; $i < $rowCount; $i++) { session_start(); $_SESSION['progress'] = $i/ $rowCount; session_write_close(); processLine($i); } ($i=0;$i

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

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

     processLine($i);
}
($i=0;$i<$rowCount;$i++)的
{
会话_start();
$\会话['progress']=$i/$rowCount;
会话写入关闭();
生产线(一美元);
}
然后我使用AJAX调用另一个php文件,它基本上返回$\u SESSION['progress']的值。问题是,它没有设置。这是因为每个文件启动会话的次数不应超过一次吗?如果我只是打开会话,而不是在每一行之间关闭它,会话变量将被锁定,并且在整个图像处理完成之前不会处理轮询文件


有没有办法通过会话来实现这一点?我认为如果我把进度放在数据库或文件中可能会起作用,但这很慢,我们必须做一些工作来识别用户(使用IP或会话ID)。使用会话可以解决这些问题。

老实说,您应该只使用
会话_start()函数位于每个使用函数的PHP脚本的最顶端,并且仅此一个。删除所有其他会话_start和所有其他会话函数,如
session_write_close()

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


否则,一切都应按预期进行。我过去也做过类似的事情,效果很好。我希望这能帮助您调试问题。

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


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

不,这实际上解决不了我的问题。因为两个php文件不能同时在同一个会话上工作:(我无法读取进度变量的值,而我仍在以这种方式进行图像处理..这很奇怪,因为您应该能够将同一会话打开两次以进行读/写,除非它在图像处理脚本完成执行之前不会全局更新会话值。也许可以尝试启动会话并设置t。)在执行图像处理脚本之前,将hat变量设置为0个百分比。如果尚未执行,可能需要尝试。是的,我认为这就是问题所在。因此,您无法解锁进程中的会话,以便其他进程可以使用它来检查进程?否。我将寻找其他方法。例如,创建some temp文件,可能以正在处理的图像名称命名。然后将进度保存到该temp文件中。然后Ajax将必须访问另一个php文件,如checkstatus.php?f=filename。此外,如果使用memcache,将进度结果保存到memcache中会更好更快,它只会比使用temp文件更快。memcache这个东西听起来很有趣测试,我会调查;-)谢谢你的提示!我已经用memcache运行了一些基本测试,它看起来很有希望..会让你们保持联系!