public function UnixPipes::readAndWrite in Zircon Profile 8
Same name and namespace in other branches
- 8.0 vendor/symfony/process/Pipes/UnixPipes.php \Symfony\Component\Process\Pipes\UnixPipes::readAndWrite()
Reads data in file handles and pipes.
Parameters
bool $blocking Whether to use blocking calls or not.:
bool $close Whether to close pipes if they've reached EOF.:
Return value
string[] An array of read data indexed by their fd.
Overrides PipesInterface::readAndWrite
File
- vendor/
symfony/ process/ Pipes/ UnixPipes.php, line 99
Class
- UnixPipes
- UnixPipes implementation uses unix pipes as handles.
Namespace
Symfony\Component\Process\PipesCode
public function readAndWrite($blocking, $close = false) {
// only stdin is left open, job has been done !
// we can now close it
if (1 === count($this->pipes) && array(
0,
) === array_keys($this->pipes)) {
fclose($this->pipes[0]);
unset($this->pipes[0]);
}
if (empty($this->pipes)) {
return array();
}
$this
->unblock();
$read = array();
if (null !== $this->input) {
// if input is a resource, let's add it to stream_select argument to
// fill a buffer
$r = array_merge($this->pipes, array(
'input' => $this->input,
));
}
else {
$r = $this->pipes;
}
// discard read on stdin
unset($r[0]);
$w = isset($this->pipes[0]) ? array(
$this->pipes[0],
) : null;
$e = null;
// let's have a look if something changed in streams
if (false === ($n = @stream_select($r, $w, $e, 0, $blocking ? Process::TIMEOUT_PRECISION * 1000000.0 : 0))) {
// if a system call has been interrupted, forget about it, let's try again
// otherwise, an error occurred, let's reset pipes
if (!$this
->hasSystemCallBeenInterrupted()) {
$this->pipes = array();
}
return $read;
}
// nothing has changed
if (0 === $n) {
return $read;
}
foreach ($r as $pipe) {
// prior PHP 5.4 the array passed to stream_select is modified and
// lose key association, we have to find back the key
$type = false !== ($found = array_search($pipe, $this->pipes)) ? $found : 'input';
$data = '';
while ('' !== ($dataread = (string) fread($pipe, self::CHUNK_SIZE))) {
$data .= $dataread;
}
if ('' !== $data) {
if ($type === 'input') {
$this->inputBuffer .= $data;
}
else {
$read[$type] = $data;
}
}
if (false === $data || true === $close && feof($pipe) && '' === $data) {
if ($type === 'input') {
// no more data to read on input resource
// use an empty buffer in the next reads
$this->input = null;
}
else {
fclose($this->pipes[$type]);
unset($this->pipes[$type]);
}
}
}
if (null !== $w && 0 < count($w)) {
while (strlen($this->inputBuffer)) {
$written = fwrite($w[0], $this->inputBuffer, 2 << 18);
// write 512k
if ($written > 0) {
$this->inputBuffer = (string) substr($this->inputBuffer, $written);
}
else {
break;
}
}
}
// no input to read on resource, buffer is empty and stdin still open
if ('' === $this->inputBuffer && null === $this->input && isset($this->pipes[0])) {
fclose($this->pipes[0]);
unset($this->pipes[0]);
}
return $read;
}