我需要每隔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,这仅适用于内部数据,用户无法修改任何内容。
您如何看待,如果没有睡眠,为什么某些服务器检查会失败。您可以推荐哪种优化或更好的方式?
答案 0 :(得分:1)
当您尝试同时执行所有30多个脚本时,您的(共享?)服务器可能会耗尽资源(内存,进程数等)。
我会使用像队列和调度程序(Linux中的cron)之类的东西,例如参见this answer。总之,您“签出”一批要更新的记录并按顺序处理它们。
这取决于您拥有的资源,但您可以同时运行多个作业,每个作业一个接一个地处理您的队列(不需要异步exec()
调用)。 / p>
您还应该查看表锁定,以确保没有任何记录被多个版本的脚本“检出”。
答案 1 :(得分:0)
虽然没有回答后台问题,但这个答案可能会有所帮助:
对于存储时间序列数据,RRDtool是一个很好的解决方案。它会随着时间的推移节省大量数据,并将此数据转换为类似图表:
此外,我建议使用专家监控解决方案。一个具有良好的系统状态可视化表示的解决方案ist CACTI。来自CACTI website: