2013-05-02 41 views
3

我有一個PHP腳本與操作系統的CLI進行交互,我期待這個腳本在不同的Linux發行版上運行,所以我必須以不同的方式與不同的Linux操作系統進行交互以實現某些功能,但是我找不到方法PHP來區分它們。如果PHP在Linux上運行;如何獲得具體的分佈(Ubuntu,Fedora等)?

我試過使用php_uname('s')PHP_OS它們都返回Linux;這對我沒有任何用處(我在Arch Linux上測試)

我在問這個問題,因爲 - 例如,如果我想在Ubuntu中管理服務/守護程序,我將使用service命令,並在Arch病號使用systemctl命令,所以不知道哪個Linux發行版運行我的PHP腳本,我無法處理這些問題。

+1

你試過'回聲EXEC( 「貓的/ etc/* - 釋放」);'? – HamZa 2013-05-02 09:34:55

+0

@HamZaDzCyber​​DeV我實際上正在考慮這種方法,但它是否適用於所有(大多數)Linux發行版? – Abdulaziz 2013-05-02 09:38:56

+0

我不知道... – HamZa 2013-05-02 09:40:24

回答

6

我發現了一個靈活的解決方案這個問題。這是通過查找/ etc目錄中的發佈文件(而不是打印實際存在於文件中的內容),因此如果我在Arch Linux上運行此腳本,它將檢查/etc目錄中的arch-release文件,等等在其他Linux發行版上。

下面的代碼:

重要提示:

  • PHP不會掃描/etc目錄,如果您不要修改php.ini文件並使其允許這樣做就可以了文件操作(修改open_basedir選項,在末尾添加:/etc/

  • 以下代碼中可識別發行版的列表是容易擴展,你需要的只是發行版的美名(例如, Ubuntu)及其發佈文件的名稱(例如lsb-release)。有關着名Linux發行版的完整列表,click here

    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; 
    
    } }