Ho uno script PHP che invia una richiesta a un'API remota. Se la risposta impiega più di 200 secondi per tornare indietro, nella risposta ottengo solo una lunghezza del contenuto pari a zero. Sto cercando di capire perché sta succedendo.Perché Apache restituisce una lunghezza del contenuto pari a zero dopo 200 secondi a una richiesta POST PHP?
Nel tentativo di risolvere questo problema, ho impostato tutte le variabili concepibili nei file di configurazione di Apache e PHP impostate su un periodo superiore a 300 secondi per combattere questo problema, come raccomandato dalla prima risposta di seguito. Le cose che ho impostato a 300 secondi:
- Apache timeout
- Apache KEEP_ALIVE tempo
- PHP max_reponse_time
- tempo PHP session.cache_expire
- PHP max_execution_time
Nonostante che io otteniamo sempre risposte di lunghezza del contenuto pari a zero attorno ai 200 secondi. Tuttavia se impiega meno di 200 secondi il problema non si verifica.
Di seguito viene descritto come è impostato il nostro codice.
Quello che succede è che crontab esegue uno script di shell sul nostro server, che chiama un URI di localhost usando/usr/bin/curl. L'URI localhost è servito da Apache ed è un file PHP che contiene il codice sottostante, che a sua volta usa cURL per chiamare l'API remota. Abbiamo POST circa 10 KB di XML e ci aspettiamo di ricevere circa 135 KB indietro, in blocchi.
Ecco il codice di richiesta:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->_xml_url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_str);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
curl_close($ch);
ho acceso il debug nel nostro registrazione Apache e sotto è ciò che otteniamo. In questo esempio la richiesta è stata inviata alle 19:48:00 e la risposta ritorna alle 19:51:23, poco più di 200 secondi dopo.
* About to connect() to api.asdf.com port 443 (#0)
* Trying 555.555.555.555... * connected
* successfully set certificate verify locations:
* CAfile: none
CApath: /etc/ssl/certs
* SSL connection using RC4-SHA
* Server certificate:
* subject: snip
* start date: 2014-03-12 10:22:02 GMT
* expire date: 2015-04-16 12:32:58 GMT
* subjectAltName: api.asdf.com matched
* issuer: C=BE; O=GlobalSign nv-sa; CN=GlobalSign Organization Validation CA - G2
* SSL certificate verify ok.
> POST /xmlservlet HTTP/1.1
Host: api.asdf.com
Accept: */*
Content-Type: text/xml
Content-Length: 10773
Expect: 100-continue
< HTTP/1.1 100 Continue
< HTTP/1.1 200 OK
< Cache-Control: private
< Content-Type: text/xml
< Server: Microsoft-IIS/7.5
< X-AspNet-Version: 4.0.30319
< X-Powered-By: ASP.NET
< Date: Thu, 06 Nov 2014 19:51:23 GMT
< Content-Length: 0
<
* Connection #0 to host api.asdf.com left intact
* Closing connection #0
Vorrei sapere se c'è qualcosa di sbagliato in questo codice o qualcosa forse ho perso nelle impostazioni del server che potrebbero causare la lunghezza del contenuto di tornare a zero dopo 200 secondi.
potrebbe essere correlato allo stato '100 Continua'. Prova a disabilitarlo nella richiesta CURL - 'curl_setopt ($ ch, CURLOPT_HTTPHEADER, array ('Expect:', 'Content-Type: text/xml'));' – Cheery
Penso che il problema non sia al tuo fianco .. relativo all'host remoto che stai inviando dati .. molto probabilmente l'impostazione di timeout dello script del server è 200 secondi .. –
@SyedQarib Sì, come ho contrassegnato nella risposta corretta che sembra estremamente probabile che sia il caso. – CommaToast