У меня есть скрипт 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
это наиболее читаемый.Ответы:
Проверьте значение
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!'; }
источник
stripos(PHP_OS, 'WIN') === 0
можно использовать вместо этого, возможно, более читаемым / простым.Вы можете проверить, используется ли разделитель каталогов
/
(для unix / linux / mac) или\
в Windows. Постоянное имяDIRECTORY_SEPARATOR
.if (DIRECTORY_SEPARATOR === '/') { // unix, linux, mac } if (DIRECTORY_SEPARATOR === '\\') { // windows }
источник
strpos(__FILE__,92)
использует то же поведение;PATH_SEPARATOR>":"
возвращает true и для Windows (PATH_SEPARATOR равен ":" во всех других ОС).function is_linux(){return (DIRECTORY_SEPARATOR == '/') ? true : false;}
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 является самым быстрым.
источник
strncasecmp
занимает первые п символов, а не просто какие - нибудь русские символы. Если бы вы попробовали, вы бы узнали, чтоstrncasecmp('DARWIN', 'WIN', 3) == 0
оценивается какfalse
.Обратите внимание, что PHP_OS сообщает об ОС, на которой был построен PHP , и это не обязательно та же ОС, на которой он работает в настоящее время.
Если вы используете PHP> = 5.3 и вам просто нужно знать, работаете ли вы в Windows или нет, тогда проверка того, определена ли одна из констант, специфичных для Windows, может быть хорошей ставкой, например:
$windows = defined('PHP_WINDOWS_VERSION_MAJOR');
источник
Для обнаружения этого можно использовать функцию php_uname .
echo php_uname();
источник
Согласно предварительно заданным константам: пользовательские заметки, решения 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 }
источник
Начиная с 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 .
источник
Это должно работать в PHP 4.3+:
if (strtolower(PHP_SHLIB_SUFFIX) === 'dll') { // Windows } else { // Linux/UNIX/OS X }
источник
Основные предопределенные константы: 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")
Сделал бы трюк для вас, см. Здесь http://php.net/manual/en/function.php-uname.php
источник
Чтобы определить, что это - 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
в этом конкретном случае, но достаточно эффективен для такой небольшой задачи и более элегантен.источник
Вы можете проверить, существует ли константа в PHP> 5.3.0 ( вручную )
if (defined('PHP_WINDOWS_VERSION_BUILD')) { // is Windows }
Ранее этот метод использовался в Symfony. Теперь они используют другой метод :
if ('\\' === DIRECTORY_SEPARATOR) { // is Windows }
источник
Если вы хотите проверить, работает ли он под Linux, просто проверьте, работает ли он
(PHP_OS === 'Linux')
. Нет необходимости использовать strtolower () и substr ().источник
function isWin(){ if (strtolower(substr(PHP_OS, 0, 3)) === 'win' || PHP_SHLIB_SUFFIX == 'dll' || PATH_SEPARATOR == ';') { return true; } else { return false; } }
источник
С 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, вы можете извлечь ОС более явно.
источник