【问题标题】:PHP cURL set encoding?PHP cURL 设置编码?
【发布时间】:2014-07-02 15:49:17
【问题描述】:

我使用 cURL 在两台服务器之间传输数据 - 都运行 Ubuntu 12.04、Lighttpd 和 PHP5.5 FastCGI。我曾经 bzcompress 数据 - 这纯粹是一个遗留问题:我发现 bzcompress 在将文本数据写入文件时提供更有效的压缩。传输的数据往往非常小——通常在 512 字节以下。

但是,今天我遇到了一个问题,即数据有点长 - 接近 1 kB。 curl_exec 适时返回 true 并且没有报告错误。但是,数据从未到达目的地。我原来的代码如下

curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,"{$cql}");
curl_setopt($ch,CURLOPT_RETURNTRANSFER,false);

我怀疑编码存在问题,也许是我的 bzcompression 问题。所以我用 gzdeflate 替换了 bzcompress 并将我的 curl 代码更改为

curl_setopt($ch,CURLOPT_HTTPHEADER,array('Content-Type:text/plain'));
curl_setopt($ch,CURLOPT_ENCODING,'');
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,"{$cql}");

这行得通 - 不再有消失的数据。但是,“解决方案”纯粹是根据对 PHP 文档和此处的一些帖子的一些阅读,拼凑出一个替代方案的结果——对于我的一个小但任务关键的部分来说,这不是一个可以依赖的东西做。

所以问题 - 这里发生了什么?为什么原始代码会因较长的数据字符串而失败,为什么后一个版本可以工作?它会一直有效还是缺少其他东西?

我将非常感谢任何帮助和提示。

【问题讨论】:

    标签: php curl encoding compression gzip


    【解决方案1】:

    是时候回答我自己的问题了。我上面概述的“解决方案”只不过是一条红鲱鱼。它不会带你到任何地方,所以不要费心去尝试。

    这里真正的问题最好通过注意有问题的服务器是 Lighttpd 来理解。经过一番研究后,我发现它有一个不幸的习惯,即在收到带有 http Expect: 100-continue 标头的请求时发送 HTTP 417 标头。

    要么它似乎以间歇方式执行此操作,要么 libcurl 以间歇方式附加此标头 - 可能是当 POST 数据长度超过某个阈值时。

    无论如何,这是我问题的根源。正确的解决方案是编辑 lighttpd.conf 文件,添加一个

    server.reject-expect-100-with-417 = "disable"
    

    行,并重新加载服务器配置

    sudo service lighttpd force-reload
    

    当遇到 Expect 100-Continue 时,这可以防止您自己的轻量级安装失败,但如果您发出的 libcurl 请求到达轻量级(或另一个)服务器,当它看到时会沮丧地举起手来,这几乎没有什么作用。避免这种情况的唯一方法

    curl_setopt($ch,CURLOPT_HTTPHEADER,array("Expect:  "));
    

    这花了我半天的时间。希望对这里的其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-09-21
      • 2016-05-09
      • 2020-08-15
      • 1970-01-01
      • 2020-09-30
      • 2014-07-07
      • 2015-03-13
      • 1970-01-01
      • 2015-10-17
      相关资源
      最近更新 更多