PHP使用file_get_contents或curl請求https的域名內容爲空或Http 505錯誤的問題排查方法

     前段日子,忽然接到用戶的反饋,說系統中原來的QQ登陸、微博登陸統統都不能用,跟蹤代碼進去後發現,是在 file_get_contents這個函數請求QQ登陸的地方報錯,在用該函數file_get_contents請求https協議的地址時,返回的是空,沒有任何錯誤!php

     從網上找了不少的帖子,時間跨度也接近3個多月,此問題一致沒有獲得很好的解決。有說是由於沒有openssl的問題,但個人是linux系統,不須要openssl.dll,同時我也嘗試編譯過openssl.so等方式,都不行,由於個人Php環境就已是包含了openssl的編譯的。linux

     並且根據網上的教程,不只沒有解決掉個人問題,反而出現了新的問題,原來還能返回空的內容,按照一系列的教程後,結果報505的錯誤,並且nginx、php等錯誤日誌都不能很好地發現問題,這個又接近過去了一個月。nginx

     因爲一直返回505的錯誤信息,我也懷疑是nginx返回的錯誤,這樣就看不到底層php返回的具體錯誤。一直在想如何繞過nginx直接訪問php頁面,看看最原始的錯誤呢?但nginx不能隨便更改,畢竟系統仍是一直在運行和用戶訪問提交數據的。sql

    又過去了兩週,客戶一直電話催着要解決這個問題,沒辦法硬着頭皮再上。繼續研究php的時候,忽然發現php也是個命令,能夠直接php test.php;test.php裏只有一個file_get_contents的函數,這下就能夠直接快速方便地反饋原始的錯誤信息了。函數

執行命令後,控制檯上就顯示 segment fault的錯誤。繼續根據這個線索進行百度或google,有朋友發現是由於sqlite的問題,具體參考該文oop

http://blog.csdn.net/loophome/article/details/53812887google

能夠經過查看系統內核日誌,發現問題端倪。spa

經過查看內核日誌和gdb記錄,能夠發現問題出如今libsqlite上.net

 

內核日誌:
 
tail -f /var/log/messages
kernel: php[26564]: segfault at 8048 ip 00007f7a72fede9c sp 00007fffec90edf0 error 4 in libsqlite3.so.0.8.6[7f7a72fd1000+8c000]
 
gdb記錄:
 
Program received signal SIGSEGV, Segmentation fault.
0x00007fffe9651e9c in sqlite3_file_control () from /usr/lib64/libsqlite3.so.0
 
最終找到問題的最關鍵處理手段
刪除或更名兩個文件便可解決,親身經歷,該方法可行!
Removing /etc/pki/nssdb/pkcs11.txt
and /etc/pki/nssdb/cert9.db
 
如今問題解決了,但我再思考爲何回出現該問題呢,由於之前該功能是正常的,惟一作的操做是我最近由於想再這個Centos 6.5上安裝.net core,進行了一次update,結果如今變成了Centos 6.9。難道是由於升級了系統致使該問題的出現嗎?
相關文章
相關標籤/搜索