dubbo-php-framework控制台provider_admin解析

版权声明:转载请注明来源 https://blog.csdn.net/u013702678/article/details/82631509

结合上一篇的简介,这篇开始分析服务的启动过程,从上篇文章可以知道,启动服务是通过provider_admin去控制的,对应到代码就是bin目录,bin目录下有app_admin.php和restartall.sh,而restartall.sh的实现,就是遍历机器上所有的provider进程名,然后调用app_admin.php完成重启,故我们就分析app_admin的过程。

<?php
define("BIN_DIR", __DIR__);//常量定义,取PHP系统常量,也就是当前bin目录。
define('MYROOT',BIN_DIR."/..");//常量定义,当前bin目录的上级目录

//下述的两个文件都没找到,应该是开源出来时漏了,在github已经反馈给作者
require_once MYROOT . '/vendor/autoload.php';
require_once MYROOT . '/vendor/apache/log4php/src/main/php/Logger.php';

//引入文件
use com\fenqile\fsof\common\config\FSOFConfigManager;

define('FSOF_ROOT_PATH', __DIR__);//常量定义
define('FSOF_PROVIDER_PID_PATH', '/var/fsof/provider/');//常量定义

if(!defined("SIG_DFL")) define("SIG_DFL", 0);//常量定义

//加载commom
$fsofCommonPath = dirname(FSOF_ROOT_PATH).DIRECTORY_SEPARATOR.'common';
require_once($fsofCommonPath.DIRECTORY_SEPARATOR.'BootStrap.php');

//常量定义,定义swoole里面master和manager的进程文件命名格式
if(!defined("MASTER_PID_FILE_FORMAT")) define("MASTER_PID_FILE_FORMAT",'.master.pid');
if(!defined("MANAGER_PID_FILE_FORMAT")) define("MANAGER_PID_FILE_FORMAT",'.manager.pid');

//其他常量定义
if(!defined("FILTER_PROCESS_STATUS")) define("FILTER_PROCESS_STATUS",1);
if(!defined("PS_CMD_WORK_PROCESS")) define("PS_CMD_WORK_PROCESS",2);

//常量定义,Provider的运行状态定义
if(!defined("PROVIDER_STATE_SUCCESS")) define("PROVIDER_STATE_SUCCESS",0);
if(!defined("PROVIDER_STATE_FAILED")) define("PROVIDER_STATE_FAILED",1);
if(!defined("PROVIDER_STATE_RUNNING")) define("PROVIDER_STATE_RUNNING",2);

//PHP扩展检查,检查swoole及zookeeper、redis是否安装,这些都是框架必须的框架,如果未安装,则停止运行。
if(!extension_loaded('swoole'))
{
	fwrite(STDERR,"\033[31;40m [ERROR] \033[0m no swoole extension.\n".PHP_EOL);
	exit(1);
}
if (!extension_loaded('zookeeper'))
{
	fwrite(STDERR,"\033[31;40m [ERROR] \033[0m no zookeeper extension.\n".PHP_EOL);
	exit(1);
}
if (!extension_loaded('redis'))
{
	fwrite(STDERR,"\033[31;40m [ERROR] \033[0m no redis extension.\n".PHP_EOL);
	exit(1);
}

//程序启动形式,php app_admin.php ServerName start
if($argc == 3)//即包括要启动的服务名和动作
{
	$name = $argv[1];
	$cmd = $argv[2];
}
else if (2 == $argc)//只包括要启动的动作,这个动作必须是不牵涉具体服务的,类似restartall等。
{
	$cmd = $argv[1];
}
else//异常情况,中断程序
{
	printInfo();
	exit(1);
}

//新命令格式:app_admin cmd appname,参数有效性检查
$cmds = array('start','stop','reload','status','restart','list','startall','shutdown','reloadall','extstart','extrestart');
$one_cmds = array('start','stop','reload','restart','extstart','extrestart');
$all_cmds = array('list','startall','shutdown','reloadall');
if (!in_array($cmd,$cmds ) || (empty($name)&& in_array($cmd,$one_cmds)) || (!empty($name) && in_array($cmd,$all_cmds)))//启动格式异常,则中断程序
{
	printInfo();
	exit(1);
}

