1. 程式人生 > 實用技巧 >分享一波騰訊PHP面試題(建議收藏)

分享一波騰訊PHP面試題(建議收藏)

1. php 的垃圾回收機制

PHP 可以自動進行記憶體管理,清除不需要的物件。

PHP 使用了引用計數 (reference counting) GC 機制。

每個物件都內含一個引用計數器 refcount,每個 reference 連線到物件,計數器加 1。當 reference 離開生存空間或被設為 NULL,計數器減 1。當某個物件的引用計數器為零時,PHP 知道你將不再需要使用這個物件,釋放其所佔的記憶體空間。

參考http://www.php.net/manual/zh/features.gc.r...

2. session 與 cookie 的區別和聯絡

區別:

1. 存放位置:Session 儲存在伺服器,Cookie 儲存在客戶端。

2. 存放的形式:Session 是以物件的形式儲存在伺服器,Cookie 以字串的形式儲存在客戶端。

3. 用途:Cookies 適合做儲存使用者的個人設定,愛好等,Session 適合做客戶的身份驗證

4. 路徑:Session 不能區分路徑,同一個使用者在訪問一個網站期間,所有的 Session 在任何一個地方都可以訪問到。而 Cookie 中如果設定了路徑引數,那麼同一個網站中不同路徑下的 Cookie 互相是訪問不到的。

5. 安全性:Cookie 不是很安全,別人可以分析存放在本地的 COOKIE 並進行 COOKIE 欺騙,考慮到安全應當使用 session

6. 大小以及數量限制:每個域名所包含的 cookie 數:IE7/8,FireFox:50 個,Opera30 個; Cookie 總大小:Firefox 和 Safari 允許 cookie 多達 4097 個位元組,Opera 允許 cookie 多達 4096 個字 節,InternetExplorer 允許 cookie 多達 4095 個位元組;一般認為 Session 沒有大小和數量限制。

關係:

  1. Session 需要藉助 Cookie 才能正常工作。如果客戶端完全禁止 Cookie,Session 將失效!因為 Session 是由應用伺服器維持的一個 伺服器端的儲存空間,使用者在連線伺服器時,會由伺服器生成一個唯一的 SessionID, 用該 SessionID 為識別符號來存取伺服器端的 Session 儲存空間。而 SessionID 這一資料則是儲存到客戶端,用 Cookie 儲存的,使用者提交頁面時,會將這一 SessionID 提交到伺服器端,來存取 Session 資料。這一過程,是不用開發人員干預的。所以一旦客戶端禁用 Cookie,那麼 Session 也會失效。

3. 如何修改 SESSION 的生存時間

  1. 設定瀏覽器儲存的 sessionid 失效時間 setcookie (session_name (), session_id (), time () + $lifeTime, "/");
  2. 可以使用 SESSION 自帶的 session_set_cookie_params (86400); 來設定 Session 的生存期
  3. 通過修改 php.ini 中的 session.gc_maxlifetime 引數的值就可以改變 session 的生存時間

【粉絲福利】30G-PHP進階資料,拿到你也能30K,免費領取

4. PHP 頁面重定向的方法有哪些

  1. header('Location:') ;
  2. echo '';
  3. echo '';

5. PDO、adoDB、PHPLib 資料庫抽象層比較

PHP 資料庫抽象層就是指,封裝了資料庫底層操作的介於 PHP 邏輯程式程式碼和資料庫之間的中介軟體。

PDO 以 PHP 5.1 為基礎進行設計,它使用 C 語言做底層開發,設計沿承 PHP 的特點,以簡潔易用為準,從嚴格意義上講,PDO 應該歸為 PHP 5 的 SPL 庫之一,而不應該歸於資料抽象層,因為其本身和 MySQL 和 MySQLi 擴充套件庫的功能類似。PDO 是不適合用在打算或者有可能會變更資料庫的系 統中的。

ADODB 不管後端資料庫如何,存取資料庫的方式都是一致的;

