$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" h! s4 }! p: @: _! @  A  x
0 j" q' Z; _+ ?4 k. ~7 @
+ P/ T. l5 b/ _9 D  W5 ^最近有点郁闷呀,我的网站头部经常会出现错误提示,百度搜索了一下相关资料,原来是空间禁用了PHP fsockopen函数,为了服务器安全考虑很多主机商禁用了php的fsockopen函数。
2 |4 U' s- D8 D* N0 T- i; k% m+ X, n5 m" Z6 K( t, T
一般是如何禁用fsockopen()函数的呢?下面是两种常用的禁用fsockopen的方法。
. @7 z+ h. J, @. ?) ~1、修改php.ini,将 disable_functions = 后加入 fsockopen6 ^& O; p, \3 C
2、修改php.ini,将 allow_url_fopen = On 改为 allow_url_fopen = Off
; I* M- _& [5 m3 R
8 L7 m6 A3 Y/ Z3 R# L$ _1 _% e出现提示:7 x. s& [# u: Y
  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
复制代码
( y: @9 Z; Y. |; U; R9 o

) F3 S  b3 y2 S( i2 n( |3 F3 H0 W) t下面四种方法可以解决问题:
0 A1 O4 [3 F+ o+ C' c4 U  Y
( N* t" o, T8 ?3 n3 o) z一、可以在出现提示的/home/qcweb/public_html/wp-includes/class-snoopy.php on line 1148文件,在fsockopen函数前加@就可以了。2 A1 p0 i1 k$ M

2 D0 \1 K* z, z$ c7 {9 \二、如果服务器没有同时禁用pfsockopen,那么直接将fsockopen函数替换为pfsockopen。: n8 k& c/ X/ i4 t/ ]4 F, T! B
具体操作:搜索程序中的字符串
  1. fsockopen(
复制代码
替换为
  1. pfsockopen(
复制代码
2 s. o7 W  J2 l) t/ ^1 A
5 z# K+ h2 u' X3 u7 c5 j% h4 _
修改前:
7 c6 E/ z1 @7 V' I( I
  1. $fp = fsockopen($host, 80, $errno, $errstr, 30);
复制代码
5 H5 P# _( P% f* M% `

6 `! H& J8 x, ?7 [, ~修改后:
6 r7 L* ^; J4 R3 N: x/ O
  1. $fp = pfsockopen($host, 80, $errno, $errstr, 30);
复制代码

3 D0 e1 o# ~5 ]$ ?5 \, a4 `( Z  _9 y1 f
三、如果服务器同时禁用了pfsockopen,那么用其他函数代替,如stream_socket_client()。注意:stream_socket_client()和fsockopen()的参数不同。
/ Z: |3 J/ h% e: K( S7 X具体操作:搜索程序中的字符串 fsockopen( 替换为 stream_socket_client( ,然后,将原fsockopen函数中的端口参数“80”删掉,并加到$host。1 F& D# l2 k+ t) B5 @6 @

# l& G0 p9 P6 n9 }$ H( ~( a示例如下; {; `. p$ V/ }

/ a2 G5 s0 Z0 j" y1 W修改前:5 _, d# _8 g! H+ C( z; `& e
  1. $fp = fsockopen($host, 80, $errno, $errstr, 30);
复制代码
+ b/ ?# ]+ q/ {9 ]. P( b: [. H
2 [$ K0 G* p( z# r# q1 Q- d
修改后" o( w$ i4 B, S1 B/ z' q" L7 A7 J
  1. $fp = stream_socket_client($host."80", $errno, $errstr, 30);
复制代码

% W( }' A& R. g5 l) O& f- R6 n9 h( a' f  u! n- J0 T
四、如果PHP版本低于5.0,fsockopen被禁用,又没有stream_socket_client()怎么办呢?自己写一个函数实现fsockopen的功能,参考代码:
% t3 @$ M) R7 O
+ j2 u" k4 S  Z. G
  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. }
复制代码
" \2 ~: k7 C% f) p1 O

" \( x( v! i: l& Q具体操作:
/ P4 j* n/ a# g! d9 a/ w9 k3 T1.首先找到使用fsockopen函数的代码段,将上面代码加至其上端,搜索该代码段中的字符串
  1. fsockopen(
复制代码
替换为
  1. b_fsockopen(
复制代码
, k( ^! h$ b& Y$ ?. C* 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
互联网安全