【发布时间】:2015-02-09 04:35:52
【问题描述】:
我有一个向远程 API 发布请求的 PHP 脚本。如果响应需要超过大约 200 秒才能返回,那么我只会在响应中得到内容长度为零。我试图弄清楚为什么会这样。
为了解决此问题,我已将 Apache 和 PHP 的配置文件中的每个可能的变量设置为超过 300 秒以解决此问题,如下面的第一个答案所建议的那样。我设置为 300 秒的东西:
- Apache 超时
- Apache keep_alive 时间
- PHP 最大响应时间
- PHP session.cache_expire 时间
- PHP 最大执行时间
尽管我仍然始终在 200 秒左右获得零内容长度响应。但是,如果时间少于 200 秒,则不会出现问题。
下面我将描述我们的代码是如何设置的。
发生的情况是 crontab 在我们的服务器上运行一个 shell 脚本,它使用 /usr/bin/curl 调用一个 localhost URI。 localhost URI 由 Apache 提供,它是一个 PHP 文件,它本身包含以下代码,然后使用 cURL 调用远程 API。我们发布了大约 10KB 的 XML,并期望收到大约 135KB 的块返回。
这里是请求代码:
$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);
我在我们的 Apache 日志记录中打开了调试,下面是我们得到的结果。在此示例中,请求在 19:48:00 发送,响应在 19:51:23 返回,即 200 多秒后。
* 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
我想知道这段代码是否有问题,或者我可能在服务器设置中遗漏了一些可能导致内容长度在 200 秒后归零的内容。
【问题讨论】:
-
可能与
100 Continue状态有关。尝试在 CURL 请求中禁用它 -curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:', 'Content-Type: text/xml')); -
我认为问题不在您身边..它与您正在发送数据的远程主机有关..很可能他们的服务器脚本超时设置为 200s..
-
@SyedQarib 是的,正如我在正确答案中标记的那样,似乎极有可能是这种情况。