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>
6 Réponses :
appelez le script à l'aide de la commande php code> p>
Il est vrai que vous pouvez exécuter le script à l'aide de la commande php code>. Toutefois, si vous souhaitez créer un script exécutable (
chmod + x y votrerscript.php code>), vous devez ajouter le hashbang (#!) À la première ligne de votre script.
Il n'y a pas besoin d'avoir #! / usr / bin / php code> dans votre code, il suffit d'exécuter CLI Script en utilisant
php code>, par exemple
php / chemin /to/file.php code> ou
/ usr / bin / php /path/to/file.php
. p>
Mais si vous souhaitez créer un script exécutable pouvant fonctionner à partir de Shell, vous devez résoudre ce problème.
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. P>
Cela dit, l'appelant avec la commande PHP est probablement une solution plus facile. P>
+1 pour la séparation de la logique. Typiquement, CLI et Web nécessiteront des interfaces distinctes (interagir avec $ argv code> au lieu de
$ _ obtenir code> par exemple). Donc, il n'y a pas de besoin réel pour le même fichier i> d'être appelé des deux.
J'ai résolu le problème à l'aide de la mise en mémoire tampon de sortie.
Mon script ressemble maintenant à ceci: Note: strong> Il n'y a pas de Remarque: strong> La documentation PHP pour 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. P>
blockQuote> Il semble que cela se produise automatiquement lorsque PHP fonctionne de la ligne de commande. p> p> ?> Code> à 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. P>
ob_end_clean () code>
dit que: P>
Avez-vous besoin d'un ob_start (); code> 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.
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é: p> alors donnez-lui la permission d'être exécutée En soi: p> donc au lieu d'appeler "php myfile", vous venez maintenant d'exécuter: p> de ce dossier . J'espère que cela vous aidera! P> p>
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 i>)
@ 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> 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... }
Si vous utilisez déjà Apache pour servir PHP, il suffit de configurer Nginx comme proxy inverse pour Apache.