20170822PHP學習(二)服務器與客戶端間的交互

PHP(二)服務器與客戶端間的交互

參考

PHP 手冊
陳惠貞 , 陳俊榮.PHP 7&MySQL跨設備網站開發[M].北京:清華大學出版社,2017
PHP 教程
PHP 教程
wiki_HTTP頭字段

服務器與客戶端間傳遞信息

1. HTTP頭字段(HTTP Header)

1.1 定義

具體參考wiki_HTTP頭字段
HTTP頭字段(英語:HTTP header fields)是指在超文本傳輸協議(HTTP)的請求和響應消息中的消息頭部分。它們定義了一個超文本傳輸協議事務中的操作參數。

1.2 HTTP頭字段格式

針對http的,非php獨有
協議頭的字段是以明文的字符串格式傳輸,是以冒號分隔的鍵名與鍵值對,以回車(CR)加換行(LF)符號序列結尾。
更多見 請求字段回應字段

常用回應字段Response

字段 功能 實例 備注
Location 進行重定向,自動跳轉
可用來根據終端類型,跳轉至PC或Mobile界面
Location: http://www.w3.org
Refresh 隔n秒跳轉到某網站
Refresh: 5; url=http://www.w3.org
WWW-Authenticate 表明在請求獲取這個實體時應當使用的認證模式 WWW-Authenticate: Basic

常用請求字段Request

字段 功能 實例 備注
Content-Type 請求體的 多媒體類型 (用于POST和PUT請求中) Content-Type: application/x-www-form-urlencoded
Content-Type:image/gif"

1.3 PHP設置頭字段

格式: header(HTTP頭字段,TRUE/FALSE,HTTP回復代碼)

  • HTTP頭字段:就是HTTP頭字段格式,以字符串方式填入 具體格式在 1.2 HTTP頭字段格式
  • TRUE/FALSE:如果已存在相同類型的HTTP字段,是否取代,可以不填默認為TRUE取代,填FALSE不為取代
  • HTTP回復代碼:可不填,暫不清楚
1.4 應用
header("Location:http://www.lxweimin.com");
//自動跳轉到www.lxweimin.com
header("Refresh:2;http://www.lxweimin.com");
//2秒后跳轉到www.lxweimin.com

判斷移動端設備,參考PHP判斷手機端、PC端 、微信代碼實例

2. 表單

表單語法是html語法,在PHP標記之外使用
html表單傳送數據
PHP等動態網頁技術處理html表單傳來的數據

<?php
echo "你是?";
?>
<!--表單是html語法,使用html方式書寫-->
<!--后面是html語法,沒有php語法錯誤-->
<form action="welcome.php" method="post">
Name <input type="text" name="youName">
<br>
<input type="submit" value="提交">
</form>

2.1 表單的格式

<form 表單屬性>
各種表單元素input/select/textarea
</form>

2.2 表單屬性

  • accept="..." 表單處理數據的類型,例accept="image/gif,image/jpeg"
  • accept-charset="..." 表單數據的編碼方式,例accept-charset="ISO-8859-1"
  • action="url" 接受表單傳送的數據和處理的程序,url為程序的相對或絕對地址
  • method="get/post" 數據的傳輸方式,get或post,后面2.4 GET & POST
  • name="..." 表單的名稱
    其他

2.3 表單元素

參見20170809html學習

2.4 GET & POST

用戶點完提交(submit元素),表單使用method(get或post)方式把數據傳給action后的程序處理

get

在 PHP 中,預定義的 $_GET 變量用于收集來自 method="get" 的表單中的值
$_GET為數組,數組的key為表單元素name,數組的value為表單元素的value

收集表單程序
sub.php

<form name="input" action="m_get.php" method="get">
<!--傳輸方法為get,處理程序為m_get.php-->
    <!--文本域-->
    Name <input type="text" name="Name"><br>
    <!--密碼-->
    Password <input type="password" name="Password"><br>
    <!--單選-->
    性別<br>
    <input type="radio" name="sex" value="male">Male <br>
    <input type="radio" name="sex" value="femal">Femal <br>
    <!--復選-->
    操作系統<br>
    <input type="checkbox" name="OS" value="IOS">IOS<br>
    <input type="checkbox" name="OS" value="Android">Android<br>
    <!--下拉列表-->
    手機<br>
    <select name="phone">
    <option value="apple">Apple</option>
    <option value="xiaomi">Xiaomi</option>
    <option value="piexl" selected>Piexl</option>
    </select>
    </br>
    <!--提交-->
    <input type="submit" value="提交"><br>
</form>

處理程序為
m_get.php

