Keep-Alive
的做用Keep-Alive
:使客戶端到服務器端的鏈接持續有效,當出現對服務器的後繼請求時,Keep-Alive
功能避免了創建或者從新創建鏈接。Web服務器,基本上都支持HTTP Keep-Alive
。php
對於提供靜態內容的網站來講,這個功能一般頗有用。可是,對於負擔較重的網站來講,雖然爲客戶保留打開的連 接有必定的好處,但它一樣影響了性能,由於在處理暫停期間,原本能夠釋放的資源仍舊被佔用。當Web服務器和應用服務器在同一臺機器上運行時,Keep-Alive
功能對資源利用的影響尤爲突出。html
Keep-Alive: timeout=5, max=100
數據庫
timeout
:過時時間5秒(對應httpd.conf
裏的參數是:KeepAliveTimeout
),max
:是最多一百次請求,強制斷掉鏈接。就是在timeout
時間內又有新的鏈接過來,同時max
會自動減1
,直到爲0
,強制斷掉。php
數組函數常見的那些?list(); //不是真正的函數,而是PHP的語言結構,用於給一組變量賦值,僅能用於索引數組 each(); //返回數組當前元素的鍵值對,並將指針移動到下一個元素位置 while(); //可配合list或each使用:while(list($key, $value) = each($arr)){each $key, $value; }
current(); //讀取指針位置的內容 key(); //讀取當前指針指向內容的索引值 next(); //將數組中的內部指針指向下一單元 prev(); //將數組內部指針倒回一位 end(); //將數組內部指針指向最後一個元素 reset(); //將目前指針指向第一個索引位置
array_values($arr); //得到數組的值 array_keys($arr); //得到數組的鍵名 array_flip($arr); //數組中的值與鍵名互換(若是有重複前面的會被後面的覆蓋) array_search('PHP',$arr); //檢索給定的值,加true則是嚴格類型檢查 array_reverse($arr); //將數組中的元素翻轉(先後順序) in_array("apple", $arr); //在數組中檢索apple array_key_exists("apple", $arr); // 檢索給定的鍵名是否存在數組中 array_count_values($arr); // 統計數組中全部值出現的次數 array_unique($arr); // 刪除數組中重複的值
array_filter(); //使用回調函數過濾數組中的元素,若是回調返回true則當前的元素被包含到返回數組中 array_walk(); //回調函數處理數組,自定義函數要有兩個參數,本函數第三個參數能夠做爲回調第三個參數返回 array_map(); //能夠處理多個數組,每一個數組的長度應該相同,傳入數組的個數和回調函數參數個數應該一致
array_slice($arr, 0, 3); //將數組中的一段取出,此函數忽略鍵名(數組的分段) array_splice($arr, 0, 3,array("black","maroon")); //將數組中的一段取出,返回的序列從原數組中刪除 array_chunk($arr, 3, TRUE); //將一個數組分割成多個,TRUE爲保留原數組的鍵名(分割多個數組)
array_push($arr, "apple", "pear"); //將一個或多個元素壓入數組棧的末尾(入棧),返回入棧元素的個數 array_pop($arr); // 將數組棧的最後一個元素彈出(出棧) array_shift($arr); //數組中第一個元素移出並返回(長度減1,其餘元素向前移動一位,數字鍵名改成從零計數,文字鍵名不變) array_unshift($arr,"a",array(1,2)); //在數組的開頭插入一個或多個元素
sort($arr); //由小到大,忽略鍵名 rsort($arr); //由大到小,忽略鍵名 asort($arr); //由小到大,保留鍵名 arsort($arr); //由大到小,保留鍵名 ksort($arr); //按照鍵名正序排序 krsort($arr); //按照鍵名逆序排序
array_sum($arr); //對數組內部的全部元素作求和運算(數組元素的求和) array_merge($arr1, $arr2); //合併兩個或多個(相同字符串鍵名,後面覆蓋前面,相同的數字鍵名,後面的附加到後面) array_diff($arr1, $arr2); //返回差集結果數組 array_diff_assoc($arr1, $arr2, $arr3); //返回差集結果數組,鍵名也作比較 array_intersect($arr1, $arr2); //返回交集結果數組 array_intersect_assoc($arr1, $arr2); //返回交集結果數組,鍵名也作比較
array_unique($arr); //移除數組中重複的值,新的數組中會保留原始的鍵名 shuffle($arr); // 將數組的順序打亂
PHP
中幾個輸出函數echo
,print()
,print_r()
,sprintf()
,var_dump()
的區別echo
:是語句不是函數,沒有返回值,可輸出多個變量值,不須要圓括號。不能輸出數組和對象,只能打印簡單類型(如int
,string
)。print
:是語句不是函數,有返回值 1 ,只能輸出一個變量,不須要圓括號。不能輸出數組和對象,只能打印簡單類型(如int
,string
)。print_r
:是函數,能夠打印複合類型,例如:stirng
、int
、float
、array
、object
等,輸出array
時會用結構表示,並且能夠經過print_r($str,true)
來使print_r
不輸出而返回print_r
處理後的值printf
:是函數,把文字格式化之後輸出(參看C語言)sprintf
:是函數,跟printf
類似,但不打印,而是返回格式化後的文字(該函數把格式化的字符串寫寫入一個變量中,而不是輸出來),其餘的與printf
同樣。$str = "Hello"; $number = 123; $txt = sprintf("%s world. Day number %u",$str,$number); //輸出: Hello world. Day number 123 var_dump():函數,輸出變量的內容、類型或字符串的內容、類型、長度。經常使用來調試。
能夠經過function_exists('函數名稱')
進行測試json
var_dump(function_exists('print')); //bool(false) var_dump(function_exists('echo')); //bool(false) var_dump(function_exists('print_r')); //bool(true
heredoc
Heredoc
在正規的PHP
文檔中和技術書籍中通常沒有詳細講述。他是一種Perl
風格的字符串輸出技術。使用heredoc
技術能夠實現界面與代碼的準分離,好比phpwind
模板。
heredoc
的語法是用」<<<」
加上本身定義成對的標籤,在標籤範圍內的文字視爲一個字符串數組
<<<End
開始標記開始,以End
結束標記結束,結束標記必須頂頭寫,不能有縮進和空格,且在結束標記末尾要有分號。開始標記和開始標記相同,好比經常使用大寫的EOT
、EOD
、EOF
來表示,也可使用其餘標記,只要保證開始標記和結束標記不在正文中出現就行。在heredoc
中,變量不須要用鏈接符 .
或 ,
來拼接,好比:$a=2; $b= <<<EOF "zing"$a "zing" EOF; echo $b; //結果連同雙引號一塊兒輸出:"zing"2 "zing"
heredoc
經常使用在輸出包含大量HTML
語法文檔的時候。他要比傳統的echo
輸出精煉不少,以下所示:
```php
function getHtml(){
echo "";
echo "
function getHtml(){ echo <<<EOT <html> <head><title>Title</title></head> <body>Content</body> </html> EOT; } ```
cookie
的session
使用方案,設置session
過時的方法,對應函數經過url
傳值,把session id
附加到url
上(缺點:整個站點中不能有純靜態頁面,由於純靜態頁面session id
將沒法繼續傳到下一頁面)
經過隱藏表單,把session id
放到表單的隱藏文本框中同表單一塊提交過去(缺點:不適用<a>
標籤這種直接跳轉的非表單的狀況)
直接配置php.ini
文件,將php.ini
文件裏的session.use_trans_sid= 0
設爲1
,(好像在win上不支持)
用文件、數據庫等形式保存Session ID
,在跨頁過程當中手動調用服務器
// 第一種 setcookie() 直接用setcookie設置session id的生命週期。 $lifetime=60; //保存1分鐘 session_start(); setcookie(session_name(), session_id(), time()+$lifetime, "/"); // 第二種 session_set_cookie_params() $lifetime=60;//保存1分鐘 session_set_cookie_params($lifetime); session_start(); session_regenerate_id(true); // 其中session_regenerate_id();方法用於改變當前session_id的值,並保留session中數組的值。參數默認爲 false,若是設置爲true則改變session_id的值,並清空當前session數組。
json
格式數據有哪些特色JSON
一種輕量級的數據交換格式(JavaScript Object Notation
, JS 對象標記)。它基於ECMAScript
的一個子集。 JSON
採用徹底獨立於語言的文本格式,可是也使用了相似於C語言家族的習慣(包括C
、C++
、C#
、Java
、JavaScript
、Perl
、 Python等
)。這些特性使JSON
成爲理想的數據交換語言。 易於人閱讀和編寫,同時也易於機器解析和生成(網絡傳輸速率)。cookie
"名稱/值"
對的集合 不一樣語言中,它被理解爲對象(object
),記錄(record
),結構(struct
),字典(dictionary
),哈希表(hash table
),鍵列表(keyed list
)等file_get_contents
獲得文件的內容(能夠以get
和post
的方式獲取),整個文件讀入一個字符串中fopen
打開url
, 以get
方式獲取內容(藉助fgets()
函數)fsockopen
函數打開url
(能夠以get
和post
的方式獲取),以get
方式獲取完整的數據,包括header
和body
curl
庫獲取內容,使用curl
庫以前,須要查看php.ini
,查看是否已經打開了curl
擴展__construct();
說明:具備構造函數的類會在每次建立新對象時先調用此方法,適合在使用對象以前作一些初始化工做。若是子類中定義了構造函數則不會隱式調用其父類的構造函數。要執行父類的構造函數,須要在子類的構造函數中調用 parent::__construct()
。若是子類沒有定義構造函數則會如同一個普通的類方法同樣從父類繼承。網絡
__destruct();
說明:析構函數會在到某個對象的全部引用都被刪除或者當對象被顯式銷燬時執行。session
__call();
說明:在對象中調用一個不可訪問方法時,__call();
方法會被調用。
__callStatic();
說明:用靜態方式中調用一個不可訪問方法時,__callStatic();
方法會被調用。
__get();
說明:讀取不可訪問屬性的值時,__get()
會被調用。
__set();
說明:在給不可訪問屬性賦值時,__set()
會被調用。
__isset();
說明:當對不可訪問屬性調用 isset()
或 empty()
時,__isset()
會被調用。
__unset();
說明:當對不可訪問屬性調用 unset()
時,__unset()
會被調用。
__sleep();
說明:序列化時調用,serialize()
函數會檢查類中是否存在該魔術方法。若是存在,該方法會先被調用,而後才執行序列化操做。
__wakeup();
說明:unserialize()
會檢查是否存在一個 __wakeup()
方法。若是存在,則會先調用該方法,用在反序列化操做中,例如從新創建數據庫鏈接,或執行其它初始化操做
__toString();
說明:方法用於一個類被當成字符串時調用,例如把一個類當作字符串進行輸出
__invoke();
說明:當嘗試以調用函數的方式調用一個對象時,__invoke()
方法會被自動調用。
__set_state();
說明:當調用 var_export()
導出類時,此靜態方法會被調用。 本方法的惟一參數是一個數組
__clone();
說明:當複製完成時,若是定義了__clone()
方法,則新建立的對象(複製生成的對象)中的__clone()
方法會被調用,可用於修改屬性的值。
__autoload();
說明:該方法能夠自動實例化須要的類。當程序要用一個類但沒有被實例化時,改方法在指定路徑下查找和該類名稱相同的文件。不然報錯。
__debugInfo();
說明:php5.6增長的特性,var_dump()
一個類時觸發,返回一個包含對象屬性的數組
PHP 將全部以
__
(兩個下劃線)開頭的類方法保留爲魔術方法。因此在定義類方法時,除了上述魔術方法,建議不要以__
爲前綴。在命名本身的類方法時不能使用這些方法名,除非是想使用其魔術功能。
__LINK__//文件中的當前行號。 __FILE__//文件的完整路徑和文件名。若是用在被包含文件中,則返回被包含的文件名。 __DIR__ //文件所在的目錄。若是用在被包括文件中,則返回被包括的文件所在的目錄,它等價於 dirname(__FILE__)。 __FUNCTION__//函數名稱。自 PHP 5 起本常量返回該函數被定義時的名字(區分大小寫)。在 PHP 4 中該值老是小寫字母的。 __CLASS__ //類的名稱。自 PHP 5 起本常量返回該類被定義時的名字(區分大小寫)。在 PHP 4 中該值老是小寫字母的。 __METHOD__//類的方法名(PHP 5.0.0 新加)。返回該方法被定義時的名字(區分大小寫)。 __NAMESPACE__//當前命名空間的名稱(大小寫敏感)。這個常量是在編譯時定義的(PHP 5.3.0 新增)
php.ini
中safe mod
關閉 影響哪些函數和參數,至少寫6個?move_uploaded_file(); exec(); system(); passthru(); popen(); fopen(); mkdir(); rmdir(); rename(); unlink(); copy(); chgrp(); chown(); chmod(); touch(); symlink(); link(); parse_ini_file(); set_time_limit(); max_execution_time; mail();
isset()
、empty()
與is_null
的區別is_null()
和「參數自己」是不容許做爲參數判斷的,會報Notice
警告錯誤;empty
, isset
首先都會檢查變量是否存在,而後對變量值進行檢測。而is_null
和 「參數自己」只是直接檢查變量值,是否爲null
,所以若是變量未定義就會出現錯誤!isset()
:僅當null
和未定義,返回false
;empty()
:""
、0
、"0"
、NULL
、FALSE
、array()
,未定義
,均返回true
;is_null()
:僅判斷是否爲null
,未定義報警告;empty()
一致,但接受未定義變量時,報警告;MVC
的優缺點MVC
的優勢潛在的框架結構。能夠基於此模型創建應用程序框架,不只僅是用在設計界面的設計中。
MVC
的不足之處目前,通常高級的界面工具或構造器不支持MVC模式。改造這些工具以適應MVC須要和創建分離的部件的代價是很高的,從而形成使用MVC的困難。
session
與cookie
的聯繫和區別(運行機制),session
共享問題解決方案使用session_start()
調用session
,服務器端在生成session
文件的同時生成session ID哈希值
和默認值爲PHPSESSID
的session name
,並向客戶端發送變量爲PHPSESSID(session name)
(默認)值爲一個128
位的哈希值。服務器端將經過該cookie
與客戶端進行交互,session
變量的值經php內部系列化後保存在服務器機器上的文本文件中,和客戶端的變量名默認狀況下爲PHPSESSID
的cookie
進行對應交互,即服務器自動發送了http
頭:header(‘Set-Cookie: session_name()=session_id(); path=/’);
即setcookie(session_name(),session_id());
當從該頁跳轉到的新頁面並調用 session_start()
後,PHP將檢查與給定ID
相關聯的服務器端存貯的session
數據,若是沒找到則新建一個數據集。
使用數據庫來保存session
,就算服務器宕機了也沒事,session
照樣在。
問題:程序須要定製;每次請求都進行數據庫讀寫開銷不小,另外數據庫是一個單點,能夠作數據庫的
hash
來解 決這個問題。
使用memcache
來保存session
, 這種方式跟數據庫相似,內存存取性能比數據庫好不少。
問題:程序須要定製,增長了工做量;存入
memcached
中的數據都須要序列化,效率較低,斷電或者重啓電腦容易丟失數據;
經過加密的cookie
,在A服務器上登陸,在用戶的瀏覽器上添加加密的cookie
,當用戶訪問B服務器時,檢查有無Session
,若是沒有,就檢驗 Cookie
是否有效,Cookie
有效的話就在B服務器上重建session
。簡單,高效, 服務器的壓力減少了,由於session
數據不存在服務器磁盤上。根本就不會出現session
讀取不到的問題。
問題:網絡請求佔用不少。每次請求時,客戶端都要經過
cookie
發送session
數據給服務器,session
中數據不能太多,瀏覽器對cookie
的大小存在限制。不適合高訪問量的狀況,由於高訪問量的狀況下。