วันศุกร์ที่ 17 กันยายน พ.ศ. 2553

รวมคำสั่ง MySQL ที่ใช้งานบ่อยๆสำหรับ PHP ( 02 กรกฎาคม 2553 )

http://www.neoxteen.com/knowledge/PHP/%E0%B8%A3%E0%B8%A7%E0%B8%A1%E0%B8%84%E0%B8%B3%E0%B8%AA%E0%B8%B1%E0%B9%88%E0%B8%87-MySQL-%E0%B8%97%E0%B8%B5%E0%B9%88%E0%B9%83%E0%B8%8A%E0%B9%89%E0%B8%87%E0%B8%B2%E0%B8%99%E0%B8%9A%E0%B9%88%E0%B8%AD%E0%B8%A2%E0%B9%86%E0%B8%AA%E0%B8%B3%E0%B8%AB%E0%B8%A3%E0%B8%B1%E0%B8%9A-PHP/

วันอังคารที่ 7 กันยายน พ.ศ. 2553

ปัญหาเรื่อง เวลา ของ PHP บน Windows

เจอปัญหาว่า เขียน PHP ใช้ function date เพื่อแสดงเวลาดังนี้


echo date("H:i:s");

?>

ซึ่งเวลาของ Server เป็น 10:15:20
แต่เวลาที่ระบบแสดงออกมา เป็น

11:15:20

ซึ่งเวลา จะแตกต่างออกไป 1 ชั่วโมง ปัญหาอยู่ที่ว่า ทำไมเดือนก่อนหน้านี้ไม่เป็น แต่พอเป็นเดือนนี้ (มิถุนายน) เวลาเกิดเร็วไป 1 ชั่วโมงซะงัี้น ทั้งๆที่ไม่เปลี่ยนแปลง Code ใดๆเลย ?!?!?!?!?!

ผมลองใช้ คำสั่ง

echo gmdate("H:i:s");

เพื่อแสดงเวลามาตราฐาน Greenwich Mean Time ปรากฏว่า ได้เวลาออกมาเป็น

03:15:20

ซึ่งก็ถูกต้อง แต่ทำไมคำสั่ง date() ให้เวลาไม่ตรงในเดือนนี้ ????
จากการตรวจสอบ พบว่า ใน
C:\Windows\php.ini
มีตัวแปรชื่อว่า date.timezone ไม่ได้ตั้งค่าเอาไว้
ผมเลยลองบังคับให้เป็น

date.timezone="Asia/Bangkok"

แล้ว restart IIS

ปรากฏว่า เวลากลับมาถูกต้องแล้วครับ
ลองเอาไปทำดูนะครับ
ที่มา http://share.psu.ac.th/blog/kx-note/7040

วิธีติดต่อ MySQL บน Ubuntu จากเครื่องอื่น

ติดตั้ง MySQL Server บน Ubuntu แล้ว สามารถเรียกใช้งานผ่านคำสั่ง mysql บนเครื่องนั้นได้ ไม่มีปัญหาอะไร ใช้ GUI Tools บนเครื่อง หรือจะใช้ phpMyAdmin ก็ไม่มีปัญหา ใช้งานได้ดีเยี่ยม

แต่ พอจะใช้ GUI Tools ที่อยู่บนเครื่องอื่นๆนอกเครื่องเซิร์ฟเวอร์ เช่นจะใช้ MySQL Query Browser, MySQL Front, MySQL Yog หรือแม้แต่ phpmyadmin ก็ไม่สามารถติดต่อได้

ตรวจสอบข้อมูล:

ตรวจสอบการ grant privilges ก็แล้ว ถูกต้องแน่นอน ใช้คำสั่งเดียวกันบนเครื่องอื่นๆ ก็ยังทำได้ แต่ไม่ใช่ Ubuntu

ตรวจสอบว่าติดที่ firewall หรือไม่ ก็ไม่ใช่ปัญหาอีก ตรวจสอบด้วยเครื่องมือดังกล่าวติดต่อไปยัง MySQL บน CentOS หรือ บน Windows ก็ไม่พบปัญหา เหมือน Ubuntu ทำไงดี ?

สมมุติฐาน:

