【发布时间】:2021-02-20 22:21:10
【问题描述】:
我有以下函数试图在 Mac 上检索 CPU 使用率:
public function getCPUUsage()
{
$cpuload = (float)exec("ps -A -o %cpu | awk '{s+=$1} END {print s}'");
$cpu_cores = (int)exec("sysctl -a | grep 'machdep.cpu.core_count' | awk '{print $2}'");
return $cpuload / $cpu_cores;
}
当我在修补程序中调用它时,它可以工作:
vpn-self-service mathewparet$ php artisan tinker
usePsy Shell v0.10.4 (PHP 7.3.11 — cli) by Justin Hileman
>>> use SystemInfo;
>>> SystemInfo::getCPUUsage();
=> 9.6
>>> exit
Exit: Goodbye
vpn-self-service mathewparet$
但是当在控制器中调用它时,它的 cpu_cores 返回为 0
<?php
namespace App\Http\Controllers\Admin;
use Illuminate\Http\Request;
use SystemInfo;
class SystemStatusController extends \App\Http\Controllers\Controller
{
/**
* Handle the incoming request.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function __invoke(Request $request)
{
$cpu = SystemInfo::getCPUUsage();
return compact('cpu');
}
}
在 tinker 和控制器中调用相同的方法。但是当通过 tinker cpu cores > 0 调用时(这是我所期望的)但是在控制器上执行相同操作时 cpu cores 返回为 0 导致 getCPUUsage() 中的下一条语句失败并被零除。
【问题讨论】:
-
这是因为webserver用户(可能是
www-data)没有执行命令的权限。为了证明这一点,您可以创建一个仅包含getCPUUsage()内容的最小测试 PHP 脚本,然后在浏览器中运行它。 -
我使用 Laravel Valet 来运行网站。 Valet 和 Tinker 都以同一个用户身份运行。
-
我刚刚运行了
posix_getpwuid(posix_geteuid())['name'];来查看脚本被调用为哪个用户。在修补程序和网络服务器中都被称为我自己的用户帐户。