2011-03-23 60 views
22

Necesito implementar una forma de realizar llamadas POST a páginas ubicadas en el mismo servidor o en otro servidor. No podemos usar include porque los archivos a los que llamamos usualmente llaman bases de datos diferentes o tienen funciones con el mismo nombre.¿Puedo hacer una solicitud de CURL al mismo servidor?

He intentado implementar esto usando curl, y aunque funciona perfectamente cuando llamo a archivos desde otro servidor, no obtengo absolutamente nada al hacer una llamada al mismo servidor donde está el archivo.

Editar para añadir algo de código: una versión simplificada de lo que estoy haciendo:

file1.php

<?php 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "www.myserver.com/File2.php"); 
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_VERBOSE, true); 
$result = curl_exec($ch); 
curl_close($ch); 
echo $result; 
?> 

file2.php

<?php 
echo "I'M IN!!"; 
?> 

Después de llamar file1.php , No recibo nada, pero si File2.php está en otro servidor, entonces obtengo un resultado. ¿Alguna ayuda?

He intentado utilizar tanto la dirección URL del servidor (http ...) y la dirección total de los archivos (/ home/wwww ....)

+0

no arregla el problema real de táctica en alguna solución hacky –

+0

sí, puede solicitarlo normalmente, pero no cambie la URL como archivo en local. use url como un servidor remoto, por ejemplo: http://site.com ... ¿puedo ver su código? –

+0

En lugar de utilizar una dirección completa como "http://misitio.com", use "localhost". Funcionó en mi caso. – MKatleast3

Respuesta

44

en cuenta que si usted está emitiendo la solicitud de CURL su propio sitio, está utilizando el manejador de sesión predeterminado, y la página que está solicitando mediante CURL utiliza la misma sesión que la página que genera la solicitud, se encontrará con una situación de punto muerto.

El controlador de sesión predeterminado bloquea el archivo de sesión mientras dure la solicitud de página. Cuando intenta solicitar otra página utilizando la misma sesión, esa solicitud subsiguiente se suspenderá hasta que la solicitud agote el tiempo o hasta que el archivo de sesión esté disponible. Como está haciendo un CURL interno, el script que ejecuta CURL mantendrá un bloqueo en el archivo de sesión, y la solicitud CURL nunca podrá completarse ya que la página de destino nunca puede cargar la sesión.

+0

Entonces, ¿no puedo hacer una solicitud CURL al mismo servidor? ¿Hay alguna manera de evitar esto? – Trialien

+21

Puede, simplemente asegúrese de que la secuencia de comandos que hace la solicitud CURL cierra la sesión con 'session_write_close()' inmediatamente antes de 'curl_exec()'. Siempre puede hacer un 'session_start()' nuevamente luego si necesita cambiar algo en la sesión. –

+3

Supongo que el comentario de Marc debe estar en la respuesta, ya que simplemente solucionó mi problema aquí –

1

Debería refactorizar su código. Además de lo que Marc B mencionó, este enfoque ralentizará innecesariamente su script (potencialmente por un amplio margen) y causará mucha confusión. Sin ofender, pero esto es solo una solución increíblemente hacky para la mala lógica.

+0

Entiendo lo que quiere decir, pero esto no es algo que estamos haciendo en nuestro servidor de producción, esto se usará para procesos en segundo plano donde el rendimiento no es problema. Aún así, gracias por tu aporte. – Trialien

2

Porque cuando intentó solicitar al servidor local con la IP pública, apache no pudo resolver su dominio local. Por lo tanto, debe verificar qué IP local Apache está usando para ese dominio. Luego debe editar el archivo/etc/hosts y agregar la nueva fila con la dirección local más su dominio. Por ejemplo:

mi IP local para ese dominio en el host virtual de Apache es: 172.190.1.120 y mi dominio es mydomain.com así que voy a añadir:

172.190.1.120 mydomain.com

Entonces tu rizo funcionará correctamente

+0

Esto me estaba pasando :) La solicitud de curl funcionó para todas las URL, pero la mía y esto funcionó. Gracias por la solución – Sogeking

Cuestiones relacionadas