09.19 PHP 核心技術面試題

1. 寫出一個能創建多級目錄的 PHP 函數(新浪網技術部)

PHP 核心技術面試題

2. 寫出 smarty 模板的特點(新浪網技術部)

速度快,編譯型,緩存技術,插件機制,強大的表現邏輯

3. 打開 php.ini 中的 safe mode,會影響哪些函數?至少說出 6 個。(新浪)

1) 用戶輸入輸出函數(fopen() file() require(),只能用於調用這些函數有相同腳本的擁有者)

2) 創建新文件(限制用戶只在該用戶擁有目錄下創建文件)

3) 用戶調用 popen() systen() exec()等腳本,只有腳本處在 safe_mode_exec_dir 配置指令指定的目錄中才可能

4) 加強 HTTP 認證,認證腳本擁有者的 UID 的劃入認證領域範圍內,此外啟用安全模式下,不會設置 PHP_AUTH

5) mysql 服務器所用的用戶名必須與調用mysql_connect()的文件的擁有者用戶名相同

6) 受影響的函數變量以及配置命令達到 40 個

4. 抓取遠程圖片到本地,你會用什麼函數?(51.com 筆試題)

file_get_contents 或者 curl

5. PHP 的垃圾收集機制是怎樣的(騰訊)

PHP 可以自動進行內存管理,清除不再需要的對象。PHP使用了引用計數(referencecounting)這種單純的垃圾回收(garbage collection)機制。每個對象都內含一個引用計數器,每個 reference 連接到對象,計數器加 1。當reference 離開生存空間或被設為 NULL,計數器減 1。當某個對象的引用計數器為零時,PHP 知道你將不再需要使用這個對象,釋放其所佔的內存空間。

6. 請寫一段 PHP 代碼,確保多個進程同時寫入同一個文件成功(騰訊)

核心思路:加鎖

PHP 核心技術面試題

7. 寫一個函數,能夠遍歷一個文件夾下的所有文件和子文件夾。(新浪)

PHP 核心技術面試題

8. mysql_fetch_row() 和 mysql fetch array() 有什麼分別?

mysql_fetch_row() 把數據庫的一列儲存在一個以零為基數的數組中,第一欄在數組的索引0,第二欄在索引 1,如此類推。

mysql_fetch_assoc() 把數據庫的一列儲存在一個關聯數組中,數組的索引就是字段名稱,例如我的數據庫查詢送回“first_name”、“last_name”、“email”三個字段,數組的索引便是“first_name”、“last_name”和“email”。mysql_fetch_array() 可以同時送回 mysql_fetch_row() 和mysql_fetch_assoc() 的值。

9. 談談對 mvc 的認識

由模型(model),視圖(view),控制器(controller)完成的應用程序,由模型發出要實現的 功能到控制器,控制器接收組織功能傳遞給視圖。

10. 寫出一個正則表達式,過慮網頁上的所有 JS/VBS 腳本(即把>

$script="以下內容不顯示:

12. 請寫一個函數驗證電子郵件的格式是否正確(要求使用正則)(新浪)

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

13. 請寫出並說明如何在命令行下運行 PHP 腳本(寫出兩種方式)同時向 PHP 腳本傳遞參數?(騰訊)

首先進入 php 安裝目錄

php -f d:/wamp/www/1.php其中-f 參數指定要執行的php 文件

php -r phpinfo();其中-r 表示直接執行 php 代碼,無需寫開始結束標記

14. 一個函數的參數不能是對變量的引用,除非在 php.ini 中把 __設為 on。

allow_call_time_pass_reference

是否啟用在函數調用時強制參數被按照引用傳遞

15. 編寫函數取得上一月的最後一天

PHP 核心技術面試題

16. 寫出兩種對變量加密的函數?

md5($str); sha1($str);

17. 如何把 2009-9-2 10:30:25 變成 unix 時間戳?

PHP 核心技術面試題

18. 對於大流量的網站, 您採用什麼樣的方法來解決訪問量問題?

1) 確認服務器硬件能否支持當前的流量

對於普通的 pc server 來說,它能夠獨立支持每天10 萬個獨立 ip 訪問,如果訪問量過大, 最好更好性能更高的專用服務器。

2) 優化數據庫的訪問

服務器的負載過大,一個重要的原因就是 CPU和內存負載過高,而讀寫數據在這塊佔據較多的資源。可以從頁面靜態化、memcache 緩存和 mysql優化幾個方面著手。

3) 禁止外部盜鏈

佔用較大的流量,防盜鏈,使用 reference 來判斷一下。如果是圖片的話,使用添加水印即可很好的防止。

4) 控制大文件的下載

最好把文件下載的容量控制為相對較小的一個值,如果有大文件下載,最好使用專用的 服務器。

5) 使用多臺主機實現分流,集群

6) 使用流量分析軟件進行分析統計 谷歌 和百度

