整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

PHP使用CURL详解

PHP使用CURL详解

url是PHP的一个扩展,利用该扩展可以实现服务器之间的数据或文件传输。也就是说curl就是一个工具,用来做服务器之间数据、文件传输的工具。

用来采集网络中的html网页文件、其他服务器提供接口数据等


开启curl扩展

(1) 在php.ini里面开启curl这个扩展

(2) 将PHP的安装路径保存到环境变量的系统变量中(环境变量之间的分隔符是英文的分号)

(3) 重启apache服务器

(4) 重启计算机

curl的一些常用配置项

(1) 通过CURLOPT_RETURNTRANSFER配置项设置,是直接显示结果(echo)还是将结果返回(return)


(2) 针对https协议的请求,需要验证客户端的安全证书,通常都会跳过安全证书的验证

(3) CURLOPT_HEADER是否返回header头信息


封装的一个curl方法1:



<?php
/*
 * 使用curl扩展发出http的get或post请求
 */
class HttpRequest
{
    //url,请求的服务器地址
    private $url='';
    
    //is_return,是否返回结果而不是直接显示
    private $is_return=1;
    
    public function __set($p,$v)
{
        if(property_exists($this, $p)){
            $this->$p=$v;
        }
    }
    // 发出http请求的方法
    //参数:提交的数据,默认是空的
    public function send($data=array())
{
        //1. 如果传递数据了,说明向服务器提交数据(post),如果没有传递数据,认为从服务器读取资源(get)
        $ch=curl_init();
        
        //2. 不管是get、post,跳过证书的验证
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        
        //3. 设置请求的服务器地址
        curl_setopt($ch, CURLOPT_URL, $this->url);
        
        //4. 判断是get还是post
        if(!empty($data)){
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        }
        //5. 是否返回数据
        if($this->is_return===1){
            //说明返回
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            $result=curl_exec($ch);
            curl_close($ch);
            return $result;
        }else{
            //直接输出
            curl_exec($ch);
            curl_close($ch);
        }
    }
}


封装的一个curl方法2:



//curl采集器
public function http_curl($url,$type='get',$res='json',$arr=''){
 //1.初始化curl
$ch=curl_init();
 //2.设置curl的参数
 curl_setopt($ch,CURLOPT_URL,$url);
 curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  if($type=='post'){
    curl_setopt($ch,CURLOPT_POST,1);
     curl_setopt($ch,CURLOPT_POSTFIELDS,$arr);
   }
 //3.采集
 $output=curl_exec($ch);
 //4.关闭
 curl_close($ch);
 //如果返回的值,是json格式,则转换成数组
 if($res=='json'){
   if(curl_errno($ch)){
     //请求失败,返回错误信息
     return curl_error($ch);
   }else{
     //请求成功
   return json_decode($output,true);
 }
 }
 }//http_curl end


curl模拟文件上传

说明:PHP5.6之前的版本上传文件使用:@

Php5.6之后的版本使用new CURLFile()

这样其他服务器接收到数据之后,就可以移动了



curl模拟cookie登录

(1) 我们访问服务器时,服务器会先在服务器端创建一个session文件,保存用户的信息,便于在多个页面共享数据,然后服务器会以setcookie的形式告诉客户端在自己身上创建cookie,保存session文件的名,以前使用浏览器访问服务器的时候,浏览器会在自己身上创建cookie文件,现在使用我们的服务器访问:cookie保存到哪里?

CURLOPT_COOKIEJAR配置项设置,cookie保存到哪里


(2) 以后再访问服务器的时候,随身携带cookie(里面就是存储的session文件的名字),那么怎么找到这个cookie呢?

CURLOPT_COOKIEFILE 配置项设置,每次请求时携带哪个cookie文件


PHP使用CURL详解

CURL是一个非常强大的开源库,支持很多协议,包括HTTP、FTP、TELNET等,我们使用它来发送HTTP请求。它给我 们带来的好处是可以通过灵活的选项设置不同的HTTP协议参数,并且支持HTTPS。CURL可以根据URL前缀是“HTTP” 还是“HTTPS”自动选择是否加密发送内容。

使用CURL发送请求的基本流程

使用CURL的PHP扩展完成一个HTTP请求的发送一般有以下几个步骤:

  • 初始化连接句柄;
  • 设置CURL选项;
  • 执行并获取结果;
  • 释放VURL连接句柄。


下面的程序片段是使用CURL发送HTTP的典型过程



