红穆笔记
首页 语言笔记 PHP批量压缩服务器里面的图片
语言笔记 PHP

PHP批量压缩服务器里面的图片

PHP批量压缩服务器里面的图片

直接复制这一整段执行

cat > /www/wwwroot/blog2.1.4s5.cn/compress.php << 'EOF'
<?php
/**
 * WebP 图片批量压缩脚本
 */

// ---- 加大内存 ----
ini_set('memory_limit', '512M');
set_time_limit(0);

$dir     = '/www/wwwroot/blog2.1.4s5.cn/wp-content/uploads/titlepic';
$backup  = '/www/wwwroot/blog2.1.4s5.cn/wp-content/uploads/titlepic_bak';
$quality = 80;
$maxW    = 1000;

if (!function_exists('imagecreatefromwebp')) {
    die("❌ 当前 PHP 没有 WebP 支持\n");
}

if (!is_dir($dir)) die("❌ 目录不存在:$dir\n");

// ---- 备份 ----
if (!is_dir($backup)) {
    echo "📦 备份原图到 $backup ...\n";
    exec("cp -r " . escapeshellarg($dir) . " " . escapeshellarg($backup));
    echo "✅ 备份完成\n\n";
}

$files = glob($dir . '/*.webp');
$total = count($files);

echo "🚀 开始压缩(质量 " . $quality . ",最大宽度 " . $maxW . "px),共 " . $total . " 张\n\n";

$ok = 0;
$skip = 0;
$before = 0;
$after = 0;

foreach ($files as $i => $file) {
    $size1 = filesize($file);
    $before += $size1;

    $img = @imagecreatefromwebp($file);
    if (!$img) {
        $skip++;
        $after += $size1;
        continue;
    }

    $w = imagesx($img);
    $h = imagesy($img);

    // 缩放
    if ($w > $maxW) {
        $newW = $maxW;
        $newH = (int)round($h * ($maxW / $w));
        $newImg = imagecreatetruecolor($newW, $newH);
        imagealphablending($newImg, false);
        imagesavealpha($newImg, true);
        imagecopyresampled($newImg, $img, 0, 0, 0, 0, $newW, $newH, $w, $h);
        imagedestroy($img);
        $img = $newImg;
    }

    // 保存
    $tmpFile = $file . '.tmp';
    $saved = imagewebp($img, $tmpFile, $quality);
    imagedestroy($img);

    if (!$saved || !file_exists($tmpFile)) {
        $skip++;
        $after += $size1;
        @unlink($tmpFile);
        continue;
    }

    $size2 = filesize($tmpFile);

    if ($size2 < $size1) {
        rename($tmpFile, $file);
        $ok++;
        $after += $size2;

        if ($ok % 20 === 0) {
            echo "  已压缩 " . $ok . " 张...\n";
        }
    } else {
        @unlink($tmpFile);
        $skip++;
        $after += $size1;
    }

    // 强制释放
    gc_collect_cycles();
}

echo "\n";
echo "============================================\n";
echo "✅ 处理完成\n";
echo "============================================\n";
echo "总计:    " . $total . " 张\n";
echo "已压缩:  " . $ok . " 张\n";
echo "跳过:    " . $skip . " 张\n";
echo "\n";
echo "压缩前:  " . round($before / 1024 / 1024, 1) . " MB\n";
echo "压缩后:  " . round($after / 1024 / 1024, 1) . " MB\n";

if ($before > $after) {
    $saved = $before - $after;
    $pct = round($saved * 100 / $before, 1);
    echo "节省:    " . round($saved / 1024 / 1024, 1) . " MB(约 " . $pct . "%)\n";
}

echo "\n💾 原图备份:" . $backup . "\n";
echo "📝 满意后可删:rm -rf " . $backup . "\n";
EOF

php /www/wwwroot/blog2.1.4s5.cn/compress.php

预期输出

🚀 开始压缩(质量 80,最大宽度 1000px),共 202 张

  已压缩 20 张...
  已压缩 40 张...
  ...

============================================
✅ 处理完成
============================================
总计:    202 张
已压缩:  202 张
跳过:    0 张

压缩前:  111 MB
压缩后:  12 MB
节省:    99 MB(约 89%)

检查单张效果

ls -lh /www/wwwroot/blog2.1.4s5.cn/wp-content/uploads/titlepic/166.webp
微信赞赏

微信

支付宝赞赏

支付宝

✍️ 作者: 红穆

网站管理员 · 感谢阅读,更多精彩内容敬请关注

作者主页 查看主页 →

相关文章

PHP ob函数记录

PHP ob函数记录 语言笔记 PHP

下面3个函数的用法 ob_get_contents(); ob_end_clean(); ob_start(); 可以借助这几个函数实现缓冲本地文件,以及执行本地脚本代码。 使用ob_start()把输出的代码存到缓冲区,页面不会显示出来; 然后用ob_get_contents得到缓冲区的数据。 o…
👁 140
PHP preg

