1. 程式人生 > >整理了一份招PHP高階工程師的面試題

整理了一份招PHP高階工程師的面試題

1. 基本知識點

  1. HTTP協議中幾個狀態碼的含義:1xx(臨時響應)
表示臨時響應並需要請求者繼續執行操作的狀態程式碼。

程式碼   說明 
100   (繼續) 請求者應當繼續提出請求。 伺服器返回此程式碼表示已收到請求的第一部分,正在等待其餘部分。  
101   (切換協議) 請求者已要求伺服器切換協議,伺服器已確認並準備切換。 

2xx (成功)
表示成功處理了請求的狀態程式碼。
程式碼   說明 
200   (成功)  伺服器已成功處理了請求。 通常,這表示伺服器提供了請求的網頁。 
201   (已建立)  請求成功並且伺服器建立了新的資源。 
202   (已接受)  伺服器已接受請求,但尚未處理。 
203   (非授權資訊)  伺服器已成功處理了請求,但返回的資訊可能來自另一來源。 
204   (無內容)  伺服器成功處理了請求,但沒有返回任何內容。 
205   (重置內容) 伺服器成功處理了請求,但沒有返回任何內容。
206   (部分內容)  伺服器成功處理了部分 GET 請求。 

3xx (重定向) 
表示要完成請求,需要進一步操作。 通常,這些狀態程式碼用來重定向。

程式碼   說明 
300   (多種選擇)  針對請求,伺服器可執行多種操作。 伺服器可根據請求者 (user agent) 選擇一項操作,或提供操作列表供請求者選擇。 
301   (永久移動)  請求的網頁已永久移動到新位置。 伺服器返回此響應(對 GET 或 HEAD 請求的響應)時,會自動將請求者轉到新位置。
302   (臨時移動)  伺服器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以後的請求。
303   (檢視其他位置) 請求者應當對不同的位置使用單獨的 GET 請求來檢索響應時,伺服器返回此程式碼。
304   (未修改) 自從上次請求後,請求的網頁未修改過。 伺服器返回此響應時,不會返回網頁內容。 
305   (使用代理) 請求者只能使用代理訪問請求的網頁。 如果伺服器返回此響應,還表示請求者應使用代理。 
307   (臨時重定向)  伺服器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以後的請求。 

4xx(請求錯誤) 
這些狀態程式碼表示請求可能出錯,妨礙了伺服器的處理。

程式碼   說明 
400   (錯誤請求) 伺服器不理解請求的語法。 
401   (未授權) 請求要求身份驗證。 對於需要登入的網頁,伺服器可能返回此響應。 
403   (禁止) 伺服器拒絕請求。
404   (未找到) 伺服器找不到請求的網頁。
405   (方法禁用) 禁用請求中指定的方法。 
406   (不接受) 無法使用請求的內容特性響應請求的網頁。 
407   (需要代理授權) 此狀態程式碼與 401(未授權)類似,但指定請求者應當授權使用代理。
408   (請求超時)  伺服器等候請求時發生超時。 
409   (衝突)  伺服器在完成請求時發生衝突。 伺服器必須在響應中包含有關衝突的資訊。 
410   (已刪除)  如果請求的資源已永久刪除,伺服器就會返回此響應。 
411   (需要有效長度) 伺服器不接受不含有效內容長度標頭欄位的請求。 
412   (未滿足前提條件) 伺服器未滿足請求者在請求中設定的其中一個前提條件。 
413   (請求實體過大) 伺服器無法處理請求,因為請求實體過大,超出伺服器的處理能力。 
414   (請求的 URI 過長) 請求的 URI(通常為網址)過長,伺服器無法處理。 
415   (不支援的媒體型別) 請求的格式不受請求頁面的支援。 
416   (請求範圍不符合要求) 如果頁面無法提供請求的範圍,則伺服器會返回此狀態程式碼。 
417   (未滿足期望值) 伺服器未滿足"期望"請求標頭欄位的要求。 

5xx(伺服器錯誤)
這些狀態程式碼表示伺服器在嘗試處理請求時發生內部錯誤。 這些錯誤可能是伺服器本身的錯誤,而不是請求出錯。

程式碼   說明 
500   (伺服器內部錯誤)  伺服器遇到錯誤,無法完成請求。 
501   (尚未實施) 伺服器不具備完成請求的功能。 例如,伺服器無法識別請求方法時可能會返回此程式碼。 
502   (錯誤閘道器) 伺服器作為閘道器或代理,從上游伺服器收到無效響應。 
503   (服務不可用) 伺服器目前無法使用(由於超載或停機維護)。 通常,這只是暫時狀態。 
504   (閘道器超時)  伺服器作為閘道器或代理,但是沒有及時從上游伺服器收到請求。 
505   (HTTP 版本不受支援) 伺服器不支援請求中所用的 HTTP 協議版本。 

2. Include require include_once require_once 的區別.

3.PHP/Mysql中幾個版本的進化史,比如mysql4.0到4.1,PHP 4.x到5.1的重大改進等等。

MySQL:

一、從 4.0 到 4.1 的主要變化

如果在4.1.0到4.1.3版本的MySQL中建立了包含 TIMESTAMP 欄位的 InnoDB表。則在升級到4.1.4及更高時需要重建表,因為儲存格式發生變化了。

字串根據標準SQL來比較:比較之前不刪除末尾的空格,以前用末尾空格擴充套件了比較短的字串。現在的結果是

'a' > 'a\t',以前則不這樣。可以用 mysqlcheck 來檢查一下資料表。

TIMESTAMP 返回 'YYYY-MM-DD HH:MM:SS' 格式的字串。在MySQL 4.0中,可以增加選項 --new 來獲得ySQL 4.1中這方面的特性。

