protected function writeSocket($message)
{
$ret = false;
$length = strlen($message);
$written = 0;
$attempts = self::MAX_RETRY_ATTEMPTS;
$socket = stream_socket_client($this->scheme . "://" . $this->host . ":" . $this->port, $errno, $errmsg, $this->timeout, \STREAM_CLIENT_CONNECT | \STREAM_CLIENT_ASYNC_CONNECT);
if ($socket !== false) {
stream_set_timeout($socket, $this->timeout);
stream_set_blocking($socket, false);
stream_set_write_buffer($socket, 0);
do {
$bytes = fwrite($socket, $message);
if (empty($bytes)) {
if (--$attempts === 0) {
trigger_error("Attempts writing to a backend exceeded", E_USER_WARNING);
break;
}
if ($bytes === false) {
trigger_error("Couldn't write. Probably the PIPE is broken or socket closed", E_USER_WARNING);
break;
} elseif ($bytes === "") {
trigger_error("Connection aborted", E_USER_WARNING);
break;
}
$errors = error_get_last();
if ($errors) {
if (isset($errors['message']) && strpos($errors['message'], 'errno=32 ') !== false) {
fclose($socket);
$socket = stream_socket_client($this->scheme . "://" . $this->host . ":" . $this->port, $errno, $errmsg, $this->timeout, \STREAM_CLIENT_CONNECT | \STREAM_CLIENT_ASYNC_CONNECT);
} else {
if (isset($errors['message']) && strpos($errors['message'], 'errno=11 ') !== false) {
// ignore EAGAIN message
} else {
trigger_error("An unhandled error detected " . $errors['message'], E_USER_WARNING);
}
}
}
$this->sleepWait();
} else {
$written += $bytes;
if ($written < $length) {
$message = substr($message, 0, $bytes);
} else {
$ret = true;
}
}
} while ($written < $length);
fclose($socket);
}
return $ret;
}