cURL Solicitudes simultáneas múltiples (verificación de dominio)

Intento tomar una lista de más de 20,000 nombres de dominio y verificar si están “vivos”. Todo lo que realmente necesito es un simple chequeo de código http pero no puedo encontrar la manera de hacerlo funcionar con curl_multi. En un script separado que estoy usando, tengo la siguiente función que comprueba simultáneamente un lote de 1000 dominios y devuelve el código de respuesta json. Tal vez esto se puede modificar para obtener el código de respuesta http en lugar del contenido de la página.

(perdón por la syntax que no pude conseguir pegar como un buen bloque de código sin ir línea por línea y agregar 4 espacios … (también intenté omitir una línea y agregar 8 espacios)

$ dotNetRequests = array of domains …

//loop through arrays foreach(array_chunk($dotNetRequests, 1000) as $Netrequests) { $results = checkDomains($Netrequests); $NetcurlRequest = array_merge($NetcurlRequest, $results); } function checkDomains($data) { // array of curl handles $curly = array(); // data to be returned $result = array(); // multi handle $mh = curl_multi_init(); // loop through $data and create curl handles // then add them to the multi-handle foreach ($data as $id => $d) { $curly[$id] = curl_init(); $url = (is_array($d) && !empty($d['url'])) ? $d['url'] : $d; curl_setopt($curly[$id], CURLOPT_URL, $url); curl_setopt($curly[$id], CURLOPT_HEADER, 0); curl_setopt($curly[$id], CURLOPT_RETURNTRANSFER, 1); // post? if (is_array($d)) { if (!empty($d['post'])) { curl_setopt($curly[$id], CURLOPT_POST, 1); curl_setopt($curly[$id], CURLOPT_POSTFIELDS, $d['post']); } } curl_multi_add_handle($mh, $curly[$id]); } // execute the handles $running = null; do { curl_multi_exec($mh, $running); } while($running > 0); // get content and remove handles foreach($curly as $id => $c) { // $result[$id] = curl_multi_getcontent($c); // if($result[$id]) { if (curl_multi_getcontent($c)){ //echo "yes"; $netName = $data[$id]; $dName = str_replace(".net", ".com", $netName); $query = "Update table1 SET dotnet = '1' WHERE Domain = '$dName'"; mysql_query($query); } curl_multi_remove_handle($mh, $c); } // all done curl_multi_close($mh); return $result; } 

En cualquier otro idioma, utilizarías este tipo de operación …

https://github.com/krakjoe/pthreads

Y también puedes en PHP 🙂

Yo sugeriría unos pocos trabajadores en vez de 20,000 hilos individuales … no que 20,000 hilos estén fuera de lo posible, no lo es … pero eso no sería un buen uso de los recursos, haría lo que tú están ahora y tienen 20 trabajadores obteniendo los resultados de 1000 dominios cada uno … Supongo que no me necesitas para dar el ejemplo de obtener un código de respuesta, estoy seguro de que curl te lo daría, pero probablemente sea demasiado para use curl siendo que no necesita sus capacidades de subprocesamiento: podría fsockopen el puerto 80, fprintf GET HTTP / 1.0 / \ n \ n, daña la primera línea y cierra la conexión … si va a hacer esto todo el tiempo entonces también usaría Connection: cerrar para que las máquinas receptoras no tengan conexiones innecesarias …

Este script funciona muy bien para manejar solicitudes cURL simultáneas masivas usando PHP. ¡Puedo analizar a través de 50k dominios en solo unos minutos usándolo!

https://github.com/petewarden/ParallelCurl/