浅谈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上传文件的增强函数
Jul 21 PHP
php代码收集表单内容并写入文件的代码
Jan 29 PHP
探讨fckeditor在Php中的配置详解
Jun 08 PHP
php的memcache类分享(memcache队列)
Mar 26 PHP
php实现改变图片直接打开为下载的方法
Apr 14 PHP
php递归调用删除数组空值元素的方法
Apr 28 PHP
php从文件夹随机读取文件的方法
Jun 01 PHP
PHP通过反射动态加载第三方类和获得类源码的实例
Nov 27 PHP
PHP基本语法实例总结
Sep 09 PHP
PHP微信分享开发详解
Jan 14 PHP
PHP实现更改hosts文件的方法示例
Aug 08 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
Sep 22 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
压力如何影响浓缩咖啡品质
2021/03/03 咖啡文化
Yii框架防止sql注入,xss攻击与csrf攻击的方法
2016/10/18 PHP
php封装的smartyBC类完整实例
2016/10/19 PHP
基于jQuery的树控件实现代码(asp.net+json)
2010/07/11 Javascript
javascript常用对话框小集
2013/09/13 Javascript
JS+CSS实现仿触屏手机拨号盘界面及功能模拟完整实例
2015/05/16 Javascript
JavaScript setTimeout使用闭包功能实现定时打印数值
2015/12/18 Javascript
基于jQuery的ajax方法封装
2016/07/14 Javascript
Angular 常用指令实例总结整理
2016/12/13 Javascript
jQuery插件HighCharts绘制2D带有Legend的饼图效果示例【附demo源码下载】
2017/03/10 Javascript
angular实现图片懒加载实例代码
2017/06/08 Javascript
vue中$nextTick的用法讲解
2019/01/17 Javascript
JavaScript如何实现元素全排列实例代码
2019/05/14 Javascript
微信小程序开发常见问题及解决方案
2019/07/11 Javascript
js 解析 JSON 数据简单示例
2020/04/21 Javascript
Python实现抓取城市的PM2.5浓度和排名
2015/03/19 Python
Python中生成器和yield语句的用法详解
2015/04/17 Python
Python实现PS滤镜功能之波浪特效示例
2018/01/26 Python
python 常用的基础函数
2018/07/10 Python
python 根据字典的键值进行排序的方法
2019/07/24 Python
Python generator生成器和yield表达式详解
2019/08/08 Python
CSS3结构性伪类选择器九种写法
2012/04/18 HTML / CSS
Lenox官网:精美的瓷器&独特的礼品
2017/02/12 全球购物
如何写出好的Java代码
2014/04/25 面试题
高校毕业生自我鉴定
2013/10/27 职场文书
初中生三年学习生活的自我评价
2013/11/03 职场文书
公积金单位接收函
2014/01/11 职场文书
好家长事迹材料
2014/01/23 职场文书
消防安全员岗位职责
2014/03/10 职场文书
实习生岗位职责
2014/04/12 职场文书
2014年十一国庆节爱国演讲稿
2014/09/23 职场文书
学校拾金不昧表扬信
2015/01/16 职场文书
试用期转正工作总结2015
2015/05/28 职场文书
保险公司增员口号
2015/12/25 职场文书
Python机器学习之基于Pytorch实现猫狗分类
2021/06/08 Python
深入理解mysql事务隔离级别和存储引擎
2022/04/12 MySQL