前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP轻量级作业调度器 Cron Scheduler

PHP轻量级作业调度器 Cron Scheduler

作者头像
Tinywan
发布2024-04-15 10:55:33
940
发布2024-04-15 10:55:33
举报
文章被收录于专栏:开源技术小栈开源技术小栈

简介

过去,你可能需要在服务器上为每一个调度任务去创建 Cron 条目。因为这些任务的调度不是通过代码控制的,你要查看或新增任务调度都需要通过 SSH 远程登录到服务器上去操作,所以这种方式很快会让人变得痛苦不堪。

PHP Cron Scheduler 是一个与框架无关的cron作业调度程序,可以轻松地与您的项目集成或作为独立的命令调度程序运行。在使用这个任务调度器时,你只需要在你的服务器上创建单个 scheduler.php 入口。你的任务调度在scheduler.php方法中进行定义。

Github仓库:https://github.com/peppeocchi/php-cron-scheduler

如何工作

在项目根目录下创建一个包含以下内容的 scheduler.php 文件。

代码语言:javascript
复制
<?php 

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();

然后在crontab中添加一个新条目,以便每分钟运行 scheduler.php

代码语言:javascript
复制
* * * * * path/to/phpbin path/to/scheduler.php 1>> /dev/null 2>&1

就是这样!您的调度程序已经启动并运行,现在您可以添加您的作业,而无需再担心crontab。这个Cron每分钟都会调用scheduler.php命令调度器。然后评估你的计划任务并运行到期的任务。

调度作业

默认情况下,您的所有作业将尝试在后台运行。PHP脚本和原始命令默认情况下将在后台运行,而函数将始终在前台运行。您可以通过调用 inForeground() 方法强制命令在前台运行。必须将输出发送到电子邮件的作业将在前台运行。

执行一个PHP脚本
代码语言:javascript
复制
$scheduler->php('path/to/my/script.php');

php()方法接受4个参数:

  • PHP脚本的路径.
  • 要使用的PHP二进制
  • 要传递给脚本的参数(注意:您需要在php.ini中启用register_argc_argv才能使其工作(ref)。不要担心它是默认启用的,所以除非你故意禁用它,或者你的主机默认禁用它,否则你可以忽略它。
  • 标识符
代码语言:javascript
复制
$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'
);
调度原始命令
代码语言:javascript
复制
$scheduler->raw('ps aux | grep httpd');

raw()方法接受3个参数:

  • 你的命令.
  • 要传递给命令的参数
  • 标识符
代码语言:javascript
复制
$scheduler->raw(
    'mycommand | myOtherCommand',
    [
        '-v' => '6',
        '--silent' => null,
    ],
    'myCustomIdentifier'
);
调度匿名函数
代码语言:javascript
复制
$scheduler->call(function () {
    return true;
});

call()方法接受3个参数:

  • 匿名函数
  • 要传递给函数的参数
  • 标识符
代码语言:javascript
复制
$scheduler->call(
    function ($args) {
        return $args['user'];
    },
    [
        ['user' => $user],
    ],
    'myCustomIdentifier'
);

所有传入数组的参数都将被注入到函数中。例如:

代码语言:javascript
复制
$scheduler->call(
    function ($firstName, $lastName) {
        return implode(' ', [$firstName, $lastName]);
    },
    [
        'John',
        'last_name' => 'Doe', // The keys are being ignored
    ],
    'myCustomIdentifier'
);

如果你想传递一个key => value对,请在arguments数组中传递一个数组

代码语言:javascript
复制
$scheduler->call(
    function ($user, $role) {
        return implode(' ', [$user['first_name'], $user['last_name']]) . " has role: '{$role}'";
    },
    [
        [
            'first_name' => 'John',
            'last_name' => 'Doe',
        ],
        'Admin'
    ],
    'myCustomIdentifier'
);
计划执行时间

有几种方法可以帮助您设置计划的执行时间。如果您不调用此方法中的任何一个,则作业将每分钟(*)运行一次。

任何表达式

at -此方法接受dragonmantank/cron-expression支持的任何表达式

代码语言:javascript
复制
$scheduler->php('script.php')->at('* * * * *');
每分钟执行

everyMinute 每分钟执行。您可以选择传递 minute 以指定作业每 minute 分钟运行一次。

代码语言:javascript
复制
$scheduler->php('script.php')->everyMinute();
$scheduler->php('script.php')->everyMinute(5);
每小时运行

hourly 每小时运行一次。您可以选择传递您想要运行的 $minute ,默认情况下,它将在每小时的'00'分钟运行。

代码语言:javascript
复制
$scheduler->php('script.php')->hourly();
$scheduler->php('script.php')->hourly(53);
每天运行

daily 每天运行一次。您可以选择传递 hour 和 minute 以获得更细粒度的控制(或字符串 hour:minute )

代码语言:javascript
复制
$scheduler->php('script.php')->daily();
$scheduler->php('script.php')->daily(22, 03);
$scheduler->php('script.php')->daily('22:03');

项目应用

项目根目录 scheduler.php 文件

代码语言:javascript
复制
<?php
declare(strict_types=1);

namespace think;

date_default_timezone_set('PRC');

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

# PHP 二进制文件路径
$bin = '/usr/local/php-8.2/bin/php';
$script = __DIR__ . '/think';

$scheduler = new \GO\Scheduler();

# 2024年4月10日 @add Tinywan 订单自动发货 每天一次凌晨12点半执行
$scheduler->php($script . ' order delivery', $bin)->daily(00, 30);

# 2024年4月10日 @add Tinywan 订单自动取消 5分钟执行一次
$scheduler->php($script . ' order cancel', $bin)->everyMinute(5);

$scheduler->run();
本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-04-09,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 开源技术小栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 如何工作
  • 调度作业
    • 执行一个PHP脚本
      • 调度原始命令
        • 调度匿名函数
          • 计划执行时间
          • 项目应用
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
          http://www.vxiaotou.com