คำสั่งการทำ Redirect ใน PHP นั้น อย่างที่เรารู้ ๆ กันอยู่ว่าเพียงแค่พิมพ์ว่า
header("location:http://blog.chonla.com");
ซึ่งความจริงแล้ว มันเป็นการกำหนดค่า Location ลงไปใน HTTP Header นั่นเอง เรายังสามารถกำหนด Header อื่น ๆ ลงไปใน HTTP Header ได้อีก แต่วันนี้ผมจะพูดถึงเฉพาะ Location ครับ
มีหลายคนหลงคิดไปเองว่า การสั่ง Redirect ด้วยวิธีนี้นั้น ผู้ใช้จะไม่เห็นส่วนที่เหลือในเว็บ เว็บหนึ่งที่มีการตรวจสอบว่าผู้ใช้ล็อกอินแล้วหรือยัง ถ้ายังให้ redirect ไปยังหน้าล็อกอิน แต่ถ้าล็อกอินอยู่แล้วก็ให้แสดงเนื้อหาในเว็บนั้นเลย ตามโค๊ดด้านล่างนี้ครับ
<?php
if (!$login)
header("location:login.php");
?>
เนื้อหาสำคัญที่จะเข้าถึงได้เฉพาะผู้ที่ล็อกอินแล้วเท่านั้น
สิ่งที่เกิดขึ้นจริงคือ เมื่อ PHP แปลคำสั่งถึง header ที่กำหนด location แล้ว จะเป็นการส่ง HTTP Response 302 กลับไป ซึ่งหมายถึงสิ่งที่เว็บบราวเซอร์ต้องการนั้นอยู่อีกที่หนึ่ง รวมถึงระบุ URL ของหน้านั้น ๆ กลับไปให้ และยังทำการแปลส่วนที่เหลือจนจบและส่งกลับไปให้บราวเซอร์ด้วย
เริ่มเห็นปัญหาแล้วหรือยังล่ะครับ ถ้าเริ่มเห็นอะไรเหมือนที่ผมเห็นแล้ว ลองไปดู LIVE DEMO กันได้เลยครับ
คุณจะเห็นรายละเอียดใน LIVE DEMO ได้ง่ายขึ้นด้วยโปรแกรมประเภท HTTP Sniffer ครับ เช่น Fiddler, HTTPWatch หรือจะใช้พวก Packet Sniffer อย่างเช่น WireShark (Ethereal)
การแก้ไขปัญหามีหลายวิธีครับ ใน LIVE DEMO ผมใช้ exit() เป็นตัวแก้ไขปัญหา แต่ในความเป็นจริงแล้ว เราอาจจะใช้ if…else… ครอบไว้ก็ได้ครับ หรือใครมีวิธีอื่น ๆ อีกก็มาคุยกันได้ครับ
ตัวอย่างภาพที่ผมเซฟมาให้ดูนั้น เป็นภาพที่ได้จาก HTTPWatch ครับ ให้ลองเปรียบเทียบกันระหว่างส่วนที่เป็น Content กันระหว่างแบบที่ผมไม่ได้ใส่ exit() กับแบบที่ผมใส่ exit() เพื่อให้เห็นความแตกต่างของสิ่งที่ได้ส่งกลับมาให้บราวเซอร์ครับ
นอกจากนี้แล้วการทำแบบนี้ยังทำให้ Perfomance สูงขึ้นด้วยครับ เพราะ PHP ไม่จำเป็นต้องประมวลผลคำสั่งส่วนที่เหลือนั่นเองครับ


สรุปก็คือ ถ้าใส่ exit(); หลัง คำสั่ง redirect
php จะปละมวลผลน้อยกว่าไม่ใส่ใช่รึเปล่าครับ
มีส่วนด้วยครับ