2014-11-11 3 views
2

Есть ли способ в PHP выяснить имя дистрибутива Linux удаленного сервера?Получить имя дистрибутива Linux в PHP

Извлечение из $_SERVER['HTTP_USER_AGENT'] - это просто имя операционной системы клиента. Это не то, что я хочу. Я попытался php_uname()

echo 'Operating System: '.php_uname('s').'<br>'; // echo PHP_OS; 
echo 'Release Name: '.php_uname('r').'<br>'; 
echo 'Version: '.php_uname('v').'<br>'; 
echo 'Machine Type: '.php_uname('m').'<br>'; 

Но режим s возвращает только тип ядра - Linux.

Operating System: Linux 
Release Name: 2.6.32-431.29.2.el6.x86_64 
Version: #1 SMP Tue Sep 9 21:36:05 UTC 2014 
Machine Type: x86_64 

Я хочу знать, что это Fedora, CentOS или Ubuntu и т. Д. Возможно ли это? Я также пробовал posix_uname(), но получил ошибку.

Fatal error: Call to undefined function posix_uname()

+0

Возможный дубликат [Как сделать интерпретировать вывод php \ _uname] (http://stackoverflow.com/questions/21129737/how-do-i-interpret-the-output-of-php-uname) – kero

+1

Нет, не дубликат, потому что он просит распределение, а не платформа. – lxg

ответ

1

Попробуйте PHP system($call) вызова http://php.net/manual/en/function.system.php Там вы можете делать все, что вы хотите узнать нужные детали, в системе Ubuntu, вы можете, например, хотите использовать system('cat /etc/issue'); Вы можете использовать подход, где вы вызываете скрипт bash из PHP, например https://unix.stackexchange.com/questions/6345/how-can-i-get-distribution-name-and-version-number-in-a-simple-shell-script

-1

The possible duplicate question, упомянутый выше, дорого узнать распределения. Я получил простое и быстрое решение с помощью exec() и выполнив команду:

$cmd = 'cat /etc/*-release'; 
exec($cmd, $output); 
print_r($output); 

то, что результаты.

Array 
(
    [0] => CentOS release 6.6 (Final) 
    [1] => CentOS release 6.6 (Final) 
    [2] => CentOS release 6.6 (Final) 
) 

Кредиты: HowTo: Find Out My Linux Distribution Name and Version

+0

(1) Ваша команда вернет ошибку из-за дубликата 'cat'. (2) См. Мой ответ для чистого PHP-решения. Использование 'exec' здесь плохо, потому что если вы хотите поддерживать переносимость, вам следует избегать функций, которые могут быть отключены на многих хостах. – lxg

+0

@lxg Это не вернуло ошибку, и это действительно сработало, хотя это была моя опечатка. – Sithu

+0

@ lxg Спасибо за ваш ответ, но ваше решение дало мне 500 ошибок и ничего не выводило. Пожалуйста, см. Мой комментарий в своем ответе. По моему опыту, большую часть времени 'exec' действительно работает на моих серверах, возможно, это связано с VPS с корневым доступом. Он может не работать в общих хостингах в качестве вашей проблемы. – Sithu

2

В системе Linux, там, как правило, файлы, как /etc/lsb-release или /etc/os-release, которые содержат информацию о распределении.

Вы можете прочитать их в PHP и извлечь их значения:

if (strtolower(substr(PHP_OS, 0, 5)) === 'linux') 
{ 
    $vars = array(); 
    $files = glob('/etc/*-release'); 

    foreach ($files as $file) 
    { 
     $lines = array_filter(array_map(function($line) { 

      // split value from key 
      $parts = explode('=', $line); 

      // makes sure that "useless" lines are ignored (together with array_filter) 
      if (count($parts) !== 2) return false; 

      // remove quotes, if the value is quoted 
      $parts[1] = str_replace(array('"', "'"), '', $parts[1]); 
      return $parts; 

     }, file($file))); 

     foreach ($lines as $line) 
      $vars[$line[0]] = $line[1]; 
    } 

    print_r($vars); 
} 

(Не самый элегантный PHP-код, но он получает работу.)

Это даст вам массив, как:

Array 
(
    [DISTRIB_ID] => Ubuntu 
    [DISTRIB_RELEASE] => 13.04 
    [DISTRIB_CODENAME] => raring 
    [DISTRIB_DESCRIPTION] => Ubuntu 13.04 
    [NAME] => Ubuntu 
    [VERSION] => 13.04, Raring Ringtail 
    [ID] => ubuntu 
    [ID_LIKE] => debian 
    [PRETTY_NAME] => Ubuntu 13.04 
    [VERSION_ID] => 13.04 
    [HOME_URL] => http://www.ubuntu.com/ 
    [SUPPORT_URL] => http://help.ubuntu.com/ 
    [BUG_REPORT_URL] => http://bugs.launchpad.net/ubuntu/ 
) 

ID поле лучше всего подходит для определения распределения, как это определено Standard Base Linux и должны присутствовать на общих распределений.

Кстати, я бы порекомендовал не использовать exec() или system() для чтения файлов, потому что они были отключены на многих серверах по соображениям безопасности. (Кроме того, это не имеет смысла, потому что PHP может изначально читать файлы. И если он не может их прочитать, то это также будет невозможно, хотя системный вызов.)

+0

Спасибо. Не могли бы вы добавить веб-ссылку для функции 'glob', например. от php manual? И почему вы его используете? Есть ли преимущество перед обычными файловыми/dir-функциями? – Sithu

+0

И ваш код не работает. Он выдает '500 Internal Server Error'. – Sithu

+0

https://php.net/glob ... ошибка 500 может быть вызвана синтаксисом нового массива. Теперь я изменил его на старый (PHP <5.4). Если он все еще не работает, проверьте свои журналы ошибок для фактического сообщения об ошибке или увеличьте уровень сообщений об ошибках. – lxg