// 1. 初始化
 $ch=curl_init();
 // 2. 设置选项,包括URL
 curl_setopt($ch,CURLOPT_URL,"http://www.devdo.net");
 curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
 curl_setopt($ch,CURLOPT_HEADER,0);
 // 3. 执行并获取HTML文档内容
 $output=curl_exec($ch);
 if($output===FALSE ){
 echo "CURL Error:".curl_error($ch);
 }
 // 4. 释放curl句柄
 curl_close($ch);

上述代码中使用到了四个函数


①curl_init() 和 curl_close() 分别是初始化CURL连接和关闭CURL连接,都比较简单。

②curl_exec() 执行CURL请求,如果没有错误发生,该函数的返回是对应URL返回的数据,以字符串表示满意;如果发生错误,该函数返回 FALSE。需要注意的是,判断输出是否为FALSE用的是全等号,这是为了区分返回空串和出错的情况。

③CURL函数库里最重要的函数是curl_setopt(),它可以通过设定CURL函数库定义的选项来定制HTTP请求。上述代码片段中使用了三个重要的选项:

  • CURLOPT_URL 指定请求的URL;
  • CURLOPT_RETURNTRANSFER 设置为1表示稍后执行的curl_exec函数的返回是URL的返回字符串,而不是把返回字符串定向到标准输出并返回TRUE;
  • CURLLOPT_HEADER设置为0表示不返回HTTP头部信息。

CURL的选项还有很多,可以到PHP的官方网站上查看CURL支持的所有选项列表。


获取CURL请求的输出信息

在curl_exec()函数执行之后,可以使用curl_getinfo()函数获取CURL请求输出的相关信息,示例代码如下:


curl_exec($ch);
$info=curl_getinfo($sh);
echo ' 获取 '.$info['url'].'耗时'.$info['total_time'].'秒';

上述代码中curl_getinfo返回的是一个关联数组,包含以下数据:

  • url:网络地址。
  • content_type:内容编码。
  • http_code:HTTP状态码。
  • header_size:header的大小。
  • request_size:请求的大小。
  • filetime:文件创建的时间。
  • ssl_verify_result:SSL验证结果。
  • redirect_count:跳转计数。
  • total_time:总耗时。
  • namelookup_time:DNS查询耗时。
  • connect_time:等待连接耗时。
  • pretransfer_time:传输前准备耗时。
  • size_uplpad:上传数据的大小。
  • size_download:下载数据的大小。
  • speed_download:下载速度。
  • speed_upload:上传速度。
  • download_content_length:下载内容的长度。
  • upload_content_length:上传内容的长度。
  • starttransfer_time:开始传输的时间表。
  • redirect_time:重定向耗时。


curl_getinfo()函数还有一个可选择参数$opt,通过这个参数可以设置一些常量,对应到上述这个字段,如果设置了第二个参数,那么返回的只有指定的信息。例如设置$opt为CURLINFO_TOTAL_TIME,则curl_getinfo()函数只返回total_time,即总传输消耗的时间,在只需要关注某些传输信息时,设置$opt参数很有意义。

使用CURL发送GET请求

如何使用CURL来发送GET请求,发送GET请求的关键是拼装格式正确的URL。请求地址和GET数据由一个“?”分割,然后GET变量的名称和值用“=”分隔,各个GET名称和值由“&”连接。PHP为我们提供了一个函数专门用来拼装GET请求和数据部分——http_build_query,该函数接受一个关联数组,返回由该关联数据描述的GET请求字符串。使用这个函数,结合CURL发送HTTP请求的一般流程,我们封闭了一个发送GET请求的函数——doCurlGetRequest,具体代码如下:



**
 *@desc 封闭curl的调用接口,get的请求方式。
*/
function doCurlGetRequest($url,$data,$timeout=5){
 if($curl=="" || $timeout <=0){
 return false;
 }
 $url=$url.'?'.http_bulid_query($data);
 $con=curl_init((string)$url);
 curl_setopt($con, CURLOPT_HEADER, false);
 curl_setopt($con, CURLOPT_RETURNTRANSFER,true);
 curl_setopt($con, CURLOPT_TIMEOUT, (int)$timeout);
 
 return curl_exec($con);
}

这个函数把使用http_build_query 拼装好的带GET参数的URL传给curl_init函数,然后使用CURL发送HTTP请求。

使用CURL发送POST请求

可以使用CURL提供的选项CURLOPT_POSTFIELDS,设置该选项为POST字符串数据就可以把请求放在正文中。同样我们实现了一个发送POST请求的函数——doCurlPostRequest,代码如下:



/**
** @desc 封装 curl 的调用接口,post的请求方式
**/
function doCurlPostRequest($url,$requestString,$timeout=5){
 if($url=='' || $requestString=='' || $timeout <=0){
 return false;
 }
 $con=curl_init((string)$url);
 curl_setopt($con, CURLOPT_HEADER, false);
 curl_setopt($con, CURLOPT_POSTFIELDS, $requestString);
 curl_setopt($con, CURLOPT_POST,true);
 curl_setopt($con, CURLOPT_RETURNTRANSFER,true);
 curl_setopt($con, CURLOPT_TIMEOUT,(int)$timeout);
 return curl_exec($con);
}

上面代码中除了设置CURLOPT_POSTFIELDS外,我们还设置了CURL_POST为true,标识这个请求是一个POST请求。在POST请求中也是可以传输GET数据的,只需要在URL中拼装GET请求数据即可。

领取方式:点赞关注小编后私信【资料】获取资料领取方式!

在使用 Apache JMeter 进行性能测试时,处理中文字符可能会遇到乱码问题。这不仅影响测试结果的正确性,还会导致测试报告难以理解。本文将详细介绍如何解决 JMeter 返回内容中的中文乱码问题,从配置文件设置到编码转换,帮助测试工程师顺利进行性能测试。

常见的中文乱码问题

在 JMeter 中进行性能测试时,常见的中文乱码问题通常出现在以下几个方面:

  1. 请求参数的中文乱码:发送的请求中包含中文参数时,服务器接收到的参数是乱码。
  2. 响应数据的中文乱码:服务器返回的响应数据中包含中文字符时,JMeter 显示为乱码。
  3. CSV 数据文件的中文乱码:使用 CSV 数据文件进行参数化测试时,文件中的中文内容在 JMeter 中显示为乱码。

解决方法

  1. 设置 JMeter 的编码

修改 JMeter 配置文件

