Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在脚本1、脚本2中设置的访问会话变量。PHP_Php_Ajax_Session - Fatal编程技术网

在脚本1、脚本2中设置的访问会话变量。PHP

在脚本1、脚本2中设置的访问会话变量。PHP,php,ajax,session,Php,Ajax,Session,我有一个执行某些操作的循环,在循环中我有一个递增的会话计数器。这个循环大约需要10-15分钟才能完成,所以我希望有一个进度条,告诉用户它在循环中走了多远 我的AJAX调用假定检索我在循环中设置的会话值,但它似乎不起作用。我得到未定义的索引错误 我在某个地方读到,一旦一个脚本使用了会话,它就会被锁定,直到它完成使用,它才会解锁。是否可以在会话上强制解锁,以便我的ajax脚本可以检索会话的值 例如: 脚本1(循环): while(SOME CONDITION) { //DO ACTIONS

我有一个执行某些操作的循环,在循环中我有一个递增的会话计数器。这个循环大约需要10-15分钟才能完成,所以我希望有一个进度条,告诉用户它在循环中走了多远

我的AJAX调用假定检索我在循环中设置的会话值,但它似乎不起作用。我得到未定义的索引错误

我在某个地方读到,一旦一个脚本使用了会话,它就会被锁定,直到它完成使用,它才会解锁。是否可以在会话上强制解锁,以便我的ajax脚本可以检索会话的值

例如:

脚本1(循环):

while(SOME CONDITION) {
    //DO ACTIONS

    $_SESSION['progress'] = $currProgress + 1;
}
function getCurrentProgress() {
   $progress = isset($_SESSION['progress']) ? $_SESSION['progress'] : 0;
   echo json_encode(array('progress' => $progress));
}
脚本2(AJAX调用检索会话):

while(SOME CONDITION) {
    //DO ACTIONS

    $_SESSION['progress'] = $currProgress + 1;
}
function getCurrentProgress() {
   $progress = isset($_SESSION['progress']) ? $_SESSION['progress'] : 0;
   echo json_encode(array('progress' => $progress));
}

JS AJAX(每30秒调用一次)对上述脚本的

PHP会话更改在程序结束之前默认不会写入会话存储;程序运行时,
$\u SESSION
与任何其他变量一样;只能在自己的程序中访问;只有当程序结束并将会话写入磁盘时,下一个程序才能获取您对会话数据所做的更改。因此,简单的回答是,仅仅通过检查会话并期待最新的更新就无法做到这一点

通过使用
session\u write\u close()
函数,您可以在程序运行期间的任何时候强制PHP向会话写入,但正如您从函数名中收集的那样,这也将关闭该程序的会话,因此程序无法对其进行任何进一步的更新

我想你可以重新开始,但这已经开始进入危险的领域。即使它真的起作用了,也会非常低效


最终,PHP会话被写入到一个文件中,就像任何其他输出一样,但是重复打开和关闭它会带来很大的开销。因此,如果您正在考虑上述内容,请不要考虑它——您可以让您的程序将其进度写入临时文件甚至数据库。或者,如果您想提高性能,可以使用memcache。

您是否启动了会话?我已经在下面发布了对您问题的直接回答,但我很好奇:您的程序究竟在做什么,需要10-15分钟?对于大多数使用PHP的事情,以及大多数数据库的大小,我想说的是,您很有可能从中获得比优化一点更好的性能。它确实将一个巨大的excel文件导入到数据库中。需要花费很长时间来检查一个包含多达700万条记录的表是否存在重复项。您是否建议最好创建一个类似临时表的内容并在那里取得进展?@GGio-是的,正是这样。php会话不会以您想要的方式为您工作。使用临时表或临时文件,或memcache数据,或其他任何。。。。只是会话之外的东西。有意义。非常感谢,我们现在将使用临时表,并将研究memcache以改进它,