判斷fsockopen 是否可用:function_exists('fsockopen');如果沒有開啟
一、開啟fsockopen函數
- 修改php.ini,將 disable_functions = 后面的fsockopen去掉,如果有的話。
- 修改php.ini,將 allow_url_fopen = Off 改為 allow_url_fopen = On
二、虛擬主機替代方法
1、pfsockopen替代
如果服務器沒有同時禁用pfsockopen,那么直接將fsockopen函數替換為pfsockopen。具體操作:搜索程序中的字符串 fsockopen 替換為 pfsockopen; 示例如下:
修改前: $fp = fsockopen($host, 80, $errno, $errstr, 30); 修改后: $fp = pfsockopen($host, 80, $errno, $errstr, 30);
2、stream_socket_client替代
如果服務器同時禁用了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);
3、自定義替代函數
如果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; }
具體操作:
- 首先找到使用fsockopen函數的代碼段,將上面代碼加至其上端,搜索該代碼段中的字符串 fsockopen 替換為 b_fsockopen。
- 因為fsockopen函數返回文件指針所以可以被文件函數操作,但是這個b_fsockopen函數沒能返回文件指針,需要繼續修改代碼段:用socket_read替換掉 fread,用socket_write替換掉fwrite,用socket_close替換掉fclose。