url是PHP的一個擴(kuò)展,利用該擴(kuò)展可以實現(xiàn)服務(wù)器之間的數(shù)據(jù)或文件傳輸。也就是說curl就是一個工具,用來做服務(wù)器之間數(shù)據(jù)、文件傳輸?shù)墓ぞ摺?/p>
用來采集網(wǎng)絡(luò)中的html網(wǎng)頁文件、其他服務(wù)器提供接口數(shù)據(jù)等
開啟curl擴(kuò)展
(1) 在php.ini里面開啟curl這個擴(kuò)展
(2) 將PHP的安裝路徑保存到環(huán)境變量的系統(tǒng)變量中(環(huán)境變量之間的分隔符是英文的分號)
(3) 重啟apache服務(wù)器
(4) 重啟計算機(jī)
curl的一些常用配置項
(1) 通過CURLOPT_RETURNTRANSFER配置項設(shè)置,是直接顯示結(jié)果(echo)還是將結(jié)果返回(return)
(2) 針對https協(xié)議的請求,需要驗證客戶端的安全證書,通常都會跳過安全證書的驗證
(3) CURLOPT_HEADER是否返回header頭信息
封裝的一個curl方法1:
<?php
/*
* 使用curl擴(kuò)展發(fā)出http的get或post請求
*/
class HttpRequest
{
//url,請求的服務(wù)器地址
private $url='';
//is_return,是否返回結(jié)果而不是直接顯示
private $is_return=1;
public function __set($p,$v)
{
if(property_exists($this, $p)){
$this->$p=$v;
}
}
// 發(fā)出http請求的方法
//參數(shù):提交的數(shù)據(jù),默認(rèn)是空的
public function send($data=array())
{
//1. 如果傳遞數(shù)據(jù)了,說明向服務(wù)器提交數(shù)據(jù)(post),如果沒有傳遞數(shù)據(jù),認(rèn)為從服務(wù)器讀取資源(get)
$ch=curl_init();
//2. 不管是get、post,跳過證書的驗證
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
//3. 設(shè)置請求的服務(wù)器地址
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. 是否返回數(shù)據(jù)
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.設(shè)置curl的參數(shù)
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.關(guān)閉
curl_close($ch);
//如果返回的值,是json格式,則轉(zhuǎn)換成數(shù)組
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()
這樣其他服務(wù)器接收到數(shù)據(jù)之后,就可以移動了
curl模擬cookie登錄
(1) 我們訪問服務(wù)器時,服務(wù)器會先在服務(wù)器端創(chuàng)建一個session文件,保存用戶的信息,便于在多個頁面共享數(shù)據(jù),然后服務(wù)器會以setcookie的形式告訴客戶端在自己身上創(chuàng)建cookie,保存session文件的名,以前使用瀏覽器訪問服務(wù)器的時候,瀏覽器會在自己身上創(chuàng)建cookie文件,現(xiàn)在使用我們的服務(wù)器訪問:cookie保存到哪里?
CURLOPT_COOKIEJAR配置項設(shè)置,cookie保存到哪里
(2) 以后再訪問服務(wù)器的時候,隨身攜帶cookie(里面就是存儲的session文件的名字),那么怎么找到這個cookie呢?
CURLOPT_COOKIEFILE 配置項設(shè)置,每次請求時攜帶哪個cookie文件
PHP使用CURL詳解
CURL是一個非常強(qiáng)大的開源庫,支持很多協(xié)議,包括HTTP、FTP、TELNET等,我們使用它來發(fā)送HTTP請求。它給我 們帶來的好處是可以通過靈活的選項設(shè)置不同的HTTP協(xié)議參數(shù),并且支持HTTPS。CURL可以根據(jù)URL前綴是“HTTP” 還是“HTTPS”自動選擇是否加密發(fā)送內(nèi)容。
使用CURL發(fā)送請求的基本流程
使用CURL的PHP擴(kuò)展完成一個HTTP請求的發(fā)送一般有以下幾個步驟:
下面的程序片段是使用CURL發(fā)送HTTP的典型過程
// 1. 初始化
$ch=curl_init();
// 2. 設(shè)置選項,包括URL
curl_setopt($ch,CURLOPT_URL,"http://www.devdo.net");
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_HEADER,0);
// 3. 執(zhí)行并獲取HTML文檔內(nèi)容
$output=curl_exec($ch);
if($output===FALSE ){
echo "CURL Error:".curl_error($ch);
}
// 4. 釋放curl句柄
curl_close($ch);
上述代碼中使用到了四個函數(shù)
①curl_init() 和 curl_close() 分別是初始化CURL連接和關(guān)閉CURL連接,都比較簡單。
②curl_exec() 執(zhí)行CURL請求,如果沒有錯誤發(fā)生,該函數(shù)的返回是對應(yīng)URL返回的數(shù)據(jù),以字符串表示滿意;如果發(fā)生錯誤,該函數(shù)返回 FALSE。需要注意的是,判斷輸出是否為FALSE用的是全等號,這是為了區(qū)分返回空串和出錯的情況。
③CURL函數(shù)庫里最重要的函數(shù)是curl_setopt(),它可以通過設(shè)定CURL函數(shù)庫定義的選項來定制HTTP請求。上述代碼片段中使用了三個重要的選項:
CURL的選項還有很多,可以到PHP的官方網(wǎng)站上查看CURL支持的所有選項列表。
獲取CURL請求的輸出信息
在curl_exec()函數(shù)執(zhí)行之后,可以使用curl_getinfo()函數(shù)獲取CURL請求輸出的相關(guān)信息,示例代碼如下:
curl_exec($ch);
$info=curl_getinfo($sh);
echo ' 獲取 '.$info['url'].'耗時'.$info['total_time'].'秒';
上述代碼中curl_getinfo返回的是一個關(guān)聯(lián)數(shù)組,包含以下數(shù)據(jù):
curl_getinfo()函數(shù)還有一個可選擇參數(shù)$opt,通過這個參數(shù)可以設(shè)置一些常量,對應(yīng)到上述這個字段,如果設(shè)置了第二個參數(shù),那么返回的只有指定的信息。例如設(shè)置$opt為CURLINFO_TOTAL_TIME,則curl_getinfo()函數(shù)只返回total_time,即總傳輸消耗的時間,在只需要關(guān)注某些傳輸信息時,設(shè)置$opt參數(shù)很有意義。
使用CURL發(fā)送GET請求
如何使用CURL來發(fā)送GET請求,發(fā)送GET請求的關(guān)鍵是拼裝格式正確的URL。請求地址和GET數(shù)據(jù)由一個“?”分割,然后GET變量的名稱和值用“=”分隔,各個GET名稱和值由“&”連接。PHP為我們提供了一個函數(shù)專門用來拼裝GET請求和數(shù)據(jù)部分——http_build_query,該函數(shù)接受一個關(guān)聯(lián)數(shù)組,返回由該關(guān)聯(lián)數(shù)據(jù)描述的GET請求字符串。使用這個函數(shù),結(jié)合CURL發(fā)送HTTP請求的一般流程,我們封閉了一個發(fā)送GET請求的函數(shù)——doCurlGetRequest,具體代碼如下:
**
*@desc 封閉curl的調(diào)用接口,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);
}
這個函數(shù)把使用http_build_query 拼裝好的帶GET參數(shù)的URL傳給curl_init函數(shù),然后使用CURL發(fā)送HTTP請求。
使用CURL發(fā)送POST請求
可以使用CURL提供的選項CURLOPT_POSTFIELDS,設(shè)置該選項為POST字符串?dāng)?shù)據(jù)就可以把請求放在正文中。同樣我們實現(xiàn)了一個發(fā)送POST請求的函數(shù)——doCurlPostRequest,代碼如下:
/**
** @desc 封裝 curl 的調(diào)用接口,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);
}
上面代碼中除了設(shè)置CURLOPT_POSTFIELDS外,我們還設(shè)置了CURL_POST為true,標(biāo)識這個請求是一個POST請求。在POST請求中也是可以傳輸GET數(shù)據(jù)的,只需要在URL中拼裝GET請求數(shù)據(jù)即可。
在使用 Apache JMeter 進(jìn)行性能測試時,處理中文字符可能會遇到亂碼問題。這不僅影響測試結(jié)果的正確性,還會導(dǎo)致測試報告難以理解。本文將詳細(xì)介紹如何解決 JMeter 返回內(nèi)容中的中文亂碼問題,從配置文件設(shè)置到編碼轉(zhuǎn)換,幫助測試工程師順利進(jìn)行性能測試。
在 JMeter 中進(jìn)行性能測試時,常見的中文亂碼問題通常出現(xiàn)在以下幾個方面:
修改 JMeter 配置文件
JMeter 的默認(rèn)編碼是 ISO-8859-1,可以通過修改 jmeter.properties 配置文件來設(shè)置默認(rèn)編碼為 UTF-8。
bashsampleresult.default.encoding=UTF-8
設(shè)置 HTTP 請求的編碼
在每個 HTTP 請求中,可以通過設(shè)置參數(shù)來指定請求和響應(yīng)的編碼。
當(dāng)發(fā)送包含中文字符的請求參數(shù)時,需要確保參數(shù)的編碼設(shè)置正確。
示例代碼
yamlTest Plan
└── Thread Group
└── HTTP Request
├── Server Name or IP: example.com
├── Path: /api/test
├── Parameters:
│ ├── name: 參數(shù)值
└── Content-Encoding: UTF-8
如果服務(wù)器返回的響應(yīng)數(shù)據(jù)中包含中文字符,需要確保 JMeter 能夠正確解碼這些數(shù)據(jù)。
使用后置處理器
可以使用 BeanShell 后置處理器或 JSR223 后置處理器來處理響應(yīng)數(shù)據(jù)的編碼。
示例代碼(使用 JSR223 后置處理器)
bashprev.setDataEncoding("UTF-8")
當(dāng)使用 CSV 數(shù)據(jù)文件進(jìn)行參數(shù)化測試時,確保文件的編碼格式為 UTF-8,并在 JMeter 中正確配置。
保存 CSV 文件為 UTF-8 編碼
在編輯 CSV 文件時,使用支持 UTF-8 編碼的文本編輯器(如 Notepad++、Sublime Text)保存文件。
配置 CSV Data Set Config
在進(jìn)行某些測試時,可能需要模擬特定瀏覽器的行為。通過設(shè)置 HTTP Header,可以模擬瀏覽器發(fā)送的請求編碼。
示例代碼(使用 HTTP Header Manager)
yamlHeader Name: Content-Type
Header Value: application/x-www-form-urlencoded; charset=UTF-8
以下是一個完整的實踐操作示例,展示了如何在 JMeter 中解決返回內(nèi)容的中文亂碼問題。
環(huán)境搭建
假設(shè)我們有一個測試環(huán)境,包含以下接口:
配置步驟
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")
通過本文的學(xué)習(xí),我們已經(jīng)掌握了在 JMeter 中解決返回內(nèi)容中文亂碼問題的各種方法。這些方法不僅能提高測試結(jié)果的準(zhǔn)確性,還能提升測試報告的可讀性。
使用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、等出現(xiàn)如下彈窗后, 在彈窗的搜索框中輸入 ChineseLocalizations , 點擊出現(xiàn)的選項
5、等待一段時間,如果出現(xiàn)了如下畫面則漢化步驟全部完成
6、后續(xù)若需要更改,可點擊菜單欄 幫助-–>Language 選擇進(jìn)行更改。
第一個細(xì)節(jié):如果在使用Sublime Text過程中,如果不小心按下Esc鍵就會進(jìn)入command mode(Vim模式),之后就出現(xiàn)不能輸入任何東西,關(guān)閉當(dāng)前編輯文件重新打開可以解決。但是很影響連貫性,所以可以通過以下方法解決:
Sublime Text使用過程中進(jìn)入Vim模式,可以關(guān)閉vim模式:
進(jìn)入settings,加入:
// 關(guān)閉Vim模式,防止Sublime Text使用過程中進(jìn)入Vim模式
"ignored_packages":
[
"Vintage"
],
如果不想禁用Vim模式,又無意進(jìn)入Vim模式可以進(jìn)行以下操作退出Vim模式:
按a鍵 或者i鍵 或者o鍵三個按鍵中任何一個就可以回到insert mode,也就是編輯模式
當(dāng)然還可以:在軟件菜單里找到設(shè)置,會彈出Json格式的文件,也就是Sublime Text的配置文件。
對,是配置文件,不是圖形化界面。也是Sublime任性,設(shè)置頁堅決不用GUI顯示,只用配置文件。
很簡單,找到User 配置(Preferences.sublime-settings)這個文件,然后將ignored_packages數(shù)組中的Vintage數(shù)值刪除即可,然后就變?yōu)閂im和Sublime模式通用了。如果再屏蔽vim模式,只要再將Vintage加回去該數(shù)組即可。
下面是簡單應(yīng)用場景:
Sublime Text 4 編輯好 windows 批處理文件后,如果希望直接在 sublime 內(nèi)部運(yùn)行,并且看到運(yùn)行結(jié)果,可以使用 sublime 提供的編譯系統(tǒng)(Build System)完成。
首先,新建一個編譯系統(tǒng)
Tools -> Build System -> New Build System..
這時 Sublime 會幫你新創(chuàng)建一個叫 untitled.sublime-build 的文件,里面原來的內(nèi)容是這樣:
{
"shell_cmd": "make"
}
替換為下面內(nèi)容:
{
"cmd": ["cmd.exe", "/c", "${file}"]
}
或者簡單點也行:
{"cmd": ["$file"]}
保存文件,在彈出的路徑選擇框中,不需要選擇其他路徑,直接按默認(rèn)路徑保存,一般來說是下面這樣的路徑:
C:\Users[用戶名]\AppData\Roaming\Sublime Text 4\Packages\User
保存的文件名則按照你希望的菜單里出現(xiàn)的樣子,比如名字叫做 DosRunBatch.sublime-build, 保存后,Build System 菜單里就會出現(xiàn)你剛剛創(chuàng)建的 DosRunBatch名字,選擇后,就能按鍵盤快捷鍵 Ctrl + B 直接運(yùn)行 windows 批處理文件,效果如下:
使用過程避坑:
圖一:控制臺不能顯示中文或是部分中文顯示亂碼,具體表示:
原因和解決辦法:
想要sublime text顯示正常的臨時解決辦法是:
編譯系統(tǒng)文件增加一行代碼"encoding":"cp936".
{
"cmd": ["cmd.exe", "/c", "${file}"],
"encoding":"cp936",
}
2、Bat文件格式原始編碼為UTF8。在cmd窗口運(yùn)行時候就是中文亂碼,而在sublime text調(diào)試確是正常的()僅僅是cmd下(請按任意鍵繼續(xù). . .)幾個字符亂碼。但是在cmd窗口調(diào)試echo回顯中文直接亂碼,如前面的圖片
想要cmd窗口運(yùn)行調(diào)試顯示正常的臨時解決辦法是:
在批處理首行加上:chcp 65001,結(jié)果如圖:
上面有點繞,總結(jié)就是原始文件保存格式為ANSI和UTF8會有區(qū)別。
Cmd運(yùn)行下ANSI編碼格式bat文件正常,UTF8編碼格式bat文件-亂碼
Sublime text調(diào)試控制臺顯示ANSI編碼格式bat文件亂碼,UTF8編碼格式bat文件正常。
解決辦法:
一、Cmd運(yùn)行下
ANSI編碼格式bat文件正常無需處理。
UTF8編碼格式bat文件-亂碼處理:bat文件首行添加chcp 65001。
二、sublime text控制臺調(diào)試下
ANSI編碼格式bat文件控制臺亂碼處理:
編譯系統(tǒng)文件增加一行代碼"encoding":"cp936".
{
"cmd": ["cmd.exe", "/c", "${file}"],
"encoding":"cp936",
}
UTF8編碼格式bat文件正常無需處理
{
"cmd": ["cmd.exe", "/c", "${file}"],
// "encoding":"cp936", UTF8編碼格式bat文件的編譯系統(tǒng)切換為無encoding
}
附記sublime text4配置python:
sublime text配置python的編譯系統(tǒng)和調(diào)試過程中中文顯示亂碼
Build system構(gòu)建系統(tǒng)的示例:同前面描述一樣構(gòu)建系統(tǒng)是 JSON 文件 并具有擴(kuò)展名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"}此處解決顯示中文亂碼問題
}
以上親測有效---針對本機(jī)和本版本:
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。