Crontab chạy tệp php mỗi phút

Cron là một dịch vụ lập lịch dựa trên thời gian trong các hệ điều hành giống Linux/Unix. Cron job được sử dụng để lên lịch các lệnh được thực thi định kỳ. Bạn có thể thiết lập các lệnh hoặc tập lệnh sẽ chạy liên tục vào một thời điểm đã đặt. Cron là một trong những công cụ hữu ích nhất trong hệ điều hành Linux hoặc UNIX. Dịch vụ cron (daemon) chạy ẩn và liên tục kiểm tra tệp /etc/crontab, /etc/cron. /* thư mục. Nó cũng kiểm tra thư mục /var/spool/cron/

Trong bài viết này tôi sẽ chỉ cho bạn cách thực thi tập lệnh PHP trong công việc cron

Tạo tập lệnh PHP

Trước hết hãy tạo một tập lệnh php như bên dưới

# cd /var/www/web
# vim test.php

Lưu và đóng tệp

Định cấu hình tác vụ ngô

Trong ví dụ sau, lệnh crontab hiển thị bên dưới sẽ tự động kích hoạt các tác vụ cron sau mỗi năm phút

*/5 * * * * /usr/bin/php /opt/test.php

Trong ví dụ trên, */5 * * * * đại diện cho thời điểm tác vụ sẽ xảy ra. Con số đầu tiên biểu thị số phút – trong trường hợp này, cứ sau “năm” phút. Các số liệu khác lần lượt biểu thị giờ, ngày, tháng và ngày trong tuần

Đây là một bộ lập lịch công việc định kỳ theo khuôn khổ có thể dễ dàng tích hợp với dự án của bạn hoặc chạy dưới dạng một bộ lập lịch lệnh độc lập. Ý tưởng ban đầu được lấy cảm hứng từ Laravel Task Scheduling

Cài đặt qua Composer

Cách khuyến nghị là cài đặt php-cron-scheduler thông qua Composer. Vui lòng tham khảo Bắt đầu về cách tải xuống và cài đặt Composer

Sau khi bạn đã tải xuống/cài đặt Composer, hãy chạy

$scheduler->php('path/to/my/script.php');
8

hoặc thêm gói hàng vào

$scheduler->php('path/to/my/script.php');
9 của bạn

{
    "require": {
        "peppeocchi/php-cron-scheduler": "4.*"
    }
}

Scheduler V4 requires php >= 7.3, please use the v3 branch for php versions < 7.3 and > 7.1 or the v2 branch for php versions < 7.1.

Làm thế nào nó hoạt động

Tạo một tệp

$scheduler->php(
    'path/to/my/script.php', // The script to execute
    'path/to/my/custom/bin/php', // The PHP bin
    [
        '-c' => 'ignore',
        '--merge' => null,
    ],
    'myCustomIdentifier'
);
0 trong thư mục gốc của dự án của bạn với nội dung sau

 require_once __DIR__.'/vendor/autoload.php';

use GO\Scheduler;

// Create a new scheduler
$scheduler = new Scheduler();

// .. configure the scheduled jobs (see below) ...

// Let the scheduler execute jobs which are due.
$scheduler->run();

Sau đó, thêm một mục mới vào crontab của bạn để chạy

$scheduler->php(
    'path/to/my/script.php', // The script to execute
    'path/to/my/custom/bin/php', // The PHP bin
    [
        '-c' => 'ignore',
        '--merge' => null,
    ],
    'myCustomIdentifier'
);
0 mỗi phút

________số 8

Đó là nó. Bộ lập lịch của bạn đã hoạt động, bây giờ bạn có thể thêm công việc của mình mà không cần lo lắng về crontab nữa

lập kế hoạch công việc

Theo mặc định, tất cả các công việc của bạn sẽ cố gắng chạy ở chế độ nền. Các tập lệnh PHP và các lệnh thô sẽ chạy ở chế độ nền theo mặc định, trong khi các chức năng sẽ luôn chạy ở chế độ nền trước. Bạn có thể buộc một lệnh chạy ở nền trước bằng cách gọi phương thức

