web-dev-qa-db-fra.com

Problèmes avec un PHP Script shell: "Impossible d'ouvrir le fichier d'entrée"

Ok, je essaie de créer un enregistreur de courrier électronique utilisant un script Shell PHP. J'ai configuré CPanel pour diriger les emails vers mon script. Je suis sûr que tout est configuré correctement. Cependant, j'ai des problèmes avec le script, ainsi que n'importe quel script lors de son exécution à partir du Shell.

voici un exemple.

#!/usr/local/bin/php –q
<?php

/* Read the message from STDIN */
$fd = fopen("php://stdin", "r");
$email = ""; // This will be the variable holding the data.
while (!feof($fd)) {
$email .= fread($fd, 1024);
}
fclose($fd);
/* Saves the data into a file */
$fdw = fopen("mail.txt", "w+");
fwrite($fdw, $email);
fclose($fdw);
/* Script End */
?>

Vraiment simple, non? Lire à partir de STDIN et écrire dans un fichier ... Je pensais que quelque chose n'allait pas, incapable de lire STDIN pour une raison quelconque. Le fournisseur d'hébergement le permet, allow_url_open et allow_url_include sont tous deux activés.

Lors de l'exécution du script via SSH, l'erreur suivante apparaît: Impossible d'ouvrir le fichier d'entrée: âq

Alors encore une fois, je pensais que c’était le scénario qui me disait que c’était impossible de lire STDIN

J'ai donc juste essayé un script simple.

#!/usr/local/bin/php –q
<?php
echo 'Hello World';
?>

Même chose: Impossible d'ouvrir le fichier d'entrée: âq

Il semble donc que le programme PHP m’indique qu’il est incapable d’ouvrir le script? Le script est situé dans $ HOME/mail/forward (CHMOD 755) et le script lui-même est CHMOD 755, ainsi que le fichier mail.txt est CHMOD 755 Je suis vraiment perplexe.

11
Mike L.

As-tu essayé:

#!/usr/local/bin/php

C'est à dire. sans la partie -q? C'est ce que le message d'erreur "Impossible d'ouvrir le fichier d'entrée: -q" signifie. Le premier argument de php s'il ne ressemble pas à une option est le nom du fichier PHP à exécuter, et -q correspond uniquement à CGI.

EDIT: Quelques conseils (non liés):

  1. Vous n'avez pas besoin de terminer le dernier bloc de PHP avec ?>. En fait, il vaut souvent mieux ne pas le faire.
  2. Lorsqu'il est exécuté sur la ligne de commande, PHP définit la constante globale STDIN à fopen("php://stdin", "r"). Vous pouvez l'utiliser au lieu d'ouvrir une deuxième fois "php://stdin": $fd = STDIN;
6
Daniel Trebbien

Je viens d’éprouver ce problème et c’est parce que j’essayais d’exécuter un script à partir du mauvais répertoire .. doh! Ça arrive aux meilleurs d'entre nous.

8
JustinP

Lorsque vous utilisez l'argument php CLI -q n'existe pas.

J'ai eu le même problème lorsque j'ai écrit un script sous Windows (Eclipse) et que j'ai essayé de le faire fonctionner sous Linux. Chaque ligne du fichier Windows est terminée par\r\n. Je devais supprimer\r en première ligne qui contenait le chemin de l'analyseur:

Lorsque\r a été supprimé de la première ligne (mcedit affiché: ^ M), le script a été exécuté correctement.

4
programer

J'ai atterri sur cette page lorsque j'ai cherché une solution pour “Impossible d'ouvrir le fichier d'entrée” error. Voici mes 2 cents pour cette erreur.

J'ai rencontré cette même erreur alors que j'utilisais des paramètres dans mon chemin de fichier php comme ceci:

/usr/bin/php -q /home/**/public_html/cron/job.php?id=1234

Mais j'ai découvert que ce n'est pas la bonne façon de le faire. La manière correcte d’envoyer des paramètres est la suivante:

/usr/bin/php -q /home/**/public_html/cron/job.php id=1234

Il suffit de remplacer le "?" par un espace " ".

2
Ram Shengale

Problème d'encodage de caractères Windows

J'avais le même problème. J'étais en train de modifier des fichiers dans PDT Eclipse sous Windows et de les utiliser WinSCP. Je viens de copier et coller le contenu dans une nano-fenêtre, sauvegardé, et maintenant ils ont travaillé. Certainement un problème d’encodage de caractères Windows, et non pas un Shebang ou un indicateur d’interprète.

2
Joseph Lust

En raison d'un problème d'encodage des fenêtres pour moi

J'ai rencontré cette erreur "Impossible d'ouvrir le fichier d'entrée". Puis j'ai obtenu le fichier en utilisant wget à partir d'un autre système Linux, et l'erreur ne s'est pas produite. 

L'erreur ne s'est produite que pour moi lorsque le fichier a transité par Windows.

0
steampowered

Pour moi, le problème était que je devais utiliser la commande /usr/bin/php-cgi au lieu de /usr/bin/php

php-cgi est la commande lancée lorsque vous y accédez via un navigateur Web.

php est la commande en ligne de commande de la CLI.

Je ne sais pas pourquoi php cli ne fonctionne pas, mais utiliser php-cgi a résolu le problème pour moi.

0
jsherk