예제 #1
0
 /**
  * listen endpoint
  *
  * @param $channels list of channels
  * @param null $callback
  */
 public function listen($channels, $callback = null)
 {
     $endpoint = $this->makeEndpoint($this->listenServerOptions);
     if (substr($this->listenServerOptions['path'], -1) != '/') {
         $endpoint .= '/';
     }
     $endpoint .= implode(',', (array) $channels);
     $response = $this->client->get($endpoint, ['debug' => $this->debug, 'stream' => true]);
     $body = $response->getBody();
     while (!$body->eof()) {
         if (is_callable($callback)) {
             call_user_func($callback, Utils::readline($body));
         } else {
             echo Utils::readline($body);
         }
     }
 }
예제 #2
0
 public function testReadsLineUntilFalseReturnedFromRead()
 {
     $s = $this->getMockBuilder('GuzzleHttp\\Stream\\Stream')->setMethods(['read', 'eof'])->disableOriginalConstructor()->getMock();
     $s->expects($this->exactly(2))->method('read')->will($this->returnCallback(function () {
         static $c = false;
         if ($c) {
             return false;
         }
         $c = true;
         return 'h';
     }));
     $s->expects($this->exactly(2))->method('eof')->will($this->returnValue(false));
     $this->assertEquals("h", Utils::readline($s));
 }
예제 #3
0
 public function testSkipsOverwrittenBytes()
 {
     $decorated = Stream::factory(implode("\n", array_map(function ($n) {
         return str_pad($n, 4, '0', STR_PAD_LEFT);
     }, range(0, 25))));
     $body = new CachingStream($decorated);
     $this->assertEquals("0000\n", Utils::readline($body));
     $this->assertEquals("0001\n", Utils::readline($body));
     // Write over part of the body yet to be read, so skip some bytes
     $this->assertEquals(5, $body->write("TEST\n"));
     $this->assertEquals(5, $this->readAttribute($body, 'skipReadBytes'));
     // Read, which skips bytes, then reads
     $this->assertEquals("0003\n", Utils::readline($body));
     $this->assertEquals(0, $this->readAttribute($body, 'skipReadBytes'));
     $this->assertEquals("0004\n", Utils::readline($body));
     $this->assertEquals("0005\n", Utils::readline($body));
     // Overwrite part of the cached body (so don't skip any bytes)
     $body->seek(5);
     $this->assertEquals(5, $body->write("ABCD\n"));
     $this->assertEquals(0, $this->readAttribute($body, 'skipReadBytes'));
     $this->assertEquals("TEST\n", Utils::readline($body));
     $this->assertEquals("0003\n", Utils::readline($body));
     $this->assertEquals("0004\n", Utils::readline($body));
     $this->assertEquals("0005\n", Utils::readline($body));
     $this->assertEquals("0006\n", Utils::readline($body));
     $this->assertEquals(5, $body->write("1234\n"));
     $this->assertEquals(5, $this->readAttribute($body, 'skipReadBytes'));
     // Seek to 0 and ensure the overwritten bit is replaced
     $body->seek(0);
     $this->assertEquals("0000\nABCD\nTEST\n0003\n0004\n0005\n0006\n1234\n0008\n0009\n", $body->read(50));
     // Ensure that casting it to a string does not include the bit that was overwritten
     $this->assertContains("0000\nABCD\nTEST\n0003\n0004\n0005\n0006\n1234\n0008\n0009\n", (string) $body);
 }
예제 #4
0
 /**
  * Stream processor
  *
  * @access  protected
  * @param   string                             $endpoint Streaming API endpoint
  * @param   Closure                            $handler  Data handler
  * @param   \GuzzleHttp\Stream\StreamInterface $stream
  * @return  void
  */
 protected function processor($endpoint, Closure $handler, StreamInterface $stream)
 {
     $stalled = time();
     while (($line = Utils::readline($stream)) !== false) {
         if (empty($line)) {
             if (time() - $stalled > $this->stallTimeout) {
                 break;
             }
             continue;
         }
         // pass each line to the data handler
         $handler(json_decode($line, $this->messageAsArray));
         if ($this->triggerReconnection($endpoint)) {
             break;
         }
         $stalled = time();
     }
 }