Пример #1
0
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;
        }
    }
}
Пример #2
0
 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";
 }
Пример #3
0
 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));
 }
Пример #4
0
 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";
 }
Пример #5
0
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);
}
Пример #6
0
 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;
 }
Пример #7
0
 /**
  * 投递一个任务
  * @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;
 }
Пример #8
0
 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');
             });
         }
     }
 }
Пример #9
0
 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));
             }
         }
     }
 }
Пример #10
0
 /**
  * 启动计划任务,支持异步处理
  */
 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();
 }
Пример #11
0
 /**
  * 服务端接收数据
  *
  * @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));
 }
Пример #12
0
 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));
 }
Пример #13
0
<?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");
Пример #14
0
<?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);
Пример #16
0
 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;
 }
Пример #17
0
<?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;
    }
Пример #18
0
 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);
     }
 }
Пример #19
0
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);
}
Пример #20
0
function my_onReceive(swoole_server $serv, $fd, $from_id, $data)
{
    echo "Client: fd={$fd} pid: " . posix_getpid() . " send: {$data}";
    $serv->task($fd . '|' . $data);
}
Пример #21
0
 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();
     }
 }
Пример #22
0
 /**
  * 接收到数据时回调此函数,发生在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);
 }
Пример #23
0
<?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) {
Пример #24
0
$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();
Пример #25
0
<?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();
Пример #26
0
 /**
  * 接收到数据时回调此函数,发生在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);
 }
Пример #27
0
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);
}
Пример #28
0
 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);
             }
         }
     });
 }
Пример #29
0
    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) {
Пример #30
0
/**
 * 在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));
        }
    }
}