轉移資料庫平臺時,程式程式碼也不必做太大的更動,事實上只需要改動資料庫配置文 件。提供了大量的拼裝方法,目的就是針對不同的資料庫在抽象層的底層對這些語句進行鍼對性的翻譯,以適應不同的資料庫方言!但是這個抽象層似乎體積過於龐 大了,全部檔案大概有 500K 左右,如果你做一個很小的網站的話,用這個似乎大材小用了

PHPLib 可能是伴隨 PHP 一同成長最老的資料庫抽象層(但和 ADODB 相比,它只算是一個 MySQL 抽象類庫),這個抽象類使用方法相當簡單,體積小,是小型網站開發不錯的選擇。

PDO 提供預處理語句查詢、錯誤異常處理、靈活取得查詢結果(返回陣列、字串、物件、回撥函式)、字元過濾防止 SQL 攻擊、事務處理、儲存過程。

ADODB 支援 快取查詢、移動記錄集、(HTML、分頁、選擇選單生成)、事務處理、輸出到檔案。 參考http://apps.hi.baidu.com/share/detail/4636...

6. 長連線、短連線的區別和使用

長連線:client 方與 server 方先建立連線,連線建立後不斷開,然後再進行報文傳送和接收。這種方式下由於通訊連線一直存在。此種方式常用於 P2P 通訊。

短連線:Client 方與 server 每進行一次報文收發交易時才進行通訊連線,交易完畢後立即斷開連線。此方式常用於一點對多點通訊。C/S 通訊。

長連線與短連線的使用時機:

長連線:

短連線多用於操作頻繁,點對點的通訊,而且連線數不能太多的情況。每個 TCP 連 接的建立都需要三次握手,每個 TCP 連線的斷開要四次握手。如果每次操作都要建立連線然後再操作的話處理速度會降低,所以每次操作下次操作時直接傳送資料 就可以了,不用再建立 TCP 連線。例如:資料庫的連線用長連線,如果用短連線頻繁的通訊會造成 socket 錯誤,頻繁的 socket 建立也是對資源的浪 費。

短連線:

web 網站的 http 服務一般都用短連線。因為長連線對於伺服器來說要耗費一定 的資源。像 web 網站這麼頻繁的成千上萬甚至上億客戶端的連線用短連線更省一些資源。試想如果都用長連線,而且同時用成千上萬的使用者,每個使用者都佔有一個 連線的話,可想而知伺服器的壓力有多大。所以併發量大,但是每個使用者又不需頻繁操作的情況下需要短連線。

參考

7. HTTP 協議詳解、應用

http(超文字傳輸協議)是一個基於請求與響應模式的、無狀態的、短連線、靈活、應用層的協議,常基於 TCP 的連線方式。

參考http://blog.csdn.net/gueter/article/detail...(http 協議詳解)

(HTTP 響應狀態碼)

HTTP 響應狀態碼

狀態程式碼有三位數字組成,第一個數字定義了響應的類別,且有五種可能取值:

1xx:指示資訊 -- 表示請求已接收,繼續處理

2xx:成功 -- 表示請求已被成功接收、理解、接受

3xx:重定向 -- 要完成請求必須進行更進一步的操作

4xx:客戶端錯誤 -- 請求有語法錯誤或請求無法實現

5xx:伺服器端錯誤 -- 伺服器未能實現合法的請求

常見狀態程式碼、狀態描述、說明:

200 OK // 客戶端請求成功

400 Bad Request // 客戶端請求有語法錯誤,不能被伺服器所理解

401 Unauthorized // 請求未經授權,這個狀態程式碼必須和 WWW-Authenticate 報頭域一起使用 403 Forbidden // 伺服器收到請求,但是拒絕提供服務

404 Not Found // 請求資源不存在,eg:輸入了錯誤的 URL

500 Internal Server Error // 伺服器發生不可預期的錯誤

503 Server Unavailable // 伺服器超時 // 可能恢復正常

304 Not Modifed // 自從上次請求後,請求的網頁未修改過。

// 伺服器返回此響應時,不會返回網頁內容。

8. 異構系統通訊中的通訊加密方案

參考http://blog.csdn.net/linvo/article/details...

9. socket 連線步驟

Socket(套接字)概念

