champion0125 / apns-php

Automatically exported from code.google.com/p/apns-php
0 stars 0 forks source link

In server mode script doesn't detect when it loses a connection due to timeout from APNS #8

Closed GoogleCodeExporter closed 8 years ago

GoogleCodeExporter commented 8 years ago
What steps will reproduce the problem?
1. Run in Push Server mode
2. Leave running overnight or for several hours
3. APNS will either timeout or disconnect and ApnsPHP doesn't detect it thereby 
hanging the connection open.

Once the connection has been severed and ApnsPHP finds that fwrite returns 0 
bytes written it only creates a warning and does not close the socket and 
reconnect.  Other times when fwrite actually does return bytes written but the 
actual socket is hung or timed out ApnsPHP doesn't have a way to detect it and 
the push is never received by the phone.

What version of the product are you using? On what operating system?

Ubuntu Linux running php 5.3.2

This is consistent and reproducible.

Original issue reported on code.google.com by omnidy...@gmail.com on 2 Dec 2010 at 4:01

GoogleCodeExporter commented 8 years ago
Issue 10 has been merged into this issue.

Original comment by aldo.arm...@gmail.com on 25 Dec 2010 at 3:59

GoogleCodeExporter commented 8 years ago
hmm... i don't think that's a connection problem (and you've already merged 
it), because it happens everytime on certain tokens or devices or so, but maybe 
you are true. Are you goning to fix the issue with reconnecting due to lost 
connection? If yes, when ? :) and one more thing, as i said, it works as 
expected when i do ->send() after every message, but it lasts really a LOT. and 
it doesn't send the same message as if i run ->send() only once. so i don't 
think it's as you told. The only difference is, that when i ->send() it after 
each message, it DOES reconnect on fail, and if i don't, it doesn't. why ?

Original comment by kuk...@gmail.com on 25 Dec 2010 at 4:09

GoogleCodeExporter commented 8 years ago
I think Apple is closing connection if it discover something wrong in the 
message.

I can't reproduce the problem: please try the attached push.php.

In this version, when a connection problems is detected (0 bytes written) we 
disconnect and reconnect to Apple push gateway (the message is not removed from 
queue so it will resent on the next run).

Original comment by aldo.arm...@gmail.com on 25 Dec 2010 at 4:19

Attachments:

GoogleCodeExporter commented 8 years ago
Thank you, i will try this one then. Will you make this one also available in 
the next revision, or it's just a solution for me ? because i really want to 
stay up2date, and want to update apns-php when you release an update ;) and one 
more thing, will the message be in the error array then ? cause im checking for 
those, and if some token has problem like this for more than 3 times, i remove 
it from my database. thank you

Original comment by kuk...@gmail.com on 25 Dec 2010 at 4:33

GoogleCodeExporter commented 8 years ago
At the moment this is only a temporary solution: I need to reproduce this issue 
and then investigate on them.

The message will be in the message array if and only if on the next send there 
is an error response from Apple (e.g. Invalid token).

Original comment by aldo.arm...@gmail.com on 25 Dec 2010 at 5:06

GoogleCodeExporter commented 8 years ago

Original comment by aldo.arm...@gmail.com on 25 Dec 2010 at 5:07

GoogleCodeExporter commented 8 years ago
in my opinion, it would be okay to check for the apns connection in order to 
send each message, and if it is not available, just reconnect ... or not ? if 
you want to, you can send me an example, and i can try it. In my opinion, that 
will work, and it's not a bad solution.

Original comment by kuk...@gmail.com on 25 Dec 2010 at 5:26

GoogleCodeExporter commented 8 years ago
Fixed at revision 85.

Please, feel free to reopen this issue if this problem persist. Thanks!

Original comment by aldo.arm...@gmail.com on 25 Dec 2010 at 8:03

GoogleCodeExporter commented 8 years ago
Please, check out revision 88.

In this revision the error message will anyway always be read from the main 
stream. The latest successful message sent is the lowest between this error 
message and the message that was read from the main stream.

Original comment by aldo.arm...@gmail.com on 25 Dec 2010 at 9:31

GoogleCodeExporter commented 8 years ago
Hmm i don't know if it's my fault, but just don't understand what you wanted to 
say in the last comment. But problably it's my mistake. can you specify what 
changed? thanks

