PHP скрипт - определить, работает ли он под Linux или Windows?

148

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

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

Обновить

Чтобы уточнить, скрипт запускается из командной строки.

силиконовый
источник
После выполнения тестов, кажется , что какое - либо различие в производительности между \strncasecmp(\PHP_OS, 'WIN', 3) === 0, \strtoupper(\substr(\PHP_OS, 0, 3)) === 'WIN'и \stripos(\PHP_OS, 'WIN')ниже 15%. Поскольку все три решения занимают всего около 100 наносекунд, в любом случае это будет микрооптимизация. Так что выбирайте любое решение, которое вам нравится. Наконец, вы можете возразить, что \strncasecmp(\PHP_OS, 'WIN', 3) === 0это наиболее читаемый.
каркать

Ответы:

238

Проверьте значение PHP_OSконстанты Docs .

Это даст вам различные значения в 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!';
}
Сандер Марешал
источник
Какая бы ценность была, если бы это была Windows? Я ничего не вижу в документации.
Shabbyrobe
10
stripos(PHP_OS, 'WIN') === 0можно использовать вместо этого, возможно, более читаемым / простым.
Джон Хант
1
@ dw1 - он все равно будет работать, так как вначале ищет "win".
Джон Хант
63

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

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

if (DIRECTORY_SEPARATOR === '\\') {
    // windows
}
Ибу
источник
К сожалению, это не работает с Windows 7 и Zend Server. В этом случае DIRECTORY_SEPARATOR также '\'
Ахим
4
@ Ахим Что ты имеешь в виду? Zend Server - это серверное программное обеспечение, а не ОС. Windows 7 должна вернуть \.
mpen 06
2
strpos(__FILE__,92)использует то же поведение; PATH_SEPARATOR>":"возвращает true и для Windows (PATH_SEPARATOR равен ":" во всех других ОС).
Titus
Превратил это в функцию:function is_linux(){return (DIRECTORY_SEPARATOR == '/') ? true : false;}
Марио Луриг
39
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 является самым быстрым.

Ондржей Бауда
источник
Извините, но это не работает правильно, если вы используете сервер Mac, так как в Mac вы получаете строку, содержащую «DARWIN», которая также содержит «WIN», поэтому на сервере Mac вы получите «Это сервер, использующий Windows! " что не так.
OMA
13
Что ж, это не совсем так. Обратите внимание , что strncasecmpзанимает первые п символов, а не просто какие - нибудь русские символы. Если бы вы попробовали, вы бы узнали, что strncasecmp('DARWIN', 'WIN', 3) == 0оценивается как false.
Ондржей Бауда
18

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

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

$windows = defined('PHP_WINDOWS_VERSION_MAJOR');
ejn
источник
4
1. Правильно не там, где PHP был построен, а для того, для чего он был построен 2. Это относится и к определенной константе, связанной с окнами, таким же образом ...
StanE
В любом случае PHP, созданный для Windows, нельзя запускать в unix, не так ли?
Сталинко 02
8

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

echo php_uname();
Андерс Линдаль
источник
7

Согласно предварительно заданным константам: пользовательские заметки, решения 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
}
Патрик Ушински
источник
7

Начиная с PHP 7.2.0, вы можете определить работающую ОС с помощью константы PHP_OS_FAMILY:

if (PHP_OS_FAMILY === "Windows") {
  echo "Running on Windows";
} elseif (PHP_OS_FAMILY === "Linux") {
  echo "Running on Linux";
}

Его возможные значения см. В официальной документации PHP .

Josemmo
источник
6

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

if (strtolower(PHP_SHLIB_SUFFIX) === 'dll')
{
    // Windows
}
else
{
    // Linux/UNIX/OS X
}
Джонатон Хилл
источник
4

Основные предопределенные константы: 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" ] )

Так

php_uname("s")

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

Сделал бы трюк для вас, см. Здесь http://php.net/manual/en/function.php-uname.php

Голосовать за
источник
4

Чтобы определить, что это - 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в этом конкретном случае, но достаточно эффективен для такой небольшой задачи и более элегантен.

artnikpro
источник
Хотя код достаточно прост, этот ответ не стоит сам по себе: отличный ответ не заставляет читать вопрос, исходящий из поисковой системы, потому что он самодостаточен.
jpaugh
2

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

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

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

if ('\\' === DIRECTORY_SEPARATOR) {
    // is Windows
}
призрак404
источник
0

Если вы хотите проверить, работает ли он под Linux, просто проверьте, работает ли он (PHP_OS === 'Linux'). Нет необходимости использовать strtolower () и substr ().

Рикардо Трибальдос
источник
-1
function isWin(){
 if (strtolower(substr(PHP_OS, 0, 3)) === 'win' || PHP_SHLIB_SUFFIX == 'dll' || PATH_SEPARATOR == ';') {
    return true;
 } else {
    return false;
 }
}
Акам
источник
-3

С http://www.php.net/manual/en/reserved.variables.server.php#102162 :

<?php
echo '<table border="1">';

foreach ($_SERVER as $k => $v){
    echo "<tr><td>" . $k ."</td><td>" . $v . "</td></tr>";
}

echo "</table>"
?>

Это весь массив $ _SERVER ... как заметил ArtWorkAD, используя ключ HTTP_USER_AGENT, вы можете извлечь ОС более явно.

Джордан Арсено
источник