Ubuntu พยายามจะรักษาความปลอดภัยให้เป็นอย่างมาก โดยกำหนดที่ไฟล์ my.cnf โดยตรง

จากการค้นคว้า พบว่ามี Server Option ชื่อ bind_address ทำหน้าที่เจาะจงว่า จะยอมรับการติดต่อจาก IP Address ใด ซึ่งจะกำหนดได้เพียงหนึ่งเดียวเท่านั้น โดย Default จะกำหนดเป็น 127.0.0.1 (บน Ubuntu) ซึ่งหมายความว่า รับฟังจากเครื่อง localhost เท่านั้น

แนวทางการแก้ไข:

ให้แก้ไขไฟล์ my.cnf ด้วยคำสั่ง

sudo vi /etc/mysql/my.cnf

แก้ไข

bind-address = 127.0.0.1

เป็น

#bind-address = 127.0.0.1

แล้ว restart mysql

sudo /etc/init.d/mysql restart

เพิ่มเติม:

เมื่อเปิด server option นี้ จะยอมรับการเชื่อมต่อจากทุกที่ หากต้องการความปลอดภัย ให้ติดตั้ง firewall เพิ่มเติม และใช้คำสั่ง grant privileges เพื่อกำหนด Access Control เพิ่มเติมด้วย
ที่มา http://share.psu.ac.th/blog/kx-note/15713

หลักการทำ Web Server ที่ดี เอาไปใช้ประยุกต์กับ Server แบบอื่นๆได้

