浅谈php中curl、fsockopen的应用


Posted in PHP onDecember 10, 2016

最近要用到通过post上传文件,网上盛传的有curl的post提交和fsockopen,其中curl最简单,于是从最简单的说起。

这是简单的将一个变量post到另外一个页面

$url = '';
$data = array('a'=> 'b');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$ret = curl_exec($ch);
curl_close($ch);

主要说下这个选项CURLOPT_RETURNTRANSFER:如果设置为true/1,则curl_exec的时候不会自动将请求网页的内容输出到屏幕,$ret为请求网页的内容,如果设置为false/0,则curl_exec的时候会自动将请求网页的内容输出到屏幕,此时如果请求成功的话$ret的内容是1或者true。

下面是上传本地文件的代码,如果需要上传远程文件,则先down到本地,然后删掉即可(如有同学有别的办法还请告知):

$url = '';
$file = '1.jpg';
$field['uploadFile'] = '@'.$file;(uploadFile为接收端的name名)
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $field);
$ret = curl_exec($ch);
curl_close($ch);

这是fsockopen的办法:

$uploadInfo = array(
        'host'=>'',
        'port'=>'80',
        'url'=>'/upload.php'
    );
    $fp = fsockopen($uploadInfo['host'],$uploadInfo['port'],$errno,$errstr);

$file = '1.jpg';

        $content = file_get_contents($file);
        $boundary = md5(time());
        $out.="--".$boundary."\r\n";
        $out.="Content-Disposition: form-data; name=\"uploadFile\"; filename=\"".$file."\"\r\n";
        $out.="Content-Type: image/jpg\r\n\r\n";
        $out.=$content."\r\n";
        $out.="--".$boundary."\r\n"; 

 

        fwrite($fp,"POST ".$uploadInfo['url']." HTTP/1.1\r\n");
        fwrite($fp,"Host:".$uploadInfo['host']."\r\n");
        fwrite($fp,"Content-Type: multipart/form-data; boundary=".$boundary."\r\n");
        fwrite($fp,"Content-length:".strlen($out)."\r\n\r\n");
        fwrite($fp,$out);
        while (!feof($fp)){
            $ret .= fgets($fp, 1024);
        }
        fclose($fp);
        $ret = trim(strstr($ret, "\r\n\r\n"));
        preg_match('/http:.*/', $ret, $match);
        return $match[0];

一、如何禁用fsockopen()

下面是两种常用的禁用fsockopen的方法。

1、修改php.ini,将 disable_functions = 后加入 fsockopen

2、修改php.ini,将 allow_url_fopen = On 改为 allow_url_fopen = Off

二、如何解决fsockopen函数被禁用

1、如果服务器没有同时禁用pfsockopen,那么直接将fsockopen函数替换为pfsockopen。

具体操作:搜索程序中的字符串 fsockopen( 替换为 pfsockopen(。示例如下

修改前:

$fp = fsockopen($host, 80, $errno, $errstr, 30);

修改后:

$fp = pfsockopen($host, 80, $errno, $errstr, 30);

2、如果服务器同时禁用了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(。

以上这篇浅谈php中curl、fsockopen的应用就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php下实现在指定目录搜索指定类型文件的函数
Oct 03 PHP
PHP采集相关教程之一 CURL函数库
Feb 15 PHP
深入探讨PHP中的内存管理问题
Aug 31 PHP
使用PHP curl模拟浏览器抓取网站信息
Oct 28 PHP
PHP使用memcache缓存技术提高响应速度的方法
Dec 26 PHP
php计算指定目录下文件占用空间的方法
Mar 13 PHP
Yii数据读取与跳转参数传递用法实例分析
Jul 12 PHP
php操纵mysqli数据库的实现方法
Sep 18 PHP
PHP多个图片压缩成ZIP的方法
Aug 18 PHP
PHP中十六进制颜色与RGB颜色值互转的方法
Mar 18 PHP
PHP从零开始打造自己的MVC框架之入口文件实现方法详解
Jun 03 PHP
phpQuery采集网页实现代码实例
Apr 02 PHP
Zend Framework动作控制器用法示例
Dec 09 #PHP
Zend Framework入门教程之Zend_View组件用法示例
Dec 09 #PHP
Zend Framework处理Json数据方法详解
Dec 09 #PHP
Zend Framework使用Zend_Loader组件动态加载文件和类用法详解
Dec 09 #PHP
PHP 根据key 给二维数组分组
Dec 09 #PHP
Zend Framework入门教程之Zend_Registry组件用法详解
Dec 09 #PHP
Zend Framework入门教程之Zend_Config组件用法详解
Dec 09 #PHP
You might like
PHP 木马攻击防御技巧
2009/06/13 PHP
PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
2014/06/12 PHP
php ajax异步读取rss文档数据
2016/03/29 PHP
php指定长度分割字符串str_split函数用法示例
2017/01/30 PHP
解析使用js判断只能输入数字、字母等验证的方法(总结)
2013/05/14 Javascript
JAVASCRIPT函数作用域和提前声明 分享
2013/08/22 Javascript
分享五个有用的jquery小技巧
2015/10/08 Javascript
Vue.js 递归组件实现树形菜单(实例分享)
2016/12/21 Javascript
浅析JS中的 map, filter, some, every, forEach, for in, for of 用法总结
2017/03/29 Javascript
JS常见创建类的方法小结【工厂方式,构造器方式,原型方式,联合方式等】
2017/04/01 Javascript
IntersectionObserver实现图片懒加载的示例
2017/09/29 Javascript
解决修复npm安装全局模块权限的问题
2018/05/17 Javascript
浅谈微信小程序之官方UI框架we-ui使用教程
2018/08/20 Javascript
vue权限问题的完美解决方案
2019/05/08 Javascript
React 全自动数据表格组件——BodeGrid的实现思路
2019/06/12 Javascript
vue实现select下拉显示隐藏功能
2019/09/30 Javascript
python实现基于两张图片生成圆角图标效果的方法
2015/03/26 Python
Python 性能优化技巧总结
2016/11/01 Python
python实现mysql的读写分离及负载均衡
2018/02/04 Python
Django中自定义模型管理器(Manager)及方法
2019/09/23 Python
pyenv虚拟环境管理python多版本和软件库的方法
2019/12/26 Python
TensorFlow实现指数衰减学习率的方法
2020/02/05 Python
Python通过2种方法输出带颜色字体
2020/03/02 Python
简单了解如何封装自己的Python包
2020/07/08 Python
PyTorch实现重写/改写Dataset并载入Dataloader
2020/07/14 Python
学习Python需要哪些工具
2020/09/04 Python
Selenium Webdriver元素定位的八种常用方式(小结)
2021/01/13 Python
详解css3自定义滚动条样式写法
2017/12/25 HTML / CSS
美国百年历史早餐食品供应商:Wolferman’s
2017/01/18 全球购物
Linux上比较文件的命令都有哪些
2012/02/24 面试题
师范生自荐信
2013/10/27 职场文书
教师纪念9.18事件演讲稿范文
2014/09/14 职场文书
镇政府副镇长群众路线专题民主生活会对照检查材料
2014/09/19 职场文书
2014学习十八届四中全会精神思想汇报范文
2014/10/23 职场文书
搞笑Gif:这么白这么长的腿像极了一楼的女朋友
2022/03/21 杂记
Python+OpenCV实现在图像上绘制矩形
2022/03/21 Python