浅谈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对象类型判断
Aug 27 PHP
怎么在Windows系统中搭建php环境
Aug 31 PHP
php 启动报错如何解决
Jan 17 PHP
PHP获取当前页面URL函数实例
Oct 22 PHP
Thinkphp多文件上传实现方法
Oct 31 PHP
一个经典实用的PHP图像处理类分享
Nov 18 PHP
php单态设计模式(单例模式)实例
Nov 18 PHP
cakephp打印sql语句的方法
Feb 13 PHP
php加密之discuz内容经典加密方式实例详解
Feb 04 PHP
PHP实现Huffman编码/解码的示例代码
Apr 20 PHP
Laravel框架实现利用监听器进行sql语句记录功能
Jun 06 PHP
PHP的PDO大对象(LOBs)
Jan 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
PHP中mysql_field_type()函数用法
2014/11/24 PHP
php对象和数组相互转换的方法
2015/05/12 PHP
php array_map使用自定义的函数处理数组中的每个值
2016/10/26 PHP
laravel框架邮箱认证实现方法详解
2019/11/22 PHP
七种PHP开发环境搭建工具
2020/06/28 PHP
Opacity.js
2007/01/22 Javascript
一次失败的jQuery优化尝试小结
2011/02/06 Javascript
基于Jquery+Ajax+Json的高效分页实现代码
2011/10/29 Javascript
js交换排序 冒泡排序算法(Javascript版)
2014/10/04 Javascript
JavaScript开发Chrome浏览器扩展程序UI的教程
2016/05/16 Javascript
Angular实现图片裁剪工具ngImgCrop实践
2017/08/17 Javascript
vue axios请求超时的正确处理方法
2018/04/02 Javascript
关于Google发布的JavaScript代码规范你要知道哪些
2018/04/04 Javascript
React 组件中的 bind(this)示例代码
2018/09/16 Javascript
微信小程序之事件交互操作实例分析
2018/12/03 Javascript
微信小程序开发之点击按钮退出小程序的实现方法
2019/04/26 Javascript
微信小程序 腾讯地图显示偏差问题解决
2019/07/27 Javascript
JS Thunk 函数的含义和用法实例总结
2020/04/08 Javascript
jQuery实现购物车全功能
2021/01/11 jQuery
python实现文件路径和url相互转换的方法
2015/07/06 Python
利用PyInstaller将python程序.py转为.exe的方法详解
2017/05/03 Python
python遍历序列enumerate函数浅析
2017/10/17 Python
Python设计模式之命令模式简单示例
2018/01/10 Python
python 输出所有大小写字母的方法
2019/01/02 Python
python实现支付宝转账接口
2019/05/07 Python
Pandas-Cookbook 时间戳处理方式
2019/12/07 Python
Python流程控制常用工具详解
2020/02/24 Python
python 实现图片修复(可用于去水印)
2020/11/19 Python
浅谈移动端网页图片预加载方案
2018/11/05 HTML / CSS
植村秀加拿大官网:Shu Uemura加拿大
2019/09/03 全球购物
周鸿祎:教你写创业计划书
2013/12/30 职场文书
社区爱国卫生月活动总结
2014/06/30 职场文书
煤矿安全知识竞赛活动总结
2014/07/07 职场文书
2016党员入党决心书
2015/09/22 职场文书
《青山不老》教学反思
2016/02/22 职场文书
分析SQL窗口函数之聚合窗口函数
2022/04/21 Oracle