$7.49 .com domain with free InstantPage Website Builder$1.99 Web Hosting   捷飞网络官方淘宝店   Godaddy 优惠码
返回列表 发帖
分享到:




[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
  1. 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
具体操作:搜索程序中的字符串
  1. fsockopen(
复制代码
替换为
  1. pfsockopen(
复制代码

+ \: v, R( |% }: o/ C
) ~1 P! W# |2 Z5 @. r修改前:
0 Y  o+ |# w$ D0 q+ [
  1. $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
  1. $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
  1. $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
  1. $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
  1. function b_fsockopen($host, $port, &$errno, &$errstr, $timeout) {
  2. $ip = gethostbyname($host);
  3. $s = socket_create(AF_INET, SOCK_STREAM, 0);
  4. if (socket_set_nonblock($s)) {
  5. $r = @socket_connect($s, $ip, $port);
  6. if ($r || socket_last_error() == EINPROGRESS) {
  7. $errno = EINPROGRESS;
  8. return $s;
  9. }
  10. }
  11. $errno = socket_last_error($s);
  12. $errstr = socket_strerror($errno);
  13. socket_close($s);
  14. return false;
  15. }
复制代码
* 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. fsockopen(
复制代码
替换为
  1. b_fsockopen(
复制代码

1 `! M  E& M' L( h! k5 a: N2.因为fsockopen函数返回文件指针所以可以被文件函数操作,但是这个b_fsockopen函数没能返回文件指针,需要继续修改代码段:用
  1. socket_read(
复制代码
替换掉
  1. fread(
复制代码
,用
  1. socket_write(
复制代码
替换掉
  1. fwrite(
复制代码
,用
  1. socket_close(
复制代码
替换掉
  1. fclose(
复制代码




返回列表
Namecheap
Namecheap.com - Cheap domain name registration, renewal and transfers - Free SSL Certificates - Web Hosting
互联网安全