ปรับแต่งโค้ด PHP

สำหรับสาวก PHP จำเป็นต้องรู้ พื้นฐานขั้นสูง ของ PHP ควรจะศึกษา และ ปรับปรุง โค้ตของคุณ ว่า ดีพอไหม เราเพิ่มความใส่ใจ กับเรื่องเล็กๆน้อย นั้นหมาย ผลงานที่มีคุณภาพของคุณ

echo กับ print อะไรเร็วกว่ากัน

echo เร็วกว่า print ก็แน่นอนครับ เพราะว่า echo เป็น function ที่เรียบง่ายมากกว่า แต่ว่ากลับกัน print มันทำอะไรได้มากกว่า ก็เลยช้ากว่านั่นเอง
echo ‘aaaa’;

‘ ‘ กับ ” ” อะไรเร็วกว่ากัน

เวลาใส่ตัวหนังสือ หรือข้อความให้ใส่ใน ‘ ‘ จะเร็วกว่า ใส่ใน ” ” เพราะว่าเครื่องหมาย “…” มันจะทำการค้นหาตัวแปรที่อยู่ภายในก่อน

ประกาศตัวแปรก่อน หรือใช้ sprintf ตัวแปรไปเลย ดีกว่า

ใช้คำสั่ง sprintf แทนที่จะยัดตัวแปรลงไปตรงๆ จะทำให้เร็วขึ้น 10เท่า!! ลองดูวิธีใช้ htttp://th.php.net/sprintf ไม่ยากครับ

เรียกใช้ echo หลายครั้ง หรือ เชื่อมตัวแปร แล้ว echo ทีเดียว ดีกว่า

เรียกใช้ echo หลายครั้ง จะเร็วกว่าการเสียเวลาเพื่อเชื่อมตัวหนังสือก่อนเรียก echo ครั้งเดียว เช่นเชื่อมด้วย
$tmp .= ‘xxx’;
// เป็นต้นครับช้า อย่าทำ

count($array) ใน Loop กับ $max = count($array); ก่อน อันไหนดีกว่ากัน

ในกระบวนการ loop ควรคำนวนค่าต่างๆเอาไว้ก่อนเท่าที่ทำได้ เช่น
for($x=0;$x < count($array);$x)
#เราควรเปลี่ยนมาใช้
$max = count($array);
#ก่อน ค่อยเอาค่า$max ไปใช้ เพราะว่ามันจะเสียเวลาคำนวนรอบเดียวเท่านั้น

ตัวแปรเกลื่อนระบบ ควรทำอย่างไร

พยายามตรวจสอบตัวแปร array ถ้ามีค่าไหนไม่ได้ใช้ก็ unset ทิ้งไปบ้าง อันนี้หลายคน ตัวแปรเกลื่อนระบบ เปลืองแรมครับ ตรวจสอบได้จาก
print_r($array);

function พิเศษ ควรใช้หรือ ไม่

พยายามอย่าเรียกใช้ function พิเศษ เช่น __get, __set, __autoload จะดีกว่า

เรียกใช้ require() หรือใช้ require_once() ดีกว่า

เรียกใช้ require() แทนที่จะใช้ require_once() เท่าที่จะเป็นไปได้ ก็เพราะว่า require_once มันจะเสียเวลาตรวจสอบก่อน ว่าไฟล์นี้เคยโหลดเข้ามาหรือยัง ถ้าโหลดแล้วจะไม่โหลดซ้ำ

#ใช้ Full path ในการ include หรือ require เพื่อลดเวลาการค้นหา path ของ OS ที่รัน full path ของไฟล์ที่กำลังทำงานเรียกได้จาก
dirname(__FILE__);

#require() และ include() มันทำงานได้เหมือนกันเลือกใช้ให้ตรงตามความต้องการ มันต่างตรงที่ว่า require() ถ้าไม่พบไฟล์ มันก็หยุดทำงานเลย ความเร็วที่ได้แทบไม่ต่าง

