$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:
! j% T7 W  j% X2 R0 c
  F9 B# l4 h; X( t4 m7 i0 ?* M+ b3 a6 h
最近有点郁闷呀,我的网站头部经常会出现错误提示,百度搜索了一下相关资料,原来是空间禁用了PHP fsockopen函数,为了服务器安全考虑很多主机商禁用了php的fsockopen函数。
7 K; x. D. |) g. S
2 s" m& c8 J$ {3 K- }# g* r! O一般是如何禁用fsockopen()函数的呢?下面是两种常用的禁用fsockopen的方法。
/ {8 n0 Q+ T: I1、修改php.ini,将 disable_functions = 后加入 fsockopen
7 j) e2 I  Z* d/ [) ^& \2、修改php.ini,将 allow_url_fopen = On 改为 allow_url_fopen = Off
, c+ m  q6 @+ l5 x
; Z( c+ H- N  i6 G% w3 I出现提示:
  Y* _2 A: h% l/ s; m, Z, 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 U! ^1 o7 \9 \5 c0 e# O+ [

4 B( y' }% t& |# v! a下面四种方法可以解决问题:
5 Q! e9 _/ N) P$ G7 m7 G$ j- h* D! y  [) g) {0 L0 }
一、可以在出现提示的/home/qcweb/public_html/wp-includes/class-snoopy.php on line 1148文件,在fsockopen函数前加@就可以了。9 @5 j& H, F' E1 e* C5 z4 V7 c
5 I+ N/ D! R3 U# ?
二、如果服务器没有同时禁用pfsockopen,那么直接将fsockopen函数替换为pfsockopen。
1 Z5 j8 M$ H- D5 L具体操作:搜索程序中的字符串
  1. fsockopen(
复制代码
替换为
  1. pfsockopen(
复制代码

+ g* h% U; s2 v' ?; ]( A+ U
. R. E" z4 z" q  z- t修改前:& q2 m5 ?6 ^: I7 z* @) u, q
  1. $fp = fsockopen($host, 80, $errno, $errstr, 30);
复制代码
. {8 Y# `7 f  e* L; `7 |. n  e( c4 i
2 j' O8 G$ ?% @/ Z4 {
修改后:
% k9 L* K9 M, _- V  g  W
  1. $fp = pfsockopen($host, 80, $errno, $errstr, 30);
复制代码

# X. H4 Z# H5 Q7 I" y" s* h) }4 f# I( l1 E' H/ f
三、如果服务器同时禁用了pfsockopen,那么用其他函数代替,如stream_socket_client()。注意:stream_socket_client()和fsockopen()的参数不同。) q8 B: ~8 L3 e5 U
具体操作:搜索程序中的字符串 fsockopen( 替换为 stream_socket_client( ,然后,将原fsockopen函数中的端口参数“80”删掉,并加到$host。
4 @+ H9 C) ?' l: B$ D6 _8 V- }5 u0 G0 P
示例如下5 Y* V' t' q: S
5 ]" _( H- T2 o# G7 L& c9 G
修改前:
& x' a2 ?! _$ t5 u; f1 Y3 o* w7 T8 a
  1. $fp = fsockopen($host, 80, $errno, $errstr, 30);
复制代码

5 d/ Z% G, Q1 X9 d" [: t. e) ^% K+ u, }
修改后' u/ j! X" A  ^. u  i
  1. $fp = stream_socket_client($host."80", $errno, $errstr, 30);
复制代码

( U) Y$ Q5 ?9 m
1 Z# D" p; B  ^- W9 {- l, r: d四、如果PHP版本低于5.0,fsockopen被禁用,又没有stream_socket_client()怎么办呢?自己写一个函数实现fsockopen的功能,参考代码:
) P% d: p' ]- j- K, X% l9 A: p0 z& Z: L
  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 d  j; ?  g7 ~

9 c6 X% L3 u" A7 Z' ]: j3 N( x具体操作:7 S( o9 G: s* q/ R; x& h; N
1.首先找到使用fsockopen函数的代码段,将上面代码加至其上端,搜索该代码段中的字符串
  1. fsockopen(
复制代码
替换为
  1. b_fsockopen(
复制代码
) c- W. O0 K; ^3 i) m
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
互联网安全