$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:
5 M: v, X- c7 |; d; |. y  ~8 h4 u, b+ \3 b4 J: y! K
+ i( n% V7 x- H
最近有点郁闷呀,我的网站头部经常会出现错误提示,百度搜索了一下相关资料,原来是空间禁用了PHP fsockopen函数,为了服务器安全考虑很多主机商禁用了php的fsockopen函数。
6 p1 i. p- S4 J5 v5 e$ R' F
2 d& l  o( ?" e一般是如何禁用fsockopen()函数的呢?下面是两种常用的禁用fsockopen的方法。
8 x& v/ O5 x. P) A) i" h5 e+ g1、修改php.ini,将 disable_functions = 后加入 fsockopen
" J- ?0 Q! ^! M" x( x2、修改php.ini,将 allow_url_fopen = On 改为 allow_url_fopen = Off) H: V4 `2 [+ l9 I! r
) A& B0 E+ I7 P, X: y
出现提示:& z$ F/ Z* {$ H- t0 J1 U
  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 U( P2 t% Y! P, Q4 J& S+ q2 z9 C4 U; r4 ?0 ^7 x$ x1 `
下面四种方法可以解决问题:
0 H6 K( n# u: s9 G- e( K8 Q8 [6 k& p+ [' G
一、可以在出现提示的/home/qcweb/public_html/wp-includes/class-snoopy.php on line 1148文件,在fsockopen函数前加@就可以了。
3 `5 o/ V* o) M. z3 q
. X4 ]$ v2 R! V二、如果服务器没有同时禁用pfsockopen,那么直接将fsockopen函数替换为pfsockopen。
6 y& ]* b) O0 G, E# }具体操作:搜索程序中的字符串
  1. fsockopen(
复制代码
替换为
  1. pfsockopen(
复制代码
3 C' L9 P& h# u5 S/ `

  X! m9 q; X3 P5 l修改前:$ C- O$ U" z2 }+ n" B+ u
  1. $fp = fsockopen($host, 80, $errno, $errstr, 30);
复制代码

, C( s; i7 L- Y1 s! Q2 Y
9 ^  _5 B1 {. Y- x修改后:
6 r8 P! c. g% W$ z4 `9 r
  1. $fp = pfsockopen($host, 80, $errno, $errstr, 30);
复制代码

, z' @! n) l5 Z: z4 c) ~
& U6 u7 b' x: {8 l0 c  D% b7 s) k三、如果服务器同时禁用了pfsockopen,那么用其他函数代替,如stream_socket_client()。注意:stream_socket_client()和fsockopen()的参数不同。) V6 Z3 Q# r+ d6 z, r0 s. k
具体操作:搜索程序中的字符串 fsockopen( 替换为 stream_socket_client( ,然后,将原fsockopen函数中的端口参数“80”删掉,并加到$host。' C. v) A5 R" g" H0 R) t
. b# {9 t* ]  q* y8 y& Y6 G2 S
示例如下; z. J5 P* @5 w$ j2 S

  z$ S1 q3 w; u1 C+ K修改前:5 C3 O. `/ S3 _+ O
  1. $fp = fsockopen($host, 80, $errno, $errstr, 30);
复制代码

6 s: O1 ~6 k( B# U/ p; `. W  H! K5 t8 C. i3 t1 T
修改后
$ [. ~, j: b8 B$ p- \
  1. $fp = stream_socket_client($host."80", $errno, $errstr, 30);
复制代码

$ \* D; n5 j" K9 T  N- D) w# b3 t, A7 e- m5 D+ c
四、如果PHP版本低于5.0,fsockopen被禁用,又没有stream_socket_client()怎么办呢?自己写一个函数实现fsockopen的功能,参考代码:
5 Q: o% |  k$ v8 ?2 y/ D( I' ~3 L: M. f
  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. }
复制代码

; Q6 @8 P, t- H& G) D
* T9 e9 @8 q8 p! j  @* ]: V0 m具体操作:
1 Q" a" g# b! S. @: Q  i1.首先找到使用fsockopen函数的代码段,将上面代码加至其上端,搜索该代码段中的字符串
  1. fsockopen(
复制代码
替换为
  1. b_fsockopen(
复制代码
; }# P9 N8 }+ H2 C. [
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
互联网安全