Wie kann ich vermeiden, dass ich mit “#!/usr/bin/php" für PHP?
Möchte ich PHP-Skripte laufen sowohl auf der Kommandozeile website (ich benutze Apache und Nginx), also legte ich #!/usr/bin/php in der ersten Zeile meines scripts, aber das wird auf der website...
- Wenn man schon apache für die Zustellung von PHP, einfach zu konfigurieren nginx als reverse-proxy für apache.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich das problem gelöst mit output buffering.
Mein Skript sieht jetzt wie folgt aus:
Hinweis: Es gibt keine
?>
am Ende der Datei. Dies ist eigentlich eine gute Praxis beim schreiben von PHP-Skripten. Dies verhindert, dass Müll-text zu versehen gedruckt.Hinweis: Die PHP-Dokumentation für
ob_end_clean()
sagt, dass:Scheint es, dass dieser automatisch durchgeführt wird, wenn PHP ausgeführt wird, das von der Kommandozeile aus.
ob_start();
wie gut? Wahrscheinlich erwähnenswert.Gibt es keine Notwendigkeit zu haben
#!/usr/bin/php
im code nur ausführen, CLI-Skript mitphp
zum Beispielphp /path/to/file.php
oder/usr/bin/php /path/to/file.php
.Ich in der Regel finden es eine gute Idee, separate Logik von der Präsentation. Wenn ich so etwas mache, ich versuche, so viel wie möglich in einer Bibliothek, und dann schreibst cli-und web-Schnittstellen für Sie.
Das sagte, nannte es mit dem php-Befehl ist vermutlich einfacher zu beheben.
$argv
statt$_GET
zum Beispiel). So gibt es keine wirkliche Notwendigkeit für die gleichen - Datei genannt zu werden, von beiden.@ViliamSimko ist böse trick ist fast da, aber leider fehlerhaft. (Es hat tatsächlich gegen meine header-senden-Sequenz, zum Beispiel, obwohl Sie nicht verschmutzen die Ausgabe mit dem shebang.)
TL;DR, hier ist der fix*:
oder weniger obszön aussehenden, aber immer noch nur ein Euphemismus für die gleiche straftat 😉 :
(Und siehe auch die "UPDATE" - Teil unten für vielleicht das maximum, das wir über dieses tun kann...)
Erklärung:
@Floris hatte einen sehr guten Punkt in den Kommentaren da:
Können Sie sicher tun. Aber wo? Und Wann?
Fälle zu betrachten:
Als Viliam gesagt (und bestätigt, das es mit PHP-7.2), der Kram ist zum Glück gegessen, das
php
Befehl selbst, wenn Sie führen Sie Ihr Skript mitphp yourscript.php
, also der ganze trick ist überflüssig.In web-Modus, es ist eigentlich config-abhängig: wenn
output_buffering
ist in der config (und sicher genug, es ist in der Regel auf, aber es ist nicht einmal die Standard -), einob_start
bereits getan hat implizit am Anfang des Skripts (Sie können es mitob_get_level()
). So können wir nicht einfach abrupt Abbrechen, es mit einemob_end_clean
und nennen es einen Tag: wir müssen anderen starten, um die Ebenen ausgeglichen!Wenn
output_buffering
ist off in die config, dann, trauriges Gesicht, haben wir Pech:ob_get_clean()
tut nichts, und der Kram landet in der Spitze der Seite.Hinweis: es ist keine Lösung für dieses Problem, andere als das einschalten.
In command-line mode, das Handbuch sagt über
output_buffering
:Aber, statt zu Versagen, die gleiche hoffnungslose Weise wie in 3., die implizite shebang-Bereinigung (siehe 1.) rettet den Tag.
* "Update" in dem Sinne, dass diese kühne hack funktioniert in viel mehr Fällen. Wenn Sie die volle Kontrolle über Ihre PHP-env., es kann in Ordnung sein (wie in meinem Fall). Ansonsten, es kann immer noch brechen in viele subtile Weise, unerwartet (berücksichtigen Sie die auto-vorangestellt-code, benutzerdefinierte Erweiterungen oder andere Wege zur Kontrolle von output buffering etc.). Zum Beispiel auch, wenn
include
d von anderen Skripten im CLI-Modus (wo es keine Pufferung), Sie sind noch kein Glück: die shebang wird zeigen, bis in den Ausgang, egal was (es sei denn, natürlich, filtriert manuell durch den Anrufer). Nicht nur das, aber Sie würde es auch brechen eigene Pufferung, wenn Sie geschehen zu haben, während darunter ein naughtified Skript.UPDATE: Nur so zum Spaß, hier ist ein "fast richtige" version, die spielt gut zusammen mit laufender Pufferung, sei es implizit oder Benutzer-Ebene:
Immer noch nur "fast" richtig, denn nichts kann fix
output_buffering = 0
im web-Modus, und das "enthalten keine Pufferung" Fall kann nur gelöst werden, wenn die aufrufende Skript fügt eine expliziteob_start
-ob_end_...
Verpackung. Auch die meisten der obigen Einschränkungen gelten weiterhin: diverse Feinheiten können immer noch brechen (z.B. die aktuelle Ausgabe Puffer haben muss, der (zum Glück Standard)PHP_OUTPUT_HANDLER_CLEANABLE
Flaggen usw.).)Rufen Sie das Skript mithilfe der
php
Befehlphp
Befehl. Jedoch, wenn Sie wollen, um ein ausführbares Skript (chmod +x yourscript.php
) müssen Sie den hashbang (#!) die erste Zeile in Ihrem Skript.Die Ausgabe-Pufferung der Lösung oben ist ein hack. Tun Sie das nicht.
Erste, was, Sie sind tatsächlich besser mit dem env-Befehl, um festzustellen, welche php verwendet wird:
Dann geben es die Erlaubnis ausgeführt werden, die von sich selbst:
Also statt 'php myfile' Sie jetzt einfach laufen:
Aus diesem Ordner. Hoffe, das hilft!