Yii以及其他PHP框架,通常是通过一个入口文件把框架类库,引入进来。
然后根据route找到指定的控制器执行业务逻辑。一般的框架都可以很容易的集成第三方类库。
可是,如果说,多个项目之间需要相互调用,而且多个项目之间不是用相同的框架写的,但是是同一个语言。
如果不是相同语言,就只好是各个框架之间开放不同的接口,通过rest或者soap的形式进行接口调用。
虽然把各个模块封装成接口,可以很大的降低项目之间的耦合。但是接口同时也包含代码调用的形式。
项目中用到了workman作为消息发送,业务逻辑采用yii处理。那么问题来了,workman如何调用yii
问题
workman是用php命令方式执行的,yii2是跑在apache上面。如果采用rest调用方式,
消息经workman转发到yii2上进行处理,然后在返回到workman中。这个过程就会参数一个内部的网络io,
同时每个请求都需要一个apache进程,以及workman的进程才能进行处理。对主机有一定的压力。
采用node,每秒创建一个socket连接,创建3000个,每次连接上之后,workman根据连接创建一个uuid,
并返回到workman的客户端。如果采用rest的方式请求yii,请求在处理一部分的时候,服务器就挂掉了(本地采用xampp默认配置)。
如果数据不到400个。而如果直接通过workman直接进行数据库操作,数据都可以入库。
解决
workman与yii本来就在一台主机上,如果两个项目能够融合,直接在代码层进行调用,那数据的丢失率就可以下降。
所以要做的是将yii2z作为一个模块被其他项目调用。观察yii2的入口文件:
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
defined('YII_ENV_TEST') or define('YII_ENV_TEST', true);
require __DIR__ . '/vendor/autoload.php';
require __DIR__ . '/vendor/yiisoft/yii2/Yii.php';
require __DIR__ . '/common/config/bootstrap.php';
$config = yii\helpers\ArrayHelper::merge(
require (__DIR__ . '/common/config/main.php'),
require (__DIR__ . '/common/config/main-local.php'),
require (__DIR__