if(3 == $argc)
{
    echo "--------app_admin.php $name $cmd--------".PHP_EOL;
}
else
{
    echo "--------app_admin.php $cmd--------".PHP_EOL;
}

if (!empty($name))
{
	$config = FSOFConfigManager::getProviderAppDeploy($name);
	if(isset($config['server']['log_cfg_file_path']) && !empty($config['server']['log_cfg_file_path']))
	{
		\Logger::configure($config['server']['log_cfg_file_path']);
		date_default_timezone_set('PRC');
	}
}

//执行所有的控制命令,这些命令实现后续展开详细介绍
if($cmd == 'list')//列出当前机器上所有的Provider信息
{
	$configArr = FSOFConfigManager::getProviderAppList();
	echo "---------your server list:---------".PHP_EOL;
	foreach($configArr as $k => $v)
	{
		echo basename($v, '.deploy').PHP_EOL;
	}
	echo '----------------------------'.PHP_EOL;
	exit(1);
}
else if ("startall" == $cmd)//启动所有的Provider
{
	$providerList = FSOFConfigManager::getProviderAppList();
	foreach($providerList as $k => $v)
	{
		$name = basename($v, '.deploy');
		startProvider($name, "start");
	}
}
else if ("reloadall" == $cmd || "shutdown" == $cmd)//柔性更新所有的应用
{
	$providerList = FSOFConfigManager::getRunProviderList();
	foreach($providerList as $k => $v)
	{
		$name = basename($v, MASTER_PID_FILE_FORMAT);
		if ("reloadall" == $cmd)
		{
			reloadProvider($name);
		}
		else
		{
			stopProvider($name);
			echo "server {$name} stop  \033[32;40m [SUCCESS] \033[0m".PHP_EOL;
		}
	}
}
else if ("reload" == $cmd)//柔性更新单个应用
{
	reloadProvider($name);
}
else if ("start" == $cmd || "extstart" == $cmd)//启动单个应用
{
	$ret = startProvider($name, $cmd);
	if (!$ret)
	{
		exit(1);
	}
}
else if ("restart" == $cmd || "extrestart" == $cmd)//重启单个应用
{
	$ret = restartProvider($name, $cmd);
	if (!$ret)
	{
		exit(1);
	}
}
else if ("stop" == $cmd )//停止单个应用
{
	stopProvider($name);
	echo "server {$name} stop  \033[32;40m [SUCCESS] \033[0m".PHP_EOL;
}
else if("status" == $cmd)//获取应用状态信息
{
	if(empty($name))
	{
		$providerList = FSOFConfigManager::getProviderAppList();
		foreach($providerList as $k => $v)
		{
			$name = basename($v, '.deploy');
			getProviderStatus($name);
		}
	}
	else
	{
		getProviderStatus($name);
	}
}
//遍历所有的deploy文件,所有appname采用'*'
public static function getProviderAppList()
{
	$deployDir = self::getDeployFile('*');//获取当前环境下所有的deploy文件
	$deploylist = glob($deployDir);//调用php函数获取详细的文件信息
	return 	$deploylist;
}
//获取当前环境下所有的deploy文件,在代码目录中为config/app/conf/pro/provider/*.deploy
public static function getDeployFile($name)
{
	$env = self::getCurrentEnvironment();//获取当前环境信息,如上述注释里面的pro信息
	return FSOF_PHP_CONFIG_ROOT_PATH.DIRECTORY_SEPARATOR.'app'.DIRECTORY_SEPARATOR.'conf'.DIRECTORY_SEPARATOR.$env.DIRECTORY_SEPARATOR.'provider'.DIRECTORY_SEPARATOR.$name.'.deploy';
}

猜你喜欢

转载自blog.csdn.net/u013702678/article/details/82631509
今日推荐