เราพอเข้าใจกันอยู่แล้ว ที่ว่า เมื่อต้องการทำงานโค้ดคำสั่งใดๆ
เราจำเป็นต้องเรียกไฟล์นั้นๆ ขึ้นมาใช้งานเพื่อรันคำสั่ง ซึ่งจะเห็นทั่วไปจาก
การเรียกไฟล์ผ่าน บราวเซอร์ เป็นการเรียกใช้งานจากฝั่ง client หรือผู้ใช้
ส่วน Cron job และ Event Scheduler นั้นจะเป็นการเรียกใช้งานโดยตัว server
เอง ที่กำหนดการทำงานเป็นช่วงจังหวะเวลาที่ต้องการ เช่น ทุก 1 นาที หรือ ทุกๆวัน
ปกติจะใช้งาน Cron job และ Event Scheduler ในการแก้ไขปัญหาการอัพเดท
แก้ไข หรือทำงานที่ต้องการ โดยมีกำหนดเวลาเข้ามาเกี่ยวข้อง ยกตัวอย่างเช่น ทำการอัพเดท
สถานะรายการสั่งซื้อที่ยังไม่ได้ชำระเงิน แจ้งเตือนวันหมดอายุของบริการหรือผลิตภัณฑ์
ส่งอีเมลข่าวสารประจำวัน เหล่านี้เป็นต้น
ถึง Cron job และ Event Scheduler จะสามารถทำงานคล้ายกันในบางกรณี แต่ก็ไม่ได้มีรูปแบบ
และการที่ใช้งานที่เหมือนกัน นอกจากนั้น Cron job และ Event Scheduler ก็มีความสามารถและ
ความเหมาะสมในการใช้งานที่แตกต่างกันด้วย โดย Cron job จะรองรับการทำงานที่หลากหลายกว่า
เนื่องจากเป็นการตั้งเวลาให้ไปรันไฟล์ที่เราต้องการ ซึ่งไฟล์ทีเราจะเรียกใช้นั้น เราสามารถที่จะเขียน
โค้ดหรือคำสังอะไรก็ได้ เช่น สั่งให้เขียนไฟล์ สั่งให้อัพเดทฐานข้อมูล สั่งให้ส่งอีเมล สั่งให้ส่งการ
แจ้งเตือนไปยังผู้ใช้ผ่านบริการ push notification ต่างๆ ส่วน Event Scheduler จะเน้นไปที่การจัดการ
กับฐานข้อมูลมากกว่า คือเป็นการตั้งเวลาทำงานที่ฝั่ง database server รองรับการอัพเดทข้อมูล เพิ่ม ลบ
ข้อมูล หรือเรียกใช้ชุดโครงสร้างคำสั่ง sql ที่มีการกำหนดไว้ (Stored Procedure)
ในเนื้อหา เราจะพูดถึงวิธีการใช้งานของทั้งสองรูปแบบ
Cron job
Cron job คือ การกำหนดช่วงจังหวะเวลา ที่จะทำงานรันไฟล์หรือชุดคำสั่งใดๆ ที่ฝั่ง server ซึ่งชุดคำสั่ง
จะถูกเรียกผ่าน command line ในที่นี้ จะแนะนำแนวทางการใช้ cron job ใน cpanel และ directadmin
อย่างไรก็ตาม ระบบจัดการ cron job เป็นการทำงานที่ใช้ทรัพยากรฝั่ง server ผู้ให้บริการบางที่อาจจะไม่ได้
รองรับการใช้งานส่วนนี้ หากต้องการใช้งาน ให้ติดต่อที่ server ที่เราใช้บริการ ถ้าไม่พบส่วนจัดการ cron job
Cron Syntax
.---------------- นาที (0 - 59) | .------------- ชั่วโมง (0 - 23) | | .---------- วันที่ของเดือน (1 - 31) | | | .------- เลขเดือน (1 - 12) หรือตัวย่อชื่อเดือน 3 ตัวแรก jan,feb,mar,apr ... | | | | .---- วันในสัปดาห์ (0 - 6) (อาทิตย์=0 หรือ 7) หรือตัวย่อชื่อวัน 3 ตัวแรก sun,mon ... * * * * * <command to be executed คำสั่งหรือ path ไฟล์ที่จะเรียกใหทำงาน>
ตัวอย่าง
* * * * * /usr/local/bin/php /home/ninenik/public_html/cron/mycron1.php
cron จะทำงานในระดับเวลาที่ นาที ไม่ใช่วินาที ในตัวอย่างข้างต้น cron จะเรียกไฟล์
mycron1.php ซึ่งอยู่ในโฟลเดอร์ cron ทุกๆ 1 นาที
ชุดคำสั่งข้างต้น จะเป็นชุดคำสั่ง ที่ cron ทำงานผ่าน command line ที่ฝั่ง server
จะขอแยกให้ดูรายละเอียด
* * * * * ส่วนแรก /usr/local/bin/php /home/ninenik/public_html/cron/mycron1.php ส่วนที่สอง
ส่วนแรก เป็นการกำหนดเกี่ยวกับตารางเวลาหรือ schedule กำหนดการ ปกติจะใช้เป็นตัวเลข
ตามรูปแบบค่าใน syntax ด้านบน
- * หมายถึง ทุกๆ ถ้าเป็นส่วนของนาที ก็ทุกนาทีหรือทุก 1 นาที
- */2 หมายถึง ทุกๆ 2 นาที หากต้องการเปลี่ยนเป็นทุกกี่นาที ก็เปลี่ยนเลข 2 เป็นค่าที่ต้องการ
- 1-5 เราสามารถกำหนดช่วงของค่าข้อมูลได้ โดยใช้ (-) อย่างนาทีที่ 1 ถึง 5
- 1,2,7,58 เราสามารถกำหนดหลายค่า โดยใช้ (,) แบ่งค่าที่้ต้องการได้ ข้างต้นคือ นาทีที่ 1 2 7 และ 58
- 1-5,30,55-59 เราสามารถใช้ค่าด้วยรูปแบบหลากหลายรวมกันได้
ส่วนที่สอง เป็นคำสั่ง จะมีส่วนของ path ของตัวโปรแกรมที่เรียกใช้ กับ path ของไฟล์ที่จะเรียกใช้
/usr/local/bin/php จะทำคำสั่งด้วย php /home/ninenik/public_html/cron/mycron1.php เรียกไปที่ path เต็มของไฟล์ mycron1.php ที่อยู่ในโฟลเดอร์ cron
นอกจากการกำหนด path ของตัวโปรแกรม และ path ของไฟล์ที่เรียกใช้ เรายังสามารถกำหนดคำสั่ง
ที่รองรับ กับ url โดยตรงก็ได้ โดยสามารถใช้ 3 คำสั่ง ดังต่อไปนี้
GET | curl | wget
แล้วตามด้วย url สมมติเป็น
GET http://www.mysite.com/cron/mycron1.php curl http://www.mysite.com/cron/mycron1.php wget http://www.mysite.com/cron/mycron1.php
หากต้องการใช้รูปแบบที่กำหนด url ให้ทดสอบใช้คำสั่งข้างต้น โดยแนะนำจาก GET, curl แล้วสุดท้าย wget
เนื่องจาก wget จะมีการสร้าง temp ไฟล์ด้วย เลือกใช้ตัวใดตัวหนึ่งที่รองรับและเห็นว่าเหมาะสม
ข้อดีของการกำหนดแบบ url คือ เราอาจจะไม่จำเป็นต้องทราบ path เต็มของไฟล์นั้นก็ได้ โดยเรียก
ผ่าน url แทน นอกจากนั้น เรายังสามารถไปเรียกทำงานที่ url ของเว็บไซต์อื่นได้ด้วย
อย่างไรก็ตาม ขึ้นกับชุดคำสั่งและการทำงานนั้นๆ ด้วย ว่าเราต้องการความปลอดภัยในระดับไหน เพราะกรณี
กำหนดแบบ url ใครที่ทราบ url ข้างต้นก็สามารถเรียกรันคำสั่งได้
การจัดการกับ output ในการใช้งาน Cron
สำหรับการใช้งาน cron job ใน cPanel และ DirectAdmin ส่วนของการกำหนดเวลา จะกำหนดแยก
ด้วยวิธีระบุค่าต้องการให้ตรงกับช่องของเวลานั้น ดังนั้น จะขอเน้นไปที่ command
/usr/local/bin/php /home/ninenik/public_html/cron/mycron1.php
โดยทั่วไป ถ้าเรากำหนดอีเมล สำหรับ cron job หากมีข้อผิดพลาด หรือ cron job ทำงานผิดพลาดขึ้น
ไฟล์นั้นก็จะแสดง error หรือแจ้งเตือนในไฟล์ crom คล้ายกับหน้าเว็บแจ้ง error ลักษณะดังกล่าว ทำให้เกิด
output ของ cron เกิดขึ้น เช่นเดียวกัน ถ้าเรากำหนดให้ไฟล์ cron แสดงค่าใดๆ อย่างเช่นมีการใช้งานคำสั่ง
echo ก็ทำให้ cron มี output เกิดขึ้น ระบบจะทำการส่งค่า output แจ้งมายังอีเมลนั้นๆ และถ้าสมมติเรากำหนด
ให้ cron ทำงานทุกๆ 1 นาที ถ้ามี output ขึ้น ระบบจะส่งอีเมลทุกๆ นาที ซึ่งกรณีดังนี้ ไม่มีประโยนช์ใดๆ ที่เรา
ต้องส่งอีเมลแจ้ง เราสามารถกำหนดป้องกัน การแจ้ง output ทางอีเมลในบางคำสั่งได้ โดยเดิม
>/dev/null 2>&1
ต่อท้ายเข้าไป จะได้เป็น
/usr/local/bin/php /home/ninenik/public_html/cron/mycron1.php >/dev/null 2>&1
หรือสมมติว่า เราไม่ต้องการส่งอีเมล แต่อยากดู output ของ cron ก็สามารถ กำหนด path ของ log
ไฟล์ที่ต้องการได้ เช่น
>/home/ninenik/public_html/cron/mycron1.log
เมื่อต่อท้ายเข้าไป ก็จะได้เป็น
/usr/local/bin/php /home/ninenik/public_html/cron/mycron1.php >/home/ninenik/public_html/cron/mycron1.log
เราสามารถดาวน์โหลด log ไฟล์มาดู โดยเปิดด้วย text editor ทั่วไป เพื่อตรวจสอบ error หรือค่า output
เตรียมใช้งาน Cron job
เมื่อเราได้แนวทาง และทำความรู้จักกับการใช้งานของ cron ไปแล้ว ต่อไปเราจะทำการทดสอบ
ก่อนอื่น ที่ต้องมีคือไฟล์ script ที่เราจะเรียก สมมติเราจะทำการ เพิ่มข้อมูล ทุกๆ นาทีเข้าไปใน ตาราง
ในฐานข้อมูล
โครงสร้างตาราง tbl_testcron
CREATE TABLE `tbl_testcron` ( `id_cron` int(11) NOT NULL, `test_val` varchar(100) NOT NULL, `date_val` datetime NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8; ALTER TABLE `tbl_testcron` ADD PRIMARY KEY (`id_cron`); ALTER TABLE `tbl_testcron` MODIFY `id_cron` int(11) NOT NULL AUTO_INCREMENT; COMMIT;
ต่อไปสร้างไฟล์ mycron1.php ไว้ในโฟลเดอร์ cron อีกที
กำหนด permission ให้โฟลเดอร์ cron เป็น 755
ไฟล์ mycron1.php
<?php session_start(); // โค้ดไฟล์ dbconnect.php ดูได้ที่ http://niik.in/que_2398_5642 require_once("dbconnect.php"); $sql = " INSERT INTO tbl_testcron (test_val,date_val) VALUES ('test time: ".date("H:i:s")."',NOW()) "; $result = $mysqli->query($sql) or die($mysqli->error); if($result){ echo "Success"; } ?>
ทดสอบรัน script ไฟล์เพื่อดูว่าทำงานถูกต้องตามต้องการหรือไม่ โดยเรียกไฟล์ผ่าน
บราวเซอร์
http://www.mysite.com/cron/mycron1.php
หากไม่มีปัญหา ขึ้นข้อความแจ้งว่า Success
และตรวจสอบในตาราง tbl_testcron แล้วพบมีข้อมูลเข้ามา แสดงว่า script เราทำงานถูกต้อง
พร้อมนำไปใช้งานร่วมกับ cron
การเพิ่ม Cron job ใน cPanel
ให้เราไปที่ cPanel หาเมนู Cron job แล้วคลิกเข้าไป
หากใครต้องการดูหน้าตาของ cPanel ที่เป็น demo คลิกที่นี่ cPanel Demo
เมื่อเข้ามาสู่หน้าจัดการ Cron job ดูในส่วนของ Add New Cron Job
เราสามารถกำหนดค่าในส่วนของ Minute|Hour|Day|Month|Weekday เข้าไปได้เลย
หรือจะเลือกตรง Common Settings เพื่อใช้รูปแบบ แล้วค่อยปรับแก้ค่าตามต้องการ
ส่วนสำคัญคือตรง Command ให้เราใช้ commnd หรือคำสั่งที่ต้องการเรียกใช้ ในที่นี้จะใช้เป็น
/usr/local/bin/php /home/ninenik/public_html/cron/mycron1.php >/dev/null 2>&1
กดเลือก Add New Cron job
ก็จะได้เป็น
เราสามารถลบ แก้ไข Cron job ได้ตลอดเวลาที่ต้องการ
การเพิ่ม Cron job ใน DirectAdmin
ให้เราไปที่ DirectAdmin หาเมนู Cron job แล้วคลิกเข้าไป
หากใครต้องการดูหน้าตาของ DirectAdmin ที่เป็น demo คลิกที่นี่ DirectAdmin Demo
ดูในส่วนของ User demo ใช้ login และ password ตามที่เขาแจ้งไว้
แนวทางคล้ายๆ กัน ปรับแต่งค่า ตามต้องการ
กดเลือก Add เพื่อเพิ่ม Cron job ใหม่
ก็จะได้เป็น
เราสามารถลบ แก้ไข Cron job ได้ตลอดเวลาที่ต้องการ
การใช้งาน Cron job ทั้งใน cPanel หรือ DirectAdmin เราสามารถที่จะเพิ่มกี่ cron job เข้าไปก็ได้
แต่ก็ต้องพิจารณาถึงความถี่ในการทำงาน หรือ script ที่เรียกใช้งาน ต้องเหมาะสมกับลักษณะของงาน
ที่ต้องการ เช่น สมมติเราจะลบรายการที่หมดอายุ หรือครบกำหนดเวลา กรณีแบบนี้เราอาจจะต้องกำหนด
ให้ทำงานทุกๆ นาที เพื่อความถูกต้องของข้อมูล หรือ กรณีต้องการอัพเดทสถานะบางข้อมูลที่ไม่จำเป็น
เราก็อาจจะกำหนดวันละสองครั้ง ที่เวลาใดๆ ตามต้องการก็ได้
บางคำสั่งที่มีรูปแบบการใช้งานของเงื่อนไขเวลาเดียวกัน เราสามารถ เพิ่มคำสั่งเข้าไปในไฟล์ script
เดียวก็ได้ แล้วใช้ cron job ตัวเดียวในการจัดการ อย่างเช่น สมมติ script เดิมเราให้เพิ่มข้อมูลทุกๆ นาที
แต่เรามีเงื่อนไขเพิ่มมาว่า ถ้ามีข้อมูลเท่ากับ 5 รายการให้ล้างข้อข้อมูลใหม่ ก็อาจจะกำหนดเป็นดังนี้
<?php session_start(); // โค้ดไฟล์ dbconnect.php ดูได้ที่ http://niik.in/que_2398_5642 require_once("dbconnect.php"); $sql = " INSERT INTO tbl_testcron (test_val,date_val) VALUES ('test time: ".date("H:i:s")."',NOW()) "; $result = $mysqli->query($sql) or die($mysqli->error); if($result){ echo "Success"; } $sql = " SELECT id_cron FROM tbl_testcron "; $result = $mysqli->query($sql) or die($mysqli->error); if($result && $result->num_rows>=5){ if($mysqli->query("TRUNCATE tbl_testcron")){ echo "Delete"; } } ?>
เราสามารถเพิ่มคำสั่งอื่นๆ เพิ่มเติมนอกจากเพิ่ม ลบ แก้ไขข้อมูลเข้าไปในไฟล์ script อย่างเช่น
คำสั่งส่งอีเมล คำสั่งแจ้ง push notification แจ้งเตือนต่างๆ
สำหรับใคร ที่ server ไม่รองรับการทำงาน cron job สามารถใช้บริการ *free cron job* ออนไลน์ได้
โดยเลือกใช้บริการจากผู้ให้บริการที่น่าเชื่อถือ หรือลองค้น ตามคำค้นด้านบน
หรือลองใช้บริการของ https://cron-job.org/en/
เนื้อหาเกี่ยวกับ cron job จะขอจบเพียงเท่านี้ ส่วนตอนหน้า จะเกี่ยวกับ Event Scheduler
รอติดตาม