摘要:由于是基于容器创建和销毁资源的,那么各个容器之间是相对隔离的。也就是说每次请求都会创建一个新的环境用于执行和解析,由于容器的隔离性,每个请求都不会和其他请求进行干扰。因为只有当前协程才可以读取到该数据。
前言
ThinkPHP即将迎来最新版本6.0,针对目前越来越流行Swoole,thinkphp也推出了最新的扩展think-swoole 3.0沙盒
本文主要介绍在ThinkPHP-swoole 3.0当中所用到的沙盒技术。
沙盒--顾名思义,所有程序都运行在一个封闭容器当中,得益于更完善的容器技术,在3.0扩展当中沙盒得以大展身手。
首先,查看沙盒是如何使用的,查看扩展当中Swoole.php,其中的OnRequest函数
public function onRequest($req, $res)
{
$this->app->event->trigger("swoole.request");
$this->resetOnRequest();
/** @var Sandbox $sandbox */
$sandbox = $this->app->make(Sandbox::class);
$request = $this->prepareRequest($req);
try {
$sandbox->setRequest($request);
$sandbox->init();
$response = $sandbox->run($request);
$this->sendResponse($sandbox, $response, $res);
} catch (Throwable $e) {
try {
$exceptionResponse = $this->app
->make(Handle::class)
->render($request, $e);
$this->sendResponse($sandbox, $exceptionResponse, $res);
} catch (Throwable $e) {
$this->logServerError($e);
}
} finally {
$sandbox->clear();
}
}
代码中,从容器中取出沙盒,然后将请求注入到沙盒,并在沙盒中计算并返回结果。最终对沙盒进行清除,那么Sandbox是如何起到沙盒的作用的呢?
//$sandbox->setRequest($request);
public function setRequest(Request $request)
{
Context::setData("_request", $request);
return $this;
}
上述代码将请求注入到了沙盒内,这里又多出一个Context,那么这个类又是做什么的呢?为何不在沙盒内整个属性来存储呢?这个我们文末在做介绍,我介绍沙盒。
//$sandbox->init();
public function init()
{
if (!$this->config instanceof Config) {
throw new RuntimeException("Please initialize after setting base app.");
}
$this->setInstance($app = $this->getApplication());
$this->resetApp($app);
}
最主要的环节也就是这里了,看到这里就明白沙盒为何称之为沙盒了。由于tp6是基于容器创建和销毁资源的,那么各个容器之间是相对隔离的。下面接着看代码
//$this->setInstance($app = $this->getApplication());
public function getApplication()
{
$snapshot = $this->getSnapshot();
if ($snapshot instanceof Container) {
return $snapshot;
}
$snapshot = clone $this->getBaseApp();
$this->setSnapshot($snapshot);
return $snapshot;
}
看到什么了吗?clone,复制。这里将容器对象进行了复制,也就是原容器有的对象,这个新容器也有。也就是说每次请求都会创建一个新的环境用于执行和解析,由于容器的隔离性,每个请求都不会和其他请求进行干扰。
至于下面这段代码,看到这里,我觉得您也已经明白了。
$this->resetApp($app);
最后,$sandbox->clear(),清空Context类中保存的当前协程的数据,并将当前沙盒的容器初始化
public function clear()
{
Context::clear();
$this->setInstance($this->getBaseApp());
}
番外篇
沙盒当中为何会需要Context类呢?看到这个类以后就会明白了,static::getCoroutineId()是获取当前的协程ID,每一个协程都会有一个独一无二的ID,这样通过Context来存一些特殊数据或者对象就不会造成数据混乱。因为只有当前协程才可以读取到该数据。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/31735.html
摘要:如下图目录结构主要针对的是非常驻内存方式运行,为了兼容,虽然做了很多优化,但是仍然无法像,等一些针对开发的框架一样。在非常住内存框架中,为了方便会有一些写法导致在常驻内存方式下不容易被释放内存,小则内存泄漏,大则数据错乱。 前言 ThinkPHP即将迎来最新版本6.0,针对目前越来越流行Swoole,thinkphp也推出了最新的扩展think-swoole 3.0 架构分析 tp-s...
摘要:前言即将迎来最新版本,针对目前越来越流行,也推出了最新的扩展安装由于目前没有稳定版本,所以只能安装开发板接下来安装,目前最新的稳定版本是配置安装结束可以根据自己的需求对配置信息进行修改。 前言 ThinkPHP即将迎来最新版本6.0,针对目前越来越流行Swoole,thinkphp也推出了最新的扩展think-swoole 3.0 安装 由于目前thinkphp 6.0没有稳定版本,所...
摘要:前言即将迎来最新版本,针对目前越来越流行,也推出了最新的扩展。介绍即将推出的,已经适配并推出,并且默认适配了。和版本在使用方法上面有些许不同。其中的第一个参数和的第一个参数一致,作为事件名称。 前言 ThinkPHP即将迎来最新版本6.0,针对目前越来越流行Swoole,thinkphp也推出了最新的扩展think-swoole 3.0。 介绍 即将推出的tp6.0,已经适配swool...
摘要:安装框架安装如果已经安装了可以跳过本步骤,但是请确定通过命令来确保已经使用了最新版本的使用以下命令可以直接通过官网下载并自动安装到目录下如果以上安装过程极慢的话,可以尝试用以下方式通过国内镜像来安装。 《当 Swoole 遇上 ThinkPHP5》:Hello,World! 本文假设你已经有了 Linux 操作系统的 PHP 环境,强烈推荐使用 Vagrant 来搭建开发环境 安装 ...
摘要:文章目录一线性模型二绘图工具三作业一线性模型不要小看简单线性模型哈哈,虽然这讲我们还没正式用到,但是用到的前向传播损失函数两种绘图等方法在后面是很常用的。 文章目...
阅读 1245·2021-11-24 10:30
阅读 2603·2021-10-08 10:04
阅读 4273·2021-09-30 09:47
阅读 1904·2021-09-29 09:45
阅读 1701·2021-09-24 10:33
阅读 6590·2021-09-22 15:57
阅读 2567·2021-09-22 15:50
阅读 4294·2021-08-30 09:45