11
votes

Comment puis-je éviter de montrer "#! / Usr / bin / php" sur PHP?

Je veux que les scripts PHP fonctionnent à la fois sur la ligne de commande et le site Web (j'utilise Apache et Nginx), donc je mets #! / USR / bin / php dans la première ligne de mes scripts mais qui apparaît sur le site Web ... < / p>


1 commentaires

Si vous utilisez déjà Apache pour servir PHP, il suffit de configurer Nginx comme proxy inverse pour Apache.


6 Réponses :


0
votes

appelez le script à l'aide de la commande php


1 commentaires

Il est vrai que vous pouvez exécuter le script à l'aide de la commande php . Toutefois, si vous souhaitez créer un script exécutable ( chmod + x y votrerscript.php ), vous devez ajouter le hashbang (#!) À la première ligne de votre script.



3
votes

Il n'y a pas besoin d'avoir #! / usr / bin / php dans votre code, il suffit d'exécuter CLI Script en utilisant php , par exemple php / chemin /to/file.php ou / usr / bin / php /path/to/file.php.


1 commentaires

Mais si vous souhaitez créer un script exécutable pouvant fonctionner à partir de Shell, vous devez résoudre ce problème.



2
votes

Je trouve généralement une bonne idée de séparer la logique de la présentation. Lorsque je fais quelque chose comme ça, je mets autant que possible dans une bibliothèque, puis écrivez des interfaces cli et Web séparées.

Cela dit, l'appelant avec la commande PHP est probablement une solution plus facile.


1 commentaires

+1 pour la séparation de la logique. Typiquement, CLI et Web nécessiteront des interfaces distinctes (interagir avec $ argv au lieu de $ _ obtenir par exemple). Donc, il n'y a pas de besoin réel pour le même fichier d'être appelé des deux.



21
votes

J'ai résolu le problème à l'aide de la mise en mémoire tampon de sortie. Mon script ressemble maintenant à ceci: xxx

Note: Il n'y a pas de ?> à la fin du fichier. C'est en fait une bonne pratique lors de la rédaction de scripts PHP. Cela empêche que tout texte à ordures soit imprimé accidentellement.

Remarque: La documentation PHP pour ob_end_clean () dit que:

Le tampon de sortie doit être démarré par ob_start () avec Php_output_handler_cleanable et php_output_handler_removable drapeaux. Sinon ob_end_clean () ne fonctionnera pas.

Il semble que cela se produise automatiquement lorsque PHP fonctionne de la ligne de commande.


3 commentaires

Avez-vous besoin d'un ob_start (); aussi? Vaut probablement la peine de mentionner.


C'est beau.


Bonne idée, mais @floris avait un point crucial ici. S'il vous plaît voir mon Répondre , où j'ai abordé cette question.



-2
votes

La solution tampon de sortie ci-dessus est un hack. Ne faites pas cela.

première chose, vous êtes mieux mieux en utilisant la commande env de manière à déterminer quel PHP est utilisé: xxx

alors donnez-lui la permission d'être exécutée En soi: xxx

donc au lieu d'appeler "php myfile", vous venez maintenant d'exécuter: xxx

de ce dossier . J'espère que cela vous aidera!


3 commentaires

Je suppose que les bowvotes sont parce que ce que vous décrivez (rendant le fichier exécutable et utiliser une ligne de shebang) est ce que le questionneur fait déjà. Sauf, il appelle parfois parfois le même fichier via un serveur Web. Donc, dans le navigateur, la ligne de shebang imprime. Il demande une solution de contournement pour cela. Le hack tampant de sortie pour cela semble être la seule méthode.


Oui, il ne devrait pas faire ça. Mieux avoir le script CLI exécutable nécessitant dans un autre fichier avec la logique réelle et obtenir sa page Web PHP de faire de même, alors ils partagent le même code et le shebang ne montrera pas


Mise à jour de votre réponse avec cette suggestion pourrait être un moyen de réparer les bowvotes (ce qui ne semble pas que quiconque semble vérifier si les gens corrigent les réponses qu'ils ont envahi ... soupir )



3
votes

@ Viliamsimko's Trick méchant est presque là, mais malheureusement, défectueux. (il a fait réellement la séquence d'envoi d'en-tête, par exemple, malgré de ne pas polluer la sortie avec le shebang.) em>

tl; dr, voici le correctif * sup>: strong> p> xxx pré>

ou, moins obscène à la recherche, mais toujours un euphémisme pour la même infraction;): P>

#!/usr/bin/php
<?php
if (ob_get_level()) {
    $buf = ob_get_clean();
    ob_start();
    // Refill the buffer, but without the shebang line:
    echo substr($buf, 0, strpos($buf, file(__FILE__)[0]));
} // else { out of luck... }


0 commentaires