PHP скрипт - определить, работает ли он под Linux или Windows? - PullRequest
129 голосов
/ 04 мая 2011

У меня есть PHP-скрипт, который может быть размещен в системе Windows или Linux. Мне нужно выполнить разные команды в любом случае.

Как я могу определить, в какой среде я нахожусь? (желательно что-то PHP, а не умные системные хаки)

Обновление

Для пояснения, скрипт запускается из командной строки.

Ответы [ 13 ]

211 голосов
/ 04 мая 2011

Проверьте значение постоянной PHP_OS Документы .

Это даст вам различные значения в Windows, такие как WIN32, WINNT или Windows.

См. Также: Возможные значения для: PHP_OS и php_uname Документы :

if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
    echo 'This is a server using Windows!';
} else {
    echo 'This is a server not using Windows!';
}
55 голосов
/ 04 мая 2011

Вы можете проверить, является ли разделитель каталогов / (для unix / linux / mac) или \ в Windows. Имя константы: DIRECTORY_SEPARATOR

if (DIRECTORY_SEPARATOR == '/') {
    // unix, linux, mac
}

if (DIRECTORY_SEPARATOR == '\\') {
    // windows
}
36 голосов
/ 23 июля 2012
if (strncasecmp(PHP_OS, 'WIN', 3) == 0) {
    echo 'This is a server using Windows!';
} else {
    echo 'This is a server not using Windows!';
}

кажется немного более элегантным, чем принятый ответ.Вышеупомянутое обнаружение с помощью DIRECTORY_SEPARATOR, однако, является самым быстрым.

16 голосов
/ 05 февраля 2013

Обратите внимание, что PHP_OS сообщает ОС, что PHP был собран на , что не обязательно является той же ОС, на которой он работает в данный момент.

Если вы работаете на PHP> = 5.3 и вам просто нужно знать, работаете ли вы в Windows или не в Windows, то проверка правильности определения одной из специфичных для Windows констант может быть хорошей идеей. Например:

$windows = defined('PHP_WINDOWS_VERSION_MAJOR');
8 голосов
/ 04 мая 2011

Функция php_uname может использоваться для обнаружения этого.

echo php_uname();
6 голосов
/ 09 ноября 2012

Это должно работать в PHP 4.3 +:

if (strtolower(PHP_SHLIB_SUFFIX) === 'dll')
{
    // Windows
}
else
{
    // Linux/UNIX/OS X
}
5 голосов
/ 23 января 2017

В соответствии с Предопределенные константы: Пользовательские примечания Решение Volker и rdcapasso, вы можете просто создать вспомогательный класс, например:

<?php

class System {

    const OS_UNKNOWN = 1;
    const OS_WIN = 2;
    const OS_LINUX = 3;
    const OS_OSX = 4;

    /**
     * @return int
     */
    static public function getOS() {
        switch (true) {
            case stristr(PHP_OS, 'DAR'): return self::OS_OSX;
            case stristr(PHP_OS, 'WIN'): return self::OS_WIN;
            case stristr(PHP_OS, 'LINUX'): return self::OS_LINUX;
            default : return self::OS_UNKNOWN;
        }
    }

}

Использование:

if(System::getOS() == System::OS_WIN) {
  // do something only on Windows platform
}
4 голосов
/ 04 мая 2011

Основные предопределенные константы: http://us3.php.net/manual/en/reserved.constants.php с константой PHP_OS (string).

Или, если вы хотите определить ОС клиента:

<?php
    echo $_SERVER['HTTP_USER_AGENT'] . "\n\n";

    $browser = get_browser(null, true);
    print_r($browser);
?>

С http://us3.php.net/manual/en/function.get-browser.php


В соответствии с вашими правками вы можете обратиться к этому дубликату Имя сервера PHP из командной строки

Вы можете использовать

string php_uname ([ string $mode = "a" ] )

So

php_uname("s")

's': имя операционной системы. например. FreeBSD.

Подойдет вам, см. Здесь http://php.net/manual/en/function.php-uname.php

3 голосов
/ 15 августа 2016

Чтобы определить, является ли это Windows, OS X или Linux:

if (stripos(PHP_OS, 'win') === 0) {
    // code for windows
} elseif (stripos(PHP_OS, 'darwin') === 0) {
    // code for OS X
} elseif (stripos(PHP_OS, 'linux') === 0) {
    // code for Linux
}

stripos немного медленнее, чем substr в данном конкретном случае, но достаточно эффективен для такой небольшой задачи и более элегантен.

1 голос
/ 30 августа 2016

Вы можете проверить, существует ли константа в PHP> 5.3.0 ( manual )

if (defined('PHP_WINDOWS_VERSION_BUILD')) {
    // is Windows
}

Ранее этот метод использовался в Symfony. Теперь они используют другой метод :

if ('\\' === DIRECTORY_SEPARATOR) {
    // is Windows
}
...