2019年騰訊PHP程序員面試題目

1. php 的垃圾回收機制

PHP 可以自動進行內存管理,清除不需要的對象。

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

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

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 沒有大小和數量限制。

關係:

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 的生存時間

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

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、分頁、選擇菜單生成)、事務處理、輸出到文件。

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

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

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

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

長連接:

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

短連接:

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

7. HTTP 協議詳解、應用

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

(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. 異構系統通訊中的通訊加密方案

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/43169774

12. posix 及 perl 兼容正則比較,及函數性能分析

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

1、PCRE 函數需要模式以分隔符閉合.

2、POSIX 兼容正則沒有修正符。不像 POSIX, PCRE 擴展沒有專門用於大小寫不敏感匹配的函數。取而代之的是,支持使用 /i 模式修飾符完成同樣的工作。其他模式修飾符同樣可用於改變匹配策略.

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

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

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

13. 實現 PERL 正則表達式,抓取 html 文件 a 標籤的所有 href 超鏈接

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 緩存

21. 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 ()

的文件擁有者用戶名相同。

以下是一些和安全模式相關的配置選項

22. 常見的 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 欺騙,迫使服務器把合法用戶的連接復位,影響合法用戶的連接

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

什麼是盜鏈?

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

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

不定期更名文件或者目錄

限制引用頁

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

文件僞裝

文件僞裝是目前用得最多的一種反盜鏈技術,一般會結合服務器端動態腳本 (PHP/JSP/ASP)。實際上用戶請求的文件地址,只是一個經過僞裝的腳本文件,這個腳本文件會對用戶的請求作認證,一般會檢查 Session,Cookie 或 HTTP_REFERER 作爲判斷是否爲盜鏈的依據。而真實的文件實際隱藏在用戶不能夠訪問的地方,只有用戶通過驗證以後纔會返回給用戶

加密認證

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

隨機附加碼

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

加入水印

24. HTTP 請求頭信息和響應頭信息

請求頭信息

響應頭信息

25. 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 個對象引用它們 表類型,區分表類型

優化表設計的常用思路

負載均衡的數據庫設計

數據類型及詳細定義,區分

26. Apache

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

27. Ajax

用 JS 實現 Ajax 功能

28. Javascript

變量、作用域、作用域鏈.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章