function my_onReceive(swoole_server $serv, $fd, $from_id, $rdata) { $data = unserialize($rdata); if (isset($data['cmd'])) { switch ($data['cmd']) { case 'get': $s = microtime(true); $res = $serv->taskwait($data, 0.5, 0); echo "use " . (microtime(true) - $s) * 1000 . "ms\n"; $serv->send($fd, PHP_EOL . "get " . $res['key'] . ": " . $res['val']); break; case "set": $serv->task($data, 0); $serv->send($fd, "OK\n"); break; case "del": $serv->task($data, 0); break; case "reload": break; default: echo "server:" . $data . PHP_EOL; } } }
public function onReceive(swoole_server $serv, $fd, $from_id, $data) { echo "Get Message from client {$fd}:{$data}:{$from_id}\n"; $params = array('fd' => $fd, 'file' => $data); $id = $serv->task(json_encode($params)); echo "Continue Handle Worker {$id}\n"; }
public function onReceive(swoole_server $serv, $fd, $from_id, $data) { echo "Get Message From Client {$fd}:{$data}\n"; $this->test = new Test(); var_dump($this->test); $serv->task(serialize($this->test)); }
public function onReceive(swoole_server $serv, $fd, $from_id, $data) { echo "Get Message From Client {$fd}:{$data}\n"; // send a task to task worker. $param = array('fd' => $fd, 'source' => $data); $serv->task(json_encode($param)); echo "Continue Handle Worker\n"; }
function my_onReceive(swoole_server $serv, $fd, $from_id, $data) { if ($serv->exist($fd)) { echo 'FD[' . $fd . '] exist' . PHP_EOL; } else { echo 'FD[' . $fd . '] not exist' . PHP_EOL; } $serv->task($data . '-' . $fd); }
public function onReceive(\swoole_server $serv, $fd, $from_id, $rdata) { $rdata = \Xz\Lib\Core\JsonProtocol::decode($rdata); $data = array(); $data['data'] = $rdata; $data['fd'] = $fd; $serv->task($data); return; }
/** * 投递一个任务 * @param \CatLib\Constraint\Network\IPacket $data 数据 * @param int $index 投递任务线程ID , -1随机 * @return bool */ public function task(IPacket $data, $index = -1) { if (isset($this->server->worker_id)) { if (!$this->server->taskworker) { $this->server->task($data->serialize(), $index); return true; } } return false; }
public function onWorkerStart(\swoole_server $server, $worker_id) { if ($server->taskworker) { swoole_set_process_name('switch_manage_task_worker'); $server->sendMessage('worker start.', $server->worker_id - 1); } else { swoole_set_process_name('switch_manage_event_worker'); if ($worker_id == 0) { //防止tick被重复启动 $server->tick(self::INTERVAL_PING, function () use($server) { $server->task('Ping'); }); } } }
function onTimer(\swoole_server $serv, $interval) { $interfaces = \Swoole::$php->redis->sMembers(self::PREFIX); if (!empty($interfaces)) { foreach ($interfaces as $in) { $key = self::PREFIX . "::" . $in; $tmp = \Swoole::$php->redis->hGetAll($key); // $this->log("{$this->worker_id} interfaces detials ".print_r($tmp,1)); if (!empty($tmp) and $tmp['enable_alert'] == 1 and !empty($tmp['alert_uids'])) { $serv->task($tmp); } else { $this->log("{$this->worker_id} interface condition error " . var_export($tmp, 1)); } } } }
/** * 启动计划任务,支持异步处理 */ 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(); }
/** * 服务端接收数据 * * @param $serv swoole_server对象 * @param $fd 连接的描述符 * @param $from_id reactor的id,无用 * @param $data 接收数据 */ public function onReceive(swoole_server $serv, $fd, $from_id, $data) { //检测数据完整性 if (JsonProtocol::check($data) != 0) { return; } $data = JsonProtocol::decode($data); //接收参数 $class = $data['class']; $method = $data['method']; $params = $data['params']; $startTime = $this->microtimeFloat(); // 判断类对应文件是否载入 if (!class_exists($class)) { $include_file = ROOT_DIR . "Server/{$class}.php"; if (is_file($include_file)) { require_once $include_file; } if (!class_exists($class)) { $code = 404; $msg = "class {$class} not found"; $result = array('code' => $code, 'msg' => $msg, 'data' => null); $serv->send($fd, JsonProtocol::encode($result)); } } // 调用类的方法 try { $ret = call_user_func_array(array(new $class(), $method), $params); $code = $ret['code']; $msg = $ret['msg']; // 发送数据给客户端,调用成功,data下标对应的元素即为调用结果 $serv->send($fd, JsonProtocol::encode($ret)); } catch (Exception $e) { // 发送数据给客户端,发生异常,调用失败 $code = $e->getCode() ? $e->getCode() : 500; $msg = $e->getMessage(); $result = array('code' => $code, 'msg' => $msg, 'data' => $e); $serv->send($fd, JsonProtocol::encode($result)); } //请求数据统计,放在task执行 $executionTime = $this->microtimeFloat() - $startTime; $report = array('class' => $class, 'method' => $method, 'params' => json_encode($params), 'code' => $code, 'msg' => $msg, 'execution' => $executionTime, 'time' => time()); $serv->task(json_encode($report)); }
public function onReceive(swoole_server $serv, $fd, $from_id, $data) { $sql = array('sql' => 'Insert into Test values( pid = ?, name = ?)', 'param' => array(0, "'name'"), 'fd' => $fd); $serv->task(json_encode($sql)); }
<?php $serv = new swoole_server("127.0.0.1", 9501); $serv->set(array('worker_num' => 1, 'task_worker_num' => 4)); $serv->on('Receive', function (swoole_server $serv, $fd, $from_id, $data) { //AsyncTask $data = trim($data); //$data = str_repeat('A', 8192*100); // if ($data == 'async') //if(false) if (true) { $task_id = $serv->task($data, 0); $serv->send($fd, "Dispath AsyncTask: id={$task_id}\n"); } else { $res = $serv->taskwait($data, 10); echo "Dispath SyncTask: result=" . $res . PHP_EOL; } //$serv->send($fd, "OK\n"); }); $serv->on('Task', function (swoole_server $serv, $task_id, $from_id, $data) { echo "#{$serv->worker_id}\tonTask: [PID={$serv->worker_pid}]: task_id={$task_id}, data_len=" . strlen($data) . "." . PHP_EOL; $serv->finish($data); // return; }); $serv->on('Finish', function (swoole_server $serv, $task_id, $data) { echo "Task#{$task_id} finished, data_len=" . strlen($data) . PHP_EOL; }); $serv->on('workerStart', function ($serv, $worker_id) { global $argv; if ($worker_id >= $serv->setting['worker_num']) { swoole_set_process_name("php {$argv[0]}: task_worker");
<?php $serv = new swoole_server("127.0.0.1", 9501); $serv->set(array('worker_num' => 1, 'task_worker_num' => 2)); $serv->on('Receive', function (swoole_server $serv, $fd, $from_id, $data) { //AsyncTask $data = intval($data); for ($i = 0; $i < $data; $i++) { $tid = mt_rand(0, 1); echo "data:{$i} to task: {$tid} " . PHP_EOL; $serv->task($i, $tid); } }); $serv->on('Task', function (swoole_server $serv, $task_id, $from_id, $data) { echo "onTask: [PID=" . posix_getpid() . "]: task_id={$task_id}, data_len=" . strlen($data) . "." . PHP_EOL; sleep(10); //$serv->finish($data); echo 'finish' . PHP_EOL; return; }); $serv->on('Finish', function (swoole_server $serv, $task_id, $data) { echo "Task#{$task_id} finished, data_len=" . strlen($data) . PHP_EOL; }); $serv->on('Timer', function (swoole_server $serv, $time) { echo "{$time} call" . PHP_EOL; print_r($serv->stats()); }); $serv->on('workerStart', function ($serv, $worker_id) { global $argv; if ($worker_id >= $serv->setting['worker_num']) { swoole_set_process_name("php {$argv[0]}: task_worker");
<?php date_default_timezone_set('Asia/Shanghai'); $serv = new swoole_server('0.0.0.0', 9094, SWOOLE_PROCESS, SWOOLE_SOCK_UDP); $serv->set(['worker_num' => 1, 'task_worker_num' => 4, 'daemonize' => false, 'log_file' => '/tmp/swoole_udp_server.log']); $serv->on('receive', function (swoole_server $serv, $fd, $reactor_id, $data) { $task_id = $serv->task($data); $ymdhi = date('YmdHi'); swoole_async_write('/tmp/' . $ymdhi . '.txt', $data . "\n", -1); }); $serv->on('task', function ($serv, $task_id, $from_id, $data) { var_dump($serv->taskworker, $serv->worker_id, $serv->worker_pid); \ran\Ran::run($serv->worker_id, $data); return true; }); $serv->on('finish', function () { }); $serv->on('start', function ($serv) { swoole_async_writefile('/tmp/swoole_master_pid.log', $serv->master_pid, function ($filename) { }); // swoole_set_process_name("php swoole udp server master".$serv->master_pid); }); $serv->on('workerStart', function ($serv, $worker_id) { if ($worker_id >= $serv->setting['worker_num']) { //超过worker_num,表示这是一个task进程 // swoole_set_process_name("php swoole udp server tasker ".$worker_id); echo "{$worker_id} tasker start\n"; require './vendor/autoload.php'; } else { echo "{$worker_id} worker start\n"; // swoole_set_process_name("php swoole udp server worker ".$worker_id);
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; }
<?php $serv = new swoole_server("127.0.0.1", 9501); $serv->set(['worker_num' => 1, 'task_worker_num' => 1]); $serv->sleep = true; $serv->count = 500; $serv->on('connect', function (swoole_server $serv, $fd) { echo "Client:Connect.\n"; $data = str_repeat("A", 8000); for ($i = 0; $i < $serv->count; $i++) { //$serv->send($fd, $data); $serv->task($data); } }); $serv->on('receive', function ($serv, $fd, $from_id, $data) { // if ($serv->sleep) { // sleep(10); // $serv->sleep = false; // } //echo "recv n=".strlen($data)."\n"; //$serv->send($fd, 'Swoole: hello'); }); $serv->on('close', function ($serv, $fd) { echo "Client: Close.\n"; }); $serv->on('task', function ($serv, $task_id, $from_id, $data) { static $count = 0; if ($serv->sleep) { sleep(10); $serv->sleep = false; }
function my_onFinish(swoole_server $serv, $task_id, $data) { $is_send = 0; $rs = $data['rs']; if (is_array($data['rs'])) { // 失败了 if ($rs['err_no'] > 0) { $tid = $this->getTaskId('Retry'); echo "faild tid: {$tid} \n"; $task_data['class'] = $rs['class']; $task_data['param'] = $rs['param']; $task_data['fd'] = $data['fd']; $task_data['retry_cnt'] = $rs['retry_cnt']; if ($rs['retry_cnt'] < 3) { $serv->task($task_data, $tid); } else { $is_send = 1; echo "超过3次,需要报警! \n"; } } else { // 第一次就成功了。 $is_send = 1; } $rs = json_encode($data['rs']); } else { $is_send = 1; } if ($is_send > 0) { $serv->send($data['fd'], $rs); } }
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 my_onReceive(swoole_server $serv, $fd, $from_id, $data) { echo "Client: fd={$fd} pid: " . posix_getpid() . " send: {$data}"; $serv->task($fd . '|' . $data); }
function onTimer(\swoole_server $serv, $interval) { /** * worker */ if ($this->worker_id <= $this->setting['worker_num'] - 1) { $time_key = self::getMinute(); $this->log("worker [{$this->worker_id}] onTimer ({$this->recyle_time}) time_key : {$time_key} -- " . count($this->count)); if (!empty($this->count)) { foreach ($this->count as $key => $v) { $m = explode('_', $key, 4); if ($time_key == $m[2]) { continue; } $target_id = $m[1] % $this->setting['task_worker_num']; $this->log("[{$this->worker_id}] task {$key} to " . $target_id); $serv->task(json_encode($v), $target_id); unset($this->count[$key]); } } } else { /** * task worker */ $time_key = self::getMinute(); $this->log("task worker [" . $this->worker_id . "] onTimer ({$this->insert_time}) time_key : {$time_key} -- " . count($this->task_count)); $this->taskReport(); } }
/** * 接收到数据时回调此函数,发生在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); }
<?php $serv = new swoole_server("127.0.0.1", 9501); $serv->set(['worker_num' => 1, 'task_worker_num' => 1]); $serv->sleep = true; $serv->count = 500; $serv->on('connect', function (swoole_server $serv, $fd) { echo "Client:Connect.\n"; $data = str_repeat("A", 8000); for ($i = 0; $i < $serv->count; $i++) { //$serv->send($fd, $data); $ret = $serv->task($data); if ($ret === false) { echo "dispatch task#{$i} failed\n"; break; } } echo "dispatch {$serv->count} tasks finish.\n"; }); $serv->on('receive', function ($serv, $fd, $from_id, $data) { // if ($serv->sleep) { // sleep(10); // $serv->sleep = false; // } //echo "recv n=".strlen($data)."\n"; //$serv->send($fd, 'Swoole: hello'); }); $serv->on('close', function ($serv, $fd) { echo "Client: Close.\n"; }); $serv->on('task', function ($serv, $task_id, $from_id, $data) {
$serv = new swoole_server("0.0.0.0", 9501, SWOOLE_BASE); //$serv = new swoole_server("0.0.0.0", 9501); $serv->set(array('worker_num' => 2, 'task_worker_num' => 2)); $serv->on('pipeMessage', function ($serv, $src_worker_id, $data) { echo "#{$serv->worker_id} message from #{$src_worker_id}: {$data}\n"; }); $serv->on('task', function (swoole_server $serv, $task_id, $from_id, $data) { echo "#{$serv->worker_id} NewTask: {$data}\n"; $serv->sendMessage($data, 0); //$serv->send($fd, str_repeat('B', 1024*rand(40, 60)).rand(10000, 99999)."\n"); }); $serv->on('finish', function ($serv, $fd, $from_id) { }); $serv->on('receive', function (swoole_server $serv, $fd, $from_id, $data) { $cmd = trim($data); if ($cmd == 'totask') { $serv->sendMessage("hello task process", 2); } elseif ($cmd == 'toworker') { $worker_id = 1 - $serv->worker_id; $serv->sendMessage("hello worker", $worker_id); } elseif ($cmd == 'task2worker') { $serv->task('hello worker from task.'); } else { echo "#{$serv->worker_id} Recv: {$data}\n"; } }); $serv->on('close', function ($serv, $fd, $from_id) { //echo "[#".posix_getpid()."]\tClient@[$fd:$from_id]: Close.\n"; }); $serv->start();
<?php $serv = new swoole_server("0.0.0.0", 9501); $serv->set(array('worker_num' => 2, 'task_worker_num' => 2)); $serv->on('pipeMessage', function ($serv, $src_worker_id, $data) { echo "#{$serv->worker_id} message from #{$src_worker_id}: {$data}\n"; }); $serv->on('task', function ($serv, $task_id, $from_id, $data) { var_dump($task_id, $from_id, $data); $fd = $data; //$serv->send($fd, str_repeat('B', 1024*rand(40, 60)).rand(10000, 99999)."\n"); }); $serv->on('finish', function ($serv, $fd, $from_id) { }); $serv->on('receive', function (swoole_server $serv, $fd, $from_id, $data) { if (trim($data) == 'task') { $serv->task("async task coming"); } else { $worker_id = 1 - $serv->worker_id; $serv->sendMessage("hello task process", $worker_id); } }); $serv->on('close', function ($serv, $fd, $from_id) { //echo "[#".posix_getpid()."]\tClient@[$fd:$from_id]: Close.\n"; }); $serv->start();
/** * 接收到数据时回调此函数,发生在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); }
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); }
public function onStart(\swoole_server $serv) { global $argv; swoole_set_process_name("php {$argv[0]}: statistics_master"); //初始化统计 $this->table->set('real_statistics', $this->redis_arr); //$this->table->set('time_statistics',$this->redis_arr); //table数据写入redis共享给websocket $serv->tick(1000, function () { $redis = $this->getRedis(); $statistics = []; $real_st = $this->table->get('real_statistics'); //重置计数 $this->table->set('real_statistics', $this->redis_arr); $statistics['real_statistics'] = $real_st ? $real_st : $this->redis_arr; $redis = $this->getRedis(); $dmain = $redis->get('dmain'); if ($dmain) { $dmain = explode('|', $dmain); foreach ($dmain as $value) { //echo $value; $dmain_st = $this->table->get($value); $statistics[$value] = $dmain_st ? $dmain_st : $this->redis_arr; //重置计数 $this->table->set($value, $this->redis_arr); } } //共享到redis $statistics = json_encode($statistics); $redis->set('real_statistics', $statistics); }); //定时器记录统计到数据库 $serv->tick(600000, function () use($serv) { //获取统计记录 /*$data = $this->table->get('time_statistics'); if ($data) { $data['dmain'] = 'time_statistics'; $data['time'] = date('Y-m-d H:i:s'); $data['task_type'] = 'statistic_log'; $serv->task($data); }*/ $data['time'] = time(); $data['task_type'] = 'write_interface_log'; $serv->task($data); $data['task_type'] = 'clean_interface_log'; $serv->task($data); //初始化统计 //$this->table->set('time_statistics', $this->redis_arr); $redis = $this->getRedis(); $dmain = $redis->get('dmain'); //print_r($dmain); if ($dmain) { $dmain = explode('|', $dmain); foreach ($dmain as $value) { $dmain_data = $this->table->get('t_' . $value); if ($dmain_data) { //echo 2222; $dmain_data['dmain'] = $value; $dmain_data['time'] = date('Y-m-d H:i:s'); $dmain_data['task_type'] = 'statistic_log'; $serv->task($dmain_data); } $this->table->set('t_' . $value, $this->redis_arr); } } }); }
echo 'pid:' . posix_getpid() . ".\n"; }); $crawler_server->on('shutdown', function (swoole_server $crawler_server) { echo 'server shutdown time--' . date('Y-m-d H:i:s') . "\n"; echo 'server_pid:' . posix_getpid() . ".\n"; }); $crawler_server->on('receive', function (swoole_server $crawler_server, $fd, $from_id, $data) { echo 'server receive time--' . date('Y-m-d H:i:s') . "\n"; echo 'client fd:' . $fd . "\n"; echo 'client--from_id:' . $from_id . "\n"; $data = json_decode($data, true); $cmd = $data['cmd']; unset($data['cmd']); switch ($cmd) { case 'fetch': $crawler_server->task($data, 0); $crawler_server->send($fd, "OK\n"); break; default: echo "error cmd \n"; } }); $crawler_server->on('task', function (swoole_server $crawler_server, $task_id, $from_id, $data) { echo 'task start time--' . date('Y-m-d H:i:s') . "\n"; echo 'tast_id :' . $task_id . "\n"; echo 'client--from_id:' . $from_id . "\n"; $driver = isset($data['driver']) ? $data['driver'] : ''; $method = isset($data['method']) ? $data['method'] : 'fetch'; $object = isset($data['object']) ? unserialize($data['object']) : ''; $class = isset($data['class']) ? $data['class'] : 'Crawl'; if (!$class && !$object || !$method) {
/** * 在Task进程调用执行指定HandlerID的Handler * @param type $handlerID Handler的ID * @param \swoole_server $server 服务对象 * @param array $handlerParams 传给Handler的额外参数 * @param intger $taskID 指定执行任务的HandlerID,会覆盖Handler的默认ID */ function DICallHandler($handlerID, \swoole_server &$server, array $handlerParams = [], $taskID = 0) { $handlers = DIHandler($handlerID); foreach ($handlers as $handlerKey => $handler) { /* @var \DIServer\Handler $handler */ if (NULL !== $handler) { $handlerParams['handlerID'] = $handlerID; $handlerParams['handlersKey'] = $handlerKey; $server->task($handlerParams, $taskID ?: $handler->TaskID($handlerParams)); } } }