[php] cURL obsługa błędu timeout

0

Witam. Znowu problem z cURLem. W pętli cURL łączy się z pewną stroną i czasem to się wysypuje bo w pewnym momencie wywala błąd że skończył się czas oczekiwania na odpowiedź (timeout). No i przez to cały skrypt kończy działanie a użytkownik widzi tylko ten błąd. Najgorsze jest to, że pętla zostaje zatrzymana i curl nie wykonuje następnych połączeń. Z tego co zauważyłem to błąd z timeoutem nie jest wyłapywany przez curl_errno bo obsługę błędów połączenia zrobiłem właśnie za pomocą tej funkcji.

I teraz tak:

  1. Czy da się jakoś zignorować ten błąd, tak żeby dalsza część kodu została wykonana?
  2. Czy może to być spowodowane tym, że jakaś strona nie pozwala na taką częstotliwość połączeń z danego komputera? (curl łączy się w pętli, a więc przerwy pomiędzy połączeniami teoretycznie nie istnieją)
  3. Czasem jak się otwiera stronę w przeglądarce to ona się niby ładuje a tak naprawdę nie zostaje wczytana i trzeba ją odświeżyć. Czy curl może mieć też taki problem? W tym momencie mógłby wystąpić błąd z timeoutem?
  4. Jeżeli chcę wykonać w pętli np. 100 połączeń z jedną stroną (która swoją drogą wysyła też dane do innego serwera a więc trochę to trwa) to wiadomo, że potrwa to długo no i w związku z tym pytanie: mógłbym się dokształcić i nauczyć się obsługi wielu połączeń jednocześnie (multi curl) ale wydaje mi się, że firmy hostingowe mają zabezpieczenia przed jakimś DoSem, żeby serwerów nie zamulać. A więc jakbym chciał wykonać ze 100 połączeń naraz to mogłoby to nie zadziałać tak?

Dodam, że strona z którą się łącze nie należy do mnie a więc mogę ingerować tylko w kod mojej stronki. Bardzo bym chciał wiedzieć co zrobilibyście na moim miejscu, bo nie wiem jak ten problem rozwiązać najlepiej tak żeby potem nie było trzeba się męczyć z kolejnymi problemami. Aha i w międzyczasie wpadłem na to, żeby zamiast w pętli robić to w cronie (jak jest pętla to użytkownik musi czekać aż wykonanych zostanie 100 połączeń a to nie jest zbyt wygodne). No ale to może nie być konieczne jeżeli podsuniecie mi jakieś lepsze rozwiązanie bo nie wiem może mylę się co do multi curla. Sam już nie wiem głowa mnie boli od tego więc bardzo proszę o pomoc.
Pozdrawiam.

0

Można użyć multi curla, tam jest to asynchronicznie, więc możesz sobie wpakować wszystko w pętlę która sprawdza czy upłynął wyznaczony czas/wszystko poszło sprawnie, ewentualnie zamknąć handle przed czasem.

0

Ale generalnie powinienem wywoływać wszystkie połączenia naraz (w multi curl oczywiście) czy np zrobić pętlę która obsługuje po kolei np 10 połączeń jednocześnie? Chodzi o to, że nie wiem czy wywołanie wszystkich połączeń nie sprawi jakichś problemów. Jest taka możliwość przy takiej ilości połączeń czy multi curl to sam zrobi ładnie? Jak tutaj sprawa ma się z timeoutem? Np wywołam 50 połączeń a u kilku wystąpi timeout to co wtedy? Bardzo proszę o pomoc bo nie do końca jarzę o co z tym chodzi.

0

Wielkie dzięki za pomoc. Używam multi i jak na razie działa. Tylko nie wiem co będzie jak dodam za dużo połączeń :P

0

Apache cię !@(*#@( i tyle tego będzie... Standardowe zabezpieczenia.

0

Okazało się, że przy większej ilości połączeń to nie działa tak jak powinno, tzn z mojej strony działa ale strona z którą się łącze wykonuje jakieś operacje na plikach i w konsekwencji jak wywołuje ją kilkadziesiąt razy jednocześnie to strona tego kogoś się wysypuje (pokazuje błędy przy wywołaniu funkcji opendir i chmod, że nie ma takiego pliku/folderu: "no such file or directory") a więc zakładam, że jego skrypt w pewnym momencie coś tam usuwa i następnie tworzy od nowa. Jeżeli skrypt jest wywoływany jednocześnie kilkadziesiąt razy to chyba musi się wysypać, bo jak ma uzyskać dostęp do pliku/folderu, który został usunięty przez ten skrypt ułamek sekundy wcześniej a jeszcze nie zdążył stworzyć nowego pliku/folderu. Dobrze rozumiem czy to tak nie działa?

Bo jeżeli tak to jest zrobione to chyba lepszym rozwiązaniem, na które mogę sobie pozwolić jest coś takiego:

Cron wywołuje co np 2min plik php, który sprawdza czy ma jakieś połączenia do wykonania (byłyby zapisane w bazie) a jeżeli tak to w pętli wykonuje połączenia i na końcu tej pętli byłoby przykładowo sleep(300). A że czasem byłyby używane różne ciastka to i tak używałbym multi curla (który przy timeout chyba nic nie wywala z tego co zauważyłem). To wszystko może trwać długo byle działało tak jak powinno. A no i ten skrypt oczywiście jakby miał działać dłużej no to do sqla dodawałby jakiś wpis, dzięki któremu sam by sprawdzał czy nie jest już w tym momencie wykonywany, to by było takie zabezpieczenie przed cronem, który chciałby wywołać skrypt kiedy ten jeszcze nie skończył swojej roboty.

Dobrze myślę czy źle myślę? [???] Sugestie mile widziane.
Pozdrawiam ;-P

0

już sobie z tym poradziłem

można zamknąć/usunąć

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.