Richieste multiple cULR - Time Out

di il
7 risposte

Richieste multiple cULR - Time Out

Ciao ragazzi, buongiorno a tutti.
Faccio un giro velocissimo di presentazione per non andare OT: Mi chiamo Salvo, lavoro prettamente con php jquery html e css; Devo ammettere che non conoscevo l'esistenza di questo forum, ci sono arrivato per caso, e prima di iscrivermi ho visto la qualità e quantità dei contenuti e mi sono convinto. Ho premesso questo perchè in giro ci sono parecchi forum che fanno perdere solo tempo e sono comunque a disposizione per dare il mio contributo alla community.

Bon, detto questo non vado alla ricerca di codici ma di "soluzioni" logiche da tradurre in codice.
Ho un problema che mi sta facendo perdere la pazienza: devo effettuare circa 2.400/2.500 chiamate in cUrl verso un webservice esterno, arrivati a circa 400 chiamate va in errore 504 Time out..ho aumentato il timing ngix (sono proprietario server fisico SO centos) ed ora arrivati sempre a circa 400 records va in errore 503 Service Unavailable Error.
Le chiamate avvengono tramite un ciclo loop di un array che:
- apre la chiamata cUrl;
- esegue il comando cUrl;
- chiude la chiamata cUrl;

e cosi via..
L'operazione normalmente dovrebbe avvenire tramite un crone automatico impostato in orario notturno.

Mi/vi chiedo quale sia il metodo migliore per gestire questa situazione?

Grazie mille.
Salvo.

7 Risposte

  • Re: Richieste multiple cULR - Time Out

    Ciao Salvo Benvenuto.
    Penso sia la CPU non riesce a gestire troppe chiamate.
    Se riesci nel gestire 100 collegamenti unici ( deve fare solo quello ) puoi provare a gruppi di 100.
    Inoltre PHP é un linguaggio interpretato , le funzioni native possono usare buffer a tua insaputa e ovviamente crea una variabile per contenere i valori altrimenti rimangono in memoria fino al termine del tuo script, così puoi decidere tu quando liberare la memoria.
    Leggi questa nota https://www.php.net/manual/en/function.stream-select.php spero ti aiuti, curl per le richieste bloccanti agisce da minimo 1 secondo.
    If libcurl is built to use the standard system name resolver, that portion of the connect will still use full-second resolution for timeouts with a minimum timeout allowed of one second.
    Fonte WordPress track.
  • Re: Richieste multiple cULR - Time Out

    Ciao Salvo,

    io ti consiglio di usare una libreria anziché curl in maniera "grezza".

    Ad esempio GuzzleHTTP io la uso per le API, ma credo sia perfetta per quello che vuoi fare tu perché ti consente di settare diversi parametri tra cui il timeout. Link alla doc http://docs.guzzlephp.org/en/stable/index.htm

    Mentre se la vuoi includere nel tuo progetto con Composer basta che lanci il comando
    
    composer require guzzlehttp/guzzle
    
    Inoltre se il server ti restituisce un 503 o 504 dovresti approfondire meglio andando a leggere i log. Possibilmente saturi le risorse del server (CPU, RAM o il numero di processi dedicati).
  • Re: Richieste multiple cULR - Time Out

    Ciao ragazzi buonasera e grazie per il benvenuto.
    Sono partito dai vostri suggerimenti e nel log di errori non ho trovato una prova che fosse il carico CPU a generare il timeout..il riferimento è questo:
    [Wed Jan 15 16:39:04.896489 2020] [proxy_fcgi:error] [pid 22950:tid 139690581681920] (70007)The timeout specified has expired: [client xxx.xxx.xxx.xxx] AH01075: Error dispatching request to :
    Ho fatto delle prove con cUrl grezzo e 400 records e sia memoria che swap che carico medio CPU rimangono relativamente medio/bassi per poi andare di nuovo in errore 503; Il server ha 15GB di Ram ed è dedicato esclusivamente ad un singolo progetto.

    Facendo piu' attenzione nel monitorare il curl exec ho notato che il webserver esterno perde un paio di secondi nella risposta che sommati alle chiamate incrementa notevolmente il tempo di esecuzione, quindi devo passare alla gestione asincrona.

    Ho installato la libreria suggerita da flaviors che prevede tale opzione e la testerò domani mattina.
    Intanto grazie per questi suggerimenti che sono stati preziosi per guardare "al di fuori" del solo codice.

    Salvo.
  • Re: Richieste multiple cULR - Time Out

    tatino ha scritto:


    Ciao ragazzi buonasera e grazie per il benvenuto.
    Sono partito dai vostri suggerimenti e nel log di errori non ho trovato una prova che fosse il carico CPU a generare il timeout..il riferimento è questo:
    [Wed Jan 15 16:39:04.896489 2020] [proxy_fcgi:error] [pid 22950:tid 139690581681920] (70007)The timeout specified has expired: [client xxx.xxx.xxx.xxx] AH01075: Error dispatching request to :
    Ho fatto delle prove con cUrl grezzo e 400 records e sia memoria che swap che carico medio CPU rimangono relativamente medio/bassi per poi andare di nuovo in errore 503; Il server ha 15GB di Ram ed è dedicato esclusivamente ad un singolo progetto.

    Facendo piu' attenzione nel monitorare il curl exec ho notato che il webserver esterno perde un paio di secondi nella risposta che sommati alle chiamate incrementa notevolmente il tempo di esecuzione, quindi devo passare alla gestione asincrona.

    Ho installato la libreria suggerita da flaviors che prevede tale opzione e la testerò domani mattina.
    Intanto grazie per questi suggerimenti che sono stati preziosi per guardare "al di fuori" del solo codice.

    Salvo.
    Prova ad aumentare i valori relativi al "timeout" nel file di configurazione di Apache o nginx se usi quest'ultimo.

    In Apache dovrebbero essere TimeOut e ProxyTimeout.
  • Re: Richieste multiple cULR - Time Out

    In nginx ho già impostato 180s
    proxy_connect_timeout 180s;
    proxy_send_timeout 180s;
    proxy_read_timeout 180s;
    fastcgi_send_timeout 180s;
    fastcgi_read_timeout 180s;
    mediamente fino a quanto potrei spingermi per non mandare in blocco tutto il sistema?
  • Re: Richieste multiple cULR - Time Out

    Non saprei dirti, dovresti fare dei test. Magari prova con dei valori leggermente più alti.

    Ad ogni modo non ho capito se lanci lo script dal browser o da riga di comando. Immagino il secondo caso, esatto?
  • Re: Richieste multiple cULR - Time Out

    flaviors200 ha scritto:


    Ad ogni modo non ho capito se lanci lo script dal browser o da riga di comando. Immagino il secondo caso, esatto?
    In produzione si, è da command line.
    Sto testando la libreria da te consigliata, ti faccio sapere.
Devi accedere o registrarti per scrivere nel forum
7 risposte