如何让php curl请求永远等待响应(成功发送请求后)

时间:2011-09-23 09:21:05

标签: php curl httprequest

我正在尝试使用php脚本中的curl将大型zip文件发送到tomcat应用程序。因为它是一个大的zip文件,所以需要一些时间在tomcat服务器上解压缩zip文件(大约2-5分钟),但卷曲请求永远不会等待超过30秒才会继续,就好像它已经收到空洞的回应。

代码我可以通过以下方式重现问题:

set_time_limit(0);

$uploadURL = 'http://192.168.0.2:8080/some/url/'
$userid = 'a-user';
$password = 'a-password';
$zipfile = '/tmp/myfile.zip';

$ch = curl_init($uploadURL);
curl_setopt($ch, CURLOPT_HEADER, array(
    'Connection: Keep-Alive',
    'Keep-Alive: 3600'
    ));
curl_setopt($ch, CURLOPT_VERBOSE, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)");
curl_setopt($ch, CURLOPT_USERPWD, $userid.":".$password);
curl_setopt($ch, CURLOPT_POST, true);
$post = array(
  "uploadMode" => "uploadOnly",
  "id" => $id,
  "numberOfFiles" => "1",
  "file"=>"@".$zipfile.";type=application/zip"
);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 45);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_TIMEOUT, 200);
$response = curl_exec($ch);

我留下的唯一嫌疑人是curl发出请求然后由于经过一定的秒数而超时,而没有任何字节被来回发送(也就是between_bytes_timeout)。但我无法找到一个卷曲选项来帮助解决这个问题,所以我希望它是其他的东西。

tomcat服务器是明确的,因为我可以使用我的浏览器向它发出请求,可以持续数小时没有问题。

2 个答案:

答案 0 :(得分:3)

有可能cURL只是自动取消请求,因为当你的Tomcat打开zip包时传输速率太低。

如果平均传输速率在CURLOPT_LOW_SPEED_LIMIT秒内降至CURLOPT_LOW_SPEED_TIME字节/秒以下,则会发生这种情况。

尝试添加具有高时间和/或下限的适当选项,例如:

curl_setopt($ch, CURLOPT_LOW_SPEED_LIMIT, 1);   // cancel if below 1 byte/second
curl_setopt($ch, CURLOPT_LOW_SPEED_TIME, 30);   // for a period of 30 seconds

为了快速测试,我建议使用稍高于Tomcat的TIME真正需要解压缩给定的测试zip。

答案 1 :(得分:0)

要设置请求标头,请使用CURLOPT_HTTPHEADER而非CURLOPT_HEADER。