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

我有一个PHP脚本与操作系统的CLI进行交互,我期待这个脚本运行在不同的Linux发行版上,所以我必须以不同的方式与不同的Linux操作系统进行交互以实现某些function,但是我找不到一种方法让PHP区分它们。

我试过使用php_uname('s')PHP_OS他们都返回Linux ; 这对我没有任何用处(我在Arch Linux上testing)

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

我发现这个问题的一个灵活的解决方案。 这是通过从/ etc目录查找发布文件(而不是打印真正的INSIDE文件),所以如果我在Arch Linux上运行这个脚本,它会检查/etc目录中的arch-release文件等其他Linux发行版。

代码如下:

重要笔记:

  • 如果你不修改php.ini文件并且允许它对其执行文件操作,PHP将不会扫描/etc目录(修改open_basedir选项,在:/etc/结尾加上open_basedir

  • 下面代码中可识别发行版的列表很容易扩展,你需要的只是发行版的名字(例如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(ie Distro name) by value(ie distro release file) $OSDistro = array_search($distroReleaseFile, $distros); break 2;//Break inner and outer loop. } } } return $OSDistro; } } 

PHP uname通常会在控制台(通常是Linux内核)中返回uname 。 由于不同的发行版本有不同的版本说明方式,所以我不能为它们提供一个清晰的方法,但是请阅读http://www.cyberciti.biz/faq/find-linux-distribution-name-版本号/

结合php的exec