time() กับ $_SERVER[’REQUEST_TIME’] อันไหนดี

ตั้งแต่ PHP5 เวลาจุดเริ่มต้นของการ ประมวลผล จะเรียกได้จาก
$_SERVER[’REQUEST_TIME’]
// ไม่ต้องเรียกใช้
time()
//หรือ
microtime()
//ตอนนี้ น่าจะ php5 กันแทบทุกที่แล้วมั้งครับ ไม่มั่นใจลองใช้ phpinfo();

PCRE regex หรือ EREG ดี

PCRE regex ทำงานได้เร็วกว่า EREG แต่จะเห็นผลเมื่อใช้ในแบบ native function

ใช้ XML ใน php หรือ DOM XML ดี

เมื่อจะประมวลผล XML ใน php ใช้ xml2array จะเป็นการเรียกใช้ PHP XML function ซึ่งจะให้การทำงานได้ดีกว่า และ สำหรับ HTML สามารถเรียกใช้ PHP’s DOM document หรือ DOM XML ใน PHP4

str_replace เร็วกว่า preg_replace จริงหรือ

ตอบ จริง เพราะ str_replace ทำงานได้เร็วกว่า preg_replace แต่บางครั้ง strtr ก็ทำงานได้เร็วกว่าถ้าต้องใช้กันตัวหนังสือเยอะๆ และเราจะใช้ array() ในการทำงานของ str_replace จะทำให้ทำงานได้เร็วกว่าการเรียก str_replace หลายรอบ

else if กับ case/switch อันไหนเร็วกว่า

statement else if ทำงานได้เร็วกว่า select statement หรือว่า case/switch เพราะว่า else if เป็นคำสั่งเงื่อนไขที่ simple ที่สุดแล้วครับ

ปิด error ด้วย @ จะดีไหม

การปิด error ด้วย @ ทำให้ทำงานได้ช้ามาก เจอบ่อยมาก @mysql_connect แต่ว่า บางครั้ง ก็ปิดเพื่อความปลอดภัยครับ

ลด bandwidth ด้วย apache ได้หรือไม่

ได้ การจะลด bandwidth ให้เรียกใช้ mod_deflate ใน apache 2 และ mod_gzip ใน apache1 อันนี้ก็ต้องดูว่า server ที่ใช้งานรองรับหรือไม่

ไม่ปิดการเชื่อมต่อกับ database มีผลเสียอย่างไร

ปิดการเชื่อมต่อกับ database เมื่อทำงานเสร็จทุกอย่าง เพื่อให้เหลือ connection ว่างสำหรับรองรับการทำงานต่อไป และเป็นการคืน ทรัพยากรกลับเข้ามาด้วย

#$row[‘id’] กับ $row[id] จะใช้อันไหนดี

$row[‘id’] เร็วกว่า $row[id] 7เท่า เพราะว่าถ้าเราไม่ใส่เครื่องหมาย มันจะเสียเวลาทำความเข้าใจ index ว่าหมายความว่าอะไร ใน php5 มันจะ error แบบเห็นชัดเลย ถึงแม้ว่าเป็นตัวเลขก็ใส่ไว้ครับ เพื่อความเคยชิน

การใช้ short tag ของ PHP ควรใช้แบบไหน

ใช้ < ?php echo ‘aaaa’; ?> tag เมื่อเราจะใช้ PHP แทนการเรียกใช้แบบอื่นๆ รวมทั้งการใช้ short tag ด้วย < ?= ‘aaaa’; ?> อย่างนี้พยายามเลี่ยงครับ

ควร เขียนโค้ดให้ถูกต้องตามไวยากรณ์ หรือไม่

