2010-12-31 14 views
9

Ok, estoy intentando para crear un registrador de correo electrónico, que utiliza un script de shell PHP. He configurado CPanel para canalizar correos electrónicos a mi script. Estoy seguro de que todo esto está configurado correctamente. Sin embargo, estoy teniendo problemas con el script, así como con cualquier script al momento de ejecutarlo desde el shell.Problemas con un script de shell de PHP: "No se pudo abrir el archivo de entrada"

aquí hay un ejemplo.

#!/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 */ 
?> 

Real simple, ¿no? Lea de STDIN y escriba en un archivo ... Pensé que algo andaba mal, que no podía leer STDIN por algún motivo. El proveedor de alojamiento lo permite, allow_url_open y allow_url_include están ambos encendidos.

Al ejecutar la secuencia de comandos a través de SSH me sale el siguiente error: No se pudo abrir archivo de entrada: AQ

Así que una vez pensé que era el guión que me dice, es decir, no se pudo leer de STDIN

Así que probé un simple script.

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

La misma cosa: No se pudo abrir archivo de entrada: AQ

Así que parece que el programa PHP me está diciendo que no es capaz de abrir el guión? El script se encuentra en $ HOME/mail/forward (CHMOD 755) y el script en sí es CHMOD 755, y el archivo mail.txt es CHMOD 755 . Estoy realmente perplejo con esto.

+0

¿Qué editor de texto usas para el código php? El "-" en tu "-q" parece un en-tablero en lugar de un signo menos. –

Respuesta

4

Ha intentado:

#!/usr/local/bin/php 

es decir, sin la parte -q? Eso es lo que significa el mensaje de error "No se pudo abrir el archivo de entrada: -q". El primer argumento para php si no se ve como una opción es el nombre del archivo PHP para ejecutar, y -q es solo CGI.

EDIT: Un par de consejos (no relacionadas):

  1. No es necesario para terminar el último bloque de PHP con ?>. De hecho, a menudo es mejor no hacerlo.
  2. Cuando se ejecuta en la línea de comandos, PHP define la constante global STDIN a fopen("php://stdin", "r"). Puede usar que en lugar de abrir una segunda vez "php://stdin": $fd = STDIN;
+0

Gracias, cuando eliminé el -q, recibí otro error que fue fopen ("mail.txt") quería la ruta absoluta /home/user/mail/forward/mail.txt No pensé en eso desde que estaba afuera de mi directorio public_html php necesitaba una ruta absoluta. Mi pregunta es, ¿cómo puedo suprimir cualquier salida si no es -q? Si en caso de error, el script genera algo, el usuario que envió el correo recibirá un rebote, por lo que todo lo que he leído en las tuberías de correo electrónico quiere que use -q –

+0

Para suprimir las advertencias de cualquier llamada a función, usted puede usar un signo at: '$ fp = @fopen (" mail.txt ")'. –

+0

Entonces, ¿no hay un interruptor CLI para suprimir la salida de un script? –

1

codificación de caracteres de Windows Edición

que estaba teniendo el mismo problema. Estaba editando archivos en PDT Eclipse en Windows y WinSCPing. Acabo de copiar y pegar los contenidos en una ventana nano, guardados, y ahora funcionó. Definitivamente algún problema de codificación de caracteres de Windows, y no una cuestión de Shebangs o banderas de intérprete.

4

Cuando utiliza php, el argumento CLI -q no existe.

Tuve el mismo problema cuando escribí un script en Windows (eclipse) y traté de ejecutarlo en Linux. Cada línea en el archivo de Windows finaliza con \ r \ n.Tenía que eliminar \ r en primera línea que contenía ruta analizador:

Cuando r \ fue eliminada de primera línea (mcedit muestra \ r^como M) Script ejecutado correctamente.

5

que acaba de experimentar este problema y que era porque yo estaba tratando de ejecutar un script desde el directorio equivocado .. Do! Le sucede a lo mejor de nosotros.

+0

Me ahorraste mucho esfuerzo ... Y café ... Y maldiciendo ... –

0

Debido a las ventanas que codifican problema para mí

que experimentaron este "Podría archivo de entrada no está abierto" error. Luego obtuve el archivo usando wget de otro sistema Linux, y el error no ocurrió.

WS error ocurre solamente para mí cuando el archivo transitó a través de ventanas.

0

Alteré en esta página al buscar una solución para "No se pudo abrir el archivo de entrada" error. Aquí están mis 2 centavos por este error.

que se enfrentaron a este mismo error al porque estaba usando parámetros en mi ruta del archivo php como esta:

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

Pero me di cuenta que esta no es la forma correcta de hacerlo. La forma correcta de enviar parámetros es la siguiente:

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

basta con sustituir el "?" con un espacio " ".

0

Para mí el problema fue que tuve que usar /usr/bin/php-cgi comandos en lugar de simplemente /usr/bin/php

php-cgi es la instrucción ejecutada cuando se accede a través del navegador web.

php es el comando de línea de comandos CLI.

No sé por qué PHP CLI no está funcionando, pero corriendo con php-cgi vez solucionado el problema para mí.

Cuestiones relacionadas