fsockopen被禁用

今天调试了一整天,之前工作好好的网站突然获取不到数据了,而且在本地调试都没有问题,经过苦苦调试发现

fsockopen

被空间提供商给禁用了。

解决方案

找服务提供商开启

提供另一篇文章供参考 http://www.discuz.net/thread-2645665-1-1.html

关于fsockopen pfsockopen函数被禁用的解决方法
一、

服务器同时禁用了

fsockopen
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);

二、

如果PHP版本低于5.0,

fsockopen

被禁用,又没有

stream_socket_client()

怎么办呢?自己写一个函数实现

fsockopen

的功能,参考代码:

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(

三、

使用CMS类网站程序的用户,如织梦CMS,phpwind,帝国,等程序,请将您的程序升级到最新的版本并及时更新安全漏洞补丁。

上面的第一种解决方法中请确保

stream_socket_client()

没有被禁用。怎么通过php代码检查某个方法是否可用请参考这里

发表评论

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

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