I am stumped. For several days I have tried to write a simple PHP
script that can interact with the Streaming API by just pulling in the
stream and echoing out the contents. This is the script I have:
http://pastie.org/private/9owdxerouwhitz5nfacrw
Right now it just pulls in the feed and echos it. I am not parsing
anything at the moment.
This works great for a while, then the fread will start timing out
every 60 seconds (I have set the stream_timeout to 60). It will do
this after an undeterministic number of updates or number of bytes
received.
netstat shows I am still connected to stream.twitter.com but Wireshark
shows that no new data is arriving.
I have tried this on 3 different machines (2 behind the same
NAT/firewall, and 1 remote server) all with the same results.
I even scraped together a simple python script which should do the
same thing here:
http://pastie.org/private/k0p5286ljlhdyurlagnq
Same results.... works for a while, then it "stops."
Strangely, if I use CURL or telnet to open a raw socket to /spritzer
or /gardenhose it stays up forever. I had a telnet socket open on
/spritzer all weekend with no disconnects...
In the PHP script, if I add code to detect the time-outs and
immediately disconnect the socket and reconnect, the updates start
flowing in again... This is nice for error checking, but I'd really
like to figure out a more robust solution.
1) Can anyone find anything wrong with the scripts I've posted?
2) Does anyone have an example PHP script they are using to connect to
the Streaming API which stays up indefinitely?
I would like to thank John K at Twitter for helping me debug thus far.
Thanks,
-Chad
a) The stream stops after a different number of updates/bytes each
time, and will happily go on forever if I put an error-catching loop
in the script.
b) The same thing is happening in the python script.
c) Curl/telnet works fine, so it's not a system resource depletion issue....
...still confused,
-Chad
Another strange thing is that his does *not* seem to happen with the
/follow streams. I have a PHP script running (same source, just
requesting /follow instead of /spritzer) that has been connected for
over 2 days. Of course, it may die at any moment, I'm not sure..
One big difference is that the throughput for that stream is much much
less than the /hose streams, and I'm wondering if the sheer volume of
bytes being pushed has something to do with it? That would be quite
sad.
I have PHP scripts acting as Jabber/XMPP clients that use the similar
fsockopen/fread/fgets/fwrite mechanisms that have been up for months
at a time, so I know those socket connections *can* stay up a long
long time in theory.
-Chad
Thanks! I've tried it out, and it seems that it doesn't like unicode
characters? Here's the traceback I get:
Exception in thread Thread-2:
Traceback (most recent call last):
File "/usr/lib/python2.5/threading.py", line 486, in __bootstrap_inner
self.run()
File "spritzer.py", line 31, in run
print '%s -- %s' % (t['user']['screen_name'], t['text'])
UnicodeEncodeError: 'ascii' codec can't encode characters in position
11-14: ordinal not in range(128)
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python2.5/threading.py", line 486, in __bootstrap_inner
self.run()
File "spritzer.py", line 31, in run
print '%s -- %s' % (t['user']['screen_name'], t['text'])
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2625' in
position 9: ordinal not in range(128)
I'm not fluent in python, so I'm not sure of the unicode
capabilites... but otherwise it looks like it's connecting and
receiving data.
-Chad