当前位置: 首页 > 后端技术 > PHP

Ubuntu下PHPcurlhttps分段错误(或nginx502)

时间:2023-03-29 18:33:43 PHP

#content{height:480px\9}#m{top:260px\9}昨天下午在日常写代码的时候遇到了一个问题。调用curl_exec()后为502。然后立马写了个测试脚本:ch,CURLOPT_SSL_VERIFYHOST,false);curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);curl_setopt($ch,CURLOPT_TIMEOUT,10);$res=curl_exec($ch);print_r($res);退出;发现,只要链接是https,就一定有段错误,这也是502的原因。http链接是可以正常访问的。php[15304]:segfaultat7f43cf4b7c00ip00007f43cf4b7c00sp00007ffda84c57d8error15inlibssl.so.1.1[7f43cf4b4000+4000]以上日志由系统日志程序检查。我使用LinuxMint操作系统打开它。对于:菜单->日志。然后搜索关键字php,如下图:然后也可以通过gdp查看段错误。首先启用dump选项ulimit-cunlimited然后运行PHP生成一个core文件,phptest.php会在当前目录下生成一个core文件,使用以下命令查看dump的内容:gdbphp-ccore这是显示的结果:GNUgdb(Ubuntu8.1-0ubuntu3)8.1.0.20180409-gitCopyright(C)2018FreeSoftwareFoundation,Inc.LicenseGPLv3+:GNUGPLversion3orlater这是免费软件:您可以自由更改和重新分发它。在法律允许的范围内,不提供任何保证。键入“showcopying”和“showwarranty”以获取详细信息。此GDB配置为“x86_64-linux-gnu”。键入“showconfiguration”以获取配置详细信息。有关错误报告说明,请参阅:。在线查找GDB手册和其他文档资源:。要获得帮助,请键入“help”。键入“aproposword”以搜索与“word”相关的命令...从php读取符号...完成。[新LWP11242][线程调试usinglibthread_db启用]使用主机libthread_db库“/lib/x86_64-linux-gnu/libthread_db.so.1”。核心由`phptest.php'生成。程序因信号SIGSEGV、分段错误而终止。#00x00007fe27bd51c00在??()from/usr/lib/x86_64-linux-gnu/libssl.so.1.1有没有注意到最后一行,提醒我们libssl有问题?解决问题的灵感来源于这里:https://bugs.php.net/bug.php?...有人遇到同样的问题,官方提示说是ssl库不同导致的由系统curl和编译php时使用的ssl库(opsnssl)使用。然后搜索phpinfo资料,发现PHP使用的curl的版本和它使用的ssl库(openssl)的版本:然后查看PHP编译时的openssl版本:这两个软件的openssl版本明显不一致,所以接下来要么重新安装CompilePHP,使用系统openssl版本1.1.0g,要么重新编译安装curl,使用openssl版本1.0.2o,我选择了后者。下面是安装新版本curl的过程。首先下载新版本的curlwgethttps://curl.haxx.se/download/curl-7.62.0.tar.gz然后解压安装tarvxzfcurl-7.62.0.tar.gzcdcurl-7.62.0sudo./configure--with-ssl=/usr/local/openssl--prefix=/usr/local#php的openssl在这个目录下,所以指定这个sudomakesudomakeinstall然后重新打开一个terminalcurl-Vcurl7.62.0(x86_64-pc-linux-gnu)libcurl/7.62.0OpenSSL/1.0.2ozlib/1.2.11Release-Date:2018-10-31Protocols:dictfileftpftpsgopherhttphttpsimapimapspop3pop3srtspsmbsmbssmtpsmtpstelnettftp功能:AsynchDNSfileNTLMIPv6LargeNTLM_WBSSLlibzTLS-SRPUnixSocketsHTTPS-proxy发现系统的curl版本已经升级成功,openssl的版本也是想要的版本。然后我们再次运行测试文件,?testsphptest.phpphp:/usr/local/lib/libcurl.so.4:noversioninformationavailable(requiredbyphp)#Thisisanewquestion百度一下就知道了发现可以获取https的内容了解决这个问题:php:/usr/local/lib/libcurl.so.4:noversioninformationavailable(phprequiredbyphp)#这是解决新问题的第一种方法,把curl和curl-config放在/usr/bin替换成/usr/local/bin下对应的文件sudorm-rf/usr/bin/curl*sudoln-s/usr/local/bin/curl/usr/bin/curlsudoln-s/usr/local/bin/curl-config/usr/bin/curl-config其次,由于我用的是lnmp1.5一键安装包,所以重新安装了php。出现这个问题的原因是php在编译的时候得到的libcurl的版本是之前系统的版本。现在libcurl已经升级,php的版本信息消失了,我们只需要重新安装php:cdlnmp1.5sudo。/upgrade这里会提示你输入要升级哪个软件,你选择PHP。然后你会被提示输入你的PHP版本号,你输入5.6.38。最后按回车。