Archive for the ‘php’ Category
ทำให้ php ไม่แสดง error
August 31st, 2009 Posted 4:04 pm
โดยปกติแล้ว เวลาที่เราเขียนโปรแรกมโดยใช้ 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
August 29th, 2009 Posted 1:47 pm
พอดีมีเพื่อนมาถามเรื่อง 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 ใด
- $process[1] = “http://www.example1.com”;
- $process[2] = “ftp://example3.com”;
- $process[3] = “http://www.example2.com”;
สร้าง cURL และทำการกำหนด handles
- $curlHandle = curl_multi_init();
- for ($i = 1;$i <= 3; $i++)
- $curl[$i] = addHandle($curlHandle,$process[$i]);
รัน process
- ExecHandle($curlHandle);
รับ content จาก handle ต่างๆ
- for ($i = 1;$i <= 3; $i++)
- {
- $content[$i] = curl_multi_getcontent ($curl[$i]);
- echo $content[$i];
- }
ปิด handles และ url
- for ($i = 1;$i <= 3; $i++)//remove the sub - handles
- curl_multi_remove_handle($curlHandle,$curl[$i]);
- curl_multi_close($curlHandle);
ตัวอย่าง
- <?
- //add a url to the handler
- function addHandle(&$curlHandle,$url)
- {
- $cURL = curl_init();
- curl_setopt($cURL, CURLOPT_URL, $url);
- curl_setopt($cURL, CURLOPT_HEADER, 0);
- curl_setopt($cURL, CURLOPT_RETURNTRANSFER, 1);
- curl_multi_add_handle($curlHandle,$cURL);
- return $cURL;
- }
- //execute the handle until the flag passed
- // to function is greater then 0
- function ExecHandle(&$curlHandle)
- {
- $flag=null;
- do {
- //fetch pages in parallel
- curl_multi_exec($curlHandle,$flag);
- } while ($flag > 0);
- }
- $list[1] = “http://www.example1.com”;
- $list[2] = “ftp://example.com”;
- $list[3] = “http://www.example2.com”;
- $curlHandle = curl_multi_init();
- for ($i = 1;$i <= 3; $i++)
- $curl[$i] = addHandle($curlHandle,$list[$i]);
- ExecHandle($curlHandle);
- for ($i = 1;$i <= 3; $i++)
- {
- $text[$i] = curl_multi_getcontent ($curl[$i]);
- echo $text[$i];
- }
- for ($i = 1;$i <= 3; $i++)//remove the handles
- curl_multi_remove_handle($curlHandle,$curl[$i]);
- curl_multi_close($curlHandle);
- ?>
จาก http://codestips.com/php-multithreading-using-curl/
Tags: cURL, multithreading, parallel, parallel programming, threading
Posted in php
แก้ symfony หา driver mysql PDO ไม่เจอ
August 4th, 2009 Posted 4:37 pm
ความจริงแล้วปัญหานี้ถ้าจะพูดไปอย่าไปคิดบ่น symfony เด็ดขาด เราเองก็เคยบ่นไปแล้ว อิอิ สาเหตุเป็นมาจาก ไม่ได้เปิด extension php ไว้ แค่นั้นเอง
…
;extension=php_oci8.dll
;extension=php_openssl.dll
extension=php_pdo.dll
;extension=php_pdo_firebird.dll
;extension=php_pdo_mssql.dll
extension=php_pdo_mysql.dll
;extension=php_pdo_oci.dll
;extension=php_pdo_oci8.dll
;extension=php_pdo_odbc.dll
;extension=php_pdo_pgsql.dll
…
ตรงเขียวๆ น่ะ อยู่ใน php.ini ไปเปิดแล้ว symfony propel:insert-sql ดูดิ อิอิ
Tags: php mysql pdo, php pdo, symfony
Posted in php, symfony
install symfony with archive
July 28th, 2009 Posted 10:15 am
บทความนี้ของบอกก่อนเลยว่าเซง เซงกับ Browser น่ะครับ ขอบ่นต้นบทความหน่อย เผื่ออารมณ์จะดีขึ้น เขียนไปจะเสร็จแล้วใส่รูปสุดท้ายมัน clash เวงกำ เขียนมาทั้งหน้า หายหมด อะไรเนี่ย ป๊ะเจ้า เข้า content ดีกว่า อารมณ์ดีขึ้นแล้ว
การติดตั้งด้วย archive หรือพูดง่ายๆว่า เราเอา package มาติดตั้งแบบ manual ลงไปเองนั่นเอง มันดีสำหรับหลายๆ อย่าง แล้วก็ไม่ยากเกินไปอะไรมาก
ขั้นแรกเราก็ต้องไป load package ของ symfony ก่อน คือที่
เมื่อโหลดมาแล้ว เราจะได้ package นั้นเอามาแตกออก เหมือนดังรูป(ข้อความอาจจะรวบๆ ไปหน่อย เพราะเขียนมารอบนึงแล้ว browser มันเจ๊งไป)

