PHP 怎么PHP PageSpeed

wen PHP项目 2

本文目录导读:

PHP 怎么PHP PageSpeed

  1. 使用 PageSpeed 模块(推荐)
  2. 纯 PHP 实现的关键优化
  3. 图片优化
  4. 缓存机制
  5. 数据库查询优化
  6. 异步加载实现
  7. 使用示例
  8. 性能监控
  9. 最佳实践建议

在 PHP 中实现 PageSpeed 优化,主要有以下几种方法:

使用 PageSpeed 模块(推荐)

Apache mod_pagespeed

# 安装(Ubuntu/Debian)
apt-get install libapache2-mod-pagespeed
# 启用模块
a2enmod pagespeed
service apache2 restart

Nginx PageSpeed

# 安装 ngx_pagespeed
# 然后配置
location ~ \.php$ {
    pagespeed on;
    pagespeed RewriteLevel CoreFilters;
}

纯 PHP 实现的关键优化

CSS/JS 压缩和合并

<?php
class PageSpeedOptimizer {
    // CSS 压缩
    public static function minifyCSS($css) {
        // Remove comments
        $css = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $css);
        // Remove whitespace
        $css = str_replace(array("\r\n", "\r", "\n", "\t", '  ', '    ', '    '), '', $css);
        return $css;
    }
    // JS 压缩(简单的实现)
    public static function minifyJS($js) {
        // Remove comments
        $js = preg_replace('/(?:(?:\/\*(?:[^*]|\*+[^*\/])*\*+\/)|(?:(?<!\:|\\\|\'|\")\/\/.*))/', '', $js);
        // Remove whitespace around tokens
        return preg_replace('/[ \t]+/', ' ', $js);
    }
    // 合并 CSS 文件
    public static function combineCSS($files) {
        $combined = '';
        foreach ($files as $file) {
            $combined .= file_get_contents($file);
        }
        return self::minifyCSS($combined);
    }
    // 合并 JS 文件
    public static function combineJS($files) {
        $combined = '';
        foreach ($files as $file) {
            $combined .= file_get_contents($file) . ';';
        }
        return self::minifyJS($combined);
    }
}
?>

HTML 压缩

<?php
class HTMLMinifier {
    public static function minify($html) {
        // 去掉注释
        $html = preg_replace('/<!--(?!\[if)(.*?)-->/s', '', $html);
        // 去掉多余空白
        $html = preg_replace('/\s+/', ' ', $html);
        // 去掉标签间的多余空格
        $html = preg_replace('/>\s+</', '><', $html);
        return trim($html);
    }
    // 缓冲输出
    public static function start() {
        ob_start();
    }
    public static function end() {
        $html = ob_get_clean();
        echo self::minify($html);
    }
}
?>

图片优化

<?php
class ImageOptimizer {
    // 调整图片大小
    public static function resize($source, $maxWidth, $maxHeight) {
        list($width, $height, $type) = getimagesize($source);
        // 计算新尺寸
        $ratio = min($maxWidth/$width, $maxHeight/$height);
        $newWidth = $width * $ratio;
        $newHeight = $height * $ratio;
        // 创建新图片
        $src = imagecreatefromstring(file_get_contents($source));
        $dst = imagecreatetruecolor($newWidth, $newHeight);
        imagecopyresampled($dst, $src, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
        // 输出
        $output = '/path/to/cache/' . md5($source . $maxWidth . $maxHeight) . '.jpg';
        imagejpeg($dst, $output, 80); // 80% 质量
        imagedestroy($src);
        imagedestroy($dst);
        return $output;
    }
    // 转为 WebP 格式
    public static function toWebP($source) {
        if (function_exists('imagewebp')) {
            $img = imagecreatefromstring(file_get_contents($source));
            $output = str_replace(['.jpg', '.png'], '.webp', $source);
            imagewebp($img, $output, 80);
            imagedestroy($img);
            return $output;
        }
        return $source;
    }
}
?>

缓存机制

<?php
class CacheManager {
    private static $cacheDir = '/cache/';
    // 页面缓存
    public static function pageCache($key, $ttl = 3600) {
        $file = self::$cacheDir . md5($key) . '.html';
        if (file_exists($file) && (time() - filemtime($file) < $ttl)) {
            echo file_get_contents($file);
            exit;
        }
        ob_start(function($html) use ($file) {
            file_put_contents($file, $html);
            return $html;
        });
    }
    // 设置过期头
    public static function setCacheHeaders($ttl = 3600) {
        header('Cache-Control: max-age=' . $ttl);
        header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $ttl) . ' GMT');
        header('Pragma: cache');
    }
    // CDN 和压缩
    public static function enableCompression() {
        if (ob_get_level() == 0 && !ob_start('ob_gzhandler')) {
            ob_start();
        }
    }
}
?>

