Mam skrypt PHP, który wysyła żądanie do zdalnego interfejsu API. Jeśli odpowiedź zajmie więcej niż około 200 sekund, otrzymam w odpowiedzi długość treści równą zero. Próbuję zrozumieć, dlaczego tak się dzieje.Dlaczego Apache zwraca zerową długość treści po 200 sekundach na żądanie PHP POST?
Próbując rozwiązać ten problem, ustawiłem każdą możliwą zmienną w plikach konfiguracyjnych Apache i PHP na ponad 300 sekund, aby to zwalczyć, zgodnie z pierwszą odpowiedzą poniżej. Rzeczy, które mi zostały ustawione na 300 sekund:
- Apache limitu czasu
- czas Apache keep_alive
- PHP max_reponse_time
- czas PHP session.cache_expire
- PHP max_execution_time
Mimo że wciąż konsekwentnie uzyskują odpowiedzi o zerowej długości treści w okolicach 200-sekundowego znaku. Jednak jeśli zajmie to mniej niż 200 sekund, problem nie występuje.
Poniżej opisuję, w jaki sposób konfigurowany jest nasz kod.
Co się dzieje, że crontab uruchamia skrypt powłoki na naszym serwerze, który wywołuje identyfikator URI hosta lokalnego za pomocą/usr/bin/curl. Lokalny identyfikator URI jest obsługiwany przez Apache i jest plikiem PHP, który sam zawiera poniższy kod, który z kolei używa cURL do wywoływania zdalnego interfejsu API. POSTUJEMY około 10 KB XML i oczekujemy, że otrzymamy około 135 KB z powrotem w porcjach.
Oto kod prośba:
$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);
włączyłem debugowanie w naszej logowania Apache i poniżej jest to, co mamy. W tym przykładzie prośba została wysłana o 19:48:00, a odpowiedź wróciła o 19:51:23, nieco ponad 200 sekund później.
* 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
Chciałbym wiedzieć, czy coś jest nie tak z tym kodem lub coś mogło mi brakowało w ustawieniach serwera, które mogłyby spowodować długość zawartość wrócić zera po 200 sekund.
może to być związane ze statusem '100 Kontynuuj'. Spróbuj wyłączyć to w żądaniu CURL - 'curl_setopt ($ ch, CURLOPT_HTTPHEADER, array ('Expect:', 'Content-Type: text/xml'));' – Cheery
Myślę, że problem nie jest po twojej stronie .. do zdalnego hosta, do którego wysyłasz dane. Prawdopodobnie ustawienie limitu czasu serwera to 200s. –
@SyedQarib Tak, jak zaznaczono we właściwej odpowiedzi, która wydaje się być bardzo prawdopodobna. – CommaToast