Archive for August, 2009

ทำให้ php ไม่แสดง error

โดยปกติแล้ว เวลาที่เราเขียนโปรแรกมโดยใช้ php เมื่อมันทำงานผิดพลาดมันจะแจ้งให้เราทราบว่ามี Error ตรงบรรทัดไหนอย่างไร ซึ่งมีประโยชน์มากเวลาเขียนโปรแกรม แต่ถ้าหากว่าข้อมูลของ Error ตัวนั้นไปแสดงที่หน้า website ที่เราเอาขึ้นไปใช้จริงๆ แล้วจะเกิดอะไรขึ้นหากว่า hacker ได้ข้อมูลพวกนี้ไป วันนี้เรามาทำการป้องกันไม่ให้ php แสดง Error ออกมาเวลาที่ทำงานผิดพลาดกันดีกว่า

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

แต่ถ่าหากว่า เวลาที่เราเอาขึ้นไปใช้จริงๆ บน website แล้วและเกิดว่ามี Error ขึ้นมาก็อาจจะทำให้ มีผู้ที่ไม่หวังดี หรือพวก hacker นั้นแหละ รู้ระบบการทำงานของโปรแกรมของเราได้ ดังนั้นวันนี้เราจะมาเรียนรู้วิธีการสังไม่ให้ php แสดง Error ออกมา

บาง คนอาจจะบอกว่า ผมเขียนโปรแกรมดีแล้วไม่มี Error เหรอกเพราะทดสอบมาทุกขั้นตอนแล้ว มันก็คงจะจริงครับว่าคุณเขียนมาดีแล้ว แต่ถ้าหากว่าวันหนึง Database ที่คุณใช้ เกิดหยุดทำงานขึ้นมา ไม่ว่าจะด้วยอะไรก็ตาม รับรองได้ว่าคำสั่ง php ที่คุณใช้ในการ connect database จะต้อง Error ออกมาอย่างแน่นอน

ในการสังให้ php ไม่แสดง Error เวลาที่โปรแกรมทำงานผิดพลาดสามารถทำได้ 2 วิธีคือ

1.ไม่ให้แสดง Error เฉพาะตรงคำสั่งที่ต้องการ โดยการใช้ @
2.ไม่ให้แสดง Error ทั้งหมดไม่ว่าจะด้วย กรณีใดๆทั้งสิ้น โดยการใช้ @ini_set(’display_errors’, ‘0′);

ไม่ให้แสดง Error เฉพาะตรงคำสั่งที่ต้องการ โดยการใช้ @

ในการสั่งให้ php ไม่ต้องแสดง Error ออกมาเวลาที่โปรแกรมทำงานผิดพลาดแบบเฉพาะจุด เราสามารถใส่ เครื่องหมาย @ ข้างหน้าคำสั่ง ที่เราต้องการได้ มาดูตัวอย่าง

error1.php

<?php
$filename = "test.txt";
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);

print $contents;
?>

จากตัวอย่างเป็นการอ่าน file test.txt ซึ่งหากว่าไม่พบ file นี้ก็จะแสดง error ออกมาแบบนี้

Warning: fopen(test.txt): failed to open stream: No such file or directory in D:exampleerror1.php on line 3

Warning: filesize(): Stat failed for test.txt (errno=2 - No such file or directory) in D:exampleerror1.php on line 4

Warning: fread(): supplied argument is not a valid stream resource in D:exampleerror1.php on line 4

Warning: fclose(): supplied argument is not a valid stream resource in D:exampleerror1.php on line 5

จาก Error ที่เราเห็นก็จะทราบได้ว่า มีความผิดพลาดเกิดขึ้นจากทั้งหมด 5 function คือ fopen,filesize,fread,fclose ที่นี้เราก็จะมาใส่ @ ไว้ที่หน้า function เหล่านี้ดูบ้าง

error2.php

<?php
$filename = "test.txt";
$handle = @fopen($filename, "r");
$contents = @fread($handle, @filesize($filename));
@fclose($handle);

print $contents;

?>

จากตัวอย่างเวลาที่เรา run โปรแกรม จะพบว่าไม่มี Error อะไร ขึ้นมาให้เราเห็นเลย

ไม่ให้แสดง Error ทั้งหมดไม่ว่าจะด้วย กรณีใดๆทั้งสิ้น โดยการใช้ @ini_set(’display_errors’, ‘0′);