套接字(socket)是通訊的基石,是支援 TCP/IP 協議的網路通訊的基本操作單元。它是網路通訊過程中端點的抽象表示,包含進行網路通訊必須的五種資訊:連線使用的協議,本地主機的 IP 地址,本地程序的協議埠,遠地主機的 IP 地址,遠地程序的協議埠。

Socket 連線過程

建立 Socket 連線至少需要一對套接字,其中一個運行於客戶端,稱為 ClientSocket ,另一個運行於伺服器端,稱為 ServerSocket

套接字之間的連線過程可以分為三個步驟:伺服器監聽,客戶端請求,連線確認。

伺服器監聽:是伺服器端套接字並不定位具體的客戶端套接字,而是處於等待連線的狀態,實時監控網路狀態。

客戶端請求:是指由客戶端的套接字提出連線請求,要連線的目標是伺服器端的套接字。為此,客戶端的套接字必須首先描述它要連線的伺服器的套接字,指出伺服器端套接字的地址和埠號,然後就向伺服器端套接字提出連線請求。

連線確認:是指當伺服器端套接字監聽到或者說接收到客戶端套接字的連線請求,它就響應客戶端

套接字的請求,建立一個新的執行緒,把伺服器端套接字的描述發給客戶端,一旦客戶端確認了此描述,連線就建立好了。而伺服器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連線請求。

10. TCP 協議,三次握手、四次揮手

TCP 協議 (Transmission Control Protocol) 是主機對主機層的傳輸控制協議,提供可靠的連線服務,採用三次握手確認建立一個連線,四次揮手斷開連線。

位碼即 tcp 標誌位,有 6 種標示:

SYN (synchronous 建立聯機) 同步

ACK (acknowledgement 確認)

PSH (push 傳送)

FIN (finish 結束)

RST (reset 重置)

URG (urgent 緊急)

11. php 中常用作用相似,效能差異很大的函式區分及舉例

參考http://apps.hi.baidu.com/share/detail/4316...

12. posix 及 perl 相容正則比較,及函式效能分析

POSIX 正則和 PCRE 正則最顯著的需要知道的不同點:

  1. PCRE 函式需要模式以分隔符閉合.
  2. POSIX 相容正則沒有修正符。不像 POSIX, PCRE 擴充套件沒有專門用於大小寫不敏感匹配的函式。取而

代之的是,支援使用 /i 模式修飾符完成同樣的工作。其他模式修飾符同樣可用於改變匹配策略.

  1. POSIX 函式從最左面開始尋找最長的匹配,但是 PCRE 在第一個合法匹配後停止。如果字串 不匹

配這沒有什麼區別,但是如果匹配,兩者在結果和速度上都會有差別。為了說明這個不同,考慮下面的例子 (來自 Jeffrey Friedl 的《精通正則表示式》一書). 使用模式 one (self)?(selfsufficient)? 在字串 oneselfsufficient 上匹配,PCRE 會匹配到 oneself, 但是使用 POSIX, 結果將是整個字串 oneselfsufficient. 兩個子串都匹配原始字串,但是 POSIX 將 最長的最為結果.

PCRE 可用的修飾符: (i,s,m)

13. 實現 PERL 正則表示式,抓取 html 檔案 a 標籤的所有 href 超連結