$scheduler->php(
    'path/to/my/script.php', // The script to execute
    'path/to/my/custom/bin/php', // The PHP bin
    [
        '-c' => 'ignore',
        '--merge' => null,
    ],
    'myCustomIdentifier'
);
2. Các công việc phải gửi đầu ra tới email, sẽ chạy ở nền trước

Lên lịch một tập lệnh php

$scheduler->php('path/to/my/script.php');

Phương thức

$scheduler->php(
    'path/to/my/script.php', // The script to execute
    'path/to/my/custom/bin/php', // The PHP bin
    [
        '-c' => 'ignore',
        '--merge' => null,
    ],
    'myCustomIdentifier'
);
3 chấp nhận 4 đối số

  • Đường dẫn đến tập lệnh php của bạn
  • Nhị phân PHP để sử dụng
  • Các đối số được chuyển đến tập lệnh (LƯU Ý. Bạn cần kích hoạt register_argc_argv trong php của mình. ini để cái này hoạt động (ref). Đừng lo lắng, nó được bật theo mặc định, vì vậy trừ khi bạn cố tình tắt nó hoặc máy chủ của bạn đã tắt nó theo mặc định, bạn có thể bỏ qua nó. )
  • định danh

$scheduler->php(
    'path/to/my/script.php', // The script to execute
    'path/to/my/custom/bin/php', // The PHP bin
    [
        '-c' => 'ignore',
        '--merge' => null,
    ],
    'myCustomIdentifier'
);

Lên lịch một lệnh thô

*/5 * * * * /usr/bin/php /opt/test.php
3

Phương thức

$scheduler->php(
    'path/to/my/script.php', // The script to execute
    'path/to/my/custom/bin/php', // The PHP bin
    [
        '-c' => 'ignore',
        '--merge' => null,
    ],
    'myCustomIdentifier'
);
4 chấp nhận 3 đối số

  • lệnh của bạn
  • Các đối số được truyền vào lệnh
  • định danh

*/5 * * * * /usr/bin/php /opt/test.php
5

Lên lịch một chức năng

*/5 * * * * /usr/bin/php /opt/test.php
6

Phương thức

$scheduler->php(
    'path/to/my/script.php', // The script to execute
    'path/to/my/custom/bin/php', // The PHP bin
    [
        '-c' => 'ignore',
        '--merge' => null,
    ],
    'myCustomIdentifier'
);
5 chấp nhận 3 đối số

  • chức năng của bạn
  • Các đối số được truyền cho hàm
  • định danh

*/5 * * * * /usr/bin/php /opt/test.php
8

Tất cả các đối số bạn truyền vào mảng sẽ được đưa vào hàm của bạn. Ví dụ

*/5 * * * * /usr/bin/php /opt/test.php
9

Nếu bạn muốn truyền một cặp khóa => giá trị, vui lòng truyền một mảng trong mảng đối số

 require_once __DIR__.'/vendor/autoload.php';

use GO\Scheduler;

// Create a new scheduler
$scheduler = new Scheduler();

// .. configure the scheduled jobs (see below) ...

// Let the scheduler execute jobs which are due.
$scheduler->run();
0

Lên lịch thời gian thực hiện

