dubbo-php-framework控制台provider_admin启动服务过程解析(2)

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

接着dubbo-php-framework控制台provider_admin启动服务过程解析(1),我们遗留了进程实际的运行过程,对应到代码如下:

//启动脚本路径,整个展开为dubbo-php-framework/provider/shell/StartUp.php
	$startUpPath = dirname(FSOF_ROOT_PATH)."/provider/shell/StartUp.php";
	if(!file_exists($startUpPath))//判断文件是否存在
	{
        echo "{$cmd} server {$name} \033[31;40m [FAIL] \033[0m; no find:{$startUpPath}".PHP_EOL;
		return false;
	}

    //初始化PHP可执行文件路径,类似/usr/local/bin等
	initByFSOFConfig();;
    //调用swoole的swoole_process创建子进程,用于启动任务,这里的子进程充当了Provider的master进程的角色
	$process = new \swoole_process(function(\swoole_process $worker) use($startUpPath, $cmd, $name)
	{
        //设置进程运行内容,也就是PHP可执行路径,调用startUpPath路径的脚本,传入参数为name和cmd
        //这里的运行紧接着在Provider启动过程解析(2)中分析
		$worker->exec(PHP_BIN_PATH, array($startUpPath, $name, $cmd));
	}, false);
	$process->start();//启动进程


也就是dubbo-php-framework/provider/shell/StartUp.php的内容,从上一篇分析可以知道,swoole_process启动进程的内容也就是php运行dubbo-php-framework/provider/shell/StartUp.php的过程,现在开始分析StartUp.php内容。

<?php
namespace com\fenqile\fsof\provider\shell;

use com\fenqile\fsof\common\config\FSOFConfigManager;
use com\fenqile\fsof\provider\core\server\TcpServer;

define("BIN_DIR", __DIR__);
define('MYROOT',BIN_DIR."/../..");

require_once MYROOT . '/vendor/autoload.php';
require_once MYROOT . '/vendor/apache/log4php/src/main/php/Logger.php';

// 定义provider shell目录
define('FSOF_PROVIDER_SHELL_PATH', __DIR__);
// 定义provider 根目录
define('FSOF_PROVIDER_ROOT_PATH', dirname(FSOF_PROVIDER_SHELL_PATH));
//定义FSOF框架根目录
define('FSOF_FRAMEWORK_ROOT_PATH', dirname(FSOF_PROVIDER_ROOT_PATH));

//提取cmd和 name
$name = $argv[1];
$cmd = $argv[2];
if (empty($cmd) || empty($name))
{
    echo("please input cmd and server name!");
    exit(1);
}

//log系统初始化需要用到appName,暂时以常量方式处理
if(!defined('FSOF_PROVIDER_APP_NAME')) define('FSOF_PROVIDER_APP_NAME', $name);
//载入Provider 框架代码
require_once FSOF_PROVIDER_ROOT_PATH.DIRECTORY_SEPARATOR.'FSOFProvider.php';

//读取conf目录下的$name.deploy文件,然后启动对应的server
if (($cmd != 'stop' && $cmd != 'reload' ) && !FSOFConfigManager::isProviderAppDeploy($name))
{
    echo "{$name} can not find deploy file or bootstrap.php".PHP_EOL;
	exit(1);
}

$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');
}

\Logger::getLogger(__CLASS__)->info("input {$cmd} {$name}");
//定义Tcp类型的server
$server = new TcpServer($name);
//加载app root目录下的bootstrap.php和provider/$name.provider文件
$server->setRequire(FSOFConfigManager::getProviderAppRoot($name));

//app/conf目录下的$name.deploy文件
$server->loadConfig($config);
//全局fsof.ini文件
$server->loadConfig(FSOFConfigManager::getFSOFIni());

//设置swoole扩展日志文件
$server->setSwooleLogFile($cmd);

//provider启动时初始化consumer
$server->initConsumer();

//初始化server资源
$server->initRunTime('/var/fsof/provider');

//启动
$server->run($cmd);

这里可以看出最终的启动是通过调用TcpServer的run函数来完成,关于TcpServer的实现在后续篇章分析,接下来几篇我们把provider_admin里面的其他动作实现也做简单介绍。

猜你喜欢

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