正則:/<a\s+.?href=[\'\"](.?)[\'\" >]/is
$html = <<<HTML
HTML;
$matches = array();
preg_match_all ( "/<a\s+.?href=[\'\"](.?)[\'\">]/is", $html, $matches ); print_r ($matches [1]); // 輸出所有超連結
?>

  

14. 預定義變數、魔術變數、魔術方法比較,及作用舉例

預定義變數(超級全域性變數)
$GLOBALS
$_SERVER
$_GET
$_POST
$_COOKIE
$_SESSION
$_REQUEST
$_ENV
魔術方法
construct 和destruct
__autoload
get 和set
isset 和unset
call 和callStatic
__clone
__toString
sleep 和wakeup
__invoke
魔術變數
LINE
FILE
DIR
CLASS
FUNCTION
METHOD
NAMESPACE

15. spl 常用資料結構類

16. PHP 設計模式

工廠模式

建立一個工廠(一個函式或一個類方法)來製造新的物件

工廠模式 是一種類,它具有為您建立物件的某些方法。您可以使用工廠類建立物件,而不直接使用 new。這樣,如果您想要更改所建立的物件型別,只需更改該工廠即可。使用該工廠的所有程式碼會自動更改。

單例模式

某些應用程式資源是獨佔的,因為有且只有一個此型別的資源。例如,通過資料庫控制代碼到資料庫的連線是獨佔的。您希望在應用程式中共享資料庫控制代碼,因為在保持連線開啟或關閉時,它是一種開銷,在獲取單個頁面的過程中更是如此。

單元素模式可以滿足此要求。

PHP 中的單例模式(singleton pattern):指的是在 PHP 的應用程式的範圍內只對指定的類建立一個例項。

在 PHP 中使用單例模式的類通常擁有一個私有建構函式和一個私有克隆函式,以防 止使用者通過建立物件或者克隆對其進行例項化。還有一個靜態私有成員變數 $instance 與靜態方法 getInstance。getInstance 負責對其本身例項化,然後將這個物件儲存在 $instance 靜態成員變數中,以確保只有一個例項被建立。

觀察者模式

命令鏈模式

策略模式

17. 負載均衡的 web 應用伺服器設計,例如 youku

用 PHP 做負載均衡指南

思考如何應對以下問題? 參考

在 Apache 負載均衡的情況下,做 PHP 開發如何考慮一下幾方面:

PHP 原始檔在伺服器、PHP 檔案上傳處理、相關配置檔案、Session 會話放置、日誌放置

Apache 負載均衡的原則:

參考

輪詢均衡策略 (輪詢轉發請求)

按權重分配均衡策略 (按響應數量轉發請求)

權重請求響應負載均衡策略 (按響應流量轉發請求)

18. 如何優化前端效能

1) 頁面內容的優化

a) 降低請求數

合併 css、js 檔案,整合 CSS 圖片

b) 減少互動通訊量

壓縮技術:壓縮 css、js 檔案,優化影象,減少 cookie 體積;

合理利用快取:使用外部 js/css 檔案,快取 ajax;

減少不必要的通訊量:剔除無用指令碼和樣式、推遲載入內容、使用 GET 請求

c) 合理利用 “並行” 儘量避免重定向

慎用 Iframe 樣式表置於頂部 指令碼放到樣式後面載入

d) 節約系統消耗

避免 CSS 表示式、濾鏡

2) 伺服器的優化

a) b)

c)

d)

19. yahoo 的 34 條前端優化法則

減少 HTTP 請求、利用 CDN 技術、 設定標頭檔案過期或者靜態快取、Gzip 壓縮、把 CSS 放頂部、 把 JS 放底部、避免 CSS 表示式、將 JS 和 CSS 外鏈、減少 DNS 查詢、減小 JS 和 CSS 的體積、 避免重定向、刪除重複指令碼、 配置 ETags、快取 Ajax、儘早的釋放緩衝、

用 GET 方式進行 AJAX 請求、延遲載入元件、 預載入元件、減少 DOM 元素數量、跨域分離元件、

減少 iframe 數量、不要出現 404 頁面、減小 Cookie、 對元件使用無 Cookie 的域名、減少 DOM 的訪問次數、開發靈活的事件處理控制代碼、使用 <link> 而非 @import、避免過濾器的使用、優化圖片、優化 CSS Sprites、 不要在 HTML 中縮放圖片、縮小 favicon. ico 的大小並快取它、保證元件在 25K 以下、將元件打包進一個多部分的文件中

20. 資料庫快取的基本理論,參考 memcached

什麼是 Memcached?

memcached 是高效能的分散式記憶體快取伺服器。一般的使用目的是,通過快取資料庫查詢結果,減少資料庫訪問次數,以提高動態 Web 應用的速度、提高可擴充套件性。

雖然 memcached 使用了同樣的 “Key=>Value” 方式組織資料,但是它和共享記憶體、APC 等本地快取有非常大的區別。Memcached 是分散式的,也就是說 它不是本地的。它基於網路連線(當然它也可以使用 localhost)方式完成服務,本身它是一個獨立於應用的程式或守護程序(Daemon 方式)

