紅穆ノート
レコメンド 言語ノート 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
微信赞赏

WeChat

支付宝赞赏

Alipay

✍️ クリエイター: 紅穆

ウェブサイト管理者 · ご覧いただきありがとうございます!さらに多くの魅力的なコンテンツをお楽しみいただけますよう、引き続きご支援をお願いいたします。

著者プロフィール プロフィールを見る →

関連記事

PHPのob関数の記録

PHPのob関数の記録 言語ノート PHP

以下の3つの関数(`ob_get_contents()`、`ob_end_clean()`、`ob_start()`)を用いることで、ローカルファイルのバッファリングやローカルスクリプトコードの実行を実現できます。`ob_start()`を用いて出力されるコードをバッファに保存すると、ページは即座に表示されません。その後、`ob_get_contents()`を呼び出してバッファに保存されたデータを取得します。
👁 153
PHP preg

PHP preg 言語ノート PHP

`preg_match_all` 関数は、グローバルな正規表現マッチングを実行するために使用されます。`preg_match_all()` の構文は以下の通りです:`int preg_match_all( string $pattern , string $subject [, array &$matches [, int $flags = PREG… ] )`
👁 173
PHPにおける三項演算子と`if`文の詳細解説

PHPにおける三項演算子と`if`文の詳細解説 言語ノート PHP

三元演算子(? 表示式1 : 表示式2):説明:問号の前に続く部分が条件であり、条件が満たされた場合に表示式1、そうでない場合に表示式2が返されます。本記事では、三元演算子と `if...else...` 文を比較・詳細に解説しており、皆様の参考になれば幸いです。本日、論文のオンライン修正作業中に、以下の文が理解できなかったことに遭遇しました:`$if_summary = $row['IF_SUMMARY'] = ...`
👁 198
PHPにおける型強制変換

PHPにおける型強制変換 言語ノート PHP PHPデータ収集 PHPとMySQL

データ型の確認:1. 指定された式の値および型を確認する場合、`var_dump()` を使用します。2. デバッグ目的で、読みやすい型表現を取得する場合、`gettype()` を使用します。3. 指定された型を確認する場合は、`gettype()` ではなく `is_type()` 関数を使用してください。文字列を数値に変換:文字列が数値として評価される場合、結果は以下のルールに基づいて決定されます…
👁 239
PHPで指定された文字列が文字列に含まれているかどうかを判定するさまざまな方法

PHPで指定された文字列が文字列に含まれているかどうかを判定するさまざまな方法 言語ノート PHP

`str strstr()` 関数は、ある文字列が別の文字列内で最初に出現する位置を検索します。この関数は、一致した位置から始まる文字列の残りの部分を返します。対象の文字列が見つからない場合、`false` を返します。コード例:`< ?php $email = 'user@example.com'; $domain = strstr($email, ...
👁 144

おすすめ読書

PHPで、指定されたフォルダ内の任意のファイルをランダムに選択し、そのファイル名を返します。

PHPで、指定されたフォルダ内の任意のファイルをランダムに選択し、そのファイル名を返します。 言語ノート PHP

指定されたディレクトリ内のファイル名をランダムに取得するPHP関数:🔒 見えない内容:ログイン後で閲覧可能。`function getRandomFileName($dir) { // 空のディレクトリを指定します。` `if (empty($files)) { return null; // ファイルが存在しない場合、nullを返す。` `…`
👁 287
PHPで正規表現を使用せずに、指定された2つの文字の間に存在する内容を削除する方法

PHPで正規表現を使用せずに、指定された2つの文字の間に存在する内容を削除する方法 言語ノート PHP

これは、文字列内の指定された括弧内の内容を削除するためのPHP関数です。この関数には3つのパラメータが受け取りられます:`$text` — 处理対象の文字列;`$leftBracket` — 括弧の左端文字;`$rightBracket` — 括弧の右端文字。関数の処理ロジックは以下の通りです:まず、`strpos()`関数を用いて、文字列 `$text` 内の最初の `$leftBracket` を検出します…
👁 147
(適応型モバイル版)レスポンシブ対応のエレベーター・エスカレーター向けPBootCMSテンプレート|エレベーター製造業者向け環境配慮型企業ウェブサイトのソースコードダウンロード(0461)

(適応型モバイル版)レスポンシブ対応のエレベーター・エスカレーター向けPBootCMSテンプレート|エレベーター製造業者向け環境配慮型企業ウェブサイトのソースコードダウンロード(0461) 実用収集 pbootcmsテンプレート

本セットは、モバイル端末向け適応型雨棚用膜構造工事および車棚用カスタマイズPbootCMSウェブサイトのテンプレートです。デザインは現代的かつ専門的であり、膜構造製品や雨棚・車棚に関する実例プロジェクトの展示に適しています。膜構造関連企業がオンライン上で設計・施工の能力を効果的に発信し、商業・公共分野の顧客を惹きつけることを支援します。テンプレート・設置説明書・ウェブサイト管理画面:/admin.php|アカウント:admin|パスワード:admin|展開用パスワード:www.4s5.…
👁 35
(PC+WAP)ブルー系鉄骨構造機械・ハードウェア向けウェブサイト用PBootCMSテンプレート – マーケティング型工事・インフラ整備ウェブサイト用ソースコードダウンロード:0544

(PC+WAP)ブルー系鉄骨構造機械・ハードウェア向けウェブサイト用PBootCMSテンプレート – マーケティング型工事・インフラ整備ウェブサイト用ソースコードダウンロード:0544 実用収集 pbootcmsテンプレート

鉄骨構造、機械・金物製品、および建設・インフラ分野に適したPbootCMSブルーテンプレートです。PCおよびWAP両端末に対応しています。硬朗で安定したデザインスタイルにより、鉄骨構造工事や金物製品を効果的に紹介できます。建設工事業者や鉄骨構造関連企業が、ブランドの強みや工事実績をオンラインで発信するのに最適な選択肢です。テンプレート表示・設置説明:ウェブサイトバックエンド:/admin.php、ユーザー名:admin、パスワード:admin。解凍…
👁 55