Posts Tagged ‘php’

ทำให้ 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/

setup pear after install apperve

หลังจากที่เราลง apperve ไปแล้ว ซึ่งเป็น package ที่นักพฒนาเว็บรู้จักกันดี เพราะมี apache + php + mysql + phpMyAdmin สำเร็จรูปออกมาอย่างดี กด install แล้วใช้งานได้เลย

เมื่อต้องการใช้งาน pear ก็ง่ายแสนง่าย เพราะมี script สำหรับ setup pear อยู่แล้ว โดยให้เข้าไปที่

C:\AppServ\php5

จากนั้นก็ รัน go-pear เลย มันก็หา path อะไรให้เองหมดอ่ะนะ ถ้าลงไปแบบ default ก็กด Enter ไปจากนั้นเราก็จะได้ใช้ pear

ลองทดสอบดูง่ายๆ ก็ เข้า command แล้วรัน pear ขึ้นมาดูว่ามันหาคำสั่งนี้เจอหรือเปล่าแค่นั้น

เข้าใจ sphinx full text search engine

จากที่เคยเกริ่นเรื่องเกี่ยวกับ sphinx full text search ไปแล้วทีนึง คราวนี้เรามาดูวิธีและหลักการทำงานของ full text search กัน

full text search engine นั้นจะทำงานในลักษณะของการทำ data ที่มาจากที่เรา config ไว้ มาทำเป็น index เฉพาะแบบของ fulltext search นั้นๆ ซึ่งแต่ละตัวก็จะไม่เหมือนกัน บางที่อาจจะไม่ได้ใช้แนวคิดนี้ แต่เห็นหลายๆ ที่จะเป็นแบบนี้ เพื่อให้สามารถ ค้นหาข้อมูลในรูปแบบของตัวเองได้

sphinx ก็เช่นเดียวกัน เราจะต้อง config ว่าให้ seletct ส่วนใด มาทำเป็น เนื้อความสำหรับ search ได้บ้าง หลังจากนั้นเราก็ตั้งใช้คำสั่งสร้าง index ขึ้นมา sphinx ก็จะสร้าง index ของตนเองขึ้นมา ให้สามารถทำการ search ได้ง่ายตามรูปแบบที่ตั่งไว้

การใช้งาน search นั่นเวลาจะใช้งานจึงต้องเขียนออกมาเป็นอีกส่วน ในส่วนใหญ่แล้วโปรแกรมพวกนี้ก็จะเปิด port อีก port ไว้เลยเป็นของตนเองอย่าง sphinx เองก็เปิด port ไว้เหมือนกัน ซึ่งตอนที่รัน เราก็สามารถ config ลงไปได้ด้วยว่าอยากจะเปิด port อะไีร เวลาสร้าง connection ก็ต่อมาที่ port นั้นๆที่ตั้งไว้

Sphinx เองเปิด port 3312 เป็น default ดูได้จาก sphinx.conf

# IP address to bind on
# optional, default is 0.0.0.0 (ie. listen on all interfaces)
#
# address                = 127.0.0.1
# address                = 192.168.0.1

# searchd TCP port number
# mandatory, default is 3312
port                = 3312

full text search engine ส่วนใหญ่จะมี library สำหรับติดต่อกับตัวเองพร้อมทั้ง reference มาให้อยู่แล้วเพื่อความสะดวกในการใช้งาน sphix ก็มีเช่นกัน คือ folder api ที่มาพร้อมๆ กับตัวที่ download มาติดตั้งแหละ มีทั้ง ภาษา PHP, ptyhon, ruby และ java เลยทีเดียว

รวมทั้งยังมี reference การใช้งานอีกด้วยที่ http://www.sphinxsearch.com/docs/current.html#api-reference

จากการที่เราทำ index ครั้งนึงเราก็จะ search ได้เพียงสิ่งที่เรานั่นสร้าง index ไป ดังนั้นเราก็ต้องทำ index เรื่อยๆ เช่นการทำ cronjob ของ indexer เป็นต้น

แต่การทำ cron ก็จะได้ ข้อมูลในการ search ไม่เป็นปัจจุบันเสมอ แต่จะ search ไปตามช่วงเวลาแทน  sphinx เองก็มี mode ในการทำทั้ง merge index หรือการสร้าง index เสมอทุกๆ การใช้งาน ก็เอาไว้ต่อกันทีหลังแล้วกันนะ

sphinx full text search engine

วันนี้ทำงานสบายๆ ก็เลยมาเขียนซะหน่อย ห่างหายไปจาก blog นานๆ แล้ว ที่จะพูดถึงวันนี้ก็คือ fulltext search

ช่างเป็นอะไรที่ กิน performance เครื่องสุดๆ ลองคิดถึง algorithm ง่ายของ LIKE ใน SQL นะ

