虚拟主机php程序fsockopen函数被禁用 |
发布时间: 2014/8/15 10:42:47 |
在PHP程序中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()。 本文出自:亿恩科技【www.enkj.com】 |