PHP開發程序員面試題目總結(中級)

2017年10月16日12:55:37 發表評論

PHP部分

1:請用最簡單的語言告訴我PHP是什么?

PHP全稱:Hypertext Preprocessor,是一種用來開發動態網站的服務器腳本語言。

2:什么是MVC?

MVC由Model(模型), View(視圖)和Controller(控制器)組成,PHP MVC可以更高效地管理好3個不同層的PHP代碼。

Model:數據信息存取層。

View:view層負責將應用的數據以特定的方式展現在界面上。

Controller:通常控制器負責從視圖讀取數據,控制用戶輸入,并向模型發送數據。

3:PHP支持多繼承嗎?

不可以。PHP類只能繼承一個父類,并用關鍵字“extends”標識。

被繼承的方法和屬性可以通過用同樣的名字重新聲明被覆蓋。但是如果父類定義方法時使用了 final,則該方法不可被覆蓋。可以通過 parent:: 來訪問父類中的方法或屬性。

當覆蓋方法時,參數必須保持一致否則 PHP 將發出 E_STRICT 級別的錯誤信息。但構造函數例外,構造函數可在被覆蓋時使用不同的參數。

Final 關鍵字

PHP 5新增的一個關鍵字,如果父類中的方法被聲明為 final,則子類無法覆蓋該方法。同樣如果一個類被聲明為 final,則不能被繼承。(需要注意的是: 屬性不能被定義為 final,只有類和方法才能被定義為 final。)

4:php中對數組序列化和反序列化的函數分別是 serializeunserialize ;

5:urlencode和rawurlencode的區別

urlencode和rawurlencode兩個方法在處理字母數字,特殊符號,中文的時候結果都是一樣的,唯一的不同是對空格的處理,urlencode處理成“+”,rawurlencode處理成“%20”。

6:php中過濾HTML的函數strip_tags,轉義的函數是htmlspecialchars

7:寫出用正則把HTML中的js腳本過濾掉

preg_replace(‘/<script.*?//script>/is’,”,$htmlcode);

8:寫出三個調用系統命令的函數:exec、system、passthru

9:php中判斷變量是否被設置是函數是_isset_;判斷是否為空的是empty;

empty、 isset、is_null的區別:

empty: 如果 變量 是非空或非零的值,則 empty() 返回 FALSE。換句話說,”"、0、”0″、NULL、FALSE、array()、var $var、未定義;以及沒有任何屬性的對象都將被認為是空的,如果 var 為空,則返回 TRUE。

isset: 如果 變量 存在(非NULL)則返回 TRUE,否則返回 FALSE(包括未定義)。變量值設置為:null,返回也是false;unset一個變量后,變量被取消了。注意,isset對于NULL值變量,特殊處理。

is_null: 檢測傳入值【值,變量,表達式】是否是null,只有一個變量定義了,且它的值是null,它才返回TRUE . 其它都返回 FALSE 【未定義變量傳入后會出錯!】

10:error_reporting(“E_ALL”)和ini_set(“display_errors”, “on”)的區別

前者是設置錯誤顯示等級,E_ALL代表提示全部錯誤(包括notice,warnning和error)。后者是設置讓php顯示錯誤,在關于錯誤顯示控制中,后者的優先級最高。

11:PHP寫出顯示客戶端IP的預定義變量$_SERVER['REMOTE_ADDR'];

提供來路url的是$_SERVER['HTTP_REFERER'];

$_SERVER['REMOTE_HOST'] //當前用戶主機名;

$_SERVER['PHP_SELF']//正在執行腳本的文件名

$_SERVER['REQUEST_METHOD']//訪問頁面時的請求方法

$_SERVER['SCRIPT_FILENAME'] #當前執行腳本的絕對路徑名。

$_SERVER['SERVER_PORT'] #服務器所使用的端口

12:php把utf-8轉換成gbk的函數iconv(‘UTF-8′,’GBK’,$str);

13:php中類的靜態方法怎么使用?

在類外部,使用:類名后面跟雙冒號,再后面是方法名,類似classname::staticFucntion(),由于靜態方法不屬于某個對象,而是隸屬于整個類,所以要用類名來調用它。

14:$a = 1; $b = & $a;

unset($a),$b是否還是1,為什么?

unset($b),$a是否還是1,為什么?

都等于1。

在php中,引用賦值不同于指針的感念,他只是將另一個變量名指向了某個內存地址。此題中:$b = &$a;只是將$b這個名字也指向了$a變量所指向的內存地址。unset時只是釋放了這個名字的指向,并沒有釋放內存中的值

另一方面講unset($a),其實也并未真正立刻釋放內存中的值,也只是釋放了這個名字的指向而已,該函數只有在變量值所占空間超過256字節長的時候才會釋放內存,并且只有當指向該值的所有變量(比如有引用變量指向該值)都被銷毀后,地址才會被釋放。

15:寫一個判斷手機號碼(號段為130-139,150-159,170-179,180-189)是否正確的正則表達式。

/^(((13[0-9]{1})|(15[0-9]{1})|(17[0-9]{1})|(18[0-9]{1}))+\d{8})&/
/^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$ /

16:請問PHP中echo和print有什么區別?

echo和print的本質區別在于:echo用來輸出字符串,顯示多個值的時候可以用逗號隔開。只支持基本類型,print不僅可以打印字符串值,而且可以打印函數的返回值。

17:請問GET和POST方法有什么區別?

我們在網頁上填寫的表單信息都可以通過這兩個方法將數據傳遞到服務器上,當我們使用GET方法是,所有的信息都會出現在URL地址中,并且使用GET方法最多只能傳遞1024個字符,所以如果在傳輸量小或者安全性不那么重要的情況下可以使用GET方法。說到POST方法,最多可以傳輸2MB字節的數據,而且可以根據需要調節。

18:PHP中獲取圖像尺寸大小的方法是什么?

getimagesize () 獲取圖片的尺寸

Imagesx () 獲取圖片的寬度

Imagesy () 獲取圖片的高度

19:PHP中的PEAR是什么?

PEAR也就是為PHP擴展與應用庫(PHP Extension and Application Repository),它是一個PHP擴展及應用的一個代碼倉庫。

20:如何用PHP和MySQL上傳視頻?

我們可以在數據庫中存放視頻的地址,而不需要將真正的視頻數據存在數據庫中。可以將視頻數據存放在服務器的指定文件夾下,上傳的默認大小是2MB,但是我們也可以在php.ini文件中修改max_file_size選項來改變。

21:PHP中的錯誤類型有哪些?

PHP中遇到的錯誤類型大致有3類。

提示(notice):這都是一些非常正常的信息,而非重大的錯誤,有些甚至不會展示給用戶。比如訪問不存在的變量。

警告(warning):這是有點嚴重的錯誤,將會把警告信息展示給用戶,但不會影響代碼的輸出,比如包含一些不存在的文件。

錯誤(error):這是真正的嚴重錯誤,比如訪問不存在的PHP類。

22:如何在PHP中定義常量?

PHP中使用Define () 來定義常量。

define (“Newconstant”, 30);

echo constant("Newconstant"); //constant返回一個常量的值

23:在網站開發中需要傳遞變量值時,不能使用session、cookie、application,你有幾種方法

Session id的傳遞主要有四個方法:

1、 通過cookie。

2、 設置php.ini中的session.use_trans_sid = 1或者編譯時打開打開了--enable-trans-sid選項,讓PHP自動跨頁傳遞session id。

3、 手動通過url或隱藏表單傳值。

4、 用文件或數據庫方式傳遞,在通過其他key對應取值。

以上的2和3其實使用的是同樣的方法,只是途徑不一樣。

通過以上的分析我們不難看出,通過cookie傳遞session id,將session存儲于memcache服務器中是為一個比較合理的選擇。當出現跨域的情況是,可以使用p3p跨域設置cookie。而當客戶端禁用cookie的情況下,可以設置php.ini,通過url自動傳遞session id。

24:概述反射和序列化

序列化:

serialize() 把變量和它們的值編碼成文本形式

unserialize() 恢復原先變量

25:session喜歡丟值且占用內存,Cookie不安全,請問用什么辦法代替這兩種原始的方法
redis 或者 memcache。

26:反射

反射是在PHP運行狀態中,擴展分析PHP程序,導出或提取出關于類、方法、屬性、參數等的詳細信息,包括注釋。這種動態獲取的信息以及動態調用對象的方法的功能稱為反射API。

反射是操縱面向對象范型中元模型的API,其功能十分強大,可幫助我們構建復雜,可擴展的應用。

其用途如:自動加載插件,自動生成文檔,甚至可用來擴充PHP語言。

php反射api由若干類組成,可幫助我們用來訪問程序的元數據或者同相關的注釋交互。借助反射我們可以獲取諸如類實現了那些方法,創建一個類的實例(不同于用new創建),調用一個方法(也不同于常規調用),傳遞參數,動態調用類的靜態方法。

反射api是php內建的oop技術擴展,包括一些類,異常和接口,綜合使用他們可用來幫助我們分析其它類,接口,方法,屬性,方法和擴展。這些oop擴展被稱為反射。

通過ReflectionClass,我們可以得到Person類的以下信息:

1)常量 Contants