<?php
// method="get"
foreach ($_GET as $key => $value)
{
    echo "$key:$value<br>";
}
?>

點完提交后,自動打開下述鏈接

http://127.0.0.1/m_get.php?Name=root&Password=mypasswd&sex=male&OS=IOS&phone=piexl

可以看到,鏈接中包含表單元素的name=值
網頁運行如圖

注:
在 HTML 表單中使用 method="get" 時,所有的變量名和值都會顯示在 URL 中,所以在發送密碼或其他敏感信息時,不應該使用這個方法!
HTTP GET 方法不適合大型的變量值。它的值是不能超過 2000 個字符的。

post

與get語法類似,只不過PHP接受數據存儲在$_POST 變量
講get中sub程序更改為method="post",處理程序m_get.php中的$_GET替換為$_POST運行效果不變,不過提交后打開的代碼為

http://127.0.0.1/m_get.php


從帶有 POST 方法的表單發送的信息,對任何人都是不可見的(不會顯示在瀏覽器的地址欄),并且對發送信息的量也沒有限制。
然而,默認情況下,POST 方法的發送信息的量最大值為 8 MB(可通過設置 php.ini 文件中的 post_max_size 進行更改)。

$_REQUES

預定義的 $_REQUEST 變量包含了 $_GET、$_POST 和 $_COOKIE 的內容。
$_REQUEST 變量可用來收集通過 GET 和 POST 方法發送的表單數據。
由method是post還是get決定url中顯示還是不顯示傳輸的數據,method都可以接收

3. Cookie

網站為了辨別用戶身份而儲存在用戶本地終端上的數據(通常經過加密)。
參考
wiki_Cookie
HTTP cookies 詳解

3.1 cookie格式

一個網站可在客戶端上存多個cookie,例如chrome可在地址連前面右鍵Cookie查看存儲的Cookie
每個cookie都有以下屬性

  • name
  • value
  • 編碼
  • 生存周期
  • 所屬域名
  • 在客戶端的存放目錄
  • 安全選項

3.2 PHP寫入cookie

setcookie(name,value,生命周期,路徑,所屬域名,安全選項)
setrawcookie(name,value,生命周期,路徑,所屬域名,安全選項)
  • name 字符串,cookie名字,可以寫入多個name不同的cookie
  • value 字符串,可選填,多次寫入cookie時,后面的value會覆蓋前面的value,把value設為"",則刪除cookie
  • 生存周期 整數,秒,例time()+60*60*24 表示,從現在起一天,
    若不設置則cookie保存在用戶硬盤中,瀏覽器終止時cookie消失
  • 路徑 字符串目錄,cookie在客戶端的存放目錄,不填默認"/"
  • 所屬域名 字符串,可選填,當web服務器同時有兩個域名,為了不讓其中一個域名去讀取另一個域名的cookie時設置
  • 安全選項 TRUE表示使用安全連接(SSL,HTTPS)傳送cookie,默認不填為FALSE
<?php
header("Content-type:text/html;charset=utf-8");
//指定網頁編碼為UTF-8
setcookie("UserName","簡書",time()+60);
?>

查看添加的cooki


可以看到使用setcookie的value簡書被編碼了,可通過URL解碼查看具體內容,如url解碼,如果不想編碼存儲,則使用setrawcookie

寫入cookie必須在任何輸出語句之前

可通過放入緩存區解決,例

hearder()語句
ob_start();//把輸出放入緩存區
輸出語句;
setcookie語句;
ob_end_flush();//取出緩存區輸出
若瀏覽器不支持cookie,則cookie派不上用場,但PHP語句執行成功
本地cookie可以修改

參見各種瀏覽器(IE,Firefox,Chrome,Opera)COOKIE修改方法,玩法豐富

3.3 PHP讀取cookie

$_COOKIE為PHP內置超全局數組,直接調用,key為cookie的name,value為cookie的value
cookie的name可為數組,$_COOKIE["數組名"]則也為數組

3.4 PHP刪除cookie

使用cookie創建函數,把value設為空""

4. Session/會話

Session可以理解為服務器端的cookie

由于 HTTP 地址無法保持狀態,Web 服務器并不知道你是誰以及你做了什么。PHP session 解決了這個問題,它通過在服務器上存儲用戶信息以便隨后使用(比如用戶名稱、購買商品等)。然而,會話信息是臨時的,在用戶離開網站后將被刪除。如果需要永久存儲信息,可以把數據存儲在數據庫中。
官方解釋Sessions

4.1 啟動Session/會話

session_start();

4.2 使用Session

$_SESSION

