進階php面試題及部分答案
在網上看到一些進階php 的面試題目。。
閑來無事,搞了一些答案。。。可能不是很全面,留這以後備用吧。
一. 基本知識點
1.1 HTTP協議中幾個狀態代碼的含義:503 500 401 403 404 200 301 302。。。
200 : 請求成功,請求的資料隨之返回。
301 : 永久性重新導向。
302 : 暫時行重新導向。
401 : 當前請求需要使用者驗證。
403 : 伺服器拒絕執行請求,即沒有許可權。
404 : 請求失敗,請求的資料在伺服器上未發現。
500 : 伺服器錯誤。一般伺服器端程式執行錯誤。
503 : 伺服器臨時維護或過載。這個狀態時臨時性的。
1.2 Include require include_once require_once 的區別.
處理失敗方式不同:
require 失敗時會產生一個致命層級錯誤,並停止程式運行。
include 失敗時只產生一個警告層級錯誤,程式繼續運行。
include_once/require_once和include/require 處理錯誤方式一樣,
唯一區別在於當所包含的檔案代碼已經存在時候,不在包含。
1.3 PHP/Mysql中幾個版本的進化史,比如mysql4.0到4.1,PHP 4.x到5.1的重大改進等等。
1.4 HEREDOC介紹
一種定義字串的方法。
結構:
<<<。在該提示符後面,要定義個標識符(單獨一行),
然後是一個新行。接下來是字串 本身,
最後要用前面定義的標識符作為結束標誌(單獨一行)
注意:
標識符的命名也要像其它標籤一樣遵守PHP的規則:
只能包含字母、數字和底線,並且必須以字母和底線作為開頭
1.5 寫出一些php魔幻(術)方法;
__construct() 執行個體化類時自動調用。
__destruct() 類對象使用結束時自動調用。
__set() 在給未定義的屬性賦值的時候調用。
__get() 調用未定義的屬性時候調用。
__isset() 使用isset()或empty()函數時候會調用。
__unset() 使用unset()時候會調用。
__sleep() 使用serialize序列化時候調用。
__wakeup() 使用unserialize還原序列化的時候調用。
__call() 調用一個不存在的方法的時候調用。
__callStatic()調用一個不存在的靜態方法是調用。
__toString() 把對象轉換成字串的時候會調用。比如 echo。
__invoke() 當嘗試把對象當方法調用時調用。
__set_state() 當使用var_export()函數時候調用。接受一個數組參數。
__clone() 當使用clone複製一個對象時候調用。
1.6 一些編譯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庫的支援
更多可以使用 ./configure help 查看
1.7 向php傳入參數的三種方法。
/*
* 方法一 使用$argc $argv
* 在命令列下運行 /usr/local/php/bin/php ./getopt.php -f 123 -g 456
*/
// if ($argc > 1){
// print_r($argv);
// }
/**
* 運行結果
*
[email protected]:~/web_app/channel3/interface> /usr/local/php/bin/php ./getopt.php -f 123 -g 456
Array
(
[0] => ./getopt.php
[1] => -f
[2] => 123
[3] => -g
[4] => 456
)
*/
/*
* 方法二 使用getopt函數()
* 在命令列下運行 /usr/local/php/bin/php ./getopt.php -f 123 -g 456
*/
// $options = "f:g:";
// $opts = getopt( $options );
// print_r($opts);
/**
* 運行結果
*
[email protected]:~/web_app/channel3/interface> /usr/local/php/bin/php ./getopt.php -f 123 -g 456
Array
(
[f] => 123
[g] => 456
)
*/
/*
* 方法三 提示使用者輸入,然後擷取輸入的參數。有點像C語言
* 在命令列下運行 /usr/local/php/bin/php ./getopt.php
*/
fwrite(STDOUT, "Enter your name: ");
$name = trim(fgets(STDIN));
fwrite(STDOUT, "Hello, $name!");
/**
* 運行結果
*
[email protected]:~/web_app/channel3/interface> /usr/local/php/bin/php ./getopt.php
Enter your name: francis
Hello, francis!
*/
摘自:http://fangnaichang.blog.sohu.com/209113138.html
1.8 (mysql)請寫出資料類型(int char varchar datetime text)的意思; 請問varchar和char有什麼區別;
int : 數值類型
char : 固定長度字串類型
varchar : 可變長度字串類型
datetime : 時期時間類型
text : 文本類型
varchar和char有什麼區別:
a. char 長度是固定的,不管你儲存的資料是多少他都會都固定的長度。
而varchar則處可變長度但他要在總長度上加1字元,這個用來儲存位置。
b. char 固定長度,所以在處理速度上要比varchar快速很多,但是浪費儲存空間,
所以對儲存不大,但在速度上有要求的可以使用char類型,反之可以用varchar類型來執行個體。
1.9 error_reporting 等調試函數使用
error_reporting() 函數能夠在運行時設定php.ini中 error_reporting 指令。
所以可以再程式中隨時調節顯示的錯誤層級。
使用此函數時 display_errors必須是開啟狀態。
1.10 您是否用過版本控制軟體? 如果有您用的版本控制軟體的名字是?
SVN : http://baike.baidu.com/view/183128.htm
1.11 posix和perl標準的Regex區別;
1.12 Safe_mode 開啟後哪些地方受限.
啟動safe_mode,會對許多PHP函數進行限制,特別是和系統相關的檔案開啟、命令執行等函數.
所有操作檔案的函數將只能操作與指令碼UID相同的檔案.
1.13 寫代碼來解決多進程/線程同時讀寫一個檔案的問題。
PHP是不支援多線程的,可以使用php的flock加鎖函數實現。
$fp = fopen("/tmp/lock.txt", "w+");
if (flock($fp, LOCK_EX)) { // 進行排它型鎖定
fwrite($fp, "Write something here\n");
flock($fp, LOCK_UN); // 釋放鎖定
} else {
echo "Couldn't lock the file !";
}
fclose($fp);
1.14 寫一段上傳檔案的代碼。
upload.html
upload.php
$uploads_dir = '/uploads';
foreach ($_FILES["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["tmp_name"][$key];
$name = $_FILES["name"][$key];
move_uploaded_file($tmp_name, "$uploads_dir/$name");
}
}
1.15 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支援行鎖。
摘自:http://www.php100.com/html/webkaifa/database/Mysql/2011/0326/7789.html
二. web 架構,安全,項目經驗
2.1 介紹xdebug,apc,eAccelerator,Xcache,Zend opt的使用經驗。
2.2 使用mod_rewrite,在伺服器上沒有/archivers/567.html這個物理檔案時,重新導向到index.php?id=567 ,請先開啟mod_rewrite.
首先,開啟mod_rewrite模組。
其次,http.conf找到以下程式碼片段:
Options FollowSymLinks
AllowOverride None
將其中的:AllowOverride None 改為 AllowOverride All ,重啟httpd服務即可。
然後,在項目根目錄下簡曆 .htaccess 檔案,填寫規則。
參考地址:http://httpd.apache.org/docs/2.2/rewrite/
2.3 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.
2.4 寫出一種排序演算法(原理),並說出最佳化它的方法。
2.5 請簡單闡述您最得意的開發之作
2.6 對於大流量的網站,您採用什麼樣的方法來解決各頁面訪問量統計問題
a. 確認伺服器是否能支撐當前訪問量。
b. 最佳化資料庫訪問。參考2.3
c. 禁止外部存取連結(盜鏈), 比片盜鏈。
d. 控制檔案下載。
e. 使用不同主機分流。
f. 使用瀏覽統計軟體,瞭解訪問量,有針對性的進行最佳化。
2.7 您是否用過模板引擎? 如果有您用的模板引擎的名字是?
Smarty
2.8 請介紹Session的原理,大型網站中Session方面應注意什麼?
2.9 測試php效能和mysql資料庫效能的工具,和找出瓶頸的方法。
2.10 正則提出一個網頁中的所有連結.
2.11 介紹一下常見的SSO(單點登陸)方案(比如dedecms整合discuz的passport)的原理。
2.12 您寫過的PHP架構的特點,主要解決什麼問題,與其他架構的不同點。
2.13 大型的論壇/新聞文章系統/SNS網站在效能最佳化上有什麼區別?
2.14 相簿類應用:要求在瀏覽器中能同時選中並上傳多個檔案,圖片要求能剪裁,壓縮包在伺服器端解壓。能上傳單個達50M的檔案。上傳過程中有進度條顯示。每個圖片能產生四種大小縮圖,視頻檔案要轉成flv供flash播放。敘述要涉及的各類開源軟體和簡單用途。
一群猴子排成一圈,按1,2,…,n依次編號。然後從第1隻開始數,數到第m只,把它踢出圈,從它後面再開始數,再數到第m只,在把它踢出去…,如此不停的進行下去,直到最後只剩下一隻猴子為止,那隻猴子就叫做大王。要求編程類比此過程,輸入m、n, 輸出最後那個大王的編號。用程式類比該過程。
三. unix/linux 基本使用
3.1 linux下查看當前系統負載資訊的一些方法。
3.2 vim的基本快速鍵。
3.3 ssh 安全增強方法;密碼方式和rsa key 方式的配置。
3.4 rpm/apt/yum/ports 裝包,查詢,刪除的基本命令。
3.5 Makefile的基本格式,gcc 編譯,串連的命令,-O0 和-O3區別。
3.6 gdb,strace,valgrind的基本使用.
四. 前端,HTML,JS
css盒模型。
javascript中的prototype。
javascript中this對象的範圍。
IE和firefox事件冒泡的不同。
什麼是怪異模式,標準模式,近標準模式。
DTD的定義
IE/firefox常用hack.
firefox,IE下的前端js/css調試工具。