2008-11-20 12 views
11

Estoy tratando de obtener el contenido de otro archivo con file_get_contents (no preguntes por qué). Tengo dos archivos: test1.php y test2.php. Test1.php devuelve una cadena, se basa en el usuario que ha iniciado sesión.No puedo enviar cookies con file_get_contents

Test2.php intenta obtener los contenidos de test1.php y está siendo ejecutado por el navegador, obteniendo así las cookies.

Para enviar las galletas con file_get_contents, se crea un contexto en streaming:

$opts = array('http' => array('header'=> 'Cookie: ' . $_SERVER['HTTP_COOKIE']."\r\n"))`; 

estoy al recuperar el contenido con:

$contents = file_get_contents("http://www.domain.com/test1.php", false, $opts); 

Pero ahora me sale el error:

Warning: file_get_contents(http://www.domain.com/test1.php) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found

¿Alguien sabe lo que estoy haciendo aquí?

editar: se olvidó de mencionar: Sin el contenido de la transmisión, la página solo carga. Pero sin las cookies no obtengo la información que necesito.

+0

FYI- si está utilizando A2hosting debe solicitar que se otorgue el acceso fopen (lo cierran de manera predeterminada por razones de seguridad) –

Respuesta

24

En primer lugar, esto es probablemente solo un error ortográfico en su pregunta, pero el tercer argumento para file_get_contents() debe ser su contexto de transmisión, NO la matriz de opciones. Hice una prueba rápida con algo como esto, y todo funcionó como se esperaba

$opts = array('http' => array('header'=> 'Cookie: ' . $_SERVER['HTTP_COOKIE']."\r\n")); 
$context = stream_context_create($opts); 
$contents = file_get_contents('http://example.com/test1.txt', false, $context); 
echo $contents; 

El error indica que el servidor está regresando a Try 404. ir a buscar la URL de la máquina de PHP se está ejecutando en y no de su estación de trabajo/escritorio/computadora portátil. Es posible que su servidor web tenga problemas para llegar al sitio, que su máquina local tenga una copia almacenada en caché o alguna otra falla de la red.

Asegúrese de repetir su solicitud exacta al ejecutar esta prueba, incluida la cookie que está enviando (la curva de línea de comandos es buena para esto). Es muy posible que la página en cuestión se cargue bien en un navegador sin la cookie, pero cuando envía la cookie el sitio realmente está devolviendo un 404.

Asegúrese de que $ _SERVER ['HTTP_COOKIE'] tenga la cookie cruda tu piensas que sí.

Si está raspando la pantalla, descargue Firefox y una copia de la extensión LiveHTTPHeaders. Realice todos los pasos necesarios para llegar a la página que desee en Firefox. Luego, usando la salida de LiveHTTPHeaders, recree exactamente la misma solicitud de requence. Incluya cada encabezado, no solo las cookies.

Por último, PHP Curl existe por algún motivo. Si es posible, (¡no lo estoy preguntando!) Utilícelo en su lugar. :)

+0

Al usar este código recibo un error de "error en el encabezado HTML", por lo que necesito para obtener una solución agregando "session_write_close();" antes de file_get_contents. ¿Es esta la forma correcta? – KinjalMistry

0

Asegúrese de que file1.php exista en el servidor. ¡Intenta abrirlo en tu propio navegador para asegurarte!

1

Solo por curiosidad, ¿estás intentando file_get_contents en una página que tiene un espacio en él? Recuerdo que traté de usar fgc en una URL que tenía un espacio en el nombre y, aunque mi navegador web lo analizó bien, fgc no lo hizo. Terminé teniendo que usar un str_replace para reemplazar '' con '% 20'.

Creo que esto debería haber sido relativamente fácil de detectar, ya que solo reportaría la mitad del nombre del archivo. Además, noté en una de estas publicaciones, alguien usó \ r \ n mientras definía los encabezados. Tenga en cuenta que a PHP no le gusta que estén entre comillas simples, pero funcionan bien en doble.

8

Solo para compartir esta información. Al usar session_start(), el archivo de sesión está bloqueado por PHP. Por lo tanto, el script real es el único script que puede acceder al archivo de sesión. Si intenta acceder a través de fsockopen() o file_get_contents() puede esperar mucho tiempo desde que intenta abrir un archivo que se ha bloqueado.

Una forma de resolver este problema es utilizar el session_write_close() para desbloquear el archivo y volver a cerrar después con session_start().

Ejemplo:

<?php 
$opts = array('http' => array('header'=> 'Cookie: ' . $_SERVER['HTTP_COOKIE']."\r\n")); 
$context = stream_context_create($opts); 
session_write_close(); // unlock the file 
$contents = file_get_contents('http://120.0.0.1/controler.php?c=test_session', false, $context); 
session_start(); // Lock the file 
echo $contents; 
?> 

Desde file_get_contents() es una función de bloqueo, tanto en la escritura no estará en la concurrencia al tratar de modificar el archivo de sesión.

Pero estoy seguro de que esta no es la mejor manera de manipular la sesión con una extensión de conexión.

Por cierto: es más rápido que cURL y fsockopen()

Avísame si encuentra algo mejor.

+3

Muchas gracias por publicar esto :) Ojalá pudiera dar más votos positivos porque me salvaste de quitarme todo el pelo. –

+1

Gracias, es un placer para mí compartir;) – Kursion

Cuestiones relacionadas