2)屬性 Property Names

3)方法 Method Names靜態

4)屬性 Static Properties

5)命名空間 Namespace

6)Person類是否為final或者abstract

27:請使用正則寫一個函數驗證電子郵件的格式是否正確?

preg_match('/^[\w\-\.]+@[\w\-]+(\.\w+)+$/',$email);

 

28:面向對象

三大特性:封裝、繼承、多態(方法重寫)。

抽象類:abstract,至少有一個方法是抽象方法,不能被實例化,為子類定義公共接口。

接口:interface,解決php的單繼承問題,所有方法都是public訪問權限的抽象方法,不能聲明變量只能聲明常量。

繼承一個類的同時實現多個接口

  1. class A extends B implements 接口1,接口2...,接口n(){
  2. //實現所有接口中的方法
  3. }

29:進程和線程定義,區別和聯系。

進程的狀態:運行run、就緒ready、等待wait

① 、定義

進程是具有一定獨立功能的程序關于某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位.

線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源.

②、關系

一個線程可以創建和撤銷另一個線程;同一個進程中的多個線程之間可以并發執行.

相對進程而言,線程是一個更加接近于執行體的概念,它可以與同進程中的其他線程共享數據,但擁有自己的棧空間,擁有獨立的執行序列。

③、區別

進程和線程的主要差別在于它們是不同的操作系統資源管理方式。進程有獨立的地址空間,一個進程崩潰后,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不同執行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等于整個進程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對于一些要求同時進行并且又要共享某些變量的并發操作,只能用線程,不能用進程。

1) 簡而言之,一個程序至少有一個進程,一個進程至少有一個線程.

2) 線程的劃分尺度小于進程,使得多線程程序的并發性高。

3) 另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。

4) 線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。

5) 從邏輯角度來看,多線程的意義在于一個應用程序中,有多個執行部分可以同時執行。但操作系統并沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。

④、優缺點

線程和進程在使用上各有優缺點:線程執行開銷小,但不利于資源的管理和保護;而進程正相反。同時,線程適合于在SMP機器上運行,而進程則可以跨機器遷移。

30:Include require include_once require_once 的區別.

處理失敗方式不同:

require 失敗時會產生一個致命級別錯誤,并停止程序運行。

include 失敗時只產生一個警告級別錯誤,程序繼續運行。

include_once/require_once和include/require 處理錯誤方式一樣,

唯一區別在于當所包含的文件代碼已經存在時候,不在包含。

31:HEREDOC介紹

一種定義字符串的方法。

結構:

<<<。在該提示符后面,要定義個標識符(單獨一行),

然后是一個新行。接下來是字符串 本身,

最后要用前面定義的標識符作為結束標志(單獨一行)

注意:

標識符的命名也要像其它標簽一樣遵守PHP的規則:

只能包含字母、數字和下劃線,并且必須以字母和下劃線作為開頭

32:寫出一些php魔幻(術)方法

__construct() 實例化類實自動調用

——destruct() 類對象使用結束時自動調用

__set() 在給未定義的屬性賦值時調用

__get() 調用未定義的屬性時調用哦

__isset() 使用isset()或empty()函數的時候調用

__unset() 使用unset()函數的時候調用

__sleep() 使用serialize序列化的時候調用

__wakeup() 使用unserialize()反序列化的時候調用

__call() 調用一個不存在的方法時調用

__callStatic() 調用一個不存在的靜態方法時調用

__toString() 把對象轉換Wie字符串的是調用,比如echo

__clone() 當使用clone復制一個對象時候調用。

__invoke() 當嘗試把對象當方法調用時調用。

__set_state() 當使用var_export()函數時候調用。接受一個數組參數。

33:一些編譯php時的configure 參數

–prefix=/usr/local/php php安裝目錄

–with-config-file-path=/usr/local/php/etc 指定php.ini位置

–with-mysql=/usr/local/mysql mysql安裝目錄,對mysql的支持

–with-mysqli=/usr/local/mysql/bin/mysql_config mysqli文件目錄,優化支持

–enable-safe-mode 打開安全模式

–enable-ftp 打開ftp的支持

–enable-zip 打開對zip的支持

–with-bz2 打開對bz2文件的支持

–with-jpeg-dir 打開對jpeg圖片的支持

–with-png-dir 打開對png圖片的支持

–with-freetype-dir 打開對freetype字體庫的支持

–without-iconv關閉iconv函數,種字符集間的轉換

–with-libxml-dir 打開libxml2庫的支持

–with-xmlrpc 打開xml-rpc的c語言

–with-zlib-dir 打開zlib庫的支持

–with-gd 打開gd庫的支持

34:向php傳入參數的三種方法。

