It's the third time that I'm editing this post, after more testing and debugging I keep finding out new stuff. Here my situation:
I have an method thinker that takes a while to process. Because of that I decided to call it via Ajax, and show an indicator to the user. Up to that point - works great.
Another thing I'm trying to do, is actually show the user the progress of "thinking", in percentage or just ticks, whatever.
It's not to difficult to do, because thinker has a loop, and in every iteration it saves new thoughts to the database.
So basically - the counter just show the number of "thoughts" (tied to the specific id).
The problem is, that the callback option doesn't get called.
Well - scratch that - it does get called, but only twice. Before the request (shows zero) and after the thinker is done thinking, when there is no use for it anymore (show the full amount).
Here's the simplified code:
<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>
Through the use of Firebug XHR console I managed to get into this a little bit deeper. I actually went with jQuery (just to test, but it didn't help).
The problem is with CakePHP I guess. I mean - when I created an identical scenario with basic PHP it works at the same time. When I do it with Cake, the counter will get called, then the thinker will get called, and the counter will get called every two seconds, but will only respond after the thinker is done thinking.
Is it possible that Cake won't manage to handle the second request until the first one is finished?
Regards, Paul
Well, as it turns out, the problem is in fact with Cake. By default, CakePHP stores sessions in file (default from php.ini actually). It sort of comes down to:
One user can't run two CakePHP instances at the same time with the default session storing option.
Changing:
Configure::write('Session.save', 'php');
to
Configure::write('Session.save', 'cache');
Seems to do the trick.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With