$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:. `6 x, q, E! x& W
. N* s2 W0 N! ^

3 {( }) h" ]! Y最近有点郁闷呀,我的网站头部经常会出现错误提示,百度搜索了一下相关资料,原来是空间禁用了PHP fsockopen函数,为了服务器安全考虑很多主机商禁用了php的fsockopen函数。2 i! L* f6 I+ I, f  t2 c  K; M* h
! `! e3 ]1 w- o3 D; b9 M  f- j: E
一般是如何禁用fsockopen()函数的呢?下面是两种常用的禁用fsockopen的方法。* t/ j; \( H( Z2 G7 v: o
1、修改php.ini,将 disable_functions = 后加入 fsockopen- U& }$ y) M! {9 T8 V' M$ B
2、修改php.ini,将 allow_url_fopen = On 改为 allow_url_fopen = Off7 Z( v8 o& r2 w; m/ n  c% B
" ?2 `( K, u& e0 `% q
出现提示:* {" A9 E/ F' g& i# s3 A% J
  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
复制代码

+ {5 J- f* j4 K- l9 b% P4 i. X0 M  _
下面四种方法可以解决问题:; Z+ U" R' v( m6 r+ R8 J# X

8 X# a9 e/ s. b2 s3 L/ P7 I一、可以在出现提示的/home/qcweb/public_html/wp-includes/class-snoopy.php on line 1148文件,在fsockopen函数前加@就可以了。1 P2 _9 W! x/ H) H) W! N
" k8 o: R% H8 H7 u/ T# p% N
二、如果服务器没有同时禁用pfsockopen,那么直接将fsockopen函数替换为pfsockopen。8 }; c6 z; d4 i* Y7 D
具体操作:搜索程序中的字符串
  1. fsockopen(
复制代码
替换为
  1. pfsockopen(
复制代码
, D2 I  m8 `. j4 E  Q: K. f
5 u; d. j4 K8 y7 c
修改前:
0 s& ]9 ~$ {8 t( g4 {) N9 n
  1. $fp = fsockopen($host, 80, $errno, $errstr, 30);
复制代码

: M/ [: a! l. `+ c/ F- Z4 E$ _* v
2 P9 B0 u. `  f6 T8 K修改后:
' p9 i1 P; b2 m2 S1 n0 }6 y
  1. $fp = pfsockopen($host, 80, $errno, $errstr, 30);
复制代码
, B, I+ T0 {2 W  @+ N. B
; Q5 y- P  b: B
三、如果服务器同时禁用了pfsockopen,那么用其他函数代替,如stream_socket_client()。注意:stream_socket_client()和fsockopen()的参数不同。
, ^& S/ I! Y9 z# L0 A具体操作:搜索程序中的字符串 fsockopen( 替换为 stream_socket_client( ,然后,将原fsockopen函数中的端口参数“80”删掉,并加到$host。( I! a) o- D$ O: N8 n

7 n( M6 t% q6 [  N5 R5 s8 p7 a示例如下9 F3 T! F" k" k$ d/ J: s! F

7 P2 j: I7 e8 x7 X修改前:5 c. `  C: @0 [7 j& `; q
  1. $fp = fsockopen($host, 80, $errno, $errstr, 30);
复制代码

2 s; [5 i0 W9 M8 W& e* j; o# P# T& B1 x# N1 \' c7 @
修改后
- j+ A, X8 a# P5 [/ f
  1. $fp = stream_socket_client($host."80", $errno, $errstr, 30);
复制代码
# M  ?3 v, V3 ?. a8 H, N" v
& N9 v. H' [& s4 ^, q
四、如果PHP版本低于5.0,fsockopen被禁用,又没有stream_socket_client()怎么办呢?自己写一个函数实现fsockopen的功能,参考代码:
6 j0 R7 M. ^. ]/ r2 K
# c6 z; I; X: I% s+ B4 q
  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. }
复制代码

" a" n# U: i' Q! s% \7 Z
% Y) W/ O( y& Q3 `$ n具体操作:
1 g) \/ l6 o. l+ i* C$ Z1.首先找到使用fsockopen函数的代码段,将上面代码加至其上端,搜索该代码段中的字符串
  1. fsockopen(
复制代码
替换为
  1. b_fsockopen(
复制代码
% T0 z& w* P& i$ C8 H0 a' k( D% n
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
互联网安全