Laravel-S (Swoole 加速) 的初步探索整理

  • 时间:2021-06-10 17:15 编辑:知速网 来源:知速网 阅读:106
  • 扫一扫,手机访问
摘要:Laravel-S (Swoole 加速) 的初步探索整理

测试了最热门的swooletw/laravel-swoole 不成功之后,再测热门程度差了好几个等级,甚至Google "laravel swoole" 的关键字,在搜寻结果都不会出现的hhxsv5/laravel-s,成功了,那就继续探所下去吧。


首先,新手真的不晓得该如rewrite rule,转过来的request,有启动php 程式,但一直出match route 错误,真是让人感到挫折灰心。后来根据错误讯息,追縱Laravel 的原始码,直接找到IlluminateRoutingRouter.php,在出错的那个function,加上下列程式片段,这样它就会在执行的命令视窗显示转过来的网址,再依此结果修正rewrite rule。


findRoute($request)
{
    echo "findRoute
";
    var_dump($request->getRequestUri()); exit;
    ....
}

发现在没有指定档名,要开启预设档案时,会转过来index.html,解决方式是在.htaccess 加入。

DirectoryIndex index.php


然后在route.php将Route::get('/', ...改成如下

Route::get('/index.php', function () { ... });

在Laravel 中使用的dump() 是SymfonyComponentVarDumper::dump() 建立的helper function,会呼叫CliDumper(),其会将资料输出到执行laravels start 的命令视窗。

解决办法,参考原程式,自己另建一个dump()


static 变数的测试,噢,会互相影响,所以要改很多...,只能再看看吧!!


另一困扰,假如网页不是放在伺服器的DocumentRoot 目录下,asset() 和url() 不会加上网页的目录,如http://ll.cc/blog/list ...,其中blog 不会出现。这要改的也是不少。


解决办法是修改档案app/Providers/AppServiceProvider.php中的boot method。

public function boot()
{
    URL::forceRootUrl("http://localhost:8180/blog"); 
}

亦可将其定义在.env中,例如 APP_URL。只要加上两行就能解决问题,算是不错了。


经过反覆测试,最后修改boot() 的内容如下,程式的其余部份不用改太多就可顺利执行。

/*
 * 此為 laravels.received_request, After LaravelS parsed SwooleHttpRequest 
 * to IlluminateHttpRequest, before Laravel's Kernel handles this request.
 */
public function boot()
{
    // 只會在 loading 時被 call 一次
    echo "===================
";
    Event::listen('laravels.received_request', 
        function (IlluminateHttpRequest $req, $app) 
        {
            // 這裡才是真的透過 browser瀏覽
            // 才有某些關於 client 的 SERVER 資料
            // 去除附加的預設執行檔 index.php
            $req_uri = $req->server->get("REQUEST_URI");
            $def_php = '/index.php';
            if (substr($req_uri, 0, strlen($def_php)) == $def_php) {
                $req_uri = substr($req_uri, strlen($def_php));
                if ($req_uri == '') {
                    $req_uri = '/';
                }
                $req->server->set("REQUEST_URI", $req_uri);
            }
            // 看起來,root url 並不是依據 "HTTP_HOST" 產生的
            // 改變 "HTTP_HOST",並不會改變 url() 和 asset() 的結果
            // 但是又找不到其他變數含有 port 資料
            // $req_host = $req->server->get("HTTP_HOST");
            // echo $req_host."<br>
";
            // $req->server->set("HTTP_HOST", $req_host.'abc');
            // $req->server->set("HTTP_HOST", env('URL_PATH'));
            var_dump($req->request->all());
            echo base_path()."<br>
";
            // initialize static varibles
            Util_sw::clean();
            // $req->query->set('get_key', 'hhxsv5');// Change query of request
            // $req->request->set('post_key', 'hhxsv5'); // Change post of request
            // echo asset(env('URL_PATH'))."<br>
";
            URL::forceRootUrl('http://'.$req->server->get('HTTP_HOST').'/'.env('URL_PATH'));
        }
    );
    
    // echo request()->getPathInfo();
    // echo URL::to('/')."<br>
";
    // var_dump(getallheaders());
    // URL::forceRootUrl(env("APP_URL")); 
}

在上面的代码片段中,加了一堆测试输出讯息的程式,就是在摸索阶段为了了解其特性而加的。其余的再继续整理中。


依照Laravel-S 专案上的说明,将Laravel 的.htaccess 的内容修改如下,就是在档案不存在时,转到laravel-s 伺服程式处理。而Apache 的httpd,在浏览目录时,设定的预设程式是index.html,在这里把它改成index.php。

# Alternate default index page
DirectoryIndex index.php
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>
    RewriteEngine On
    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]
    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$  balancer://laravels/$1 [P,L]
</IfModule>

针对上面的rewrite rule,要修改reverse proxy 的设定。

<IfModule deflate_module>
    SetOutputFilter DEFLATE
    DeflateCompressionLevel 2
    AddOutputFilterByType DEFLATE text/html text/plain text/css text/javascript 
    application/json application/javascript application/x-javascript application/xml 
    application/x-httpd-php image/jpeg image/gif image/png font/ttf font/otf 
    image/svg+xml
</IfModule>
RemoteIPHeader X-Forwarded-For
ProxyRequests Off
ProxyPreserveHost On
<Proxy balancer://laravels>  
    BalancerMember http://127.0.0.1:5200 loadfactor=7
    #BalancerMember http://192.168.1.2:5200 loadfactor=3
    #BalancerMember http://192.168.1.3:5200 loadfactor=1 status=+H
    ProxySet lbmethod=byrequests
</Proxy>


因为一个伺服器不只一个网页程序,所以并未依照Laravel-S 的说明,将网页指向根目录(/)。为了解决此问题,测试了好久才搞定。




另外,不想修改网站设定,依自己的习惯调网站的目录架构,将public 目录下的东西移到网页的根目录,程式则移到web-src 下面,storage 不太好移,仍然放在web- src 下,所以还需进一步修改bin/laravels.php、artisan,bootstrap/autoload.php。




后续发展,经过半个多月的摸索,终于将一个自己维护的网站套上Laravel-S 了,后面再开一篇文章来整理修改和注意的重点。



  • 全部评论(0)
最新发布的资讯信息
【计算机/互联网|】小红书账号交易要找靠谱的平台。(2021-09-18 10:28)
【计算机/互联网|】小红书账号转让要注意的流程(2021-09-17 10:56)
【技术支持|】认识__get及__set,并看看Laravel如何使用它们(2021-09-12 15:36)
【技术支持|】解决网站服务器遇到 Allowed memory exhausted 问题(2021-09-12 15:32)
【计算机/互联网|】MySQL Community 版本与MySQL企业版有什么不同? 有什么限制?(2021-06-18 09:06)
【技术支持|】如何获取两个日期之间的所有日期?(2021-06-11 08:08)
【技术支持|】Laravel-S (Swoole 加速) 的初步探索整理(2021-06-10 17:15)
【计算机/互联网|】PHP7无法载入LDAP的解决方式(2021-06-10 10:46)
【计算机/互联网|】win10下PHP的安装与设定(2021-06-09 08:41)
【计算机/互联网|】C# MVC View 底下字串(string)的显示方式(2021-06-08 11:05)
联系我们
工作时间:8:00-23:30
客服 QQ:93613971
邮 箱:admin#zhisu.com
法律顾问:聊城瀚诚律师事务所