在MySQL4.1.1前,語句解析器不是那麼嚴格,它在處理字串轉時間轉換時會忽略第一個數字前的其他字元。在4.1.1之後,就比較嚴格了,返回結果是 DATE, DATETIME, 或 TIME 型別的函式的結果會被轉換成時間型

二、再看從 4.1 到 5.0 的主要變化

◆InnoDB 和 MyISAM 表中空格結尾的 TEXT 欄位索引順序改變了。因此需要執行"CHECK TABLE" 語句修復資料表,如果出現錯誤,就執行 "OPTIMIZE TABLE" 或 "REPAIR TABLE" 語句修復,甚至重新轉儲(用mysqldump)。

◆MySQL 5.0.15開始,如何處理 BINARY 欄位中填充的值已經改變了。填充的值現在是0x00 而非空格了,並且在取值的時候不會去除末尾的空格。

◆從MySQL 5.0.3開始,DECIMAL 的實現方式已經改變了,5.0對 DECIMAL的格式限制嚴格多了。在MySQL 5.0.3到5.0.5之間版本的 MyISAM 和 InnoDB 表中建立的 DECIMAL欄位升級到5.0.6之後會發生崩潰。從5.0.3開始,DECIMAL 用更有效的格式來儲存。5.0.3開始,在計算 DECIMAL 值和舍入精確值的時候採用精確數學。

◆在以前,等待超時的鎖會導致 InnoDB回滾當前全部事務,從5.0.13開始,就只回滾最近的SQL語句了。

◆在4.1.13/5.0.8以前,DATETIME 的加0後就轉換成 YYYYMMDDHHMMSS 格式,現在變為YYYYMMDDHHMMSS.000000 格式了

◆4.1中,FLOAT 或 DOUBLE 之間的比較碰巧沒問題,但在5.0中可能就不行了

◆從5.0.3開始,VARCHAR 和 VARBINARY 欄位中末尾的空格不再刪除

◆增加了一個新的啟動選項 innodb_table_locks,它導致 LOCK TABLE 時也可以請求InnoDB 表鎖。這個選項預設開啟,不過可能在 AUTOCOMMIT=1 和 LOCK TABLES應用中會導致死鎖。看來,我只需主要關注 時間(TIMESTAMP, DATETIME< DATE, TIME) 和數值型(FLOAD, DOUBLE, DECIMAL) 這兩種型別的變化;另外,我升級過程中暫時還不需要涉及到字符集問題,因此相對輕鬆一些。

升級步驟如下:

執行

FLUSH TABLES WITH READ LOCK;

直接拷貝 MyISAM 表文件

用 mysqldump 匯出 Innodb 型別的表

整個過程都很順利,新系統啟動之後,發現如下2個問題:

新增了關鍵字 INOUT,因此需要檢查表結構中還有其他什麼欄位使用關鍵字了

DATE_FORMAT 函式要求嚴謹多了,

DATE_FORMAT('2006/11/24 09:14:00', '%Y-%m-%d %T') 
和DATE_FORMAT('2006/11/2409:14:00', '%Y-%m-%d %T')

的結果完全不一樣,在 4.0 中,能相容這兩種格式,而在 5.0 中,只能正確的使用前者了,後者則會有問題。這也應該是上面提到的時間型別發生的變化所致。

PHP:
PHP5以下幾個改進值得關注:
1、極大地提高了面向物件能力;
2、支援try/catch異常處理;
3、改進了字串地處理;
4、改經了xml和web服務支援;
5、對SQlite內建支援。

4. HEREDOC介紹
Heredoc技術,在正規的PHP文件中和技術書籍中一般沒有詳細講述,只是提到了這是一種Perl風格的字串輸出技術。但是現在的一些論壇程式,和部分文章系統,都巧妙的使用heredoc技術,來部分的實現了介面與程式碼的準分離,phpwind模板就是一個典型的例子。

1.以<<<End開始標記開始,以End結束標記結束,結束標記必須頂頭寫,不能有縮排和空格,且在結束標記末尾要有分號 。開始標記和開始標記相同,比如常用大寫的EOT、EOD、EOF來表示,但是不只限於那幾個,只要保證開始標記和結束標記不在正文中出現即可。

2.位於開始標記和結束標記之間的變數可以被正常解析,但是函式則不可以。在heredoc中,變數不需要用連線符.或,來拼接,如下:

$v=2;
$a= <<<EOF
"abc"$v
"123"
EOF;
echo $a; //結果連同雙引號一起輸出:"abc"2 "123"

3.heredoc常用在輸出包含大量HTML語法d文件的時候。比如:函式outputhtml()要輸出HTML的主頁。可以有兩種寫法。很明顯第二種寫法比較簡單和易於閱讀。

function outputhtml(){
echo "<html>";
echo "<head><title>主頁</title></head>"; 
echo "<body>主頁內容</body>";
echo "</html>;
}

function outputhtml()
{
echo <<<EOT
   <html>
   <head><title>主頁</title></head>
   <body>主頁內容</body>
   </html>
EOT;
}

outputhtml();

在heredoc中會自動替換其中的$變數,將命令和輸入放在一塊,方便

