解决虚拟主机fsockopen方法被禁用问题

前两天因为太多垃圾评论,打开了Akismet,当时开启Akismet后发现效果还行,也没太仔细看Akismet的相关设置,今天点进去看一下发现Akismet的服务器连接状态显示网络功能被禁用。


服务器连接状态
网络功能被禁用。
您的主机似乎禁用了 PHP 的 fsockopen 或 gethostbynamel 函数。在此问题修复之前,Akismet 无法工作。请联系您的主机服务管理员或防火墙管理员,并向他们提供 Akismet 的运行环境要求。

通过检查在空间上运行phpinfo()方法,发现虚拟主机确实禁用了fsockopen方法,咋办呢。
检查虚拟主机根目录(不是wwwroot目录)下的php.ini文件,打开,查找allow_url_fopen

allow_url_fopen = On

这是正确的,此行配置是指允许访问网络文件,如果是Off,请改为On

接着找disable_functions,找到

disable_functions = fsockopen

好,找到问题,这行配置禁用了fsockopen方法,删掉或者注释掉此行代码。(注释方法,行首加“;”号)
修改配置后,重新检查Akismet配置,网络接连正常。

如果无法修改php.ini文件,或者修改无效,可参考以下方法。
一、如果只禁用了fsockopen,而没有禁用pfsockopen方法可将所有用到fsockopen方法的地方修改为使用pfsockopen,如果是插件调用,那只能通过修改插件的代码来搞定了。

二、如果服务器同时还禁用了pfsockopen,那还可以用stream_socket_client方法代替,不过stream_socket_client和fsockopen的调用参数不同。
具体操作:搜索程序中的字符串 fsockopen( 替换为 stream_socket_client( ,然后,将原fsockopen函数中的端口参数“80”删掉,并加到$host。示例如下
修改前:

$fp = fsockopen($host, 80, $errno, $errstr, 30);

修改后

$fp = stream_socket_client($host."80", $errno, $errstr, 30);

三,如果你十分十分的不幸,fsockopen和pfsockopen方法都被禁用,并且你的php版本低于5.0时,没有stream_socket_client方法,那你只有自己手动写一个了。
参考代码:

function b_fsockopen($host, $port, &$errno, &$errstr, $timeout) {
 $ip = gethostbyname($host);
 $s = socket_create(AF_INET, SOCK_STREAM, 0);
 if (socket_set_nonblock($s)) {
  $r = @socket_connect($s, $ip, $port);
  if ($r || socket_last_error() == EINPROGRESS) {
   $errno = EINPROGRESS;
   return $s;
  }
 }
 $errno = socket_last_error($s);
 $errstr = socket_strerror($errno);
 socket_close($s);
 return false;
}

具体操作:
1.首先找到使用fsockopen函数的代码段,将上面代码加至其上端,搜索该代码段中的字符串 fsockopen( 替换为 b_fsockopen( 。
2.因为fsockopen函数返回文件指针所以可以被文件函数操作,但是这个b_fsockopen函数没能返回文件指针,需要继续修改代码段:用socket_read( 替换掉 fread( ,用socket_write( 替换掉fwrite( ,用socket_close( 替换掉fclose( 。

马上分享给你的朋友吧~

解决虚拟主机fsockopen方法被禁用问题》上有 9 条评论

  1. 我现在用的国外主机就是不支持fsockopen 但是支持 pfsockopen ,导致有人评论时我没法收到邮件,因为连接不上smtp,之后修改了class_smtp.php,把fsockopen改为了pfsockopen,邮件可以用了,可是反馈的邮件还是有问题的,因为邮件标题都是Mail delivery failed: returning message to sender 虽然内容是收到了,可是太难看了

  2. Pingback 引用通告: ZZ 解决虚拟主机fsockopen方法被禁用问题 « 我是Moface

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>