1.ซึ่งโดยทั่วไปก็คือ บริหาร IO ดีๆ ใส่ RAM เยอะๆ
2.CPU แรงๆ ไม่มีค่อยมีผลต่างกันมากมายเท่ากับ Resouce ที่มีให้ใช้ครับ นอกจากว่าเป็นการทำงานในลักษณะประมวลผลทางด้าน CGI มากๆ ควรให้ความสำคัญด้านนี้ด้วย แต่ไม่มากเท่า RAM และ CPU ในความเร็วใกล้เคียงกัน แทบจะไม่มีผลแตกต่างกันมาก (ช่วยได้ไม่ถึง 10%) เพราะงานหลักของ httpd เน้นการบริหาร resouce ไม่ได้เน้นการคำนวณคณิตศาสตร์ CPU จึงหนักไปทางบริหาร process ของ OS มากกว่า และถ้า CPU ยัง มี usage ไม่ถึง 100% (หรือใกล้เคียง) ก็แปลว่า มันยังทำงานไหวครับ เพราะการที่ CPU ทำงานมาก แสดงว่า ต้องคำนวณมาก แต่มีผลน้อยกว่า IO ทำงานหนักครับ
3.RAM ควรมีอย่างต่ำ 512 MBขึ้นไป แต่ว่าผมแนะนำ ที่ 1 GB อยากให้ยอมลด CPU เพื่อแรม ว่างั้นเถอะ เพราะเราทำให้ขั้นตอนประมวลผลทำงานได้เร็วขึ้นข้อมูลไม่คับคั้งมากจนเกินไป พร้อมที่จะดึงข้อมูลที่ใช้บ่อยๆ ก็เก็บใน RAM มาใช้ได้เร็วกว่า HD มาก ทำให้ระบบโดยรวมเสถียร์มากขึ้น การทำระบบ SWAP ต่างๆ ไม่ควรเกิน กว่า 60% จาก ความจุแรมเพราะไม่เสถียรและเปลี่ยงพื้นที่ HD โดยไม่จำเป็น
4.HD ควรเป็น Ultrawide SCSI 10000 rpm ขึ้นไป ควรใช้ SCSI ครับ คนทำงานเป็น admin ชอบ SCSI เพราะมันไม่ค่อยเกเร และไม่ค่อยมีปัญหา + ทนทาน + ตอบสนองเร็ว + เหมาะกับระบบ multi user ถ้ามีงบน้อย จะใช้ HD IDE ผมก็แนะนำให้ใช้ HD IDE 2 ตัวขึ้นไป สำหรับ กระจายงาน + backup กันเอง โดยทั่วไป ระบบที่เน้นความสเถียรภาพสูงๆ มักจะต้องทำ raid ด้วย เพราะข้อมูลสำคัญมากๆ พังไม่ได้เด็ดขาด
5.Network Card ก็ควรใช้ของดีๆ โดยทั่วไป นิยมของดังๆ เช่น Intel, 3COM เอาแบบ 100 MBit ไปเลยครับ
6.Apache ก็ลง mod เท่าที่จำเป็น เพราะจะได้ไม่อ้วนมาก เวลาแตก process เยอะๆ
7.Optimized WebserServer เท่าที่จะทำได้เช่น ลง Zend Optimizer/Accerator , mod_gzip, phpa (Cache), etc
8.หมั่น Upgrade Apache บ่อยๆ เพราะรุ่นใหม่ๆ มักจะทำงานและมี security ดีกว่ารุ่นก่าๆ
9.อย่าลืมว่า mysql (database server) ก็กินแรงเครื่องค่อนข้างเยอะเหมือนกัน ถ้ามีงบพอ อาจจะแยกเป็น database server ต่างหาก ลงแต่ mysql อย่างเดียวไปเลย (spec เครื่องปานกลาง)
10.mysql บางรุ่น มีปัญหา+bug เช่น connection เต็มบ่อย และไม่คืนให้ ต้อง reboot เครื่องบ่อย ดังนั้น ต้องหมั่น upgrade อีก
11.บริหาร logs ไฟล์ ให้ดี โดยแยกให้เขียนลงคนละ mount volume หรือคนละ HD กัน เพราะลดการทำงานของ IO และ หมั่นลบ หรือ rotate log ไฟล์ เพราะถ้า logไฟล์โตมากๆ จะทำให้การอ่านเขียนช้าลงไปเยอะ ส่งผลต่อความเร็วโดยรวม ซึ่งส่งผลให้การทำงานหลักๆ ล่มได้ง่าย
12.โดยหน้าที่ของ web admin/system admin คือ หมั่นศึกษา สังเกตุ และหาความรู้ในเรื่องที่เกี่ยวข้องอยู่เสมอ เพื่อให้ระบบทำงานได้เต็มประสิทธิภาพ และ มีปัญหาน้อยๆ
13.ควร ติดตามข่าวสาร และ upgrade ระบบบ่อยๆ โดยเฉพาะปัญหา security
14.email server ให้ระวังการโดนแอบใช้เป็น spam gateway และพยายามหลีกเลี่ยงการให้บริการ smtp แก่บุคคลภายนอก ซึ่งอาจทำได้ โดยการ lock ip หรือ ใช้การทำการตรวจสอบ password ก่อนส่ง
15.กำหนด Firewalls ป้องกันการกระหน่ำ ping icmp /DDOS ซึ่งทำให้ระบบล่มได้
สาเหตุที่ webserver ทั่วไปๆ จะทำงานช้า อืด ไม่ได้ดังใจเจ้าของเวปทั้งหลาย ก็มีสาเหตุหลักๆ ไม่กี่อย่าง คือ

