浅谈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 什么是PEAR?(第三篇)
Mar 19 PHP
zf框架的Filter过滤器使用示例
Mar 13 PHP
php实现的返回数据格式化类实例
Sep 22 PHP
Codeigniter实现发送带附件的邮件
Mar 19 PHP
php实现在服务器端调整图片大小的方法
Jun 16 PHP
php无限分类使用concat如何实现
Nov 05 PHP
PHP基于单例模式实现的mysql类
Jan 09 PHP
php中array_column函数简单实现方法
Jul 11 PHP
一个实用的php验证码类
Jul 06 PHP
php 数据结构之链表队列
Oct 17 PHP
php微信公众号开发之现金红包
Apr 16 PHP
php+mysql实现的无限分类方法类定义与使用示例
May 27 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
Blitz templates 最快的PHP模板引擎
2010/04/06 PHP
国产PHP开发框架myqee新手快速入门教程
2014/07/14 PHP
PHP实现远程下载文件到本地
2015/05/17 PHP
解决form中action属性后面?传递参数 获取不到的问题
2017/07/21 PHP
php创建类并调用的实例方法
2019/09/25 PHP
jscript之Read an Excel Spreadsheet
2007/06/13 Javascript
解析arp病毒背后利用的Javascript技术附解密方法
2007/08/06 Javascript
IE不出现Flash激活框的小发现的js实现方法
2007/09/07 Javascript
javascript返回顶部效果(自写代码)
2013/01/06 Javascript
Extjs Label的 fieldLabel和html属性值对齐的方法
2014/06/15 Javascript
javascript瀑布流式图片懒加载实例解析与优化
2016/02/23 Javascript
AngularJS 单元测试(二)详解
2016/09/21 Javascript
Angularjs+bootstrap+table多选(全选)支持单击行选中实现编辑、删除功能
2017/03/27 Javascript
jquery ztree实现右键收藏功能
2017/11/20 jQuery
es6数据变更同步到视图层的方法
2019/03/04 Javascript
JS实现移动端点击按钮复制文本内容
2019/07/28 Javascript
教你用python3根据关键词爬取百度百科的内容
2016/08/18 Python
Python HTTP客户端自定义Cookie实现实例
2017/04/28 Python
Python tkinter模块中类继承的三种方式分析
2017/08/08 Python
[原创]python爬虫(入门教程、视频教程)
2018/01/08 Python
python爬取拉勾网职位数据的方法
2018/01/24 Python
python3.6.3+opencv3.3.0实现动态人脸捕获
2018/05/25 Python
Python3爬虫使用Fidder实现APP爬取示例
2018/11/27 Python
解决Django中调用keras的模型出现的问题
2019/08/07 Python
python matplotlib imshow热图坐标替换/映射实例
2020/03/14 Python
苏宁红孩子母婴商城:redbaby
2017/02/12 全球购物
新闻传播专业求职信
2014/07/22 职场文书
交通事故和解协议书
2014/09/25 职场文书
村党支部书记四风问题个人对照检查材料思想汇报
2014/10/06 职场文书
工作检讨书怎么写
2014/10/10 职场文书
2014年幼儿园学期工作总结
2014/12/05 职场文书
师德师风学习材料
2014/12/19 职场文书
写给医院的感谢信
2015/01/22 职场文书
matplotlib之pyplot模块实现添加子图subplot的使用
2021/04/25 Python
python 如何将两个实数矩阵合并为一个复数矩阵
2021/05/19 Python
VUE之图片Base64编码使用ElementUI组件上传
2022/04/09 Vue.js