เขียนโค้ดให้ถูกต้องตามไวยากรณ์ เพื่อลด error ที่จะเกิดขึ้น ซึ่งหลายครั้งมันเป็นเพียง notice หรือ warning เท่านั้น จะทำให้ลด over head ไปได้ หรือว่าลองเปิด
error_reporting(E_ALL)
//เพื่อให้เห็น error แบบเต็มๆ เปิดไว้เถอะครับ เขียนให้ถูกต้องเสมอ อย่าซ่อนขยะใต้พรม

การแสดงผลแบบ PHP กับ HTML ต่างกันมากไหม

การแสดงผลแบบ PHP ทำให้หน้าเว็บช้ากว่า static page 2-10 เท่า (ใน apache httpd) ดังนั้น ใช้ php เท่าที่จำเป็น ถ้าหน้าไหนเป็น static ก็ใช้ .html ไปเลย

การประมวลผลทุกๆครั้งของ PHP มีวิธีช่วยลด ภาระตรงนี้หรือไม่

PHP script จะต้องถูกประมวลผลทุกๆครั้งที่มีการเรียกใช้หน้าเว็บ ถ้าไม่มี cache ดังนั้นควรหาระบบ cache มาใช้(เช่น memcached, eAccelerator , Turck MMCache) เพื่อเพิ่มประสิทธิภาพการทำงานได้ 25-100% เพราะว่าจะลดเวลาการประมวลผลลงได้ นอกจากนี้ยังมีพวกที่ทำ file cache ด้วยนะครับ คือประมวลผลเสร็จ เก็บผลที่ได้เป็นไฟล์เลย

ใช้เทคนิคการทำ cache แบบอื่นๆสำหรับหน้าเว็บที่ไม่ได้มีการเปลี่ยนแปลงมากนัก การทำ cache มันจะเหมือนการแสดงผล HTML ออกหน้าเว็บธรรมดา ลองใช้พวก Smarty หรือ Cache Lite ดู การทำ cache จะได้ผลดีสำหรับเว็บที่มี traffic มาก เปิดเว็บเยอะ หรือการเปิดแต่ละครั้งต้องใช้การประมวลผลอย่างหนัก

มีวิธีที่ดีกว่า strlen($foo) หรือ ไม่

พยายามใช้ isset แทนการใช้ strlen เช่น
if (strlen($foo) < 5) { echo “Foo is too short”;}
#ก็ควรเปลี่ยนมาเป็น
if (!isset($foo{5})) { echo “Foo is too short”; }
#อย่างน้อยก็ลดการใช้ strlen ได้เลยล่ะ

++$i หรือ $i++ เร็วกว่ากัน

++$i เร็วกว่า $i++ หรือว่า การเพิ่มค่าก่อนนำไปใช้นั่นเอง

ใช้ function เขียนขึ้นมาเอง หรือ ใช้ function ต่างๆที่ php มีอันไหน ดีกว่า

พยายามใช้ function ต่างๆที่ php มีให้เรา อย่าเขียน function มาใช้งานเอง แต่ถ้าว่างมาก ก็ไปเขียน C extension หรือ module ให้รู้แล้วรู้รอดไปเลย อันนี้ออกแนวเหน็บๆ แต่ก็จริง เพราะว่าถ้าเป็น C extension หรือ php module มันก็ทำงานได้เร็วกว่า php function ที่เราเขียนมาแน่นอน

ควรตรวจสอบการทำงานของโค้ด หรือไม่

พยายามตรวจสอบการทำงานของโค้ดของคุณ เพื่อจะได้รู้ว่า ทำงานหนักมากน้อยขนาดไหน หรือ ใช้พวก Xdebug debugger ช่วยตรวจสอบภาพรวมก็ได้ ถ้าเจอตัวแปรเหลือๆก็ unset ทิ้งตามระเบียบ

ทำยังไงจะจำ โค๊ต ที่ทำไว้ ได้ทั้งหมด

เขียน document ให้โค้ดที่ตัวเองเขียนด้วย หลายครั้งกลับมาดูของตัวเอง แล้วมึนก็บ่อยไป โดยเฉพาะคนที่ไม่ได้ใช้ frame work ซึ่งมีอิสระในการเขียนโค้ด มักจะเจอประจำ