ในแบบที่ 2 เป็นวิธีการที่จะกำหนดไม่ให้แสดง Error ของทั้งหน้าไม่ว่าจะเป็นที่คำสั่งไหนก็ตาม วิธีนี้สะดวกตรงที่เราไม่ต้องไป นั้งใส่ @ ในทุกๆ function ที่เราต้องการ เพราะว่าเราแค่นำคำสั่ง @ini_set(’display_errors’, ‘0′); ไปไว้ที่บรรทัดแรกสุดของหน้า ที่เราไม่ต้องการให้แสดง Error ก็สามารถที่จะใช้ได้แล้ว ไปดูตัวอย่างกัน

error3.php

<?php
@ini_set('display_errors', '0');
$filename = "test.txt";
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);

print $contents;

?>

จากตัวอย่างถ้าหากว่าเราเปลี่ยนจาก @ini_set(’display_errors’, ‘0′); ให้เป็น @ini_set(’display_errors’, ‘1′); ก็จะเป็นการสั่งให้ แสดง Error ออกมาตามปกติ

คำแนะนำ : ใน ขณะที่เรากำลังทำการเขียนโปรแกรมอยู่ ก็ควรที่จะกำหนดให้มีการแสดง Error ออกมาตามปกติ เพราะจะได้ทำการแก้ไขได้ง่าย แต่เมื่อไรก็ตามที่ได้นำโปรแกรม นั้นขึ้นไปบน website ที่ใช้งานจริงๆ ก็ควรที่จะกำหนด @ini_set(’display_errors’, ‘0′); ไว้ด้วยเนื่องจากอาจจะมีความผิดพลาดที่ เราเองไม่ทราบล่วงหน้าก็ได้ อย่างเช่นมีการรับค่าตัวแปรเข้ามาผิด หรือว่าตัว Database MySQL หยุดทำงานเป็นต้น

ที่มา : http://www.unzeen.com/

PHP Multithreading using cURL

พอดีมีเพื่อนมาถามเรื่อง Multithreading ใน PHP ทำให้รู้่ว่าจริงๆ แล้ว ใน PHP ไม่ีสามารถทำ Parallel programming ได้โดยตรง เพราะ PHP ไม่มีความยุ่งยากในการจัดการเกี่ยวกับเรื่องของ threading จึงทำให้ง่ายต่อการเขียน แต่สำหรับงานบางอย่าง การใช้การคำนวณแบบคู่ขนานก็มีความจำเป็น ไม่ว่าจะทำงานบนครื่องเดียวกัน หรือเครื่องอื่นก็ตาม ซึ่งเราจะพูดถึงการใช้ cURL เข้ามาช่วย

ขอยกตัวอย่างข้อมูลมาจาก http://wiki.memoball.info/

ข้อดีของการทำ parrallel programming

การเขียนโปรแกรมแบบ parrallel นั้นเหมาะสมกับการทำงานบางอย่าง ซึ่งในคอมพิวเตอร์ของเราในปัจจุบันก็ใช้การทำงานลักษณะดังกล่าวในโปรแกรม หลายๆ ชนิด เช่น โปรแกรมทางด้านกราฟิก วิธีการนี้จะช่วยลดเวลาในการทำงานของกระบวนการหลักไปได้เป็นอย่างมาก เช่น เราแบ่งส่วนต่างๆ ของหน้าเวปของเราเป็น widget หรือ module ย่อยๆ แล้วในเครื่องแต่ละเครื่องทำงานในการสร้างโมดูลของตัวเองโดยเฉพาะ ซึ่งจะดีแค่ไหนที่เราสามารถเรียกใช้งาน module ต่างๆ นั้นได้พร้อมๆ กัน โดยไม่ต้องรอโหลดเรียงกันทีละ module โดยการเขียนโปรแกรมอย่างนี้จะทำให้ช่วยประหยัดเวลาสร้างข้อมูลที่จะต้องส่ง ให้ client ได้มาก และยังสามารถใช้ทรัพยากรที่มีอยู่ได้อย่างมีประสิทธิภาพสูงสุดอีกด้วย

uCURL กับการทำ multithreading

