PHP-Skript – erkennen, ob es unter Linux oder Windows läuft?
Lesezeit: 4 Minuten
Silikonpi
Ich habe ein PHP-Skript, das auf einem Windows-System oder einem Linux-System platziert werden kann. Ich muss in beiden Fällen unterschiedliche Befehle ausführen.
Wie kann ich erkennen, in welcher Umgebung ich mich befinde? (vorzugsweise etwas PHP statt clevere Systemhacks)
Aktualisieren
Zur Verdeutlichung wird das Skript von der Befehlszeile aus ausgeführt.
Nach der Durchführung von Benchmarks scheint es, dass Leistungsunterschiede zwischen \strncasecmp(\PHP_OS, 'WIN', 3) === 0, \strtoupper(\substr(\PHP_OS, 0, 3)) === 'WIN' und \stripos(\PHP_OS, 'WIN') unter 15 % liegen. Da alle drei Lösungen nur etwa 100 Nanosekunden benötigen, wäre dies ohnehin eine Mikrooptimierung. Wählen Sie also die Lösung, die Ihnen gefällt. Schließlich können Sie das argumentieren \strncasecmp(\PHP_OS, 'WIN', 3) === 0 ist am lesbarsten.
stripos(PHP_OS, 'WIN') === 0 kann stattdessen verwendet werden, wohl lesbarer / einfacher.
– Johannes Jagd
9. November 2018 um 9:07 Uhr
@dw1 – es würde immer noch funktionieren, da es am Anfang nach “win” sucht.
– Johannes Jagd
26. November 2018 um 12:12 Uhr
Und mit php8 haben wir jetzt if (str_starts_with(strtoupper(PHP_OS), 'WIN')) {
– Rotzarf
15. September 2021 um 20:57 Uhr
Ibu
Sie können überprüfen, ob das Verzeichnistrennzeichen ist / (für Unix/Linux/Mac) oder \ an Fenstern. Der konstante Name ist DIRECTORY_SEPARATOR.
if (DIRECTORY_SEPARATOR === "https://stackoverflow.com/") {
// 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
15. April 2014 um 10:54 Uhr
@Achim Was meinst du? Zend Server ist eine Serversoftware, kein Betriebssystem. Windows 7 sollte Rückkehr \.
– mp
6. August 2014 um 17:41 Uhr
strpos(__FILE__,92) nutzt dasselbe Verhalten aus; PATH_SEPARATOR>":" gibt auch für Windows true zurück (PATH_SEPARATOR ist “:” auf allen anderen Betriebssystemen).
– Titus
8. Januar 2017 um 12:45 Uhr
Habe das in eine Funktion umgewandelt: function is_linux(){return (DIRECTORY_SEPARATOR == '/') ? true : false;}
– Mario Lurig
6. Oktober 2017 um 0:25 Uhr
if (strncasecmp(PHP_OS, 'WIN', 3) == 0) {
echo 'This is a server using Windows!';
} else {
echo 'This is a server not using Windows!';
}
scheint etwas eleganter zu sein als die akzeptierte Antwort. Die oben erwähnte Erkennung mit DIRECTORY_SEPARATOR ist jedoch am schnellsten.
Tut mir leid, aber das funktioniert nicht richtig, wenn Sie einen Mac-Server verwenden, da Sie auf dem Mac eine Zeichenfolge erhalten, die “DARWIN” enthält, die auch “WIN” enthält, also erhalten Sie auf einem Mac-Server “This is ein Server mit Windows!” was nicht wahr ist.
– Oma
28. September 2012 um 23:27 Uhr
Nun, das ist nicht ganz richtig. Beachte das strncasecmp nimmt Der Ersten Charaktere, nicht irgendwelche n Figuren. Wenn du es versucht hättest, hättest du es herausgefunden strncasecmp('DARWIN', 'WIN', 3) == 0 wertet zu false.
– Ondřej Bouda
14. Oktober 2012 um 15:12 Uhr
Ab PHP 7.2.0 können Sie das laufende Betriebssystem anhand der Konstante erkennen PHP_OS_FAMILY:
if (PHP_OS_FAMILY === "Windows") {
echo "Running on Windows";
} elseif (PHP_OS_FAMILY === "Linux") {
echo "Running on Linux";
}
Wenn Sie PHP >= 5.3 verwenden und nur wissen müssen, ob Sie Windows verwenden oder nicht, dann testen Sie, ob eines der Windows-spezifische Konstanten definiert ist, kann eine gute Wette sein, zB:
$windows = defined('PHP_WINDOWS_VERSION_MAJOR');
1. Richtig ist nicht, wo PHP gebaut wurde, sondern wofür es gebaut wurde. 2. Dies gilt für die definierten Fenster-bezogenen Konstanten auf die gleiche Weise …
– StanE
9. September 2014 um 11:43 Uhr
Jedenfalls kann für Windows erstelltes PHP nicht unter Unix ausgeführt werden, oder?
– Stalinko
2. Dezember 2016 um 8:11 Uhr
Das php_uname Funktion kann verwendet werden, um dies zu erkennen.
echo php_uname();
1. Richtig ist nicht, wo PHP gebaut wurde, sondern wofür es gebaut wurde. 2. Dies gilt für die definierten Fenster-bezogenen Konstanten auf die gleiche Weise …
– StanE
9. September 2014 um 11:43 Uhr
Jedenfalls kann für Windows erstelltes PHP nicht unter Unix ausgeführt werden, oder?
Nach der Durchführung von Benchmarks scheint es, dass Leistungsunterschiede zwischen
\strncasecmp(\PHP_OS, 'WIN', 3) === 0
,\strtoupper(\substr(\PHP_OS, 0, 3)) === 'WIN'
und\stripos(\PHP_OS, 'WIN')
unter 15 % liegen. Da alle drei Lösungen nur etwa 100 Nanosekunden benötigen, wäre dies ohnehin eine Mikrooptimierung. Wählen Sie also die Lösung, die Ihnen gefällt. Schließlich können Sie das argumentieren\strncasecmp(\PHP_OS, 'WIN', 3) === 0
ist am lesbarsten.– kräh
19. August 2019 um 23:26 Uhr