栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > PHP

SWOOLE 从入门到放弃之写个小框架(二十)

PHP 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SWOOLE 从入门到放弃之写个小框架(二十)

接下来,要编写启动类。为什么要单独在这说呢,是因为在启动前,程序要检查一些内容:
第一,PHP版本和SWOOLE版本是不是符合我们在 SWOOLE 从入门到放弃之写个小框架(一) 中规定的 PHP7.1和 SWOOLE 2.1
第二,限制本框架必须是在CLI模式下运行,
第三,检查配置信息是否完整,
第四,一些必须的目录,比如LOG目录是否已创建
第五,检查传入的参数是否正确

修改frame/base.php

首先,保留以下代码

//定义框架路径
define ('PIZ_PATH',__DIR__.'/');
//Config文件目录
define ('CONFIG_PATH',dirname (__DIR__).'/config/');
//Logs路径
define('LOG_PATH',dirname (__DIR__).'/logs/');
//引入加载器文件
require_once PIZ_PATH."Lib/Loader.php";
//引入助手文件
require_once PIZ_PATH."helper.php";
//注册它
PizLoader::register ();

首先,为了方便启动类通过一些外部SHELL命令来检查运行状态,我把frame/Lib/Server.php做了一个改造,详见代码 https://gitee.com/pizzzz/piz/blob/master/frame/Lib/Server.php

接下来,编写启动类代码。
该类只有一个run方法,只传一个参数$opt,$opt可选值start,stop,kill,restart,reload

PHP版本和SWOOLE版本用phpversion来获取 version_compare对比
php_sapi_name 来判断运行模式
检查¥opt是否合法
接下来就是拉配置self::$config = config('app');

注册项目命名空间和路径PizLoader::addNamespace (config('app.namespace'),config('app.path'));
检查日志目录!is_dir(LOG_PATH) && mkdir(LOG_PATH,0777 ,TRUE);
检查app.name

if (version_compare(phpversion(), '7.1', '<')) {
     echo "PHP版本必须大于等于7.1 ,当前版本:",phpversion (),PHP_EOL;
     die;
 }

 if (version_compare(phpversion('swoole'), '2.1', '<')) {
     echo "Swoole 版本必须大于等于 2.1 ,当前版本:",phpversion ('swoole'),PHP_EOL;
     die;
 }
 if (php_sapi_name() != "cli") {
     echo "仅允许在命令行模式下运行",PHP_EOL;
     die;
 }
 //检查命令
 if(!in_array ($opt , ['start','stop','kill','restart','reload'])){
     echo PHP_EOL,"Usage:",PHP_EOL,"     php start.php [start|stop|kill|restart|reload]",PHP_EOL,PHP_EOL;
     die;
 }

 self::$config = config('app');
 //注册项目命名空间和路径
 PizLoader::addNamespace (config('app.namespace'),config('app.path'));
 //检查日志目录是否存在并创建
 !is_dir(LOG_PATH) && mkdir(LOG_PATH,0777 ,TRUE);
 //检查是否配置app.name
 if(empty(self::$config['name'])){
     echo "配置项 config/app.php [name] 不可留空 ",PHP_EOL;
     die;
 }

 $app_name = self::$config['name'];

 //获取master_pid 关闭或重启时要用到
 $master_pid = exec("ps -ef | grep {$app_name}-master | grep -v 'grep ' | awk '{print $2}'");
 //获取manager_pid 重载时要用到
 $manager_pid = exec("ps -ef | grep {$app_name}-manager | grep -v 'grep ' | awk '{print $2}'");

 if (empty($master_pid)) {
     $master_is_alive = false;
 } else {
     $master_is_alive = true;
 }

 if ($master_is_alive) {
     if ($opt === 'start' ) {
  echo "{$app_name}  正在运行" , PHP_EOL;
  exit;
     }
 } elseif ($opt !== 'start' ) {
     echo "{$app_name} 未运行" , PHP_EOL;
     exit;
 }

 switch ($opt){
     case 'start':
  break;
     case "kill":
  //代码参考 https://wiki.swoole.com/wiki/page/233.html
  exec("ps -ef|grep {$app_name}|grep -v grep|cut -c 9-15|xargs kill -9");
  break;

     case 'stop':
  echo "{$app_name}  正在停止 ..." , PHP_EOL;
  // 发送SIGTERM信号,主进程收到SIGTERM信号时将停止fork新进程,并kill所有正在运行的工作进程
  // 详见 https://wiki.swoole.com/wiki/page/908.html
  $master_pid && posix_kill($master_pid, SIGTERM);
  // Timeout.
  $timeout = 40;
  $start_time = time();

  while (1) {      //强制退出
      $master_is_alive = $master_pid && posix_kill($master_pid, 0);
      if ($master_is_alive) {
   if (time() - $start_time >= $timeout) {
echo "{$app_name} 停止失败" , PHP_EOL;
exit;
   }
   usleep(10000);
   continue;
      }
      echo "{$app_name} 已停止" , PHP_EOL;
      break;
  }
  exit(0);
  break;
     case 'reload':
  //详见:https://wiki.swoole.com/wiki/page/20.html
  // SIGUSR1: 向主进程/管理进程发送SIGUSR1信号,将平稳地restart所有worker进程
  posix_kill($manager_pid, SIGUSR1);
  echo "[SYS]","t", "{$app_name} 重载" , PHP_EOL;
  exit;
     case 'restart':
  echo "{$app_name} 正在停止" , PHP_EOL;
  // 发送SIGTERM信号,主进程收到SIGTERM信号时将停止fork新进程,并kill所有正在运行的工作进程
  // 详见 https://wiki.swoole.com/wiki/page/908.html
  $master_pid && posix_kill($master_pid, SIGTERM);
  $timeout = 40;
  $start_time = time();
  while (1) {
     //检查master_pid是否存在
      $master_is_alive = $master_pid && posix_kill($master_pid, 0);
      if ($master_is_alive) {
   if (time() - $start_time >= $timeout) {
echo "{$app_name} 停止失败" , PHP_EOL;
exit;
   }
   usleep(10000);
   continue;
      }
      echo "{$app_name} 已停止" , PHP_EOL;
      break;
  }

  break;
 }

 self::$worker = PizServer::get_instance ();
 self::$worker->set_config (self::$config);
 echo "{$app_name}", ' 启动成功',PHP_EOL;
 self::$worker->run();

详见代码 https://gitee.com/pizzzz/piz/blob/master/frame/base.php

修改 /start.php 代码


php start.php start 启动运行

小伙伴们自己看效果吧。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/228789.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号