修复发信系统HTTP500错误
By kidvnet
at 2016-07-09
0人收藏 • 2464人看过
自从以前的论坛程序(discuz)发信系统以及QQ互联出了问题以后导致很多用户无法登陆论坛,我就决定寻找替代产品了,考虑过NODBB,但是由于是nodejs编写的对我来说还是比较陌生。所以选择了这款更加轻量级的carbon forum程序。
不幸的是发信系统的问题再次困扰我,好在这套程序直接提示HTTP500错误,只要通过nginx的错误日志拍错即可!不像以前discuz弹出个对话框告诉我 “服务器返回错误信息:” 然后后面就是空白!!!
以下是我的拍错过程
首先将nginx的报错级别设置成error (我用的是LNMP安装包 可能别人的安装路径有所不同)
1 | vi /usr/local/nginx/conf/nginx.conf |
通过修改nginx配置文件 中的error_log项
error_log /home/wwwlogs/nginx_error.log error;
将第三个参数设置成error 这样我们就能在/home/wwwlogs/nginx_error.log这个文件
看到更多的报错信息
修改完成之后重启nginx
使用发信系统发信,依然是HTTP500
打开nginx_error.log 发现如下报错信息
2016/07/09 15:31:59 [error] 25484#0: *31 FastCGI sent in stderr: "PHP message: PHP Parse error: syntax error, unexpected '=' in /home/wwwroot/other/l4co.de/library/PHPMailer.class.php on line 1310" while reading response header from upstream, client: 108.162.250.174, server: www.l4co.de, request: "POST /forgot? HTTP/1.1", upstream: "fastcgi://unix:/tmp/php-cgi.sock:", host: "www.l4co.de", referrer: "<a href="http://www.l4co.de/forgot" _src="http://www.l4co.de/forgot" "="">http://www.l4co.de/forgot"
library/PHPMailer.class.php on line 1310 有一个奇怪的变量 PREFIX
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | $PREFIX = ''; $secure = $this->SMTPSecure; $tls = ($this->SMTPSecure == 'tls'); if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) { PREFIX = 'ssl://'; $tls = false; // Can't have SSL and TLS at the same time $secure = 'ssl'; } elseif ($hostinfo[2] == 'tls') { $tls = true; // tls doesn't use a prefix $secure = 'tls'; } //Do we need the OpenSSL extension? $sslext = defined('OPENSSL_ALGO_SHA1'); if ('tls' === $secure or 'ssl' === $secure) { //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled if (!$sslext) { throw new phpmailerException($this->lang('extension_missing') . 'openssl', self::STOP_CRITICAL); } } $host = $hostinfo[3]; $port = $this->Port; $tport = (integer) $hostinfo[4]; if ($tport > 0 and $tport < 65536) { $port = $tport; } if ($this->smtp->connect(PREFIX . $host, $port, $this->Timeout, $options)) { |
发现整个脚本只有这一区域的function使用了该变量,考虑到这一点,所以即使它是全局变量在这里再声明一次应该也没什么问题,所以我在1310 ,1314行 以及调用该参数的函数里面都加上了$符.而且我看了一下注释只有SSL协议才会实用到这个变量,所以为了避免使用该变量我将smtp服务器端口设置为了tls协议的587.
果然!问题解决了!
虽然不是很懂PHP,但是还是斗胆发个贴记录一下这次拍错过程 希望对大家有帮助
出处:http://www.l4co.de/t/6
- 登录后方可回帖
回复 #1 @ivanilla :
因为他是从别的地方复制过来的,没在这边排版。
回复#2 @lincanbin :
我不知你这边显示的有没有问题,我这边看到他的代码那里已经超出右边界了。