• PHP使用file_get_contents或curl请求https的域名内容为空或Http 505错误的问题排查方法


         前段日子,突然接到用户的反馈,说系统中原来的QQ登录、微博登录通通都不能用,跟踪代码进去后发现,是在 file_get_contents这个函数请求QQ登录的地方报错,在用该函数file_get_contents请求https协议的地址时,返回的是空,没有任何错误!

         从网上找了很多的帖子,时间跨度也接近3个多月,此问题一致没有得到很好的解决。有说是因为没有openssl的问题,但我的是linux系统,不需要openssl.dll,同时我也尝试编译过openssl.so等方式,都不行,因为我的Php环境就已经是包含了openssl的编译的。

         而且根据网上的教程,不仅没有解决掉我的问题,反而出现了新的问题,原来还能返回空的内容,按照一系列的教程后,结果报505的错误,而且nginx、php等错误日志都不能很好地发现问题,这个又接近过去了一个月。

         由于一直返回505的错误信息,我也怀疑是nginx返回的错误,这样就看不到底层php返回的具体错误。一直在想如何绕过nginx直接访问php页面,看看最原始的错误呢?但nginx不能随便更改,毕竟系统还是一直在运行和用户访问提交数据的。

        又过去了两周,客户一直电话催着要解决这个问题,没办法硬着头皮再上。继续研究php的时候,突然发现php也是个命令,可以直接php test.php;test.php里只有一个file_get_contents的函数,这下就可以直接快速方便地反馈原始的错误信息了。

    执行命令后,控制台上就显示 segment fault的错误。继续根据这个线索进行百度或google,有朋友发现是因为sqlite的问题,具体参考该文

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

    可以通过查看系统内核日志,发现问题端倪。

    通过查看内核日志和gdb记录,可以发现问题出现在libsqlite上

    内核日志:
     
    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。难道是因为升级了系统导致该问题的出现吗?
     
  • 相关阅读:
    Django 信号
    Python标准库12 数学与随机数 (math包,random包)
    利用python进行数据分析之数据聚合和分组运算
    利用python进行数据分析之绘图和可视化
    Django Aggregation聚合
    配置使用TargetFrameworks输出多版本类库
    WebApi 异常处理解决方案
    WebApi(6) 后台C#调用WebApi
    Target frameworks
    C#中lock死锁实例教程
  • 原文地址:https://www.cnblogs.com/cehui0303/p/8422337.html
Copyright © 2020-2023  润新知