ปกติใน php เวลาที่มีการเรียกใช้คำสั่ง session_start() จะเป็นการสั่งให้ php เก็บข้อมูลสำหรับ session นั้นๆ ของผู้ใช้ ซึ่งปกติจะเก็บเป็นไฟล์ไว้ที่ไดเรกทอรี /tmp (แก้ไขตำแหน่งที่เก็บได้ใน php.ini) หรือาจเปลี่ยนวิธีการเก็บไปใช้ shared memory หรือ database ก็ได้ (หรือ storage ใดๆ ตามแต่จะคิดก็ได้)
ข้อมูลส่วนที่เก็บไว้ตรงนี้ ก็คือค่าที่อยู่ในตัวแปร $_SESSION ของผู้ใช้แต่ละคนนั่นเอง ที่เวบปกติจะเก็บค่าตรงนี้ไว้ ก็เพื่อใช้ในประโยชน์ต่างๆ เช่น การล็อกอินเข้าระบบสมาชิก ต้องเก็บข้อมูล member_id กับ member_name ไว้ตลอดทั้ง session ที่สมาชิกเข้ามาใช้งาน
วิธีนี้มันก็มีข้อดีตรงที่ง่าย แต่ปัญหาคือมันต้องมีการอ่านและเขียนฮาร์ดดิสก์เสมอเมื่อมีการเรียกฟังก์ชัน session_start() ซึ่งมันไม่ค่อยดีถ้ามีการใช้งานเยอะๆ และทำให้การขยายระบบทำได้ลำบาก
วิธีเก็บข้อมูลของผู้ใช้ที่ล็อกอินเข้ามาโดยไม่ต้องเก็บลง session สามารถเก็บได้อีกวิธีนึงคือใช้ cookie แต่ข้อเสียของ cookie คือว่า ข้อมูลจะถูกเก็บที่ฝั่งผู้ใช้ ทำให้ผู้ไม่หวังดี อาจจะเปลี่ยนแปลงข้อมูลตรงนี้เพื่อหลอก server ก็ได้ ดังนั้นเพื่อแก้ปัญหาอันนี้ เราก็จะเข้ารหัส cookie ซะโดยใช้วิธีแบบนี้
// สมมุติเราจะเก็บ $member_id กับ $nickname
$data = $member_id."-".$nickname;
// เก็บเวลาไว้ด้วย
$time = time();
// เข้ารหัสซะ
$signed = sha1($secret.$time.$data);
// เอาตัวนี้เก็บใน cookie
$cookie = base64_encode("$signed-$time-$data");
เวลาจะแกะข้อมูลออกมาก็
// แกะออกมาจากที่มัน encode ไว้
$parts = explode("-", base64_decode($cookie), 2);
// เอาทั้งส่วนมา 1 กับ 2 มา sha1 ดูว่าเท่ากับส่วนที่ 0 หรือเปล่า
if (sha1($secret.$parts[1].$parts[2]) == $parts[0]) {
// cookie ถูกต้อง
$data = $parts[2];
// session หมดอายุหรือยัง
if (time() - $parts[2] > 60*60*2) {
// session อยู่มานานเกินสองชั่วโมงแล้ว
}
} else {
// cookie โดนแอบแก้
}
อ่านมาจาก slide ของ Cal Handerson
อีกหนึ่งความเลวร้ายของ IE คือมันไม่ support คุณสมบัติ max-height ของ CSS
max-height ใน CSS จะเป็นตัวกำหนดความสูงมากที่สุดที่ element อันนั้นจะยอมได้ ถ้าเนื้อหาที่บรรจุใน element มันยาวเกิน ก็จะมี scrollbar โผล่มาให้เลื่อนๆ เอง บราวเซอร์เกือบทั้งหมดทำแบบนี้ได้ ยกเว้น IE ที่ชอบทำอะไรตามใจตัวเอง วิธีแก้มันเลยต้องเขียนอะไรพิลึกๆ แบบนี้
#mydiv {
max-height: 250px; /* CSS-compliant browser */
height: expression(this.scrollHeight > 250 ? "250px" : "auto"); /* for IE only ! */
overflow: auto;
}
ไม่ค่อยชอบวิธีแบบนี้เท่าไหร่ ดูแล้วมันไม่ elegant เลย
เห็นเพื่อนฝูงคนถ่ายรูปเค้าเล่นเวบ multiply.com กันเป็นล่ำเป็นสัน ท่าทางก็ดูมีฟีเจอร์เยอะและเป็น community ดี เมื่อก่อนตอนที่มันเพิ่งฮิตก็ไปสมัครไว้ลองเล่นกับเค้าเหมือนกัน แต่เท่าที่ดูแล้วมัน customize ได้ไม่ตรงใจเท่าไหร่ รวมทั้งฟีเจอร์เรื่องแปะรูปก็ยังสู้ของ Flickr ไม่ได้ และที่สำคัญคือผมเป็นคนขี้เกียจ มีบล็อกอยู่ที่เดียวยังไม่ค่อยจะได้อัพเดตเท่าไหร่เลย ถ้าจะให้ไปอัพเดตที่นั่นด้วย คงไปไม่รอด
พยายามคิดหาวิธีที่จะทำให้โพสที่ dogpositive นี่ไปขึ้นที่ multiply ได้เองโดยอัตโนมัติ ก็เลยมาลองดูว่า multiply มี publish API อะไรให้ใช้หรือเปล่า ผลปรากฏว่าไม่มี… ไม่เป็นไร โชคดีที่มันยังมีฟีเจอร์โพสผ่านทาง email โดยคอนเซปต์มันก็คือ ให้เราส่ง email ไปที่ address ซักอันนึงที่กำหนด แล้วมันจะเอาขึ้นโพสให้
ทีนี้ก็มาคิดต่อว่า ทำยังไงเวลาเราเขียนบล็อกแล้ว มันจะอีเมลไปให้เอง จะตั้งเวลาให้โปรแกรมมาวนอ่าน feed แล้วส่งอีเมลมันก็พอได้ แต่มันไม่ real time และดูจะไม่ค่อยสวยเท่าไหร่ คิดไปคิดมา ก็มาลงตัวที่การเขียน plugin ให้กับ wordpress เพื่อ hook action การ publish_post น่าจะเป็นวิธีที่ elegant ที่สุด
เปิด document ของ plugin development ในเวบ wordpress ดูแล้วก็ลองเขียนแบบ dirty หน่อย ก็ได้เป็น plugin แบบปรับแต่งอะไรไม่ได้มาตัวนึง คือจริงๆ แล้วมันควรจะมี panel ของ plugin ตัวนี้มาให้แก้ได้ว่าจะให้ส่งอีเมลไปที่ address ไหน แต่ว่าขี้เกียจอ่าน document ก็เลยเขียน hardcode ไปดื้อๆ ได้ออกมาประมาณนี้
< ?php
/*
Plugin Name: Publish to Multiply
Plugin URI: http://pit.dogpositive.com/blog/
Description: Email the published post to multiply.
Author: Pittaya Sroilong
Version: 0.1
Author URI: http://pit.dogpositive.com/blog/
*/
function email_multiply($pid) {
$to = "secret_pin_at_username_dot_multiply_dot_com";
$post = get_post($pid);
if ($post->post_date == $post->post_modified) {
$subject = ‘=?utf-8?B?’.base64_encode($post->post_title).’?=’;
$msg = $post->post_content;
$headers = “Content-Type: text/html;charset=utf8″;
mail($to, $subject, $msg, $headers);
}
return $pid;
}
add_action(’publish_post’, ‘email_multiply’);
?>
เซฟไฟล์แล้วเอาไปใส่ใน wp-content/plugins/ จากนั้นไป activate ใน plugin panel เพื่อใช้งาน
ว่างๆ จะไปเยี่ยมชมก็ได้
http://pittaya.multiply.com