方法一 使用$argc $argv

方法二 使用getopt函數()

方法三 提示用戶輸入,然后獲取輸入的參數。有點像C語言

35:error_reporting 等調試函數使用

error_reporting() 函數能夠在運行時設置php.ini中 error_reporting 指令。

所以可以再程序中隨時調節顯示的錯誤級別。

使用此函數時 display_errors必須是打開狀態。

36:寫一段上傳文件的代碼。

upload.html

  1. <span style="white-space:pre"> </span><form enctype="multipart/form-data" method="POST" action="upload.php">
  2. Send this file: <input name="name" type="file" />
  3. <input type="submit" value="Send File" />
  4. </form>

upload.php

  1. <span style="white-space:pre"> </span>$uploads_dir = '/uploads';
  2. foreach ($_FILES["error"] as $key => $error) {
  3. if ($error == UPLOAD_ERR_OK) {
  4. $tmp_name = $_FILES["tmp_name"][$key];
  5. $name = $_FILES["name"][$key];
  6. move_uploaded_file($tmp_name, "$uploads_dir/$name");
  7. }
  8. }

37:寫代碼來解決多進程/線程同時讀寫一個文件的問題。

PHP是不支持多線程的,可以使用php的flock加鎖函數實現。

  1. <span style="white-space:pre"> </span>$fp = fopen("/tmp/lock.txt", "w+");
  2. if (flock($fp, LOCK_EX)) { // 進行排它型鎖定
  3. fwrite($fp, "Write something here\n");
  4. flock($fp, LOCK_UN); // 釋放鎖定
  5. } else {
  6. echo "Couldn't lock the file !";
  7. }
  8. fclose($fp);

38:$_POST/$HTTP_RAW_POST_DATA和php://input的區別

$_POST是獲取表單提交的數據,media type是"applicaiton/x-www-form-urlencoded"。字段名和值都進行了編碼,每個key-value隊使用‘$’分隔,key和value使用‘=’分開,其他特殊字符都會被urlencode進行編碼

$HTTP_RAW_POST_DATA:可以獲取原始的POST數據,但需要在php.ini中設置開啟,并且不支持enctype='multipart/form-data'方式傳遞的數據

php://input:可以獲取POST數據,但是比$HTTP_RAW_POST_DATA跟少的消耗內存,也不支持‘multipart/form-data’

39:PHP常用的設計模式:

1).簡單工廠模式

##工廠模式是一種類,具有為您創建對象的某些方法。可以用工廠類創建對象而不直接使用new方法

特點:

1.抽象基類:類中定義抽象一些方法,用以在子類中實現

2.繼承自抽象基類的子類:實現基類中的抽象方法

3.工廠類:用以實例化所有相對應的子類

代碼實例;

  1. <span style="white-space:pre"> </span>/**
  2. * 定義個抽象的類,讓子類去繼承實現它
  3. */
  4. abstract class Operation{
  5. //抽象方法不能包含函數體
  6. abstract public function getValue($num1,$num2);//強烈要求子類必須實現該功能函數
  7. }
  8. /**
  9. * 加法類
  10. */
  11. class OperationAdd extends Operation {
  12. public function getValue($num1,$num2){
  13. return $num1+$num2;
  14. }
  15. }
  16. /**
  17. * 減法類
  18. */
  19. class OperationSub extends Operation {
  20. public function getValue($num1,$num2){
  21. return $num1-$num2;
  22. }
  23. }
  24. /**
  25. * 工程類,主要用來創建對象
  26. * 功能:根據輸入的運算符號,工廠就能實例化出合適的對象
  27. */
  28. class Factory{
  29. public static function createObj($operate){
  30. switch ($operate){
  31. case '+':
  32. return new OperationAdd();
  33. break;
  34. case '-':
  35. return new OperationSub();
  36. break;
  37. case '*':
  38. return new OperationSub();
  39. break;
  40. case '/':
  41. return new OperationDiv();
  42. break;
  43. }
  44. }
  45. }
  46. $test=Factory::createObj('/');
  47. $result=$test->getValue(23,0);
  48. echo $result;

2).單例模式--數據庫應用

特點:

a是某個類只能有一個實例;

b是它必須自行創建這個實例;

c是它必須自行向整個系統提供這個實例

為什么要使用PHP單例模式:

1. php的應用主要在于數據庫應用, 一個應用中會存在大量的數據庫操作, 在使用面向對象的方式開發時, 如果使用單例模式, 則可以避免大量的new 操作消耗的資源,還可以減少數據庫連接這樣就不容易出現 too many connections情況。

2. 如果系統中需要有一個類來全局控制某些配置信息, 那么使用單例模式可以很方便的實現. 這個可以參看zend Framework的FrontController部分。

3. 在一次頁面請求中, 便于進行調試, 因為所有的代碼(例如數據庫操作類db)都集中在一個類中, 我們可以在類中設置鉤子, 輸出日志,從而避免到處var_dump, echo。

3).觀察者模式
觀察者模式屬于行為模式,是定義對象間的一種一對多的依賴關系,以便當一個對象的狀態發生改變時,所有依 賴于它的對象都得到通知并自動刷新。

4).策略模式

在此模式中,算法是從復雜類提取的,因而可以方便地替換.例如,如果要更改搜索引擎中排列頁的方法,則策略模式是一個不錯的選擇。思考一下搜索引擎的幾個部分 —— 一部分遍歷頁面,一部分對每頁排列,另一部分基于排列的結果排序。在復雜的示例中,這些部分都在同一個類中。通過使用策略模式,您可將排列部分放入另一個類中,以便更改頁排列的方式,而不影響搜索引擎的其余代碼。
此模式非常適合復雜數據管理系統或數據處理系統,二者在數據篩選、搜索或處理的方式方面需要較高的靈活性

5).命令鏈模式

40:抽象類和接口

抽象類abstract class

1 .抽象類是指在 class 前加了 abstract 關鍵字且存在抽象方法的類(在類方法 function 關鍵字前加了 abstract 關鍵字)

2.抽象類不能被直接實例化。抽象類中只定義(或部分實現)子類需要的方法。子類可以通過繼承抽象類并通過實現抽象類中的所有抽象方法,使抽象類具體化。