5. 寫出一些php魔幻方法;
php規定以兩個下劃線(__)開頭的方法都保留為魔術方法,所以建議大家函式名最好不用__開頭,除非是為了過載已有的魔術方法。
PHP中的魔術方法有 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone, __autoload
1、__get、__set
這兩個方法是為在類和他們的父類中沒有宣告的屬性而設計的
__get( $property ) 當呼叫一個未定義的屬性時,此方法會被觸發,傳遞的引數是被訪問的屬性名
__set( $property, $value ) 給一個未定義的屬性賦值時,此方法會被觸發,傳遞的引數是被設定的屬性名和值
這裡的沒有宣告包括當使用物件呼叫時,訪問控制為proteced,private的屬性(即沒有許可權訪問的屬性)。
2、__isset、__unset
__isset( $property ) 當在一個未定義的屬性上呼叫isset()函式時呼叫此方法
__unset( $property ) 當在一個未定義的屬性上呼叫unset()函式時呼叫此方法
與__get方法和__set方法相同,這裡的沒有宣告包括當使用物件呼叫時,訪問控制為proteced,private的屬性(即沒有許可權訪問的屬性)
3、__call
__call( $method, $arg_array ) 當呼叫一個未定義的方法是呼叫此方法
這裡的未定義的方法包括沒有許可權訪問的方法;如果方法不存在就去父類中找這個方法,如果父類中也不存在就去呼叫本類的__call()方​法,如果本類中不存在__call()方法就去找父類中的__call()方法

4、__autoload
__autoload 函式,它會在試圖使用尚未被定義的類時自動呼叫。通過呼叫此函式,指令碼引擎在 PHP 出錯失敗前有了最後一個機會載入所需的類。
如果要定義一個全域性的自動載入類,則必須用spl_autoload_register()方法將處理類註冊到PHP標準庫:
view plaincopy to clipboardprint?
<?php  
class Loader  
{  
static function autoload_class($class_name)  
{  
//尋找正確的$class_name類,並引入,沒有則丟擲異常  
}  
}  
  
/**
*   設定物件的自動載入
*   spl_autoload_register — Register given function as __autoload() implementation
*/  
spl_autoload_register(array('Loader', 'autoload_class'));  
  
$a = new Test();//Test沒用require就例項化,實現自動載入,很多框架就用這種方法自動載入類  
  
?>  
注意: 在 __autoload 函式中丟擲的異常不能被 catch 語句塊捕獲並導致致命錯誤,所以應該在函式本身做捕獲。
5、__construct、__destruct
__construct 構造方法,當一個物件建立時呼叫此方法,相對於PHP4使用此方法的好處是:可以使構造方法有一個獨一無二的名稱,無論它所在的類的名稱是什麼.這樣你在改變類的名稱時,就不需要改變構造方法的名稱
__destruct 析構方法,PHP將在物件被銷燬前(即從記憶體中清除前)呼叫這個方法。預設情況下,PHP僅僅釋放物件屬性所佔用的記憶體並銷燬物件相關的資源,解構函式允許你在使用一個物件之後執行任意程式碼來清除記憶體。當PHP決定你的指令碼不再與物件相關時,解構函式將被呼叫。
在一個函式的名稱空間內,這會發生在函式return的時候。
對於全域性變數,這發生於指令碼結束的時候。
如果你想明確地銷燬一個物件,你可以給指向該物件的變數分配任何其它值.通常將變數賦值勤為NULL或者呼叫unset.
6、__clone
PHP5中的物件賦值是使用的引用賦值,如果想複製一個物件則需要使用clone方法,在呼叫此方法是物件會自動呼叫__clone魔術方法,如果在物件複製需要執行某些初始化操作,可以在__clone方法實現。
7、__toString
__toString方法在將一個物件轉化成字串時自動呼叫,比如使用echo列印物件時。
如果類沒有實現此方法,則無法通過echo列印物件,否則會顯示:Catchable fatal error: Object of class test could not be converted to string in
此方法必須返回一個字串。
在PHP 5.2.0之前,__toString方法只有結合使用echo() 或 print()時 才能生效。PHP 5.2.0之後,則可以在任何字串環境生效(例如通過printf(),使用%s修飾符),但 不能用於非字串環境(如使用%d修飾符)。從PHP 5.2.0,如果將一個未定義__toString方法的物件 轉換為字串,會報出一個E_RECOVERABLE_ERROR錯誤。
8、__sleep、__wakeup
__sleep 序列化的時候用
__wakeup 反序列化的時候呼叫
serialize() 檢查類中是否有魔術名稱 __sleep 的函式。如果這樣,該函式將在任何序列化之前執行。它可以清除物件並應該返回一個包含有該物件中應被序列化的所有變數名的陣列。
使用 __sleep 的目的是關閉物件可能具有的任何資料庫連線,提交等待中的資料或進行類似的清除任務。此外,如果有非常大的物件而並不需要完全儲存下來時此函式也很有用。
相反地,unserialize() 檢查具有魔術名稱 __wakeup 的函式的存在。如果存在,此函式可以重建物件可能具有的任何資源。
使用 __wakeup 的目的是重建在序列化中可能丟失的任何資料庫連線以及處理其它重新初始化的任務。
9、__set_state
當呼叫var_export()時,這個靜態 方法會被呼叫(自PHP 5.1.0起有效)。
本方法的唯一引數是一個數組,其中包含按array(’property’ => value, …)格式排列的類屬性。
10、__invoke
當嘗試以呼叫函式的方式呼叫一個物件時,__invoke 方法會被自動呼叫。
PHP5.3.0以上版本有效
11、__callStatic
它的工作方式類似於 __call() 魔術方法,__callStatic() 是為了處理靜態方法呼叫,
PHP5.3.0以上版本有效
PHP 確實加強了對 __callStatic() 方法的定義;它必須是公共的,並且必須被宣告為靜態的。同樣,__call() 魔術方法必須被定義為公共的,所有其他魔術方法都必須如此

6.一些編譯php時的configure 引數  

