การตั้งเวลาทำงาน ด้วย Cron Job และ Event Scheduler ตอนที่ 1

เขียนเมื่อ 5 ปีก่อน โดย Ninenik Narkdee
กำหนดเวลา ตั้งเวลา directadmin อัตโนมัติ event scheduler cron job cpanel

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ กำหนดเวลา ตั้งเวลา directadmin อัตโนมัติ event scheduler cron job cpanel

ดูแล้ว 13,688 ครั้ง




เราพอเข้าใจกันอยู่แล้ว ที่ว่า เมื่อต้องการทำงานโค้ดคำสั่งใดๆ 
เราจำเป็นต้องเรียกไฟล์นั้นๆ ขึ้นมาใช้งานเพื่อรันคำสั่ง ซึ่งจะเห็นทั่วไปจาก
การเรียกไฟล์ผ่าน บราวเซอร์ เป็นการเรียกใช้งานจากฝั่ง 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 
รอติดตาม


   เพิ่มเติมเนื้อหา ครั้งที่ 1 วันที่ 23-04-2024


การป้องกันการสร้างไฟล์บน server กรณีใช้งาน wget

ในกรณีที่เราใช้งาน wget ซึ่งเป็นลักษณะการเรียกใช้ในรูปแบบการโหลดข้อมูลของ
url ที่เราต้องการเรียกใช้ และอาจมีการเขียนไฟล์ใว้บน server ได้ เราสามารถกำหนด
ให้ไม่ต้องมีการเขียน โดยเพิ่มเติมส่วนจอง output ดังนี้เข้าไป
 
สมมติเดิมใช้เป็น 
 
wget http://www.mysite.com/cron/mycron1.php
 
เราก็ปรับเพิ่มไปเป็นดังนี้
 
wget -O /dev/null http://www.mysite.com/cron/mycron1.php >/dev/null 2>&1


   เพิ่มเติมเนื้อหา ครั้งที่ 2 วันที่ 23-04-2024


กรณีเราต้องการ delay การทำงานของ cronjob หรือให้ทำงานในหน่วยวินาที

 
ปกติแล้ว การทำงานของ cronjob เราจะกำหนดได้ที่ระดับนาที ก็คือ อย่างน้อยทุกๆ 1 นาที
แต่เราสามารถใช้เทคนิคการ delay การทำงาน ด้วยคำสั่ง sleep X; X คือเวลาหน่วยวินาที
ที่ต้องการ เพิ่มเข้าไปด้านหน้าของคำสั่ง ตัวอย่างเช่น
 
sleep 10; wget -O /dev/null http://mysite.com/mycron1.php >/dev/null 2>&1
 
ข้างต้นเป็นการกำหนดให้ เมื่อครบนาทีแล้ว ให้รอไปอีก 10 วินาทีค่อยทำงาน ลักษณะนี้ ก็คือการ delay
การทำงาน ด้วยการกำหนด sleep เข้าไป
 
สมมติว่า เราจะใช้วิธีนี้เพื่อทำการ กำหนดให้ทำงานทุกๆ 20 วินาที แทนที่จะเป็น ทุกๆ 1 นาที  นั่นคือ
ทำงานที่วินาที 00 20 30 เราต้องสราง cronjob 3 ตัวและกำหนด ค่าแต่ละตัวดังนี้
 
wget -O /dev/null http://mysite.com/mycron1.php >/dev/null 2>&1
sleep 20; wget -O /dev/null http://mysite.com/mycron1.php >/dev/null 2>&1
sleep 40; wget -O /dev/null http://mysite.com/mycron1.php >/dev/null 2>&1 
 
นั่นคือในการกำหนดปกติ เรากำหนดให้ทำงานทุกๆ 1 นาที และใช้คำสั่งว่า ตัวที่ 2 ให้ทำงานช้าหรือ
delay ไปอีก 20 วินาที และตัวที่ 3 ก็เป็น 40 วินาที ดังนั้น คำสั่งที่รันไฟล์ mycron1.php จะทำงาน
ที่เวลา สมมติตอนนี้เวลา 13:00:59  ตัว  cronjob จะเริ่มทำงานที่เวลา
13:01:00 , 13:01:20 และ 13:01:40 ไปเรื่อยๆ แบบนี้เป็นตัว


กด Like หรือ Share เป็นกำลังใจ ให้มีบทความใหม่ๆ เรื่อยๆ น่ะครับ



อ่านต่อที่บทความ









เนื้อหาที่เกี่ยวข้อง






เนื้อหาพิเศษ เฉพาะสำหรับสมาชิก

กรุณาล็อกอิน เพื่ออ่านเนื้อหาบทความ

ยังไม่เป็นสมาชิก

สมาชิกล็อกอิน



( หรือ เข้าใช้งานผ่าน Social Login )




URL สำหรับอ้างอิง





คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
  • เปลี่ยน


    ( หรือ เข้าใช้งานผ่าน Social Login )







เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