Есть ли в PHP способ определить имя дистрибутива Linux для удаленного сервера?
Извлечение из $_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 (), но получил ошибку.
Неустранимая ошибка: вызов неопределенной функции posix_uname ()
В системе 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
Поле лучше всего подходит для определения дистрибутива, так как оно определено Стандартной базой Linux и должно присутствовать в общих дистрибутивах.
Кстати, я бы порекомендовал не использовать exec()
или же system()
читать файлы, потому что они отключены на многих серверах по соображениям безопасности. (Кроме того, это не имеет смысла, потому что PHP может самостоятельно читать файлы. И если он не может их читать, то это также будет невозможно из-за системного вызова.)
Попробуйте 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
Возможный дубликат вопроса упомянутое выше дорого, чтобы узнать распределение. Я получил быстрое и простое решение, используя 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)
)
Кредиты: Как: узнать имя и версию моего дистрибутива Linux