Obtener código remoto con PHP
Una de las operaciones o tareas que se te presentan como programador es la necesidad de tener que acceder a otro servidor para ejecutar alguna función o código obteniendo algún resultado. Estamos hablando de la ejecución de código remoto.
Uno de los últimos casos de este tipo que he tenido que solucionar es la necesidad de que desde un módulo de Prestashop en una tienda de destino, por ejemplo: (http://destinationshop.com) se pueda hacer login como cliente a una tienda de otro dominio (http://www.myshop.com).
En la tienda de este dominio (http://www.myshop.com) tenemos un script que hace todo el proceso de login recibiendo como parámetros el email y contraseña y retorna mediante un echo un «ok» en caso de éxito o «nok» en el caso de no éxito.
Inicialmente conocí la función file_get_contents() que nos saca del paso perfectamente. Por ejemplo la puedes usar así:
$result = file_get_contents("http://www.myshop.com/script_login.php?email=demo@demo.com&password=demodemo");
echo $result;
Simplemente estamos llamando a una función ya desarrollada por PHP que lo que hace es acceder a esta ruta indicada ejecutando y recibiendo el resultado.
El inconveniente de esta función es que solo funciona si está habilitada en el servidor las directivas:
allow_url_fopen = On
allow_url_include = On
La inclusión y ejecución de archivos remotos no son muy seguros, por este motivo hay muchos servidores que la tienen desactivada estas directivas por seguridad. Es un problema añadido tener que solicitar la activación de esta directivas en cada servidor que se pretenda hacer funcionar.
Este problema se puede solucionar fácilmente con cURL, el programa bastante más seguro de Linux que permite realizar transferencias de archivos desde distintos protocolos.
El siguiente código ejecutaría lo mismo que file_get_contents() de forma más segura en cualquier servidor:
$ch = curl_init("http://www.myshop.com/script_login.php?email=demo@demo.com&password=demodemo");
$result = curl_exec ($ch);
curl_close ($ch);
Te olvidas de decir que CURL no siempre esta disponible en los servidores compartidos.
Un saludo