Beispiel #1
0
 public function actionRun($hostinfo = '0.0.0.0:9580')
 {
     $this->parseHostPort($hostinfo);
     $http = new \swoole_http_server($this->host, $this->port);
     //初始化进程数 ,关联getTaskId函数的使用
     $task_num = 0;
     foreach (self::$q_config as $key => $val) {
         self::$event_base[$key] = $task_num;
         self::$cnt[$key] = 0;
         $task_num += $val;
     }
     //初始化配置
     $this->config['task_worker_num'] = $task_num;
     $http->set($this->config);
     //接受http请求参数
     $http->on('request', function ($request, $response) use($http) {
         if (!isset($request->get['opt'])) {
             $response->end('HTTP_OPT_ERROR:missing opt');
             return;
         }
         $opt = $request->get['opt'];
         if ($opt == 'put') {
             //获取data数据
             if (isset($request->get['data'])) {
                 $data = $request->get['data'];
             } elseif (isset($request->post['data'])) {
                 $data = $request->post['data'];
             } else {
                 $response->end('HTTP_PARAM_ERROR:missing data');
                 return;
             }
             $data = json_decode($data, true);
             if (json_last_error() != JSON_ERROR_NONE) {
                 $response->end(json_last_error_msg());
                 return;
             }
             if (!isset($data['class']) || !isset(self::$q_config[$data['class']])) {
                 $type = 'Common';
             } else {
                 $type = $data['class'];
             }
             $taskId = $this->getTaskId($type);
             if (!isset($data['task'])) {
                 $response->end('HTTP_PARAM_ERROR:missing task');
                 return;
             }
             //分配给task的worker
             $http->task($data, $taskId);
             $response->end("HTTP_PUT_OK");
         } elseif ($opt == 'reload') {
             $http->reload();
             $response->end('reset now!');
             return;
         } elseif ($opt == 'shutdown') {
             $http->shutdown();
             $response->end('shutdown now!');
             return;
         } else {
             $response->end("HTTP_OPT_ERROR:nothing to do");
             return;
         }
     });
     //任务调度
     $http->on('Task', function ($http, $taskId, $fromId, $data) {
         $rs = $this->doJob($data);
         return $rs;
     });
     //任务完成的响应事件
     $http->on('Finish', function ($http, $taskId, $data) {
         echo "finish task,the result:" . $data . "\n";
     });
     $http->start();
 }
<?php

function mylog($msg, $filename = 'hook_error')
{
    error_log(date("Y-m-d H:i:s") . "\t" . $msg . PHP_EOL, 3, __DIR__ . DIRECTORY_SEPARATOR . $filename . '.mylog');
}
define('PASSWORD', '');
$config = null;
$http = new swoole_http_server("0.0.0.0", 9501);
$http->set(['worker_num' => 4, 'daemonize' => 1]);
$http->on('request', function ($request, $response) {
    $response->end('ok');
    if (false !== strpos($request->server['path_info'], 'reload')) {
        global $http;
        $http->reload();
        return;
    }
    if (empty($request->post['hook'])) {
        mylog('hook data empty');
        return;
    }
    $data = json_decode($request->post['hook'], true);
    if (empty($data)) {
        //错误的数据
        mylog('hook no json data');
        return;
    }
    if (PASSWORD && $data['password'] != PASSWORD) {
        //密码不匹配
        mylog('password error');
        return;
Beispiel #3
0
 /**
  * 构造方法,要执行的东西很多
  * @author xuebing<*****@*****.**>
  */
 public function __construct()
 {
     $config = new Yaf\Config\Ini(CONF_PATH . 'swoole.ini');
     $config = $config->get('swoole');
     self::$http = new swoole_http_server("0.0.0.0", $config->port);
     self::$http->set(array('worker_num' => $config->worker_num, 'max_conn' => $config->max_conn, 'max_request' => $config->max_request, 'ipc_mode' => $config->ipc_mode, 'task_worker_num' => $config->task_worker_num, 'task_ipc_mode' => $config->task_ipc_mode, 'task_max_request' => $config->task_max_request, 'dispatch_mode' => $config->dispatch_mode, 'daemonize' => $config->daemonize, 'backlog' => $config->backlog, 'open_tcp_keepalive' => $config->open_tcp_keepalive, 'tcp_defer_accept' => $config->tcp_defer_accept, 'open_tcp_nodelay' => $config->open_tcp_nodelay, 'log_file' => APP_PATH . '/log/swoole.log'));
     self::$http->on('request', function ($request, $response) {
         if (isset($request->post)) {
             self::$post = $request->post;
         }
         self::$raw_data = $request->rawContent();
         echo "[" . date('Y-m-d H:i:s') . "]" . PHP_EOL . "请求地址==>" . $request->server['request_uri'] . PHP_EOL . "请求内容==>" . self::$raw_data . PHP_EOL;
         if (self::$raw_data == 'swoole_reload()') {
             self::$http->reload();
             $response->end('reload success');
             return;
         }
         try {
             // TODO handle
             $yaf_response = $this->application->getDispatcher()->dispatch(new Yaf\Request\Http($request->server['request_uri']));
             $result = $yaf_response->getBody();
         } catch (\Exception $e) {
             $result = array();
             $result['err_code'] = $e->getCode();
             $result['err_msg'] = $e->getMessage();
             $result = json_encode($result, JSON_UNESCAPED_UNICODE);
         }
         echo "返回内容==>" . $result . PHP_EOL . PHP_EOL;
         $response->end($result);
     });
     self::$http->on('Finish', function ($serv, $task_id, $data) {
         echo "异步任务完成[{$task_id}],data:" . $data . PHP_EOL;
     });
     self::$http->on('Task', function ($serv, $task_id, $from_id, $data) {
         echo "新的异步任务[来自进程 {$from_id},当前进程 {$task_id}],data:" . $data . PHP_EOL;
         $data = unserialize($data);
         if (is_array($data)) {
             list($module, $controller, $action, $params) = $data;
             $request = new Yaf\Request\Simple('CLI', $module, $controller, $action, $params);
             $this->application->getDispatcher()->dispatch($request);
             $serv->finish("task -> OK");
         }
     });
     self::$http->on('Timer', function ($serv, $interval) {
         switch ($interval) {
             case 300000:
                 break;
         }
     });
     self::$http->on('Start', function ($serv) {
         cli_set_process_title("swoolehttp:main");
         file_put_contents(APP_PATH . '/log/swoole-master.pid', $serv->master_pid);
     });
     self::$http->on('WorkerStart', array($this, 'onWorkerStart'));
     self::$http->on('ManagerStart', function ($serv) {
         cli_set_process_title("swoolehttp:manager");
         file_put_contents(APP_PATH . '/log/swoole-manager.pid', $serv->master_pid);
     });
     self::$http->on('Shutdown', function ($serv) {
         echo 'Shutdown' . PHP_EOL;
     });
     self::$http->on('WorkerError', function ($serv, $worker_id, $worker_pid, $exit_code) {
     });
     self::$http->start();
 }