$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:/ s6 u- o; x# q* e  B% t

4 {& f+ r; W& W% b/ {8 Z, U& @- C# R6 X4 a8 k& t
最近有点郁闷呀,我的网站头部经常会出现错误提示,百度搜索了一下相关资料,原来是空间禁用了PHP fsockopen函数,为了服务器安全考虑很多主机商禁用了php的fsockopen函数。
: k! Z& m/ u, x$ [9 u( \+ w, r8 A; O  W$ ^3 D" t$ b* e9 l
一般是如何禁用fsockopen()函数的呢?下面是两种常用的禁用fsockopen的方法。
& i$ b+ n" f( x/ I0 v1、修改php.ini,将 disable_functions = 后加入 fsockopen2 {5 T( c2 [) }8 t% r7 ^. B+ D
2、修改php.ini,将 allow_url_fopen = On 改为 allow_url_fopen = Off
5 a7 k7 g) X6 |/ H, ]% B/ v8 k0 d
' k' T7 k6 ^1 a7 z7 i出现提示:
. i2 W: F3 H1 z6 l7 k
  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
复制代码

2 A' g9 z% u3 S4 {8 ]3 ^+ S* \0 p$ v8 h: b& E* |
下面四种方法可以解决问题:
! I- X. i1 }" B5 n& y1 J: Y7 e' q! \9 c' Y; I
一、可以在出现提示的/home/qcweb/public_html/wp-includes/class-snoopy.php on line 1148文件,在fsockopen函数前加@就可以了。
. Z+ S# y) I. m  K4 E; z/ s, ^
$ W1 n6 z: b( U二、如果服务器没有同时禁用pfsockopen,那么直接将fsockopen函数替换为pfsockopen。
6 r1 i4 A: s+ A1 H% w4 c具体操作:搜索程序中的字符串
  1. fsockopen(
复制代码
替换为
  1. pfsockopen(
复制代码
1 X1 x6 R1 [9 T8 c% q; {

) D! G" e; M6 L% l修改前:
4 f5 r# w4 r1 G
  1. $fp = fsockopen($host, 80, $errno, $errstr, 30);
复制代码
$ Q( N& [) C+ b' z7 y) Y
& K' ^! x+ O0 s6 z  w4 d9 U
修改后:5 Q5 U: a/ c1 E  m
  1. $fp = pfsockopen($host, 80, $errno, $errstr, 30);
复制代码
3 M' `2 W" |) D/ F: |) h; l
+ Q! W7 j2 T3 f
三、如果服务器同时禁用了pfsockopen,那么用其他函数代替,如stream_socket_client()。注意:stream_socket_client()和fsockopen()的参数不同。$ z# z' h: ^% M- ^+ N& F9 G
具体操作:搜索程序中的字符串 fsockopen( 替换为 stream_socket_client( ,然后,将原fsockopen函数中的端口参数“80”删掉,并加到$host。/ \5 u1 T! p4 N4 w% x: @: R
* a. g  A4 X1 |. A% B- G
示例如下: ~. {% ]4 |/ b7 X" P1 r

9 {6 ]0 o, @8 a! J9 ~修改前:& Y! u4 y4 \# P8 Q# p
  1. $fp = fsockopen($host, 80, $errno, $errstr, 30);
复制代码

3 V5 c, Q, Q4 l
3 [2 n9 y' w4 V( E8 u修改后9 g) ^  F! E3 J
  1. $fp = stream_socket_client($host."80", $errno, $errstr, 30);
复制代码
* u* u' I# ]% {5 g1 U- n
0 y0 b' K- i. b3 P. }
四、如果PHP版本低于5.0,fsockopen被禁用,又没有stream_socket_client()怎么办呢?自己写一个函数实现fsockopen的功能,参考代码:
: ~7 H( J; ^, m* w! |( m* ?
8 Q1 F: Q0 [1 i. v, ?4 n8 y
  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. }
复制代码

' g3 t% k! |- j) k" f7 P+ }; Z
1 {! m! {* ?. S# |  z具体操作:
2 x! D/ U6 _- f, A, H1.首先找到使用fsockopen函数的代码段,将上面代码加至其上端,搜索该代码段中的字符串
  1. fsockopen(
复制代码
替换为
  1. b_fsockopen(
复制代码

% g* _3 e5 _) O$ Q5 C3 e5 i1 q2.因为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
互联网安全