PHP cURL - opt ifmodsice返回http代码= 200

时间:2014-12-08 10:16:36

标签: php http curl

我尝试设置一个curl请求,只有在我的存储时间戳被修改后才能获取远程文件。

我想管理我的cURL请求的http代码,这是一个例子。

我已存储上次下载文件XX的时间戳。 2014-12-08 06:56:03。 我的cURL请求

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FILETIME, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_TIMEVALUE, strtotime($timestamp));
curl_setopt($ch, CURLOPT_TIMECONDITION, CURL_TIMECOND_IFMODSINCE);
$res = curl_exec($ch);
$info = curl_getinfo($ch);

正如documentation所说

  

CURLOPT_TIMECONDITION

     

如何处理CURLOPT_TIMEVALUE。仅当CURL_TIMECOND_IFMODSINCE自CURLOPT_TIMEVALUE中指定的时间以来已被修改时,才使用CURL_TIMECOND_IFMODSINCE返回该页面。如果它没有被修改,那么" 304 Not Modified"假设CURLOPT_HEADER为TRUE,将返回标头。使用CURL_TIMECOND_IFUNMODSINCE进行反向效果。 CURL_TIMECOND_IFMODSINCE是默认值。

因此,如果我的时间戳是2014-12-08 06:56:03且远程文件的文件时间是2014-12-08 04:59:03,那么它必须返回一个304的http代码,但我总是得到一个200的http代码。 我误解了文档吗?

这些是以秒为单位的时间戳

  • 本地文件1418021941
  • 远程文件1418014742

这是上述卷曲请求的信息

array(26) {
  ["url"]=> string(32) "XXX"
  ["content_type"]=> string(24) "application/octet-stream"
  ["http_code"]=> int(200)
  ["header_size"]=> int(251)
  ["request_size"]=> int(113)
  ["filetime"]=> int(1418014742)
  ["ssl_verify_result"]=> int(0)
  ["redirect_count"]=> int(0)
  ["total_time"]=> float(0.100412)
  ["namelookup_time"]=> float(0.010285)
  ["connect_time"]=> float(0.05576)
  ["pretransfer_time"]=> float(0.055878)
  ["size_upload"]=> float(0)
  ["size_download"]=> float(0)
  ["speed_download"]=> float(0)
  ["speed_upload"]=> float(0)
  ["download_content_length"]=> float(371712)
  ["upload_content_length"]=> float(0)
  ["starttransfer_time"]=> float(0.100382)
  ["redirect_time"]=> float(0)
  ["redirect_url"]=> string(0) ""
  ["primary_ip"]=> string(11) "XXX"
  ["certinfo"]=> array(0) { }
  ["primary_port"]=> int(80)
  ["local_ip"]=> string(11) "XXX"
  ["local_port"]=> int(XX)
}

如果我将本地文件的时间戳更改为远程2014-12-06 06:56:03

,则会显示以下信息
array(26) {
  ["url"]=> string(32) "XXX"
  ["content_type"]=> string(24) "application/octet-stream"
  ["http_code"]=> int(200)
  ["header_size"]=> int(251)
  ["request_size"]=> int(113)
  ["filetime"]=> int(1418014742)
  ["ssl_verify_result"]=> int(0)
  ["redirect_count"]=> int(0)
  ["total_time"]=> float(0.583712)
  ["namelookup_time"]=> float(0.011975)
  ["connect_time"]=> float(0.056813)
  ["pretransfer_time"]=> float(0.056977)
  ["size_upload"]=> float(0)
  ["size_download"]=> float(371712)
  ["speed_download"]=> float(636807)
  ["speed_upload"]=> float(0)
  ["download_content_length"]=> float(371712)
  ["upload_content_length"]=> float(0)
  ["starttransfer_time"]=> float(0.103772)
  ["redirect_time"]=> float(0)
  ["redirect_url"]=> string(0) ""
  ["primary_ip"]=> string(11) "XXX"
  ["certinfo"]=> array(0) { }
  ["primary_port"]=> int(80)
  ["local_ip"]=> string(11) "XX"
  ["local_port"]=> int(XX)
}

正如您所看到的,两者之间存在差异,第一个中的[size download],= 0,第二个中的> 0。

有什么建议吗?我将永远得到一个http代码= 200?

---------编辑

这是我使用本地时间戳2014-12-08 06:59:01

返回的标题
HTTP/1.1 200 OK Server: nginx Date: Mon, 08 Dec 2014 10:23:06 GMT Content-Type: application/octet-stream Content-Length: 371712 Last-Modified: Mon, 08 Dec 2014 04:59:02 GMT Connection: keep-alive ETag: "54853016-5ac00" Accept-Ranges: bytes

1 个答案:

答案 0 :(得分:-1)

是的,你误解了dosc。

如果它没有被修改,那么" 304 Not Modified"假设CURLOPT_HEADER为TRUE,将返回标题。

没有变化 - >返回" 304 Not Modified"报头中。

修改 - >返回200

---------第2轮---------

File' s Last-Modified:星期四,2014年12月18日05:37:48 GMT。

date_default_timezone_set("Etc/GMT");
$url = "...";
$timestamp = "2014-12-18 05:37:48";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_TIMEVALUE, strtotime($timestamp));
curl_setopt($ch, CURLOPT_TIMECONDITION, CURL_TIMECOND_IFMODSINCE);
$res = curl_exec($ch);

1,如果我使用上面的测试代码,它会返回一个这样的头:

HTTP/1.1 304 Not Modified
Date: Thu, 18 Dec 2014 08:27:55 GMT
Server: Apache/2.4.7 (Ubuntu)
ETag: "17c-50a76fe108d7a"

2,当我更改$ timestamp时,它将返回:

HTTP/1.1 200 OK
Date: Thu, 18 Dec 2014 08:31:02 GMT
Server: Apache/2.4.7 (Ubuntu)
Last-Modified: Thu, 18 Dec 2014 05:37:48 GMT
ETag: "17c-50a76fe108d7a"
Accept-Ranges: bytes
Content-Length: 380
Vary: Accept-Encoding
Content-Type: text/html

我认为你应该设置时区,如果我没有设置时区,它总是返回200.