/** * Возвращает объект класса IO.Stream.ResourceStream, соответствующий stderr. * * @return IO_Stream_ResourceStream */ public static function stderr($stderr = null) { if ($stderr instanceof IO_Stream_AbstractStream) { self::$stderr = $stderr; } return self::$stderr ? self::$stderr : (self::$stderr = IO_Stream::ResourceStream(STDERR)); }
/** * Работа с флагами операций потока. */ public function testOpFlags() { /* Создание заглушек объектов */ $context = $this->getMock('IO_Stream_Context_Interface'); $opts = $this->getMock('Options_Interface'); /* Один раз будет создан новый объект настроек */ $context->expects($this->once())->method('createOptions')->will($this->returnValue($opts)); /* Один раз будут установлены опции */ $opts->expects($this->once())->method('apply'); $stream = IO_Stream::create($context); $read = IO_Stream::OPERATION_READ; $write = IO_Stream::OPERATION_WRITE; $accept = IO_Stream::OPERATION_ACCEPT; /* Ни один флаг интереса не установлен */ $this->assertFalse($stream->getInterest($read)); $this->assertFalse($stream->getInterest($write)); $this->assertFalse($stream->getInterest($accept)); /* Также ни один флаг готовности не установлен */ $this->assertFalse($stream->getReady($read)); $this->assertFalse($stream->getReady($write)); $this->assertFalse($stream->getReady($accept)); /* Устанавливаем все флаги интереса и проверяем fluent interface */ $this->assertEquals($stream, $stream->setInterest($read)); $this->assertEquals($stream, $stream->setInterest($write)); $this->assertEquals($stream, $stream->setInterest($accept)); /* Все флаги интереса должны быть установлены */ $this->assertTrue($stream->getInterest($read)); $this->assertTrue($stream->getInterest($write)); $this->assertTrue($stream->getInterest($accept)); /* Устанавливаем все флаги готовности + fluent interface */ $this->assertEquals($stream, $stream->setReady($read)); $this->assertEquals($stream, $stream->setReady($write)); $this->assertEquals($stream, $stream->setReady($accept)); /* Все флаги готовности должны быть установлены */ $this->assertTrue($stream->getReady($read)); $this->assertTrue($stream->getReady($write)); $this->assertTrue($stream->getReady($accept)); /* Проверяем сброс отдельного интереса + fluent interface */ $this->assertEquals($stream, $stream->resetInterest($read)); $this->assertFalse($stream->getInterest($read)); /* Сбрасываем все флаги интереса и проверяем fluent interface */ $this->assertEquals($stream, $stream->resetAllInterest()); /* Все флаги интереса должны быть сброшены */ $this->assertFalse($stream->getInterest($read)); $this->assertFalse($stream->getInterest($write)); $this->assertFalse($stream->getInterest($accept)); /* Сбрасываем все флаг готовности и проверяем fluent interface */ $this->assertEquals($stream, $stream->resetAllReady()); /* Все флаги готовности должны быть сброшены */ $this->assertFalse($stream->getReady($read)); $this->assertFalse($stream->getReady($write)); $this->assertFalse($stream->getReady($accept)); }
/** * Записывает данные в поток из буфера записи. * * @param int $length Размер в байтах блока данных для записи в поток. * @return int Количество записанных байт. */ public function write($length) { /* Если в буфере ничего нет, */ if ($this->_write_buffer->getLength() <= 0) { /* то мы ничего и не делаем :) */ return 0; } /* Переходим к началу буфера */ $this->_write_buffer->rewind(); /* Считываем блок данных необходимого размера */ $data = $this->_write_buffer->read($length); /* И записываем его в поток */ $bytes_written = parent::write($data); /* Если чего-то записалось, */ if ($bytes_written > 0) { /* то удаляем из буфера записанный блок */ $this->_write_buffer->release($bytes_written); } return $bytes_written; }
/** * Запускает процесс * * @return Proc_Process */ public function run() { $pipes = array(); if ($this->id = proc_open($this->command, $this->run_options, $pipes, $this->working_dir, $this->environment)) { if (isset($pipes[0])) { $this->input = IO_Stream::ResourceStream($pipes[0]); } if (isset($pipes[1])) { $this->output = IO_Stream::ResourceStream($pipes[1]); } if (isset($pipes[2])) { $this->error = IO_Stream::ResourceStream($pipes[2]); } $this->run_options = null; } return $this; }
/** * Устанавливает выходной поток во временный фаил * * @return IO_Stream_TemporaryStream */ public function to_temporary_stream() { $this->to_stream($stream = IO_Stream::TemporaryStream()); return $stream; }