Archive for the ‘Programming’ Category

0141 | แก้ปัญหา WP SuperCache ขึ้น File name too long

Monday, December 24th, 2012 Posted in PHP Coding, Programming | No Comments »

ท่านที่ใช้ wordpress ใช้ wp-supercache กันอยู่ใช่มั้ยครับ? เคยประสบปัญหา permalink เป็นภาษาไทยยาวจน wp-supercache ไม่ทำงานรึเปล่า?
ตอนนี้ TV Direct ขอนำเสนอ… plugin ของ wp-supercache (อีกที) เพื่อแก้ปัญหา url ยาวเกินจนทำให้สร้าง folder cache ไม่ได้ครับ

ไม่ต้องซื้อ ไม่ต้องหา ก๊อปวางกันได้ที่นี่สบายๆ เอาไปใส่ที่ folder wp-content/plugins/wp-super-cache/plugins/ สร้างไฟล์ชื่ออะไรก็ได้ แล้วใส่ข้อมูลไปตามนี้ครับ

<?php
function iz_wpscfix_dir($uri) {
        $uris = explode('/', $uri);
        $result = array();
        foreach ($uris as $path) {
                if (strlen($path) > 250) {
                        $path = substr($path, 0, 220).'-'.md5($path);
                }
                $result[] = $path;
        }
        return implode("/",$result);
}
add_cacheaction('supercache_dir', 'iz_wpscfix_dir', 0);

แค่นี้ก็แก้ปัญหาเรียบร้อย ส่วน rewrite url มีปัญหาไม่ทำงานนิดหน่อยไม่เป็นไร ใช้ PHP serve แทนได้ ก็พอจะช่วยลด load ลงได้เยอะอยู่ครับ ^^

Tags: , ,

0061 | PHP simple object cache

Tuesday, June 2nd, 2009 Posted in Database, PHP Coding, Programming, Web Server | 3 Comments »

ระบบ cache มาอีกแล้ว เอ๊อกๆ
คราวนี้เป็น object cache ครับ ไม่ใช่ cache ทั้งหน้าแบบคราวก่อน

<?php
$_cachetime = 3600;
$_cacheroot = '/path/to/cache/';
function cacheget($key) {
	global $_cachetime, $_cacheroot;
	$_cachename = sprintf('%x', crc32($key));
	$_cachefolder = $_cacheroot.substr($_cachename,0,2).'/';
	$_cachefile = $_cachefolder.$_cachename;
	if (file_exists($_cachefile) && (filemtime($_cachefile) > time() - $_cachetime || 
		(file_exists($_cachefile.'.lock') && time() - filemtime($_cachefile.'.lock') < 120))) {
		return unserialize(file_get_contents($_cachefile));
	}
	return false;
}
function cachelock($key) {
	global $_cacheroot;
	$_cachename = sprintf("%x", crc32($key));
	$_cachefolder = $_cacheroot.substr($_cachename,0,2).'/';
	$_cachefile = $_cachefolder.$_cachename;
	umask(0);
	if (!file_exists($_cachefolder)) {
		mkdir($_cachefolder,0777);
	}
	touch($_cachefile.'.lock');
}
function cacheset($key, $value) {
	global $_cacheroot;
	$_cachename = sprintf('%x', crc32($key));
	$_cachefolder = $_cacheroot.substr($_cachename,0,2).'/';
	$_cachefile = $_cachefolder.$_cachename;
	umask(0);
	if (!file_exists($_cachefolder)) {
		mkdir($_cachefolder,0777);
	}
	if ($_h = fopen($_cachefile, 'w')) {
		fwrite($_h, serialize($value));
		fclose($_h);
		unlink($_cachefile.'.lock');
	}
}
?>

วิธีติดตั้ง:

include ไฟล์ไปบนสุดเลย แก้ตัวแปร $_cacheroot กับ $_cachetime ด้วยนะครับ
chmod 777 folder ตามที่ตั้งใน $_cacheroot ไว้ด้วย

วิธีเรียกใช้:

สมมติว่า cache คำสั่ง sql นะครับ
ถ้าปกติใช้อย่างนี้

<?php
$query = 'SELECT * FROM table';
$sql = mysql_query($query);
while ($row = mysql_fetch_assoc($sql)) {
        var_dump($row);
}
?>

ก็แก้เป็นประมาณนี้

<?php
$query = 'SELECT * FROM table';
if (!$rows = cacheget($query)) {
        cachelock($query);
        $sql = mysql_query($query);
        $rows = array();
        while ($row = mysql_fetch_assoc($sql))
                $rows[] = $row;
        cacheset($query, $rows);
}
foreach($rows as $row) {
        var_dump($row);
}
?>

Tags: , ,