簡體   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