Witam

Piszę skrypt któey sprawdz istnienie plików na zdalnym serwerze http. Postanowiłem wykorzystać interfejs curl_multi. Ponieważ to moje pierwsze kroki w OOP wziąłem na warsztat jako przykład klasę z artykułu o curl_multi z php.pl.
Klasa jest wywoływana cyklicznie (kilkanaście tyśiecy razy) za każdym razem ma sprawdzić czy istnieje od kilku do kilkunastu plików.
Parametrem klasy jest tablica zawierająca m.in url pliku, oraz pole status które po sprawdzeniu jest zmodyfikowane na 'ok' lub komunikat błędu np. '404 not exists'.
Kod:

  1. <?php
  2. $files[]=Array( 'url' =>'http://........./ACE20006_3.jpg', 'file' => 'ACE20006_3.jpg', 'status' => 'new');
  3. $files[]=Array( 'url' =>'http://........./ACE20006_4.jpg', 'file' => 'ACE20006_4.jpg', 'status' => 'new');
  4. $files[]=Array( 'url' =>'http://........./ACE20021_1.jpg', 'file' => 'ACE20021_1.jpg', 'status' => 'new');
  5. $files[]=Array( 'url' =>'http://........./ACE20021_2.jpg', 'file' => 'ACE20021_2.jpg', 'status' => 'new');
  6. $files[]=Array( 'url' =>'http://........./ACE20021_3.jpg', 'file' => 'ACE20021_3.jpg', 'status' => 'new');
  7.  
  8. $x = multiCURL::existsTable($files,'image/jpeg');
  9.  
  10. print_r($files);
  11.  
  12. Class multiCURL {
  13.  
  14. public static function existsTable(&$tab, $requestedContentType) {
  15. $mh  = curl_multi_init();
  16. $active = 0;
  17.  
  18. foreach ($tab as $k=>$t) {
  19. $ch = curl_init($t['url']);
  20. $tab[$k]['chs'] = $ch;
  21. curl_setopt_array($ch, self::$existsOptions);
  22. curl_multi_add_handle($mh, $ch);
  23. }
  24.  
  25. do {
  26. $result = curl_multi_exec($mh, $active);
  27. } while ($result == CURLM_CALL_MULTI_PERFORM);
  28.  
  29. do {
  30. if (curl_multi_select($mh) != -1) {
  31. do {
  32. $result = curl_multi_exec($mh, $active);
  33. } while ($result == CURLM_CALL_MULTI_PERFORM);
  34. }
  35. } while ($active && $result == CURLM_OK);
  36.  
  37. foreach ($tab as $k=>$t) {
  38. if (curl_errno($t['chs']) == 0) {
  39. $tab[$k]['data'] =curl_multi_getcontent($t['chs']);
  40. if (strpos($tab[$k]['data'],'Content-Type: '.$requestedContentType)) {
  41. $tab[$k]['status']='OK';
  42. } else {
  43. $tab[$k]['status']=substr($tab[$k]['data'],9,strpos($tab[$k]['data'],10)-9);
  44. }
  45. } else {
  46. $tab[$k]['status']='CURL error';
  47. $errors++;
  48. }
  49. }
  50. curl_multi_close($mh);
  51. return $errors;
  52. }
  53.  
  54. private static $errors=0;
  55.  private static $existsOptions = array(CURLOPT_HEADER => true,CURLOPT_NOBODY =>true, CURLOPT_RETURNTRANSFER => true);
  56. }
  57. ?>


Po pewnym czasie (orientacyjnie wykonano sprawdzenie ok 10k plików) Połączenie z serwerem zostaje zresetowane (taki komunikat wyświetla przeglądarka). A serwer się wywala. W manualu do curla w php.net niewiele można wyczytać. Domyślam się że mogą nie być zamykane nawiązane połączenia, jednak nie wiem jak to naprawić. Czy ktoś miał z tym podobne przejścia?