浅谈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编程最快明白(第一讲 软件环境和准备工作)
Oct 25 PHP
PHP 查找字符串常用函数介绍
Jun 07 PHP
说说PHP的autoLoad自动加载机制
Sep 27 PHP
新手菜鸟必读:session与cookie的区别
Aug 22 PHP
Yii使用find findAll查找出指定字段的实现方法
Sep 05 PHP
PHP结合jQuery实现找回密码
Jul 22 PHP
php使用crypt()函数进行加密
Jun 08 PHP
ThinkPHP实现登录退出功能
Jun 29 PHP
PHP策略模式定义与用法示例
Jul 27 PHP
php生成毫秒时间戳的实例讲解
Sep 22 PHP
php利用云片网实现短信验证码功能的示例代码
Nov 18 PHP
Laravel中Kafka的使用详解
Mar 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
IStream与TStream之间的相互转换
2008/08/01 PHP
PHP 远程文件管理,可以给表格排序,遍历目录,时间排序
2009/08/07 PHP
原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】
2019/03/07 PHP
Laravel 读取 config 下的数据方法
2019/10/13 PHP
使用EXT实现无刷新动态调用股票信息
2008/11/01 Javascript
javascript 当前日期加(天、周、月、年)
2009/08/09 Javascript
checkbox使用示例
2013/08/23 Javascript
JS+flash实现chrome和ie浏览器下同时可以复制粘贴
2013/09/22 Javascript
jQuery实现动画效果的简单实例
2014/01/27 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记8)
2015/12/24 Javascript
JS正则表达式学习之贪婪和非贪婪模式实例总结
2016/12/26 Javascript
Vue2.0实现将页面中表格数据导出excel的实例
2017/08/09 Javascript
nodejs项目windows下开机自启动的方法
2017/11/22 NodeJs
JS Math对象与Math方法实例小结
2019/07/05 Javascript
超轻量级的js时间库miment使用解析
2019/08/02 Javascript
vue中使用vue-print.js实现多页打印
2020/03/05 Javascript
[52:05]EG vs OG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
[01:00:10]完美世界DOTA2联赛PWL S2 FTD vs Inki 第二场 11.21
2020/11/24 DOTA
Python isinstance判断对象类型
2008/09/06 Python
Python获取指定字符前面的所有字符方法
2018/05/02 Python
Python for循环中的陷阱详解
2018/07/13 Python
python实现多层感知器MLP(基于双月数据集)
2019/01/18 Python
django-rest-swagger的优化使用方法
2019/08/29 Python
Python 转移文件至云对象存储的方法
2021/02/07 Python
html5教程实现Photoshop渐变色效果
2013/12/04 HTML / CSS
整理HTML5的一些新特性与Canvas的常用属性
2016/01/29 HTML / CSS
详解三种方式实现平滑滚动页面到顶部的功能
2019/04/23 HTML / CSS
创先争优承诺书范文
2014/03/31 职场文书
劳模事迹材料范文
2014/12/24 职场文书
仓管员岗位职责
2015/02/03 职场文书
公司晚宴祝酒词
2015/08/11 职场文书
幼儿园中班教学反思
2016/03/03 职场文书
PHP新手指南
2021/04/01 PHP
使用python如何删除同一文件夹下相似的图片
2021/05/07 Python
mysql自增长id用完了该怎么办
2022/02/12 MySQL
nginx刷新页面出现404解决方案(亲测有效)
2022/03/18 Servers