Why are you writing your own PHP Streaming API client? It's somewhat
complicated to get all the details right. The Phirehose library seems to be
well received, and it's incorporated lots of fixes for corner cases.

-John Kalucki
http://twitter.com/jkalucki
Twitter, Inc.



On Tue, Sep 21, 2010 at 6:12 AM, Nicolas Grasset
<nicolas.gras...@gmail.com>wrote:

> Thanks for the quick reply!
>
> I went back to testing with command line with a curl call, it worked
> so I realized the PHP code was buffering and I did not realize it on
> large amount of results...
>
> The problem was with an internal buffer between cURL and the PHP
> Stream. I went another way instead and posting a PHP base class if it
> may help anyone else.
>
> I typically extend it to override handleTweet($tweet).
>
>
> <?php
>
> class snow_twitter_bot {
>
>    protected $buffer;
>
>
>    /**
>     *  Read a stream looking for track keywords on behalf of a user
>     *
>     *
>     * @param string $track                             Comma separated
> values keywords
>     * @param string $twitter_user              Twitter username
>     * @param string $twitter_pass              Twitter password
>     */
>    public function readStreamFilter( $track, $twitter_user,
> $twitter_pass )
>    {
>
>                $wait = 10;
>                while( true )
>                {
>
>                        echo "\n" . date("c") . " - Connecting to Twitter
> Stream\n";
>
>                        // Configuration of curl
>                        $ch = curl_init();
>                        curl_setopt($ch, CURLOPT_URL,
>     "http://stream.twitter.com/1/
> statuses/filter.json");
>                        curl_setopt($ch, CURLOPT_HEADER,
>    0);
>                        curl_setopt($ch, CURLOPT_RETURNTRANSFER,
>  "default");
>                        curl_setopt($ch, CURLOPT_POST,
>    true);
>                        curl_setopt($ch, CURLOPT_POSTFIELDS,
>  "track=$track");
>                        curl_setopt($ch, CURLOPT_HTTPAUTH,
>    CURLAUTH_BASIC ) ;
>                        curl_setopt($ch, CURLOPT_USERPWD,
>     "$twitter_user:
> $twitter_pass");
>
>                        curl_setopt($ch, CURLOPT_WRITEFUNCTION,
> array($this,
> "receiveResponse"));
>
>                        curl_exec($ch);
>
>                        $info = curl_getinfo($ch);
>
>                        if( $info['http_code'] == 200 )
>                                $wait = 10;
>                        else
>                        {
>                                echo "\n" . date("c") . " - ERROR
> ($info[http_code]) - Waiting
> $wait sec \n";
>                                sleep ( $wait );
>                                $wait *= ($wait >= 240 ) ? 1 : 2;
>                        }
>                }
>
>
>                curl_close($ch);
>    }
>
>
>    /**
>     *  Call back function for cURL
>     *
>     *
>     * @param curl handler $curlHandle
>     * @param string $data
>     */
>    private function receiveResponse( $curlHandle, $data )
>    {
>        $lines = explode("\n", $data);
>
>        // The buffer contains the end of the last line from previous
> time
>        // => Is goes at the beginning of the first line we are
> getting this time
>        $lines[0] = $this->buffer . $lines[0];
>
>        // And the last line os only partial
>        // => save it for next time, and remove it from the list this
> time
>        $nb_lines = count($lines);
>        $this->buffer = $lines[$nb_lines-1];
>        unset($lines[$nb_lines-1]);
>
>        // Here, do your work with the lines you have in the buffer
>        foreach( $lines as $one )
>        {
>                $tweet = @json_decode($one,1);
>                if(isset($tweet['user']['screen_name']))
>                {
>                        $this->handleTweet( $tweet );
>                }
>        }
>
>                return strlen( $data );
>    }
>
>
>
>    /**
>     *  Called for each tweet.
>     *
>     *  Override me with you logic /twss
>     *
>     *
>     * @param array $tweet      A single tweet parsed from json, see online
> doc.
>     */
>    public function handleTweet( $tweet )
>    {
>        echo '@'.$tweet['user']['screen_name']." at " .
> $tweet['created_at']. " says:\n";
>        echo $tweet['text']."\n";
>        echo "\n------ Memory: " . round(memory_get_usage(true)/
> 1024) ."kb\n";
>    }
>
>
> }
>
>
> ?>
>
>
> On Sep 21, 12:57 am, John Kalucki <j...@twitter.com> wrote:
> > You say you are backing off on HTTP connections. Are you connecting
> > constantly, or just once, and staying connected for very long periods?
> Are
> > you tracking the number of limit messages you are receiving? Perhaps your
> > track search was rate limited?
> >
> > -John Kaluckihttp://twitter.com/jkalucki
> > Twitter, Inc.
> >
> > On Mon, Sep 20, 2010 at 2:46 PM, Nicolas Grasset
> > <nicolas.gras...@gmail.com>wrote:
> >
> >
> >
> > > Hi there,
> >
> > > I have been reading many comments here, and while it seems at least
> > > another person had the same issue, I could not find an answer.
> >
> > > I have a test account (@hemtexdream) using the statuses/filter stream
> > > api which works on words like twitter or trending hashtags like
> > > #ireallythink.
> >
> > > However, I would like it to work with track=#dreamproject and it gets
> > > none of the tweets from my main account (@fellowshipofone). Tried over
> > > long period of time and with a few settings. I am fairly sure I am not
> > > rate limited since I implement the logic to report http error
> > > responses and back off exponentially.
> >
> > > Also, if of any help, both accounts can find at least 2 tweets in the
> > > website search page.
> >
> > > Is it an index question? Is it a "sample" question?
> >
> > > Thanks for your help!
> >
> > > --
> > > Twitter developer documentation and resources:
> http://dev.twitter.com/doc
> > > API updates via Twitter:http://twitter.com/twitterapi
> > > Issues/Enhancements Tracker:
> > >http://code.google.com/p/twitter-api/issues/list
> > > Change your membership to this group:
> > >http://groups.google.com/group/twitter-development-talk?hl=en
>
> --
> Twitter developer documentation and resources: http://dev.twitter.com/doc
> API updates via Twitter: http://twitter.com/twitterapi
> Issues/Enhancements Tracker:
> http://code.google.com/p/twitter-api/issues/list
> Change your membership to this group:
> http://groups.google.com/group/twitter-development-talk?hl=en
>

-- 
Twitter developer documentation and resources: http://dev.twitter.com/doc
API updates via Twitter: http://twitter.com/twitterapi
Issues/Enhancements Tracker: http://code.google.com/p/twitter-api/issues/list
Change your membership to this group: 
http://groups.google.com/group/twitter-development-talk?hl=en

Reply via email to