亚洲精品成人_精品成人一区_999视频在线播放_免费黄色在线_亚洲成人久久久_久久www免费视频

模板引擎

渲染驅動

EasySwoole 引入模板渲染驅動的形式,把需要渲染的數據,通過協程客戶端投遞到自定義的同步進程中進行渲染并返回結果。為何要如此處理,原因在于,市面上的一些模板引擎在 Swoole 協程下存在變量安全問題。例如以下流程:

  • request A reached, static A assign requestA-data
  • compiled template
  • write compiled template (yield current coroutine)
  • request B reached,static A assign requestB-data
  • render static A data into complied template file

以上流程我們可以發現,A 請求的數據,被 B 請求給污染了。為了解決該問題,EasySwoole 引入模板渲染驅動模式。

組件要求

  • easyswoole/spl: ^1.0
  • easyswoole/component: ^2.0

安裝方法

composer require easyswoole/template

倉庫地址

easyswoole/template

基礎實現原理講解

實現渲染引擎

<?php
class R implements \EasySwoole\Template\RenderInterface
{
    public function render(string $template, ?array $data = null, ?array $options = null): ?string
    {
        return 'todo some thing';
    }

    public function onException(\Throwable $throwable, $arg): string
    {
        return $throwable->getMessage();
    }
}

舊版本 Template (1.1.0 之前版本) 實現渲染引擎如下:

<?php
class R implements \EasySwoole\Template\RenderInterface
{
    public function render(string $template, ?array $data = [], ?array $options = []):?string
    {
        return 'todo some thing';
    }

    public function afterRender(?string $result, string $template, array $data = [], array $options = [])
    {
        // TODO: Implement afterRender() method.
    }

    public function onException(Throwable $throwable, $arg):string
    {
        return $throwable->getMessage();
    }
}

在自定義 HTTP 服務中調用渲染引擎

<?php
require_once __DIR__ . '/vendor/autoload.php';

class MyRender implements \EasySwoole\Template\RenderInterface
{

    public function render(string $template, ?array $data = null, ?array $options = null): ?string
    {
        return "your template is {$template} and data is " . json_encode($data);
    }

    public function onException(\Throwable $throwable, $arg): string
    {
        return $throwable->getTraceAsString();
    }
}

$renderConfig = \EasySwoole\Template\Render::getInstance()->getConfig();

/*
 * 可選配置
$renderConfig->setTempDir(getcwd()); // 設置 渲染引擎驅動 Socket 存放目錄,默認為 getcwd()
$renderConfig->setTimeout(3); // 設置 超時時間,默認為 3s,不建議修改
$renderConfig->setServerName('EasySwoole'); // 設置 渲染引擎驅動服務名稱,不建議修改
$renderConfig->setWorkerNum(3); // 設置 渲染引擎服務工作進程數,默認為 3,不建議修改
 */

$renderConfig->setRender(new MyRender()); // 設置 渲染引擎

$http = new swoole_http_server("0.0.0.0", 9501);
$http->on("request", function ($request, $response) {
    $ret = \EasySwoole\Template\Render::getInstance()->render('index.html', ['easyswoole' => 'hello']);
    $response->end($ret);
});

// 調用渲染引擎
\EasySwoole\Template\Render::getInstance()->attachServer($http);

$http->start();

舊版本 Template 組件(1.1.0 之前)在自定義 HTTP 服務中調用渲染引擎時,實現渲染引擎接口的方法有些許不同,詳細請看上文實現渲染引擎。

重啟渲染引擎

由于某些模板引擎會緩存模板文件,導致可能出現以下情況:

  • 用戶 A 請求 1.tpl 返回 'a'
  • 開發者修改了 1.tpl 的數據,改成了 'b'
  • 用戶 B、C、D 在之后的請求中,可能會出現 'a'、'b'兩種不同的值

那是因為模板引擎已經緩存了 A 所在進程的文件,導致后面的請求如果也分配到了 A 的進程,就會獲取到緩存的值

解決方案如下:

  • 1: 重啟 EasySwoole 服務,即可解決
  • 2: 模板渲染引擎實現了重啟方法 restartWorker,直接調用即可
Render::getInstance()->restartWorker();

