为了账号安全,请及时绑定邮箱和手机立即绑定

PHP curl能否在单个请求中检索响应头和响应正文?

PHP curl能否在单个请求中检索响应头和响应正文?

PHP
MYYA 2019-06-25 13:39:25
PHP curl能否在单个请求中检索响应头和响应正文?是否有任何方法可以同时获取使用PHP的cURL请求的头和正文?我发现这个选择:curl_setopt($ch, CURLOPT_HEADER, true);将返回主体加头但我需要解析它才能得到身体。有什么方法可以让两者都更有用(更安全)吗?注意,对于“单一请求”,我的意思是避免在GET/POST之前发出头请求。
查看完整描述

3 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

提供的许多其他解决方案包括:做得对。

  • 劈开

    \r\n\r\n

    不可靠

    CURLOPT_FOLLOWLOCATION

    正在打开或何时服务器使用100代码进行响应。
  • 并不是所有的服务器都符合标准,只传输一个

    \n

    换新的台词。
  • 通过

    CURLINFO_HEADER_SIZE

    也不总是可靠的,特别是在使用代理或在某些相同的重定向场景中使用代理时。

最正确的方法是CURLOPT_HEADERFUNCTION.

下面是使用PHP闭包执行此操作的非常干净的方法。它还将所有标头转换为小写,以便在服务器和HTTP版本之间进行一致的处理。

此版本将保留重复的标头。

这符合RFC 822和RFC 2616的要求,请不要建议编辑使用mb_字符串函数,它是不正确的!

$ch = curl_init();$headers = [];curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// this function is called by curl for each header receivedcurl_setopt($ch, CURLOPT_HEADERFUNCTION,
  function($curl, $header) use (&$headers)
  {
    $len = strlen($header);
    $header = explode(':', $header, 2);
    if (count($header) < 2) // ignore invalid headers
      return $len;

    $name = strtolower(trim($header[0]));
    if (!array_key_exists($name, $headers))
      $headers[$name] = [trim($header[1])];
    else
      $headers[$name][] = trim($header[1]);

    return $len;
  });$data = curl_exec($ch);print_r($headers);


查看完整回答
反对 回复 2019-06-25
  • 3 回答
  • 0 关注
  • 932 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信