beikeshop 与swoole结合,让网站打开飞起

[复制链接]
发表于 2024-11-25 13:44:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
beikeshop 是一款基于laravel 开源的电商框架,由于php本身不是基于内存的运行模式,所以原生方式运行php框架本身就跑的很慢,再加上laravel的服务提供者的设计方式,在运行之前会加载大量的代码,导致laravel运行的更慢。
服务提供者的设计方式其实是很优秀的设计,这是nginx+php-fpm的运行方式,让每次请求都去加载服务者,这就让网站运行更慢。
swoole 是一个php的扩展,一种基于内存运行的方式来运行php的代码。
所以 laravel+swoole的方式会把服务提供者相干代码先加载到内存中,每次请求进来,就直接从内存中加载,这就让laravel运行的飞快。larvel-octane 扩展可以让无缝接入swoole.
beikeshop是基于lavavel 的,但是现实直接使用的时间会有一些坑。
  1. # 现安装 octane扩展
  2. composer require laravel/octane
  3. # install一下,会生成octane相关配置
  4. php artisan octane:install
  5. # 启动网站
  6. php artisan octane:start
  7. 启动网站后 前端页面是可以正常访问的。但是管理后台会有问题,需要做以下修改
  8. beike/Admin/Providers/AdminServiceProvider.php 中注释代码
  9. $adminName = admin_name();
  10. if (! Str::startsWith($uri, "/{$adminName}")) {
  11.     return;
  12. }
  13. admin的页面空白问题:
  14. 新增中间件: app/Http/Middleware/DebugResponse.php
复制代码

  1. <?php
  2. namespace App\Http\Middleware;
  3. use Closure;
  4. use Illuminate\Http\Request;
  5. use Symfony\Component\HttpFoundation\StreamedResponse;
  6. class DebugResponse
  7. {
  8.     public function handle(Request $request, Closure $next)
  9.     {
  10.         $response = $next($request);
  11.         // 如果是视图响应,直接输出内容
  12.         if ($response->headers->get('content-type') === 'text/html; charset=UTF-8') {
  13.             return new StreamedResponse(function() use ($response) {
  14.                 echo $response->getContent();
  15.             }, 200, [
  16.                 'Content-Type' => 'text/html; charset=UTF-8'
  17.             ]);
  18.         }
  19.         return $response;
  20.     }
  21. }
复制代码
app/Http/Kernel.php 中 $middlewareGroups 里面的admin里面注册中间件
  1. <?php
  2. namespace App\Http;
  3. use Illuminate\Foundation\Http\Kernel as HttpKernel;
  4. class Kernel extends HttpKernel
  5. {
  6.     protected $middlewareGroups = [
  7.         'shop'      => [
  8.             \App\Http\Middleware\EncryptCookies::class,
  9.             \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
  10.             \Illuminate\Session\Middleware\StartSession::class,
  11.             // \Illuminate\Session\Middleware\AuthenticateSession::class,
  12.             \App\Http\Middleware\SetLocaleFromSession::class,
  13.             \App\Http\Middleware\ShareViewData::class,
  14.             \Illuminate\View\Middleware\ShareErrorsFromSession::class,
  15.             \App\Http\Middleware\VerifyCsrfToken::class,
  16.             \Illuminate\Routing\Middleware\SubstituteBindings::class,
  17.         ],
  18.         'admin'     => [
  19.             \App\Http\Middleware\EncryptCookies::class,
  20.             \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
  21.             \Illuminate\Session\Middleware\StartSession::class,
  22.             \App\Http\Middleware\SetLocaleAdmin::class,
  23.             \App\Http\Middleware\ShareViewData::class,
  24.             \Illuminate\View\Middleware\ShareErrorsFromSession::class,
  25.             \App\Http\Middleware\VerifyCsrfToken::class,
  26.             \Illuminate\Routing\Middleware\SubstituteBindings::class,
  27.             \App\Http\Middleware\DebugResponse::class,
  28.         ],
  29.     }
  30. }
复制代码
根本上按照上面的修改,swoole版本的beikeshop 就可以正常运行
简单测试对比: nginx+fpm模式下需要1.4s 的页面, swoole模式下只需要300ms
写了一个shell,可以把上面的操作自动化,在原来 beike项目目录下执行shell

 
  1. #!/bin/bash# 安装 Laravel Octanecomposer require laravel/octane# 安装 Octane 服务php artisan octane:install# 启动 Octane#php artisan octane:start# 修改 AdminServiceProvider.php 文件中的代码ADMIN_PROVIDER_PATH="beike/Admin/Providers/AdminServiceProvider.php"# 检查文件是否存在if [ ! -f "$ADMIN_PROVIDER_PATH" ]; then    echo "文件不存在:$ADMIN_PROVIDER_PATH"    exit 1fi# 判定操作体系并选择正确的 sed 下令if [[ "$OSTYPE" == "darwin"* ]]; then    # macOS 的 sed    sed -i '' '/\$adminName = admin_name();/,/return;/{        s/^/\/\//        /return;/!b        n        s/^/\/\//    }' "$ADMIN_PROVIDER_PATH"else    # Linux 的 sed    sed -i '/\$adminName = admin_name();/,/return;/{        s/^/\/\//        /return;/!b        n        s/^/\/\//    }' "$ADMIN_PROVIDER_PATH"fi# 创建 DebugResponse 中间件文件DEBUG_RESPONSE_PATH="app/Http/Middleware/DebugResponse.php"mkdir -p "$(dirname "$DEBUG_RESPONSE_PATH")"cat > "$DEBUG_RESPONSE_PATH" << 'EOF'<?php
  2. namespace App\Http\Middleware;
  3. use Closure;
  4. use Illuminate\Http\Request;
  5. use Symfony\Component\HttpFoundation\StreamedResponse;
  6. class DebugResponse
  7. {
  8.     public function handle(Request $request, Closure $next)
  9.     {
  10.         $response = $next($request);
  11.         // 如果是视图响应,直接输出内容
  12.         if ($response->headers->get('content-type') === 'text/html; charset=UTF-8') {
  13.             return new StreamedResponse(function() use ($response) {
  14.                 echo $response->getContent();
  15.             }, 200, [
  16.                 'Content-Type' => 'text/html; charset=UTF-8'
  17.             ]);
  18.         }
  19.         return $response;
  20.     }
  21. }
  22. EOFecho "中间件文件已创建:$DEBUG_RESPONSE_PATH"# 修改 Kernel.php 文件KERNEL_PATH="app/Http/Kernel.php"# 检查文件是否存在if [[ "$OSTYPE" == "darwin"* ]]; then    # macOS 的 sed    sed -i '' '/^[[:space:]]*'"'admin'"' *=> *\[/a\            \\\App\\Http\\Middleware\\DebugResponse::class,\' "$KERNEL_PATH"else    # Linux 的 sed    sed -i '/^[[:space:]]*'"'admin'"' *=> *\[/a\            \\\App\\Http\\Middleware\\DebugResponse::class,\' "$KERNEL_PATH"fiecho "中间件已成功添加到 Kernel 文件:$KERNEL_PATH"echo "操作完成!"
复制代码

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表