./configure
–prefix=/usr/local/php                      php 安裝目錄
–with-apxs2=/usr/local/apache/bin/apxs
–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庫的支援
–enable-gd-native-ttf               支援TrueType字串函式庫
–with-curl                      開啟curl瀏覽工具的支援
–with-curlwrappers                 運用curl工具開啟url流
–with-ttf                      開啟freetype1.*的支援,可以不加了
–with-xsl            開啟XSLT 檔案支援,擴充套件了libxml2庫 ,需要libxslt軟體
–with-gettext                      開啟gnu 的gettext 支援,編碼庫用到
–with-pear            開啟pear命令的支援,php擴充套件用的
–enable-calendar             開啟日曆擴充套件功能
–enable-mbstring                  多位元組,字串的支援
–enable-bcmath                  開啟圖片大小調整,用到zabbix監控的時候用到了這個模組
–enable-sockets                  開啟 sockets 支援
–enable-exif                      圖片的元資料支援
–enable-magic-quotes               魔術引用的支援
–disable-rpath                     關閉額外的執行庫檔案
–disable-debug                  關閉除錯模式
–with-mime-magic=/usr/share/file/magic.mime      魔術標頭檔案位置
cgi方式安裝才用的引數
–enable-fpm                     打上php-fpm 補丁後才有這個引數,cgi方式安裝的啟動程式
–enable-fastcgi                  支援fastcgi方式啟動php
–enable-force-cgi-redirect             同上 ,幫助裡沒有解釋
–with-ncurses                     支援ncurses 螢幕繪製以及基於文字終端的圖形互動功能的動態庫
–enable-pcntl           freeTDS需要用到的,可能是連結mssql 才用到
mhash和mcrypt演算法的擴充套件
–with-mcrypt                     演算法
–with-mhash                     演算法
–with-gmp
–enable-inline-optimization
–with-openssl           openssl的支援,加密傳輸時用到的
–enable-dbase
–with-pcre-dir=/usr/local/bin/pcre-config    perl的正則庫案安裝位置
–disable-dmalloc
–with-gdbm                    dba的gdbm支援
–enable-sigchild
–enable-sysvsem
–enable-sysvshm
–enable-zend-multibyte              支援zend的多位元組
–enable-mbregex
–enable-wddx
–enable-shmop
–enable-soap
PHP配置選項完整列表
資料庫選項
–with-dbplus
包括 dbplus 的支援。
–with-adabas[=DIR]
包括 Adabas D 的支援。DIR 是 Adabas 的基本安裝目錄,預設為 /usr/local。
–with-sapdb[=DIR]
包括 SAP DB 的支援。DIR 是 SAP DB 的基本安裝目錄,預設為 /usr/local。
–with-solid[=DIR]
包括 Solid 的支援。DIR 是 Solid 的基本安裝目錄,預設為 /usr/local/solid。
–with-ibm-db2[=DIR]
包括 IBM DB2 的支援。DIR 是 DB2 的基本安裝目錄,預設為 /home/db2inst1/sqllib。
–with-empress[=DIR]
包括 Empress 的支援。DIR 是 Empress 的基本安裝目錄,預設為 $EMPRESSPATH。自 PHP4 起,本選項僅支援 Empress 8.60 及以上版本。
–with-empress-bcs[=DIR]
包括 Empress Local Access 的支援。DIR 是 Empress 的基本安裝目錄,預設為 $EMPRESSPATH。自 PHP4 起,本選項僅支援 Empress 8.60 及以上版本。
–with-birdstep[=DIR]
包括 Birdstep 的支援。DIR 是 Birdstep 的基本安裝目錄,預設為 /usr/local/birdstep。
–with-custom-odbc[=DIR]
包 括使用者自定義 ODBC 的支援。DIR 是 ODBC 的基本安裝目錄,預設為 /usr/local。要確認定義了 CUSTOM_ODBC_LIBS 並且在 include 目錄中有某個 odbc.h。例如,對於 QNX 下的 Sybase SQL Anywhere 5.5.00,在執行 configure 指令碼之前應該先定義以下環境變數: CPPFLAGS=”-DODBC_QNX -DSQLANY_BUG” LDFLAGS=-lunix CUSTOM_ODBC_LIBS=”-ldblib -lodbc”.
–with-iodbc[=DIR]
包括 iODBC 的支援。DIR 是 iODBC 的基本安裝目錄,預設為 /usr/local。
–with-esoob[=DIR]
包括 Easysoft OOB 的支援。DIR 是 OOB 的基本安裝目錄,預設為 /usr/local/easysoft/oob/client。
–with-unixODBC[=DIR]
包括 unixODBC 的支援。DIR 是 unixODBC 的基本安裝目錄,預設為 /usr/local。
–with-openlink[=DIR]
包括 OpenLink ODBC 的支援。DIR 是 OpenLink 的基本安裝目錄,預設為 /usr/local。這和 iODBC 一樣。
–with-dbmaker[=DIR]
包括 DBMaker 的支援。DIR 是 DBMaker 的基本安裝目錄,預設為最新版 DBMaker 安裝的目錄(例如 /home/dbmaker/3.6)。
–disable-unified-odbc
取消對 unified ODBC 的支援。僅適用於激活了 iODBC,Adabas,Solid,Velocis 或使用者自定義 ODBC 介面。僅能用於 PHP 3!
影象選項
–without-gd
禁用 GD 支援。僅用於 PHP 3!
–with-imagick
Imagick 擴充套件被移到 PEAR 中的 PECL 中去了,可以在這裡找到。PHP 4 中的安裝指示可以在 PEAR 站點中找到。
只用 –with-imagick 僅在 PHP 3 中支援,除非依照 PEAR 站點的指示去做。
–with-ming[=DIR]
包括 ming 支援。
雜類選項
–enable-force-cgi-redirect
啟用伺服器內部重定向的安全檢查。如果是在 Apache 中以 CGI 方式使用 PHP 則應該使用此選項。
–enable-discard-path
使用此選項可以使 PHP 的 CGI 可執行程式安全地放置在 web 目錄樹以外的地方,並且別人也不能繞過 .htaccess 的安全設定。
–with-fastcgi
將 PHP 編譯成 FastCGI 應用程式。
–enable-debug
編譯時加入除錯符號。
–with-layout=TYPE
設定安裝後的檔案佈局。TYPE 可以是 PHP(預設值)或者 GNU。
–with-pear=DIR
將 PEAR 安裝在 DIR 目錄中(預設為 PREFIX/lib/php)。
–without-pear
不安裝 PEAR。
–enable-sigchild
啟用 PHP 自己的 SIGCHLD 控制代碼。
–disable-rpath
禁止傳遞附加的執行時庫搜尋路徑。
–enable-libgcc
啟用顯式 libgcc 連線。
–enable-php-streams
包含試驗的 PHP 流。除非是測試原始碼,否則不要使用!
–with-zlib-dir=<DIR>;
定義 zlib 的安裝路徑。
–with-aspell[=DIR]
包含 ASPELL 支援。
–with-ccvs[=DIR]
包含 CCVS 支援。
–with-cybercash[=DIR]
包含 CyberCash 支援。DIR 是 CyberCash MCK 的安裝目錄。
–with-icap[=DIR]
包含 ICAP 支援。
–with-ircg-config
ircg-config 指令碼的路徑。
–with-ircg
包含 ircg 支援。
–enable-mailparse
包含 mailparse 支援。
–with-muscat[=DIR]
包含 muscat 支援。
–with-satellite[=DIR]
啟用通過 Satellite(試驗性質)的 CORBA 支援。DIR 是 ORBit 的主目錄。
–enable-trans-sid
啟用透明的 session id 傳播。
–with-regex[=TYPE]
使用系統 regex 庫(不贊成)。
–with-vpopmail[=DIR]
包含 vpopmail 支援。
–with-tsrm-pthreads
使用 POSIX 執行緒(預設值)。
–enable-shared[=PKGS]
編譯共享庫 [default=yes]。
–enable-static[=PKGS]
編譯靜態庫 [default=yes]。
–enable-fast-install[=PKGS]
為快速安裝而優化 [default=yes]。
–with-gnu-ld
假定 C 編譯器使用 GNU ld [default=no]。
–disable-libtool-lock
避免鎖死(可能會破壞並行編譯)。
–with-pic
嘗試只使用 PIC/non-PIC 物件 [default=use both]。
–enable-memory-limit
編譯時加入記憶體限制支援。
–disable-url-fopen-wrapper
禁止通過 URL 的 fopen wrapper,不能通過 HTTP 或 FTP 訪問檔案。
–enable-versioning
僅輸出所需要的符號。更多資訊見 INSTALL 檔案。
–with-imsp[=DIR]
包含 IMSp 支援(DIR 是 IMSP 的 include 目錄和 libimsp.a 目錄)。僅用於 PHP 3!
–with-mck[=DIR]
包含 Cybercash MCK 支援。DIR 是 cybercash mck 編譯目錄,預設為 /usr/src/mck-3.2.0.3-linux。幫助見 extra/cyberlib。僅用於 PHP 3!
–with-mod-dav=DIR
包含通過 Apache 的 mod_dav 的 DAV 支援。DIR 是 mod_dav 的安裝目錄(僅用於 Apache 模組版本!)僅用於 PHP 3!
–enable-debugger
編譯入遠端除錯函式。僅用於 PHP 3!
–enable-versioning
利用 Solaris 2.x 和 Linux 提供的版本控制與作用範圍的優勢。僅用於 PHP 3!
PHP 選項
–enable-maintainer-mode
啟用將編譯規則和未使用的(以及一些混淆的)依賴檔案放入臨時安裝中。
–with-config-file-path=PATH
設定 php.ini 所在的路徑,預設為 PREFIX/lib。
–enable-safe-mode
預設啟用安全模式。
–with-exec-dir[=DIR]
安全模式下只允許此目錄下執行程式。預設為 /usr/local/php/bin。
–enable-magic-quotes
預設啟用 magic quotes。
–disable-short-tags
預設禁止簡寫的 PHP 開始標記 <?。
伺服器選項
–with-aolserver=DIR
指定已安裝的 AOLserver 的路徑。
–with-apxs[=FILE]
編譯共享 Apache 模組。FILE 是可選的 Apache 的 apxs 工具的路徑,預設為 apxs。確保指定的 apxs 版本是安裝後的檔案而不是 Apache 源程式中包中的。
–with-apache[=DIR]
編譯 Apache 模組。DIR 是 Apache 源程式的最高一級目錄。預設為 /usr/local/apache。
–with-mod_charset
啟用 mod_charset 中的傳遞表(Apache 中)。
–with-apxs2[=FILE]
編譯共享的 Apache 2.0 模組。FILE 是可選的 Apache 的 apxs 工具的路徑,預設為 apxs。
–with-fhttpd[=DIR]
編譯 fhttpd 模組。DIR 是 fhttpd 的原始碼路徑,預設為 /usr/local/src/fhttpd。
–with-isapi=DIR
將 PHP 編譯為 ISAPI 模組用於 Zeus。
–with-nsapi=DIR
指定已安裝的 Netscape 伺服器路徑。
–with-phttpd=DIR
暫無資訊。
–with-pi3web=DIR
將 PHP 編譯為用於 Pi3Web 的模組。
–with-roxen=DIR
將 PHP 編譯為一個 Pike 模組。DIR 是 Roxen 的根目錄,通常為 /usr/local/roxen/server。
–enable-roxen-zts
編譯 Roxen 模組,使用 Zend Thread Safety。
–with-servlet[=DIR]
包含 servlet 支援。DIR 是 JSDK 的基本安裝目錄。本 SAPI 需要 java 擴充套件必須被編譯為共享的 dl。
–with-thttpd=SRCDIR
將 PHP 編譯為 thttpd 模組。
–with-tux=MODULEDIR

