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

时间:2017-05-24 15:23:14

标签: php python mysql server cron

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

因此,用户应该设置脚本执行的时间范围,如果多个用户选择相同的时间范围,我无法弄清楚如何执行此操作。

感谢您的想法。

1 个答案:

答案 0 :(得分:1)

结帐crongearman

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

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

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

  2. 作业执行者 - 此脚本执行单个作业。由于Gearman为您处理并发性,您只需担心在此处执行一个长时间运行的过程。

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

    这是一些伪代码,可以帮助您了解这是如何工作的:

    <强> initiate.php

    <?php
    
    $gearmanClient= new GearmanClient();
    $gearmanClient->addServer();
    
    $workloads = fetchWorkloads(time());
    
    foreach ($workloads as $workload) {
      $gearmanClient->doBackground('execute', json_encode($workload));
    }
    

    <强> execute.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来确保您的工作人员在不可避免地遇到问题时重新启动等。您的主管配置可能如下所示:

    [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