function onReceive_unpack_php($serv, $fd, $from_id, $data) { if (empty($this->buffer[$fd])) { $this->buffer[$fd] = ''; $this->length[$fd] = 0; } $this->buffer[$fd] .= $data; $buffer =& $this->buffer[$fd]; do { if ($this->length[$fd] === 0) { $n = unpack('Nlen', substr($buffer, 0, 4)); $this->length[$fd] = $n['len']; if ($n['len'] > self::MAX_PACKAGE_LEN) { $this->serv->close($fd); return; } } if (strlen($buffer) >= $this->length[$fd]) { $this->onPackage($fd, substr($buffer, 0, $this->length[$fd])); $buffer = substr($buffer, $this->length[$fd]); $this->length[$fd] = 0; } else { break; } } while (strlen($buffer) > 0); }
function message($fd, $code, $msg) { $this->serv->send($fd, json_encode(array('code' => $code, 'msg' => $msg))); echo "[-->{$fd}]\t{$code}\t{$msg}\n"; if ($code != 0) { $this->serv->close($fd); } return true; }
/** * 发送回应 * @param $fd * @param $code * @param $msg * @return bool */ protected function sendResult($fd, $code, $msg) { $this->serv->send($fd, $this->pack(array('code' => $code, 'msg' => $msg))); //打印日志 if (is_string($msg) and strlen($msg) < 128) { echo "[-->{$fd}]\t{$code}\t{$msg}\n"; } //错误时自动关闭连接 if ($code != 0) { $this->serv->close($fd); } return true; }
function onReceive($serv, $fd, $from_id, $data) { if (!isset($this->clients[$fd])) { $this->serv->send($fd, "backend server not connected. please try reconnect."); $this->serv->close($fd); } else { echo microtime() . ": client receive\n"; $backend_socket = $this->clients[$fd]['socket']; $backend_socket->send($data); echo microtime() . ": send to backend\n"; echo str_repeat('-', 100) . "\n"; } }
/** * listen on receive data * * @param \swoole_server $serv * @param $fd * @param $from_id * @param $data */ public function on_receive(\swoole_server $serv, $fd, $from_id, $data) { // format passed $data = str_replace(self::EOFF, '', $data); $data = unserialize($data); // check is signal for server shutdown if (!empty($data['shutdown']) || !empty($data['reload'])) { // try to clear timers $this->__clear_timer(); $send = !empty($data['shutdown']) ? $serv->shutdown() : $serv->reload(); $send = serialize($send); $send .= self::EOFF; $ends = $serv->send($fd, $send); if ($ends) { $serv->close($fd); } return; } // dont send back if (!empty($data['return']) && $data['return'] === FALSE) { $back = serialize(TRUE); $back .= self::EOFF; $serv->send($fd, $back); $serv->close($fd); } // now post data to a task $param = ['fd' => $fd, 'data' => $data]; $param = serialize($param); $param .= self::EOFF; // worker direct $this->on_task($serv, NULL, NULL, $param); return; }
/** * @param \swoole_server $serv * @param $fd * @param $from_id * @param $data */ function onReceive($serv, $fd, $from_id, $data) { $parser = new \HttpParser(); if (empty($this->buffers[$fd])) { $this->clearBuffer($fd); } $this->buffers[$fd] .= $data; $buffer =& $this->buffers[$fd]; $nparsed =& $this->nparsed[$fd]; $nparsed = $parser->execute($buffer, $nparsed); if ($parser->hasError()) { $serv->close($fd, $from_id); } else { if ($parser->isFinished()) { $this->clearBuffer($fd); $_SERVER = $parser->getEnvironment(); $_GET = array(); if (!empty($_SERVER['QUERY_STRING'])) { parse_str($_SERVER['QUERY_STRING'], $_GET); } if (!empty($_SERVER['REQUEST_BODY'])) { parse_str($_SERVER['REQUEST_BODY'], $_POST); } if (!empty($_SERVER['HTTP_COOKIE'])) { $_COOKIE = self::parseCookie($_SERVER['HTTP_COOKIE']); } $this->currentFd = $fd; call_user_func($this->_onRequest, $this); } } }
function onReceive(swoole_server $serv, $fd, $from_id, $data) { $this->count[$fd]++; echo "Client#{$fd} recv: {$data}\n"; if ($this->count[$fd] > 10) { $serv->close($fd); } else { $serv->send($fd, "hello client"); } }
public function __construct() { $serv = new swoole_server("127.0.0.1", 9502); $serv->set(array('worker_num' => 16, 'daemonize' => true)); $serv->on('connect', function ($serv, $fd) { echo "Client:Connect.\n"; }); $serv->on('receive', function ($serv, $fd, $from_id, $data) { $serv->send($fd, $data); $serv->close($fd); }); $serv->on('close', function ($serv, $fd) { echo "Client: Close.\n"; }); $serv->start(); }
public function serverAction() { $server = new swoole_server("192.168.80.140", 9021, SWOOLE_PROCESS, SWOOLE_SOCK_TCP); $setting = array('daemonize' => 0, 'reactor_num' => 2, 'worker_num' => 4, 'max_request' => 2000, 'backlog' => 128, 'open_cpu_affinity' => 1, 'open_tcp_nodelay' => 1, 'log_file' => '../log/swoole_test.log', 'heartbeat_check_interval' => 30, 'heartbeat_idle_time' => 60, 'dispatch_mode' => 2); $server->set($setting); var_dump($server->setting); $server->on("connect", function ($server, $fd) { #echo "connect\n"; }); $server->on("receive", function ($server, $fd, $from_id, $data) { $server->send($fd, 'Swoole: ' . $data); $server->close($fd); }); $server->on("close", function ($server, $fd) { #echo "close\n"; #$server->shutdown(); }); $server->start(); return false; }
<?php $serv = new swoole_server("0.0.0.0", 9509); $serv->set(array('worker_num' => 1)); $serv->on('workerStart', function ($serv, $worker_id) { //if($worker_id == 0) $serv->addtimer(500); }); $serv->on('connect', function ($serv, $fd, $from_id) { $serv->array['fd'] =& strval($fd); echo "[#" . posix_getpid() . "]\tClient@[{$fd}:{$from_id}]: Connect.\n"; }); $serv->on('receive', function ($serv, $fd, $from_id, $data) { //echo "[#".posix_getpid()."]\tClient[$fd]: $data\n"; $array = array('A', 'B', 'C', 'D', 'E', 'F', 'G'); $data = ''; $n_bytes = 0; for ($i = 0; $i < 10; $i++) { $_str = str_repeat($array[$i % 7], 4030) . "\n"; //$serv->send($fd, $_str); $n_bytes += strlen($_str); $data .= $_str; } echo "send " . $n_bytes . " bytes\n"; $serv->send($serv->array['fd'], $data); $serv->close($fd); }); $serv->on('close', function ($serv, $fd, $from_id) { echo "[#" . posix_getpid() . "]\tClient@[{$fd}:{$from_id}]: Close.\n"; }); $serv->start();
public function onError(swoole_client $cli) { Trace::debug("*********cli {$this->fd} error"); $this->serv->close($this->fd); $cli->close(); }
/** * 接收到数据时回调此函数,发生在worker进程中 * * @param $serv * @param $fd * @param $from_id * @param $data * @author yangyifan <*****@*****.**> */ public function onReceive(swoole_server $serv, $fd, $from_id, $data) { $data = json_decode($data, true); if ($data['step'] == 'task') { //开始 task $params = ['fd' => $fd, 'targer' => $data['targer'], 'params' => $data['params'], 'callback' => $data['callback']]; $serv->task($params); } else { if ($data['step'] == 'default') { $send_data = '来至' . $from_id . ':' . $data['params']['data'] . $this->swoole_config['package_eof']; echo $send_data; //$this->swoole_server->send($fd, $send_data); } } $serv->close($fd); }
public function onReceive(\swoole_server $server, $fd, $from_id, $data) { $data = trim($data); if ($data == 'Stop') { //停止 $server->shutdown(); $server->send($fd, 'success', $from_id); } else { if ($data == 'Stats') { //状态 $data = $server->stats(); $server->send($fd, json_encode($data), $from_id); } else { if ($data == 'Reload') { //重启 $server->reload(); $server->send($fd, 'success', $from_id); } else { if ($data == 'ResetTelnet') { //重置所有telnet链接 } else { $data = json_decode($data, true); if ($data['act'] == 'Telnet' && isset($data['ip']) && isset($data['cmd'])) { //执行命令 $service = TelnetEvent::getService($data['ip']); if ($service == null) { $result['code'] = 2; } else { if ($data['cmd'] > 0) { if (isset($data['arg'])) { $result['data'] = $service->exec($data['cmd'], $data['arg']); } else { $result['data'] = $service->exec($data['cmd']); } if ($result == null || $result['data'] == null) { $result = ['code' => 3]; } else { $result['code'] = 1; } } else { $service->getSwitch()->connect(); if ($service->getSwitch()->isConnect()) { $result['code'] = 1; } else { $result['code'] = 3; } } } $server->send($fd, json_encode($result), $from_id); } else { $server->send($fd, 'unknown command!', $from_id); } } } } } $server->close($fd); }
<?php /** * Created by PhpStorm. * User: zhaoquan * Date: 15-5-29 * Time: 下午2:59 */ $server = new swoole_server("127.0.0.1", 9021, SWOOLE_PROCESS, SWOOLE_SOCK_TCP); $setting = array('daemonize' => 0, 'reactor_num' => 2, 'worker_num' => 4, 'max_request' => 2000, 'backlog' => 128, 'open_cpu_affinity' => 1, 'open_tcp_nodelay' => 1, 'log_file' => '../log/swoole_test.log', 'heartbeat_check_interval' => 30, 'heartbeat_idle_time' => 60, 'dispatch_mode' => 2); $server->set($setting); var_dump($server->setting); $server->on("connect", function ($server, $fd) { echo "connect\n"; }); $server->on("receive", function ($server, $fd, $from_id, $data) { $server->send($fd, 'Swoole: ' . $data); $server->close($fd); }); $server->on("close", function ($server, $fd) { echo "close\n"; $server->shutdown(); }); $server->start();
/** * @param $client_id * @return bool */ public function close($client_id) { return $this->server->close($client_id); }
/** * 接收到数据时回调此函数,发生在worker进程中 * * @param $serv * @param $fd * @param $from_id * @param $data * @author yangyifan <*****@*****.**> */ public function onReceive(swoole_server $serv, $fd, $from_id, $data) { //解析数据 $data = json_decode($data, true); switch ($data['step']) { //异步任务 case 'task': //开始 task $params = ['fd' => $fd, 'targer' => $data['targer'], 'params' => $data['params'], 'callback' => $data['callback']]; //发送异步请求 $serv->task($params); break; //保存用户信息 //保存用户信息 case 'save_user': $user_info = unserialize($data['params']); $user_info->fd = $fd; $params = ['fd' => $fd, 'targer' => $data['targer'], 'params' => ['user_info' => serialize($user_info)], 'callback' => $data['callback']]; //发送异步请求 $serv->task($params); break; //发送消息到用户 //发送消息到用户 case 'send_message_to_user': $serv->send($data['params']['fd'], $data['params']['data']); break; //默认操作 //默认操作 case 'default': break; } //关闭连接 $serv->close($fd); }
/** * 启动计划任务,支持异步处理 */ public function runTask() { $oldErrorHandler = set_error_handler(array(__CLASS__, 'myErrorHandler')); $config = DI()->config->get('app.Swoole.task'); $ip = isset($config['ip']) ? $config['ip'] : '127.0.0.1'; $port = isset($config['port']) ? $config['port'] : 9502; $workerNum = isset($config['worker_num']) ? $config['worker_num'] : 4; $serv = new swoole_server($ip, $port); $serv->set(array('task_worker_num' => $workerNum)); $serv->on('Receive', function ($serv, $fd, $fromId, $data) { $taskId = $serv->task($data); DI()->logger->debug("asynctask({$taskId}) dispath in swoole", $data); }); $serv->on('Task', function ($serv, $taskId, $fromId, $data) { DI()->logger->debug("asynctask({$taskId}) start in swoole", $data); $params = json_decode($data, TRUE); if (!is_array($params)) { $params = array(); } DI()->request = new PhalApi_Request($params); DI()->response = new Swoole_Response_Json(); try { $phalapi = new PhalApi(); $rs = $phalapi->response(); $apiRs = $rs->getResult(); $serv->finish($rs->formatResult($apiRs)); } catch (Exception $ex) { echo $ex->getTraceAsString(); DI()->logger->error("asynctask({$taskId}) exception in swoole", $ex->getMessage()); $serv->finish("Exception: " . $ex->getMessage()); //TODO 通知管理员 } if (DI()->notorm) { DI()->notorm->disconnect(); } }); $serv->on('Finish', function ($serv, $taskId, $data) { DI()->logger->debug("asynctask({$taskId}) finish in swoole", $data); $serv->close($taskId); }); $serv->start(); }
function my_onReceive(swoole_server $serv, $fd, $from_id, $data) { my_log("Worker#{$serv->worker_pid} Client[{$fd}@{$from_id}]: received: {$data}"); $cmd = trim($data); if ($cmd == "reload") { $serv->reload(); } elseif ($cmd == "task") { $task_id = $serv->task("task-" . $fd); echo "Dispath AsyncTask: id={$task_id}\n"; } elseif ($cmd == "taskwait") { $result = $serv->taskwait("taskwait"); if ($result) { $serv->send($fd, "taskwaitok"); } echo "SyncTask: result=" . var_export($result, true) . "\n"; } elseif ($cmd == "hellotask") { $serv->task("hellotask"); } elseif ($cmd == "sendto") { $serv->sendto("127.0.0.1", 9999, "hello world"); } elseif ($cmd == "close") { $serv->send($fd, "close connection\n"); $result = $serv->close($fd); } elseif ($cmd == "info") { $info = $serv->connection_info(strval($fd), $from_id); var_dump($info["remote_ip"]); $serv->send($fd, 'Info: ' . var_export($info, true) . PHP_EOL); } elseif ($cmd == 'proxy') { $serv->send(1, "hello world\n"); } elseif ($cmd == 'sleep') { sleep(10); } elseif ($cmd == 'foreach') { foreach ($serv->connections as $fd) { echo "conn : {$fd}\n"; } return; } elseif ($cmd == 'tick') { $serv->tick(2000, function ($id) { echo "tick #{$id}\n"; }); } elseif ($cmd == 'addtimer') { $serv->addtimer(3000); } elseif ($cmd == "list") { $start_fd = 0; echo "broadcast\n"; while (true) { $conn_list = $serv->connection_list($start_fd, 10); if (empty($conn_list)) { echo "iterates finished\n"; break; } $start_fd = end($conn_list); var_dump($conn_list); } } elseif ($cmd == "list2") { foreach ($serv->connections as $con) { var_dump($serv->connection_info($con)); } } elseif ($cmd == "stats") { $serv_stats = $serv->stats(); $serv->send($fd, 'Stats: ' . var_export($serv_stats, true) . PHP_EOL); } elseif ($cmd == "broadcast") { broadcast($serv, $fd, "hello from {$fd}\n"); } elseif ($cmd == "error") { hello_no_exists(); } elseif ($cmd == "exit") { exit("worker php exit.\n"); } elseif (substr($cmd, 0, 5) == "close") { $close_fd = substr($cmd, 6); $serv->close($close_fd); } elseif ($cmd == "shutdown") { $serv->shutdown(); } elseif ($cmd == 'sendbuffer') { $buffer = G::getBuffer($fd); $buffer->append("hello\n"); $serv->send($fd, $buffer); } else { $ret = $serv->send($fd, 'Swoole: ' . $data, $from_id); var_dump($ret); //$serv->close($fd); } //echo "Client:Data. fd=$fd|from_id=$from_id|data=$data"; // $serv->after( // 800, function () { // echo "hello"; // } // ); //swoole_server_send($serv, $other_fd, "Server: $data", $other_from_id); }
function my_onReceive(swoole_server $serv, $fd, $from_id, $data) { my_log("Worker#{$serv->worker_pid} Client[{$fd}@{$from_id}]: received: {$data}"); $cmd = trim($data); if ($cmd == "reload") { $serv->reload(); } elseif ($cmd == "task") { $serv->task("task-" . $fd); } elseif ($cmd == "taskwait") { $result = $serv->taskwait("taskwait"); if ($result) { $serv->send($fd, "taskwaitok"); } } elseif ($cmd == "taskWaitMulti") { $tasks = array('taskWaitMulti', 'taskWaitMulti'); $result = $serv->taskWaitMulti($tasks); if (is_array($result)) { $serv->send($fd, "taskWaitMulti OK"); } else { $serv->send($fd, "taskWaitMulti error"); } } elseif ($cmd == "hellotask") { $serv->task("hellotask"); } elseif ($cmd == "sendto") { $serv->sendto("127.0.0.1", 9999, "hello world"); } elseif ($cmd == "close") { $serv->close($fd); } elseif ($cmd == "info") { $info = $serv->connection_info(strval($fd), $from_id); $serv->send($fd, serialize($info)); } elseif ($cmd == 'proxy') { $serv->send(1, "hello world\n"); } elseif ($cmd == 'sleep') { sleep(10); } elseif ($cmd == 'sendfile') { $serv->sendfile($fd, __DIR__ . '/test.jpg'); } elseif ($cmd == 'foreach') { foreach ($serv->connections as $fd) { echo "conn : {$fd}\n"; } return; } elseif ($cmd == 'tick') { $serv->tick(1000, function ($id) use($serv, $fd) { $serv->send($fd, "tick"); $serv->clearTimer($id); }); } elseif ($cmd == 'after') { $serv->after(1000, function ($id) use($serv, $fd) { $serv->send($fd, "after"); }); } elseif ($cmd == "list") { $start_fd = 0; echo "broadcast\n"; while (true) { $conn_list = $serv->connection_list($start_fd, 10); if (empty($conn_list)) { echo "iterates finished\n"; break; } $start_fd = end($conn_list); var_dump($conn_list); } } elseif ($cmd == "list2") { foreach ($serv->connections as $con) { var_dump($serv->connection_info($con)); } } elseif ($cmd == "stats") { $serv_stats = $serv->stats(); $serv->send($fd, 'Stats: ' . var_export($serv_stats, true) . "\ncount=" . count($serv->connections) . PHP_EOL); } elseif ($cmd == "broadcast") { broadcast($serv, $fd, "hello from {$fd}\n"); } elseif ($cmd == "error") { hello_no_exists(); } elseif ($cmd == "exit") { exit("worker php exit.\n"); } elseif (substr($cmd, 0, 5) == "close") { $close_fd = substr($cmd, 6); $serv->close($close_fd); } elseif ($cmd == "shutdown") { $serv->shutdown(); } elseif ($cmd == "fatalerror") { require __DIR__ . '/php/error.php'; } elseif ($cmd == 'sendbuffer') { $buffer = G::getBuffer($fd); $buffer->append("hello\n"); $serv->send($fd, $buffer); } elseif ($cmd == 'defer') { $serv->defer(function () use($fd, $serv) { $serv->close($fd); $serv->defer(function () { echo "deferd\n"; }); }); $serv->send($fd, 'Swoole: ' . $data, $from_id); } elseif ($cmd == 'big_resp') { $serv->send($fd, str_repeat('A', 256 * 1024)); } elseif ($cmd == 'big_task') { $serv->task($fd . ' ' . str_repeat('A', 256 * 1024 - 8)); } else { $serv->send($fd, 'Swoole: ' . $data, $from_id); //$serv->close($fd); } //echo "Client:Data. fd=$fd|from_id=$from_id|data=$data"; // $serv->after( // 800, function () { // echo "hello"; // } // ); //swoole_server_send($serv, $other_fd, "Server: $data", $other_from_id); }
function close($client_id) { return $this->sw->close($client_id); }
function my_onTask(swoole_server $serv, $task_id, $from_id, $data) { if ($data == 'taskwait') { $fd = str_replace('task-', '', $data); $serv->send($fd, "hello world"); return array("task" => 'wait'); } elseif ($data == 'taskcallback') { return array("task" => 'callback'); } else { $cmd = explode(' ', $data); if ($cmd[0] == 'send') { $serv->send($cmd[1], str_repeat('A', 10000) . "\n"); } elseif ($cmd[0] == 'close') { $serv->close($cmd[1]); } // $serv->sendto('127.0.0.1', 9999, "hello world"); //swoole_timer_after(1000, "test"); // var_dump($data); // $serv->send($fd, str_repeat('A', 8192 * 2)); // $serv->send($fd, str_repeat('B', 8192 * 2)); // $serv->send($fd, str_repeat('C', 8192 * 2)); // $serv->send($fd, str_repeat('D', 8192 * 2)); return; } if ($data == "hellotask") { broadcast($serv, 0, "hellotask"); } else { echo "AsyncTask[PID=" . $serv->worker_pid . "]: task_id={$task_id}." . PHP_EOL; //eg: test-18 return $data; } }
public function my_onReceive(\swoole_server $serv, $fd, $from_id, $rdata) { $data = json_decode($rdata, true); if (isset($data['class'])) { $type = $data['class']; if (!isset(self::$cnt[$type])) { // 没有专属处理进程,则使用公共进程 $type = 'Common'; } $tid = $this->getTaskId($type); $data['fd'] = $fd; $rs = $serv->task($data, $tid); //调用task事件 echo "receive to task ,task_id ={$tid} \n"; return; } else { echo "没有相应 事件处理类, 报警\n"; $serv->close($fd); //服务端主动断开连接 } return; }
/** * 关闭连接 * 如果传了fd ,则关闭指定连接 * @return [type] [description] */ public function close(\swoole_server $serv, $fd = '', $from_id = '', $data = '') { $serv->close($fd); }