PHP下的cURL庫

阿債發表於2014-03-29

PHP下的cURL庫主要有兩個Requests和Guzzle,兩個都很複雜。

 

Requests優先使用cURL,沒有cURL時會自動啟用fsockets,除非你手工指定了Transport。

 

Guzzle有豐富的日誌庫支援和日誌格式,用外掛訂閱的方式訂閱,從程式碼上看採用事件機制,質量更高。

它只支援cURL(至少只v3版本是),並依賴於Symfony的EventEmitter,但它被ReactPHP所依賴。

最近(2014-03-28)發現它從v3.8.1升級到v4.0.0rc,居然把Namespace改了,將前兩段縮減為一段,原始碼目錄也去掉了頂層的Guzzle,毫無意義還導致既不向前相容,也和其他常見PHP庫不一致。

 

現在是重點,Guzzle通常用得好好的,但昨天發現一個問題,有個遠端的網址,有到支付寶去查詢支付結果。呼叫這個網址時,Guzzle會不成功,但Requests可以。

 

下面是關於cURL命令的,其有兩個超時時間,connect-timeout和timeout-max(後面這個通常在程式中就叫做timeout),其中後者包含前者,cURLl預設的connect-timeout是300秒,沒有給timeout-max設定值,但由於包含關係,當你不設定timeout時,它至少也是300秒。

而對於PHP的fsockets,由於php.ini中有個配置項default_socket_timeout,其預設值才60秒。

另外cURL預設不支援http redirect,需要傳遞 -L 選項(無引數),但根據使用PHP和Python的經歷,不少cURL庫預設是開啟了redirect,至少Guzzle的文件明確說了是開啟了的,如果需要,要手動關閉。

 

 

依據:

 

curl預設的connect-timeout是300秒

https://github.com/bagder/curl/blob/master/lib/connect.h

 

3.8 How do I tell curl to follow HTTP redirects?

http://curl.haxx.se/docs/faq.html


相關文章