超全局數組,初始是空的,可以添加key和value
Session預設的生命周期為瀏覽器開始執行至瀏覽器結束,只要瀏覽器不關閉,$_SESSION里記錄的key和value就會被保存,即使瀏覽器暫時關閉這個網頁又打開,里面的值不會消失

Session相關函數

具體見Session 函數

4.3 銷毀Session

unset($_SESSION['key']);//消除某個屬性
session_destroy();//清空所有session

文件管理和輸出

說明

  • 以下的目錄為字符串,如直接用雙引號"書寫記得進行轉義,例"C:\\hello\\hi"字符串變量(路徑變量)直接寫不加引號
  • 絕對目錄相對目錄和Linux里一樣

1. 文件操作

函數 格式 格式說明 功能
basename basename(目錄,排除的字符串)
無論文件是否存在,僅對目錄這一字符串進行操作
所以,不支持相對目錄
最后一段字符為文件還是文件夾都可以
排除的字符串意為去掉文名中某些字符串顯示,不過只有和輸出的字符串最后幾個字符相同時才會略去最后幾個字符的輸出,否則無效,可選
處理目錄提取文件名
pathinfo pathinfo(目錄) 無論文件是否存在,僅對目錄這一字符串進行操作 返回值為數組,dirname => 路徑名稱,basename=>文件名(含拓展名),extention => 拓展名(不含小數點)
dirname dirname(目錄) 無論文件是否存在,僅對目錄這一字符串進行操作 返回文件夾的父類文件名稱
realpath realpath(目錄) 必須存在,目錄為文件或文件夾的絕對或相對目錄 返回文件的絕對目錄
mkdir mkdir(目錄,權限,TRUE/FALSE) 目錄為創建文件夾的目錄
權限0開頭為linux下文件權限,可不填默認0777,windows下無效,若不想設置則設為NULL
TRUE/FALSE,默認不填為FALSE,當目錄不存在時,創建失敗返回FALSE,設為TRUE則一并創建不存在的文件夾
創建文件夾,成功返回iTRUE失敗返回FALSE
getcwd getcwd() 類似linux的pwd 返回當前工作文件夾目錄
chdir chdir(目錄) 類似linux的cd 切換工作文件夾
rmdir rmdir(目錄) 類似linux的rm,目錄為文件夾路徑,不是文件 刪除文件夾
unlink unlink(目錄) 目錄為文件 刪除文件,成功返回TRUE,失敗返回FALSE
is_dir is_dir(目錄) 目錄為文件夾路徑 判斷是否為文件夾
is_file is_file(目錄) 目錄為文件目錄 判斷是否為文件
file_exists file_exists(目錄) 目錄為'文件夾/文件'路徑 判斷文件夾/文件是否存在
chmod chmod(目錄,權限) 類linux下chmod,權限0開頭 更改文件/文件夾權限
scandir scandir(目錄,排序方式) 排序方式可不填,默認為0升序,1為降序 返回數組,value為文件夾下文件的名稱包括當前文件夾..與父類.
copy copy(源目錄,目標目錄) 目錄為文件目錄 復制文件,存在則覆蓋
rename rename(老文件名,新文件名) 目錄為文件/文件夾目錄 重命名文件/文件夾
fileatime fileatime(目錄) 獲取文件/文件夾 最后的返回時間,返回unix時間戳
filectime filectime(目錄) 獲取文件/文件夾 創建時間,返回unix時間戳
filemtime filemtime(目錄) 獲取文件/文件夾 修改時間,返回unix時間戳
filesize filesize(目錄) 獲取文件大小,單位為字節
is_readable is_readable(目錄) 文件存在且可讀,返回TRUE,否則FALSE
is_writable is_writable(目錄) 文件存在且可寫,返回TRUE,否則FALSE

<?php
$path=$_SERVER['PHP_SELF'];
echo basename("D:\\gg\\dell.sr","ll.sr")."<br>";
echo dirname("D:\\gg\\dell.sr")."<br>";
foreach (pathinfo("C:\\hello\\hi") as $key => $value)
echo $key."  ".$value."<br>";
//事實上D:\\gg\\dell.sr與C:\\hello\\hi并不存在
echo realpath(getcwd())."<br>";
echo realpath(".")."<br>";//.相對目錄,當前目錄
mkdir(new_dir,0777);
echo "存在new_dir輸出1,".file_exists(new_dir)."<br>";
chdir(new_dir);
echo "新工作目錄".realpath(getcwd())."<br>";
chdir("..");//..為絕對目錄代表父文件夾,類似linux
rmdir(new_dir);
echo "不存在new_dir,不輸出".file_exists(new_dir)."<br>";
echo "<br>當前目錄下有:<br>";
foreach (scandir(".") as $value)
echo $value."<br>";
echo "文件列表到此結束:<br>";
?>