数据库查询优化

<?php
class QueryOptimizer {
    private $logs = [];
    // 查询日志
    public function logQuery($sql, $params = [], $executionTime) {
        $this->logs[] = [
            'sql' => $sql,
            'time' => $executionTime,
            'timestamp' => microtime(true)
        ];
        // 记录慢查询
        if ($executionTime > 0.5) {
            // 记录到慢查询日志
            error_log("Slow query: " . $sql . " (" . $executionTime . "s)");
        }
    }
    // 查询缓存
    public function cacheQuery($key, $query, $ttl = 3600) {
        static $cache = [];
        if (isset($cache[$key]) && (time() - $cache[$key]['time'] < $ttl)) {
            return $cache[$key]['data'];
        }
        $result = $query();
        $cache[$key] = [
            'data' => $result,
            'time' => time()
        ];
        return $result;
    }
    // 批量查询优化
    public function batchQuery($queries) {
        // 使用事务提高效率
        // 或者使用多查询
    }
}
?>

异步加载实现

<?php
class AsyncLoader {
    // 异步加载 CSS
    public static function loadCSSAsync($url) {
        return '<script>
            var link = document.createElement("link");
            link.rel = "stylesheet";
            link.href = "' . $url . '";
            document.head.appendChild(link);
        </script>';
    }
    // 异步加载 JS
    public static function loadJSAsync($url) {
        return '<script async src="' . $url . '"></script>';
    }
    // 延迟加载
    public static function deferJS($script) {
        return '<script defer>' . $script . '</script>';
    }
    // 预加载关键资源
    public static function preload($url, $type) {
        return '<link rel="preload" href="' . $url . '" as="' . $type . '">';
    }
}
?>

使用示例

<?php
// 完整优化示例
class FullPageSpeed {
    public function init() {
        // 开始输出缓冲
        ob_start();
        // 启用 Gzip 压缩
        if (extension_loaded('zlib')) {
            ob_start('ob_gzhandler');
        }
        // 页面上运行优化
        add_action('shutdown', [$this, 'optimizeOutput']);
    }
    public function optimizeOutput() {
        $html = ob_get_clean();
        // HTML 压缩
        $html = HTMLMinifier::minify($html);
        // 图片优化
        $html = $this->optimizeImages($html);
        // CSS/JS 优化
        $html = $this->optimizeResources($html);
        // 设置缓存头
        CacheManager::setCacheHeaders();
        echo $html;
    }
    private function optimizeImages($html) {
        // 正则匹配图片并优化
        preg_match_all('/<img[^>]+src=["\']([^"\']+)["\']/', $html, $matches);
        foreach ($matches[1] as $src) {
            // 优化逻辑
        }
        return $html;
    }
    private function optimizeResources($html) {
        // 优化 CSS/JS 引用
        return $html;
    }
}
?>

性能监控

<?php
class PerformanceMonitor {
    public static function startTimer($name) {
        $_SESSION['timers'][$name] = microtime(true);
    }
    public static function endTimer($name) {
        if (isset($_SESSION['timers'][$name])) {
            $elapsed = microtime(true) - $_SESSION['timers'][$name];
            unset($_SESSION['timers'][$name]);
            // 记录到日志
            error_log("Performance - {$name}: {$elapsed} seconds");
            return $elapsed;
        }
        return 0;
    }
    public static function trackQuery($sql, $time) {
        if ($time > 0.5) { // 500ms
            error_log("Slow Query: " . $sql);
        }
    }
}
?>

最佳实践建议

  1. 优先使用 mod_pagespeed 或 ngx_pagespeed

    性能更好,改动最小

  2. 分层优化

    • 服务器级别:缓存、压缩
    • 应用级别:PHP 优化
    • 前端级别:资源优化
  3. 监控和测试

    • 使用 Google PageSpeed Insights
    • 监测核心 Web Vitals
    • 持续优化

这些方法可以结合使用,根据你的服务器环境和具体需求选择合适的方案。

抱歉,评论功能暂时关闭!