浅谈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中$_SERVER的详细参数与说明
Jul 29 PHP
php中通过curl模拟登陆discuz论坛的实现代码
Feb 16 PHP
基于PHP读取csv文件内容的详解
Jun 18 PHP
php采集内容中带有图片地址的远程图片并保存的方法
Jan 03 PHP
PHP 设计模式系列之 specification规格模式
Jan 10 PHP
CI框架简单邮件发送类实例
May 18 PHP
利用switch语句进行多选一判断的实例代码
Nov 14 PHP
PHP编程计算文件或数组中单词出现频率的方法
May 22 PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 PHP
python进程与线程小结实例分析
Nov 11 PHP
ThinkPHP框架整合微信支付之刷卡模式图文详解
Apr 10 PHP
PHP开发API接口签名生成及验证操作示例
May 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
typecho插件编写教程(四):插件挂载
2015/05/28 PHP
CI(Codeigniter)的Setting增强配置类实例
2016/01/06 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
PHP7创建销毁session的实例方法
2020/02/03 PHP
javascript Zifa FormValid 0.1表单验证 代码打包下载
2007/06/08 Javascript
JS 对象介绍
2010/01/20 Javascript
functional继承模式 摘自javascript:the good parts
2011/06/20 Javascript
jQuery页面加载初始化常用的三种方法
2014/06/04 Javascript
new Date()问题在ie8下面的处理方法
2014/07/31 Javascript
Javascript 数组排序详解
2014/10/22 Javascript
jQuery源码解读之removeAttr()方法分析
2015/02/20 Javascript
jquery实现的缩略图预览滑块实例
2015/06/25 Javascript
JavaScript获取服务器时间的方法详解
2016/12/11 Javascript
浅谈Nodejs中的作用域问题
2016/12/26 NodeJs
self.attachevent is not a function的解决方法
2017/04/04 Javascript
js禁止Backspace键使浏览器后退的实现方法
2017/09/01 Javascript
angularjs路由传值$routeParams详解
2020/09/05 Javascript
vue 动态修改a标签的样式的方法
2018/01/18 Javascript
javascript实现对话框功能警告(alert 消息对话框)确认(confirm 消息对话框)
2019/05/07 Javascript
基于JavaScript 实现拖放功能
2019/09/12 Javascript
vue element-ui中table合计指定列求和实例
2020/11/02 Javascript
Python发送以整个文件夹的内容为附件的邮件的教程
2015/05/06 Python
Python+OpenCV实现车牌字符分割和识别
2018/03/31 Python
对python实现模板生成脚本的方法详解
2019/01/30 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
2020/02/07 Python
python 子类调用父类的构造函数实例
2020/03/12 Python
简单了解django处理跨域请求最佳解决方案
2020/03/25 Python
举例讲解Python装饰器
2020/12/24 Python
HTML5 在canvas中绘制文本附效果图
2014/06/23 HTML / CSS
使用phonegap获取位置信息的实现方法
2017/03/31 HTML / CSS
数控技术专业毕业自荐书范文
2014/02/05 职场文书
2014年社区党建工作总结
2014/11/11 职场文书
2016年“6.26”禁毒宣传月系列活动总结
2016/04/05 职场文书
何时使用Map来代替普通的JS对象
2021/04/29 Javascript
Ajax异步刷新功能及简单案例
2021/11/20 Javascript
sql server 累计求和实现代码
2022/02/28 SQL Server