我在这里遇到一个奇怪的问题.
我正在使用 javascript ajax(我使用jquery).现在的情景是;
我正在使用 javascript ajax(我使用jquery).现在的情景是;
一个ajax调用是调用一个PHP脚本,它基本上是一个长时间运行的进程,它设置了一些会话变量.
稍后在某些时间间隔(比方说,每2秒)我运行另一个ajax调用来检查会话变量,以了解进程(第一个PHP脚本执行)何时完成.
第一个PHP脚本从数据库中获取数据并将其拧入文件中.在每个提取中,我计算循环数并将其存储到会话变量中以保留某种跟踪记录.喜欢;
$i=0; $_SESSION['time']=date('m-d-Y H:i:s'); while(...) { ini_set('session.use_only_cookies',false); ini_set('session.use_cookies',false); ini_set('session.use_trans_sid',false); ini_set('session.cache_limiter',null); session_start(); $_SESSION['tracksatus']="loop number : ".$i." time is :"$_SESSION['time']; session_write_close(); $i++; ...... ...... }
我通过setInterval ajax调用的另一个PHP脚本就是这样;
echo $_SESSION['trackstatus']
设定的间隔ajax让我回归;
loop number 1 time is m-d-Y H:i:s loop number 5 time is m-d-Y H:i:s loop number 8 time is m-d-Y H:i:s ......
然后再打几次电话;
loop number 1 time is m-d-Y H1:i1:s1 .....
注意H:i:s的变化为H1:i1:s1
所以根据我的理解,PHP脚本正在调用两次.并且对于您的信息,相同的代码在12小时之前就可以正常工作.我之前遇到过这个问题,并以某种方式解决了它(试错,所以我不知道怎么样或者可能是自动的……好吧,实际上我没有线索).
能否请你告诉我我做错了什么?
如果您需要更多信息,请提及.
有趣的是,它只是在询问了这个问题之后才按预期工作,甚至没有改变一行代码.但我想知道原因.
解决方法
我认为我知道是什么原因,PHP将会话变量写入文件,但它只在脚本执行结束时才这样做,因此在长文件结束之前你不能看到另一个脚本中会话的变化.
您可以通过添加session_write_close()来修复它;在session_start();每次更改会话数据后.
session_write_close会将更改写入HD,因此另一个脚本可以读取它.
session_start将从HD加载会话,但请确保您的另一个脚本不会对会话进行任何更改,这些更改将被您的长脚本覆盖.
如果您使用单独的域,还有一件事:在实际的AJAX调用发生之前,您的浏览器会将OPTIONS请求发送到相同的URL以检查CORS标头.所以在你的脚本开始时检查HTTP METHOD,如果它是HEAD或OPTIONS make die();