用戶可以根據自己的邏輯,自行調用 restartWorker 方法進行重啟。

重啟渲染引擎使用示例

例如:用戶可以在控制器中新增 reload 方法重啟渲染引擎:

1、實現自定義渲染引擎,新建 App\RenderDriver\MyRender.php 文件

<?php

namespace App\RenderDriver;

class MyRender implements \EasySwoole\Template\RenderInterface
{
    public function render(string $template, ?array $data = null, ?array $options = null): ?string
    {
        return "your template is {$template} and data is " . json_encode($data);
    }

    public function onException(\Throwable $throwable, $arg): string
    {
        return $throwable->getTraceAsString();
    }
}

舊版本 Template 組件(1.1.0 之前)實現自定義渲染引擎接口的方法和最新穩定版本有些許不同,詳細請看上文。

2、注冊渲染引擎服務

<?php

namespace EasySwoole\EasySwoole;

use EasySwoole\EasySwoole\AbstractInterface\Event;
use EasySwoole\EasySwoole\Swoole\EventRegister;
use EasySwoole\Template\Render;

class EasySwooleEvent implements Event
{
    public static function initialize()
    {
        date_default_timezone_set('Asia/Shanghai');
    }

    public static function mainServerCreate(EventRegister $register)
    {
        $renderConfig = \EasySwoole\Template\Render::getInstance()->getConfig();

        /*
         * 可選配置
        $renderConfig->setTempDir(getcwd()); // 設置 渲染引擎驅動 Socket 存放目錄,默認為 getcwd()
        $renderConfig->setTimeout(3); // 設置 超時時間,默認為 3s,不建議修改
        $renderConfig->setServerName('EasySwoole'); // 設置 渲染引擎驅動服務名稱,不建議修改
        $renderConfig->setWorkerNum(3); // 設置 渲染引擎服務工作進程數,默認為 3,不建議修改
         */

        $renderConfig->setRender(new \App\RenderDriver\MyRender());
        Render::getInstance()->attachServer(ServerManager::getInstance()->getSwooleServer());
    }
}

3、在控制器中新增 reload 方法重啟渲染引擎

<?php

namespace App\HttpController;

use EasySwoole\Http\AbstractInterface\Controller;
use EasySwoole\Template\Render;

class Index extends Controller
{
    public function index()
    {
        $this->response()->write(Render::getInstance()->render('index.tpl', [
            'user' => 'easyswoole',
            'time' => time()
        ]));
    }

    public function reload()
    {
        Render::getInstance()->restartWorker();
        $this->response()->write('restart worker success!');
    }
}

運行結果:訪問 http://127.0.0.1:9501/ (示例請求地址) 即可看到運行結果: your template is index.tpl and data is {"user":"easyswoole","time":1613659221},然后訪問 http://127.0.0.1:9501/reload (示例請求地址) 即可重啟渲染引擎,看到運行結果 restart worker success!

使用示例(在 EasySwoole 中使用)

使用 Smarty 渲染

引入Smarty

composer require smarty/smarty

實現渲染引擎

新建 \App\RenderDriver\Smarty.php,內容如下:

<?php

namespace App\RenderDriver;

use EasySwoole\Template\RenderInterface;

class Smarty implements RenderInterface
{
    private $smarty;

    function __construct()
    {
        $temp = sys_get_temp_dir();
        $this->smarty = new \Smarty();
        $this->smarty->setTemplateDir(EASYSWOOLE_ROOT . '/App/View/');
        $this->smarty->setCacheDir("{$temp}/smarty/cache/");
        $this->smarty->setCompileDir("{$temp}/smarty/compile/");
    }

    public function render(string $template, ?array $data = null, ?array $options = null): ?string
    {
        foreach ($data as $key => $item) {
            $this->smarty->assign($key, $item);
        }
        return $this->smarty->fetch($template, $cache_id = null, $compile_id = null, $parent = null, $display = false,
            $merge_tpl_vars = true, $no_output_filter = false);
    }

    public function onException(\Throwable $throwable, $arg): string
    {
        $msg = "{$throwable->getMessage()} at file:{$throwable->getFile()} line:{$throwable->getLine()}";
        trigger_error($msg);
        return $msg;
    }
}