PHP 與 Memcached

Memcached 使用 libevent 庫實現網路連線服務,理論上可以處理無限多的連線,但是它和

基於反向代理的 Web 快取;

基於反向代理的 Web 快取

23. PHP 安全模式

php 安全模式:safe_mode=on|off
啟用 safe_mode 指令將對在共享環境中使用 PHP 時可能有危險的語言特性有所限制。可以將 safe_mode 是指為布林值 on 來啟用,或者設定為 off 和指令碼嘗試訪問的檔案的 UID,以此作為限制機制的基礎。如果 UID 相同,則執行指令碼;否則,指令碼失敗。
當啟用安全模式時,一些限制將生效
1、 所有輸入輸出函式(例如 fopen ()、file () 和 require ())的適用會受到限制,只能用於與呼叫這些函式的
指令碼有相同擁有者的檔案
2、 如果試圖通過函式 popen ()、system () 或 exec () 等執行指令碼,只有當指令碼位於 safe_mode_exec_dir
配置指令指定的目錄才可能
3、HTTP 驗證得到進一步加強,因為驗證指令碼用於者的 UID 劃入驗證領域範圍內。此外,當啟用安
全模式時,不會設定 PHP_AUTH。
4、如果適用 MySQL 資料庫伺服器,連結 MySQL 伺服器所用的使用者名稱必須與呼叫 mysql_connect ()
的檔案擁有者使用者名稱相同。
以下是一些和安全模式相關的配置選項
safe_mode_gid=on|off
safe_mode_include_dir=string
safe_mode_env_vars=string
safe_mode_exec_dir=string
safe_mode_protected_env_vars=string

24. 常見的 web 攻擊方式

常見攻擊

XSS (Cross Site Script) ,跨站指令碼攻擊。它指的是惡意攻擊者往 Web 頁面裡插入惡意 html 程式碼,當用戶瀏覽該頁之時,嵌入的惡意 html 程式碼會被執行,從而達到惡意使用者的特殊 目的。XSS 屬於被動式的攻擊,因為其被動且不好利用,所以許多人常呼略其危害性。但是隨著前端技術的不斷進步富客戶端的應用越來越多,這方面的問題越來 越受關注。舉個簡單例子 : 假如你現在是 sns 站點上一個使用者,釋出資訊的功能存在漏洞可以執行 js 你在 此刻輸入一個 惡意指令碼,那麼當前所有看到你新資訊的人的瀏覽器都會執行這個指令碼彈出提示框 (很爽吧 彈出廣告 :)),如果你做一些更為激進行為呢 後果難以想象。

CSRF (Cross Site Request Forgery),跨站點偽造請求。顧名思義就是 通過偽造連線請求在使用者不知情的情況下,讓使用者以自己的身份來完成攻擊者需要達到的一些目的。csrf 的攻擊不同於 xss csrf 需要被攻擊者的主動行為觸發。這樣聽來似乎是有 “被釣魚” 的嫌疑。

多視窗瀏覽器這這方面似乎是有助紂為虐的嫌疑,因為開啟的新視窗是具有當前所有 會話的,如果是單瀏覽器視窗類似 ie6 就不會存在這樣的問題,因為每個視窗都是一個獨立的程序。舉個簡單例子 : 你正在玩白社會, 看到有人發了一個連線,你點選過去,然後這個連線裡面偽造了一個送禮物的表單,這僅僅是一個簡單的例子,問題可見一般。

cookie 劫持。通過獲取頁面的許可權,在頁面中寫一個簡單的到惡意站點的請 求,並攜帶使用者的 cookie 獲取 cookie 後通過 cookie 就可以直以被盜使用者的身份登入站點。這就是 cookie 劫持。舉個簡單例子: 某人寫了一篇很有意思的日誌,然後分享給大家,很多人都點選檢視並且分享了該日誌,一切似乎都很正常,然而寫日誌的人卻另有用心,在日誌中偷偷隱藏了一個 對站外的請求,那麼所有看過這片日誌的人都會在不知情的情況下把自己的 cookie 傳送給了 某人,那麼他可以通過任意一個人的 cookie 來登入這個人的賬戶。

