Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 文件\u获取\u内容在下载二进制文件时附加数据_Php - Fatal编程技术网

Php 文件\u获取\u内容在下载二进制文件时附加数据

Php 文件\u获取\u内容在下载二进制文件时附加数据,php,Php,我编写了一个函数,允许我在PHP中发送HTTP GET请求: function get_HTTPS_page_with_version($url, $hostname, $use_HTTP_1_0 = false, &$headers = NULL, $follow_redirect = true, $use_SSL = true) { $context = Array( "http" => Array( "method" => "GET",

我编写了一个函数,允许我在PHP中发送HTTP GET请求:

function get_HTTPS_page_with_version($url, $hostname, $use_HTTP_1_0 = false, &$headers = NULL, $follow_redirect = true, $use_SSL = true) {
  $context = Array(
    "http" => Array(
      "method" => "GET",
      "ignore_errors" => true,
      "follow_location" => $follow_redirect,
      "user_agent" => "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",
      "header" => "Accept-language: en")
  );

  if ($use_SSL) {
    $context["ssl"] = Array(
      "peer_name" => $hostname,
      "SNI_server_name" => $hostname,
      "verify_peer_name" => false,
      "verify_peer" => false);
  }

  if (!$use_HTTP_1_0) {
    $context["http"]["protocol_version"] = "1.1";
    $context["http"]["header"] .= "\r\nHost: $hostname".
                                  "\r\nConnection: close";
  }

  $page = file_get_contents($url, false, stream_context_create($context));
  $responseCode = get_HTTP_response_code($http_response_header);
  $headers = $http_response_header;

  return Array($responseCode, $page);
}
问题是,当我使用此函数获取特定文件(即)时,它会在开头添加一些字符:

6639 6361 0a0d --> f9 ca \n\r
在文件末尾:

0a0d 0d30 0d0a 000a --> \n\r \r0 \r\n NUL\n
我比较了使用Wget和此函数手动获取的文件,以及使用Wireshark在网络级别获取的文件,我可以确认服务器发送的文件在这两种情况下是相同的

我也没有这个问题

有人知道是什么导致了这种行为吗

编辑

Verisign CRL已更改,其他字节由文件内容添加,而不是我上面列出的内容,但结果仍然相同-->此函数下载的文件与使用wget手动下载的文件不同

编辑2

  • 设置
    $use\u HTTP\u 1\u 0=true时没有问题
  • 当我添加header
    Accept Encoding:gzip时没有问题,
    deflate
    (除了我得到一个gz文件,而且我更愿意避免 这个:))
  • 当我仅从
    关闭
    更改
    连接时,仍然存在问题
    保持活动状态的步骤

如果您不提供自己的标题,也会发生同样的情况?另外,所有工具的响应头是否都相同?@cen我根据您的评论做了一些测试,如果我使用HTTP/1.0而不是1.1,似乎没有问题。我将使用此查找编辑我的问题。您不能在Http 1.0中使用Keep ALive。无论如何,如果我通过邮递员向您的crl发出GET请求,我在开始时也会得到非UTF-8字符。CRL文件应该是文本文件还是二进制文件?我的猜测是,服务器可能会根据代理或请求头或其他内容编码一些额外的信息。不幸的是,我不是CRLs方面的专家,所以这只是一个瞎猜。你也可以尝试用openssl将wget和php文件解码成纯文本,看看实际的区别是什么(如果有的话):
openssl crl-INFORT DER-text-in sb.crl
Edit:显然,crl是DER格式的,有二进制数据,所以不是纯文本文件。@cen谢谢。我知道
Connection
header不是HTTP/1.0的一部分,但我用HTTP/1.1尝试了一下,看看这是不是重点:)实际上,CRL采用的是DER格式,这是一种二进制格式<代码>openssl crl
命令无法与我的函数一起工作,因为我得到的结果不是有效的DER文件。最后,我认为服务器不会根据客户端的签名发送不同的文件,因为我看不到Wireshark捕获中添加的字节。