Có một số phương pháp giúp bạn đặt thời gian thực hiện lịch trình của mình. Nếu bạn không gọi bất kỳ phương thức nào trong số này, công việc sẽ chạy mỗi phút (* * * * *)

  • $scheduler->php(
        'path/to/my/script.php', // The script to execute
        'path/to/my/custom/bin/php', // The PHP bin
        [
            '-c' => 'ignore',
            '--merge' => null,
        ],
        'myCustomIdentifier'
    );
    6 - Phương pháp này chấp nhận bất kỳ biểu thức nào được hỗ trợ bởi biểu thức dragonmantank/cron

     require_once __DIR__.'/vendor/autoload.php';
    
    use GO\Scheduler;
    
    // Create a new scheduler
    $scheduler = new Scheduler();
    
    // .. configure the scheduled jobs (see below) ...
    
    // Let the scheduler execute jobs which are due.
    $scheduler->run();
    1

  • $scheduler->php(
        'path/to/my/script.php', // The script to execute
        'path/to/my/custom/bin/php', // The PHP bin
        [
            '-c' => 'ignore',
            '--merge' => null,
        ],
        'myCustomIdentifier'
    );
    7 - Chạy mỗi phút. Bạn có thể tùy ý chuyển một
    $scheduler->php(
        'path/to/my/script.php', // The script to execute
        'path/to/my/custom/bin/php', // The PHP bin
        [
            '-c' => 'ignore',
            '--merge' => null,
        ],
        'myCustomIdentifier'
    );
    8 để chỉ định công việc sẽ chạy sau mỗi
    $scheduler->php(
        'path/to/my/script.php', // The script to execute
        'path/to/my/custom/bin/php', // The PHP bin
        [
            '-c' => 'ignore',
            '--merge' => null,
        ],
        'myCustomIdentifier'
    );
    8 phút

     require_once __DIR__.'/vendor/autoload.php';
    
    use GO\Scheduler;
    
    // Create a new scheduler
    $scheduler = new Scheduler();
    
    // .. configure the scheduled jobs (see below) ...
    
    // Let the scheduler execute jobs which are due.
    $scheduler->run();
    2

  • */5 * * * * /usr/bin/php /opt/test.php
    
    30 - Chạy một lần mỗi giờ. Bạn có thể tùy chọn vượt qua
    $scheduler->php(
        'path/to/my/script.php', // The script to execute
        'path/to/my/custom/bin/php', // The PHP bin
        [
            '-c' => 'ignore',
            '--merge' => null,
        ],
        'myCustomIdentifier'
    );
    8 mà bạn muốn chạy, theo mặc định, nó sẽ chạy mỗi giờ vào phút '00'

     require_once __DIR__.'/vendor/autoload.php';
    
    use GO\Scheduler;
    
    // Create a new scheduler
    $scheduler = new Scheduler();
    
    // .. configure the scheduled jobs (see below) ...
    
    // Let the scheduler execute jobs which are due.
    $scheduler->run();
    3

  • */5 * * * * /usr/bin/php /opt/test.php
    
    32 - Chạy một lần mỗi ngày. Bạn có thể tùy chọn vượt qua
    */5 * * * * /usr/bin/php /opt/test.php
    
    33 và
    $scheduler->php(
        'path/to/my/script.php', // The script to execute
        'path/to/my/custom/bin/php', // The PHP bin
        [
            '-c' => 'ignore',
            '--merge' => null,
        ],
        'myCustomIdentifier'
    );
    8 để có quyền kiểm soát chi tiết hơn (hoặc một chuỗi
    */5 * * * * /usr/bin/php /opt/test.php
    
    35)

     require_once __DIR__.'/vendor/autoload.php';
    
    use GO\Scheduler;
    
    // Create a new scheduler
    $scheduler = new Scheduler();
    
    // .. configure the scheduled jobs (see below) ...
    
    // Let the scheduler execute jobs which are due.
    $scheduler->run();
    4

Có những người trợ giúp bổ sung cho các ngày trong tuần (tất cả đều chấp nhận tùy chọn giờ và phút - mặc định là 00. 00)

  • */5 * * * * /usr/bin/php /opt/test.php
    
    36
  • */5 * * * * /usr/bin/php /opt/test.php
    
    37
  • */5 * * * * /usr/bin/php /opt/test.php
    
    38
  • */5 * * * * /usr/bin/php /opt/test.php
    
    39
  • */5 * * * * /usr/bin/php /opt/test.php
    
    50
  • */5 * * * * /usr/bin/php /opt/test.php
    
    51
  • */5 * * * * /usr/bin/php /opt/test.php
    
    52

 require_once __DIR__.'/vendor/autoload.php';

use GO\Scheduler;

// Create a new scheduler
$scheduler = new Scheduler();

// .. configure the scheduled jobs (see below) ...

// Let the scheduler execute jobs which are due.
$scheduler->run();
5

