接着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里面的其他动作实现也做简单介绍。