PHP cURL设置编码?

eqqqjvef  于 2022-11-13  发布在  PHP
关注(0)|答案(1)|浏览(261)

我使用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文档和这里的一些帖子的基础上拼凑出的一个替代方案的结果--对于我正在做的一个小的使命的任务部分来说,这并不是一个值得依赖的东西。
那么问题来了--这里发生了什么?为什么原始代码在处理较长的数据字符串时会失败,为什么后一个版本能工作?它会一直工作吗?还是缺少了什么?
我将非常感谢任何帮助和提示。

klsxnrf1

klsxnrf11#

我可以回答我自己的问题。我上面概述的“解决方案”只不过是一条红鲱鱼。它不会让你有任何结果,所以不要费心去尝试它。
这里真实的的问题是最好的理解,注意到所讨论的服务器是Lighttpd。在研究了一些问题之后,我发现它有一个不幸的习惯,当它收到一个带有httpExpect:100-继续标题。
要么它看起来是以间歇的方式执行此操作,要么libcurl以间歇的方式附加此标头--可能是在POST数据长度超过某个阈值时。
无论如何,这是我的问题的根源。

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

行,然后重新加载服务器配置

sudo service lighttpd force-reload

这可以防止您自己的Lighty安装在遇到Expect 100-Continue时崩溃,但是如果您发出的libcurl请求到达Lighty(或其他)服务器,而该服务器在看到这一情况时沮丧地举起手来,这就没有什么作用了。

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

相关问题