Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> curl_multi wywala się serwer Apacha
kitol
post
Post #1





Grupa: Zarejestrowani
Postów: 162
Pomógł: 26
Dołączył: 19.01.2007

Ostrzeżenie: (0%)
-----


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?

Ten post edytował kitol 7.02.2008, 12:13:20
Go to the top of the page
+Quote Post

Posty w temacie
- kitol   curl_multi wywala się serwer Apacha   7.02.2008, 10:28:15


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 14:36