В системе 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 может изначально читать файлы. И если он не может их прочитать, то это также будет невозможно, хотя системный вызов.)
Возможный дубликат [Как сделать интерпретировать вывод php \ _uname] (http://stackoverflow.com/questions/21129737/how-do-i-interpret-the-output-of-php-uname) – kero
Нет, не дубликат, потому что он просит распределение, а не платформа. – lxg