《PHP用curl采集時,出現Recv failure: Connection was aborted》要點:
本文介紹了PHP用curl采集時,出現Recv failure: Connection was aborted,希望對您有用。如果有疑問,可以聯系我們。
PHP用curl采集時,偶爾會出現 Recv failure: Connection was aborted
由于是偶然的,不好還原。目前初步判斷是目標服務器連接不太穩定。
以下是可能的原因,可能性一似乎沒有作用:
可能性一:
web站點目前主要分為http和https兩種協議,其中https類型的網站都是通過ssl協議+http協議的,是目前最安全的網站協議,訪問此類網站的時候,會走ssl協議,驗證訪問者的證書,檢測是否安全。
通過curl訪問此類網站也是如此流程,但是curl中需要添加相應的參數,繞過ssl證書的驗證,才可以正常訪問,如出現此錯誤的一般原因是沒有加此參數。
CURLOPT_SSL_VERIFYHOST的值
設為0表示不檢查證書
設為1表示檢查證書中是否有CN(common name)字段
設為2表示在1的基礎上校驗當前的域名是否與CN匹配。
而早期版本中這個變量是值,為時作用同目前設置為,后來出于,增加了的選項,因此兩個值就不夠用了,升級為三個值。 再后來(之后的版本),這個調試選項由于,被去掉了,因此目前也不支持了,只有兩種取值。
最新版本,它的默認值就是2
如果出現:
PHP Notice: curl_setopt(): CURLOPT_SSL_VERIFYHOST with value 1 is deprecated and will be removed as of libcurl 7.28.1. It is recommended to use value 2 instead in
一般原因是你設置了 curl_setopt ( $curl_handle, CURLOPT_SSL_VERIFYHOST, true ); 改成curl_setopt ( $curl_handle, CURLOPT_SSL_VERIFYHOST, 2 );就行了。
可能性二:
參考:http://blog.sina.com.cn/s/blog_5592787201018ilw.html
在用curl進行模擬調用時,curl接收內容會出現"Empty reply from server" 和 "Recv failure: Connection was reset"的錯誤。 開啟apache ulimit限制和將httpd.conf的work mpm方式修改正確。 修改后"Recv failure: Connection was reset"錯誤消失。"Empty reply from server"存在。 經過對apache的error_log進行跟蹤,出現錯誤"Connection reset by peer: core_output_filter: writing data to the network" 修改httpd.conf,在虛擬主機上添加如下內容: EnableSendfile off EnableMMAP off 修改后"Empty reply from server"錯誤消失。
----------------------------
以下是引用網址原文:
在用curl進行模擬調用時,curl接收內容會出現"Empty reply from server" 和 "Recv failure: Connection was reset"的錯誤。
開啟apache ulimit限制和將httpd.conf的work mpm方式修改正確。
修改后"Recv failure: Connection was reset"錯誤消失。"Empty reply from server"存在。
經過對apache的error_log進行跟蹤,出現錯誤"Connection reset by peer: core_output_filter: writing data to the network"
修改httpd.conf,在虛擬主機上添加如下內容:
EnableSendfile off
EnableMMAP off
修改后"Empty reply from server"錯誤消失。
以上兩個參數詳解如下:
EnableMMAP 指令
說明 在遞送中使用內存映射(memory-mapping)來讀取文件
語法 EnableMMAP On|Off
默認值 EnableMMAP On
作用域 server config, virtual host, directory, .htaccess
覆蓋項 FileInfo
狀態 核心(C)
模塊 core
此指令指示httpd在遞送中如果需要讀取一個文件的內容,它是否可以使用內存映射。當處理一個需要訪問文件中的數據的請求時,比如說當遞送一個使用mod_include進行服務器端分析的文件時,如果操作系統支持,Apache將默認使用內存映射。
這種內存映射有時會帶來性能的提高,但在某些情況下,您可能會需要禁用內存映射以避免一些操作系統的問題:
在一些多處理器的系統上,內存映射會減低一些httpd的性能。
在掛載了NFS的DocumentRoot上,若已經將一個文件進行了內存映射,則刪除或截斷這個文件會造成httpd因為分段故障而崩潰。
在可能遇到這些問題的服務器配置過程中,您應當使用下面的命令來禁用內存映射:
EnableMMAP Off
對于掛載了NFS的文件夾,可以單獨指定禁用內存映射:
EnableSendfile 指令
說明 使用操作系統內核的sendfile支持來將文件發送到客戶端
語法 EnableSendfile On|Off
默認值 EnableSendfile On
作用域 server config, virtual host, directory, .htaccess
覆蓋項 FileInfo
狀態 核心(C)
模塊 core
兼容性 僅在 Apache 2.0.44 及以后的版本中可用
這個指令控制httpd是否可以使用操作系統內核的sendfile支持來將文件發送到客戶端。默認情況下,當處理一個請求并不需要訪問文件內部的數據時(比如發送一個靜態的文件內容),如果操作系統支持,Apache將使用sendfile將文件內容直接發送到客戶端而并不讀取文件。譯者注:Linux2.4/2.6內核都支持。
這個sendfile機制避免了分開的讀和寫操作以及緩沖區分配,但是在一些平臺或者一些文件系統上,最好禁止這個特性來避免一些問題:
一些平臺可能會有編譯系統檢測不到的有缺陷的sendfile支持,特別是將在其他平臺上使用交叉編譯得到的二進制文件運行于當前對sendfile支持有缺陷的平臺時。
在Linux上啟用IPv6時,使用sendfile將會觸發某些網卡上的TCP校驗和卸載bug。
當Linux運行在Itanium處理器上的時候,sendfile可能無法處理大于2GB的文件。
對于一個通過網絡掛載了NFS文件系統的DocumentRoot (比如:NFS或SMB),內核可能無法可靠的通過自己的緩沖區服務于網絡文件。
如果出現以上情況,你應當禁用sendfile :
EnableSendfile Off
針對NFS或SMB,這個指令可以被針對目錄的設置覆蓋:
英文原版如圖:
報錯
報錯
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/163.html