7.向php傳入引數的兩種方法。

8.(mysql)請寫出資料型別(int char varchar datetime text)的意思; 請問varchar和char有什麼區別;

char是一種固定長度的型別,varchar則是一種可變長度的型別,它們的區別是:

char(M)型別的資料列裡,每個值都佔用M個位元組,如果某個長度小於M,MySQL就會在它的右邊用空格字元補足.(在檢索操作中那些填補出來的空格字元將被去掉)在varchar(M)型別的資料列裡,每個值只佔用剛好夠用的位元組再加上一個用來記錄其長度的位元組(即總長度為L+1位元組).

在MySQL中用來判斷是否需要進行對據列型別轉換的規則

  1、在一個數據表裡,如果每一個數據列的長度都是固定的,那麼每一個數據行的長度也將是固定的.
  2、只要資料表裡有一個數據列的長度的可變的,那麼各資料行的長度都是可變的.
  3、如果某個資料表裡的資料行的長度是可變的,那麼,為了節約儲存空間,MySQL會把這個資料表裡的固定長度型別的資料列轉換為相應的可變長度型別.
例外:長度小於4個字元的char資料列不會被轉換為varchar型別

一個定長
一個不定長
a char(10)
b varchar(10)
都存入'abc'
a 10位元組
b 3位元組 