舊版本 Template 組件(1.1.0 之前)實現渲染引擎接口的方法和最新穩定版本有些許不同,詳細請看上文。Template 1.1.0 之前版本實現如下:

<?php
namespace App\RenderDriver;

use EasySwoole\Template\RenderInterface;

class Smarty implements RenderInterface
{
    private $smarty;

    function __construct()
    {
        $temp = sys_get_temp_dir();
        $this->smarty = new \Smarty();
        $this->smarty->setTemplateDir(EASYSWOOLE_ROOT . '/App/View/');
        $this->smarty->setCacheDir("{$temp}/smarty/cache/");
        $this->smarty->setCompileDir("{$temp}/smarty/compile/");
    }

    public function render(string $template, ?array $data = [], ?array $options = []): ?string
    {
        foreach ($data as $key => $item) {
            $this->smarty->assign($key, $item);
        }
        return $this->smarty->fetch($template, $cache_id = null, $compile_id = null, $parent = null, $display = false,
            $merge_tpl_vars = true, $no_output_filter = false);
    }

    public function afterRender(?string $result, string $template, array $data = [], array $options = [])
    {

    }

    public function onException(\Throwable $throwable, $arg): string
    {
        $msg = "{$throwable->getMessage()} at file:{$throwable->getFile()} line:{$throwable->getLine()}";
        trigger_error($msg);
        return $msg;
    }
}

在 EasySwoole 的 HTTP 服務中調用

首先在 EasySwoole 全局事件 EasySwooleEvent.phpmainServerCreate 事件中注冊渲染引擎服務,注冊示例代碼如下:

<?php

namespace EasySwoole\EasySwoole;

use EasySwoole\EasySwoole\AbstractInterface\Event;
use EasySwoole\EasySwoole\Swoole\EventRegister;

class EasySwooleEvent implements Event
{
    public static function initialize()
    {
        date_default_timezone_set('Asia/Shanghai');
    }

    public static function mainServerCreate(EventRegister $register)
    {
        // 獲取 Render 配置
        $renderConfig = \EasySwoole\Template\Render::getInstance()->getConfig();

        // [可選配置]
        /*
        $renderConfig->setTimeout(3); // 設置 超時時間,默認為 3s,不建議修改
        $renderConfig->setServerName('EasySwoole'); // 設置 渲染引擎驅動服務名稱,不建議修改
        $renderConfig->setWorkerNum(3); // 設置 渲染引擎服務工作進程數,默認為 3,不建議修改
         */

        // 設置 渲染引擎模板驅動
        $renderConfig->setRender(new \App\RenderDriver\Smarty());

        // 設置 渲染引擎進程 Socket 存放目錄,默認為 getcwd()
        $renderConfig->setTempDir(EASYSWOOLE_TEMP_DIR);

        // 注冊進程到 EasySwoole 主服務
        \EasySwoole\Template\Render::getInstance()->attachServer(\EasySwoole\EasySwoole\ServerManager::getInstance()->getSwooleServer());
    }
}

在控制器層響應(使用示例代碼如下):

首先新建 App\View\custom.html,內容如下:

{$name}

在控制器中進行調用:

<?php

namespace App\HttpController;

use EasySwoole\Http\AbstractInterface\Controller;

class Index extends Controller
{
    public function index()
    {
        $this->response()->write(\EasySwoole\Template\Render::getInstance()->render('custom.html', ['name' => 'Welcome To Use EasySwoole ^_^!']));
    }
}

運行結果:啟動服務,訪問 http://127.0.0.1:9501,即可看到運行結果:Welcome To Use EasySwoole ^_^!

支持常用的模板引擎

下面列舉一些常用的模板引擎包方便引入使用:

smarty/smarty

Smarty 是一個使用 PHP 寫出來的模板引擎,是目前業界最著名的 PHP 模板引擎之一。

引入方法

composer require smarty/smarty=~3.1

league/plates

使用原生 PHP 語法的非編譯型模板引擎,更低的學習成本和更高的自由度。

引入方法

composer require league/plates=3.*

duncan3dc/blade

Laravel 框架使用的模板引擎

引入方法

composer require duncan3dc/blade=^4.5

topthink/think-template

ThinkPHP 框架使用的模板引擎

引入方法

