PHP скрипт - виявляє, чи працює під Linux або Windows?


143

У мене є сценарій 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це найчитабельніше.
каркати

Відповіді:


228

Перевірте значення 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!';
}

Яке значення було б, якщо це Windows? У документах немає нічого, що я бачу.
Шабіроб


8
stripos(PHP_OS, 'WIN') === 0може бути використаний замість цього, мабуть, більш читабельний / простий.
Джон Хант

1
@ dw1 - він все одно буде працювати, оскільки він шукає "win" на початку.
Джон Хант

62

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

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

if (DIRECTORY_SEPARATOR === '\\') {
    // windows
}

На жаль, це не працює з Windows 7 та Zend Server. У цьому випадку DIRECTORY_SEPARATOR також '\'
Ахім

4
@Achim Що ти маєш на увазі? Zend Server - це серверне програмне забезпечення, а не ОС. Windows 7 має повернутися \.
квітня

1
strpos(__FILE__,92)експлуатує однакову поведінку; PATH_SEPARATOR>":"повертає true і для Windows (PATH_SEPARATOR - ":" для всіх інших ОС).
Тіт

Перетворив це на функцію:function is_linux(){return (DIRECTORY_SEPARATOR == '/') ? true : false;}
Маріо Луріг

37
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приймаються перші n символів, а не будь-які n символів. Якби ви спробували це, ви дізналися б, що strncasecmp('DARWIN', 'WIN', 3) == 0оцінює false.
Ondřej Bouda

18

Зверніть увагу , що PHP_OS повідомляє ОС , що PHP був побудований на , що не обов'язково збігається з ОС , яка в даний час вона працює на.

Якщо ви перебуваєте на PHP> = 5.3 і просто потрібно знати, працюєте ви в Windows чи ні, тоді тестування, чи визначена одна з констант Windows, може бути хорошою ставкою, наприклад:

$windows = defined('PHP_WINDOWS_VERSION_MAJOR');

4
1. Правильно не там , де PHP був побудований , але для того, що він був побудований на 2. Це відноситься і до вікон певних пов'язаних константа точно так же ...
Стане

У будь-якому випадку PHP, побудований для Windows, не можна запускати на unix, чи не так?
Сталінко


7

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


5

Починаючи з 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 .


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


Хоча код досить простий, ця відповідь не стоїть сама по собі: чудова відповідь не змушує читати питання, коли надходить із пошукової системи, оскільки він є самостійним.
jpaugh

2

Ви можете перевірити, чи існує константа в PHP> 5.3.0 ( керівництво )

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

Раніше цей метод використовувався в Symfony. Тепер вони використовують інший метод :

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

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;
 }
}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.