Và những người trợ giúp bổ sung trong nhiều tháng (tất cả đều chấp nhận các tùy chọn ngày, giờ và phút - được mặc định là ngày đầu tiên của tháng lúc 00. 00)

  • */5 * * * * /usr/bin/php /opt/test.php
    
    53
  • */5 * * * * /usr/bin/php /opt/test.php
    
    54
  • */5 * * * * /usr/bin/php /opt/test.php
    
    55
  • */5 * * * * /usr/bin/php /opt/test.php
    
    56
  • */5 * * * * /usr/bin/php /opt/test.php
    
    57
  • */5 * * * * /usr/bin/php /opt/test.php
    
    58
  • */5 * * * * /usr/bin/php /opt/test.php
    
    59
  • */5 * * * * /usr/bin/php /opt/test.php
    
    60
  • */5 * * * * /usr/bin/php /opt/test.php
    
    61
  • */5 * * * * /usr/bin/php /opt/test.php
    
    62
  • */5 * * * * /usr/bin/php /opt/test.php
    
    63
  • */5 * * * * /usr/bin/php /opt/test.php
    
    64

 require_once __DIR__.'/vendor/autoload.php';

use GO\Scheduler;

// Create a new scheduler
$scheduler = new Scheduler();

// .. configure the scheduled jobs (see below) ...

// Let the scheduler execute jobs which are due.
$scheduler->run();
6

Bạn cũng có thể chỉ định một

*/5 * * * * /usr/bin/php /opt/test.php
65 khi công việc sẽ chạy. Ngày có thể được chỉ định dưới dạng chuỗi hoặc dưới dạng ví dụ của
*/5 * * * * /usr/bin/php /opt/test.php
66. Trong cả hai trường hợp, bạn chỉ có thể chỉ định ngày (e. g. 2018-01-01) hay thời gian cũng vậy (e. g. 2018-01-01 10. 30), nếu bạn không chỉ định thời gian nó sẽ chạy ở 00. 00 vào ngày đó. Nếu bạn đang cung cấp một ngày ở định dạng "không chuẩn", bạn nên chuyển một ví dụ về ________ 166. Nếu bạn đang sử dụng
*/5 * * * * /usr/bin/php /opt/test.php
68 mà không chỉ định thời gian và bạn muốn đặt mặc định là 00. 00, chỉ cần đảm bảo thêm
*/5 * * * * /usr/bin/php /opt/test.php
69 vào định dạng ngày, nếu không thì thời gian sẽ là thời gian hiện tại. Đọc thêm

 require_once __DIR__.'/vendor/autoload.php';

use GO\Scheduler;

// Create a new scheduler
$scheduler = new Scheduler();

// .. configure the scheduled jobs (see below) ...

// Let the scheduler execute jobs which are due.
$scheduler->run();
7

Gửi đầu ra tới tập tin/s

Bạn có thể xác định một hoặc nhiều tệp mà bạn muốn đầu ra của quá trình thực thi tập lệnh/lệnh/chức năng của mình được gửi tới

 require_once __DIR__.'/vendor/autoload.php';

use GO\Scheduler;

// Create a new scheduler
$scheduler = new Scheduler();

// .. configure the scheduled jobs (see below) ...

// Let the scheduler execute jobs which are due.
$scheduler->run();
8

Gửi đầu ra tới email/s

Bạn có thể xác định một hoặc nhiều địa chỉ email mà bạn muốn đầu ra của quá trình thực thi tập lệnh/lệnh/chức năng của mình được gửi tới. Để gửi email, đầu ra của công việc trước tiên cần được gửi tới một tệp. Trên thực tế, các tệp sẽ được đính kèm vào địa chỉ email của bạn. Để làm việc này, bạn cần cài đặt swiftmailer/swiftmailer

 require_once __DIR__.'/vendor/autoload.php';

use GO\Scheduler;

// Create a new scheduler
$scheduler = new Scheduler();

// .. configure the scheduled jobs (see below) ...

// Let the scheduler execute jobs which are due.
$scheduler->run();
9

Bạn có thể tùy ý tùy chỉnh phiên bản

*/5 * * * * /usr/bin/php /opt/test.php
80 bằng một
*/5 * * * * /usr/bin/php /opt/test.php
81 tùy chỉnh. Bạn có thể cấu hình

  • */5 * * * * /usr/bin/php /opt/test.php
    
    82 - Chủ đề của email được gửi
  • */5 * * * * /usr/bin/php /opt/test.php
    
    83 - Địa chỉ email được đặt làm người gửi
  • */5 * * * * /usr/bin/php /opt/test.php
    
    84 - Phần thân của email
  • */5 * * * * /usr/bin/php /opt/test.php
    
    85 - Phương tiện vận chuyển sử dụng. Ví dụ: nếu bạn muốn sử dụng tài khoản gmail của mình hoặc bất kỳ tài khoản SMTP nào khác. Giá trị phải là một thể hiện của
    */5 * * * * /usr/bin/php /opt/test.php
    
    86
  • */5 * * * * /usr/bin/php /opt/test.php
    
    87 - Nếu giá trị này được đặt thành
    */5 * * * * /usr/bin/php /opt/test.php
    
    88, các công việc không trả lại kết quả nào sẽ không kích hoạt bất kỳ email nào

