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的文檔明確說了是開啟了的,如果需要,要手動關閉。