Làm thế nào để tạo cron job bằng PHP?


100

Tôi mới sử dụng cron job. Tôi thậm chí không biết làm thế nào để viết nó. Tôi đã cố gắng tìm kiếm từ internet, nhưng tôi vẫn chưa hiểu rõ về nó. Tôi muốn tạo một công việc cron sẽ thực thi mã của tôi mỗi phút. Tôi đang sử dụng PHP để tạo nó. Nó không làm việc.

Thí dụ

run.php (Mã sẽ được thực thi mỗi phút)

<?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");

?>

Giả sử rằng hai tệp này nằm trong cùng một thư mục.

Có phải mã mà tôi đã làm sai? Nếu sai, xin vui lòng cho tôi biết cách sửa chữa.


bạn có quyền truy cập shell trên máy chủ không?

8
Bạn không thể chỉ vọng ra *** và mong đợi một cronjob được tạo ra. Đọc lên đây làm thế nào để tạo cronjobs (giả sử bạn đang ở trên một máy chủ chạy Linux) thesitewizard.com/general/set-cron-job.shtml
tlenss

@Dagon: tôi không biết về điều này. Tôi sẽ kiểm tra.
user2738520

Nó là một trong những tắt sự kiện để sử dụngcrontab
Ed chữa lành

Câu trả lời:


66

Đây là lời giải thích tốt nhất về mã trong PHP mà tôi đã tìm thấy cho đến nay:

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

Nói ngắn gọn:

Mặc dù cú pháp của việc lên lịch một công việc mới thoạt nhìn có vẻ khó khăn, nhưng nó thực sự tương đối đơn giản để hiểu một khi bạn chia nhỏ nó. Một công việc cron sẽ luôn có năm cột, mỗi cột đại diện cho một 'toán tử' theo thứ tự thời gian, theo sau là đường dẫn và lệnh đầy đủ để thực thi:

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

Mỗi cột theo trình tự thời gian có liên quan cụ thể đến lịch trình của nhiệm vụ. Chúng như sau:

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.

nhập mô tả hình ảnh ở đây

Vì vậy, ví dụ: nếu một người muốn lên lịch cho một công việc vào 12 giờ sáng vào ngày đầu tiên hàng tháng, nó sẽ trông giống như sau:

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

Nếu chúng tôi muốn lên lịch một nhiệm vụ để chạy vào thứ Bảy hàng tuần lúc 8:30 sáng, chúng tôi sẽ viết nó như sau:

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

Ngoài ra còn có một số toán tử có thể được sử dụng để tùy chỉnh lịch trình hơn nữa:

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

Truy cập liên kết để xem toàn bộ bài viết, nó giải thích:

  1. Định dạng của cronjob là gì nếu bạn muốn nhập / chỉnh sửa thủ công.
  2. Cách sử dụng PHP với thư viện SSH2 để xác thực là người dùng, bạn sẽ chỉnh sửa crontab nào.
  3. Lớp PHP đầy đủ với tất cả các phương thức cần thiết để xác thực, chỉnh sửa và xóa các mục crontab.

34

Tương tự như cách bạn đang cố gắng chạy cron.php, bạn có thể chạy một tập lệnh PHP khác. Tuy nhiên, bạn sẽ phải làm như vậy thông qua giao diện CLI.

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

Sau đó, thêm một mục vào crontab:

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

Nếu tập lệnh run.php có quyền thực thi, thì nó có thể được liệt kê trực tiếp trong crontab, không có phần / usr / bin / php. Phần 'env php', trong tập lệnh, sẽ tìm chương trình thích hợp để thực sự chạy mã PHP. Vì vậy, đối với phiên bản 'thực thi' - hãy thêm quyền thực thi vào tệp:

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

và sau đó, thêm mục sau vào crontab:

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

11

Được thêm vào Alister, bạn có thể chỉnh sửa crontab thường (không phải luôn luôn như vậy) bằng cách nhập crontab -e trong một phiên ssh trên máy chủ.

Các ngôi sao đại diện (* có nghĩa là mỗi đơn vị này):

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

Bạn có thể đọc thêm về điều này ở đây .


2

Nhập nội dung sau vào thiết bị đầu cuối linux / ubuntu

 crontab -e 

chọn một trình chỉnh sửa (đôi khi nó yêu cầu trình chỉnh sửa) và điều này sẽ chạy mỗi phút

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

1

