%PDF- %PDF-
Direktori : /home/graphicd/www/vebto/vendor/pda/pheanstalk/src/Socket/ |
Current File : /home/graphicd/www/vebto/vendor/pda/pheanstalk/src/Socket/FileSocket.php |
<?php namespace Pheanstalk\Socket; use Pheanstalk\Contract\SocketInterface; use Pheanstalk\Exception\SocketException; /** * A Socket implementation using the standard file functions. */ abstract class FileSocket implements SocketInterface { /** @var ?resource */ protected $socket; /** * Writes data to the socket. * * @param string $data * * @return void */ public function write(string $data): void { $this->checkClosed(); $retries = 0; error_clear_last(); while (!empty($data) && $retries < 10) { $written = fwrite($this->socket, $data); if ($written === false) { $this->throwException(); } elseif ($written === 0) { $retries++; continue; } $data = substr($data, $written); } if (!empty($data)) { throw new SocketException('Write failed'); } } private function throwException() { if (null === $error = error_get_last()) { throw new SocketException('Unknown error'); } throw new SocketException($error['message'], $error['type']); } private function checkClosed() { if (!isset($this->socket)) { throw new SocketException('The connection was closed'); } } /** * Reads up to $length bytes from the socket. * * @return string */ public function read(int $length): string { $this->checkClosed(); $buffer = ''; while (mb_strlen($buffer, '8bit') < $length) { $result = fread($this->socket, $length - mb_strlen($buffer, '8bit')); if ($result === false) { $this->throwException(); } $buffer .= $result; } return $buffer; } /** * Reads up to the next new-line. * Trailing whitespace is trimmed. * * @param int */ public function getLine(): string { $this->checkClosed(); $result = fgets($this->socket, 8192); if ($result === false) { $this->throwException(); } return rtrim($result); } /** * Disconnect the socket; subsequent usage of the socket will fail. */ public function disconnect(): void { $this->checkClosed(); fclose($this->socket); $this->socket = null; } }