composer require topthink/think-template

如果用戶想要在 EasySwoole 框架中使用以上模板引擎,具體使用示例可以查看Template 使用示例 或者 Template 組件單元測試用例。上文中講述了使用 Smarty 模板引擎的使用示例,其他模板引擎的使用方法大致類似。

常見問題

注冊渲染引擎失敗,出現 UnixSocket bind 失敗

  • 報錯結果類似如下:
PHP Fatal error:  Uncaught EasySwoole\Component\Process\Exception: EasySwoole\Template\RenderWorker bind /work/EasySwoole.Render.Worker.0.sock fail case Operation not permitted in /work/vendor/easyswoole/component/src/Process/Socket/AbstractUnixProcess.php:32
  • 失敗原因:部分 vargrant 服務器或 Docker 服務器沒有權限創建 UnixSocket,導致注冊渲染引擎失敗。
  • 解決方案:注冊渲染引擎時,設置渲染引擎驅動進程 Socket 存放目錄為 '/Tmp'。示例代碼如下:
<?php

namespace EasySwoole\EasySwoole;

use EasySwoole\EasySwoole\AbstractInterface\Event;
use EasySwoole\EasySwoole\Swoole\EventRegister;

class EasySwooleEvent implements Event
{
    public static function initialize()
    {
        date_default_timezone_set('Asia/Shanghai');
    }