Điều đó có thể phụ thuộc vào máy chủ lưu trữ web của bạn nếu bạn không lưu trữ nội dung của riêng mình. Nếu máy chủ web của bạn hỗ trợ tạo công việc chron, họ có thể có một biểu mẫu để bạn điền vào cho phép bạn chọn tần suất và nhập đường dẫn tuyệt đối đến tệp để thực thi. Ví dụ: máy chủ web của tôi (DreamHost) cho phép tôi tạo các công việc cron tùy chỉnh bằng cách nhập đường dẫn tuyệt đối đến tệp và chọn tần suất từ ​​menu chọn. Điều này có thể không thực hiện được đối với máy chủ của bạn, trong trường hợp đó, bạn cần phải chỉnh sửa crontab trực tiếp hoặc thông qua phương pháp cụ thể trên máy chủ của bạn.

Như Alister Bulman đã nêu chi tiết ở trên, hãy tạo một tệp PHP để chạy bằng CLI (đảm bảo bao gồm #!/usr/bin/env phpngay đầu tệp trước <?phpthẻ. Điều này đảm bảo rằng trình bao biết tệp thực thi nào nên được gọi khi chạy tập lệnh.


0

tại sao bạn không sử dụng curl? về mặt logic, nếu bạn thực thi tệp php, bạn sẽ thực thi tệp đó bằng url trên trình duyệt của mình. nó rất đơn giản nếu bạn chạy cuộn tròn

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
Điều này sẽ hoạt động trên lý thuyết nhưng php-script sẽ phải chạy mọi lúc, điều này không phải là một điều tốt.
bestprogrammerintheworld

1
Bạn phải đặt thời gian thực thi php-max-là 0 để chạy nó mãi mãi. Ngoài ra, nếu một số lỗi xảy ra trong tập lệnh của bạn, tập lệnh sẽ không thực thi lại cho đến khi bạn khởi động lại theo cách thủ công.
Hassan Raza

0

$command = "php ".CRON_PATH.php ";
if(substr(php_uname(), 0, 7) == "Windows"){
pclose(popen("start /B ". $command, "r"));
}else{
shell_exec($command ." > /dev/null &");
}


6
Tôi rất quan tâm đến mã của bạn, bạn có thể giải thích không?
Precious Tom

0

Trước tiên, hãy mở máy chủ SSH của bạn bằng tên người dùng và mật khẩu và thay đổi thành người dùng gốc mặc định (Người dùng có tất cả các quyền), sau đó làm theo các bước bên dưới,

  1. nhập lệnh crontab -lbây giờ bạn sẽ thấy danh sách tất cả các cronjobs.
  2. nhập crontab -emột tệp với tất cả các công việc cron sẽ được mở.
  3. Chỉnh sửa tệp với lịch trình cronjob của bạn dưới dạng min hr dayofmonth month dayofweek pathtocronjobfilevà lưu tệp.
  4. Bây giờ bạn sẽ thấy một phản hồi crontab: installing new crontabbây giờ một lần nữa hãy kiểm tra danh sách cronjobs công việc cron của bạn sẽ được liệt kê ở đó.

0

Tốt hơn hãy sử dụng dự án Cron kết hợp với cronjob Linux cho tác vụ này. Nó cho phép bạn định cấu hình thời gian chạy trong Mã PHP của mình, hỗ trợ các công việc nền và dễ sử dụng.

Bước đầu tiên gọi PHP Script mỗi phút:

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

Bước thứ hai sử dụng Gói cron / cron để định cấu hình thời gian chạy trực tiếp trong 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'));

Bạn đã tìm thấy chi tiết cách sử dụng trong kho lưu trữ được liên kết.


-1

Tạo một cronjob như thế này để làm việc mỗi phút

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

4
Tôi nghĩ rằng chúng tôi đang tìm kiếm các giải pháp để tạo cronjob bằng php và không sử dụng bất kỳ thiết bị đầu cuối hoặc cpanel nào. Tôi cũng muốn tìm giải pháp này chỉ bằng php.
user3264863

-1

Có một cách đơn giản để giải quyết vấn đề này: bạn có thể thực thi tệp php bằng cron sau mỗi 1 phút và bên trong tệp thực thi php tạo câu lệnh "if" để thực thi khi thời gian "bây giờ" như thế này

<?/** 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
Điều này sẽ chỉ hoạt động nếu bạn tải trang, về cơ bản đây không phải là một giải pháp!
Bác sĩ. Atiqur Rahman,

Điều gì sẽ xảy ra nếu tôi đóng trình duyệt? Điều này không thành công!
Resheil Agarwal

-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;
        }

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.