timthumb.php มีความสามารถในการ cache รูปที่ถูกย่ออยู่แล้ว เพื่อไม่ให้มันต้อง crop รูปสำหรับทุกๆ request
แต่ไฟล์ cache ของ timthumb ไม่สามารถเปิดดูได้โดยตรง เพราะที่ส่วนหัวของ cache จะมี filePrependSecurityBlock แทรกอยู่เพื่อป้องกันการส่งสคริปท์ php เข้าไปรัน
ทำให้เราไม่สามารถใช้พวก Reverse proxy หรือ CDN ช่วยลดโหลดของ WordPress ที่มีจำนวน Traffic สูงๆได้
(ไม่อย่างนั้นมันจะเรียก php ขึ้นมาทำงานตลอด).
โดยทั่วไป WordPress Theme ที่ใช้ timthumb จะเรียกใช้งาน timthumb ด้วย URL ลักษณะนี้
1 | '/scripts/timthumb.php?src=' . $image . '&w=' . $width . '&h=' . $height . '&zc=1' |
แก้ไฟล์ timthumb.php
-แก้การตั้งชื่อไฟล์ cache ของ timthumb ให้มีการระบุ นามสกุล ของไฟล์ภาพไว้ในชื่อด้วย
-แก้ไม่ให้ timthumb เขียน filePrependSecurityBlock ลงในไฟล์ cache
แก้ไฟล์ functions.php
– แก้ตรงส่วน HTML ในการแสดงภาพ timthumb ให้ไปเรียกที่ไฟล์ cache โดยตรง
ข้อเสียของการทำนี้
จะสูญเสียความสามารถของ timthumb ในด้าน expired cache ไป
แต่ความสามารถนี้ ก็ไม่ได้มีความจำเป็น สำหรับ การใช้งานใน WordPress ส่วนมาก
1.1) แก้การตั้งชื่อไฟล์ cache
- กำหนด constant FILE_CACHE_SUFFIX ให้เป็น empty string
- ใน __construct ให้ดูตรงบรรทัดที่มีการกำหนดค่า $this->cachefile ตรงโค๊ดบล็อคนั้น มันจะมี if($this->isURL){ อยู่ (เวอร์ชั่นขณะที่เขียนบทความนี้ คือ 2.8.11) ให้เราแก้ตรง else { ของบล็อคนั้น เพราะว่าเราจะแก้เฉพาะการเรียก crop ภาพจากภายในเท่านั้น. เติม code นี้เข้าไปด้านใน else ตรงล่างสุด123
if
(
count
(
$_GET
)==4 && isset(
$_GET
[
'src'
]) && isset(
$_GET
[
'w'
]) && isset(
$_GET
[
'h'
]) &&
$_GET
[
'zc'
]) {
$this
->cachefile =
$this
->cacheDirectory .
'/'
. FILE_CACHE_PREFIX .
$cachePrefix
. md5(
$this
->localImage.
$this
->localImageMTime) .
basename
(
$this
->localImage);
}
1.2) ปิดการใช้ filePrependSecurityBlock
- แก้ฟังก์ชั่น serveCacheFile โดยใส่ code นี้ เพื่อให้มัน return ค่าแต่แรก (การทำแบบนี้อาจจะทำให้เกิด error ในบางกรณีได้)1
echo
file_get_contents
(
$this
->cachefile);
return
true;
2) แก้ functions.php
ไม่จำเป็นต้องแก้ถ้าเราสามารถแก้การตั้งชื่อไฟล์ให้อ่านออก แล้วใช้ .htaccess ของ apache หรือ rewrite ของ nginx ในการเขียน rule เพื่อ rewrite URL with Query String ไปยัง URL ที่เป็น static file แทนเลย
การแก้ไฟล์ functions.php ค้นคำว่า timthumb.php ในไฟล์ จะพบบรรทัด ที่มันสร้าง HTML ส่วนของ <img /> ที่ใช้ timthumb.php แล้วเช็คว่าไฟล์ภาพนั้นๆ มีไฟล์ cache ของ timthumb หรือแล้วหรือไม่ หากมีแล้ว ส่งเป็น URL ไปยัง static file ดังกล่าวเลย แต่ถ้าไม่มีให้ return src ไปตามปกติ เพื่อไปเรียก timthumb.php สร้างไฟล์ cache ขึ้นมาให้ก่อน