赵瑞兰 / 分批处理
此库提供了一种在Unix cron作业不可用时的批量处理方法。当需要处理大量数据或执行耗时任务,且cron不可用时,例如在低级共享托管上,这非常有用。
Requires
- php: >=7.1
- doctrine/dbal: ^3.0
README
此库提供了一种在Unix cron作业不可用时的批量处理方法。
当需要处理大量数据或执行耗时任务,且cron不可用时,例如在低级共享托管上,这非常有用。
概览
此库提供了一个基类,您可以从中扩展,用于管理模拟的cron作业或分批作业。
提供了一个基类来定义批量作业。
使用守护进程来管理这些作业。
守护进程将运行作业。单个运行通常由多个迭代组成。
守护进程记录每次运行的时长,记录迭代的数量,并管理作业运行的频率,根据需要限制迭代次数,并限制任何给定运行的持续时间。当达到每次运行的最大迭代次数或最大毫秒数已过时,运行将终止。
要求
- PHP >= 7.1(用于Doctrine)
- MySQL >= 5.6.4(用于分数秒)
要求(测试)
- WordPress安装在上一个目录
- MySQL ini文件中的max_allowed_packet > 5M
附带的测试文件计算前50000个素数,并将这些数据填充到数据库内存中的CSV文件。完成后,结果将写入磁盘。这是一大批数据,需要更高的包大小。
在实际应用中,建议实现使用文件指针或类似策略的策略,而不是在作业状态中处理整个数据集。
要求(构建)
- 您需要运行
npm install
来安装构建此库的自动加载器使用的节点模块,并在命令行上运行gulp
来监控PHP文件并动态调整类自动加载器。
安装
我建议使用Composer安装此包。
可扩展性
这些说明假定您正在使用WordPress,这是目前唯一支持的框架。
此库使用Doctrine进行数据库交互。有可能在此库的Connection
类上进行扩展,以添加更多集成,可以使用Doctrine连接的任何数据库与此库一起使用。
用法
请参阅test.php
中的示例,以获取逐步实现说明。
数据库连接
此库使用Doctrine进行数据库交互,可能兼容Doctrine可以工作的任何数据库。
Connection::$instance
必须包含一个\Doctrine\DBAL\Connection
实例,以便库可以正常工作。
提供了一个方便的函数来在WordPress环境中工作
\PerryRylance\SplitBatch\Connection::fromWordPress()
将基于wp-config.php
中定义的常量(和表前缀)初始化Connection::$instance
。因此,此连接必须在WordPress的配置文件加载后设置。
启动守护进程
此库使用一个守护进程来监督设置数据库表并实际运行作业。
在设置您的Connection
后,您需要实例化守护进程。
$daemon = new \PerryRylance\SplitBatch\Daemon();
如果需要,守护进程将初始化数据库表。
定义一个任务
- 通过继承
\PerryRylance\SplitBatch\Job
来开始使用这个库。 - 您需要在
Job
的子类中实现抽象函数init
。- 在您的
Job
中设置frequency
(毫秒)将调整Job
可以再次运行的最小毫秒数。 - 在您的
Job
中设置max_iterations
将调整Job
在一次运行中允许的最大迭代次数。 - 在您的
Job
中设置max_period
将为运行定义一个时间限制。 Job
上的state
属性是您需要保存迭代器状态的地方,例如,您当前正在处理的电子表格中的哪一行,表示文件指针的字节游标,或者您需要跟踪任何给定任务状态的任何其他东西。
- 在您的
- 您需要在
Job
的子类中实现抽象函数iterate
。这项工作将在该函数中完成。- 您的迭代函数应该在达到完成状态后调用
success
或abort
,无论它是成功完成还是失败。 - 如果您的迭代函数想要停止迭代,它应该返回
false
。这可以与上面结合使用,或者,它可以用来自动停止迭代而不会销毁任务,当您根据某种自定义条件想要停止当前运行的迭代时。 - 一旦任务完成,无论是成功还是中断,该任务将从数据库中删除。您可以通过覆盖
success
、abort
或complete
来执行在此点需要的任何操作(例如,记录日志)。
- 您的迭代函数应该在达到完成状态后调用
实例化您的任务
- 使用静态方法
Job::create
来创建您的任务实例。您必须传递您任务的完全限定类名,后跟一个 handle,该 handle 将用来唯一标识这个任务实例。- 如果这个 handle 对应的任务不存在,它将被创建,并且将在任务上调用
init
。 - 如果这个 handle 对应的任务已经存在,实例数据将从数据库中加载,类将被实例化,并且您将从数据库中接收到现有的任务。这通常不是必需的,但提供了方便。建议您在子类内部实现所有逻辑,而不是在对象外部工作。
- 如果这个 handle 对应的任务不存在,它将被创建,并且将在任务上调用
运行守护进程
- 在先前创建的守护进程中调用
$daemon->run();
。守护进程将运行所有相关的任务,同时管理迭代限制、计时和调度。
运行示例
如果您想运行这个库包含的示例,请确保已经设置了一个有效的 WordPress 安装,并且您的 web 服务器正在提供它。
将此存储库提取或克隆到您的 web 根目录下方的子文件夹中,然后访问服务器上的 /SplitBatch/test.php
。
测试将读取一个包含 50,000 行的输入 CSV 文件。然后它将为每一行开始计算第 n 个素数。
测试脚本将每 1 秒重载一次,以触发另一个迭代,直到任务完成并且找到所有 50,000 个素数。
此时结果将写入 test-result.csv
并通过浏览器下载。
根据服务器性能,您可能会看到很高的迭代次数(高达 10,000 次),可能会在默认的 1,000ms 执行时间限制内完成。
随着任务的进行,您可能会看到 1,000ms 的限制被触及,而完成的迭代次数低于 10,000 次。由于在这个示例中找到素数所使用的算法的性质,这会逐渐变慢,直到任务完成。