9. error_reporting 等除錯函式使用

錯誤提示E_ALL 0

10.您是否用過版本控制軟體? 如果有您用的版本控制軟體的名字是?

11.posix和perl標準的正則表示式區別;

正則表示式(Regular Expression,縮寫為regexp,regex或regxp),又稱正規表示式、正規表示式或常規表示式或正規化表示法或正規表示法,是指一個用來描述或者匹配一系列符合某個句法規則的字串的單個字串 。在很多文字編輯器或其他工具裡,正則表示式通常被用來檢索和/或替換那些符合某個模式的文字內容 。許多程式設計語言都支援利用正則表示式進行字串操作。例如,在Perl中就內建了一個功能強大的在正則表示式引擎。正則表示式這個概念最初是由 Unix中的工具軟體(例如sed和grep)普及開的。(摘自維基百科)

PHP同時使用兩套正則表示式規則,一套是由電氣和電子工程師協會(IEEE)制定的POSIX Extended 1003.2相容正則(事實上PHP對此標準的支援並不完善),另一套來自PCRE(Perl Compatible Regular Expression)庫提供PERL相容正則,這是個開放原始碼的軟體,作者為 Philip Hazel。

使用POSIX相容規則的函式有:
ereg_replace()
ereg()
eregi()
eregi_replace()
split()
spliti()
sql_regcase()
mb_ereg_match()
mb_ereg_replace()
mb_ereg_search_getpos()
mb_ereg_search_getregs()
mb_ereg_search_init()
mb_ereg_search_pos()
mb_ereg_search_regs()
mb_ereg_search_setpos()
mb_ereg_search()
mb_ereg()
mb_eregi_replace()
mb_eregi()
mb_regex_encoding()
mb_regex_set_options()
mb_split()

使用PERL相容規則的函式有:
preg_grep()
preg_replace_callback()
preg_match_all()
preg_match()
preg_quote()
preg_split()
preg_replace()

定界符:

POSIX相容正則沒有定界符,函式的相應引數會被認為是正則。

PERL相容正則可以使用任何不是字母、數字或反斜線(\)的字元作為定界符,如果作為定界符的字元必須被用在表示式本身中,則需要用反斜線轉義。也可以使用(),{},[] 和 <> 作為定界符

修正符:

POSIX相容正則沒有修正符。

PERL相容正則中可能使用的修正符(修正符中的空格和換行被忽略,其它字元會導致錯誤):

i (PCRE_CASELESS):
匹配時忽略大小寫。

m(PCRE_MULTILINE):
當設定了此修正符,行起始(^)和行結束($)除了匹配整個字串開頭和結束外,還分別匹配其中的換行符(\n)的之後和之前。

s(PCRE_DOTALL):
如果設定了此修正符,模式中的圓點元字元(.)匹配所有的字元,包括換行符。沒有此設定的話,則不包括換行符。

x(PCRE_EXTENDED):
如果設定了此修正符,模式中的空白字元除了被轉義的或在字元類中的以外完全被忽略。

e:
如果設定了此修正符,preg_replace() 在替換字串中對逆向引用作正常的替換,將其作為 PHP 程式碼求值,並用其結果來替換所搜尋的字串。 只有 preg_replace() 使用此修正符,其它 PCRE 函式將忽略之。

A(PCRE_ANCHORED):
如果設定了此修正符,模式被強制為“anchored”,即強制僅從目標字串的開頭開始匹配。

D(PCRE_DOLLAR_ENDONLY):
如果設定了此修正符,模式中的行結束($)僅匹配目標字串的結尾。沒有此選項時,如果最後一個字元是換行符的話,也會被匹配在裡面。如果設定了 m 修正符則忽略此選項。

S:
當一個模式將被使用若干次時,為加速匹配起見值得先對其進行分析。如果設定了此修正符則會進行額外的分析。目前,分析一個模式僅對沒有單一固定起始字元的 non-anchored 模式有用。

U(PCRE_UNGREEDY):
使“?”的預設匹配成為貪婪狀態的。

X(PCRE_EXTRA):
模式中的任何反斜線後面跟上一個沒有特殊意義的字母導致一個錯誤,從而保留此組合以備將來擴充。預設情況下,一個反斜線後面跟一個沒有特殊意義的字母被當成該字母本身。