ควรศึกษา การเขียนโค๊ต แบบที่ผิด วิธีหรือไม่

หมั่นศึกษาการเขียนโค้ดในแบบที่ดี และแบบที่ผิดๆเอาไว้ ที่ต้องศึกษาแบบที่ผิด เราจะได้รู้ว่าแบบนี้ผิด และไม่ควรทำนั่นเอง

ควรเขียนโค้ดให้ตรงตามมาตรฐาน หรือไม่

พยายามเขียนโค้ดให้ตรงตามมาตรฐานให้มากที่สุด มันจะช่วยให้คนอื่นอ่านแล้วเข้าใจ รวมทั้งตัวเองด้วย เคยเจอเขียนแบบสับขาหลอกตัวเองมาแล้ว

PHP ปนกันกับ HTML มีข้อเสียอย่างไร

พยายามแยกส่วนโค้ดออกมา ให้ php แยกจาก HTML มากเท่าที่จะเป็นไปได้ เพราะว่าการเอาไปปนกันหมดนั้นมันจะทำให้งงมาก

ควรใช้ระบบ template smarty หรือไม่

อย่าใช้ระบบ template ที่ซ้ำซ้อนเช่นพวก smarty โดยไม่จำเป็น php เองก็มี function ที่ทำงานคล้ายกัน ลองดู ob_get_content และ exact

มีการใช้ Javascript ในการตรวจการป้อนข้อมูลจากฟอร์มแล้ว เพียงพอไหม

ไม่เพียงพอ อย่าวางใจ ข้อมูลที่ได้มาจากการป้อนของ user เช่น form $_POST ให้ใช้ mysql_real_escape_string เมื่อใช้ mysql และ htmlspecialchars เมื่อแสดงผล HTML

ควรแสดง phpinfo() แสดงโชว์ในหน้าเว็บ

ด้วยเหตุผลด้านความปลอดภัย ไม่ควรแสดง path , extension และ configuration สู่สาธารณะ เช่นการ แสดง error หรือ phpinfo() ใน webroot

เปิดการทำงานของ register_globals ควรหรือไม่

ควรปิดการทำงานของ register_globals ไม่มีสคริปไหนในงานจริงที่เปิดใช้กันหรอก มีแต่สคริปแย่ๆและเก่าๆเท่านั้น อีกทั้ง register_globals ก็จะไม่มีอีกแล้วให้ php6 แต่ก็แปลก หนังสือสอน php ภาษาไทยส่วนใหญ่ชอบสอนให้ใช้ เซ็งจริงๆ

ควรเก็บรหัสผ่าน แบบ ดิบๆ จะดีไหม

ควรเก็บรหัสผ่าน มากกว่าเป็นตัวหนังสือดิบๆ อย่างน้อยควรเอารหัสผ่านไปเข้ารหัสเช่น MD5 หรือ sha1 ก็ได้นะ

เก็บ IP Address แบบไหนดี

ใช้ ip2long() และ long2ip() เพื่อแปลงค่า ip v4 ให้เป็นเลขชนิด long แทนที่จะเก็บเป็น text ใน database ขนาด database ต่างกันชัดเจน

PEAR น่าใช้ หรือ ไม่

ควรศึกษารายละเอียดที่เกี่ยวกับ PEAR ให้ดี เพราะว่าจะทำให้โค้ดมีมาตรฐานที่ดีมากขึ้น

เพียงพอ ไหม กับ header(‘Location:’.$url); เพื่อ Redirect

เมื่อใช้ header(‘Location:’.$url); จำไว้เสมอว่าต้องตามด้วยคำสั่ง die(); เพื่อป้องกันการหลุดของคำสั่ง เพราะหลายกรณีโดน hack แล้วก็โดนควบคุมให้ทำงานในแบบที่คิดไม่ถึงเลย (ถ้าไม่ die(); php จะทำงานเลยไปด้วยนะครับ)

