fsockopen函数被禁用的解决方法

判断fsockopen 是否可用:function_exists(‘fsockopen‘);如果没有开启

一、开启fsockopen函数

  1. 修改php.ini,将 disable_functions = 后面的fsockopen去掉,如果有的话。
  2. 修改php.ini,将 allow_url_fopen = Off 改为 allow_url_fopen = On

二、虚拟主机替代方法

1、pfsockopen替代

  如果服务器没有同时禁用pfsockopen,那么直接将fsockopen函数替换为pfsockopen。具体操作:搜索程序中的字符串 fsockopen 替换为 pfsockopen; 示例如下:

修改前:
$fp = fsockopen($host, 80, $errno, $errstr, 30);
修改后:
$fp = pfsockopen($host, 80, $errno, $errstr, 30);

2、stream_socket_client替代

  如果服务器同时禁用了pfsockopen,那么用其他函数代替,如stream_socket_client()。注意:stream_socket_client()和fsockopen()的参数不同。具体操作:搜索程序中的字符串 fsockopen 替换为 stream_socket_client,然后,将原fsockopen函数中的端口参数“80”删掉,并加到$host;示例如下:

修改前:
$fp = fsockopen($host, 80, $errno, $errstr, 30);
修改后
$fp = stream_socket_client($host.":80", $errno, $errstr, 30);

3、自定义替代函数

  如果PHP版本低于5.0,fsockopen被禁用,又没有stream_socket_client()怎么办呢?自己写一个函数实现fsockopen的功能,参考代码:

function b_fsockopen($host, $port, &$errno, &$errstr, $timeout)
 {
     $ip = gethostbyname($host);
     $s = socket_create(AF_INET, SOCK_STREAM, 0);
     if (socket_set_nonblock($s))
     {
      $r = @socket_connect($s, $ip, $port);
      if ($r || socket_last_error() == EINPROGRESS)
      {
       $errno = EINPROGRESS;
      return $s;
      }
     }
     $errno = socket_last_error($s);
     $errstr = socket_strerror($errno);
     socket_close($s);
     return false;
}

具体操作:

  1. 首先找到使用fsockopen函数的代码段,将上面代码加至其上端,搜索该代码段中的字符串 fsockopen 替换为 b_fsockopen。
  2. 因为fsockopen函数返回文件指针所以可以被文件函数操作,但是这个b_fsockopen函数没能返回文件指针,需要继续修改代码段:用socket_read替换掉 fread,用socket_write替换掉fwrite,用socket_close替换掉fclose。

原文地址:https://www.cnblogs.com/xuey/p/8461772.html

时间: 2024-08-01 04:18:00

fsockopen函数被禁用的解决方法的相关文章

织梦dedecms 无法下载远程图片 fsockopen函数被禁用的解决方法

在linux服务器上fsockopen()函数被无情的禁用了(这其实是出于安全考虑,可以理解),下载远程图片的功能就没有办法使用了.找了一些资料之后,找到了解决方法,就是用stream_socket_client()函数替换掉fsockopen()函数.具体的方法如下: 打开/include/中的dedehttpdown.class.php文件,找到如下代码: $this->m_fp = @fsockopen($this->m_host, $this->m_port, $errno, $

Windows中openProcess函数返回ERROR_ACCESS_DENIED的解决方法

辛辛苦苦开始了创业,好不容易见到了天使投资人,如何去打动明星投资人?如何能拿到那一笔"救命"钱?看徐小平.雷军这样说. 1. 天使投资人偏爱投什么样的创业者? 雷军:你有强烈的渴望做成一件伟大的事情,并且能让投资者相信你能做得成这件事情.掏自己的钱创业是创业成功率最高的一种,因为在那一瞬间你重视了,你花的每一分钱都是自己的血汗钱和别人的血汗钱,不会轻松把别的投资人的钱打水漂. 曾李青:我们体系内投了好几家公司,发现我们投资成功的公司要么是有做大公司的成功经验,要么是名校毕业.好学校不一

thinkphp内置截取字符串函数无法显示省略号解决方法

thinkphp内置截取字符串函数无法显示省略号解决方法 functions.php function msubstr($str, $start=0, $length, $charset="utf-8", $suffix=true){ if(function_exists("mb_substr")) {      if($suffix)    {         if($str==mb_substr($str, $start, $length, $charset))

红外遥控库IRremote的IRsend类sendRaw函数溢出问题及其解决方法

最近在调试红外遥控格力空调,在论坛中学到了不少东西.参考: (1)<解决问题系列(4)--红外编码分析利器使用> (2)<315Mhz模块传输替代315Mhz遥控器> 调试环境: 软件:Arduino IDE 1.0 硬件:Arduino uno r3 问题分> 我使用的遥控器型号是YAD0F. 在使用逻辑分析仪dump出原始码之后,使用sendRaw函数来发送原始码,发现空调没有反应.原始码如下: 9004,4499,699,1609,697,511,695,511,695

zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法

zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法: zendstudio 时常 无法ctrl+左键 跳转 到函数源 代码 是创建工程的方式造成的,很有可能是把先前存在的工程以file的形式导入, zendstudio 就把工程当作文档来处理了.解决的办法是: 右键点击工程->configure->add php support 然后系统会自动rebuild工程/workspace.至此,问题解决! 如果你想要zendstudio支持javascript的语法高亮和流

jquery的ajax()函数传值中文乱码解决方法介绍

前台 jQuery.post("/MailTemplate/SaveMailTemplate?Code=" + item.Code + "&DisplayName=" +encodeURI   (item.DisplayName) + "&Body=" +encodeURI(item.Body), {}, function (data) {                                if (data == 'S

MySQL函数不能创建的解决方法

MySQL函数不能创建,是一个很麻烦的问题,下面就为您提供了一个解决此问题的方法,如果您也遇到过类似的问题,不妨一看. http://database.51cto.com/art/201010/229918.htm 在使用MySQL数据库时,有时会遇到MySQL函数不能创建的情况.下面就教您一个解决MySQL函数不能创建问题的方法,供您借鉴参考. 出错信息大致类似: ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO S

jQuery $.post()返回类型为json时不进入回调函数的原因及解决方法

这真是个让人特别抓心找挠肝的问题,真的差点被这个问题逼的放弃去使用json作为返回类型,而是去用html,但是有的时候就是要较汁一下.(即便现在问题解决了,我还是想说句"妈蛋",来发泄一下) 其实主要还是自己对json的不够了解,但是很纳闷,网上对路的解决方法几乎没有.所以虽然问题很小,但是还是想要分享出来,希望能帮到需要的人. 首先$.post()格式如下: $.post(url,data,success(data, textStatus, jqXHR),dataType) 参数描述

VMware安装64位操作系统报错“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”解决方法

已将该虚拟机配置为使用 64 位客户机操作系统.但是,无法执行 64 位操作. 此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态. 如果已在 BIOS/固件设置中禁用 Intel VT-x,或主机自更改此设置后从未重新启动,则 Intel VT-x 可能被禁用. (1) 确认 BIOS/固件设置中启用了 Intel VT-x 并禁用了“可信执行”. (2) 如果这两项 BIOS/固件设置有一项已更改,请重新启动主机 (3) 如果您在安装 VMware Workstatio