Original comment by kuk...@gmail.com on 25 Dec 2010 at 9:46

GoogleCodeExporter commented 8 years ago
In revision 85 when 0 bytes are written to server I assumed that the latest 
message was bad.

With revision 88 I always read the error message from the apple server.
If there is an Apple error message and the message id is lower that the message 
id that produced a 0 bytes the library suppose that this is the latest 
successful message sent.
Otherwise (no message from apple server) the latest message succesful sent was 
supposed to be the message before the 0 bytes error message. 

It's simple to look code diff between rev85 and rev88 :-)

Original comment by aldo.arm...@gmail.com on 25 Dec 2010 at 10:45

GoogleCodeExporter commented 8 years ago
Thank you a lot! Tomorrow i'll know if it's okay, so if it won't i'll write 
you. But I looked at the new code, and I think it should work that way. And on 
more 'feature' tip. Turning the logging on and off. cause when it'll be all 
fine, i dont want to receive emails from my cron jobs if everything is okay..  
maybe you can make something like $logType with some constants like LOG_ALL, 
LOG_ERRORS, LOG_NO. cause it's useful to receive errors on the mail from a cron 
job.

Original comment by kuk...@gmail.com on 26 Dec 2010 at 1:11

GoogleCodeExporter commented 8 years ago
Hello aldo,
It works pretty good now, it's fast, and it reconnects, but i think sometimes 
it reconnects when it doesn't have to :) i'll send you all the log, just look, 
it looks like it's reconnecting periodically after certain number of sent 
messages. And one more thing. i don't think that when you do ->send() and have 
an empty queue, it should throw an exception... It will be better to not do 
anything... so i would just replace the exception with a return; or so, because 
then it crashes all the script, and that's not needed. It just doesn't have 
anything to send, and now i have to do:
if(count($push->getQueue(false)) > 0) $push->send();
and that's not nice... an if you sometimes change the parameter for the 
function getQueue if will be bad :)
I know i can modify it myself, but i want to use your script, and want to 
update in the future.
Hope you have some time to release the next revision, heh ;)

Original comment by kuk...@gmail.com on 26 Dec 2010 at 12:23

GoogleCodeExporter commented 8 years ago
forgotten to attach the file:

Original comment by kuk...@gmail.com on 26 Dec 2010 at 12:23

Attachments:

GoogleCodeExporter commented 8 years ago
one more thing i realized is, that the first 'wrong' device with 0 bytes 
written is not the 75th everytime ... sometimes it's the 69th and so ... but 
the gaps between them are pretty similar.

Original comment by kuk...@gmail.com on 26 Dec 2010 at 8:03

GoogleCodeExporter commented 8 years ago
[deleted comment]
GoogleCodeExporter commented 8 years ago
Hi,
I don't know why Apple disconnects the client.

In my test I can send about 800-1600-2100-1700 push notification without been 
disconnected, see the attached log.txt

---

When you use the library APIs you should wrap it in a try/catch pattern because 
I can throw an exception. So, for example:

........................
try {
    $push->send();
} catch (ApnsPHP_Push_Exception $e) {
    printf("Oops, an exception thrown: %s\n", $e->getMessage());
}
........................

Original comment by aldo.arm...@gmail.com on 26 Dec 2010 at 11:07

Attachments:

GoogleCodeExporter commented 8 years ago
thank you very much :) i'll try this... don't you know why this could happen? i 
don't see any reason why apple should disconnect me randomly :( im just sending 
the same payloads to multiple devices... i don't think that's wrong somehow ... 
I'll probably write to apple after the holidays and ask them what's wrong 
because now, i don't know if the message is sent 2 times to those devices 
(probably not). and also im reconnecting to apns pretty often and lot of times 
when i have to send 4000 notifications ... i reconnect 50 times when sending 
4000 notifications. and it lasts only a minute to send them all, so it's 50 
times a minute... and i think that this is pretty often and they have a reason 
to ban me from sending push now probably... thank you aldo really A LOT. i love 
your work. it's really useful.

Original comment by kuk...@gmail.com on 26 Dec 2010 at 11:18