PHP-Skript - Erkennen, ob unter Linux oder Windows ausgeführt wird?


143

Ich habe ein PHP-Skript, das auf einem Windows-System oder einem Linux-System platziert werden kann. In beiden Fällen muss ich verschiedene Befehle ausführen.

Wie kann ich erkennen, in welcher Umgebung ich mich befinde? (vorzugsweise etwas PHP anstelle von cleveren Systemhacks)

Aktualisieren

Zur Verdeutlichung wird das Skript über die Befehlszeile ausgeführt.


Nach Benchmarks durchgeführt wird , scheint es , dass alle Unterschiede in der Leistung zwischen \strncasecmp(\PHP_OS, 'WIN', 3) === 0, \strtoupper(\substr(\PHP_OS, 0, 3)) === 'WIN'und \stripos(\PHP_OS, 'WIN')ist unter 15%. Da alle drei Lösungen nur ungefähr 100 Nanosekunden benötigen, wäre dies ohnehin eine Mikrooptimierung. Wählen Sie also eine beliebige Lösung. Schließlich können Sie argumentieren, dass dies \strncasecmp(\PHP_OS, 'WIN', 3) === 0am besten lesbar ist.
Caw

Antworten:


228

Überprüfen Sie den Wert der PHP_OSKonstanten Docs .

Es gibt Ihnen verschiedene Werte unter Windows wie WIN32, WINNToder Windows.

Siehe auch: Mögliche Werte für: PHP_OS und php_unameDocs :

if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
    echo 'This is a server using Windows!';
} else {
    echo 'This is a server not using Windows!';
}

Welchen Wert hätte es, wenn es Windows wäre? In den Dokumenten ist nichts zu sehen.
Shabbyrobe


8
stripos(PHP_OS, 'WIN') === 0kann stattdessen verwendet werden, wohl besser lesbar / einfach.
John Hunt

1
@ dw1 - es würde immer noch funktionieren, da es am Anfang nach "win" sucht.
John Hunt

62

Sie können überprüfen, ob das Verzeichnis-Trennzeichen /(für Unix / Linux / Mac) oder \unter Windows ist. Der konstante Name ist DIRECTORY_SEPARATOR.

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

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

Leider funktioniert dies nicht mit Windows 7 und Zend Server. In diesem Fall ist DIRECTORY_SEPARATOR auch '\'
Achim

4
@ Achim Was meinst du? Zend Server ist eine Serversoftware, kein Betriebssystem. Windows 7 sollte \ zurückgeben.
Mpen

1
strpos(__FILE__,92)nutzt das gleiche Verhalten aus; PATH_SEPARATOR>":"Gibt auch für Windows true zurück (PATH_SEPARATOR ist auf allen anderen Betriebssystemen ":").
Titus

Verwandelte dies in eine Funktion:function is_linux(){return (DIRECTORY_SEPARATOR == '/') ? true : false;}
Mario Lurig

37
if (strncasecmp(PHP_OS, 'WIN', 3) == 0) {
    echo 'This is a server using Windows!';
} else {
    echo 'This is a server not using Windows!';
}

scheint ein bisschen eleganter als die akzeptierte Antwort. Die oben erwähnte Erkennung mit DIRECTORY_SEPARATOR ist jedoch die schnellste.


Entschuldigung, aber dies funktioniert nicht richtig, wenn Sie einen Mac-Server verwenden, da Sie auf einem Mac eine Zeichenfolge erhalten, die "DARWIN" enthält, die auch "WIN" enthält. Auf einem Mac-Server erhalten Sie also "Dies ist" ein Server unter Windows! " was nicht wahr ist.
OMA

13
Nun, das ist nicht ganz richtig. Beachten Sie, dass strncasecmpnimmt die ersten n Zeichen, nicht nur alle n Zeichen. Wenn Sie es versucht hätten, hätten Sie herausgefunden, dass strncasecmp('DARWIN', 'WIN', 3) == 0zu false.
Ondřej Bouda

18

Beachten Sie, dass PHP_OS meldet das Betriebssystem , das PHP wurde gebaut auf , die nicht unbedingt das gleiche O ist , dass es derzeit ausgeführt wird .

Wenn Sie mit PHP> = 5.3 arbeiten und nur wissen müssen, ob Sie unter Windows ausgeführt werden oder nicht , kann es eine gute Wahl sein, zu testen, ob eine der Windows-spezifischen Konstanten definiert ist, z.

$windows = defined('PHP_WINDOWS_VERSION_MAJOR');

4
1. Richtig ist nicht, wo PHP aufgebaut wurde, sondern für was es gebaut wurde. 2. Dies gilt für die definierte Windows-bezogene Konstante auf die gleiche Weise ...
StanE

Wie auch immer, PHP für Windows kann nicht unter Unix ausgeführt werden, oder?
Stalinko


7

Gemäß der vordefinierten Konstanten: Vom Benutzer bereitgestellte Notizen Die Lösung von Volker und rdcapasso können Sie einfach eine Hilfsklasse wie die folgende erstellen:

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

}

Verwendung:

if(System::getOS() == System::OS_WIN) {
  // do something only on Windows platform
}

6

Dies sollte in PHP 4.3+ funktionieren:

if (strtolower(PHP_SHLIB_SUFFIX) === 'dll')
{
    // Windows
}
else
{
    // Linux/UNIX/OS X
}

5

Ab PHP 7.2.0 können Sie das laufende Betriebssystem anhand der Konstanten erkennen PHP_OS_FAMILY:

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

Die möglichen Werte finden Sie in der offiziellen PHP-Dokumentation .


4

Vordefinierte Kernkonstanten: http://us3.php.net/manual/en/reserved.constants.php mit derPHP_OS (string) Konstante.

Oder wenn Sie das Betriebssystem des Clients erkennen möchten:

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

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

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


Entsprechend Ihrer Bearbeitung können Sie über die Befehlszeile auf diesen veröffentlichten PHP- Servernamen verweisen

Sie können verwenden

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

So

php_uname("s")

's': Name des Betriebssystems. z.B. FreeBSD.

Würde den Trick für Sie tun, siehe hier http://php.net/manual/en/function.php-uname.php


4

So erkennen Sie, ob es sich um Windows, OS X oder Linux handelt:

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
}

striposist etwas langsamer als substrin diesem speziellen Fall, aber effizient genug für eine so kleine Aufgabe und eleganter.


Obwohl der Code einfach genug ist, steht diese Antwort nicht für sich allein: Eine gute Antwort zwingt nicht dazu, die Frage zu lesen, wenn sie von einer Suchmaschine kommt, da sie in sich geschlossen ist.
Jpaugh

2

Sie können überprüfen, ob in PHP> 5.3.0 ( manuell ) eine Konstante vorhanden ist.

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

Bisher wurde diese Methode in Symfony verwendet. Jetzt verwenden sie eine andere Methode :

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

0

Wenn Sie überprüfen möchten, ob es unter Linux ausgeführt wird, testen Sie einfach, ob (PHP_OS === 'Linux'). Strtolower () und substr () müssen nicht verwendet werden.


-1
function isWin(){
 if (strtolower(substr(PHP_OS, 0, 3)) === 'win' || PHP_SHLIB_SUFFIX == 'dll' || PATH_SEPARATOR == ';') {
    return true;
 } else {
    return false;
 }
}

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.