一、(已測試)
服務器同時禁用了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 詞條