4

我有一个与操作系统的 CLI 交互的 PHP 脚本,我希望这个脚本可以在不同的 Linux 发行版上运行,所以我必须以不同的方式与不同的 Linux falvours 交互以实现某些目标,但我找不到 PHP 的方法区分它们。

我试过使用php_uname('s')PHP_OS他们都回来了Linux;这对我没有任何用处(我在 Arch Linux 上进行测试)

我在问这个问题,因为-例如-如果我想在 Ubuntu 中管理服务/守护程序,我将使用service命令,而在 Arch 中将使用systemctl命令,所以不知道哪个 Linux 发行版正在运行我的 PHP 脚本我没有办法处理这样的问题。

4

2 回答 2

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;
    
    }  }
    
于 2013-05-02T12:57:09.563 回答
1

PHP uname 通常会返回uname控制台中的内容,通常是 Linux 内核。由于不同的发行版有不同的方式来告诉他们的版本,我不能为所有这些建议一个明确的方法,但是,请阅读:http ://www.cyberciti.biz/faq/find-linux-distribution-name-版本号/

将它与 php 结合起来exec

于 2013-05-02T09:36:44.190 回答