3.如果子類需要實例化,前提是它實現了抽象類中的所有抽象方法。如果子類沒有全部實現抽象類中的所有抽象方法,那么該子類也是一個抽象類,必須在 class 前面加上 abstract 關鍵字,并且不能被實例化。

  1. <span style="white-space:pre"> </span>abstract class A{
  2. /** 抽象類中可以定義變量 */
  3. protected $value1 = 0;
  4. private $value2 = 1;
  5. public $value3 = 2;
  6. /** 也可以定義非抽象方法 */
  7. public function my_print(){
  8. echo "hello,world/n";
  9. }
  10. /**
  11. * 大多數情況下,抽象類至少含有一個抽象方法。抽象方法用abstract關鍵字聲明,其中不能有具體內容。
  12. * 可以像聲明普通類方法那樣聲明抽象方法,但是要以分號而不是方法體結束。也就是說抽象方法在抽象類中不能被實現,也就是沒有函數體“{some codes}”。
  13. */
  14. abstract protected function abstract_func1();
  15. abstract protected function abstract_func2();
  16. }
  17. abstract class B extends A{
  18. public function abstract_func1(){
  19. echo "implement the abstract_func1 in class A/n";
  20. }
  21. /** 這么寫在zend studio 8中會報錯*/
  22. //abstract protected function abstract_func2();
  23. }
  24. class C extends B{
  25. public function abstract_func2(){
  26. echo "implement the abstract_func2 in class A/n";
  27. }
  28. }

41:以下輸出結果為7,因為=是賦值的意思

  1. $z=2;
  2. $x=$z+$z+$z=3;
  3. echo $x;

42:請介紹Session的原理,大型網站中Session方面應注意什么?

PHP SESSION原理:

session是在服務器端保持用戶會話數據的一種方法,對應的cookie是 在客戶端保持用戶數據。

首先要將客戶端和服務器端建立一一聯系,每個客戶 端都得有一個唯一標識,這樣服務器才能識別出來。建議唯一標識的方法有兩種:cookie或者通過GET方式指定。默認配置的PHP使用session的 時會建立一個名叫”PHPSESSID”的cookie(可以通過php.ini修改session.name值指定),如果客戶端禁用cookie,你 也可以指定通過GET方式把session id傳到服務器(修改php.ini中session.use_trans_sid等參數)。

session是保存的服務端的,在服務器端session.save_path目錄會發現很多類似sess_vv9lpgf0nmkurgvkba1vbvj915這樣的文件,這個就是session id "vv9lpgf0nmkurgvkba1vbvj915"對應的數據。客戶端將session id傳遞到服務器,服務器根據session id找到對應的文件,讀取的時候對文件內容進行反序列化就得到session的值,保存的時候先序列化再寫入。

session影響系統性能:

session 在大訪問量網站上確實影響系統性能,影響性能的原因之一由文件系統設計造成,在同一個目錄下超過10000個文件時,文件的定位將非常耗時,PHP支持 session目錄hash,我們可以通過修改php.ini中session.save_path = “2;/path/to/session/dir”,那么session將存儲在兩級子目錄中,每個目錄有16個子目錄[0~f],不過好像PHP session不支持創建目錄,你需要事先把那么些目錄創建好 。

session數據都不會太大(1~2K),如果有大量這樣1~2K的文件在磁盤上,IO效率肯定會很差

存儲session的方式有很多種,可以通過php -i|grep “Registered save handlers”查看。比如memcached,mysql等

session的同步

1.如果存儲在memcached或者MySQL中比較容易,

2.如果是文件形式的,你可以用NFS統一存儲。

3.通過加密的cookie來實現

4.在負載均衡那一層保持會話,把訪問者綁定在某個服務器上,他的所有訪問都在那個服務器上就不需要session同步了,這些都是運維層面的東西。

43:禁用cookie的session使用方案

1.url傳值,

2.通過隱藏表單提交,

3.配置php.ini將session.use_trans_sid設為1,

4.用文件或數據庫等形式保存session_id,在跨頁過程中手動調用

44:PHP緩存技術有哪些?

1)、全頁面靜態化緩存。也就是將頁面全部生成html靜態頁面,用戶訪問時直接訪問的靜態頁面,而不會去走php服務器解析的流程。此種方式,在CMS系統中比較常見,比如dedecms;

Ob_start()

******要運行的代碼*******

$content = Ob_get_contents();

****將緩存內容寫入html文件*****

Ob_end_clean();

2)、頁面部分緩存

該種方式,是將一個頁面中不經常變的部分進行靜態緩存,而經常變化的塊不緩存,最后組裝在一起顯示;可以使用類似于ob_get_contents的方式實現,也可以利用類似ESI之類的頁面片段緩存策略,使其用來做動態頁面中相對靜態的片段部分的緩存(ESI技術,請baidu,此處不詳講)。

該種方式可以用于如商城中的商品頁;

3)、數據緩存

顧名思義,就是緩存數據的一種方式;比如,商城中的某個商品信息,當用商品id去請求時,就會得出包括店鋪信息、商品信息等數據,此時就可以將這些數據緩存到一個php文件中,文件名包含商品id來建一個唯一標示;下一次有人想查看這個商品時,首先就直接調這個文件里面的信息,而不用再去數據庫查詢;其實緩存文件中緩存的就是一個php數組之類;

Ecmall商城系統里面就用了這種方式;

4)、查詢緩存

其實這跟數據緩存是一個思路,就是根據查詢語句來緩存;將查詢得到的數據緩存在一個文件中,下次遇到相同的查詢時,就直接先從這個文件里面調數據,不會再去查數據庫;但此處的緩存文件名可能就需要以查詢語句為基點來建立唯一標示;

按時間變更進行緩存

其實,這一條不是真正的緩存方式;上面的2、3、4的緩存技術一般都用到了時間變更判斷;就是對于緩存文件您需要設一個有效時間,在這個有效時間內,相同的訪問才會先取緩存文件的內容,但是超過設定的緩存時間,就需要重新從數據庫中獲取數據,并生產最新的緩存文件;比如,我將我們商城的首頁就是設置2個小時更新一次;

5)、按內容變更進行緩存

這個也并非獨立的緩存技術,需結合著用;就是當數據庫內容被修改時,即刻更新緩存文件;

比如,一個人流量很大的商城,商品很多,商品表必然比較大,這表的壓力也比較重;我們就可以對商品顯示頁進行頁面緩存;

當商家在后臺修改這個商品的信息時,點擊保存,我們同時就更新緩存文件;那么,買家訪問這個商品信息時,實際上訪問的是一個靜態頁面,而不需要再去訪問數據庫;

試想,如果對商品頁不緩存,那么每次訪問一個商品就要去數據庫查一次,如果有10萬人在線瀏覽商品,那服務器壓力就大了;

6)、內存式緩存

提到這個,可能大家想到的首先就是Memcached;memcached是高性能的分布式內存緩存服務器。

一般的使用目的是,通過緩存數據庫查詢結果,減少數據庫訪問次數,以提高動態Web應用的速度、 提高可擴展性。

它就是將需要緩存的信息,緩存到系統內存中,需要獲取信息時,直接到內存中取;比較常用的方式就是 key–>value方式;

  1. <?php
  2. $memcachehost = '192.168.6.191';
  3. $memcacheport = 11211;
  4. $memcachelife = 60;
  5. $memcache = new Memcache;
  6. $memcache->connect($memcachehost,$memcacheport) or die ("Could not connect");
  7. $memcache->set('key','緩存的內容');
  8. $get = $memcache->get($key); //獲取信息
  9. ?>

7)、apache緩存模塊

