修复发信系统HTTP500错误

By kidvnet at 2016-07-09 • 0人收藏 • 246人看过

自从以前的论坛程序(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

3 个回复 | 最后更新于 2016-07-09
2016-07-09   #1

@lincanbin 这个帖子的代码排版有问题。

2016-07-09   #2

回复 #1 @ivanilla :

因为他是从别的地方复制过来的,没在这边排版。

2016-07-09   #3

回复#2 @lincanbin :

我不知你这边显示的有没有问题,我这边看到他的代码那里已经超出右边界了。

登录后方可回帖

登 录
信息栏
购买PHP虚拟主机 / VPS

Carbon Forum是一个基于话题的高性能轻型PHP论坛

下载地址:Carbon Forum v5.0.1
QQ群:12607708(QQ我不常上)

donate

手机支付宝扫描上方二维码可向本项目捐款

Loading...