fsockopen,pfsockopen函數被禁用的解決方法

一、(已測試)

  服務器同時禁用了fsockopen pfsockopen,那麼用其他函數代替,如stream_socket_client()。

注意:stream_socket_client()和fsockopen()的參數不同。

  具體操作:
             修改前:$fp = fsockopen($host, $port, $errno, $errstr, $connection_timeout);
             修改後:$fp = stream_socket_client($host.':'.$port, $errno, $errstr, 30);

二、(未測試)

  如果PHP版本低於5.0,fsockopen被禁用,又沒有stream_socket_client()怎麼辦呢?自己寫一個函數實現fsockopen的功能。

參考代碼:

如果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 。

參考百度百科 fsockopen 詞條

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章