Comment puis-je éviter de montrer “#!/usr/bin/php” sur PHP?
Je veux des scripts PHP pour fonctionner à la fois sur la ligne de commande et un site web (j'utilise Apache et Nginx) donc j'ai mis #!/usr/bin/php dans la première ligne de mes scripts, mais qui apparaît sur le site web...
Si vous utilisez déjà apache pour servir de PHP, il suffit de configurer nginx en tant que reverse proxy apache.
OriginalL'auteur brainsqueezer | 2010-11-05
Vous devez vous connecter pour publier un commentaire.
J'ai résolu le problème en utilisant le tampon de sortie.
Mon script ressemble maintenant à ceci:
Remarque: Il n'y a pas de
?>
à la fin du fichier. C'est effectivement une bonne pratique lors de l'écriture de scripts PHP. Cela empêche les déchets de texte pour être accidentellement imprimé.Remarque: La documentation PHP pour
ob_end_clean()
dit que:Il semble que cela se fait automatiquement lorsque PHP s'exécute en ligne de commande.
Avez-vous besoin d'une
ob_start();
ainsi? Probablement la peine de mentionner.Je pense que vous pouvez marquer cette réponse est acceptée (déjà 5 ans et+) : -)
Que c'est beau.
Bonne idée, mais @Floris avait un point crucial ici. Veuillez voir le mon répondre, où j'ai abordé cette question.
OriginalL'auteur Viliam Simko
Il n'est pas nécessaire d'avoir
#!/usr/bin/php
dans votre code, il suffit d'exécuter script CLI à l'aide dephp
, par exemplephp /path/to/file.php
ou/usr/bin/php /path/to/file.php
.OriginalL'auteur David Kuridža
Je trouve généralement une bonne idée de séparer la logique de présentation. Quand je fais quelque chose comme ça, j'ai mis autant que possible dans une bibliothèque, puis écrire une cli et des interfaces web.
Cela dit, à l'appeler avec la commande php est probablement plus facile de corriger.
$argv
au lieu de$_GET
par exemple). Donc il n'y a pas de réel besoin pour les mêmes fichier pour être appelé à partir à la fois.OriginalL'auteur Chris
@ViliamSimko de méchant truc est presque là, mais, malheureusement, imparfait. (Il n'a fait me casser la tête de l'envoi de la séquence, par exemple, en dépit de ne pas polluer la sortie avec le shebang.)
TL;DR, voici le correctif*:
ou moins obscènes, mais encore juste un euphémisme pour la même infraction 😉 :
(Et voir aussi la "mise à JOUR" de la partie ci-dessous pour peut-être le maximum de ce que nous pouvons faire à ce sujet...)
Explication:
@Floris eu un très bon point dans les commentaires:
Vous vous faire. Mais où? Et quand?
Cas à considérer:
Comme Viliam dit (et juste confirmé avec PHP 7.2), l'arborescence n'est heureusement mangés par les
php
commande elle-même, lorsque vous exécutez votre script avecphp yourscript.php
, de sorte que l'ensemble du truc, c'est redondant.En mode web, c'est effectivement la config: si
output_buffering
est dans la config (et bien sûr, il est généralement, mais il est même pas la valeur par défaut), unob_start
a déjà été fait implicitement au début du script (vous pouvez le vérifier avecob_get_level()
). Donc, nous ne pouvons pas brusquement l'annuler avec unob_end_clean
et l'appeler un jour: nous besoin pour commencer à une autre afin de maintenir l'équilibre des niveaux de!Si
output_buffering
est hors de la config, puis, le visage triste, nous sommes hors de la chance:ob_get_clean()
ne fait rien, et le shebang terminera dans le haut de la page.Remarque: il est pas correctif pour ça, d'autres que de l'activer.
En mode ligne de commande, le manuel dit sur
output_buffering
:Mais, plutôt que de rejeter la même désespérée manière que dans le 3., l'implicite de cette arborescence de nettoyage (voir 1.) sauve la journée.
* "Fix" dans le sens où cette audacieuse hack va fonctionner dans beaucoup plus de cas. Si vous êtes en plein contrôle de votre PHP env., il peut être très bien (comme dans mon cas). Sinon, il peut toujours casser dans beaucoup de manières subtiles de façon inattendue (tenir compte de l'auto-ajouté le code, les extensions personnalisées, ou d'autres façons de contrôler le tampon de sortie, etc.). Aussi, par exemple, lorsque
include
d d'autres scripts en mode CLI (où il n'y a pas de mise en mémoire tampon), vous êtes toujours hors de la chance: le shebang s'afficher dans la sortie, n'importe quoi (à moins, bien sûr, filtrés manuellement par l'appelant). Non seulement cela, mais il serait également briser votre propre tampon, si vous arrivé à avoir tout, tout, y compris de tels naughtified script.Mise à JOUR: Juste pour le fun, voici un "presque correct" version, qui joue très bien avec un cours de mise en mémoire tampon, implicite ou au niveau de l'utilisateur:
Encore un "presque" correct, que rien ne peut fixer
output_buffering = 0
en mode web, et l ' "être inclus sans mise en mémoire tampon" cas ne peut être résolu que si le script d'appel ajoute expliciteob_start
-ob_end_...
de l'emballage. Aussi, la plupart des mises en garde ci-dessus s'appliquent toujours: différentes subtilités pouvez toujours casser (par exemple, le courant de sortie de la mémoire tampon doit avoir l' (heureusement défaut)PHP_OUTPUT_HANDLER_CLEANABLE
pavillon etc.).)OriginalL'auteur Sz.
Appeler le script à l'aide de la
php
commandeIl est vrai que vous pouvez exécuter le script à l'aide de
php
de commande. Toutefois, si vous voulez faire un script exécutable (chmod +x yourscript.php
), vous devez ajouter les hashbang (#!) à la première ligne de votre script.OriginalL'auteur Petah
Le tampon de sortie de la solution ci-dessus est un hack. Ne pas le faire.
Première chose, vous êtes en fait plus à l'aide de la commande env pour déterminer le php est utilisé:
Puis de lui donner l'autorisation à exécuter par elle-même:
Donc, au lieu de l'appeler 'php monfichier', vous pouvez maintenant exécuter:
À partir de ce dossier. Espérons que cette aide!
OriginalL'auteur delboy1978uk