浅谈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 相关文章推荐
如何使用脚本模仿登陆过程
Nov 22 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
Dec 29 PHP
PHP学习笔记之三 数据库基本操作
Jan 17 PHP
PHP学习之数组值的操作
Apr 17 PHP
如何获知PHP程序占用多少内存(memory_get_usage)
Sep 23 PHP
PHP小技巧之JS和CSS优化工具Minify的使用方法
May 19 PHP
php实现删除空目录的方法
Mar 16 PHP
PHP中JSON的应用技巧
Oct 10 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
Jul 19 PHP
PHP异常处理定义与使用方法分析
Jul 25 PHP
php合并数组并保留键值的实现方法
Mar 12 PHP
PHP cookie,session的使用与用户自动登录功能实现方法分析
Jun 05 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
一个ubbcode的函数,速度很快.
2006/10/09 PHP
并发下常见的加锁及锁的PHP具体实现代码
2010/10/12 PHP
解析PHP实现下载文件的两种方法
2013/07/05 PHP
二进制交叉权限微型php类分享
2014/02/07 PHP
smarty实现多级分类的方法
2014/12/05 PHP
thinkPHP中验证码的简单实现方法
2016/12/05 PHP
使用git迁移Laravel项目至新开发环境的步骤详解
2020/04/06 PHP
javascript实现日期按月份加减
2015/05/15 Javascript
简介JavaScript中的setDate()方法的使用
2015/06/11 Javascript
全面解析bootstrap格子布局
2016/05/22 Javascript
用js动态添加html元素,以及属性的简单实例
2016/07/19 Javascript
jQuery+ajax读取并解析XML文件的方法
2016/09/09 Javascript
微信公众号 摇一摇周边功能开发
2016/12/08 Javascript
js实现将json数组显示前台table中
2017/01/10 Javascript
详解javascript中对数据格式化的思考
2017/01/23 Javascript
浅谈vuepress 踩坑记
2018/04/18 Javascript
Vue中的scoped实现原理及穿透方法
2018/05/15 Javascript
基于vue 实现表单中password输入的显示与隐藏功能
2019/07/19 Javascript
Python中for循环详解
2014/01/17 Python
老生常谈Python startswith()函数与endswith函数
2017/09/08 Python
python+selenium实现163邮箱自动登陆的方法
2017/12/31 Python
Python多进程并发与多线程并发编程实例总结
2018/02/08 Python
python指定写入文件时的编码格式方法
2018/06/07 Python
浅谈解除装饰器作用(python3新增)
2018/10/15 Python
Python中低维数组填充高维数组的实现
2019/12/02 Python
关于python中remove的一些坑小结
2021/01/04 Python
斯福泰克软件测试面试题
2015/02/16 面试题
护士的岗位职责
2013/12/04 职场文书
保研推荐信
2014/05/09 职场文书
2014年会策划方案
2014/05/11 职场文书
六查六看剖析材料
2014/10/06 职场文书
幸福终点站观后感
2015/06/04 职场文书
2016高考冲刺决心书
2015/09/23 职场文书
MySQL复制问题的三个参数分析
2021/04/07 MySQL
教你怎么用PyCharm为同一服务器配置多个python解释器
2021/05/31 Python
mysql 排序失效
2022/05/20 MySQL