[อัพเดท] ผมว่านะ พวกคุณควรเลิกใช้ AppServ ได้แล้วล่ะ

AppServ ออกเวอร์ชันใหม่แล้วจ้า!!

AppServ ออกรุ่นใหม่แยกเป็น 2 รุ่นครับ  คือรุ่น PHP 5.6 และรุ่น PHP 7.0 ทั้งสองเวอร์ชันมาพร้อมกับ MySQL 5.7 และ Apache 2.4 ครับ

ใครที่ยังเป็นแฟนๆ AppServ อยู่  สามารถเข้าไปดาวน์โหลดได้ในเว็บหลัก AppServNetwork.com ได้เลยครับ (จะเปิดให้โหลดในวันที่ 8 มกราคมนะครับ)


AppServ จัดได้ว่าเป็น WAMP Stack ที่ “โคตรนิยม” ในหมู่คนไทย  นิยมขนาดว่าแม้ว่ามันจะหยุดพัฒนาไปแล้วประมาณ 5 ปี คนไทยก็ยังใช้กันอยู่จนถึงทุกวันนี้ (ตายยากน้องๆ Windows XP เลยนะเนี่ย)  คือในช่วงสามสี่ปีที่แล้วมันก็ยังโอเคนะครับ  ยังพอจะใช้กันได้แบบไม่มีปัญหา  แต่ปัจจุบันด้วยความเก่าของมัน  ทำให้หลายๆ คนเจอปัญหาเมื่อเอาเว็บไปลงใน Production กันแล้วครับ

ปัญหาหลักๆ ที่มักจะเจอกันคือปัญหาของเวอร์ชัน PHP ครับ ในขณะที่ซอฟต์แวร์ตัวอื่นใน AppServ ดูไม่ค่อยจะเป็นปัญหาเท่าไหร่ (ถ้าไม่ได้มักง่ายขนาดเอา AppServ ไปทำ Production Server นะ)

PHP 5.2 ปัญหาสำคัญใน AppServ

AppServ หยุดพัฒนาไปเมื่อปี 2009 และเวอร์ชันสุดท้ายของ AppServ มันมาพร้อมกับ PHP 5.2 ที่เลิกซัพพอร์ตไปตั้งแต่ปี 2011 ครับ  ในขณะที่โฮสต์ส่วนใหญ่ที่เปิดให้บริการอยู่ตอนนี้  เท่าที่ผมทราบคือจะใช้ PHP 5.3 กันเป็นหลัก (5.3 ก็เพิ่งหมดซัพพอร์ตไปเมื่อเดือนสิงหาคมที่ผ่านมาครับ  คิดว่าโฮสต์หลายที่น่าจะไล่อัพเกรดเป็น 5.4 หรือ 5.5 กันอยู่)

อ้อ มันมีรุ่นที่มากับ PHP6-Dev ด้วย  อันน่าช่างหัวมันครับ PHP6 โดนฝังกลบไปแล้ว (แถมมันก็เป็น build เมื่อปี 2009 นั่นแหละ) Major รุ่นถัดไปจะเป็น PHP7 ครับ

ตั้งแต่ PHP 5.3 เป็นต้นมา  มีฟีเจอร์ใหม่ๆ หลายตัวที่ถูกเพิ่มเข้ามา  และยังมีฟีเจอร์เก่าๆ อีกหลายตัวที่ถูกยกเลิกหรือเอาออกไปจาก PHP ด้วยเช่นกันครับ (และหลายๆ ตัวก็ยังเห็นคนใช้กันอยู่ด้วยสิ)

คำสั่งในกลุ่ม MySQL Extension เดิมที่ถูก Deprecated

เรื่องนี้เคยเขียนเอาไว้แล้วครั้งหนึ่ง  ลองอ่านได้จากในลิงค์นี้ครับ เมื่อคำสั่ง mysql_xxx ถูกเลิกใช้ใน PHP 5.5

global_register ถูกปิดใน PHP 5.3 และถูกเอาออกใน PHP 5.4