SQL 注入攻擊

在 SQL 注入攻擊 中,使用者通過操縱表單或 GET 查詢字串,將資訊新增到資料庫查詢中。

DNS 攻擊

拒絕服務攻擊

拒絕服務攻擊即攻擊者想辦法讓目標機器停止提供服務,是黑客常用的攻擊手段之。

攻擊者進行拒絕服務攻擊,實際上讓伺服器實現兩種效果:一是迫使伺服器的緩衝區滿,不接收新的請求;二是使用 IP 欺騙,迫使伺服器把合法使用者的連線復位,影響合法使用者的連線

25. PHP 做好防盜鏈的基本思想 防盜鏈

什麼是盜鏈?

盜鏈是指服務提供商自己不提供服務的內容,通過技術手段繞過其它有利益的最終使用者介面 (如廣告),直接在自己的網站上向終端使用者提供其它服務提供商的服務內容,騙取終端使用者的瀏覽和點選率。受益者不提供資源或提供很少的資源,而真正的服務提供商卻得不到任何的收益。

網站盜鏈會大量消耗被盜鏈網站的頻寬,而真正的點選率也許會很小,嚴重損害了被盜鏈網站的利益。 如何做防盜鏈?

不定期更名檔案或者目錄

限制引用頁

原理是,伺服器獲取使用者提交資訊的網站地址,然後和真正的服務端的地址相比較, 如果一致則表明是站內提交,或者為自己信任的站點提交,否則視為盜鏈。實現時可以使用 HTTP_REFERER1 和 htaccess 檔案 (需要啟用 mod_Rewrite),結合正則表示式去匹配使用者的每一個訪問請求。

檔案偽裝

檔案偽裝是目前用得最多的一種反盜鏈技術,一般會結合伺服器端動態指令碼 (PHP/JSP/ASP)。實際上使用者請求的檔案地址,只是一個經過偽裝的指令碼檔案,這個指令碼檔案會對使用者的請求作認證,一般會檢查 Session,Cookie 或 HTTP_REFERER 作為判斷是否為盜鏈的依據。而真實的檔案實際隱藏在使用者不能夠訪問的地方,只有使用者通過驗證以後才會返回給使用者

加密認證

這種反盜鏈方式,先從客戶端獲取使用者資訊,然後根據這個資訊和使用者請求的檔名 字一起加密成字串 (Session ID) 作為身份驗證。只有當認證成功以後,服務端才會把使用者需要的檔案傳送給客戶。一般我們會把加密的 Session ID 作為 URL 引數的一部分傳遞給伺服器,由於這個 Session ID 和使用者的資訊掛鉤,所以別人就算是盜取了連結,該 Session ID 也無法通過身份認證,從而達到反盜鏈的目的。這種方式對於分散式盜鏈非常有效。

隨機附加碼

每次,在頁面裡生成一個附加碼,並存在資料庫裡,和對應的圖片相關,訪問圖片時和此附加碼對比,相同則輸出圖片,否則輸出 404 圖片

加入水印

26. HTTP 請求頭資訊和響應頭資訊

請求頭資訊
POST /scp1.1.0/prs/new_rnaseqtask/run_go HTTP/1.1
Host: 172.30.4.102
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:6.0) Gecko/20100101 Firefox/6.0
Accept:/
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer:http://172.30.4.102/scp1.1.0/index.php/prs...Content-Length: 1819
Cookie:
ci_session=a%3A4%3A%7Bs%3A10%3A%22session_id%22%3Bs%3A32%3A%22e31556053ff9407a454f6a1e146d43eb%22%3Bs%3A10%3A%22ip_address%22%3Bs%3A12%3A%22172.16.23.42%22%3Bs%3A10%3A%22user_agent%22%3Bs%3A50%3A%22Mozilla%2F5.0+%28Windows+NT+6.1%3B+rv%3A6.0%29+Gecko%2F2010010%22%3Bs%3A13%3A%22last_activity%22%3Bi%3A1314955607%3B%7D664b51a01ef99bac95f3e2206e79cb00;PHPSESSID=v33mlm1437lmop1fquta675vv4;username=linjinming; tk=1314955601855 Pragma: no-cache
Cache-Control: no-cache
響應頭資訊
HTTP/1.1 200 OK
Date: Fri, 02 Sep 2011 09:27:07 GMT
Server: Apache/2.2.3 (Red Hat)
X-Powered-By: PHP/5.1.6
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 31
Connection: close
Content-Type: text/html; charset=UTF-8

