在后台执行PHP不会毫不拖延地工作

时间:2014-02-18 21:49:34

标签: php asynchronous exec simultaneous

我需要每隔5分钟ping几台服务器,总共需要超过30秒。所以我认为我使用exec命令在后台执行此操作:

function execInBackground($cmd) { 
    if (substr(php_uname(), 0, 7) == "Windows"){ 
        pclose(popen("start /B ". $cmd, "r"));  
    } 
    else { 
        exec($cmd . " > /dev/null &");   
    } 
} 

$result  = mysql_query("SELECT `id` FROM `servers` ORDER BY `id`");

while ($server_data = mysql_fetch_array($result, MYSQL_ASSOC)) {

    sleep(1);
    execInBackground("php server_updater.php " . $server_data['id']);

}

如你所见,我加了一秒睡眠。这是我不想要的,因为我必须检查超过30台服务器。好吧,如果我没有设置1秒睡眠,则更新脚本会因在线的几台服务器而失败:

更新脚本获取应从上面的脚本更新的服务器的ID,然后运行查询以检查服务器状态。如果成功,则在数据失败时将数据输入数据库,将数据库中的服务器条目更新为脱机。

根据mysql_query,这仅适用于内部数据,用户无法修改任何内容。

您如何看待,如果没有睡眠,为什么某些服务器检查会失败。您可以推荐哪种优化或更好的方式?

2 个答案:

答案 0 :(得分:1)

当您尝试同时执行所有30多个脚本时,您的(共享?)服务器可能会耗尽资源(内存,进程数等)。

我会使用像队列和调度程序(Linux中的cron)之类的东西,例如参见this answer。总之,您“签出”一批要更新的记录并按顺序处理它们。

这取决于您拥有的资源,但您可以同时运行多个作业,每个作业一个接一个地处理您的队列(不需要异步exec()调用)。 / p>

您还应该查看表锁定,以确保没有任何记录被多个版本的脚本“检出”。

答案 1 :(得分:0)

虽然没有回答后台问题,但这个答案可能会有所帮助:

对于存储时间序列数据RRDtool是一个很好的解决方案。它会随着时间的推移节省大量数据,并将此数据转换为类似图表

enter image description here

此外,我建议使用专家监控解决方案。一个具有良好的系统状态可视化表示的解决方案ist CACTI。来自CACTI website

enter image description here