Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
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發送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請求。上述代碼片段中使用了三個重要的選項:
CURL的選項還有很多,可以到PHP的官方網站上查看CURL支持的所有選項列表。
獲取CURL請求的輸出信息
在curl_exec()函數執行之后,可以使用curl_getinfo()函數獲取CURL請求輸出的相關信息,示例代碼如下:
curl_exec($ch);
$info=curl_getinfo($sh);
echo ' 獲取 '.$info['url'].'耗時'.$info['total_time'].'秒';
上述代碼中curl_getinfo返回的是一個關聯數組,包含以下數據:
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 中進行性能測試時,常見的中文亂碼問題通常出現在以下幾個方面:
修改 JMeter 配置文件
JMeter 的默認編碼是 ISO-8859-1,可以通過修改 jmeter.properties 配置文件來設置默認編碼為 UTF-8。
bashsampleresult.default.encoding=UTF-8
設置 HTTP 請求的編碼
在每個 HTTP 請求中,可以通過設置參數來指定請求和響應的編碼。
當發送包含中文字符的請求參數時,需要確保參數的編碼設置正確。
示例代碼
yamlTest Plan
└── Thread Group
└── HTTP Request
├── Server Name or IP: example.com
├── Path: /api/test
├── Parameters:
│ ├── name: 參數值
└── Content-Encoding: UTF-8
如果服務器返回的響應數據中包含中文字符,需要確保 JMeter 能夠正確解碼這些數據。
使用后置處理器
可以使用 BeanShell 后置處理器或 JSR223 后置處理器來處理響應數據的編碼。
示例代碼(使用 JSR223 后置處理器)
bashprev.setDataEncoding("UTF-8")
當使用 CSV 數據文件進行參數化測試時,確保文件的編碼格式為 UTF-8,并在 JMeter 中正確配置。
保存 CSV 文件為 UTF-8 編碼
在編輯 CSV 文件時,使用支持 UTF-8 編碼的文本編輯器(如 Notepad++、Sublime Text)保存文件。
配置 CSV Data Set Config
在進行某些測試時,可能需要模擬特定瀏覽器的行為。通過設置 HTTP Header,可以模擬瀏覽器發送的請求編碼。
示例代碼(使用 HTTP Header Manager)
yamlHeader Name: Content-Type
Header Value: application/x-www-form-urlencoded; charset=UTF-8
以下是一個完整的實踐操作示例,展示了如何在 JMeter 中解決返回內容的中文亂碼問題。
環境搭建
假設我們有一個測試環境,包含以下接口:
配置步驟
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 中解決返回內容中文亂碼問題的各種方法。這些方法不僅能提高測試結果的準確性,還能提升測試報告的可讀性。
使用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 編輯好 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 批處理文件,效果如下:
使用過程避坑:
圖一:控制臺不能顯示中文或是部分中文顯示亂碼,具體表示:
原因和解決辦法:
想要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"}此處解決顯示中文亂碼問題
}
以上親測有效---針對本機和本版本:
*請認真填寫需求信息,我們會在24小時內與您取得聯系。