1.webserver ตอบสนองไม่ทัน request process และ มี process ค้างในระบบมากมาย ทำให้ process ใหม่ๆ ที่ร้องขอเข้ามา ต้องรอเข้าคิว (ทำให้รู้สึกช้า) เพราะ server ระบายงานไม่ทัน
◦ถ้าพูดถึง load หนักๆ แน่นอนว่า อุปกรณ์ที่ใช้ ก็ต้องทนทานอย่างหนาตราช้าง ไม่งั้น ไม่กี่ยกก็จอดครับ โดยเฉพาะ harddisk และไฟล์ขนาดใหญ่ ควรจะหนัก harddisk มากกว่านะครับ เพราะ cpu ทำหน้าที่คำนวณ ไม่ได้ทำหน้าที่เขียนอ่านไฟล์
◦หน่วยความจำที่ต้องเผื่อไว้สำหรับ process httpd จำนวนมากๆ นั้น ต้องมีให้เพียงพอ ผมไม่เคยเห็น webserver ที่รองรับงานหนักๆ ตัวไหน มีแรมน้อยกว่า 512 MB นอกจากว่า เวปนั้น จะมี "hello" คำเดียว แบบนั้นเอาแรม แค่ 64 MB ก็พอไหวครับ เร็วสุดยอด ไม่เชื่อลองดู 555
◦การที่มี process ล้นระบบ พวก script ไม่ทำการย่อ code เลย
◦การใช้ process จนหน่วยความจำไม่พอ (ต้องรอ process เก่าๆ เสร็จงานก่อน)
◦แต่ละ process กินเวลานาน อาจเป็นเพราะ scritp ทำงานเยอะ+ช้า และ ไม่ optimized code ทางออกคือ ปรับเปลียน script ให้ทำงานได้เร็วขึ้น เช่น เปลี่ยน compiler เป็น php, servlet , etc (perl ไม่เหมาะกับงานหนักๆ เยอะๆ ยกเว้น mod_perl อันนี้เร็วสุดยอด แต่เขียนยาก) ควบคู่ไปกับการบริหารหน่วยความจำในข้อ1เพราะ cgi script ทั้งหลาย ที่คือ ตัวดี ที่ทำให้ CPU ทำงานมาก และเมื่อมีการ execute script มากๆ ระบบก็ทำงานหนักมากขึ้น ทั้ง cpu, ram , harddisk , io และ script สองสามบรรทัด ที่เขียนผิดพลาดหรือจงใจก็แล้วแต่ ก็ทำให้ server อืดได้นะครับ อย่าประมาท มีตัวอย่างให้เห็นมาบ่อยๆ ใครยังจำได้ว่า สมัยที่มีคนแกะ script 152 และดันเขียน loop พลาด ทำเอา server ตัวเองล่มกันมาเยอะแล้ว
◦optimized การใช้งานฐานข้อมูล งานบางอย่าง ถ้า insert ฐานข้อมูลหนักๆ ถี่ๆ ก็ทำให้ระบบช้าลงมากก และระบบรวนไปเลยก็มี ดังนั้น ถ้านำ text ไฟล์มาช่วยเบาภาระได้บ้าง ก็จะดีขึ้นมาก
◦เร่งความเร็วของ script โดยใช้ engine ช่วย เช่น mod_perl, Zend Engine, Cache Engine, etc
2.internet link ความเร็วต่ำ ระบาย bandwidth ได้น้อย จึงทำให้เกิดความคับคั่งของจราจรข้อมูล (รถติดนั่นแหละ) อันนี้เป็นปัญหาโลกแตก แก้ยาก และเปลืองเงินมาก นอกจากจะย้ายไปอยู่กับ data center ที่มี bandwidth มากๆ แทน
◦แก้ปัญหาเบื้องต้นในระบบเดิม ด้วยตนเอง โดยการบีบอัดข้อมูล เช่น ติดตั้ง mod_gzip เพื่อบับอีด text/html ได้ถึง 80% เพื่อให้กิน bandwidth น้อยลง และจะทำให้ client รู้สึกว่าเร็วขึ้นมาก เนื่องจากความคับคั่งของจราจรลดลง
◦เพิ่ม link bandwidth หรือ ย้าย ISP หรือ data center อันนี้ งบใครงบมันครับ แต่จะบอกว่า ต่อให้ server แรงสุดยอดแค่ไหน ถ้า link ช้า ทำยังไง ก็ไม่เร็วครับ เพราะมันคอขวดอยู่ตรงนั้น เหมือนเอา รถ F1 ไปติดแหงก อยู่บนถนน นะแหละครับ
3.เวปเพจมีขนาดใหญ่ เนื่องจากภาพกราฟิกเยอะ ทำให้ต้องส่งข้อมูลจำนวนมหาศาลเมื่อมี process ร้องขอมากๆ จึงเป็นสาเหตุหนึ่งที่ทำให้ระบบตอบสนองได้ช้าา ทางแก้คือ ต้องลดๆ + บีบอัด กราฟิกกันหน่อย และการเขียนอ่าน IO มากๆ มีผลทำให้ harddisk ตอบสนองได้ช้า โดยเฉพาะการ write ดังนั้น ถ้า IO ไม่ตอบสนอง ได้ดีพอ ก็มีผลต่อความเร็วโดยรวม และ อายุการใช้งานก็สั้นลงด้วยครับ
อ้างอิงมาจาก : http://www.cgitop.com/phpBB2/viewtopic.php?t=602