PHP preg 语言笔记 PHP

preg_match_all 函数用于执行一个全局正则表达式匹配。preg_match_all() 语法int preg_match_all ( string $pattern , string $subject [, array &amp;$matches [, int $flags = PREG…
👁 169
PHP 三元运算符与if的详解

PHP 三元运算符与if的详解 语言笔记 PHP

三元运算符语条件 ? 结果1 : 结果2 说明:问号前面的位置是判断的条件,如果满足条件时结果1,不满足时结果2。本文对三元运算符和if...else...进行对比详解,希望对大家有所帮助。今天在改论文在线的时候遇到了一个语句看不懂:$if_summary = $row['IF_SUMMARY']=…
👁 187
PHP强制转换类型

PHP强制转换类型 语言笔记 PHP PHP采集 PHP与mysql

获取数据类型1.如果想查看某个表达式的值和类型,用var_dump()。 2.如果只是想得到一个易读懂的类型的表达方式用于调试,用 gettype()。3.要查看某个类型,不要用 gettype(),而用is_type() 函数。字符串转换为数值当一个字符串被当作数字来求值时,根据以下规则来决定结果…
👁 231
php 字符串中是否包含指定字符串的多种方法

php 字符串中是否包含指定字符串的多种方法 语言笔记 PHP

strstrstrstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。代码如下:&lt;?php $email = 'user@example.com'; $domain = strstr($email, …
👁 138

推荐阅读

包装印刷打印设备类网站模板 0618

包装印刷打印设备类网站模板 0618 实用收藏 易优模板

一款针对包装、印刷与打印设备行业的eyoucms网站模板。设计风格专业实用,能够展示印刷设备、包装产品及工艺技术。有助于印刷包装企业在线上展示实力,吸引品牌客户。模板展示 安装说明 网站后台:/login.php 账号:admin 密码:admin 相关文章易优CMS安装常见问题总结易优CMS(Ey…
👁 38
(PC+WAP)营销型绿色市政园林绿化类pbootcms网站模板 园林建筑设计类网站源码 0105

(PC+WAP)营销型绿色市政园林绿化类pbootcms网站模板 园林建筑设计类网站源码 0105 实用收藏 pbootcms模板

这款PbootCMS模板专注于营销型市政园林绿化与园林建筑设计行业,支持PC和WAP端访问。设计风格自然大气,能够很好地展示景观设计作品、绿化工程及植物配置。是园林景观公司或市政工程企业树立品牌形象与获客的有力工具。模板展示 安装说明 网站后台:/admin.php 账号:admin 密码:admi…
👁 46
php 将一个字符串分割为组成它的字符

php 将一个字符串分割为组成它的字符 语言笔记 PHP

问: php里如何将一个字符串分割为组成它的字符?比如hello -&gt; [h, e, l, l, o] 以下有三种方法:这是需要被分割的字符串: $str = 'Hello小样';字符串的长度:$len = mb_strlen($str, 'utf8');// 7第一种:$arr = str_…
👁 182
餐桌餐椅家具定制网站模板 0878

餐桌餐椅家具定制网站模板 0878 实用收藏 易优模板

一款针对餐桌、餐椅与家具定制行业的eyoucms网站模板。设计风格现代实用,能够展示餐桌椅产品、定制服务及空间解决方案。有助于家具品牌在线上展示产品,吸引餐厅与企业客户。模板展示 安装说明 网站后台:/login.php 账号:admin 密码:admin 相关文章易优CMS安装常见问题总结易优CM…
👁 40
(自适应手机端)广告品牌策划公司网站pbootcms模板 广告品牌策划设计公司网站源码下载 0345

(自适应手机端)广告品牌策划公司网站pbootcms模板 广告品牌策划设计公司网站源码下载 0345 实用收藏 pbootcms模板

本套自适应手机端的广告品牌策划与设计公司PbootCMS网站模板。设计风格创意营销,适合广告公司、品牌策划机构展示案例与创意能力。有助于广告公司在线上吸引品牌客户,拓展业务。模板展示 安装说明 网站后台:/admin.php 账号:admin 密码:admin 解压密码:www.4s5.cn相关文章…
👁 62
可视化品牌创新设计网站模板 1118

可视化品牌创新设计网站模板 1118 实用收藏 易优模板

此套eyoucms模板为可视化品牌创新设计网站,设计风格创意视觉,能够很好地展示品牌设计作品、创新案例及设计理念。有助于品牌设计公司在线上展示专业实力,吸引企业客户。模板展示 安装说明 网站后台:/login.php 账号:admin 密码:admin 相关文章易优CMS安装常见问题总结易优CMS(…
👁 34