PHP高級工程師的麵試題


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 協議版本。   

Include require include_once require_once 的區別.

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

PHP5以下幾個改進值得關注:  

1、極大地提高了麵向對象能力;  

2、支持try/catch異常處理;  

3、改進了字符串地處理;  

4、改經了xml和web服務支持;  

5、對SQlite內置支持。  

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 中,隻能正確的使用前者了,後者則會有問題。這也應該是上麵提到的時間類型發生的變化所致。  

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中會自動替換其中的$變量,將命令和輸入放在一塊,方便  

寫出一些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() 魔術方法必須被定義為公共的,所有其他魔術方法都必須如此  

一些編譯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  

向php傳入參數的兩種方法。

(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字節   

error_reporting 等調試函數使用

您是否用過版本控製軟件? 如果有您用的版本控製軟件的名字是?

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 目標中的第一個匹配位置  

Safe_mode 打開後哪些地方受限.

寫代碼來解決多進程/線程同時讀寫一個文件的問題。
 

大家都知道,PHP是沒有多線程概念的,盡管如此7m视频仍然可以用“不完美”的方法來模擬多線程。簡單的說,就是隊列處理。通過對文件進行加鎖和解鎖,來實現。當一個文件被一個用戶操作時,該文件是被鎖定的,其他用戶隻能等待,確實不夠完美,但是也可以滿足一些要求不高的應用。  

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;  

}  

寫一段上傳文件的代碼。

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 架構,安全,項目經驗

介紹xdebug,apc,eAccelerator,Xcache,Zend opt的使用經驗。

使用mod_rewrite,在服務器上沒有/archivers/567.html這個物理文件時,重定向到index.php?id=567 ,請先打開mod_rewrite.

MySQL數據庫作發布係統的存儲,一天五萬條以上的增量,預計運維三年,怎麽優化?

寫出一種排序算法(原理),並說出優化它的方法。

請簡單闡述您最得意的開發之作

對於大流量的網站,您采用什麽樣的方法來解決各頁麵訪問量統計問題

您是否用過模板引擎? 如果有您用的模板引擎的名字是?

請介紹Session的原理,大型網站中Session方麵應注意什麽?

測試php性能和mysql數據庫性能的工具,和找出瓶頸的方法。

正則提出一個網頁中的所有鏈接.

介紹一下常見的SSO(單點登陸)方案(比如dedecms整合discuz的passport)的原理。

您寫過的PHP框架的特點,主要解決什麽問題,與其他框架的不同點。

大型的論壇/新聞文章係統/SNS網站在性能優化上有什麽區別?

相冊類應用:要求在瀏覽器中能同時選中並上傳多個文件,圖片要求能剪裁,壓縮包在服務器端解壓。能上傳單個達50M的文件。上傳過程中有進度條顯示。每個圖片能生成四種大小縮略圖,視頻文件要轉成flv供flash播放。敘述要涉及的各類開源軟件和簡單用途。

一 群猴子排成一圈,按1,2,…,n依次編號。然後從第1隻開始數,數到第m隻,把它踢出圈,從它後麵再開始數,再數到第m隻,在把它踢出去…,如此不停的 進行下去,直到最後隻剩下一隻猴子為止,那隻猴子就叫做大王。要求編程模擬此過程,輸入m、n, 輸出最後那個大王的編號。用程序模擬該過程。

3. unix/linux 基本使用

linux下查看當前係統負載信息的一些方法。

vim的基本快捷鍵。

ssh 安全增強方法;密碼方式和rsa key 方式的配置。

rpm/apt/yum/ports 裝包,查詢,刪除的基本命令。

Makefile的基本格式,gcc 編譯,連接的命令,-O0 和-O3區別。

gdb,strace,valgrind的基本使用.

4. 前端,HTML,JS

css盒模型。

javascript中的prototype。

javascript中this對象的作用域。

IE和firefox事件冒泡的不同。

什麽是怪異模式,標準模式,近標準模式。

DTD的定義

IE/firefox常用hack.

firefox,IE下的前端js/css調試工具。


上一篇 下一篇