輸出為

2.文本文件

流程:打開文件->讀取/修改文件->關閉文件

2.1 打開文件fopen()

fopen(目錄,打開方式)
  • 返回值為資源/指針(指向文件開頭)
  • 與C語言指針不同,指針和資源一一綁定,把指針的值賦給另一個變量,就是把資源賦給他,對資源的讀取倒至指針位置的變化,則所有與改資源有關的指針指向全部變化
  • 打開方式為字符串,例"r",更多如下表
    擦寫代表只寫入指針所在處的位置,寫代表指針所在處及以后都被替換

2.2 讀取寫入

必須先打開才能讀取

fread讀取并把指針向后移動讀取長度
fread(資源/指針,讀取長度)
  • 資源指針為fopen()的返回值
  • 讀取長度為整數,例總長度filesize(目錄)
fget讀取一行,并移動指針一行長度
fget(資源/指針)
fwrite與fputs寫入用法完全一樣,寫入并移動指針
fwrite(資源/指針,寫入的字符串,寫入長度)

寫入長度可不寫

2.3 關閉

fclose(資源/指針)

2.4 其他函數

nl2br把文件中的換行\n,\r,\r\n轉化為html的
feof(資源/指針),指針指向文件尾時返回TRUE,!feof(資源/指針)可在循環中用于判斷
file_get_contents(目錄)

無需打開關閉,直接讀取
返回值為文件內容的字符串

file_put_contents(目錄,字符串)

無須打開關閉,直接清除內容從前端寫入,不存在則新建寫入
返回值為寫入的字節數


du.php

<?php
$file=fopen("file.txt","r");
$old_file=$file;
// 直接寫file.txt,點會被視為字符串連接符,變成filetxt
echo fread($file,filesize("file.txt"));
echo fread($old_file,filesize("file.txt"));
// $old_file也指向資源file.txt,指針已指向末尾,無法輸出
fclose($old_file);
echo "<br>"."<br>";
$file=fopen("file.txt","w");
fputs($file,"寫入");
fputs($file,"\n繼續寫\n");
fclose($file);
$file=fopen("file.txt","a");
fputs($file,"最后寫入");
fclose($file);
echo "<br>";
$file=fopen("file.txt","r");
while(!feof($file))
{
    echo nl2br(fread($file,filesize("file.txt")))."<br>";
}
echo var_dump(fclose($file))."<br>";
echo "共寫入".file_put_contents("file.txt","幾個字節")."字節<br>";
echo "最終file.txt內容為:  ".nl2br(file_get_contents("file.txt"))."<br>";
?>

file.txt

123456
qwerty
asdfgh
zxcvbn
!@#$%^
<>?{}+

運行du.php

123456 qwerty asdfgh zxcvbn !@#$%^ <>?{}+


寫入
繼續寫
最后寫入
bool(true) 
共寫入12字節
最終file.txt內容為: 幾個字節

3. 圖像文件

流程:創建圖像->輸出圖像->釋放內存
GD繪圖(略),圖像處理(略),圖像輸出

3.1 圖像輸出

讀取外部函數
imagecreatefromgif(目錄)
imagecreatefromjpeg(目錄)
imagecreatefrompng(目錄)

返回值為圖像資源

輸出圖像
  • http header(HTTP標頭)確定傳輸類型
header("content-type:image/gif");
  • 輸出函數
imagegif(圖像資源,目錄)
imagejpeg(圖像資源,目錄)
imagepng(圖像資源,目錄)

若需要保存再服務器端則在目錄里填寫存儲的位置和文件名,可以不填,默認不保存在服務器端

釋放內存
imagedestory(圖像資源)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一、會話控制(session與cookie) 1.cookie簡介 Cookie是存儲在客戶端瀏覽器中的數據,我們...
    空谷悠閱讀 649評論 0 5
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,914評論 18 139
  • 從三月份找實習到現在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發崗...
    時芥藍閱讀 42,366評論 11 349
  • 01 端午節也算是廣東的大節了!小時候有龍舟賽,我記憶中大清早我和小伙伴會到河堤邊上圍觀,如今沒有了,不曉得是不是...
    C玉瑩閱讀 292評論 0 1
  • 早上帶領大家觀足,更多的感受到自己左腳低,仿佛有一股氣流一直流到身體上。我的小指麻麻的,而且有一股很強的氣流流過,...
    清荷_edfa閱讀 270評論 0 2