Panduan Lengkap Optimasi Website PHP Agar Lebih Ringgan
- Administrator
- 421 Kali Dilihat
- 0 Komentar
Panduan Lengkap Optimasi Website PHP: WebP, Minify CSS/JS/HTML, dan Autoconvert Gambar
Artikel mendukung untuk PopojiCMS V.2.x.x
Apakah websitemu terasa berat dan lambat dimuat? Gambar besar dan kode HTML/CSS/JS yang tidak dioptimalkan bisa memperlambat loading secara signifikan. Artikel ini akan memandumu membuat script otomatis untuk mengoptimalkan:
-
Gambar → WebP
-
Tag
<img>→<picture> -
CSS, JS, dan HTML → versi minified
-
Tanpa merombak struktur website yang sudah ada
Struktur Website yang Didukung
Script ini kompatibel dengan struktur website seperti:
po-content/
├── uploads/
│ ├── medium/
├── thumbs/
├── themes/
│ └── theme-active/
│ ├── style.css, script.js, template.php, dll
Script akan memproses semua gambar dan file yang ada di dalam po-content, lalu menyimpan hasilnya ke dalam po-content-opt/ (versi optimal).
Fitur Utama Script Optimasi
-
Kompres dan konversi semua
.jpg,.jpeg,.pngke.webp -
Otomatis ganti tag
<img>menjadi<picture>dengan<source type="image/webp"> -
Minify semua file
.css,.js, dan.html/.php/.tpl -
Tidak mengubah file asli (semua hasil diletakkan di folder
po-content-opt/)
File Script: optimize-po-content.php
Berikut adalah isi script utama:
<?php
$baseDir = __DIR__ . '/po-content';
$outputDir = __DIR__ . '/po-content-opt';
// Konversi gambar ke WebP
function compressImageToWebP($source, $destination, $quality = 75) {
$info = getimagesize($source);
if (!$info) return false;
switch ($info['mime']) {
case 'image/jpeg': $image = imagecreatefromjpeg($source); break;
case 'image/png': $image = imagecreatefrompng($source); break;
default: return false;
}
imagewebp($image, $destination, $quality);
imagedestroy($image);
return true;
}
// Minify CSS & JS
function minifyCSS($input) {
return preg_replace('/s+/', ' ', preg_replace('//*.*?*//s', '', $input));
}
function minifyJS($input) {
return preg_replace('/s+/', ' ', preg_replace('///.*?(n|$)/', '', $input));
}
// Konversi <img> → <picture>
function convertImgToPicture($html) {
libxml_use_internal_errors(true);
$dom = new DOMDocument();
@$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$imgs = $dom->getElementsByTagName('img');
$replacements = [];
foreach ($imgs as $img) {
$src = $img->getAttribute('src');
$ext = pathinfo($src, PATHINFO_EXTENSION);
if (!in_array(strtolower($ext), ['jpg', 'jpeg', 'png'])) continue;
$webpSrc = preg_replace('/.(jpg|jpeg|png)$/i', '.webp', $src);
$picture = $dom->createElement('picture');
$source = $dom->createElement('source');
$source->setAttribute('srcset', $webpSrc);
$source->setAttribute('type', 'image/webp');
$cloneImg = $img->cloneNode(true);
$picture->appendChild($source);
$picture->appendChild($cloneImg);
$replacements[] = ['old' => $img, 'new' => $picture];
}
foreach ($replacements as $rep) {
$rep['old']->parentNode->replaceChild($rep['new'], $rep['old']);
}
return $dom->saveHTML();
}
// Proses Gambar
function processImages($sourceDir) {
$images = glob("$sourceDir/**/*.{jpg,jpeg,png}", GLOB_BRACE);
foreach ($images as $file) {
$target = str_replace('po-content', 'po-content-opt', $file);
$webp = preg_replace('/.(jpg|jpeg|png)$/i', '.webp', $target);
if (!is_dir(dirname($webp))) mkdir(dirname($webp), 0777, true);
compressImageToWebP($file, $webp);
echo "✔ WebP: $filen";
}
}
// Proses CSS/JS
function processAssets($dir, $type) {
$files = glob("$dir/**/*.$type", GLOB_BRACE);
foreach ($files as $file) {
$content = file_get_contents($file);
$minified = $type == 'css' ? minifyCSS($content) : minifyJS($content);
$target = str_replace('po-content', 'po-content-opt', $file);
$target = preg_replace("/.$type$/", ".min.$type", $target);
if (!is_dir(dirname($target))) mkdir(dirname($target), 0777, true);
file_put_contents($target, $minified);
echo "✔ Minify .$type: $filen";
}
}
// Proses HTML/PHP/TPL untuk <picture>
function processHTMLFiles($dir) {
$files = glob("$dir/**/*.{html,php,tpl}", GLOB_BRACE);
foreach ($files as $file) {
$html = file_get_contents($file);
$converted = convertImgToPicture($html);
$target = str_replace('po-content', 'po-content-opt', $file);
if (!is_dir(dirname($target))) mkdir(dirname($target), 0777, true);
file_put_contents($target, $converted);
echo "✔ Picture convert: $filen";
}
}
// Jalankan
echo "⏳ Mulai optimasi...n";
processImages($baseDir.'/uploads');
processImages($baseDir.'/uploads/medium');
processImages($baseDir.'/thumbs');
processAssets($baseDir.'/themes/theme-active', 'css');
processAssets($baseDir.'/themes/theme-active', 'js');
processHTMLFiles($baseDir.'/themes/theme-active');
echo "n✅ Semua selesai! Hasil di: po-content-opt/n";
Cara Menggunakan:
-
Simpan script di root:
optimize-po-content.php -
Jalankan via browser atau terminal:
php optimize-po-content.php -
Semua hasil akan disimpan di:
/po-content-opt/
Bonus: Otomatis WebP Saat Upload
Tambahkan ke file upload kamu (misalnya upload.php):
require 'functions-upload.php'; // tambahkan
optimizeUploadedImage($targetFile); // panggil setelah upload sukses
Fungsi optimizeUploadedImage() bisa diambil dari script di atas (gunakan bagian compressImageToWebP()).
Kesimpulan
Dengan script ini kamu:
-
Hemat bandwidth hingga 80% lewat WebP
-
Percepat loading dengan file minify
-
Tidak perlu ubah struktur website yang sudah ada
Contoh Implementasi Frontend/Snippet Images
<figure>
<a href="<?=$this->pocore()->call->postring->permalink(rtrim(BASE_URL, '/'), $list_post);?>">
<picture>
<source srcset="<?=BASE_URL.'/'.DIR_CON_OPT.'/uploads/medium/medium_'.pathinfo($list_post['picture'], PATHINFO_FILENAME)?>.webp" type="image/webp">
<img src="<?=BASE_URL;?>/<?=DIR_CON_OPT;?>/uploads/medium/medium_<?=$list_post['picture'];?>" alt="<?=$list_post['title'];?>">
</picture>
</a>
</figure>
Menghadirkan Solusi Digital Kreatif Melalui Website untuk Bisnis Jasa Online Masa Depan
Membangun Fondasi Digital yang Kuat untuk Bisnis Jasa Online Di era digital saat ini, memiliki website yang tidak hanya menarik tetapi...
Inovasi Web Kreatif untuk Mendukung Perkembangan Bisnis Jasa Online di Era Digital
Membangun Kehadiran Digital yang Kuat Lewat Website Bisnis Jasa Online Kehadiran digital yang kuat adalah aspek penting bagi bisnis jasa online...
