浅谈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 之入门篇
Dec 04 PHP
php cli 方式 在crotab中运行解决
Feb 08 PHP
php 计划任务 检测用户连接状态
Mar 29 PHP
谈谈PHP中substr和substring的正确用法及相关参数的介绍
Dec 16 PHP
php mysqli查询语句返回值类型实例分析
Jun 29 PHP
SAE实时日志接口SDK用法示例
Oct 09 PHP
Thinkphp 中 distinct 的用法解析
Dec 14 PHP
PHP实现表单提交时去除斜杠的方法
Dec 26 PHP
php头像上传预览实例代码
May 02 PHP
PHP+redis实现微博的拉模型案例详解
Jul 10 PHP
浅谈Laravel模板实体转义带来的坑
Oct 22 PHP
php实现微信小程序授权登录功能(实现流程)
Nov 13 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正则走开
2008/03/15 PHP
php跨站攻击实例分析
2014/10/28 PHP
php字符串截取函数用法分析
2014/11/25 PHP
使用jQuery操作Cookies的实现代码
2011/10/09 Javascript
jquery选择checked在ie8普通模式下的问题
2014/02/12 Javascript
浅谈JS日期(Date)处理函数
2014/12/07 Javascript
jQuery的$.extend 浅拷贝与深拷贝
2017/03/08 Javascript
完美实现js拖拽效果 return false用法详解
2017/07/28 Javascript
微信JS-SDK updateAppMessageShareData安卓不能自定义分享详解
2019/03/29 Javascript
微信小程序实现跳转的几种方式总结(推荐)
2019/04/24 Javascript
vue实现codemirror代码编辑器中的SQL代码格式化功能
2019/08/27 Javascript
简单了解Vue computed属性及watch区别
2020/07/10 Javascript
[00:32]2018DOTA2亚洲邀请赛出场——LGD
2018/04/04 DOTA
Python读大数据txt
2016/03/28 Python
python实现数独游戏 java简单实现数独游戏
2018/03/30 Python
Python实现的基于优先等级分配糖果问题算法示例
2018/04/25 Python
python获取文件真实链接的方法,针对于302返回码
2018/05/14 Python
python提取包含关键字的整行数据方法
2018/12/11 Python
python匹配两个短语之间的字符实例
2018/12/25 Python
详解python解压压缩包的五种方法
2019/07/05 Python
Python facenet进行人脸识别测试过程解析
2019/08/16 Python
利用Python自动化操作AutoCAD的实现
2020/04/01 Python
Django-migrate报错问题解决方案
2020/04/21 Python
使用Python解析Chrome浏览器书签的示例
2020/11/13 Python
Kusmi茶美国官网:优质散叶茶和茶包
2019/10/13 全球购物
Oasis服装官网:时尚女装在线
2020/07/09 全球购物
百度吧主申请感言
2014/01/12 职场文书
实验教师岗位职责
2014/02/13 职场文书
一般党员对照检查材料
2014/09/24 职场文书
分居协议书范本(律师见证版)
2014/11/26 职场文书
党员检讨书范文
2014/12/27 职场文书
科技活动总结范文
2015/05/11 职场文书
通知怎么写?
2019/04/17 职场文书
简述Java中throw-throws异常抛出
2021/08/07 Java/Android
MySQL 用 limit 为什么会影响性能
2021/09/15 MySQL
图片批量处理 - 尺寸、格式、水印等
2022/03/07 杂记