    public static function mainServerCreate(EventRegister $register)
    {
        // 獲取 Render 配置
        $renderConfig = \EasySwoole\Template\Render::getInstance()->getConfig();
        // 設置 渲染引擎模板驅動
        $renderConfig->setRender(new \App\RenderDriver\Smarty());

        ###  設置 渲染引擎進程 Socket 存放目錄為 '/Tmp'  ###
        $renderConfig->setTempDir('/Tmp');

        // 注冊進程到 EasySwoole 主服務
        \EasySwoole\Template\Render::getInstance()->attachServer(\EasySwoole\EasySwoole\ServerManager::getInstance()->getSwooleServer());
    }
}
亚洲精品成人_精品成人一区_999视频在线播放_免费黄色在线_亚洲成人久久久_久久www免费视频
  • <kbd id="eqi2k"><code id="eqi2k"></code></kbd><cite id="eqi2k"><tbody id="eqi2k"></tbody></cite>
    椎名由奈jux491在线播放| 久久亚洲午夜电影| 欧洲一区二区日韩在线视频观看免费 | 国产精品美女久久久久av福利| 欧美日本国产精品| 日本高清不卡一区二区三| 狂野欧美一区| 老司机一区二区三区| 亚洲成人在线| 亚洲视频福利| 欧美三级不卡| 欧美欧美天天天天操| 亚洲欧洲一区二区福利| 日本最新一区二区三区视频观看| 精品在线不卡| 欧美日韩亚洲一区二区三区四区| 国产精品一国产精品最新章节| 91入口在线观看| 久热综合在线亚洲精品| 久久久久久国产精品一区| 欧美亚洲免费| 久久精品九九| 国产精品麻豆免费版| 国产视色精品亚洲一区二区| 成人在线免费网站| 国产精品久久7| 久久草.com| 色噜噜狠狠色综合网| 亚洲精品第一区二区三区| 中文字幕成人一区| 在线成人亚洲| 亚洲欧美日韩精品久久久| 97netav| 另类视频在线观看+1080p| 日本一区二区视频| 在线一区亚洲| 99人久久精品视频最新地址| 国产精品呻吟| 国产女人水真多18毛片18精品| 精品无码久久久久久久动漫| 日韩一本精品| 国产主播精品| 老司机午夜精品视频| 精品在线观看一区二区| 在线免费观看成人网| 亚洲精品在线观看免费| 亚洲一区三区在线观看| 国产一区二区三区av在线| 日本视频一区二区不卡| 国产精品久久7| 久久综合伊人| 亚洲精品不卡| 亚洲欧美99| 狼狼综合久久久久综合网| 欧美激情一区| 99国产在线观看| 日韩欧美一区二区在线观看| 黄色日韩精品| 国产一级特黄a大片99| 欧美三级小说| 国产精品一区二区三区不卡| 亚洲在线欧美| 久久综合中文| 欧美成人嫩草网站| 99超碰麻豆| 欧美日韩精品一本二本三本| 97se亚洲综合在线| 午夜欧美视频| 国产一级精品aaaaa看| 精品99视频| 奇米影视首页 狠狠色丁香婷婷久久综合 | 国产一区二区无遮挡| 欧美午夜欧美| 久久精品99久久| 国产精品一区二区三区观看| 欧美三级电影在线播放| 国产精品尤物| 欧美凹凸一区二区三区视频| 国产精品久久波多野结衣| 亚洲国产高清一区| 日韩av不卡播放| 成人av播放| 在线观看的日韩av| 亚洲精品在线视频观看| 成人国产1314www色视频| 亚洲国产精品一区二区第四页av| 欧美综合激情| 国产精品久久一区二区三区| 91久久视频| 中文字幕色一区二区| 精品视频导航| 久久午夜视频| 999亚洲国产精| 一区二区三区四区视频在线观看| 国产一区喷水| 97久久精品午夜一区二区| 伊人精品成人久久综合软件| 亚洲一卡二卡三卡| 欧美一区二区高清在线观看| 久久久久一区| 久久精品成人| 亚洲综合社区| 日韩午夜电影| 亚洲第一在线| 一区在线免费| 国内精品福利| 欧美日韩在线观看一区二区三区| 亚洲成色最大综合在线| 日韩一本精品| 日韩av不卡在线播放| 久久精品丝袜高跟鞋| 精品免费国产| 九九九久久久| 久久综合九色综合久99| 麻豆亚洲一区| 欧美日韩一区二区三| 精品国产区在线| 精品一区久久久| 欧美极品日韩| 日韩中文字幕一区二区| 亚洲精品在线免费| 亚洲一区二区在线观| 欧美激情综合色综合啪啪| 国产精品jizz在线观看美国| 国产精品成人一区二区网站软件| 国产一区二区三区四区三区四| 国产精品a级| 中文欧美日韩| 91网免费观看| 精品视频第一区| 日韩国产精品一区二区| 伊人久久av导航| 亚洲成色精品| 久久精品日韩| 激情伦成人综合小说| 日本婷婷久久久久久久久一区二区| 色综合视频二区偷拍在线| 午夜精彩国产免费不卡不顿大片| 激情视频一区二区三区| 亚洲一区尤物| 快播亚洲色图| 欧美日韩在线一区二区三区| 亚洲国产精品一区| 99电影在线观看| 任我爽在线视频精品一| 在线观看亚洲视频啊啊啊啊| 精品伊人久久大线蕉色首页| 99re热精品| 久久免费99精品久久久久久| 欧美激情第六页| 不卡视频一区二区| 亚洲日本一区二区三区在线不卡| 久久综合导航| 在线成人h网| 视频一区二区三区在线观看 | 日韩av不卡在线播放| 老司机久久99久久精品播放免费| 欧美日韩三级| 在线视频不卡一区二区| 美日韩免费视频| av电影成人| 麻豆精品视频| 亚洲精品在线视频观看| 欧美人与禽猛交乱配视频| 日本欧美色综合网站免费| 国产一区二区中文字幕免费看| 亚洲一区二区成人| 99成人在线| 国产精品yjizz| 伊人久久大香线蕉午夜av| 欧美日韩精品免费观看| 韩国精品一区二区三区六区色诱| 男女精品视频| 久久福利毛片| 国产精品一区免费观看| 一本一道久久综合狠狠老精东影业| 欧美另类视频在线| 欧美日韩综合网| 午夜久久99| 韩国在线一区| 在线视频观看日韩| 亚洲巨乳在线| 亚洲国产精品www| 在线观看日韩av电影| 一区在线视频观看| 亚洲欧洲午夜| 国产日韩1区| 亚洲尤物影院| 成人羞羞视频免费| 国产自产在线视频一区| 国产在线一区二区三区四区| 国产欧美日韩伦理| 久久精品日产第一区二区三区精品版 | 亚洲一区三区在线观看| 香蕉久久a毛片| 成人三级在线| 欧美久久综合性欧美| 亚洲欧美精品在线观看| 欧美日本韩国在线| 国产精品毛片一区二区三区|