您可以同时运行脚本popen()
并稍后获取输出fread()
.
//execute
foreach ($model as $server) {
$server->handles = [
popen('sudo path/to/total_cpu_usage.sh '.$server->server_addr, 'r'),
popen('sudo path/to/total_memory_usage.sh '.$server->server_addr, 'r'),
popen('sudo path/to/disk_space.sh '.$server->server_addr, 'r'),
popen('sudo path/to/inode_space.sh '.$server->server_addr, 'r'),
popen('sudo path/to/network.sh '.$server->server_addr, 'r'),
];
}
//grab and store the output, then close the handles
foreach ($model as $server) {
$server->cpu_usage = fread($server->handles[0], 4096);
$server->mem_usage = fread($server->handles[1], 4096);
$server->disk_space = fread($server->handles[2], 4096);
$server->inode_space = fread($server->handles[3], 4096);
$server->network = fread($server->handles[4], 4096);
foreach($server->handles as $h) pclose($h);
}
//print everything
print_r($model);
我测试了类似的代码来执行 5 个休眠 2 秒的脚本,整个过程只花了 2.12 秒
而不是 10.49 秒shell_exec()
.
更新1:非常感谢马库斯·奥 https://stackoverflow.com/users/4630325指出优化潜力。
更新2:修改了代码以消除覆盖的可能性。
结果现在在里面$model
.
这还可以显示哪个服务器拒绝连接,以防有关 sshd 的问题影响您。