php从入门到放弃,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";

//注册它

\Piz\Loader::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');

注册项目命名空间和路径Piz\Loader::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');

//注册项目命名空间和路径

Piz\Loader::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 = \Piz\Server::get_instance ();

self::$worker->set_config (self::$config);

echo "{$app_name}", ' 启动成功',PHP_EOL;

self::$worker->run();

修改 /start.php 代码

require "./frame/base.php";

//小宝贝,跑起来。

start::run( isset($argv[1]) ? $argv[1] : '');

php start.php start 启动运行

小伙伴们自己看效果吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值