JMeter 的默认编码是 ISO-8859-1,可以通过修改 jmeter.properties 配置文件来设置默认编码为 UTF-8

  • 打开 JMeter 安装目录下的 bin 文件夹。
  • 找到并编辑 jmeter.properties 文件。
  • 找到以下配置项,并将其取消注释(去掉前面的 #)并设置为 UTF-8
bashsampleresult.default.encoding=UTF-8
  • 保存文件并重新启动 JMeter。

设置 HTTP 请求的编码

在每个 HTTP 请求中,可以通过设置参数来指定请求和响应的编码。

  • 选择一个 HTTP 请求采样器。
  • 在 “参数” 部分,添加一个新的参数 Content-Encoding,值设置为 UTF-8
  • 同样,在 “响应数据” 部分,确保 “响应数据的文本编码” 设置为 UTF-8
  1. 配置请求参数的编码

当发送包含中文字符的请求参数时,需要确保参数的编码设置正确。

示例代码

yamlTest Plan
└── Thread Group
    └── HTTP Request
        ├── Server Name or IP: example.com
        ├── Path: /api/test
        ├── Parameters:
        │   ├── name: 参数值
        └── Content-Encoding: UTF-8
  1. 处理响应数据的编码

如果服务器返回的响应数据中包含中文字符,需要确保 JMeter 能够正确解码这些数据。

使用后置处理器

可以使用 BeanShell 后置处理器或 JSR223 后置处理器来处理响应数据的编码。

示例代码(使用 JSR223 后置处理器)

  1. 在 HTTP 请求采样器下添加一个 JSR223 后置处理器。
  2. 选择语言为 groovy
  3. 添加以下代码,将响应数据的编码转换为 UTF-8
bashprev.setDataEncoding("UTF-8")
  1. 处理 CSV 数据文件的编码

当使用 CSV 数据文件进行参数化测试时,确保文件的编码格式为 UTF-8,并在 JMeter 中正确配置。

保存 CSV 文件为 UTF-8 编码

在编辑 CSV 文件时,使用支持 UTF-8 编码的文本编辑器(如 Notepad++、Sublime Text)保存文件。

配置 CSV Data Set Config

  • 添加一个 CSV Data Set Config 元件。
  • 选择 CSV 文件路径。
  • 确保 “文件编码” 字段设置为 UTF-8
  1. 配置浏览器模拟的编码

在进行某些测试时,可能需要模拟特定浏览器的行为。通过设置 HTTP Header,可以模拟浏览器发送的请求编码。

示例代码(使用 HTTP Header Manager)

  • 在 HTTP 请求采样器下添加一个 HTTP Header Manager。
  • 添加以下头信息:
yamlHeader Name: Content-Type
Header Value: application/x-www-form-urlencoded; charset=UTF-8

实践操作示例

以下是一个完整的实践操作示例,展示了如何在 JMeter 中解决返回内容的中文乱码问题。

环境搭建

假设我们有一个测试环境,包含以下接口:

  • URL: http://example.com/api/test
  • 请求方法: POST
  • 请求参数: name,值为中文字符(如 “测试”)
  • 响应: JSON 格式,包含中文字段

配置步骤

  1. 添加线程组:在测试计划中添加一个线程组。
  2. 添加 HTTP 请求采样器:配置请求的 URL、方法和参数,并设置 Content-EncodingUTF-8
  3. 添加 HTTP Header Manager:添加 Content-Type 头信息,值设置为 application/x-www-form-urlencoded; charset=UTF-8
  4. 添加 JSR223 后置处理器:设置响应数据的编码为 UTF-8

JMeter 配置示例

yamlTest Plan
└── Thread Group
    └── HTTP Request
        ├── Server Name or IP: example.com
        ├── Path: /api/test
        ├── Method: POST
        ├── Parameters:
        │   ├── name: 测试
        ├── Content-Encoding: UTF-8
        └── HTTP Header Manager
            ├── Header Name: Content-Type
            └── Header Value: application/x-www-form-urlencoded; charset=UTF-8
        └── JSR223 PostProcessor
            ├── Language: groovy
            └── Script: prev.setDataEncoding("UTF-8")

总结

通过本文的学习,我们已经掌握了在 JMeter 中解决返回内容中文乱码问题的各种方法。这些方法不仅能提高测试结果的准确性,还能提升测试报告的可读性。

题一、批处理调试控制台显示中文乱码

问题二、右键菜单项里的open with sublime text的Icon图标缺失

右键菜单项里的open with sublime text的Icon图标缺失

最近闲的,学习一下批处理命令,想起来sublime text轻量级便捷开启迅速,于是重新安装了最新版本的sublime text4-4169,卸载sublime text3,重新配置text 4。记录一下使用过程的小坑。

下载、安装、配置、使用

适用范围:用于Windows 下Sublime Text4 4169版本的安装和激活

官网下载地址:https://www.sublimetext.com

64位版本地址:

https://download.sublimetext.com/sublime_text_build_4169_x64_setup.exe

32位版本地址:

https://download.sublimetext.com/sublime_text_build_4169_x32_setup.exe

安装:

默认安装,一直 下一步next 下一步 既可以。安装后部分电脑有可能出现右键菜单项里的open with sublime text的Icon图标缺失,可以在注册表位置

计算机\HKEY_CLASSES_ROOT\*\shell\Open with Sublime Text

下面修改并添加 数值名称:Icon,数值数据:C:\Program Files\Sublime Text\sublime_text.exe

修改注册表如图,

最终结果图

正常显示图


激活:

方法一:替换“C:\Program Files\Sublime Text”下文件sublime_text.exe。附下载替换文件下载地址:此处无法链接

方法二:修改文件exe文件的值

使用sublime text 打开安装目录下的sublime_text.exe文件。(自己打开自己,有点一意思吧,修改后另存为。。。)

Ctrl + F 搜到到

80 7805 000f

94c1

更改为

c6 4005 0148

85c9

注意:80 7805 000f和94c1是在两行,搜索可以直接替换

简单配置 1、软件安装中文语言包

1、点击菜单栏Tools—>Install Package Control 跳出弹框点击 确定按钮

2、点击菜单栏 Preferences – Package Control

3、弹框中输入 install package,选中 Package Control: Install Package 然后等待弹窗(可能需要耐心等待一段时间)

4、等出现如下弹窗后, 在弹窗的搜索框中输入 ChineseLocalizations , 点击出现的选项

5、等待一段时间,如果出现了如下画面则汉化步骤全部完成

6、后续若需要更改,可点击菜单栏 帮助-–>Language 选择进行更改。

第一个细节:如果在使用Sublime Text过程中,如果不小心按下Esc键就会进入command mode(Vim模式),之后就出现不能输入任何东西,关闭当前编辑文件重新打开可以解决。但是很影响连贯性,所以可以通过以下方法解决:

Sublime Text使用过程中进入Vim模式,可以关闭vim模式:

进入settings,加入:

// 关闭Vim模式,防止Sublime Text使用过程中进入Vim模式

"ignored_packages":

[

"Vintage"

],

如果不想禁用Vim模式,又无意进入Vim模式可以进行以下操作退出Vim模式:

按a键 或者i键 或者o键三个按键中任何一个就可以回到insert mode,也就是编辑模式

当然还可以:在软件菜单里找到设置,会弹出Json格式的文件,也就是Sublime Text的配置文件。

对,是配置文件,不是图形化界面。也是Sublime任性,设置页坚决不用GUI显示,只用配置文件。

很简单,找到User 配置(Preferences.sublime-settings)这个文件,然后将ignored_packages数组中的Vintage数值删除即可,然后就变为Vim和Sublime模式通用了。如果再屏蔽vim模式,只要再将Vintage加回去该数组即可。

下面是简单应用场景:

Sublime Text 4 运行批处理文件 .bat格式

Sublime Text 4 编辑好 windows 批处理文件后,如果希望直接在 sublime 内部运行,并且看到运行结果,可以使用 sublime 提供的编译系统(Build System)完成。

首先,新建一个编译系统

Tools -> Build System -> New Build System..

这时 Sublime 会帮你新创建一个叫 untitled.sublime-build 的文件,里面原来的内容是这样:

{

"shell_cmd": "make"

}

替换为下面内容:

{

"cmd": ["cmd.exe", "/c", "${file}"]

}

或者简单点也行:

{"cmd": ["$file"]}

保存文件,在弹出的路径选择框中,不需要选择其他路径,直接按默认路径保存,一般来说是下面这样的路径:

C:\Users[用户名]\AppData\Roaming\Sublime Text 4\Packages\User

保存的文件名则按照你希望的菜单里出现的样子,比如名字叫做 DosRunBatch.sublime-build, 保存后,Build System 菜单里就会出现你刚刚创建的 DosRunBatch名字,选择后,就能按键盘快捷键 Ctrl + B 直接运行 windows 批处理文件,效果如下:

使用过程避坑:

图一:控制台不能显示中文或是部分中文显示乱码,具体表示:

  1. 使用ANSI编码保存的bat文件在sublime text编辑界面会乱码,控制台显示中文乱码。
  1. 使用UTF8I编码保存的bat文件在sublime text编辑界面正常,但控制台显示请按任意键继续. . .字样会乱码。而文件中的中文echo回显没有问题,如图:

原因和解决办法:

  1. Bat文件格式原始编码为ANSI。在cmd窗口运行时候可以看到显示是正常的。

想要sublime text显示正常的临时解决办法是:

编译系统文件增加一行代码"encoding":"cp936".

{

"cmd": ["cmd.exe", "/c", "${file}"],

"encoding":"cp936",

}

2、Bat文件格式原始编码为UTF8。在cmd窗口运行时候就是中文乱码,而在sublime text调试确是正常的()仅仅是cmd下(请按任意键继续. . .)几个字符乱码。但是在cmd窗口调试echo回显中文直接乱码,如前面的图片

想要cmd窗口运行调试显示正常的临时解决办法是:

在批处理首行加上:chcp 65001,结果如图:

上面有点绕,总结就是原始文件保存格式为ANSI和UTF8会有区别。

Cmd运行下ANSI编码格式bat文件正常,UTF8编码格式bat文件-乱码

Sublime text调试控制台显示ANSI编码格式bat文件乱码,UTF8编码格式bat文件正常。

解决办法:

一、Cmd运行下

ANSI编码格式bat文件正常无需处理。

UTF8编码格式bat文件-乱码处理:bat文件首行添加chcp 65001。

二、sublime text控制台调试下

ANSI编码格式bat文件控制台乱码处理:

编译系统文件增加一行代码"encoding":"cp936".

{

"cmd": ["cmd.exe", "/c", "${file}"],

"encoding":"cp936",

}

UTF8编码格式bat文件正常无需处理

{

"cmd": ["cmd.exe", "/c", "${file}"],

// "encoding":"cp936", UTF8编码格式bat文件的编译系统切换为无encoding

}

附记sublime text4配置python:

sublime text配置python的编译系统和调试过程中中文显示乱码

Build system构建系统的示例:同前面描述一样构建系统是 JSON 文件 并具有扩展名python3.sublime-build

{

"cmd": ["e:/vevn/env/Scripts/python.exe","-u","$file"],

"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",

"selector": "source.python",

"env":{"PYTHONIOENCODING": "utf8"}

}

示例的解释:

{

"cmd": ["此处为python安装程序的全路径", "-u", "$file"],

"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",

"selector": "source.python",

"env":{"PYTHONIOENCODING": "utf8"}此处解决显示中文乱码问题

}

以上亲测有效---针对本机和本版本: