curl介紹 https://www.cnblogs.com/niuben/p/11558420.html
curl是一個開源的網絡鏈接庫,支持http, https, ftp, gopher, telnet, dict, file, and ldap 協議。之前均益介紹了python版本的pycurl http://junyiseo.com/python/607.html ,現在介紹怎麼使用php版本的URL.
curl get請求
function curl_get($url){ $header = array( 'Accept: application/json', ); $curl = curl_init(); //設置抓取的url curl_setopt($curl, CURLOPT_URL, $url); //設置頭文件的信息作爲數據流輸出 curl_setopt($curl, CURLOPT_HEADER, 0); // 超時設置,以秒爲單位 curl_setopt($curl, CURLOPT_TIMEOUT, 1); // 超時設置,以毫秒爲單位 // curl_setopt($curl, CURLOPT_TIMEOUT_MS, 500); // 設置請求頭 curl_setopt($curl, CURLOPT_HTTPHEADER, $header); //設置獲取的信息以文件流的形式返回,而不是直接輸出。 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); //執行命令 $data = curl_exec($curl); // 顯示錯誤信息 if (curl_error($curl)) { print "Error: " . curl_error($curl); } else { // 打印返回的內容 var_dump($data); curl_close($curl); } }
curl post請求
// $url 是請求的鏈接 // $postdata 是傳輸的數據,數組格式 function curl_post( $url, $postdata ) { $header = array( 'Accept: application/json', ); //初始化 $curl = curl_init(); //設置抓取的url curl_setopt($curl, CURLOPT_URL, $url); //設置頭文件的信息作爲數據流輸出 curl_setopt($curl, CURLOPT_HEADER, 0); //設置獲取的信息以文件流的形式返回,而不是直接輸出。 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 超時設置 curl_setopt($curl, CURLOPT_TIMEOUT, 10); // 超時設置,以毫秒爲單位 // curl_setopt($curl, CURLOPT_TIMEOUT_MS, 500); // 設置請求頭 curl_setopt($curl, CURLOPT_HTTPHEADER, $header); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE ); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE ); //設置post方式提交 curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata); //執行命令 $data = curl_exec($curl); // 顯示錯誤信息 if (curl_error($curl)) { print "Error: " . curl_error($curl); } else { // 打印返回的內容 var_dump($data); curl_close($curl); } }
常用參數
選項 | 將 value 設置爲 | 備註 |
---|---|---|
CURLOPT_AUTOREFERER | TRUE 時將根據 Location: 重定向時,自動設置 header 中的Referer:信息。 | |
CURLOPT_BINARYTRANSFER | 設爲 TRUE ,將在啓用 CURLOPT_RETURNTRANSFER 時,返回原生的(Raw)輸出。 | 從 PHP 5.1.3 開始,此選項不再有效果:使用CURLOPT_RETURNTRANSFER 後總是會返回原生的(Raw)內容。 |
CURLOPT_COOKIESESSION | 設爲 TRUE 時將開啓新的一次 cookie 會話。它將強制 libcurl 忽略之前會話時存的其他 cookie。 libcurl 在默認狀況下無論是否爲會話,都會儲存、加載所有 cookie。會話 cookie 是指沒有過期時間,只存活在會話之中。 | |
CURLOPT_CERTINFO | TRUE 將在安全傳輸時輸出 SSL 證書信息到 STDERR。 | 在 cURL 7.19.1 中添加。 PHP 5.3.2 後有效。 需要開啓 CURLOPT_VERBOSE 纔有效。 |
CURLOPT_CONNECT_ONLY | TRUE 將讓庫執行所有需要的代理、驗證、連接過程,但不傳輸數據。此選項用於 HTTP、SMTP 和 POP3。 | 在 7.15.2 中添加。 PHP 5.5.0 起有效。 |
CURLOPT_CRLF | 啓用時將Unix的換行符轉換成回車換行符。 | |
CURLOPT_DNS_USE_GLOBAL_CACHE | TRUE 會啓用一個全局的DNS緩存。此選項非線程安全的,默認已開啓。 | |
CURLOPT_FAILONERROR | 當 HTTP 狀態碼大於等於 400,TRUE 將將顯示錯誤詳情。 默認情況下將返回頁面,忽略 HTTP 代碼。 | |
CURLOPT_SSL_FALSESTART | TRUE 開啓 TLS False Start (一種 TLS 握手優化方式) | cURL 7.42.0 中添加。自 PHP 7.0.7 起有效。 |
CURLOPT_FILETIME | TRUE 時,會嘗試獲取遠程文檔中的修改時間信息。 信息可通過curl_getinfo()函數的CURLINFO_FILETIME 選項獲取。 | |
CURLOPT_FOLLOWLOCATION | TRUE 時將會根據服務器返回 HTTP 頭中的 "Location: " 重定向。(注意:這是遞歸的,"Location: " 發送幾次就重定向幾次,除非設置了 CURLOPT_MAXREDIRS,限制最大重定向次數。)。 | |
CURLOPT_FORBID_REUSE | TRUE 在完成交互以後強制明確的斷開連接,不能在連接池中重用。 | |
CURLOPT_FRESH_CONNECT | TRUE 強制獲取一個新的連接,而不是緩存中的連接。 | |
CURLOPT_FTP_USE_EPRT | TRUE 時,當 FTP 下載時,使用 EPRT (和 LPRT)命令。 設置爲 FALSE 時禁用 EPRT 和 LPRT,僅僅使用PORT 命令。 | |
CURLOPT_FTP_USE_EPSV | TRUE 時,在FTP傳輸過程中,回到 PASV 模式前,先嚐試 EPSV 命令。設置爲 FALSE 時禁用 EPSV。 | |
CURLOPT_FTP_CREATE_MISSING_DIRS | TRUE 時,當 ftp 操作不存在的目錄時將創建它。 | |
CURLOPT_FTPAPPEND | TRUE 爲追加寫入文件,而不是覆蓋。 | |
CURLOPT_TCP_NODELAY | TRUE 時禁用 TCP 的 Nagle 算法,就是減少網絡上的小包數量。 | PHP 5.2.1 有效,編譯時需要 libcurl 7.11.2 及以上。 |
CURLOPT_FTPASCII | CURLOPT_TRANSFERTEXT 的別名。 | |
CURLOPT_FTPLISTONLY | TRUE 時只列出 FTP 目錄的名字。 | |
CURLOPT_HEADER | 啓用時會將頭文件的信息作爲數據流輸出。 | |
CURLINFO_HEADER_OUT | TRUE 時追蹤句柄的請求字符串。 | 從 PHP 5.1.3 開始可用。CURLINFO_ 的前綴是有意的(intentional)。 |
CURLOPT_HTTPGET | TRUE 時會設置 HTTP 的 method 爲 GET,由於默認是 GET,所以只有 method 被修改時才需要這個選項。 | |
CURLOPT_HTTPPROXYTUNNEL | TRUE 會通過指定的 HTTP 代理來傳輸。 | |
CURLOPT_MUTE | TRUE 時將完全靜默,無論是何 cURL 函數。 | 在 cURL 7.15.5 中移出(可以使用 CURLOPT_RETURNTRANSFER 作爲代替) |
CURLOPT_NETRC | TRUE 時,在連接建立時,訪問~/.netrc文件獲取用戶名和密碼來連接遠程站點。 | |
CURLOPT_NOBODY | TRUE 時將不輸出 BODY 部分。同時 Mehtod 變成了 HEAD。修改爲 FALSE時不會變成 GET。 | |
CURLOPT_NOPROGRESS |
TRUE 時關閉 cURL 的傳輸進度。
|
|
CURLOPT_NOSIGNAL | TRUE 時忽略所有的 cURL 傳遞給 PHP 進行的信號。在 SAPI 多線程傳輸時此項被默認啓用,所以超時選項仍能使用。 | cURL 7.10時被加入。 |
CURLOPT_PATH_AS_IS | TRUE 不處理 dot dot sequences (即 ../ ) | cURL 7.42.0 時被加入。 PHP 7.0.7 起有效。 |
CURLOPT_PIPEWAIT | TRUE 則等待 pipelining/multiplexing。 | cURL 7.43.0 時被加入。 PHP 7.0.7 起有效。 |
CURLOPT_POST | TRUE 時會發送 POST 請求,類型爲:application/x-www-form-urlencoded,是 HTML 表單提交時最常見的一種。 | |
CURLOPT_PUT | TRUE 時允許 HTTP 發送文件。要被 PUT 的文件必須在 CURLOPT_INFILE和CURLOPT_INFILESIZE 中設置。 | |
CURLOPT_RETURNTRANSFER | TRUE 將curl_exec()獲取的信息以字符串返回,而不是直接輸出。 | |
CURLOPT_SAFE_UPLOAD | TRUE 禁用 @ 前綴在 CURLOPT_POSTFIELDS 中發送文件。 意味着 @ 可以在字段中安全得使用了。 可使用 CURLFile 作爲上傳的代替。 | PHP 5.5.0 中添加,默認值 FALSE。 PHP 5.6.0 改默認值爲 TRUE。. PHP 7 刪除了此選項, 必須使用 CURLFile interface 來上傳文件。 |
CURLOPT_SASL_IR | TRUE 開啓,收到首包(first packet)後發送初始的響應(initial response)。 | cURL 7.31.10 中添加,自 PHP 7.0.7 起有效。 |
CURLOPT_SSL_ENABLE_ALPN | FALSE 禁用 SSL 握手中的 ALPN (如果 SSL 後端的 libcurl 內建支持) 用於協商到 http2。 | cURL 7.36.0 中增加, PHP 7.0.7 起有效。 |
CURLOPT_SSL_ENABLE_NPN | FALSE 禁用 SSL 握手中的 NPN(如果 SSL 後端的 libcurl 內建支持),用於協商到 http2。 | cURL 7.36.0 中增加, PHP 7.0.7 起有效。 |
CURLOPT_SSL_VERIFYPEER | FALSE 禁止 cURL 驗證對等證書(peer's certificate)。要驗證的交換證書可以在 CURLOPT_CAINFO 選項中設置,或在 CURLOPT_CAPATH中設置證書目錄。 | 自cURL 7.10開始默認爲 TRUE。從 cURL 7.10開始默認綁定安裝。 |
CURLOPT_SSL_VERIFYSTATUS | TRUE 驗證證書狀態。 | cURL 7.41.0 中添加, PHP 7.0.7 起有效。 |
CURLOPT_TCP_FASTOPEN | TRUE 開啓 TCP Fast Open。 | cURL 7.49.0 中添加, PHP 7.0.7 起有效。 |
CURLOPT_TFTP_NO_OPTIONS | TRUE 不發送 TFTP 的 options 請求。 | 自 cURL 7.48.0 添加, PHP 7.0.7 起有效。 |
CURLOPT_TRANSFERTEXT | TRUE 對 FTP 傳輸使用 ASCII 模式。對於LDAP,它檢索純文本信息而非 HTML。在 Windows 系統上,系統不會把 STDOUT 設置成二進制 模式。 | |
CURLOPT_UNRESTRICTED_AUTH | TRUE 在使用CURLOPT_FOLLOWLOCATION重定向 header 中的多個 location 時繼續發送用戶名和密碼信息,哪怕主機名已改變。 | |
CURLOPT_UPLOAD | TRUE 準備上傳。 | |
CURLOPT_VERBOSE | TRUE 會輸出所有的信息,寫入到STDERR,或在CURLOPT_STDERR中指定的文件。 |
[PHP]curl上傳多文件
https://www.cnblogs.com/yiyide266/p/7273062.html
碼一下curl上傳多文件的行
5.5之前版本的寫法
$file = array( 'pic[0]'=>"@E:\\wwwroot\\10003\\temp_56.ini;type=text/html;filename=temp_56.ini", 'pic[1]'=>"@E:\\wwwroot\\10003\\temp_29.html;type=text/html;filename=temp_29.html" );
5.5以上版本的寫法
php 5.5 version or above $file = array( 'pic[0]'=>new CURLFile('E:\\wwwroot\\10003\\temp_56.ini', 'text/html', 'temp_56.ini'), 'pic[1]'=>new CURLFile('E:\\wwwroot\\10003\\temp_29.html', 'text/html', 'temp_29.html') );
合併其他的POST參數,POST出去
$data = array_merge($file, $data); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true ); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // curl_getinfo($ch); $return_data = curl_exec($ch); curl_close($ch); echo $return_data;
PHP實現圖片(文件)上傳
https://www.cnblogs.com/xyyl/p/11097050.html
這幾天整理做過的php項目,感覺這個經常會用到,傳上來共享一下咯
首先,前端界面
1、表單的首行需要加上enctype="multipart/form-data",需要上傳的圖片必須設置 type="file"表示選擇文件
<form id="img_form" method="post" class="form-horizontal" role="form" enctype="multipart/form-data">
<label class="col-sm-3 control-label" for="image">圖片:</label>
<div class="col-sm-9 require">
<input type="hidden" name="MAX_FILE_SIZE" value="2000000">//文件最大尺寸
<input type="file" class="form-control" name="image" id="image">
</div>
</div>
</form>
2、爲表單添加事件,我用的是ajax
因爲圖片在是二進制傳輸,所以需要用new FormData(this)獲取表單非文本類的數據(注包括文本類),純文本類數據可用$(this).serialize();
$('#form1').submit(function (e) {
e.preventDefault();
var data=new FormData(this);//獲取非文本類的數據
$.ajax({
url:"php/add.php",//處理頁面的路徑
data:data,//通過json格式將一組數據傳過去
type:"post",//數據的提交和傳遞方式,最好用POST
dataType:"json",//頁面返回值的類型,共有三種:TEXT,JSON,XML可選
cache:false,
contentType:false,
processData:false,
success:function(res){//回調函數:如果ajax調用成功,就執行這個success後面的函數,(data)當做參數返回過來
if (res.flag===1){
alert('上傳成功!');
} else if(res.flag===2){
alert('網絡或其他未知錯誤,請重試!')
}else{
alert('圖片格式錯誤,請重試!')
}
},
error: function () {
alert("error")
}
});
});
3、編寫php文件
connect.php
數據庫連接文件
<?php
$link=new PDO("mysql:host=localhost;port=3306;dbname=db","root","");
$link->query("set names utf8");
add.php
-
extract($_POST):批量獲取前端post方式傳過來的數據,使用參數時參數名爲前端傳過來的初始名。
-
in_array(search,array,type):搜索數組中是否存在指定的值,即元素是否存在與數組,返回true或false。
search,必需,規定要在數組搜索的值。array,必需,規定要搜索的數組。type,可選,如果設置該參數爲 true,則檢查搜索的數據與數組的值的類型是否相同。 -
count():獲取數組元素個數
-
$_FILES['image']['name']:'image'爲前端圖片定義的name,後面的'name'不可變
-
file_exists():檢查圖片是否存在文件夾,存在返回ture,否則false
-upload:是我圖片上傳目標文件
<?php
extract($_POST);
$date = date('Y-m-d');
$file_name = $_FILES['image']['name'];//獲取緩存區圖片,格式不能變
$type = array("jpg", "gif", 'png', 'bmp');//允許選擇的圖片類型
$ext = explode(".", $file_name);//拆分獲取圖片名
$ext = $ext[count($ext) - 1];//取圖片的後綴名
if (in_array($ext,$type)){
do{
$new_name = get_file_name(6).'.'.$ext;
$path='upload/'.$new_name;//upload爲目標文件夾
}while (file_exists("../" . $path));//檢查圖片是否存在文件夾,存在返回ture,否則false
$temp_file=$_FILES['image']['tmp_name'];//獲取服務器裏圖片
include_once ('connect.php');//連接數據庫
$result = $link->exec("INSERT INTO `news`(`title`,`author`, `content`, `src`,`time`) VALUES ('$title','$author','$content','$path','$date')");
if ($result){
move_uploaded_file($temp_file,"../" .$path);//移動臨時文件到目標路徑
$arr['flag']=1;
$arr['detail']=[$title,$author,$content,$path];
}else{
$arr['flag']=2;
}
}else{
$arr['flag']=3;
}
function get_file_name($len)//獲取一串隨機數字,用於做上傳到數據庫中文件的名字
{
$new_file_name = 'A_';
$chars = "1234567890qwertyuiopasdfghjklzxcvbnm";//隨機生成圖片名
for ($i = 0; $i < $len; $i++) {
$new_file_name .= $chars[mt_rand(0, strlen($chars) - 1)];
}
return $new_file_name;
}
echo json_encode($arr);
PHP 利用CURL(HTTP)實現服務器上傳文件至另一服務器
https://www.cnblogs.com/lzs-888/p/10790637.html
// 上傳端
/** * 向目標地址推送xls文件 * @Date 2019/4/29 */ public function putXls() { // 目標接口 $url = "http://xxx"; // 初始化 cURL 會話, 如果提供url,CURLOPT_URL 選項將會被設置成這個值 $ch = curl_init($url); // 獲取CURLFile實例 $xlsCurlFile = $this->makeCurlFile(base_path()."/public/tby.xls"); $data = array('xls' => $xlsCurlFile); // TRUE 時會發送 POST 請求,類型爲:application/x-www-form-urlencoded,是 HTML 表單提交時最常見的一種。 curl_setopt($ch, CURLOPT_POST, 1); // 從 PHP 5.5.0 開始, @ 前綴已被廢棄,文件可通過 CURLFile 發送。 設置 CURLOPT_SAFE_UPLOAD 爲 TRUE 可禁用 @ 前綴發送文件,以增加安全性。 curl_setopt($ch, CURLOPT_POSTFIELDS, $data); // 執行給定的 cURL 會話 // 成功時返回 TRUE, 或者在失敗時返回 FALSE。 然而,如果 設置了 CURLOPT_RETURNTRANSFER 選項,函數執行成功時會返回執行的結果,失敗時返回 FALSE 。 $result = curl_exec($ch); if (curl_errno($ch)) {// 返回錯誤代碼或在沒有錯誤發生時返回 0 (零)。 // 返回錯誤信息,或者如果沒有任何錯誤發生就返回 '' (空字符串)。 $result = curl_error($ch); } // 關閉 cURL 會話 curl_close($ch); } /** * 根據文件路徑獲取一個CURLFile類實例 * @param string $file 文件路徑 * @return CURLFile * @Date 2019/4/29 */ private function makeCurlFile(string $file) { /** * .xls mime爲 application/vnd.ms-excel * .xlsx mime爲 application/vnd.openxmlformats-officedocument.spreadsheetml.sheet * 可參考 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Complete_list_of_MIME_types * * 注意:也可以使用 finfo類動態獲取,但需要裝fileinfo擴展 * demo: $result = new finfo(); if (is_resource($result) === true) { return $result->file($filename, FILEINFO_MIME_TYPE); } return false; */ $mime = "application/vnd.ms-excel"; $info = pathinfo($file); $name = $info['basename']; $output = new CURLFile($file, $mime, $name); return $output; }
// 接收端
public function getFile() { // 保存的文件夾,需要注意所在用戶組是否有寫入權限 $uploads_dir = base_path()."/public/test"; $xlsFiles = $_FILES["xls"] ?? null; if($xlsFiles){ if ($xlsFiles["error"] == UPLOAD_ERR_OK) { $tmp_name = $xlsFiles["tmp_name"]; $name = $xlsFiles["name"]; move_uploaded_file($tmp_name, "$uploads_dir/$name"); } // todo success }else{ // todo fail } }
注意:需要打開php curl擴展
參考:
https://www.php.net/manual/zh/book.curl.php
https://www.php.net/manual/zh/class.curlfile.php