หลายคนอาจจะไม่คุ้นกับ Global Register แต่ถ้าจะอธิบายให้ง่ายๆ คือการที่เราสามารถเรียกใช้ตัวแปรต่างๆ ใน Query String ด้วยชื่อตัวแปรตรงๆ ได้เลย  อย่างเช่น URL คือ https://jirayu.in.th/?page=123 เราสามารถเรียกใช้ตัวแปร $page ได้เลย  ซึ่งปกติแล้วเราควรจะเรียกผ่าน $_GET[‘page’]

ไม่เฉพาะกับ Query String เท่านั้น แม้แต่ข้อมูลของฟอร์มที่ส่งมาแบบ Post ($_POST[‘var’]), ตัวแปรใน Session ($_SESSION[‘var’]), หรือ Cookie ($_COOKIE[‘var’]) ก็สามารถเรียกว่า $var ได้เช่นกัน  ถ้าหากเปิด Global Register เอาไว้

ซึ่งการเปิดใช้ Global Register ทำให้มีปัญหาความปลอดภัยตามมาครับ  ตัวอย่างเช่นถ้าเก็บ user_id ลงในคุ๊กกี้  เราสามารถส่งค่า user_id ผ่านทางใดก็ได้ (เช่น index.php?user_id=1) เพื่อปลอม user_id เป็นคนอื่นได้ครับ

ด้วยเหตุตามนี้ ใน PHP 5.3 เขาก็ทำการปิด Global Register ไว้เป็นค่าเริ่มต้น  และเอามันออกไปอย่างสมบูรณ์ใน PHP 5.4

ฟังก์ชันจัดการ Session บางตัวถูกยกเลิกใน PHP 5.3 และถูกเอาออกใน PHP 5.4

คิดว่าคงคุ้นเคยกันดีกับฟังก์ชัน session_register(), session_is_registered(), และ session_unregister() ที่ใช้สำหรับ สร้าง, เช็ค, และลบเซสชัน  ซึ่งสามฟังก์ชันนี้ถูกประกาศเลิกใช้ใน PHP 5.3 และถูกเอาออกไปโดนสิ้นเชิงใน PHP 5.4 ครับ

เนื่องด้วยฟีเจอร์พวกนี้  มันจะไปผูกตัวแปร Superglobal ที่ชื่อว่า $_SESSION ครับ  โดยเราสามารถทำดังนี้เพื่อทดแทนฟังก์ชันข้างต้นได้เลย

$_SESSION['var'] = "..."; //สร้าง Session ชื่อว่า var
isset($_SESSION['var']); // เช็คว่าได้สร้าง Session ชื่อว่า var ไว้หรือยัง
unset($_SESSION['var']); // ลบ Session ชื่อว่า var

และฟังก์ชันอื่นๆ หลายๆ ตัว ก็โดน Deprecated ไปด้วยเหมือนกันใน PHP 5.3

อย่างเช่น mysql_db_query(); ereg(); split(); และอื่นๆ  อ่านในนี้นะ จะเห็นว่าฟังก์ชันหลายๆ ตัว  ชื่อคุ้นหน้าคุ้นตากันดีเลยทีเดียว

เพิ่มฟังก์ชันใหม่ๆ เขียนโค๊ดได้สั้นขึ้นเยอะ

ตัวอย่างเช่นการคำนวนอายุจากวันเกิด  ใน PHP 5.3 มีฟังก์ชัน date_diff(); เพิ่มเข้ามา  ทำให้โค๊ดยาวๆ เหลือแค่บรรทัดเดียว

ลองดูในนี้ครับ  เค้ามีฟังก์ชันเทียบระหว่าง PHP 5.2 ลงไป (5.3-) และ 5.3 ขึ้นมา (5.3+)

เขียน Immediate Function แบบ JavaScript ได้แล้ว

คือใน PHP เค้าเรียกมันว่า Anonymous Function ครับ  เป็นฟังก์ชันที่ประกาศมาลอยๆ ไม่มีชื่ออะไร  แบบใน JavaScript ครับ  ประมาณนี้

jQuery(document).ready(function(){
	console.log("Hello World");
});

หรือแบบนี้

var myfunc = function(mystr){
	return mystr
}

console.log(myfunc("Hello World"));

