gpt4 book ai didi

PHP并发运行多个脚本

转载 作者:可可西里 更新时间:2023-11-01 13:46:47 25 4
gpt4 key购买 nike

我有一个像这样的对象服务器数组:

Array
(
[0](
(
[id] => 1
[version] => 1
[server_addr] => 192.168.5.210
[server_name] => server1
)
)
[1](
(
[id] => 2
[server_addr] => 192.168.5.211
[server_name] => server2
)
)
)

通过运行下面的代码,我能够得到想要的输出

foreach ($model as $server) {
$cpu_usage = shell_exec('sudo path/to/total_cpu_usage.sh '.$server->server_addr);
$memory_usage = shell_exec('sudo path/to/total_memory_usage.sh '.$server->server_addr);
$disk_space = shell_exec('sudo path/to/disk_space.sh '.$server->server_addr);
$inode_space = shell_exec('sudo path/to/inode_space.sh '.$server->server_addr);
$network = shell_exec('sudo path/to/network.sh '.$server->server_addr);
exec('sudo path/to/process.sh '.$server->server_addr, $processString);
$processArray = array();
foreach ($processString as $i) {
$row = explode(" ", preg_replace('/\s+/', ' ', $i));
array_push($processArray,$row);
}
$datetime = shell_exec('sudo path/to/datetime.sh '.$server->server_addr);
echo $cpu_usage;
echo $mem_usage;
echo $disk_space;
......
}

我的脚本类似于:

#!/bin/bash
if [ "$1" == "" ]
then
echo "To start monitor, please provide the server ip:"
read IP
else
IP=$1
fi

ssh root@$IP "date"

但是 5 台服务器的整个过程花费了 10 秒,而 1 台服务器的时间不到 2 秒。这是为什么?有什么办法可以缩短时间吗?我的猜测是 exec 命令在进入下一个循环之前正在等待将输出分配给变量?我试着用谷歌搜索了一下,但大部分答案都是没有返回任何输出的……不过我需要输出

最佳答案

您可以使用 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 秒而不是使用 shell_exec() 时的 10.49 秒。

更新 1:非常感谢 Markus AO指出优化潜力。

更新 2: 修改了代码以消除覆盖的可能性。结果现在在 $model 中。

这还可以显示哪个服务器拒绝了连接,以防有关 sshd 的问题影响到您。

关于PHP并发运行多个脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41298624/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com