我想在服务器上执行一个php或python脚本,其中包含来自数据库的值,每天在用户定义的时间范围内进行n分钟,我也希望将其存储在数据库中。所以我的问题是:我怎样才能以最高性能和可扩展的方式实现这一目标?
因此,用户应该设置脚本执行的时间范围,如果多个用户选择相同的时间范围,我无法弄清楚如何执行此操作。
感谢您的想法。
答案 0 :(得分:1)
两者都是在Linux上运行的服务,能够以可预测和可扩展的方式执行PHP或Python脚本。
你机制的基本结构是......
作业启动器 - 此脚本将由cron自动调用(每分钟最多)。它会很快执行然后退出。您可以使用它来检查数据库中是否应该在该分钟内启动的作业,并将它们传递给Gearman。
作业执行者 - 此脚本执行单个作业。由于Gearman为您处理并发性,您只需担心在此处执行一个长时间运行的过程。
您可以轻松配置Gearman来处理许多并发作业。此外,Python和PHP都有很好的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