static method ใน OOP ควรใช้ไหม

ใน OOP ถ้า method ใดเป็นชนิด static method ก็ให้ประกาศเป็นชนิด static ไปเลย จะทำให้เร็วขึ้นอีก 4 เท่า

การเรียก ใช้ตัวแปล แบบไหนเร็วสุด

การเพิ่มค่าตัวแปรใน local OOP method นั้นเร็วที่สุด ใกล้เคียงกับการเรียก ตัวแปร local ของ function และการเพิ่มค่าตัวแปรแบบ globla ช้าเป็นเท่าตัวเมื่อเทียบกับ local

การเพิ่ม $this->prop++ ของ object property ต่างกับ $i++ ไหม

การเพิ่มค่าของ object property เช่น
$this->prop++
//ช้าเป็น 3 เท่าเมื่อเทียบกับ local variable

การประกาศตัวแปร ควรประกาศ ตอนไหนดี

การเพิ่มค่าให้กับตัวแปร local ที่ไม่ได้ประกาศไว้ก่อน ทำให้ช้ากว่าปกติ 9-10 เท่าเมื่อเทียบกับการประกาศไว้ก่อน

มีผลเสียอย่างไร กับการสร้างตัวแปร global

การสร้างตัวแปร global แม้ว่าจะไม่ได้เอาไปใช้ใน function ก็ทำให้ช้าลง เพราะว่า php จะออกไปเช็คตัวแปร global ที่มีอยู่เสมอ

จำนวน method มากๆ ทำให้เครื่อง ช้าไหม

จำนวน method ที่เพิ่มขึ้น ไม่ส่งผลต่อ performance (ถ้าใช้งานเท่าเดิม)

derived classes กับ base class อันไหนทำงานได้เร็วกว่า

method ใน derived classes ทำงานได้เร็วกว่า base class

Heading

function ที่รับ 1 parameter แต่ใน function ว่างเปล่ามีลักษณะเหมือน การทำงาน $localvar++ 7-8 ครั้ง และถ้าเป็น method ลักษณะนี้ ก็เปรียบกับ $localvar++ 15 ครั้ง

จำเป็นต้องทำ OOP ทั้งหมด ไหม

ไม่จำเป็นต้องทำทุกอย่างเป็น OOP มันจะทำให้เกิด overhead และ method, object จะทำให้เปลือง memory

$_POST ปลอดภัย หรือยัง

อย่าวางใจ ข้อมูลที่ได้มาจากการป้อนของ user เช่น form $_POST ให้ใช้ mysql_real_escape_string แทนการใช้ mysql_escape_string หรือ addslashs แต่ถ้า เปิด magic_quotes_gpc ไว้ ก็ให้ใช้ stripslashes ไว้ก่อน

function mail() ปลอดภัยหรือไม่

ระวังโดน header injection กับ function mail() form mail ที่หลายคน copy ตามเว็บมาใช้ มักจะโดนเอาไว้ใช้เป็นช่องทางส่ง email spam โดยที่เจ้าของเว็บไม่รู้ตัวเสมอๆ

ตัวแปรสำหรับ password ในคอนฟิกไฟล์ ปลอดภัยหรือไม่

unset ตัวแปรของ database (อย่างน้อยที่สุดก็ password) ไม่จำเป็นตั้งใช้ หลังจากการเชื่อมต่อ เรียบร้อยแล้ว

จะหาข้อมูลศึกษาเพิ่มเติมจากที่ไหน

RTFM! ซะ แปลว่า Read The *-* ing Manual หรือ อ่านไอ้คู่มือหน่อยเถอะ อ่านได้ที่ http://th.php.net มีคำบรรยาย พร้อมตัวอย่างมากมาย ภาษาก็ไม่ยากเกินไปหรอกนะ

Leave a Reply

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น