Witajcie,

odpalajac powiedzmy 1000 - 2000 linkow do przeszukania za pomoca multi curl'a czasami zdarza mi sie, ze w jakims tam procencie na ktoryms tam adresie curl sie zawiesi i tak strona mieli przez powiedzmy godzine i zero efektow.

Mam co do tego pytanie, chce doprogramowac malego debugerka i chcialbym zapisywac do pliku aktualnie wykonywane prace. Cos na zasadzie, biore linka nr 1, wchodze na niego, sprawdzam, plus komunikat, ze sie udalo cos znalezc, lub nie.

np dzialajac na takim standardowym multi curl kodzie:

  1. $s = microtime(true);
  2. $urls = array(
  3. "http://localhost/r.php?echo=request1",
  4. "http://localhost/r.php?echo=request2",
  5. "http://localhost/r.php?echo=request3"
  6. );
  7. $pg = new ParallelGet($urls);
  8. print "<br />total time: ".round(microtime(true) - $s, 4)." seconds";
  9.  
  10. class ParallelGet
  11. {
  12. function __construct($urls)
  13. {
  14. $mh = curl_multi_init();
  15. foreach($urls as $i => $url)
  16. {
  17. $ch[$i] = curl_init($url);
  18. curl_setopt($ch[$i], CURLOPT_RETURNTRANSFER, 1);
  19. curl_multi_add_handle($mh, $ch[$i]);
  20. }
  21.  
  22. do {
  23. $execReturnValue = curl_multi_exec($mh, $runningHandles);
  24. } while ($execReturnValue == CURLM_CALL_MULTI_PERFORM);
  25. while ($runningHandles && $execReturnValue == CURLM_OK) {
  26. $numberReady = curl_multi_select($mh);
  27. if ($numberReady != -1) {
  28. do {
  29. $execReturnValue = curl_multi_exec($mh, $runningHandles);
  30. } while ($execReturnValue == CURLM_CALL_MULTI_PERFORM);
  31. }
  32. }
  33.  
  34. if ($execReturnValue != CURLM_OK) {
  35. trigger_error("Curl multi read error $execReturnValue\n", E_USER_WARNING);
  36. }
  37.  
  38. foreach($urls as $i => $url)
  39. {
  40. $curlError = curl_error($ch[$i]);
  41. if($curlError == "") {
  42. $res[$i] = curl_multi_getcontent($ch[$i]);
  43. } else {
  44. print "Curl error on handle $i: $curlError\n";
  45. }
  46. curl_multi_remove_handle($mh, $ch[$i]);
  47. curl_close($ch[$i]);
  48. }
  49. curl_multi_close($mh);
  50.  
  51. print_r($res);
  52. }
  53.  
  54. }


teraz pytanie, ktory z kawalkow kodu moglbybyc odpowiedzialny za np zablokowanie sie skryptu. czy to sam curl_multi_exec, ktory jako pierwszy w petli do... while jest wykonywany:
do {
$execReturnValue = curl_multi_exec($mh, $runningHandles);
} while ($execReturnValue == CURLM_CALL_MULTI_PERFORM);

czy tez w tym kawalku kodu:

while ($runningHandles && $execReturnValue == CURLM_OK) {
$numberReady = curl_multi_select($mh);
if ($numberReady != -1) {
do {
$execReturnValue = curl_multi_exec($mh, $runningHandles);
} while ($execReturnValue == CURLM_CALL_MULTI_PERFORM);
}

moze pobranie tresci jest tym momentem, w ktorym skrypt moze sie przywiesic:

curl_multi_getcontent()

Gdybym wiedzial, ktory z tych elementow moze przywiesic skrypt, moglbym umiescic tam debugerka notujacego zdarzenia.

Czyli czy samo wykonanie curl_multi_exec to juz jest odwiedzenie strony/zainicjowanie proby wejscia na nia, czy dopiero curl_multi_getcontent moglby wygenerowac jakis wyjatek, zacinajacy strone?