u(PCRE_UTF8):
模式字串被當成UTF-8。

邏輯區隔:

POSIX相容正則和PERL相容正則的邏輯區隔符號作用和使用方法完全一致:
[]:包含任選一操作的相關資訊。
{}:包含匹配次數的相關資訊。
():包含一個邏輯區間的相關資訊,可被用來進行引用操作。
|:表示“或”,[ab]和a|b是等價的。

元字元與“[]”相關:

有兩組不同的元字元:一種是模式中除了方括號內都能被識別的,還有一種是在方括號“[]”內被識別的。

POSIX相容正則和PERL相容正則“[]之外”“一致”的元字元:
\ 有數種用途的通用轉義符
^ 匹配字串的開頭
$ 匹配字串的結尾
? 匹配0或者1
* 匹配 0 個或多個前面指定型別的字元
+ 匹配 1 個或多個前面指定型別的字元

POSIX相容正則和PERL相容正則“[]之外”“不一致”的元字元:
. PERL相容正則匹配除了換行符外的任意一個字元
. POSIX相容正則匹配任意一個字元

POSIX相容正則和PERL相容正則“[]之內”“一致”的元字元:
\ 有數種用途的通用轉義符
^ 取反字元,但僅當其為第一個字元時有效
- 指定字元ASCII範圍,仔細研究ASCII碼,你會發現[W-c]等價於[WXYZ\\^_`abc]

POSIX相容正則和PERL相容正則“[]之內”“不一致”的元字元:
- POSIX相容正則中[a-c-e]的指定會丟擲錯誤。
- PERL相容正則中[a-c-e]的指定等價於[a-e]。

匹配次數與“{}”相關:

POSIX相容正則和PERL相容正則在匹配次數方面完全一致:
{2}:表示匹配前面的字元2次
{2,}:表示匹配前面的字元2次或多次,預設都是貪婪(儘可能多)的匹配
{2,4}:表示匹配前面的字元2次或4次

邏輯區間與“()”相關:

使用()包含起來的區域是一個邏輯區間,邏輯區間的主要作用是體現出一些字元出現的邏輯次序,另一個用處就是可以用來引用(可以將此區間內的值引用給一個變數)。後一個作用比較奇特:
<?php
$str = "http://www.163.com/";
// POSIX相容正則:
echo ereg_replace("(.+)","<a href = \\1 >\\1</a>",$str);
// PERL相容正則:
echo preg_replace("/(.+)/","<a href = $1 >$1</a>",$str);
// 顯示兩個連結
?>

在引用的時候,括號是可以巢狀的,邏輯次序是按照“(”出現的次序來標定的。

型別匹配:

POSIX相容正則:
[:upper:]:匹配所有的大寫字母
[:lower:]:匹配所有的小寫字母
[:alpha:]:匹配所有的字母
[:alnum:]:匹配所有的字母和數字
[:digit:]:匹配所有的數字
[:xdigit:]:匹配所有的十六進位制字元,等價於[0-9A-Fa-f]
[:punct:]:匹配所有的標點符號,等價於 [.,"'?!;:]
[:blank:]:匹配空格和TAB,等價於[ \t]
[:space:]:匹配所有的空白字元,等價於[ \t\n\r\f\v]
[:cntrl:]:匹配所有ASCII 0到31之間的控制符。
[:graph:]:匹配所有的可列印字元,等價於:[^ \t\n\r\f\v]
[:print:]:匹配所有的可列印字元和空格,等價於:[^\t\n\r\f\v]
[.c.]:功能不明
[=c=]:功能不明
[:<:]:匹配單詞的開始
[:>:]:匹配單詞的結尾

PERL相容正則(這裡可以看出PERL正則的強大):
\a alarm,即 BEL 字元(’0)
\cx "control-x",其中 x 是任意字元
\e escape(’0B)
\f 換頁符 formfeed(’0C)
\n 換行符 newline(’0A)
\r 回車符 carriage return(’0D)
\t 製表符 tab(’0)
\xhh 十六進位制程式碼為 hh 的字元
\ddd 八進位制程式碼為 ddd 的字元,或 backreference
\d 任一十進位制數字
\D 任一非十進位制數的字元
\s 任一空白字元
\S 任一非空白字元
\w 任一“字”的字元
\W 任一“非字”的字元
\b 字分界線
\B 非字分界線
\A 目標的開頭(獨立於多行模式)
\Z 目標的結尾或位於結尾的換行符前(獨立於多行模式)
\z 目標的結尾(獨立於多行模式)
\G 目標中的第一個匹配位置

12.Safe_mode 開啟後哪些地方受限.

13.寫程式碼來解決多程序/執行緒同時讀寫一個檔案的問題。

大家都知道,PHP是沒有多執行緒概念的,儘管如此我們仍然可以用“不完美”的方法來模擬多執行緒。簡單的說,就是佇列處理。通過對檔案進行加鎖和解鎖,來實現。當一個檔案被一個使用者操作時,該檔案是被鎖定的,其他使用者只能等待,確實不夠完美,但是也可以滿足一些要求不高的應用。
function T_put($filename,$string){
$fp = fopen($filename,’a'); //追加方式開啟
if (flock($fp, LOCK_EX)){ //加寫鎖
fputs($fp,$string); //寫檔案
flock($fp, LOCK_UN); //解鎖
}
fclose($fp);
}
function T_get($filename,$length){
$fp = fopen($filename,’r'); //追加方式開啟
if (flock($fp, LOCK_SH)){ //加讀鎖
$result = fgets($fp,$length); //讀取檔案
flock($fp, LOCK_UN); //解鎖
}
fclose($fp);
return $result;
}

14.寫一段上傳檔案的程式碼。

15.Mysql 的儲存引擎,myisam和innodb的區別。

簡單的表達。
MyISAM 是非事務的儲存引擎。
innodb是支援事務的儲存引擎。

innodb的引擎比較適合於插入和更新操作比較多的應用
而MyISAM 則適合用於頻繁查詢的應用

MyISAM --表鎖。
innodb--設計合理的話是行鎖。
MyISAM 不會出現死鎖。

最大的區別就是MYISAM適合小資料,小併發;INNODB 適合大資料,大併發。最大的區別就是在鎖的級別上。

MyISAM型別不支援事務處理等高階處理,而InnoDB型別支援。 MyISAM型別的表強調的是效能,其執行數度比InnoDB型別更快,但是不提供事務支援,而InnoDB提供事務支援已經外部鍵等高階資料庫功能。綜述,就可以根據資料表不同的用處是用不同的儲存型別。而且MyISAM是檔案儲存的,可以進行直接在不同作業系統間拷貝使用。
 
InnoDB:
InnoDB 給 MySQL 提供了具有事務(commit)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)的事務安全(transaction-safe (ACID compliant))型表。InnoDB 提供了行鎖(locking on row level),提供與 Oracle 型別一致的不加鎖讀取(non-locking read in SELECTs)。這些特性均提高了多使用者併發操作的效能表現。在InnoDB表中不需要擴大鎖定(lock escalation),因為 InnoDB 的列鎖定(row level locks)適宜非常小的空間。InnoDB 是 MySQL 上第一個提供外來鍵約束(FOREIGN KEY constraints)的表引擎。InnoDB 的設計目標是處理大容量資料庫系統,它的 CPU 利用率是其它基於磁碟的關係資料庫引擎所不能比的。在技術上,InnoDB 是一套放在 MySQL 後臺的完整資料庫系統,InnoDB 在主記憶體中建立其專用的緩衝池用於高速緩衝資料和索引。 InnoDB 把資料和索引存放在表空間裡,可能包含多個檔案,這與其它的不一樣,舉例來說,在 MyISAM 中,表被存放在單獨的檔案中。InnoDB 表的大小隻受限於作業系統的檔案大小,一般為 2 GB。InnoDB所有的表都儲存在同一個資料檔案 ibdata1 中(也可能是多個檔案,或者是獨立的表空間檔案),相對來說比較不好備份,可以拷貝檔案或用navicat for mysql。
 
MyISAM
每張MyISAM 表被存放在三個檔案 :frm 檔案存放表格定義。 資料檔案是MYD (MYData) 。 索引檔案是MYI (MYIndex) 引伸。
因為MyISAM相對簡單所以在效率上要優於InnoDB,小型應用使用MyISAM是不錯的選擇。
MyISAM表是儲存成檔案的形式,在跨平臺的資料轉移中使用MyISAM儲存會省去不少的麻煩

2. web 架構,安全,專案經驗

  1. 介紹xdebug,apc,eAccelerator,Xcache,Zend opt的使用經驗。
  2. 使用mod_rewrite,在伺服器上沒有/archivers/567.html這個物理檔案時,重定向到index.php?id=567 ,請先開啟mod_rewrite.
  3. MySQL資料庫作釋出系統的儲存,一天五萬條以上的增量,預計運維三年,怎麼優化?
  4. 寫出一種排序演算法(原理),並說出優化它的方法。
  5. 請簡單闡述您最得意的開發之作
  6. 對於大流量的網站,您採用什麼樣的方法來解決各頁面訪問量統計問題
  7. 您是否用過模板引擎? 如果有您用的模板引擎的名字是?
  8. 請介紹Session的原理,大型網站中Session方面應注意什麼?
  9. 測試php效能和mysql資料庫效能的工具,和找出瓶頸的方法。
  10. 正則提出一個網頁中的所有連結.
  11. 介紹一下常見的SSO(單點登陸)方案(比如dedecms整合discuz的passport)的原理。
  12. 您寫過的PHP框架的特點,主要解決什麼問題,與其他框架的不同點。
  13. 大型的論壇/新聞文章系統/SNS網站在效能優化上有什麼區別?
  14. 相簿類應用:要求在瀏覽器中能同時選中並上傳多個檔案,圖片要求能剪裁,壓縮包在伺服器端解壓。能上傳單個達50M的檔案。上傳過程中有進度條顯示。每個圖片能生成四種大小縮圖,視訊檔案要轉成flv供flash播放。敘述要涉及的各類開源軟體和簡單用途。
  15. 一 群猴子排成一圈,按1,2,…,n依次編號。然後從第1只開始數,數到第m只,把它踢出圈,從它後面再開始數,再數到第m只,在把它踢出去…,如此不停的 進行下去,直到最後只剩下一隻猴子為止,那隻猴子就叫做大王。要求程式設計模擬此過程,輸入m、n, 輸出最後那個大王的編號。用程式模擬該過程。

3. unix/linux 基本使用

  1. linux下檢視當前系統負載資訊的一些方法。
  2. vim的基本快捷鍵。
  3. ssh 安全增強方法;密碼方式和rsa key 方式的配置。
  4. rpm/apt/yum/ports 裝包,查詢,刪除的基本命令。
  5. Makefile的基本格式,gcc 編譯,連線的命令,-O0 和-O3區別。
  6. gdb,strace,valgrind的基本使用.

4. 前端,HTML,JS

  1. css盒模型。
  2. javascript中的prototype。
  3. javascript中this物件的作用域。
  4. IE和firefox事件冒泡的不同。
  5. 什麼是怪異模式,標準模式,近標準模式。
  6. DTD的定義
  7. IE/firefox常用hack.
  8. firefox,IE下的前端js/css除錯工具。