19. 列舉 web 開發中的安全性問題

sql 注入攻擊。

數據庫操作安全,UPDATE、 DELETE、INSERT 的操作沒有限制用戶操作權限,這將是一件很危險的事情。

沒有驗證用戶 http 請求的方式 POST 或者 GET,GET 請求被合法通過。

沒有驗證表單來源的唯一性,不能識別是合法的表單提交還是黑客偽造的表單提交。

XSS 攻擊。

20. 使用過 Memcache 緩存嗎,如果使用過,能夠簡單的描述一下它的工作原理嗎?

Memcahce 是把所有的數據保存在內存當中,採用 hash表的方式,每條數據由 key 和

value 組成,每個 key 是獨一無二的,當要訪問某個值的時候先按照找到值,然後返回結果。

Memcahce 採用 LRU 算法來逐漸把過期數據清除掉。

數據結構和算法

1請使用冒泡排序法對以下一組數據進行排序 10 2 36 14 10 25 23 85 99 45。

PHP 核心技術面試題

2. 寫出你所知道的排序方法 (億郵)

冒泡排序,快速排序,插入排序,選擇排序,

3. 我們希望開發一款撲克遊戲,請給出一套洗牌算法,公平的洗牌並將洗好的牌存儲 在一個整形數組裡。 (鑫眾人云)

沒有固定答案,簡單洗牌算法參考

$card_num=54; //牌數

function wash_card($card_num){

$cards=$tmp=array(); for($i=0;$i

$tmp[$i]=$i;

}

for($i=0;$i

$index=rand(0,$card_num-$i-1);

$cards[$i]=$tmp[$index]; unset($tmp[$index]);

$tmp=array_values($tmp);

}

return $cards;

}

測試:print_r(wash_card($card_num));

PHP 網絡編程

1. 禁用 COOKIE 後 SEESION 還能用嗎?

可以,Cookie 和 session 都是用來實現會話機制的,由於http 協議是無狀態的,所以要想跟蹤一個用戶在同一個網站之間不同頁面的 狀態,需要有這麼一個機制----會話機制。

Cookie:將會話信息的保存到瀏覽器端。

Session:將會話信息保存到服務器端。

session 默認情況下是基於 cookie 的,對於 session 來說,每生成一個 sessionid,都會將其發送到瀏覽器端,讓後將其保存到 cookie 當中。如果禁用了 cookie,則基於cookie 的 session 不好使了,我們可以使用 get,傳遞SID, 或者直接開啟透明的 SID(此時需要關閉基於cookie 的 session 配置項)。

相關題目:session 與 cookie 的區別?

Cookie 保存在客戶端,而 session 則保存服務器端。從安全性的角度來講,session 的安全性要高。

從保存內容的類型的角度來講,cookie 只保存字符串(及能夠自動轉換成字符串),而

session 則可以保存所有的數據類型。從保存內容的大小的角度來講,cookie 保存的內容是有限制的,比較小,而 session 基本上沒有這個限制。從性能的角度來講,用 session 的話,對服務器的壓力會更大一些。

2. 如何修改 SESSION 的生存時間?

要注意這裡的生存時間指的是什麼? 由於 session 默認是基於 cookie 的,也就是說使用session 會話技術,首先是將 session 數據保存到服務器端,其次會將 sessionID 保存到瀏覽器端, 保存在服務器端的 session 文件生命週期由 php.ini 中的 session.gc_maxlifetime 、gc_probability 和 gc_divisor 來決定,而保存在客戶端的 sessionID 由客戶端 cookie 來決定, 默認其生存週期直到瀏覽器關閉,它由 php.ini 中的設置 session.cookie_lifetime 來控制,二者共同來決定 session 的生存時間,二者中的其中任意一個失效了,就有可能造成 session 失效,要根據自己的需求來決定是要從哪方面來修改其生存時間。

參考 1:將 php.ini 中的 session.gc_maxlifetime 設置為 9999 重啟 apache

參考 2:

$savePath = "./session_save_dir/";

$lifeTime = 小 時 * 秒 ; session_save_path($savePath); session_set_cookie_params($lifeTime); session_start();

參 考 3: session_start();

$lifeTime = 24 * 3600; // 保存一天

setcookie(session_name(), session_id(), time() + $lifeTime, "/");

3. COOKIE、SESSION 的聯繫和區別,多臺 web 服務器如何共享 SESSION?

COOKIE 和 SEESIO 都是用於會話機制,COOKIE 保存在客戶端,而SESSION 則保存在服務器端。在默認情況下,SESSION 機制是基於 COOKIE 的,每生成一個SESSIONID, 都會將其發送到瀏覽器端,讓後將其保存到COOKIE 當中,在下次請求的時候,由瀏覽器攜帶這個COOKIE。要想多臺 web 服務器共享 SESSION,可以利用 MySQL 數據庫存儲並共享 Session 數據

