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.

siliconpi
quelle
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!';
}
Sander Marechal
quelle
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
}
Ibu
quelle
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.

Ondřej Bouda
quelle
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');
ejn
quelle
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
8

Die Funktion php_uname kann verwendet werden, um dies zu erkennen.

echo php_uname();
Anders Lindahl
quelle
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
}
Patryk Uszyński
quelle
6

Dies sollte in PHP 4.3+ funktionieren:

if (strtolower(PHP_SHLIB_SUFFIX) === 'dll')
{
    // Windows
}
else
{
    // Linux/UNIX/OS X
}
Jonathon Hill
quelle
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 .

Josemmo
quelle
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

Upvote
quelle
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.

artnikpro
quelle
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
}
Ghost404
quelle
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.

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

Von 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>"
?>

Dies ist das gesamte $ _SERVER-Array ... Wie ArtWorkAD festgestellt hat, können Sie das Betriebssystem mithilfe des Schlüssels HTTP_USER_AGENT expliziter extrahieren.

Jordan Arseno
quelle