$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:7 S5 H3 K$ v7 x5 F
. y" u7 N8 i7 h6 A1 @$ W

  S6 ]9 L; @" q$ r- D: c最近有点郁闷呀,我的网站头部经常会出现错误提示,百度搜索了一下相关资料,原来是空间禁用了PHP fsockopen函数,为了服务器安全考虑很多主机商禁用了php的fsockopen函数。
; m- Z% `( V# n; l) Y
+ {6 U0 R2 ~9 q一般是如何禁用fsockopen()函数的呢?下面是两种常用的禁用fsockopen的方法。! B7 ]' i$ S2 \5 u1 r7 r7 @
1、修改php.ini,将 disable_functions = 后加入 fsockopen
  f8 E, d# x& s, M* r8 M1 W. D. h; s2、修改php.ini,将 allow_url_fopen = On 改为 allow_url_fopen = Off! M, X: g: d8 y$ Z

' _# U% V2 g/ K& @出现提示:
4 e+ D+ h0 ]& }
  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
复制代码

1 n7 p6 t) }% l, ]6 A, ~# [8 I7 _& U& ?' A
下面四种方法可以解决问题:
0 i* H5 d2 e4 \2 S
* N; j( f7 N0 l. k3 x一、可以在出现提示的/home/qcweb/public_html/wp-includes/class-snoopy.php on line 1148文件,在fsockopen函数前加@就可以了。/ E0 ^0 H  H8 t4 f/ p7 t" d- y7 B0 V

3 c. S4 C: s) [4 Y) n" `+ {二、如果服务器没有同时禁用pfsockopen,那么直接将fsockopen函数替换为pfsockopen。. ^$ N, {  ~3 [) }; J
具体操作:搜索程序中的字符串
  1. fsockopen(
复制代码
替换为
  1. pfsockopen(
复制代码
. J8 u% T1 Q: f$ |1 I  J: k" w
  I; {" Z1 q9 O! k
修改前:2 k3 t/ z6 v5 D  E. }
  1. $fp = fsockopen($host, 80, $errno, $errstr, 30);
复制代码
" J* o. K" M0 T0 O" \% Z  Q
/ o3 U; x5 I+ F8 X! B
修改后:
% `2 X( t4 D/ n9 m& h: C; d
  1. $fp = pfsockopen($host, 80, $errno, $errstr, 30);
复制代码
  c" K. ^# m4 E. M7 _0 _

7 h' K5 i% }7 C. h三、如果服务器同时禁用了pfsockopen,那么用其他函数代替,如stream_socket_client()。注意:stream_socket_client()和fsockopen()的参数不同。- x  C9 F: L8 _% {5 t
具体操作:搜索程序中的字符串 fsockopen( 替换为 stream_socket_client( ,然后,将原fsockopen函数中的端口参数“80”删掉,并加到$host。; W% N! S3 `& |' q3 [

* x5 y: z( @$ K5 N: T5 e3 x示例如下2 c( U4 Q3 l2 S; s3 A

" n. ]* C3 Q- Y: R修改前:4 x+ O" N$ }/ n7 |" k
  1. $fp = fsockopen($host, 80, $errno, $errstr, 30);
复制代码
/ J# a; u; e1 I4 l- c

7 H  S7 v. Y: y: x修改后/ C" B+ ~8 q9 q0 I! u) @: }
  1. $fp = stream_socket_client($host."80", $errno, $errstr, 30);
复制代码

2 \0 n! G0 o* z+ A4 W! y) _# Z7 t6 n4 c" Z8 q4 ]$ y0 x  Q: g
四、如果PHP版本低于5.0,fsockopen被禁用,又没有stream_socket_client()怎么办呢?自己写一个函数实现fsockopen的功能,参考代码:" r2 l3 L& P1 G. A

) \/ H4 x5 k- 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. }
复制代码

5 G& u/ o( q7 d( b% O4 J% {) v' F
具体操作:, U8 x6 S1 U2 M4 D6 R# X+ Q
1.首先找到使用fsockopen函数的代码段,将上面代码加至其上端,搜索该代码段中的字符串
  1. fsockopen(
复制代码
替换为
  1. b_fsockopen(
复制代码
4 F, c) ~# H7 X) G$ w
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
互联网安全