uCURL นั้นโดยปกติแล้วไม่ถูกติดตั้งเข้ามาใน PHP มาก่อนแแต่จะมาเป็น extension เสริมสำหรับ PHP (โดยส่วนมากผู้ให้บริการ Host ทั่วไปจะทำการติดตั้งมาให้อยู่แล้ว) หนึ่งในความสามารถของ uCURL ที่น่าสนใจอย่างมากคือการทำ multi handle ซึ่งยอมให้สามารถทำ multiple cURL processing ในแบบ parallel ซึ่งฟังก์ชั่นสำคัญที่ต้องใข้ได้แก่

  • curl_multi_init – initialize a new cURL multi handle. It will return the cURL handle on success and FALSE on error.
  • curl_multi_add_handle — Add a cURL handle to a cURL multi handle.
  • curl_multi_exec — Runs all the curl handle in the cURL multi handle in parallel.
  • curl_multi_remove_handle — Removes a cURL handle from a cURL multi handle.
  • curl_multi_close — close the cURL multi handle.

ตัวอย่างการใช้ cURL

สร้างอเรย์สำหรับบ่งบอกว่า process ไหนจะทำที่ url ใด

  1. $process[1] = “http://www.example1.com”;
  2. $process[2] = “ftp://example3.com”;
  3. $process[3] = “http://www.example2.com”;

สร้าง cURL และทำการกำหนด handles

  1. $curlHandle = curl_multi_init();
  2. for ($i = 1;$i <= 3; $i++)
  3. $curl[$i] = addHandle($curlHandle,$process[$i]);

รัน process

  1. ExecHandle($curlHandle);

รับ content จาก handle ต่างๆ

  1. for ($i = 1;$i <= 3; $i++)
  2. {
  3. $content[$i] =  curl_multi_getcontent ($curl[$i]);
  4. echo $content[$i];
  5. }

ปิด handles และ url

  1. for ($i = 1;$i <= 3; $i++)//remove the sub - handles
  2. curl_multi_remove_handle($curlHandle,$curl[$i]);
  3. curl_multi_close($curlHandle);

