如果PHP在Linux上运行; 如何获得具体的分发(Ubuntu,fedora等)?

Abd*_*ziz 3 php linux operating-system archlinux

我有一个与OS的CLI交互的PHP脚本,我希望这个脚本可以在不同的Linux发行版上运行,所以我必须以不同的方式与不同的Linux falvours进行交互才能实现某些功能,但我无法找到适合PHP的方法.区分它们.

我尝试过使用php_uname('s'),PHP_OS他们都回来了Linux; 这对我没什么用(我在Arch Linux上测试)

我问这个问题,因为 - 例如 - 如果我想在Ubuntu中管理服务/守护进程我将使用该service命令,并且在Arch中使用该systemctl命令,因此不知道哪个Linux发行版正在运行我的PHP脚本我无法解决这些问题.

Abd*_*ziz 6

我找到了解决这个问题的灵活方案.这是通过查找/ etc目录中的发布文件(而不是打印文件中的实际内容),所以如果我在Arch Linux上运行这个脚本,它将检查目录中的arch-release文件/etc,依此类推其他Linux发行版.

这是代码:

重要笔记:

  • /etc如果你不修改php.ini文件并允许它对它进行文件操作,PHP将不会扫描目录(修改open_basedir选项,通过添加:/etc/到最后.)

  • 以下代码中可识别的发行版列表很容易扩展,您需要的只是发行版的漂亮名称(例如Ubuntu)及其发布文件的名称(例如lsb-release).有关着名的Linux发行版的完整列表,请单击此处.

    function getLinuxDistro()
        {
            //declare Linux distros(extensible list).
            $distros = array(
                    "Arch" => "arch-release",
                    "Debian" => "debian_version",
                    "Fedora" => "fedora-release",
                    "Ubuntu" => "lsb-release",
                    'Redhat' => 'redhat-release',
                    'CentOS' => 'centos-release');
        //Get everything from /etc directory.
        $etcList = scandir('/etc');
    
        //Loop through /etc results...
        $OSDistro;
        foreach ($etcList as $entry)
        {
            //Loop through list of distros..
            foreach ($distros as $distroReleaseFile)
            {
                //Match was found.
                if ($distroReleaseFile === $entry)
                {
                    //Find distros array key(i.e. Distro name) by value(i.e. distro release file)
                    $OSDistro = array_search($distroReleaseFile, $distros);
    
                    break 2;//Break inner and outer loop.
                }
            }
        }
    
        return $OSDistro;
    
    }  }
    
    Run Code Online (Sandbox Code Playgroud)