ThinkPHP вот – вот выпустит последнюю версию 6.0. В ответ на растущую популярность Вулфа ThinkPHP также запустил новейшее расширение think-swool 3.0.
Песочница
В этой статье в основном представлена технология песочницы, используемая в ThinkPHP-swool 3.0. Песочница – Как следует из названия, все программы выполняются в закрытом контейнере, благодаря лучшей технологии контейнеров песочница может сыграть важную роль в расширении 3.0.
Во-первых, посмотрите, как используются песочницы, см. Swool. 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->setRequest($request);
public function setRequest(Request $request)
{
Context::setData('_request', $request);
return $this;
}Приведенный выше код вводит запрос в песочницу, и там есть другой контекст, так что же делает этот класс? Почему бы не хранить все имущество в песочнице? В конце этой статьи мы представляем песочницу.
//$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;
}Ты что-нибудь видел? Клонируй, копируй. Здесь копируется объект контейнера, то есть исходный объект контейнера, и новый контейнер также имеет. То есть каждый запрос создает новую среду для выполнения и анализа. Из-за изоляции контейнера каждый запрос не будет мешать другим запросам. Что касается следующего кода, смотрите здесь, я думаю, вы поняли.
$this->resetApp($app);
Наконец, $песочница – > очистить (), очистить данные текущего протокола, хранящиеся в классе контекста, и инициализировать контейнер текущей песочницы
public function clear()
{
Context::clear();
$this->setInstance($this->getBaseApp());
}Внешняя глава
Зачем вам нужны контекстные классы в песочницах? Когда вы посмотрите на этот класс, вы поймете, что static:: getCoroutineId () предназначен для получения текущего идентификатора протокола, каждый протокол будет иметь уникальный идентификатор, так что некоторые специальные данные или объекты могут храниться в контексте, не вызывая путаницы в данных. Потому что только текущий протокол может считывать данные.