27. MySQL

MySQL 資料庫效能優化

使用 mysqlreport;

正確使用索引:explain 分析查詢語句,組合索引,索引副作用(佔空間、update)

開啟慢查詢日誌、使用慢查詢分析工具 mysqlsla;

索引快取、索引代價(插入更新索引);

表鎖,行鎖,行鎖副作用(update 多時候變慢),在 select 和 update 混合的情況下,行鎖巧妙解決了讀寫互斥的問題;

開啟使用查詢快取;

修改臨時表記憶體空間;

開啟執行緒池;

MySQL Query 語句優化的基本思路和原則

  1. 優化需要優化的 Query;
  2. 定位優化物件的效能瓶頸;
  3. 明確優化目標;
  4. 從 Explaing 入手;
  5. 多使用 Profile;
  6. 永遠用小結果集推動大的結果集;
  7. 儘可能在索引中完成排序;
  8. 只取自己需要的 Columns;
  9. 僅僅使用最有效的過濾條件;
  10. 儘可能避免複雜的 Join 和子查詢。

MySQL 中 MyISAM 引擎和 InnoDB 引擎的區別以及它們的效能

1:Innodb 支援事物,Myisam 不支援

2:鎖定機制不一樣,Myisam 支援表鎖定,而 Innodb 支援行鎖

3:Myisam 不支援外來鍵,Innodb 能支援

4:Myisam 能在特定環境下支援全文索引,而 Innodb 不支援

5:Myisam 支援資料壓縮,Innodb 不支援

6:在資料儲存上,Myisam 佔用的空間少,Innodb 相對多些

7:Myisam 在批量插入和查詢方面速度上有優勢,而 Innodb 由於支援行鎖,所以在資料修改方面更勝一籌

MySQL 儲存引擎

MyISAM:不支援事務、表鎖和全文索引,操作速度快

InnoDB:行鎖設計、支援外來鍵、支援安全事務

HEAP:資料存放在記憶體中,臨時表

NDB Cluster:MySQL 的簇式資料庫引擎

CSV: 儲存引擎把資料以逗號分隔的格式儲存在文字檔案中。

FEDERATED:儲存引擎表並不存放資料,它只是指向一臺遠端 MySQL 資料庫伺服器上的表 Archive: 只支援 INSERT 和 SELECT 操作,壓縮後儲存,非常適合儲存歸檔資料

Merge:允許將一系列等同的 MyISAM 表以邏輯方式組合在一起,並作為 1 個物件引用它們 表型別,區分表型別

優化表設計的常用思路

負載均衡的資料庫設計

資料型別及詳細定義,區分

28. Apache

效能優化,配置,fastCGI 等幾種工作模式

29. Ajax

用 JS 實現 Ajax 功能

var createXHR = function(){

}

var addURLParam = function(url, name, value){

}

var xhr = createXHR();

xhr.onreadystatechange = function(){

}

var url = 'testAjax.php';

addURLParam(url, 'name', 'linjm');

xhr.open('get',url,true);

xhr.send(NULL);

if(xhr.readyState == 4){    } if(xhr.status > 200 && xhr.status < 300 || xhr.status == 304){  } alert(xhr.responseText); url += (url.indexOf('?') == -1 ? '?' : '&'); url += encodeURIComponent(name) + '=' + encodeURIComponent(value); return url; if(window.XMLHttpRequest){    } return new XMLHttpRequest(); return new ActiveXObject('Microsoft.XMLHTTP'); throw new Error('No XMLHttpRequest available'); }else{ }else{}

  

30. Javascript

變數、作用域、作用域鏈