PHP: Parallele Abfragen mit cURL durchführen
PHP-Logo (Quelle: php.net)

PHP: Parallele Abfragen mit cURL durchführen

Mit cURL lassen sich URLs parallel abfragen. Das funktioniert schneller als die Abfragen nacheinander durchzuführen.

Zunächst wird ein Array mit den URLs für die parallelen Abfragen benötigt.

1
2
3
4
5
6
7
$urls=array
(
   'http://domain.de/url-1.html',
   'http://domain.de/url-2.html',
   'http://domain.de/url-3.html',
   'http://domain.de/url-4.html'
);
Mit einem Doppelklick kann der gesamte Code markiert werden.

Für jede URL muss eine neue cURL-Session initialisiert werden. Die cURL-Optionen für jede Session werden ebenfalls festgelegt. Die cURL-Sessions werden im Array $curls gespeichert.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$curls=array();
         
foreach($urls as $id => $url)
{
   $curls[$id]=curl_init();
   
   curl_setopt($curls[$id],CURLOPT_POST,false);
   curl_setopt($curls[$id],CURLOPT_SSL_VERIFYPEER, 0);
   curl_setopt($curls[$id],CURLOPT_SSL_VERIFYHOST, 0);
   curl_setopt($curls[$id],CURLOPT_HEADER,1);
   curl_setopt($curls[$id],CURLOPT_NOBODY,0);
   curl_setopt($curls[$id],CURLOPT_RETURNTRANSFER,1);
   curl_setopt($curls[$id],CURLOPT_CONNECTTIMEOUT,20);
   curl_setopt($curls[$id],CURLOPT_TIMEOUT,20);
   curl_setopt($curls[$id],CURLOPT_FOLLOWLOCATION,0);
   curl_setopt($curls[$id],CURLOPT_URL,$url);
}
Mit einem Doppelklick kann der gesamte Code markiert werden.

Danach wird der cURL-Multi-Handle initialisiert. Diesem werden die zuvor erstellten cURL-Sessions durch die Funktion curl_multi_add_handle zugewiesen.

1
2
3
4
5
6
$mh=curl_multi_init();

foreach($curls as $id => $curl)
{
   curl_multi_add_handle($mh,$curls[$id]);
}
Mit einem Doppelklick kann der gesamte Code markiert werden.

Jetzt können die parallelen Abfragen gestartet werden. Die einzelnen Ergebnisse werden im Array $results gespeichert und können danach weiterverarbeitet werden.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
do
{
   usleep(10000);
   curl_multi_exec($mh,$running);
}
while($running > 0);


$results=array();

foreach($curls as $id => $curl)
{
   $results[$id]=curl_multi_getcontent($curl);
   curl_multi_remove_handle($mh,$curl);
}
Mit einem Doppelklick kann der gesamte Code markiert werden.

Geschrieben von: Jens Richter