赵瑞兰/分批处理

此包已被废弃,不再维护。未建议替代包。

此库提供了一种在Unix cron作业不可用时的批量处理方法。当需要处理大量数据或执行耗时任务,且cron不可用时,例如在低级共享托管上,这非常有用。

1.0.2 2020-12-25 09:46 UTC

This package is auto-updated.

Last update: 2024-03-25 17:14:34 UTC


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

如果需要,守护进程将初始化数据库表。

定义一个任务

  1. 通过继承 \PerryRylance\SplitBatch\Job 来开始使用这个库。
  2. 您需要在 Job 的子类中实现抽象函数 init
    • 在您的 Job 中设置 frequency(毫秒)将调整 Job 可以再次运行的最小毫秒数。
    • 在您的 Job 中设置 max_iterations 将调整 Job 在一次运行中允许的最大迭代次数。
    • 在您的 Job 中设置 max_period 将为运行定义一个时间限制。
    • Job 上的 state 属性是您需要保存迭代器状态的地方,例如,您当前正在处理的电子表格中的哪一行,表示文件指针的字节游标,或者您需要跟踪任何给定任务状态的任何其他东西。
  3. 您需要在 Job 的子类中实现抽象函数 iterate。这项工作将在该函数中完成。
    • 您的迭代函数应该在达到完成状态后调用 successabort,无论它是成功完成还是失败。
    • 如果您的迭代函数想要停止迭代,它应该返回 false。这可以与上面结合使用,或者,它可以用来自动停止迭代而不会销毁任务,当您根据某种自定义条件想要停止当前运行的迭代时。
    • 一旦任务完成,无论是成功还是中断,该任务将从数据库中删除。您可以通过覆盖 successabortcomplete 来执行在此点需要的任何操作(例如,记录日志)。

实例化您的任务

  1. 使用静态方法 Job::create 来创建您的任务实例。您必须传递您任务的完全限定类名,后跟一个 handle,该 handle 将用来唯一标识这个任务实例。
    • 如果这个 handle 对应的任务不存在,它将被创建,并且将在任务上调用 init
    • 如果这个 handle 对应的任务已经存在,实例数据将从数据库中加载,类将被实例化,并且您将从数据库中接收到现有的任务。这通常不是必需的,但提供了方便。建议您在子类内部实现所有逻辑,而不是在对象外部工作。

运行守护进程

  1. 在先前创建的守护进程中调用 $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 次。由于在这个示例中找到素数所使用的算法的性质,这会逐渐变慢,直到任务完成。