Cấu hình có thể được đặt "toàn cầu" cho tất cả các lệnh của bộ lập lịch, khi tạo bộ lập lịch

* * * * * path/to/phpbin path/to/scheduler.php 1>> /dev/null 2>&1
0

Hoặc có thể được thiết lập trên một công việc trên cơ sở công việc

* * * * * path/to/phpbin path/to/scheduler.php 1>> /dev/null 2>&1
1

Lên lịch thực hiện có điều kiện

Đôi khi bạn có thể muốn thực hiện một lịch trình không chỉ khi đến hạn thực hiện mà còn phụ thuộc vào một số điều kiện khác

Bạn có thể ủy thác việc thực hiện một cronjob để kiểm tra trung thực bằng phương pháp

*/5 * * * * /usr/bin/php /opt/test.php
89

* * * * * path/to/phpbin path/to/scheduler.php 1>> /dev/null 2>&1
2

Lên lịch thứ tự thực hiện

Các công việc sắp chạy đang được sắp xếp theo thứ tự thực hiện của chúng. các công việc có thể chạy trong nền sẽ được thực thi trước

Lịch trình chồng chéo

Để ngăn chặn việc thực hiện một lịch trình trong khi quá trình thực hiện trước đó vẫn đang diễn ra, hãy sử dụng phương pháp

*/5 * * * * /usr/bin/php /opt/test.php
90. Để tránh chồng chéo, Bộ lập lịch cần tạo các tệp khóa. Theo mặc định, nó sẽ được sử dụng đường dẫn thư mục được sử dụng cho các tệp tạm thời

Bạn có thể chỉ định đường dẫn thư mục tùy chỉnh trên toàn cầu khi tạo phiên bản Trình lập lịch biểu mới

* * * * * path/to/phpbin path/to/scheduler.php 1>> /dev/null 2>&1
3

Hoặc bạn có thể xác định đường dẫn thư mục trên cơ sở từng công việc

* * * * * path/to/phpbin path/to/scheduler.php 1>> /dev/null 2>&1
4

Trong một số trường hợp, bạn cũng có thể muốn chạy công việc nếu nó chồng chéo. Ví dụ: nếu lần thực hiện cuối cùng cách đây hơn 5 phút. Bạn có thể truyền một hàm dưới dạng tham số thứ hai, thời gian thực hiện cuối cùng sẽ được đưa vào. Công việc sẽ không chạy cho đến khi hàm này trả về

*/5 * * * * /usr/bin/php /opt/test.php
91. Nếu nó trả về
*/5 * * * * /usr/bin/php /opt/test.php
88, công việc sẽ chạy nếu trùng lặp

* * * * * path/to/phpbin path/to/scheduler.php 1>> /dev/null 2>&1
5

Trước khi thực hiện công việc

Trong một số trường hợp, bạn có thể muốn chạy một số mã, nếu công việc phải chạy, trước khi nó được thực thi. Ví dụ: bạn có thể muốn thêm một mục nhật ký, ping một url hoặc bất kỳ thứ gì khác. Để làm như vậy, bạn có thể gọi

*/5 * * * * /usr/bin/php /opt/test.php
93 như ví dụ bên dưới

* * * * * path/to/phpbin path/to/scheduler.php 1>> /dev/null 2>&1
6

Sau khi thực hiện công việc

Đôi khi bạn có thể muốn làm một cái gì đó sau khi một công việc chạy. Các phương pháp

