$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:
$ y  j5 }9 `! p# x: [. G
- N6 s: [: m2 B8 x2 z8 X2 j8 {/ x' n0 b; v# M* ~, b* _8 V1 [  c
最近有点郁闷呀,我的网站头部经常会出现错误提示,百度搜索了一下相关资料,原来是空间禁用了PHP fsockopen函数,为了服务器安全考虑很多主机商禁用了php的fsockopen函数。) C  C8 c1 j2 V* h; \3 s- A

7 t1 |1 Z9 y9 G, W" p一般是如何禁用fsockopen()函数的呢?下面是两种常用的禁用fsockopen的方法。
' @: C5 a4 ^! L/ C1、修改php.ini,将 disable_functions = 后加入 fsockopen3 @+ b6 N* @" k+ g) a' g
2、修改php.ini,将 allow_url_fopen = On 改为 allow_url_fopen = Off
( Z! N5 }  _/ i( x/ y
) i4 B4 m  M* p$ f# ]出现提示:
8 I7 j/ O) z; k+ c
  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
复制代码

7 \) B0 t1 x6 O1 c4 o1 V+ d% x# Y, R/ r
下面四种方法可以解决问题:- f: h8 C+ A- z2 |) x& M. ?9 Y
  P: r" M# u1 i6 Y' e8 _- x4 _
一、可以在出现提示的/home/qcweb/public_html/wp-includes/class-snoopy.php on line 1148文件,在fsockopen函数前加@就可以了。
, f0 a# J2 v+ n+ ?5 }9 E% [4 o( O* ^/ W, o2 b
二、如果服务器没有同时禁用pfsockopen,那么直接将fsockopen函数替换为pfsockopen。
: ~8 p( w! o6 k0 b! W1 m具体操作:搜索程序中的字符串
  1. fsockopen(
复制代码
替换为
  1. pfsockopen(
复制代码

) X3 Y/ y4 R, F; f
! d% U3 I& q( w4 s' c修改前:
- ~: s8 b( l4 P  r% V1 T+ C4 i
  1. $fp = fsockopen($host, 80, $errno, $errstr, 30);
复制代码

1 z  w4 P( l8 P6 h1 {7 N  R$ D2 j, x% F* @9 h5 k+ h7 K1 Q- `
修改后:% o. z  [2 A" _# F% M
  1. $fp = pfsockopen($host, 80, $errno, $errstr, 30);
复制代码

' @7 L) u. b) z% g' H$ i8 l
& l6 I" P: J3 q) z- P5 ~* e三、如果服务器同时禁用了pfsockopen,那么用其他函数代替,如stream_socket_client()。注意:stream_socket_client()和fsockopen()的参数不同。
/ o# _/ I* h6 t0 G' [具体操作:搜索程序中的字符串 fsockopen( 替换为 stream_socket_client( ,然后,将原fsockopen函数中的端口参数“80”删掉,并加到$host。
( d5 L6 q$ E" t+ N$ `
' g2 U8 f* b' |% @4 v- P0 n, V示例如下8 s5 |. g2 e9 r" z3 T$ V5 O

: J* z- m# a  v$ @: A修改前:5 j5 A' F5 a. t! }4 L* T
  1. $fp = fsockopen($host, 80, $errno, $errstr, 30);
复制代码

9 E1 Z- Y: q4 }% w* b6 t: e1 h  I
0 t2 M: f* t: \修改后
5 l! ?  Y9 |6 A* |
  1. $fp = stream_socket_client($host."80", $errno, $errstr, 30);
复制代码

/ l+ J* [2 w6 _3 l; Q6 |7 f* [: c9 }
四、如果PHP版本低于5.0,fsockopen被禁用,又没有stream_socket_client()怎么办呢?自己写一个函数实现fsockopen的功能,参考代码:
1 S: V4 }2 r7 r& X" r) _
/ Z5 v+ T+ w% h3 Z
  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. }
复制代码
0 M) F. z4 t9 g' _; T4 y8 z$ L
. K# b! [% V8 C) w# }
具体操作:
& q8 }/ K- W) \/ B1.首先找到使用fsockopen函数的代码段,将上面代码加至其上端,搜索该代码段中的字符串
  1. fsockopen(
复制代码
替换为
  1. b_fsockopen(
复制代码
+ h+ ]8 N# W; z/ N( U. ?3 L
2.因为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
互联网安全