apache安裝完以后,是不允許被cache的。如果外接了cache或squid服務器要求進行web加速的話,就需要在htttpd.conf里進行設置,當然前提是在安裝apache的時候要激活mod_cache的模塊。

安裝apache時:./configure –enable-cache –enable-disk-cache –enable-mem-cache

8)、php APC緩存擴展

Php有一個APC緩存擴展,windows下面為php_apc.dll,需要先加載這個模塊,然后是在php.ini里面進行配置:

  1. [apc]
  2. extension=php_apc.dll
  3. apc.rfc1867 = on
  4. upload_max_filesize = 100M
  5. post_max_size = 100M
  6. apc.max_file_size = 200M
  7. upload_max_filesize = 1000M
  8. post_max_size = 1000M
  9. max_execution_time = 600 ; 每個PHP頁面運行的最大時間值(秒),默認30秒
  10. max_input_time = 600 ; 每個PHP頁面接收數據所需的最大時間,默認60
  11. memory_limit = 128M ; 每個PHP頁面所吃掉的最大內存,默認8M

9)、Opcode緩存

首先php代碼被解析為Tokens,然后再編譯為Opcode碼,最后執行Opcode碼,返回結果;所以,對于相同的php文件,第一次運行時可以緩存其Opcode碼,下次再執行這個頁面時,直接會去找到緩存下的opcode碼,直接執行最后一步,而不再需要中間的步驟了。

比較知名的是XCache、Turck MM Cache、PHP Accelerator等。

45:返回由對象屬性組成的關聯數組:get_object_vars

  1. class object1 {
  2. private $a = NULL;
  3. public $b = 123;
  4. public $c = 'public';
  5. private $d = 'private';
  6. static $e = 'static';
  7. public function test(){
  8. echo "<pre>";
  9. print_r(get_object_vars($this));
  10. echo "<pre>";
  11. }
  12. }
  13. $test = new object1();
  14. //print_r(get_object_vars($test));
  15. $test->test();
  16. ?>
  17. 輸出:
  18. Array (
  19. [a] =>
  20. [b] => 123
  21. [c] => public
  22. [d] => private
  23. )
  24. 如果把//print_r(get_object_vars($test));的注釋打開的話,則輸出:
  25. Array (
  26. [b] => 123
  27. [c] => public
  28. )
  29. 也就是說在外面只會彈出public的非靜態的屬性;

46.php函數:從數組中取出一段的函數是 array_slice();

dirname() 函數返回路徑中的目錄部分。

basename()返回路徑中的文件名部分。

realpath()返回絕對路徑名。

file_exists()檢查文件或目錄是否存在。

file_get_contents()將文件讀入字符串。

flock()鎖定或釋放文件。

fopen()打開一個文件或URL。

is_dir()判斷指定的文件名是否是一個目錄。

is_file()判斷指定文件是否為常規的文件。

mkdir()創建目錄。

pathinfo()返回關于文件路徑的信息。

func_get_args() 返回包含所有參數的數組

變量的類型轉換和判斷類型方法。

1:網絡狀態碼含義,常用(204,304, 404, 504,502)。

2:Apache配置文件,PHP配置文件,各個含義字段的含義。

3:php運算符優先級,一般是寫出運算符的運算結果。

4:PHP中函數傳參,閉包,判斷輸出的echo,print是不是函數等。

5:PHP數組,數組函數,數組遍歷,預定義數組(面試必出)。

6:PHP面向對象,魔術方法,封裝、繼承、多態。設計模式,包括(單利、工廠、迭代器、裝飾、命令、策略)。

7:正則表達式,每個標號含義,郵箱、網址、標簽匹配,正則函數。

8:PHP異常處理(級別,錯誤日志,控制錯誤輸出)。

9:PHP時間函數,日期計算函數。

10:文件系統,記錄日志、目錄、文件的遍歷、上傳、多方法得到文件擴展名、文件引用方式、引用函數區別。(面試必出)。

11:會話控制,主要說原理。session與cookie在分布式應用中出現問題的解決方案。

12:PHP模板引擎,常用模板引擎特點,MVC好與不好的地方。

13:PHP安全處理,過濾函數。

14:XML的使用。

15:PHP字符串的處理,包括轉義(安全)、編碼、截取、定位、與數組間的轉換、處理函數等。(面試必出)。

16:Socket編程,各種協議,head頭,curl參數含義。

 

PHP寫函數

1.請實現一個函數,輸入1-1億之間的任意整數,返回其中文。

  1. <?php
  2. function num2Chinese($num){
  3. $char= array('零','一','二','三','四','五','六','七','八','九');
  4. $unit = array('','十','百','千','','萬','億','兆');
  5. $str = strrev($num);
  6. for($i = 0,$c = strlen($str);$i < $c;$i++) {
  7. $out[$i] = $char[$str[$i]];
  8. $out[$i] .= $str[$i] != '0'? $unit[$i%4] : '';
  9. if($i>1 and $str[$i]+$str[$i-1] == 0){
  10. $out[$i] = '';
  11. }
  12. if($i%4 == 0){
  13. $out[$i] .= $unit[4+floor($i/4)];
  14. }
  15. }
  16. $retval = join('',array_reverse($out)) ;
  17. return $retval;
  18. }
  19. echo num2Chinese(20160348);
  20. ?>

2.寫5個不同的自己的函數,來截取一個全路徑的文件的擴展名,允許封裝php庫中已有的函數。url dir/upload.image.jpg找出jpg或者.jpg

  1. 1.return strrchr($filename,"."));
  2. strrchr() 函數查找字符串在另一個字符串中最后一次出現的位置,并返回從該位置到字符串結尾的所有字符。
  3. 2.return substr($filename,strrpos($filname,"."));
  4. strrpos() 函數查找字符串在另一字符串中最后一次出現的位置。
  5. substr(string,start,length) 函數返回字符串的一部分。
  6. 3.return array_pop(explode(".",$filename));
  7. 4.$p=pathinfo($filename); return $p['extension'];
  8. 5. return strrev(substr(strrev($filanme),o,strpos(strrev($filename),".")));

HTML

1.如下HTML:<img title=’aaaa’ sina_title=’bbbb’ id=’img1′>,

用js取得 document.getElementById(‘img1′); 方法取得該對象;

document.getElementById(‘img1′).getAttribute(‘title’); 屬性取得屬性title的屬性值;

document.getElementById(‘img1′).getAttribute(‘sina_title’); 方法取得屬性sina_title的屬性值;

MySQL

1:mysql has gone away的原因是什么?

一般情況下是由于max_allowed_packet設置的值過小導致的,max_allowed_packet用來控制緩沖區的包大小,有時在導入數據的時候,此值過小就容易造成緩沖區容量不夠。將my.ini或my.cnf中的此值設置大一些即可解決。

還有一種可能是連接數據庫時使用了單例模式,多次操作數據庫但都使用的是同一個連接,由于mysql處理每個線程也是隊列模式,當前一個操作還沒執行完畢并且間隔小于wait_timeout所設置的值時就容易出現此問題,解決辦法是將wait_timeout的值設置大一些。

