- 帖子
- 212
- 主题
- 189
- 精华
- 0
- 积分
- 1452
- 贡献
- 1134
- 激情
- 1349
- 阅读权限
- 100
- 最后登录
- 2018-6-13
|
[PHP 语言] PHP出错:Warning: fsockopen() [function.fsockopen]: php_network_getaddresses
PHP出错:Warning: fsockopen() [function.fsockopen]: php_network_getaddresses:+ s9 W$ h6 @& Z- G0 g
) p0 D+ M0 `; {5 w+ {9 y
L- q- d' j7 X
最近有点郁闷呀,我的网站头部经常会出现错误提示,百度搜索了一下相关资料,原来是空间禁用了PHP fsockopen函数,为了服务器安全考虑很多主机商禁用了php的fsockopen函数。
2 D) T. m* Z# G A: R6 C4 g. T, o: T/ M& K# X8 n+ Q
一般是如何禁用fsockopen()函数的呢?下面是两种常用的禁用fsockopen的方法。# o& K: I8 ?. R) N; i
1、修改php.ini,将 disable_functions = 后加入 fsockopen
' f2 h5 a: W& B* `2、修改php.ini,将 allow_url_fopen = On 改为 allow_url_fopen = Off
b0 V/ d/ y2 u9 F" `4 e2 o
; ~3 ?. p) v M% g) t3 c出现提示:! A6 [; w& x0 }9 `0 B
- Warning: fsockopen() [function.fsockopen]: php_network_getaddresses: getaddrinfo failed: Name or service not known in /home/qcweb/public_html/wp-includes/class-snoopy.php on line 1148
复制代码 ; E( }5 R# ]$ i8 c, f
: ?) ]( z4 A4 T! |& E3 ^
下面四种方法可以解决问题:
* c. n2 q6 q! Z1 i: c4 v& X7 W
# g8 j+ O7 v/ \) D' n一、可以在出现提示的/home/qcweb/public_html/wp-includes/class-snoopy.php on line 1148文件,在fsockopen函数前加@就可以了。! S A1 _6 Q, Y) S T U! G" H
- A6 |6 \+ K' S; H% Q8 d
二、如果服务器没有同时禁用pfsockopen,那么直接将fsockopen函数替换为pfsockopen。0 E j. h* q U% b
具体操作:搜索程序中的字符串替换为。
+ \: v, R( |% }: o/ C
) ~1 P! W# |2 Z5 @. r修改前:
0 Y o+ |# w$ D0 q+ [- $fp = fsockopen($host, 80, $errno, $errstr, 30);
复制代码
% F: W: e1 A) u- O/ h/ @
' V" `, ~4 c$ D! ?% C$ J& ~! o修改后:
3 }. Y$ ?! U" t1 Q% X4 j- $fp = pfsockopen($host, 80, $errno, $errstr, 30);
复制代码
! F9 N4 R* d% H
: Z% ~& n7 [ n e' ]0 h5 \+ x三、如果服务器同时禁用了pfsockopen,那么用其他函数代替,如stream_socket_client()。注意:stream_socket_client()和fsockopen()的参数不同。* [% S6 ]' ]) J
具体操作:搜索程序中的字符串 fsockopen( 替换为 stream_socket_client( ,然后,将原fsockopen函数中的端口参数“80”删掉,并加到$host。! D! t! I/ `) h) Y- d
% D8 I3 W3 f H3 W9 R; y5 L
示例如下4 l f; q2 J6 S M: T
# c1 _& ?( Q& N- ^0 r# x
修改前:
& e; @- s1 Q) B; x t- $fp = fsockopen($host, 80, $errno, $errstr, 30);
复制代码 9 c4 ^- K/ X- b
& E+ v+ n6 w8 \' J+ n3 |; V- Q修改后- I$ ^, N4 Y0 `* q M
- $fp = stream_socket_client($host."80", $errno, $errstr, 30);
复制代码
2 s, L7 i( A0 {/ `4 l0 Q3 ?) r
3 }$ Q1 f% h8 Z/ D, u$ q. a四、如果PHP版本低于5.0,fsockopen被禁用,又没有stream_socket_client()怎么办呢?自己写一个函数实现fsockopen的功能,参考代码:! n- [; x! B _* f$ [# T3 N2 ]5 b
3 [ `& l2 B i$ e+ m* Z0 T- 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;
- }
复制代码 * P+ u7 U" ~3 ^; I K
7 F0 s; F8 d% q: V- S1 X7 g% z+ k
具体操作:6 G( p( ]- U9 g
1.首先找到使用fsockopen函数的代码段,将上面代码加至其上端,搜索该代码段中的字符串替换为。
1 `! M E& M' L( h! k5 a: N2.因为fsockopen函数返回文件指针所以可以被文件函数操作,但是这个b_fsockopen函数没能返回文件指针,需要继续修改代码段:用替换掉,用替换掉,用替换掉。 |
|