ประโยชน์ของ Anonymous Function โดยปกติแล้วเค้าเอาไว้สำหรับทำ Callback Function ครับ  เอาจริงๆ ส่วนนี้ผมก็ยังไม่ได้ใช้บ่อยนัก  อธิบายได้ไม่ค่อยถูก  เอาว่าลองไปอ่านดูตามในนี้นะครับ (มันจะมีพวก Lambda กับ Closure อีก)

คลาสใน PHP 5.3 รองรับการตั้ง namespace

เอาจริงๆ ผมก็ไม่ได้เขียน OOP เก่งเทพอะไรนักหรอก  และยังไม่ค่อยเข้าใจเรื่องของ namespace เท่าไหร่ (แต่คือในภาษาอื่นอย่างพวก C# มันก็มีแล้ว) แต่ถ้าจะอธิบายง่ายๆ คือ  มันเป็นฟีเจอร์ที่สามารถทำให้ตั้งชื่อคลาสซ้ำกันได้

คือมันมีปัญหาแบบนี้ครับ  บางทีเราเอาคลาสที่เค้าแจกกันมาใช้  แล้วเกิดปัญหาว่าชื่อคลาสดันซ้ำกับที่เราเขียน  หรือไม่มันก็ซ้ำกันกับคลาสอื่นที่เราดึงมาใช้  ซึ่ง namespace มันเข้ามาแก้ปัญหาตรงนี้ครับ  ความสามารถของมันคือเราสามารถตั้งชื่อเล่นให้กับคลาสนั้นๆ ด้วย namespace ได้  และเวลาเรียกใช้ก็เรียกมันผ่าน namespace นั่นแหละ (อ่านเพิ่มเติมในนี้โลด)

และฟีเจอร์เกี่ยวกับ OOP อีกเพียบ

เช่นสามารถตั้ง Constant ในระดับคลาสได้แล้ว (เดิมมันตั้งได้แค่ในฟังก์ชันย่อย), สามารถใช้คีย์เวิร์ด use เพื่อตั้งชื่อเล่นให้กับ namespace ได้อีกต่อนึง (เออ เอาสิ), ฯลฯ

ของใหม่ใน PHP 5.4

ข้างบนนั่นคือที่เปลี่ยนไปจาก PHP 5.2 ไป PHP 5.3 ครับ  และเนื่องจากว่า PHP 5.3 มันหมด Support ไปแล้วเหมือนกัน (ไม่กี่เดือนนี่เอง  ตอนนี้โฮสต์หลายที่ก็ยังใช้ PHP 5.3 ครับ  แต่สำหรับโปรเจ็กท์ใหม่ๆ ควรเริ่มเขียนด้วย PHP 5.4 หรือ PHP 5.5 ได้แล้ว) เลยถือโอกาสเอาของใหม่มาให้ดูกันด้วย

เขียน Array สั้นๆ แบบ JavaScript ได้แล้ว

คือเมื่อก่อนเราจะโยนค่าหลายๆ ตัวลง Array เราต้องโยนใส่ในฟังก์ชัน Array() แบบนี้ใช่มั้ยครับ

$data = array(
	'firstname' => 'John',
	'lastname' => 'Farmer',
);

$sample = array("rice", "corn", "tomato");

แต่ใน PHP 5.4 เราเขียนแบบนี้ได้แล้ว

$data = ['firstname' => 'John', 'lastname' => 'Farmer',];
$sample = ["rice", "corn", "tomato"];

สั้นลงอีกหน่อย  เหมาะกับโปรแกรมเมอร์สายขี้เกียจอย่างเราครับ

สามารถกรุ๊ปฟังก์ชันแล้วเอามาใช้ซ้ำๆ ได้ผ่าน Traits

เคยมั้ยครับที่เราเขียนคลาสคนละคลาสกัน  ไม่ได้เกี่ยวข้องอะไรกันเลย  แต่สองคลาสนี้ดันมีฟังก์ชันย่อยบางอันเหมือนกัน? ใน PHP 5.4 ได้เพิ่มฟีเจอร์ Traits เข้ามาเพื่อให้เราสามารถใช้กรุ๊ปฟังก์ชันต่างๆ เหล่านี้เข้าด้วยกัน  แล้วไปใช้คีย์เวิร์ด use ในคลาสเพื่อดึงเอาฟังก์ชันพวกนี้มาใช้ได้เลย  เช่น

trait myAwesomeFunctions {
	function loaddata(){ ... }
	function processdata(){ ... }
	function render(){ ... }
}

class User {
	use myAwesomeFunctions;
}

class Post {
	use myAwesomeFunctions;
}

จากโค๊ดข้างต้น  ทำให้เราสามารถเรียกใช้ฟังก์ชันทั้งสามตัวใน Traits ได้ในทั้งสองคลาสครับ

ต่อด้วยของใหม่ใน PHP 5.5

เขียนบล็อกยาว  ชักหมดพลังครับ  เอาว่าลองไปอ่านดูในนี้แล้วกัน

Apache กับ MySQL นั้นเก่ามาก

ข้อนี้ผมเขียนไว้สั้นๆ เพราะคิดว่าคงเป็นส่วนน้อยมากๆ ที่จะ “มักง่าย” ขนาดเอา AppServ ไปรันเป็น Production นะครับ

คือว่าหลักการหนึ่งในเรื่องความปลอดภัยเนี่ย  คือการพยายามใช้ซอฟต์แวร์รุ่นเสถียรตัวล่าสุดเสมอๆ ครับ  แล้วคือ  พวกคุณดู AppServ ดิ่  มันตั้งแต่ปี 2009 อ่ะคุณ  มันมากับ Apache 2.2.8 แต่ว่าตอนนี้ Apache สาย 2.2.x มันไปยัน 2.2.29 แล้วนะครับ (ลองไปดู Changelog มันได้ที่นี่ครับ  มันมีย้อนไปถึง 2.2.21 แต่มันก็ยาวเป็นกิโลแล้วครับ)

ยังครับ  มันยังมีสาย 2.4.x อีกนี (เริ่มออกเมื่อปี 2012) ซึ่ง Changelog ก็เป็นกิโลเหมือนกันครับ  ไปดูที่นี่

นี่พูดเลยว่าขี้เกียจสาธยายของ MySQL 5.0 กับ phpMyAdmin 2.10 อีกเป็นกิโลครับ

แล้วอย่างนั้นใช้อะไรแทน AppServ ดี?

WAMP Stack ตัวหนึ่งที่นิยมมากๆ ในตอนนี้  คือ XAMPP ครับ (บน Windows ผมก็ใช้ตัวนี้นะ) ดังนั้นส่วนตัวผมก็แนะนำให้ใช้ตัวนี้แหละครับ

ทิ้งท้าย

เอาเป็นว่าคือใน PHP รุ่นใหม่ๆ นั้นมีฟีเจอร์เพิ่มเติมจาก PHP 5.2 (ที่เค้าเลิกใช้กันไปแล้ว) มาเยอะมากครับ  ช่วยให้การเขียนโค๊ดสะดวกขึ้นมากๆ  และมันยังมีฟีเจอร์ที่ถูกเอาออกด้วยเหมือนกัน (ทั้งเหตุผลเรื่องความปลอดภัย  หรือประสิทธิภาพ)

แม้ว่าตอนนี้เฟรมเวิร์คหรือ CMS บางตัวที่ยังรองรับ PHP 5.2 อยู่  แต่ตอนนี้หลายเจ้าก็เริ่มเลิกซัพพอร์ต PHP 5.2 ไปแล้วครับ (ซึ่งช่วยลดขนาดโค๊ด  และเพิ่มประสิทธิภาพให้กับเฟรมเวิร์คหรือ CMS นั้นๆ ได้ในระดับหนึ่งเลย) เราในฐานะคนเขียน PHP ก็ควรอัพเดทตัวเองให้ตามให้ทันครับ  จะได้ไม่เจอปัญหาจุกจิก  อย่างเช่นโหลดเฟรมเวิร์คตัวล่าสุดมาแต่ใช้ไม่ได้  หรือเขียนเว็บไปแล้วขึ้น Production กลับขึ้น Error ต่างๆ บานตะไท

ขอให้สนุกกับ PHP เวอร์ชันใหม่ครับ

ปล.เสียงจากอดีตผู้ใช้จริงครับ

Posted by Jirayu

WordPress Developer ที่พอมีประสบการณ์อยู่บ้าง วันไหนไม่ทำงานอยู่บ้านว่างๆ ก็นั่งเลี้ยงแมว

Comments