2:mysql優化方式

MYSQL 優化常用方法:

1)、選取最適用的字段屬性。

MySQL可以很好的支持大數據量的存取,但是一般說來,數據庫中的表越小,在它上面執行的查詢也就會越快。在可能的情況下,應該盡量把字段設置為NOT NULL,這樣在將來執行查詢的時候,數據庫不用去比較NULL值。對于某些文本字段,例如“省份”或者“性別”,我們可以將它們定義為ENUM類型。因為在MySQL中,ENUM類型被當作數值型數據來處理,而數值型數據被處理起來的速度要比文本類型快得多。

2)、使用連接(JOIN)來代替子查詢(Sub-Queries)。

MySQL從4.1開始支持SQL的子查詢。子查詢可以把一個結果作為過濾條件用在另一個查詢中,如:DELETE FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo ) ,使用子查詢可以一次性的完成很多邏輯上需要多個步驟才能完成的SQL操作,同時也可以避免事務或者表鎖死,并且寫起來也很容易。但是,有些情況下,子查詢可以被更有效率的連接(JOIN).. 替代,例如SELECT * FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo ) ,如果使用連接(JOIN)來完成這個查詢工作,速度將會快很多。尤其是當salesinfo表中對CustomerID建有索引的話,性能將會更好,查詢如下:SELECT * FROM customerinfo LEFT JOIN salesinfoON customerinfo.CustomerID=salesinfo. CustomerID WHERE salesinfo.CustomerID IS NULL。 連接(JOIN).. 之所以更有效率一些,是因為 MySQL不需要在內存中創建臨時表來完成這個邏輯上的需要兩個步驟的查詢工作。

3)、使用聯合(UNION)來代替手動創建的臨時表

MySQL從4.0的版本開始支持UNION查詢,它可以把需要使用臨時表的兩條或更多的SELECT查詢合并的一個查詢中。在客戶端的查詢會話結束的時候,臨時表會被自動刪除,從而保證數據庫整齊、高效。使用UNION來創建查詢的時候,我們只需要用UNION作為關鍵字把多個SELECT語句連接起來就可以了,要注意的是所有SELECT語句中的字段數目要想同。

示例:

SELECT Name, Phone FROM client UNION SELECT Name, BirthDate FROM author UNION SELECT Name, Supplier FROM product

4)、事務

事務可以保持數據庫中數據的一致性和完整性。事物以BEGIN關鍵字開始,COMMIT關鍵字結束。在這之間的一條SQL操作失敗,那么,ROLLBACK命令就可以把數據庫恢復到BEGIN開始之前的狀態。 示例:

  1. <span style="white-space:pre"> </span>BEGIN;
  2. INSERT INTO salesinfo SET CustomerID=14;
  3. UPDATE inventory SET Quantity=11
  4. WHERE item='book';
  5. COMMIT;

事務的另一個重要作用是當多個用戶同時使用相同的數據源時,它可以利用鎖定數據庫的方法來為用戶提供一種安全的訪問方式,這樣可以保證用戶的操作不被其它的用戶所干擾。

5)、鎖定表

盡管事務是維護數據庫完整性的一個非常好的方法,但卻因為它的獨占性,有時會影響數據庫的性能,尤其是在很大的應用系統中。由于在事務執行的過程中,數據庫將會被鎖定,因此其它的用戶請求只能暫時等待直到該事務結束。其實,有些情況下我們可以通過鎖定表的方法來獲得更好的性能。示例:

  1. <span style="white-space:pre"> </span>LOCK TABLE inventory WRITE
  2. SELECT Quantity FROM inventory
  3. WHEREItem='book';
  4. ...
  5. UPDATE inventory SET Quantity=11
  6. WHEREItem='book';
  7. UNLOCK TABLES

6)、使用外鍵 (FOREIGN KEY)

鎖定表的方法可以維護數據的完整性,但是它卻不能保證數據的關聯性。這個時候我們就可以使用外鍵。如果要在MySQL中使用外鍵,一定要記住在創建表的時候將表的類型定義為事務安全表 InnoDB類型。

7)、使用索引

索引是提高數據庫性能的常用方法,尤其是在查詢語句當中包含有MAX()、MIN()和ORDERBY這些命令的時候,性能提高更為明顯。一般說來,索引應建立在那些將用于JOIN、WHERE判斷和ORDER BY排序的字段上。

8)、優化的查詢語句

首先,最好是在相同類型的字段間進行比較的操作。如不能將一個建有索引的INT字段和BIGINT字段進行比較;但是作為特殊的情況,在CHAR類型的字段和 VARCHAR類型字段的字段大小相同的時候,可以將它們進行比較。

其次,在建有索引的字段上盡量不要使用函數進行操作。 例如,在一個DATE類型的字段上使用YEAE()函數時,將會使索引不能發揮應有的作用。所以,下面的兩個查詢雖然返回的結果一樣,但后者要比前者快得多。

  1. <span style="white-space:pre"> </span>SELECT * FROM order WHERE YEAR(OrderDate)<2001;
  2. SELECT * FROM order WHERE OrderDate<"2001-01-01";

第三,在搜索字符型字段時,我們有時會使用 LIKE 關鍵字和通配符,這種做法雖然簡單,但卻也是以犧牲系統性能為代價的。例如:

  1. SELECT * FROM books
  2. WHERE name like "MySQL%"
  3. 但是如果換用下面的查詢,返回的結果一樣,但速度就要快上很多:
  4. SELECT * FROM books
  5. WHERE name&gt;="MySQL"and name&lt;"MySQM"

最后,應該注意避免在查詢中讓MySQL進行自動類型轉換,因為轉換過程也會使索引變得不起作用。

3:MYSQL數據表類型有哪些?

MyISAM、InnoDB、HEAP、BOB,ARCHIVE,CSV等

MyISAM:成熟、穩定、易于管理,快速讀取。一些功能不支持(事務等),表級鎖。

InnoDB:支持事務、外鍵等特性、數據行鎖定。空間占用大,不支持全文索引等。

存儲引擎MyISAM和InnoDB的區別:

一、InnoDB支持事務,MyISAM不支持,這一點是非常之重要。事務是一種高級的處理方式,如在一些列增刪改中只要哪個出錯還可以回滾還原,而MyISAM就不可以了。

二、MyISAM適合查詢以及插入為主的應用,InnoDB適合頻繁修改以及設計到安全性就高的應用

三、InnoDB支持外鍵,MyISAM不支持

四、MyISAM是默認引擎,InnoDB需要指定

五、InnoDB不支持FULLTEXT類型的索引

六、InnoDB中不保存表的行數,如select count(*) from table時,InnoDB需要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出保存好的行數即可。注意的是,當count(*)語句包含where條件時MyISAM也需要掃描整個表

七、對于自增長的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中可以和其他字段一起建立聯合索引

