Funciones interesantes
curl_multi_init
Una de las extensiones mas usadas en PHP es cURL, y es genial para devolver documentos remotos. Para situaciones donde necesitas devolver multiples documentos se usa curl_multi_init y curl_multi_exec trabajan mejor con multiples documentos.
La funcion curl_multi_exec es muy poderosa, pero en la documentacion de PHP la hacen ver mas dificil de lo que realmente es. Aqui una demostracion usando Google, Bing y Facebook todos devueltos:
$urls = array('http://www.google.com/', 'http://www.facebook.com/', 'http://www.bing.com/'); $url_count = count($urls); // cuenta el numero de urls $curl_array = array(); // creamos un array llamado curl_array $ch = curl_multi_init(); // iniciamos un multirecurso curl // para las urls hay una clave que contiene su url foreach($urls as $count => $url) {
$curl_array[$count] = curl_init($url); // establecemos la url en una sesion curl refiriendonos a cada 1 con su clave curl_setopt($curl_array[$count], CURLOPT_FOLLOWLOCATION, 1); // le damos una opcion de seguir el header location curl_setopt($curl_array[$count], CURLOPT_RETURNTRANSFER, 1); // devolvemos el contenido curl_multi_add_handle($ch, $curl_array[$count]); // añadimos a cada url con sus opciones en el multirecurso } // mientras se esten ejecutando las urls realiza lo siguiente do { curl_multi_exec($ch, $exec); } while($exec > 0);
En este ejemplo hay 3 urls establecidas para devolverse al mismo tiempo.
curl_multi_getcontent
Para leer el contenido de las peticiones que hicimos anteriormente podriamos usar la funcion curl_multi_getcontent. Vamos a ver como podemos hacerlo... (el codigo siguiente se puede añadir al anterior)://para cada url devolvemos el contenido junto con la url
foreach($urls as $count => $url) { $returned = curl_multi_getcontent($curl_array[$count]); echo "$url - $returned"; }
Cerrar el manejador de cURL
Algunos programadores prefieren usar curl_close() despues de haberlo usado. Usted en lugar de utilizar curl_close() deberia utilizar curl_multi_close(), y curl_multi_remove_handle() despues de que el contenido se haya devuelto. Veamos un ejemplo:
//para cada url eliminamos el manejador, cerramos la peticion multi recurso y cada peticion de una sesion curl la cerramos
foreach($urls as $count => $url) { curl_multi_remove_handle($ch, $curl_array[$count]); } curl_multi_close($ch); foreach($urls as $count => $url) { curl_close($curl_array[$count]); }
Como anteriormente dijimos el codigo anterior puede añadirse a lo que habiamos puesto antes... de esta manera todo el codigo quedaria asi:
<?php $urls = array('http://www.google.com/', 'http://www.facebook.com/', 'http://www.bing.com/'); $url_count = count($urls); $curl_array = array(); $ch = curl_multi_init(); foreach($urls as $count => $url) { $curl_array[$count] = curl_init($url); curl_setopt($curl_array[$count], CURLOPT_FOLLOWLOCATION, 1); curl_setopt($curl_array[$count], CURLOPT_RETURNTRANSFER, 1); curl_multi_add_handle($ch, $curl_array[$count]); } do { curl_multi_exec($ch, $exec); } while($exec > 0); foreach($urls as $count => $url) { $returned = curl_multi_getcontent($curl_array[$count]); echo "$url - $returned"; } foreach($urls as $count => $url) { curl_multi_remove_handle($ch, $curl_array[$count]); } curl_multi_close($ch); foreach($urls as $count => $url) { curl_close($curl_array[$count]); } ?>
Fuente: http://www.fusionswift.com/2011/08/php-curl_multi_exec-example/
curl_setopt_array()
Con esta funcion podemos configurar multiples opciones para una transferencia cURL. Veamos un ejemplo:
<?php // creamos un nuevo recurso curl $ch = curl_init(); // establecemos las opciones apropiadas para la url $options = array( CURLOPT_URL => 'http://www.google.com/', CURLOPT_FOLLOWLOCATION => true, CURLOPT_USERAGENT => 'Googlebot/2.1 (+http://www.google.com/bot.html)', CURLOPT_RETURNTRANSFER => true ); curl_setopt_array($ch, $options); $output = curl_exec($ch); curl_close($ch); echo $output; ?>
curl_getinfo()
Esta funcion obtiene informacion relativa a una transferencia especifica. Los valores que devuelve son los siguientes:
- "url"
- "content_type"
- "http_code"
- "header_size"
- "request_size"
- "filetime"
- "ssl_verify_result"
- "redirect_count"
- "total_time"
- "namelookup_time"
- "connect_time"
- "pretransfer_time"
- "size_upload"
- "size_download"
- "speed_download"
- "speed_upload"
- "download_content_length"
- "upload_content_length"
- "starttransfer_time"
- "redirect_time"
- "certinfo"
- "request_header"
curl_version()
Obtiene la informacion de la version de cURLcURL File
Como veíamos en la parte 4 de curl, subiamos un archivo con el uso de @, pero apartir de PHP 5.5.0 ese prefijo esta obsoleto, por lo que se recomienda utilizar esta funcion.CURLFile::__Construct--curl_file_create - Crea un objeto CURLFile
Estilo orientado a objetos:
public CURLFile::__construct ( string$filename
[, string$mimetype
[, string$postname
]] )
Estilo orientado a procedimientos:
CURLFile curl_file_create ( string$filename
[, string$mimetype
[, string$postname
]] )
Crea un objeto CurlFile, utilizado para transferir (upload) un fichero con CURLOPT_POSTFIELDS.
filename - indica la ruta de acceso al fichero a ser transferido
mimetype - Tipo mime del fichero
postname - nombre del fichero
Ejemplo, estilo orientado a objetos:
<?php /* http://example.com/upload.php: <?php var_dump($_FILES); ?> */ // Crea un gestor cURL $ch = curl_init('http://example.com/upload.php'); // Crea un objeto CURLFile $cfile = new CURLFile('cats.jpg','image/jpeg','test_name'); // Asigna los datos POST $data = array('test_file' => $cfile); curl_setopt($ch, CURLOPT_POST,1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); // Ejecuta el gestor curl_exec($ch); ?>
Estilo por procedimientos:
<?php /* http://example.com/upload.php: <?php var_dump($_FILES); ?> */ // Crea un gestor cURL $ch = curl_init('http://example.com/upload.php'); // Crea un objeto CURLFile $cfile = curl_file_create('cats.jpg','image/jpeg','test_name'); // Asigna los datos POST $data = array('test_file' => $cfile); curl_setopt($ch, CURLOPT_POST,1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); // Ejecuta el gestor curl_exec($ch); ?>
Usar cURL con Expresiones regulares
Como en ejemplos anteriores usabamos la funcion preg_match y preg_match_all para ver si se encontraba determinado texto o link para poder mostrar el resultado que necesitabamos, para mas informacion sobre expresiones regulares por favor consulte:http://www.arthusu.com.mx/2013/07/phpexpresiones-regulares-pcre.html
Como en el ejemplo de subidas de archivos en la parte 4 de curl, veíamos un upload con el cual sacábamos los links usando expresiones regulares:
<?php set_time_limit(0); $url = "http://www0.xup.in/exec/xupload.php?uid=&key="; $user_agent = "Mozilla/5.0 (Windows NT 6.1; rv:28.0) Gecko/20100101 Firefox/28.0"; $referer = "http://www.xup.in/"; $directory=dirname(__FILE__).'\files/'; if(isset($_FILES['f1'])){ move_uploaded_file($_FILES['f1']['tmp_name'],"files/".$_FILES['f1']['name']); $ch = curl_init(); curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); curl_setopt($ch, CURLOPT_REFERER, $referer); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POSTFIELDS, array("F1"=>"@".$directory.$_FILES['f1']['name'])); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); $result = curl_exec($ch); if(curl_errno($ch)) { echo 'Curl error: ' . curl_error($ch); } curl_close($ch); unlink($directory.$_FILES['f1']['name']); //echo $result; preg_match_all('/<input type="text" name="t1" size="90" class="inp" value="(.*?)" onclick="highlight\(this\);" \/>/', $result, $matches); //echo '<p><img src="'.$matches[1][0].'" alt="img" /></p>'; echo '<p><b>Link: <a href="'.$matches[1][0].'" target="_blank">Archive Link</a></p>'; //print_r($matches); }else{ echo ' <form action="upload_curl.php" method="post" enctype="multipart/form-data"> <label for="f1">Filename:</label> <input type="file" name="f1" id="f1"><br> <input type="submit" name="submit" value="Submit"> </form> '; } ?>
No hay comentarios:
Publicar un comentario