ตัวอย่าง

  1. <?
  2. //add a url to the handler
  3. function addHandle(&$curlHandle,$url)
  4. {
  5. $cURL = curl_init();
  6. curl_setopt($cURL, CURLOPT_URL, $url);
  7. curl_setopt($cURL, CURLOPT_HEADER, 0);
  8. curl_setopt($cURL, CURLOPT_RETURNTRANSFER, 1);
  9. curl_multi_add_handle($curlHandle,$cURL);
  10. return $cURL;
  11. }
  12. //execute the handle until the flag passed
  13. // to function is greater then 0
  14. function ExecHandle(&$curlHandle)
  15. {
  16. $flag=null;
  17. do {
  18. //fetch pages in parallel
  19. curl_multi_exec($curlHandle,$flag);
  20. while ($flag > 0);
  21. }
  22. $list[1] = “http://www.example1.com”;
  23. $list[2] = “ftp://example.com”;
  24. $list[3] = “http://www.example2.com”;
  25. $curlHandle = curl_multi_init();
  26. for ($i = 1;$i <= 3; $i++)
  27. $curl[$i] = addHandle($curlHandle,$list[$i]);
  28. ExecHandle($curlHandle);
  29. for ($i = 1;$i <= 3; $i++)
  30. {
  31. $text[$i] =  curl_multi_getcontent ($curl[$i]);
  32. echo $text[$i];
  33. }
  34. for ($i = 1;$i <= 3; $i++)//remove the handles
  35. curl_multi_remove_handle($curlHandle,$curl[$i]);
  36. curl_multi_close($curlHandle);
  37. ?>

จาก http://codestips.com/php-multithreading-using-curl/

จาก Data Model สู่ระบบทั้งระบบ

แหม่ช่วงก่อนกินข้าวพักนึงเนี่ย เขียนสักหน่อย หุหุ (ชอบมาเขียนตอนก่อนกินข้าว ก็หิวดิ) content นี้เป็นเรื่อง “จาก model สู่ระบบทั้งระบบ” ซึ่งหลายๆ คนก็งงนะ ว่า model คืออะไร เป็นแบบนี้หรือเปล่า

555 ม่ายช่าย model แบบนี้นะครับ โอ้ยๆ ไม่ใมวดูแล้วหื่น เข้าเรื่องดีกว่า

Model ที่เรียกๆกันติดปากนี่ก็คือ Data Model ครับ

Data Model คือส่วนหนึ่งของการ Analyst จาก Requirement ครับ ในแง่การพัฒนาระบบแล้ว Data Model มีความสำคัญมากทีเดียว เพราะมันก็คือ รูปแบบในการจัดเก็บข้อมูลต่างๆ ของระบบนั้นๆเลย

ให้คิดว่า ถ้าคุณจัดเก็บข้อมูลผิดรูปแบบก็เท่ากับว่า คุณมั่วไปแล้ว ถ้าเขียน code มั่วอีก โอ้ว พระเจ้า ห่าอะไรของมันวะเนี่ย

ในการพัฒนา Data Model จะได้ออกมาช่วงหลังๆ ของการ Analyst เพราะกลั่นกรอง Requirement เสร็จแล้วถึงจะได้ แต่ละที่ ถ้า Requirement ต่างกัน Model ก็จะต่างกัน

Requirement เดียวกัน โครงสร้างของ Data Model อาจจะต่างกันก็ได้ไม่มีใครผิดขึ้นอยู่กับการ Analyst

อ่านเะพิ่มเติมเกี่ยวกับ Data Model ได้ที่นี่

เมื่อเราได้ Data Model แล้ว เราก็เอาไป Map ด้วย ORM เราก็เขียนระบบได้แล้วสบาย

สรุปๆ

  1. ได้ Requirement
  2. เอาไป Analysis
  3. ได้ Data Model และ Logic ต่าง
  4. เอา Data Model ไป ORM
  5. เอา ORM ไปเขียน Code ตาม Business Logic ที่คิดไว้

อันนี้สรุปๆนะไม่ได้ตรงเป๊ะๆ และระบบที่ใหญ่มากๆ ก็เกิดขั้นตอนที่มากกว่านี้ ถ้าเขียนอะไรเล่นเล็กๆ ก็สบาย คิดเองทำเอง แก้เอง ใช้เอง สู้ๆ

เรื่อยๆไป

ช่วงนี้ มีอะไรที่จะเขียนเยอะ แต่งานก็เยอะเช่นกัน ก็เลยเป็น blog นิ่ง lol

ตอนนี้ทำอะไรไม่กี่อย่าง เพราะอย่างหนึ่งเครียๆ งาน freelance ออกไปหลายงานแล้ว ก็รอเรียน ปีหน้าแล้วก็ต้องเก็บเงินก่อนก็เลยคิดจะทำระบบเล่นๆสักตัวอีกสัพักคงได้เห็นกัน

เขียนด้วย framework นะครับ

อีกอันที่ศึกษาๆ อยู่คือ mysql cluster อันนี้ต้องอ่านพอตัวอยู่ เพราะเรื่อง clustering นั้นนับว่ามีโปรๆ ในประเทศไทยไม่กี่คน แต่อย่างน้อยเราก็รู้จักคนนึงแหละเนอะ อิอิ

ok วันนี้คิดว่าเขียน diary เลยแล้วกัน แต่บ่ายๆ เบื่อๆ อาจจะมาเขียน เรื่อง symfony เพิ่มเข้าไปนะ

Doctrine

ไม่ต้องเกรินอะไรมากเพราะเขียนก่อนกินข้าว เขียนแบบ หิวนิดๆ อิอิ ขอยก about doctrine มาเลยแล้วกัน

Doctrine is a PHP ORM (object relational mapper) for PHP 5.2.3+ that sits on top of a powerful PHP DBAL (database abstraction layer). One of its key features is the ability to optionally write database queries in an OO (object oriented) SQL-dialect called DQL inspired by Hibernates HQL. This provides developers with a powerful alternative to SQL that maintains a maximum of flexibility without requiring needless code duplication.

จาก http://www.doctrine-project.org/about

พูดง่ายๆ นะมันก็คือ ORM ตัวหนึ่งนั้นเอง ซึ่งอยู่ในรูปแบบของภาษา PHP ครับ ใครไม่รู้ว่า ORM คืออะไร กลับไปอ่าน OR Mapping เบื้องต้น ได้ เพราะถ้ายังงง ก็จะ งงต่อ 55

ซึ่งตอนที่ผมเขียนนี้ Doctrine นั้นมีถึง Version 1.2 แล้วถูกนำไปใช้งานได้กับหลาย framework เลยทีเดียว ที่เห็นดังก็ Zend, Symfony อื่นไม่ค่อยได้เข้าไปดูน่ะ ว่าแล้วก็เข้าไป download doctrine กันได้เลยครับ open source เปิดกว้างท่านอยู่แล้ว