繁体   English   中英

PHP cURL设置编码?

[英]PHP cURL set encoding?

我使用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文档的阅读和此处的一些帖子,将一个替代方案汇总在一起的结果-对于我来说,这不是很小但对任务至关重要的部分,因此不值得依赖在做。

那么问题来了-这是怎么回事? 为什么原始代码在包含较长数据字符串的情况下会失败,为什么后一个版本会起作用? 它会一直工作还是有其他遗漏的东西?

我将不胜感激任何帮助和提示。

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

通过注意所讨论的服务器是Lighttpd,可以最好地了解此处的实际问题。 经过一些研究后,我发现它有一个不幸的习惯,即当它收到带有HTTP Expect:100-continue标头的请求时发送HTTP 417标头。

似乎是以间歇方式执行此操作的,或者libcurl是以间歇方式附加此标头的-也许是在POST数据长度超过某个阈值时。

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

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

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

sudo service lighttpd force-reload

这样可以防止遇到“期望100-继续”时您自己的轻量级安装失败,但是如果您发出的libcurl请求到达轻量级(或其他)服务器,则服务器在看到轻量级(或其他)服务器时却举手投足,则几乎没有作用。 避免这种情况的唯一方法

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM