/** * Protected method for sending data to SMTP connection * * @param string $data data to be sent to SMTP server * @param mixed $checkCode code to check for in server response, false to skip * @return void * @throws SocketException */ protected function _smtpSend($data, $checkCode = '250') { if (!is_null($data)) { $this->_socket->write($data . "\r\n"); } while ($checkCode !== false) { $response = ''; $startTime = time(); while (substr($response, -2) !== "\r\n" && time() - $startTime < $this->_config['timeout']) { $response .= $this->_socket->read(); } if (substr($response, -2) !== "\r\n") { throw new SocketException(__d('cake_dev', 'SMTP timeout.')); } $responseLines = explode("\r\n", rtrim($response, "\r\n")); $response = end($responseLines); if (preg_match('/^(' . $checkCode . ')(.)/', $response, $code)) { if ($code[2] === '-') { continue; } return $code[1]; } throw new SocketException(__d('cake_dev', 'SMTP Error: %s', $response)); } }
/** * Получение списка worker-ов * * @param string $worker имя воркеров, параметры которого нам нужно получить * @return array массив доступных worker-ов с их загрузкой и тд */ public function getWorkers($worker = null) { // получаем статистику по worker-ам \App::uses('CakeSocket', 'Network'); $Socket = new \CakeSocket($this->_config['server']); $Socket->connect(); $workers = array(); // делаем 2 замера с интервалом в 1 секунду для получение точного результата for ($i = 0; $i <= 2; $i++) { $Socket->write("status\n"); $content = $Socket->read(50000); $answers = explode("\n", trim($content)); foreach ($answers as $string) { $temp = explode("\t", $string); $title = trim($temp[0]); if (strpos($title, 'restart') !== false || strpos($title, '.') !== false) { continue; } if (!empty($workers[$title])) { // тут нас интересует только макс. значение доступных worker-ов $workers[$title][3] = intval($workers[$title][3]) < intval($temp[3]) ? $temp[3] : $workers[$title][3]; } else { $workers[$title] = $temp; } } sleep(1); } $Socket->disconnect(); return $worker ? $workers[$worker] : $workers; }
public function write($data, $method = false, $size = 1024) { $didWrite = parent::write($data . $this->eol); if ($didWrite && $size > 0) { if ($method && is_callable(array($this, '_' . $method))) { $data = parent::read($size, $method); $method = '_' . $method; return $this->{$method}($data); } return parent::read($size); } return $didWrite; }