如何在laravel 5中压缩HTML

Eme*_*bah 22 php html-compression laravel blade laravel-5

在Laravel 4.0中,我使用下面的代码将HTML laravel响应输出压缩到浏览器,但它在laravel 5中不起作用.

App::after(function($request, $response)
{
    if($response instanceof Illuminate\Http\Response)
    {
        $buffer = $response->getContent();
        if(strpos($buffer,'<pre>') !== false)
        {
            $replace = array(
                '/<!--[^\[](.*?)[^\]]-->/s' => '',
                "/<\?php/"                  => '<?php ',
                "/\r/"                      => '',
                "/>\n</"                    => '><',
                "/>\s+\n</"                 => '><',
                "/>\n\s+</"                 => '><',
            );
        }
        else
        {
            $replace = array(
                '/<!--[^\[](.*?)[^\]]-->/s' => '',
                "/<\?php/"                  => '<?php ',
                "/\n([\S])/"                => '$1',
                "/\r/"                      => '',
                "/\n/"                      => '',
                "/\t/"                      => '',
                "/ +/"                      => ' ',
            );
        }
        $buffer = preg_replace(array_keys($replace), array_values($replace), $buffer);
        $response->setContent($buffer);
    }
});
Run Code Online (Sandbox Code Playgroud)

请问我如何在Laravel 5中完成这项工作.

要么

如果有的话,请提供更好的方法来压缩laravel 5中的HTML.提前致谢.

注意:我不希望使用任何laravel包压缩html,只需要一个简单的代码来完成工作而不会破坏性能.

iva*_*zer 17

完整代码是这样的(启用了自定义GZip):

<?php

namespace App\Http\Middleware;

use Closure;

class OptimizeMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);
        $buffer = $response->getContent();
        if(strpos($buffer,'<pre>') !== false)
        {
            $replace = array(
                '/<!--[^\[](.*?)[^\]]-->/s' => '',
                "/<\?php/"                  => '<?php ',
                "/\r/"                      => '',
                "/>\n</"                    => '><',
                "/>\s+\n</"                 => '><',
                "/>\n\s+</"                 => '><',
            );
        }
        else
        {
            $replace = array(
                '/<!--[^\[](.*?)[^\]]-->/s' => '',
                "/<\?php/"                  => '<?php ',
                "/\n([\S])/"                => '$1',
                "/\r/"                      => '',
                "/\n/"                      => '',
                "/\t/"                      => '',
                "/ +/"                      => ' ',
            );
        }
        $buffer = preg_replace(array_keys($replace), array_values($replace), $buffer);
        $response->setContent($buffer);
        ini_set('zlib.output_compression', 'On'); // If you like to enable GZip, too!
        return $response;
    }
}
Run Code Online (Sandbox Code Playgroud)

Content-Length在实施此代码之前/之后,请检查浏览器网络检查员是否有标题.

好好享受 ... :).. .


Jok*_*ius 14

在中间件中缩小html并不是一个很好的解决方案,因为你可以在它上面花费大量的CPU时间,它可以在每个请求上运行.

相反,最好使用htmlmin包(https://github.com/HTMLMin/Laravel-HTMLMin):

composer require htmlmin/htmlmin
php artisan vendor:publish
Run Code Online (Sandbox Code Playgroud)

在刀片模板级别上缩小HTML并将其缓存在存储中应该更加有效.

  • 2021年更新:这个包似乎有很多bug,而且似乎没有维护。 (2认同)

dar*_*onz 5

在Larvel 5中执行此操作的推荐方法是将您的函数重写为中间件.如文档中所述:

.. 在应用程序处理请求后,此中间件将执行其任务:

<?php namespace App\Http\Middleware;

class AfterMiddleware implements Middleware {

    public function handle($request, Closure $next)
    {
        $response = $next($request);

        // Perform action

        return $response;
    }
}
Run Code Online (Sandbox Code Playgroud)