4. HTTP/1.0 中,狀態碼 200 301 304 403 404 500 的含義 (小米)

200 OK 服務器成功處理了請求

301 Moved Permanently(重定向)請求的 URL 已移走

304 Not Modified(未修改)客戶的緩存資源是最新的, 要客戶端使用緩存

403 Forbidden(禁止)請求被服務器拒絕了404 Not Found 未找到資源

Internal Server Error(內部服務器錯誤)服務器遇到一個錯誤,使其無法為請求提供服務

5. 簡述 Tcp 協議的三次握手過程。 (億郵)

TCP 是主機對主機層的傳輸控制協議,提供可靠的連接服務,採用三次握手確認建立一個連接:

第一次握手:建立連接時,客戶端發送 syn包(syn=j)到服務器,並進入 SYN_SEND 狀態,等待服務器確認;

第二次握手:服務器收到 syn 包,必須確認客戶的 SYN(ack=j+1),同時自己也發送一個 SYN 包(syn=k),即 SYN+ACK 包,此時服務器進入 SYN_RECV 狀態;

第三次握手:客戶端收到服務器的 SYN+ACK包,向服務器發送確認包 ACK(ack=k+1), 此包發送完畢,客戶端和服務器進入 ESTABLISHED 狀態,完成三次握手。

完成三次握手,客戶端與服務器開始傳送數據。

6. 你會用哪個函數設置當前內容的 Content-Type? (卓望)

header 函數

Linux 部分

1. 請解釋下列 10 個 shell 命令的用途(新浪網技術部)

top、ps、mv、find、df、cat、chmod、chgrp、grep、wc

top:該命令提供了實時對系統處理器狀態的監控,它能夠實時顯示系統中各個進程的 資源佔用情況。該命令可以按照對 CPU、內存使用和執行時間對系統任務進程進行排序顯示,同時還可以通過交互式命令進行設定顯示。

ps:顯示系統進程在瞬間的運行動態。

mv:文件/目錄改名或變更存儲位置。

find:在指定的路徑下查找指定文件。

df:檢查磁盤空間佔用情況。

cat:將文件的內容打印到標準輸。chmod:改變文件的權限。

chgrp:改變文件所屬組。

grep:過濾文本,根據指定的字符串,對文件的每一行進行搜索,如找到,則輸出該行 內容。

wc:統計指定文件中的字節數、字數、行數,並將統計結果顯示輸出。

相關題目:寫出 15 個以上你所知道的常用的 Linux 命令和它的功能。

ls:列目錄cp:複製rm:刪除

cat:將文件的內容打印到標準輸出

mkdir: 建立目錄

dd:切換目錄

ps:查看進程

top:查看機器使用情況

df:檢查磁盤空間佔用情況 find:在指定路徑下查找指定文件

grep:過濾文本

cd:改變當前工作目錄

mount:掛載/卸載指定的文件系統

ifconfig:配置網絡或顯示當前網絡接口狀態

telnet::遠程登錄

2. vi 編輯器中,選中、複製、粘貼、刪除的命令各是什麼(酷訊)

選中:v(以字符為單位),V(以行為單位)複製:y,如 yy,nyy,y1G,yG,y0,y$

粘貼:p(粘貼在光標之後),P(粘貼在光標之前)刪除:d,如 dd,ndd,d1G,dG,d$,d0

3. 獲取文件行數 (酷訊)

wc -l filename

4. 輸入文件的最後 5 行到另一個文件中 (酷訊)

tail -n 5 file1 >> file2

5. 查找文件中包含 hello 的行 (酷訊)

grep hello filename

6. 查找當前目錄下所有目錄名為 CVS 的子目錄的命令 (酷訊)

find ./CVS -maxdepth 1 -type d -print

7. Linux 上的 crond 服務可對服務器設置計劃任務,請問如果我需設置每 2 分鐘執行一次

/tmp/test.sh 的腳本應如何設置計劃任務,請寫出操作方法。

首先用 root 用戶的權限登錄。

切換到/etc/init.d/目錄下,使用命令:crond start 啟動crond 服務

切換到/etc/目錄下,使用命令: crontab –e

編輯如下:*/2 * * * * /tmp/test.sh

8. Linux 下終止一個進程用什麼命令?打包壓縮和解包用什麼命令?軟連接和硬鏈接有什麼區別?建立軟連接的命令是? (卓望)

終止進程的命令:kill

打包壓縮和解包命令:tar

建立軟連接的命令:ln -s 源文件 目標鏈接名

硬鏈接是通過文件系統的 inode 來產生新文件名,而不是新文件,它只是在某個目錄新建一條文件名鏈接到某inode 號碼的管理記錄而已,而軟鏈接是創建一個獨立的文件,該文件會讓數據的讀取指向它鏈接的那個文件的文件名,類似於 windows 中的快捷方式。


分享到:


相關文章: