这是我第三次编辑这篇文章,在经过更多测试和调试之后,我不断发现新内容。在这里我的情况:
我有一个方法thinker
需要一段时间来处理。因此,我决定通过Ajax调用它,并向用户显示一个指示器。到目前为止 - 效果很好。
我正在尝试做的另一件事实际上是向用户展示“思考”的进度,百分比或只是滴答,无论如何。
这并不困难,因为thinker
有一个循环,并且在每次迭代中都会将新的thoughts
保存到数据库中。
基本上 - counter
只显示“想法”的数量(与特定ID相关联)。
问题是,不会调用回调选项。
嗯 - 划伤 - 它确实被调用,但只有两次。在请求(显示为零)之前和thinker
完成之后思考,当它没有用处时(显示全部金额)。
以下是简化代码:
<span id="indicator" style="display: none;"><img src="/img/ajax-loader.gif" alt="" /></span>
<span id="progress"></span>
<span id="clicker" style="cursor: pointer;">Do it!</span>
<script type="text/javascript">
//<![CDATA[
Event.observe('clicker', 'click', function(event) {
new Ajax.Request(
'/examples/thinker/123',
{asynchronous:true, evalScripts:true, onComplete:function(request, json) {Element.hide('indicator');}, onLoading:function(request) {Element.show('indicator');}}
);
new Ajax.PeriodicalUpdater(
'progress',
'/examples/counter/123',
{asynchronous:true, evalScripts:true, frequency: 2}
);
});
//]]>
</script>
通过使用Firebug XHR控制台,我设法深入了解了这一点。我实际上使用jQuery(只是为了测试,但它没有帮助)。
问题在于我猜想CakePHP。我的意思是 - 当我用基本PHP创建一个相同的场景时,它同时工作。当我使用Cake执行此操作时,counter
将被调用,然后thinker
将被调用,counter
将每两秒调用一次,但只会在{thinker
之后响应1}}完成了思考。
在第一个请求完成之前,Cake是否可能无法处理第二个请求?
此致 保罗
答案 0 :(得分:2)
嗯,事实证明,问题实际上是Cake。默认情况下,CakePHP将会话存储在文件中(实际默认为php.ini
)。它归结为:
一个用户无法使用默认会话存储选项同时运行两个CakePHP实例。
更改:
Configure::write('Session.save', 'php');
到
Configure::write('Session.save', 'cache');
似乎可以做到这一点。
答案 1 :(得分:0)
我不认为蛋糕是罪魁祸首。它最终可能是你的服务器,但这不太可能。但是,您的脚本可能会锁定数据库,从而阻止再次读取它。这对我来说似乎更有可能。我不是那里的专家,所以我只是在这里猜测,但我会考虑持久连接,并强制关闭/打开每个循环之间的连接。还有一件事要检查交易,但同样,我从未遇到过这种麻烦。
无论如何,我会尝试单独排除每个组件进行调查。