2010-05-13 16 views
12

Próbuję wyśledzić problem z wywołaniem cURL w PHP. Działa dobrze w naszym środowisku testowym, ale nie w naszym środowisku produkcyjnym. Kiedy próbuję wykonać funkcję cURL, po prostu się zawiesza i nigdy nie odpowiada. Próbowałem dokonać połączenia cURL z wiersza poleceń i to samo się dzieje.Jak mogę się dowiedzieć, dlaczego cURL zwisa i nie odpowiada?

Zastanawiam się, czy cURL rejestruje to, co się gdzieś dzieje, ponieważ nie potrafię rozgryźć, co dzieje się w czasie, gdy polecenie się kręci. Czy ktoś wie, czy istnieje dziennik, który śledzi, co się tam dzieje?

Myślę, że to problemy z łącznością, ale nasz informatyk nalega, że ​​powinienem mieć do niego dostęp bez problemu. Jakieś pomysły? Używam CentOS i PHP 5.1.

Aktualizacje: Używając trybu szczegółowego, dostałem komunikat o błędzie 28 "Connect() Timed Out". Spróbowałem przedłużyć limit czasu do 100 sekund i ograniczyć maksymalne liczby przerwań do 5, bez zmian. Próbowałem pingować pudełko, a także dostałem timeout. Tak więc przedstawię to z powrotem do IT i zobaczę, czy znowu to zobaczą. Dzięki za całą pomoc, mam nadzieję, że wrócę za pół godziny z wiadomością, że to ich problem.

Aktualizacja 2: Okazało się, że moje pudełko rozwiązało nazwę serwera z zewnętrznym adresem IP. Kiedy dział IT dał mi wewnętrzny adres IP i zastąpiłem go w wywołaniu cURL, wszystko działało świetnie. Dzięki za pomoc wszystkim.

Odpowiedz

15

w zainstalowanym PHP, można ustawić zmienną CURLOPT_VERBOSE:

curl_setopt($curl, CURLOPT_VERBOSE, TRUE); 

ten następnie loguje się do STDERR, lub do pliku podanego za pomocą CURLOPT_STDERR (która przyjmuje wskaźnik pliku):

curl_setopt($curl, CURLOPT_STDERR, $fp); 

Z wiersza poleceń można użyć następujących przełączników:

  • --verbose zgłosić więcej Informacje z linii poleceń
  • --trace <file> lub --trace-ascii <file> prześledzić do pliku

Można użyć --trace-time do poprzedzić znaczniki czasu do verbose/wyjścia plików

+0

OK, to dało mi trochę więcej informacji, ale niewiele. Po prostu mówi: * Informacje o łączeniu się() z portem [nazwa serwera] 443 * Próba [adres IP serwera] ... Po prostu się zawiesza. Wydaje mi się, że jest to problem z łącznością. Jakieś inne myśli? Próbuję teraz odpowiedzi Pekki. – SenorPuerco

+0

Dodano pewne szczegóły wiersza polecenia. Czy próbowałeś ustawić wyższy limit czasu, aby sprawdzić, czy kiedykolwiek wróci? Użyj 'set_time_limit (600)', aby ustawić na 10 minut –

+0

Czy możesz pingować adres IP? Brzmi jak problem z siecią/zaporą. Jeśli nie możesz, możesz odesłać go bezpośrednio do swoich informatyków i poprosić o ich sortowanie! –

-1

Jeśli to możliwe, spróbuj sudo ing jako użytkownik PHP działa pod (prawdopodobnie ten, na którym działa Apache).

Problem może mieć różne przyczyny, które wymagają wprowadzenia danych przez użytkownika, na przykład niezaufany certyfikat przechowywany w pamięci podręcznej zaufanych certyfikatów użytkownika root, ale nie w PHP. W takim przypadku polecenie będzie czekać na dane wejściowe, które nigdy się nie wydarzą.

Aktualizacja: Dotyczy to tylko po uruchomieniu curl zewnętrznie za pomocą exec - może to nie ma zastosowania.

+0

Używam funkcji PHP, więc myślę, że to nie ma zastosowania. Dobrze jednak pamiętać o tym. – SenorPuerco

0

Czy próbowałeś ustawienie CURLOPT_MAXREDIRS?Odkryłem, że czasami będzie nieskończona pętla przekierowania dla niektórych witryn, których normalny użytkownik przeglądarki nie widzi.

+0

Dobra myśl, ale niczego nie zmieniła. Nadal upłynął limit czasu. – SenorPuerco

Powiązane problemy