八、清空整個表時,InnoDB是一行一行的刪除,效率非常慢。MyISAM則會重建表

九、InnoDB支持行鎖(某些情況下還是鎖整表,如 update table set a=1 where user like '%lee%'

4:PHP中防sql注入方法

mysql_escape_string(strip_tags($arr["$val"]));

5:mysql數據庫,一天五萬條以上的增量,預計運維三年怎么優化

a. 設計良好的數據庫結構,允許部分數據冗余,盡量避免join查詢,提高效率。

b. 選擇合適的表字段數據類型和存儲引擎,適當的添加索引。

c. mysql庫主從讀寫分離。

d. 找規律分表,減少單表中的數據量提高查詢速度。

e. 添加緩存機制,比如memcached,apc等。

f. 不經常改動的頁面,生成靜態頁面。

g. 書寫高效率的SQL。比如 SELECT * FROM TABEL 改為 SELECT field_1, field_2, field_3 FROM TABLE.

6:(mysql)請寫出數據類型(int char varchar datetime text)的意思; 請問varchar和char有什么區別;

int : 數值類型

char : 固定長度字符串類型

varchar : 可變長度字符串類型

datetime : 時期時間類型

text : 文本類型

varchar和char有什么區別:

a. char 長度是固定的,不管你存儲的數據是多少他都會都固定的長度。而varchar則處可變長度但他要在總長度上加1字符,這個用來存儲位置。

b. char 固定長度,所以在處理速度上要比varchar快速很多,但是浪費存儲空間,

所以對存儲不大,但在速度上有要求的可以使用char類型,反之可以用varchar類型來實例。

7:Mysql 的存儲引擎,myisam和innodb的區別。

a. MyISAM類型不支持事務處理等高級處理,而InnoDB類型支持.

b. MyISAM類型的表強調的是性能,其執行數度比InnoDB類型更快.

c. InnoDB不支持FULLTEXT類型的索引.

d. InnoDB 中不保存表的具體行數,也就是說,執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出保存好的行數即可.

e. 對于AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中,可以和其他字段一起建立聯合索引。

f. DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的刪除。

g. LOAD TABLE FROM MASTER操作對InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,導入數據后再改成InnoDB表,但是對于使用的額外的InnoDB特性(例如外鍵)的表不適用.

h. MyISAM支持表鎖,InnoDB支持行鎖。

LINUX

1:Linux服務器上有一個訪問日志文件,格式如下:

172.17.0.31--[17/Mar/2016:15:59:40 +0800] "POST /User/get HTTP/1.1" 200 1209 "-" "order" "-" 17

其中,order字段記錄了調用方的系統名稱,最后的17為本次查詢的響應時間,使用SHEEL或者PHP來統計調用方為order的所有接口的平均響應時間。

awk '$9 ~ /order/ {++S[$11]}END{for (a in S) print (sum+=S[a])/a}' file

HTTP

1:長連接和短連接的使用

長連接,指在一個TCP連接上可以連續發送多個數據包,在TCP連接保持期間,如果沒有數據包發送,需要雙方發檢測包以維持此連接,一般需要自己做在線維持。

長連接通常就是:

連接→數據傳輸→保持連接(心跳)→數據傳輸→保持連接(心跳)→……→關閉連接;

長連接多用于操作頻繁,點對點的通訊,而且連接數不能太多情況,

例如:數據庫的連接用長連接, 如果用短連接頻繁的通信會造成socket錯誤,而且頻繁的socket 創建也是對資源的浪費。

短連接是指通信雙方有數據交互時,就建立一個TCP連接,數據發送完成后,則斷開此TCP連接,

操作步驟是:

連接→數據傳輸→關閉連接;

例如:一般銀行都使用短連接。 WEB網站的http服務一般都用短鏈接

2:LAMP與LNMP架構的區別及其具體的選擇說明

LAMP和LNMP最主要的區別在于:

一個使用的是Apache,一個使用的是Nginx。

Apache是世界是用排名第一的Web服務器軟件,其幾乎可以在所有廣泛使用的計算機平臺上運營,由于其跨平臺和安全性被廣泛使用,是最流行的Web服務端軟件之一。相比于nginx,apache有些臃腫,內存和CPU開銷較大,性能上有損耗,nginx對于靜態文件的響應能力遠高apache。

Apache是負載PHP的最佳選擇,如果流量很大的話,可以使用nginx來負載非PHP的Web請求。在整個IT界而言,70%的流量訪問均來源于Apache。

Nginx是一款高性能額Http和反向代理服務器,也是一個AMAP/POP3/SMTP服務器,Nginx是由Igor Sysoev為俄羅斯訪問量第二的Rambler.ru站點開發的。相比于Apache,nginx使用資源更少,支持更多并發連接,效率更高,作為負載均衡服務器。nginx即可對內進行支持,也可對外進行服務。其還是一款非常優秀的郵件代理服務器,安裝簡單,配置簡介。

LNMP是Linux+Nginx+Mysql+PHP的組合方式,其特點是利用Nginx的快速與輕量級,替代以前的LAMP(Linux+Apache+Mysql+PHP)的方式。由于安裝方便,并且安裝腳本也隨時更新。
LNMP方式的優點:占用VPS資源較少,Nginx配置起來也比較簡單,利用fast-cgi的方式動態解析PHP腳本。

LNMP方式的缺點:php-fpm組件的負載能力有限,在訪問量巨大的時候,php-fpm進程容易僵死,容易發生502 bad gateway錯誤
綜上所述:

基于 LAMP 架構設計具有成本低廉、部署靈活、快速開發、安全穩定等特點,是 Web 網絡應用和環境的優秀組合。若是服務器配置比較低的個人網站,當然首選 LNMP 架構。

當然,在大流量的時候。把Apache和Nginx結合起來使用,也不失為一個不錯選擇,如下:

LNAMP是Linux+Nginx+Apache+Mysql+PHP的組合方式,其特點是利用Nginx來作為靜態腳本的解析,而利用 Nginx的轉發特性,將動態腳本的解析轉交給Apache來處理,這樣,能充分利用兩種Web服務器的特點,對于訪問量需求較大的站點來說,是一個很不錯的選擇。

LNAMP方式的優點:由于Apache本身處理PHP的能力比起php-fpm要強,所以不容易出現類似502 bad gateway的錯誤。適合訪問量較大的站點使用。

LNAMP方式的缺點:相比LNMP方式會多占用一些資源,另外,配置虛擬主機需要同時修改Nginx和Apache的配置文件,要稍微麻煩一些。

3:memcached、redis、mongodb的區別聯系

3個場景完全不同的東西。

1).memcached:單一鍵值對內存緩存的,做對象緩存無可替代的分布式緩存;

2).redis:是算法和數據結構的集合,快速的數據結構操作是他最大的特點,支持數據持久化;

3).mongodb是bson結構、介于rdb和nosql之間的,更松散更靈活的,但是不支持事務,只用作非重要數據存儲。

