จะสร้างงาน cron โดยใช้ PHP ได้อย่างไร?


101

ฉันเพิ่งเริ่มใช้ cron job ฉันไม่รู้ด้วยซ้ำว่าจะเขียนยังไง ฉันได้พยายามค้นหาจากอินเทอร์เน็ต แต่ฉันยังไม่เข้าใจดี ฉันต้องการสร้างงาน cron ที่จะรันโค้ดของฉันทุกนาที ฉันใช้ PHP เพื่อสร้างมัน มันไม่ทำงาน.

ตัวอย่าง

run.php (รหัสที่จะดำเนินการทุกนาที)

<?php

echo "This code will run every minute";

?>

cron.php

<?php

$path = dirname(__FILE__);
$cron = $path . "/run.php";
echo exec("***** php -q ".$cron." &> /dev/null");

?>

สมมติว่าสองไฟล์นี้อยู่ในโฟลเดอร์เดียวกัน

รหัสที่ฉันทำผิดหรือเปล่า? หากผิดพลาดโปรดบอกวิธีแก้ไขด้วย


คุณมีการเข้าถึงเชลล์บนเซิร์ฟเวอร์หรือไม่

8
คุณไม่สามารถสะท้อนออกมา *** และคาดว่าจะมีการสร้าง cronjob อ่านวิธีสร้าง cronjobs ได้ที่นี่ (สมมติว่าคุณอยู่บนเซิร์ฟเวอร์ที่ใช้ linux) thesitewizard.com/general/set-cron-job.shtml
tlenss

@Dagon: ฉันไม่รู้เกี่ยวกับเรื่องนี้ ฉันจะตรวจสอบให้
user2738520

เป็นงานปิดครั้งเดียวดังนั้นควรใช้crontab
Ed Heal

คำตอบ:


67

นี่เป็นคำอธิบายที่ดีที่สุดพร้อมโค้ดใน PHP ที่ฉันพบจนถึงตอนนี้:

http://code.tutsplus.com/tutorials/managing-cron-jobs-with-php--net-19428

ในระยะสั้น:

แม้ว่าไวยากรณ์ของการจัดตารางงานใหม่อาจดูน่ากลัวในตอนแรก แต่ก็ค่อนข้างง่ายที่จะเข้าใจเมื่อคุณทำลายมันลง งาน cron จะมีห้าคอลัมน์เสมอซึ่งแต่ละคอลัมน์แสดงถึง 'ตัวดำเนินการ' ตามลำดับเวลาตามด้วยพา ธ แบบเต็มและคำสั่งเพื่อดำเนินการ:

* * * * * home / path / to / command / the_command.sh

คอลัมน์ตามลำดับเวลาแต่ละคอลัมน์มีความเกี่ยวข้องเฉพาะกับกำหนดการของงาน มีดังต่อไปนี้:

Minutes represents the minutes of a given hour, 0-59 respectively.
Hours represents the hours of a given day, 0-23 respectively.
Days represents the days of a given month, 1-31 respectively.
Months represents the months of a given year, 1-12 respectively.
Day of the Week represents the day of the week, Sunday through Saturday, numerically, as 0-6 respectively.

ป้อนคำอธิบายภาพที่นี่

ตัวอย่างเช่นหากใครต้องการกำหนดเวลางานเป็นเวลา 12.00 น. ในวันแรกของทุกเดือนจะมีลักษณะดังนี้:

0 0 1 * * home / path / to / command / the_command.sh

หากเราต้องการกำหนดเวลาให้ทำงานทุกวันเสาร์เวลา 08.30 น. เราจะเขียนดังนี้:

30 8 * * 6 home / path / to / command / the_command.sh

นอกจากนี้ยังมีตัวดำเนินการจำนวนมากที่สามารถใช้เพื่อปรับแต่งตารางเวลาให้ดียิ่งขึ้น:

Commas is used to create a comma separated list of values for any of the cron columns.
Dashes is used to specify a range of values.
Asterisksis used to specify 'all' or 'every' value

ไปที่ลิงค์สำหรับบทความฉบับเต็มโดยอธิบายว่า:

  1. รูปแบบของ cronjob คืออะไรหากคุณต้องการป้อน / แก้ไขด้วยตนเอง
  2. วิธีใช้ PHP กับไลบรารี SSH2 เพื่อพิสูจน์ตัวตนในฐานะผู้ใช้ซึ่ง crontab ที่คุณกำลังจะแก้ไข
  3. คลาส PHP เต็มรูปแบบพร้อมวิธีการที่จำเป็นทั้งหมดสำหรับการตรวจสอบสิทธิ์แก้ไขและลบรายการ crontab

34

ในทำนองเดียวกับที่คุณพยายามเรียกใช้ cron.php คุณสามารถเรียกใช้สคริปต์ PHP อื่นได้ คุณจะต้องทำผ่านอินเทอร์เฟซ CLI

#!/usr/bin/env php
<?php
# This file would be say, '/usr/local/bin/run.php'
// code
echo "this was run from CRON";

จากนั้นเพิ่มรายการใน crontab:

* * * * * /usr/bin/php -f /usr/local/bin/run.php &> /dev/null

หากสคริปต์ run.php มีสิทธิ์ในการเรียกใช้งานสามารถแสดงรายการได้โดยตรงใน crontab โดยไม่มีส่วน / usr / bin / php เช่นกัน ส่วน 'env php' ในสคริปต์จะค้นหาโปรแกรมที่เหมาะสมเพื่อเรียกใช้โค้ด PHP จริงๆ ดังนั้นสำหรับเวอร์ชัน "ปฏิบัติการ" ให้เพิ่มสิทธิ์ในการปฏิบัติการลงในไฟล์:

chmod +x /usr/local/bin/run.php

จากนั้นเพิ่มรายการต่อไปนี้ใน crontab:

* * * * * /usr/local/bin/run.php &> /dev/null

11

เพิ่มใน Alister คุณสามารถแก้ไข crontab ได้โดยปกติ (ไม่ใช่กรณีเสมอไป) โดยป้อน crontab -e ในเซสชัน ssh บนเซิร์ฟเวอร์

ดวงดาวแสดงถึง (* หมายถึงทุกหน่วยนี้):

[Minute] [Hour] [Day] [Month] [Day of week (0 =sunday to 6 =saturday)] [Command]

คุณสามารถอ่านรายละเอียดเพิ่มเติมเกี่ยวกับที่นี่


2

พิมพ์สิ่งต่อไปนี้ในเทอร์มินัล linux / ubuntu

 crontab -e 

เลือกตัวแก้ไข (บางครั้งก็ขอตัวแก้ไข) และสิ่งนี้จะทำงานทุกนาที

*       *       *       *       *       /usr/bin/php path/to/cron.php &> /dev/null

1

ซึ่งอาจขึ้นอยู่กับพื้นที่เว็บของคุณหากคุณไม่ได้โฮสต์เนื้อหาของคุณเอง หากโฮสต์เว็บของคุณรองรับการสร้างงาน chron พวกเขาอาจมีแบบฟอร์มให้คุณกรอกเพื่อให้คุณเลือกความถี่และป้อนเส้นทางสัมบูรณ์ไปยังไฟล์เพื่อดำเนินการ ตัวอย่างเช่นโฮสต์เว็บของฉัน (DreamHost) อนุญาตให้ฉันสร้างงาน cron ที่กำหนดเองได้โดยพิมพ์เส้นทางสัมบูรณ์ไปยังไฟล์และเลือกความถี่จากเมนูที่เลือก สิ่งนี้อาจไม่สามารถทำได้สำหรับเซิร์ฟเวอร์ของคุณซึ่งในกรณีนี้คุณจำเป็นต้องแก้ไข crontab โดยตรงหรือผ่านวิธีการเฉพาะของโฮสต์ของคุณ

ตามรายละเอียดของAlister Bulmanด้านบนให้สร้างไฟล์ PHP เพื่อเรียกใช้โดยใช้ CLI (อย่าลืมรวม#!/usr/bin/env phpไว้ที่จุดเริ่มต้นของไฟล์ก่อน<?phpแท็กเพื่อให้แน่ใจว่าเชลล์รู้ว่าควรเรียกใช้ไฟล์ปฏิบัติการใดเมื่อเรียกใช้สคริปต์



0

ขั้นแรกให้เปิดเซิร์ฟเวอร์ SSH ของคุณด้วยชื่อผู้ใช้และรหัสผ่านจากนั้นเปลี่ยนเป็นผู้ใช้รูทเริ่มต้น (ผู้ใช้ที่มีสิทธิ์ทั้งหมด) จากนั้นทำตามขั้นตอนด้านล่าง

  1. ป้อนคำสั่งcrontab -lตอนนี้คุณจะเห็นรายการ cronjobs ทั้งหมด
  2. ป้อนcrontab -eไฟล์ที่มีงาน cron ทั้งหมดจะถูกเปิดขึ้น
  3. แก้ไขไฟล์ด้วยกำหนดการ cronjob ของคุณเป็นmin hr dayofmonth month dayofweek pathtocronjobfileและบันทึกไฟล์
  4. ตอนนี้คุณจะเห็นคำตอบcrontab: installing new crontabอีกครั้งตรวจสอบรายการ cronjobs งาน cron ของคุณจะอยู่ในรายการ

0

ควรใช้โครงการCronร่วมกับ Linux cronjob สำหรับงานนี้ ช่วยให้คุณกำหนดค่าเวลาทำงานใน PHP Code ของคุณรองรับงานพื้นหลังและใช้งานง่าย

ขั้นตอนแรกเรียก PHP Script ทุกนาที:

* * * * * /usr/local/bin/run.php &> /dev/null

ขั้นตอนที่สองใช้cron / cron Package เพื่อกำหนดค่ารันไทม์โดยตรงใน PHP

$deprecatedStatus = new ShellJob();
$deprecatedStatus->setCommand('cd /app && /usr/local/bin/php cron/updateDeprecatedStatus.php');
$deprecatedStatus->setSchedule(new CrontabSchedule('* * * * */2'));


$displayDate = new ShellJob();
$displayDate->setCommand('cd /app && /usr/local/bin/php cron/updateDisplayDate.php');
$displayDate->setSchedule(new CrontabSchedule('* * * * */5'));

คุณพบรายละเอียดวิธีใช้ในที่เก็บที่เชื่อมโยง


-1

สร้าง cronjob แบบนี้เพื่อทำงานทุกนาที

*       *       *       *       *       /usr/bin/php path/to/cron.php &> /dev/null

4
ฉันคิดว่าเรากำลังมองหาโซลูชันเพื่อสร้าง cronjob โดยใช้ php และไม่ใช้เทอร์มินัลหรือ cpanel ใด ๆ ฉันต้องการค้นหาโซลูชันนี้โดยใช้ php เท่านั้น
user3264863

-1

มีวิธีง่ายๆในการแก้ปัญหานี้: คุณสามารถรันไฟล์ php ด้วย cron ทุกๆ 1 นาทีและภายในไฟล์ปฏิบัติการ php ทำให้คำสั่ง "if" ดำเนินการเมื่อถึงเวลา "ตอนนี้" เช่นนี้

<?/** suppose we have 1 hour and 1 minute inteval 01:01 */

$interval_source = "01:01";
$time_now = strtotime( "now" ) / 60;
$interval = substr($interval_source,0,2) * 60 + substr($interval_source,3,2);


if( $time_now % $interval == 0){
/** do cronjob */
}

4
สิ่งนี้จะใช้ได้เฉพาะเมื่อคุณโหลดหน้านี้โดยทั่วไปแล้วนี่ไม่ใช่วิธีแก้ปัญหา!
นพ. Atiqur Rahman

จะเกิดอะไรขึ้นถ้าฉันปิดเบราว์เซอร์ สิ่งนี้ล้มเหลว!
Resheil Agarwal

-1

ทำไมคุณไม่ใช้ curl? ตามหลักเหตุผลหากคุณเรียกใช้ไฟล์ php คุณจะดำเนินการโดย url บนเบราว์เซอร์ของคุณ มันง่ายมากถ้าคุณใช้ curl

while(true)
{
    sleep(60); // sleep for 60 sec = 1 minute

    $s = curl_init();
    curl_setopt($s,CURLOPT_URL, $your_php_url_to_cron); 
    curl_exec($s); 
    curl_getinfo($s,CURLINFO_HTTP_CODE); 
    curl_close($s);
}

5
สิ่งนี้จะได้ผลในทางทฤษฎี แต่ php-script จะต้องทำงานตลอดเวลาซึ่งไม่ใช่สิ่งที่ดี
bestprogrammerintheworld

1
คุณต้องตั้งค่า php-max-Execution-time ให้เป็น 0 เพื่อให้ทำงานได้ตลอดไป นอกจากนี้หากมีข้อผิดพลาดเกิดขึ้นในสคริปต์ของคุณจะไม่ดำเนินการอีกจนกว่าคุณจะรีสตาร์ทด้วยตนเอง
Hassan Raza

-2
function _cron_exe($schedules) {
        if ($obj->get_option('cronenabledisable') == "yes") {
            // $interval = 1*20;
            $interval = $obj->get_option('cronhowtime');
            if ($obj->get_option('crontiming') == 'minutes') {
                $interval = $interval * 60;
            } else if ($obj->get_option('crontiming') == 'hours') {
                $interval = $interval * 3600;
            } else if ($obj->get_option('crontiming') == 'days') {
                $interval = $interval * 86400;
            }
            $schedules['hourlys'] = array(
                'interval' => $interval,
                'display' => 'cronjob'
            );
            return $schedules;
        }

}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.