浅谈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中利用XML技术构造远程服务(上)
Oct 09 PHP
php下实现在指定目录搜索指定类型文件的函数
Oct 03 PHP
C# Assembly类访问程序集信息
Jun 13 PHP
php入门学习知识点一 PHP与MYSql连接与查询
Jul 14 PHP
深入解析yii权限分级式访问控制的实现(非RBAC法)
Jun 13 PHP
深入PHP5中的魔术方法详解
Jun 17 PHP
PHP判断是否有Get参数的方法
May 05 PHP
php实例分享之html转为rtf格式
Jun 02 PHP
Yii2 rbac权限控制操作步骤实例教程
Apr 29 PHP
PHP实现webshell扫描文件木马的方法
Jul 31 PHP
tp5(thinkPHP5框架)时间查询操作实例分析
May 29 PHP
Laravel实现ORM带条件搜索分页
Oct 24 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统计二维数组元素个数的方法
2013/11/12 PHP
PHP处理大量表单字段的便捷方法
2015/02/07 PHP
探究Laravel使用env函数读取环境变量为null的问题
2016/12/06 PHP
快速保存网页中所有图片的方法
2006/06/23 Javascript
根据鼠标的位置动态的控制层的位置
2009/11/24 Javascript
分析Node.js connect ECONNREFUSED错误
2013/04/09 Javascript
JS实现的不规则TAB选项卡效果代码
2015/09/18 Javascript
深入解析AngularJS框架中$scope的作用与生命周期
2016/03/05 Javascript
不同js异步函数同步的实现方法
2016/05/28 Javascript
vue.js使用watch监听路由变化的方法
2018/07/08 Javascript
Javascript中绑定click事件的四种方式介绍
2018/10/26 Javascript
angular中两种表单的区别(响应式和模板驱动表单)
2018/12/06 Javascript
vue项目中axios请求网络接口封装的示例代码
2018/12/18 Javascript
fastadmin中调用js的方法
2019/05/14 Javascript
Vue-axios-post数据后端接不到问题解决
2020/01/09 Javascript
JS判断数组是否包含某元素实现方法汇总
2020/06/24 Javascript
[15:41]教你分分钟做大人——灰烬之灵
2015/03/11 DOTA
使用C语言来扩展Python程序和Zope服务器的教程
2015/04/14 Python
Python基于scrapy采集数据时使用代理服务器的方法
2015/04/16 Python
实例解析Python的Twisted框架中Deferred对象的用法
2016/05/25 Python
Python实现选择排序
2017/06/04 Python
Python操作mongodb数据库的方法详解
2018/12/08 Python
Python实现的线性回归算法示例【附csv文件下载】
2018/12/29 Python
实例讲解Python中整数的最大值输出
2019/03/17 Python
python使用原始套接字发送二层包(链路层帧)的方法
2019/07/22 Python
python 读取修改pcap包的例子
2019/07/23 Python
关于pytorch中网络loss传播和参数更新的理解
2019/08/20 Python
python多继承(钻石继承)问题和解决方法简单示例
2019/10/21 Python
python爬取王者荣耀全皮肤的简单实现代码
2020/01/31 Python
美国婴儿用品及配件购买网站:Munchkin
2019/04/03 全球购物
馥蕾诗美国官网:Fresh美国
2019/10/09 全球购物
建筑工程技术专业求职信
2014/07/16 职场文书
解除聘用合同证明书范本
2014/09/11 职场文书
给校长的一封检讨书
2014/09/20 职场文书
MySQL 数据类型详情
2021/11/11 MySQL
SQL 聚合、分组和排序
2021/11/11 MySQL