*/5 * * * * /usr/bin/php /opt/test.php
94 cung cấp cho bạn sự linh hoạt để làm bất cứ điều gì bạn muốn sau khi thực hiện công việc. Đầu ra của công việc sẽ được đưa vào chức năng này. Ví dụ: bạn có thể muốn thêm một mục vào nhật ký của mình, ping một url, v.v. Theo mặc định, công việc sẽ buộc phải chạy ở nền trước (vì đầu ra được đưa vào hàm), nếu bạn không cần đầu ra, bạn có thể chuyển
*/5 * * * * /usr/bin/php /opt/test.php
88 làm tham số thứ hai để cho phép thực thi ở chế độ nền (trong trường hợp này

* * * * * path/to/phpbin path/to/scheduler.php 1>> /dev/null 2>&1
7

Sử dụng "before" và "then" cùng nhau

* * * * * path/to/phpbin path/to/scheduler.php 1>> /dev/null 2>&1
8

Nhiều lịch trình chạy

Trong một số trường hợp, bạn có thể cần chạy bộ lập lịch nhiều lần trong cùng một tập lệnh. Mặc dù đây không phải là trường hợp phổ biến, nhưng các phương pháp sau đây sẽ cho phép bạn sử dụng lại cùng một phiên bản của trình lập lịch biểu

* * * * * path/to/phpbin path/to/scheduler.php 1>> /dev/null 2>&1
9

Một phương pháp hữu ích khác nếu bạn đang sử dụng lại cùng một phiên bản của trình lập lịch trình với các công việc khác nhau (e. g. công việc đến từ một nguồn bên ngoài - db, tệp. ) trong mỗi lần chạy, là để xóa các công việc đã lên lịch hiện tại

$scheduler->php('path/to/my/script.php');
0

Làm giả thời gian chạy bộ lập lịch

Khi chạy bộ lập lịch, bạn có thể vượt qua một

*/5 * * * * /usr/bin/php /opt/test.php
66 để giả mạo thời gian chạy bộ lập lịch. Lý do cho tính năng này được mô tả ở đây;

$scheduler->php('path/to/my/script.php');
1

thất bại trong công việc

Nếu một số công việc không thành công, bạn có thể truy cập danh sách các công việc không thành công và lý do thất bại

$scheduler->php('path/to/my/script.php');
2

Người làm việc

Bạn có thể mô phỏng một cronjob bằng cách bắt đầu một công nhân. Hãy xem một ví dụ đơn giản

$scheduler->php('path/to/my/script.php');
3

Đoạn mã trên bắt đầu một công nhân sẽ chạy công việc của bạn mỗi phút. Đây có nghĩa là một công cụ kiểm tra/gỡ lỗi, nhưng bạn có thể tự do sử dụng nó theo bất kỳ cách nào bạn muốn. Bạn có thể tùy ý chuyển một mảng "giây" khi bạn muốn nhân viên chạy công việc của bạn, ví dụ bằng cách chuyển

*/5 * * * * /usr/bin/php /opt/test.php
98, nhân viên sẽ chạy công việc của bạn ở giây 0 và giây 30 của phút

$scheduler->php('path/to/my/script.php');
4

Bạn nên chạy worker riêng biệt với bộ lập lịch của mình, mặc dù bạn có thể chạy worker trong bộ lập lịch của mình. Sự cố xảy ra khi bộ lập lịch của bạn có một hoặc nhiều công việc đồng bộ và nhân viên sẽ phải đợi công việc của bạn hoàn thành trước khi tiếp tục vòng lặp. Ví dụ

$scheduler->php('path/to/my/script.php');
5

Ở trên sẽ bỏ qua nhiều lần thực hiện, vì vậy nó sẽ không chạy nữa mỗi phút nhưng nó sẽ chạy cứ sau 2 hoặc 3 phút. Thay vào đó, cách tiếp cận ưa thích sẽ là tách nhân viên khỏi bộ lập lịch của bạn

$scheduler->php('path/to/my/script.php');
6

$scheduler->php('path/to/my/script.php');
7

Sau đó, trong dòng lệnh của bạn chạy

*/5 * * * * /usr/bin/php /opt/test.php
99. Điều này sẽ bắt đầu một quá trình tiền cảnh mà bạn có thể giết bằng cách thoát khỏi lệnh

Công nhân không có nghĩa là thu thập bất kỳ dữ liệu nào về các lần chạy của bạn và như đã nói, nó có nghĩa là một công cụ kiểm tra/gỡ lỗi