1 record ก็จะมีั text เช่น ‘some text’
แล้วเราก็หาคำว่า ‘me’ ใน text นี้ มันก็ต้องหา so, om, me แล้วก็เจอ ลองคิดดูว่ามันจะหาไปกี่ที
แน่นอนว่า วิธีนี้มันโง่และทึ่มมาก เพราะทำงานธรรมดาสุดๆ คือ เทียบกันไปเรื่อยๆ การทำงานจึงเป็น loop ไป เรื่อยๆ แต่ปัจจุบันนั้นก็มีคนศึกษาเรื่องนี้และได้คิด algorithm ออกมาเพื่อที่จะจัดการกับ full text search อีกมาก บาง algorithm ก็ได้รับความนิยม จนไปสู่การนำมาใช้งานจริง
.
sphinx ก็เป็นอีก 1 ตัวที่ได้รับความนิยมอยู่ในขณะนี้ เพราะด้วย performance และการใช้งานนั้นง่าย รวมทั้งยังเป็น Open Source อีกด้วย ทำให้เปิดโลกกว้างการการเพิ่มเติมและการนำไปใช้ด้วย

sphinx search นั้นมี feature หลักคือ

  • high indexing speed (upto 10 MB/sec on modern CPUs)
  • high search speed (avg query is under 0.1 sec on 2-4 GB text collections)
  • high scalability (upto 100 GB of text, upto 100 M documents on a single CPU)
  • supports distributed searching (since v.0.9.6)
  • supports MySQL natively (MyISAM and InnoDB tables are both supported)
  • supports phrase searching
  • supports phrase proximity ranking, providing good relevance
  • supports English and Russian stemming
  • supports any number of document fields (weights can be changed on the fly)
  • supports document groups
  • supports stopwords
  • supports different search modes (“match all”, “match phrase” and “match any” as of v.0.9.5)
  • generic XML interface which greatly simplifies custom integration
  • pure-PHP (ie. NO module compiling etc) search client API

ซึ่งถ้าอ่านดีๆ แล้วก็จะเห็น performance นั้นสูงทีเดียวและสามารถใช้งานได้ง่ายด้วย API และยัง support กับ Mysql และ postgresql ซึ่งเป็นฐานข้อมูล แบบ open source ที่ได้รับความนิยมทั่วโลก

จากที่ได้ลองติดตั้งดู ไม่มีอะไรยากเกินไปกว่า แตก tarball -> ./configure -> make -> make install แล้วก็ config อีกนิดหน่อย แค่ ใส่ user pass และ db name ของ database server ลงไปก็เสร็จแล้ว

ข้างใน config ก็มีให้เลือก database server อยู่แล้ว สามารถเลือกรูปแบบให้เหมาะสมได้เลย

ใน tutorial นั้นก็ได้มีการเขียนติดต่อกับ PHP ได้เลย เพียงนำ lib include ไปเท่านั้น

สามารถ compile ร่วมไปกับ mysql ให้เป็น engine ของ mysql ได้

วันนี้มาเกริ่นๆ เท่านั้น เกี่ยวกับ sphinx search ต่อไปก็จะมาพูดถึงการเขียนกัน แล้วก็รายละเอียด ลึกๆ แล้วกัน

ใช้งาน Twitter API ด้วย PHP ผ่าน cUrl

การใช้งาน Twitter API นั้นง่ายที่สุดแล้ว แต่ จะว่าไป ก็ ยังยากสำหรับมือใหม่อยู่ดี วันนี้เลยจะมาเสนอ twitter api บรรทัดเดียวให้ดูกันว่า twitter API นั้นใช้งานง่ายจิงๆ

ก่อนอื่นเลย สิ่งที่จะต้องใช้ในงานนี้คือ

  • ภาษาเขียนโปรแกรมอะไรก็ได้นะที่ execute command ได้
  • ความรู้ในการต่อ string
  • สามารถใช้ cUrl ได้

งั้นเรามาเขียนกันเลย

การเขียนนั้นง่ายแสนง่ายเพราะ cUrl นั่้นง่ายนิดเดียว เราจะมีหลักการเขียนที่ว่า

 curl –basic –user USERNAME:PASS –data status=”MESSAGE” http://twitter.com/statuses/update.xml

ง่ายๆแค่นี้เอง

แล้วเราก็ทำ form ให้ส่งค่าข้อมูลไป หรือ จะเอาข้อมูลมาจากใหนก็ได้ โดยจะแสดงตัวอย่างเป็น PHP นะง่ายดี

 <?php

if($_POST['message'] != ”){

$message = $_POST['message'];
$username = $_POST['username'];
$password = $_POST['password'];

$command = ‘curl –basic –user ‘.$username.’:’.$password.’ –data status=”‘.$message.’” http://twitter.com/statuses/update.xml’;

$retval = system($command);

echo $command;
echo ‘<br />’;
echo $retval;

}

?>

<form name=”twitterForm” action=”" method=”post” enctype=”multipart/form-data”>

message. <input type=”text” name=”message” value=”" /><br />
username. <input type=”text” name=”username” value=”" /><br />
password. <input type=”text” name=”password” value=”" /><br />

<input type=”submit” value=”OK” />

</form>

อย่างนี้เป็นต้นนะครับผม

ลองเล่นๆกันดู post เข้าไปเลย twitter อ่ะ มันส์  ช่วย SEO ได้ด้วยนะ

ปล. web hosting ส่วนใหญ่ใช้ apache และจะ config saft_mode เป็น on จะไม่สามารถใช้ system(), exec(), shell_exec() ได้ ให้ดูด้วยนะว่าใช้ได้เปล่า