Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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创建和HTTP头-数组或字符串,\r\n结尾,内容长度可选?_Php_Http_Header - Fatal编程技术网

PHP流\u上下文\u创建和HTTP头-数组或字符串,\r\n结尾,内容长度可选?

PHP流\u上下文\u创建和HTTP头-数组或字符串,\r\n结尾,内容长度可选?,php,http,header,Php,Http,Header,我正在排除一些发布到远程站点的问题,特别是远程主机从不返回任何数据(空字符串) 在尝试排除任何其他故障之前,我希望确保调用代码实际上是正确的。代码是: $context = stream_context_create(array('http' => array( 'method' => "POST", 'header' => "Content-Type: application/xml", 'timeout' =&

我正在排除一些发布到远程站点的问题,特别是远程主机从不返回任何数据(空字符串)

在尝试排除任何其他故障之前,我希望确保调用代码实际上是正确的。代码是:

$context = stream_context_create(array('http' => array(
    'method'        => "POST",
    'header'        => "Content-Type: application/xml",
    'timeout'       => 60.0,
    'ignore_errors' => true, # return body even if HTTP status != 200
    'content'       => $send_xml
)));

$response = trim(file_get_contents($this->bulk_service_url, false, $context));
我所有的问题都属于“header”选项及其值,以及如何正确格式化和编写。PHP文档、下面的讨论甚至stackoverflow研究都产生了非常不一致的结果

1) 我是否必须包含内容长度标题,如果不是,PHP会正确计算它吗?不包括它,但我见过很多人手动包含它,那么它是受到PHP的尊重还是被PHP覆盖

2) 我必须以字符串或关联数组的形式传递标题选项吗?手册上说字符串,大多数将其作为字符串传递,但说如果PHP是使用--with curlwrappers选项编译的,则必须将其作为数组传递。这是非常不一致的行为

3) 作为字符串传递时,是否必须包含终止的
\r\n
字符?特别是当只指定一个标题时。手册并没有提供这样一个例子,手册页面上的第一条注释确实包含了这个例子,第二条注释并没有明确的规则来说明如何指定这个例子。PHP会自动处理这两种情况吗


服务器正在使用PHP 5.3。

准备上下文请尝试添加:

  • ContentLength:{here\u computed\u length}在'header'键前面加上\r\n
  • “\r\n”在“header”键的末尾
  • 所以它应该看起来像:

    $dl = strlen($send_xml);//YOUR_DATA_LENGTH
    $context = stream_context_create(array('http' => array(
                'method'        => "POST",
                'header'        => "Content-Type: application/xml\r\nContentLength: $dl\r\n",
                'timeout'       => 60.0,
                'ignore_errors' => true, # return body even if HTTP status != 200
                'content'       => $send_xml
            )));
    

    您应该在代码中以数组的形式存储头文件,并在发送请求之前完成准备工作

    function prepareHeaders($headers) {
      $flattened = array();
    
      foreach ($headers as $key => $header) {
        if (is_int($key)) {
          $flattened[] = $header;
        } else {
          $flattened[] = $key.': '.$header;
        }
      }
    
      return implode("\r\n", $flattened);
    }
    
    $headers = array(
      'Content-Type' => 'application/xml',
      'ContentLength' => $dl,
    );
    
    $context = stream_context_create(array('http' => array(
      'method'        => "POST",
      'header'        => prepareHeaders($headers),
      'timeout'       => 60.0,
      'ignore_errors' => true,
      'content'       => $send_xml
    )));
    
    $response = trim(file_get_contents($url, FALSE, $context));
    

    对@doublejosh的建议稍加改进,以防对某人有所帮助:
    (使用数组表示法和一行lambda函数)

    $headers=[
    '内容类型'=>'应用程序/xml',
    “内容长度”=>strlen($send\u xml)
    ];
    $context=stream\u context\u create(['http'=>[
    '方法'=>“发布”,
    'header'=>数组_映射(函数($h,$v){return“$h:$v”;},数组_键($headers),$headers),
    “超时”=>60.0,
    “忽略错误”=>true,
    “内容”=>$send\u xml
    ]
    ]);
    
    我认为您应该使用cURL而不是file\u get\u内容