symfony-package
เมื่อเราได้แตกออกแล้ว จะได้ folder มาดังภาพ ดราก็ต้องเอาไปติดตั้ง การติดตั้งก็คือเราเอา package ของ symfony ตัวนี้ไปไว้ที่ใหนสักแห่งบนเครื่องเราเนี่ยแหละ แล้วเราจะมา set ให้มันใช้งานได้
ที่ ที่ดีและง่ายเราจะเอาไปวางไว้ที่ c: แล้วกัน ง่ายๆ จำง่าย ถ้าใครจะวางไว้ที่อื่นก็ไม่ได้ว่าอะไร set เหมือนๆกันแหละ
เราก็จะเอามาวางไว้ดังรูป

symfony-in-drive-c
ในที่นี้ขออนุญาติเปลี่ยนเป็น folder ชื่อ symfony เฉยๆ ด้วยมันจะได้เรียกง่ายๆ จากนั้นเราก็ทำให้มันเรียกคำสั่ง symfony ได้ ด้วยการ set ให้มันทำงาน command ได้
การ set ก็คือการไป set environment ของ OS นั่นเอง อย่าง OS Window ก็เข้า properties ของ my computer หรือ Linux ก็ให้ใช้ command EXPORT ไป
ในตัวอย่างที่จะทำเป็นของ Window นะ น้องเพนกวิ้นไม่ต้องน้อยใจ
ทีนี้ set ไปที่ใหน ก็ง่ายๆ คือ
[symfony library path]\data\bin
ยกตัวอย่างที่เใส่ใน drive c คือ
C:\symfony\data\bin
แล้วลองเข้า command mode พิมพ์ symfony จึกลงไปใช้งานดู ถ้าเป็น command not found ก็คงต้อง กลับไปอ่านใหม่ แล้วลองตรวจสอบอีกที

symfony-run
แต่ถ้าได้เป็นแบบนี้ ก็แสดงว่ารัน command ได้ เยี่ยมไปเลยละ ยินดีด้วยยย
ปล.
เวลารันมันไปรันใน bin นั่นแหละ
เวลาเรียกใน window จะไปรัน symfony.bat ใน linux จะไปเรียก symfony เฉยๆ
symfony.bat ก็จะไปเรียก symfony อีกทีแหละ
ใน linux ไป chmod ให้ symfony execute ได้ด้วยนะ
install symfony with PEAR package
July 28th, 2009 Posted 9:57 am
เอ่บทความนี้ไม่รู้ว่า เคยเขียนไปหรือยัง เลยจัดขึ้นมาใหม่ เพราะเขียนเป็นบทใหญ่
เข้าเรื่องๆ การ install symfony ด้วย PEAR package นั้นง่ายมากเข้า command line แล้วพิมพ์ 2 บรรทัดจบคือ
pear channel-discover pear.symfony-project.com
pear install symfony/symfony-1.2.8
OK เลยนะ
ข้อแม้คือ pear ต้องติดตั้งไว้แล้ว และทำงานได้ ซึ่งถ้าใครใช้ appserve แล้วยังไม่เคยติดตั้ง pear ไว้ รัน pear ไม่ได้ให้อ่าน Setup PEAR after install apperve นะ จะได้ทำงานได้ ส่วนถ้าเป็น linux ติดตั้ง php ไว้น่าจะทำงานได้เลย ถ้าไม่ได้ติดตั้งไว้ก็ลงเองแล้วกัน 55
