Hay varias maneras de mostrar un URL remoto en PHP. La elección de un método sobre otro depende de las necesidades de su simplicidad, control y portabilidad. Los tres métodos descritos en este post son los estandares file function, la extensión cURL, y la clase de PEAR HTTP_Request. Estos tres métodos pueden generalmente hacer todo lo que necesita y por lo menos uno de ellos deben estar disponibles, sea cual sea su configuración del servidor o capacidad de instalar las extensiones personalizadas. Otras formas de recuperar las URL remotas incluye la extesión pecl_http (http://pecl.php.net/package/pecl_http), que, aunque todavía en desarrollo, ofrece algunas características prometedoras, y utilizando el fsockopen() para abrir un zócalo sobre el que envía una petición HTTP que lo construye pieza por pieza.
El uso del estandar "file function" como la función file_get_contents() es simple y conveniente. Sigue automaticamente las redirecciones, así que si utiliza esta función para recuperar el directorio http://www.example.com/persona/ y el servidor le redirecciona a http://www.example.com/people/, obtendrá el contenido de la página de índice de directorio, no un mensaje que le dice que la URL ha cambiado de dirección. También las funciones de archivo estándar de trabajo tanto con HTTP y FTP. El inconveniente de este método es que requiere la directiva de configuración allow_url_fopen a estar activado.
La extensión CURL es una poderosa herramienta. Se basa en el popular libcurl (http://curl.haxx.se/) para proporcionar un rápido, configurable mecanismo para el manejo de una amplia variedad de peticiones de red. Si esta extensión está disponible en su servidor, le recomendamos que utilice.
Si se desactiva allow_url_fopen y cURL no está disponible, el módulo PEAR HTTP_Request salva el día. Al igual que todos los módulos de PEAR, es puro PHP, por lo que si puede guardar un archivo PHP en su servidor, puede utilizarlo. HTTP_Request soporta casi cualquier cosa que te gustaría hacer cuando se solicite una URL remota, incluyendo la modificación de cabeceras de petición y el cuerpo, utilizando un método arbitrario, respuesta y recuperación de los encabezados. Para mas informacion sobre como instalar los modulo de PEAR puedes ir a http://pear.php.net/manual/en/installation.getting.php
Para recibir información de URL seguras, solo escribe https en vez de http. Siempre y cuando en PHP haya sido construido en una libreria SSL tal como OpenSSL, todas las funciones que pueden recibir información de URL regulares pueden recibir información de URL seguras. Verifica la sección de "openssl" en la salida de phpinfo() para ver si tu configuración de php tiene soporte de SSL.
Aquí hay varios ejemplos de lo que se puede hacer con los 3 métodos.
Para trabajar con cURL existe una librería que facilita la forma de trabajar con cURL https://github.com/rmccue/Requests
Obteniendo una URL con file_get_contents()
Código PHP:
Ver original
<?php echo $page; ?>
Obteniendo una URL con cURL
Código PHP:
Ver original
<?php echo $page; ?>
Obteniendo una URL con HTTP_Request
Código PHP:
Ver original
<?php require_once 'HTTP/Request.php'; $r->sendRequest(); $page = $r->getResponseBody(); echo $page; ?>
Mostrar una pagina protegida con file_get_contents()
Código PHP:
Ver original
<?php echo $page; ?>
Mostrar una pagina protegida con cURL
Código PHP:
Ver original
<?php echo $page; ?>
Mostrar una pagina protegida con HTTP_Request
Código PHP:
Ver original
<?php require 'HTTP/Request.php'; $r->setBasicAuth('FDW','PASS'); $r->sendRequest(); $page = $r->getResponseBody(); echo $page; ?>
Enviar por el método de POST requiere de manejo especial en cada argumento. Con el método de GET, estos argumentos están en la cadena de consulta, pero en un POST van en la solicitud cuerpo. Además, la solicitud necesita una cabecera Content-Length que le dice al servidor el tamaño del contenido a esperar en la solicitud cuerpo.
Mostrar una dirección URL con el método de POST en vez del metdo de GET es bien útil cuando la cadena es muy larga, más de 200 caracteres aproximadamente. La especificación de HTTP 1.1 en el RFC 2616 no impone una longitud máxima en las URL, por lo que el comportamiento varía entre las diferentes web y servidores proxy. Si al mostrar las URL con GET y recibes resultados inesperados o resultados con el código de estado 414 ( "Request-URI Too Long"), convierte la solicitud al metodo de POST.
Usar el metodo de POST con file_get_contents()
Código PHP:
Ver original
<?php $url = 'http://www.example.com/submit.php'; $body = 'FDW=programacion&PHP=f18'; echo $page; ?>
Usar el metodo de POST con cURL
Código PHP:
Ver original
<?php $url = 'http://www.example.com/submit.php'; $body = 'FDW=programacion&PHP=f18'; echo $page; ?>
Usar el metodo de POST con HTTP_Request
Código PHP:
Ver original
<?php require 'HTTP/Request.php'; $url = 'http://www.example.com/submit.php'; $r->setMethod(HTTP_REQUEST_METHOD_POST); $r->addPostData('FDW','programacion'); $r->addPostData('PHP','f18'); $r->sendRequest(); $page = $r->getResponseBody(); echo $page; ?>
Las cookies se envían al servidor en el encabezado de solicitud de cookies. La extensión cURL tiene una opción específica en cookies, pero con HTTP_Request, tienes que agregar el encabezado de cookies al igual que con otras cabeceras de petición. Los valores de Cookie múltiples se envían en una lista delimitada por coma. En los ejemplos vamos a enviar dos cookies: una con el nombre de user y con el valor FDW y otra con el nombre de actividad y con el valor de programacion.
Enviar cookies con file_get_contents()
Código PHP:
Ver original
'method' => 'GET', 'header' => 'Content-type: text/plain;charset=UTF-8' . PHP_EOL . 'Referer: http://www.forosdelweb.com' . PHP_EOL . 'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6' . PHP_EOL . 'Cookie: user=FDW; actividad=programacion;' . PHP_EOL ) ); echo $page;
Enviar cookies con cURL
Código PHP:
Ver original
<?php echo $page; ?>
Enviar cookies con HTTP_Request
Código PHP:
Ver original
<?php require 'HTTP/Request.php'; $r->addHeader('Cookie','user=FDW; actividad=programacion'); $r->sendRequest(); $page = $r->getResponseBody(); echo $page; ?>