Redis和Memcached的區別

①.數據支持類型不同:

Memcached僅支持簡單的key-value結構的數據,Redis常用的數據類型有5種:String、Hash、List、Set和Sorted Set.Resdis內部使用一個redisObject對象來表示所有的key和value.

redis核心對象(redisObject)

|數據類型(type)-------------------->string/hash/list/set/sorted set

raw/int/ht/zipmap/

linkedlist/ziplist --> |編碼方式(encoding)

/intset

|數據指針(ptr)

|虛擬內存(vm)

|其他信息……

說明:type代表一個value對象具體是什么數據類型,encoding是不同數據類型在redis內部的存儲方式。比如:type=string代表value存儲的是一個普通字符串,那么對應的encoding可以是raw或者int,如果是int則代碼實際redis內部是按數值型類型存儲和表示這個字符串的,當然前提是這個字符串本身可以用數值表示比如“124”,“456”這樣的字符串。只有打開了Redis的虛擬內存功能,vm字段才會真正的分配內存,該功能默認關閉。

1)String:

常用命令:set/get/decr/incr/mget等。

應用場景:String是最常用普通的key/value都可以用

實現方式:String在Redis內部存儲默認就是一個字符串。當遇到incr、decr等操作時會轉成數值型進行計算,此時redisObject的encoding字段為int。

2)Hash

常用命令:hset/hget/hgetall等

應用場景:我們要存儲一個用戶信息對象數據,其中包括用戶ID、用戶姓名、年齡和生日,通過用戶ID我們希望獲取該用戶的姓名或者年齡或者生日;

實現方式:Redis的Hash實際是內部存儲的Value為一個HashMap,并提供了直接存取這個Map成員的接口。如圖所示,Key是用戶ID, value是一個Map。這個Map的key是成員的屬性名,value是屬性值。這樣對數據的修改和存取都可以直接通過其內部Map的Key(Redis里稱內部Map的key為field), 也就是通過 key(用戶ID) + field(屬性標簽) 就可以操作對應屬性數據。當前HashMap的實現有兩種方式:當HashMap的成員比較少時Redis為了節省內存會采用類似一維數組的方式來緊湊存儲,而不會采用真正的HashMap結構,這時對應的value的redisObject的encoding為zipmap,當成員數量增大時會自動轉成真正的HashMap,此時encoding為ht。

3)List

常用命令:lpusht/rpush/lpop/rpop/lrange等

應用場景:比如twitter的關注列表,粉絲列表等都可以用Redis的list結構來實現;

實現方式:Redis list的實現為一個雙向鏈表,即可以支持反向查找和遍歷,更方便操作,不過帶來了部分額外的內存開銷,Redis內部的很多實現,包括發送緩沖隊列等也都是用的這個數據結構

4)Set

常用命令:sadd/spop/smembers/sunion等;

應用場景:Redis set對外提供的功能與list類似是一個列表的功能,特殊之處在于set是可以自動排重的,當你需要存儲一個列表數據,又不希望出現重復數據時,set是一個很好的選擇,并且set提供了判斷某個成員是否在一個set集合內的重要接口,這個也是list所不能提供的;

實現方式:set 的內部實現是一個 value永遠為null的HashMap,實際就是通過計算hash的方式來快速排重的,這也是set能提供判斷一個成員是否在集合內的原因。

5)Sorted Set

常用命令:zadd/zrange/zrem/zcard等;

應用場景:Redis sorted set的使用場景與set類似,區別是set不是自動有序的,而sorted set可以通過用戶額外提供一個優先級(score)的參數來為成員排序,并且是插入有序的,即自動排序。當你需要一個有序的并且不重復的集合列表,那么可以選擇sorted set數據結構,比如twitter 的public timeline可以以發表時間作為score來存儲,這樣獲取時就是自動按時間排好序的。

實現方式:Redis sorted set的內部使用HashMap和跳躍表(SkipList)來保證數據的存儲和有序,HashMap里放的是成員到score的映射,而跳躍表里存放的是所有的成員,排序依據是HashMap里存的score,使用跳躍表的結構可以獲得比較高的查找效率,并且在實現上比較簡單。

②.內存管理機制不同

在Redis中,并不是所有的數據都一直存儲在內存中的。這是和Memcached相比一個最大的區別。

4:HTTP協議中幾個狀態碼的含義:503 500 401 403 404 200 301 302。。。

2XX 成功

200 : 請求成功,請求的數據隨之返回。

3XX 重定向

301 : 永久性重定向。

302 : 暫時行重定向。

304 :未修改

305 :使用代理

307 :臨時重定向

4XX 請求錯誤

401 : (未授權)當前請求需要用戶驗證。

403 : (禁止) 服務器拒絕請求。

404 : (未找到)請求失敗,請求的數據在服務器上未發現。

405 :(方法禁用) 禁用請求中指定的方法。

407 :(需要代理授權) 此狀態代碼與 401(未授權)類似,但指定請求者應當授權使用代理。

5xx 服務器錯誤

500 : 服務器錯誤。一般服務器端程序執行錯誤。

501 :(尚未實施) 服務器不具備完成請求的功能

502 :(錯誤網關) 服務器作為網關或代理,從上游服務器收到無效響應。

503 : (服務不可用)服務器臨時維護或過載。這個狀態時臨時性的。

504 :(網關超時) 服務器作為網關或代理,但是沒有及時從上游服務器收到請求。

505 :(HTTP 版本不受支持) 服務器不支持請求中所用的 HTTP 協議版本。

5:對于大流量的網站,您采用什么樣的方法來解決各頁面訪問量統計問題

a. 確認服務器是否能支撐當前訪問量。

b. 優化數據庫訪問。參考2.3

c. 禁止外部訪問鏈接(盜鏈), 比如圖片盜鏈。

d. 控制文件下載。

e. 使用不同主機分流。

f. 使用瀏覽統計軟件,了解訪問量,有針對性的進行優化。

6:使用mod_rewrite,在服務器上沒有/archivers/567.html這個物理文件時,重定向到index.php?id=567,請先打開mod_rewrite.

首先,打開mod_rewrite模塊。

其次,http.conf找到以下代碼段:

<Directory />
 Options FollowSymLinks
 AllowOverride None
 </Directory>

將其中的:AllowOverride None 改為 AllowOverride All ,重啟httpd服務即可。
然后,在項目根目錄下建立 .htaccess 文件,填寫規則。

7:測試php性能和mysql數據庫性能的工具,和找出瓶頸的方法

XHProf是一個分析php性能的工具,他報告函數基本的請求次數和各種指標,包括阻塞時間、cpu時間和內存使用情況,有一個簡單的HTML用戶界面,給予瀏覽器的性能分析用戶界面,也能繪制調用關系

歷史上的今天:

  • 博主微信
  • 趕快加我來聊天吧
  • weinxin
  • 博主QQ
  • QQ號:862277464
  • weinxin

發表評論

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: