php - 在用户定义的时间范围内执行脚本 n 分钟

标签 php python mysql server cron

我想在用户定义的时间范围内每天使用数据库中的值在服务器上执行 php 或 python 脚本 n 分钟,我也想将其存储在数据库中。所以我的问题是:如何以最高性能和可扩展性的方式实现这一目标?

所以用户应该设置执行脚本的时间范围,如果多个用户选择相同的时间范围,我无法弄清楚我该怎么做。

感谢您的想法。

最佳答案

查看 crongearman .

两者都是在 Linux 上运行的服务,能够以可预测和可扩展的方式执行 PHP 或 Python 脚本。

你的机制的基本结构是......

  1. Job initiator - 此脚本将由 cron 自动调用(最多每分钟一次)。它会很快执行然后退出。您将使用它来检查数据库中应该在那一分钟内启动的作业,并将它们传递给 Gearman。

  2. 作业执行器 - 此脚本执行单个作业。由于 Gearman 会为您处理并发,因此您只需在这里处理一个长时间运行的进程。

您可以轻松配置 Gearman 来处理许多并发作业。此外,Python 都有很好的 Gearman 软件包和 PHP (我都成功地使用了它们)。

这里有一些伪代码可以帮助您理解它是如何工作的:

initiate.php

<?php

$gearmanClient= new GearmanClient();
$gearmanClient->addServer();

$workloads = fetchWorkloads(time());

foreach ($workloads as $workload) {
  $gearmanClient->doBackground('execute', json_encode($workload));
}

执行.php

<?php

$gearmanWorker = new GearmanWorker();
$gearmanWorker->addServer();
$gearmanWorker->addFunction('execute', 'executeMethod');

while($gearmanWorker->work()) {
  // Handle any errors here
}

function executeMethod($job) 
{
  $workload = json_decode($job->workload());

  while (time() < $workload->stopTime) {
    // Do your task for an amount of time here
  }
}

同样,这只是伪代码。您需要根据您的要求充实它。显然,您还需要学习、安装和/或配置 cron 和 Gearman。

您的 cron 条目可能如下所示:

* * * * * www-data php /var/www/my-app/initiate.php

对于 Gearman,我建议使用 supervisor以确保您的 worker 在不可避免地遇到问题时重新启动等。您的主管配置可能如下所示:

[program:myProgram]
user=www-data
command=php /var/www/my-app/initiate.php
numprocs=1
stdout_logfile=/var/log/supervisord.log
autostart=true
autorestart=true
stopsignal=KILL

关于php - 在用户定义的时间范围内执行脚本 n 分钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44162588/

相关文章:

php - 添加到列的数值

php - 如何在 pdo oracle(oci) 中将字符集设置为 UTF8

php - Codeigniter RESTful 建模和 Controller

php - 处理不断更新的mysql表的最佳方法

python - 查找多个出现作为较大模式的一部分

Python - 创建有意义的崩溃日志/崩溃报告

php - 什么更有效率?大量 SQL 查询或循环遍历它们?

php - Youtube 和 Wikipedia 使用了 PHP 框架吗?

Python 3.2 - uWSGI 进程出现段错误

mysql - 弹性和关系数据库