整理了一份招PHP高級工程師的面試題,php高級工程師
1. 基本知識點
。。。
Include require include_once require_once 的區別.
PHP/Mysql中幾個版本的進化史,比如mysql4.0到4.1,PHP 4.x到5.1的重大改進等等。
Php代碼
- 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:
Php代碼
- PHP5以下幾個改進值得關注:
- 1、極大地提高了面向對象能力;
- 2、支持try/catch異常處理;
- 3、改進了字符串地處理;
- 4、改經了xml和web服務支持;
- 5、對SQlite內置支持。
HEREDOC介紹
Php代碼
- 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規定以兩個下劃線(__)開頭的方法都保留為魔術方法,所以建議大家函數名最好不用__開頭,除非是為了重載已有的魔術方法。
- 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 參數
Php代碼
- ./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有什麼區別;
Sql代碼
- 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標准的正則表達式區別;
Php代碼
- 正則表達式(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代碼
- 大家都知道,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;
- }
寫一段上傳文件的代碼。
Mysql 的存儲引擎,myisam和innodb的區別。
Sql代碼
- 簡單的表達。
- 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 架構,安全,項目經驗
3. unix/linux 基本使用
4. 前端,HTML,JS
php面試題
以下哪一句不會把 John 新增到 users 陣列?
$users[] = 'john';
成功把 John 新增到陣列 users。
array_add($users,’john’);
函式 array_add() 無定義。
array_push($users,‘john’);
成功把 John 新增到陣列 users。
$users ||= 'john';
語法錯誤。
2.sort()、assort()、和 ksort() 有什麼分別?它們分別在什麼情況下使用?
sort()
根據陣列中元素的值,以英文字母順序排序,索引鍵會由 0 到 n-1 重新編號。主要是當陣列索引鍵的值無關疼癢時用來把陣列排序。
assort()
PHP 沒有 assort() 函式,所以可能是 asort() 的筆誤。
asort()
與 sort() 一樣把陣列的元素按英文字母順序來排列,不同的是所有索引鍵都獲得保留,特別適合替聯想陣列排序。
ksort()
根據陣列中索引鍵的值,以英文字母順序排序,特別適合用於希望把索引鍵排序的聯想陣列。
3.以下的代碼會產生什麼?為什麼?
$num =10;
function multiply(){
$num =$num *10;
}
multiply();
echo $num;
由於函式 multiply() 沒有指定 $num 為全域變量(例如 global $num 或者 $_GLOBALS['num']),所以 $num 的值是 10。
4. reference 跟一個正規的變量有什麼分別?如何 pass by reference?在什麼情況下我們需要這樣做?
Reference 傳送的是變量的地址而非它的值,所以在函式中改變一個變量的值時,整個應用都見到這個變量的新值。
一個正規變量傳送給函式的是它的值,當函式改變這個變量的值時,只有這個函式才見到新值,應用的其他部分仍然見到舊值。
$myVariable = "its' value";
Myfunction(&$myVariable); // 以 reference 傳送參數以 reference 傳送參數給函式,可以使函式改變了的變量,即使在函式結束後仍然保留新值。
5.些函式可以用來在現正執行的腳本中插入函式庫?
對這道題目不同的理解會有不同的答案,我的第一個想法是插入 PHP 函式庫不外乎 include()、include_once()、require()、require_once(),但細心再想,“函式庫”也應該包括 com 物件和 .net 函式庫,所以我們的答案也要分別包括 com_load 和 dotnet_load,下次有人提起“函式庫”的時候,別忘記這兩個函式。
6.foo() 與 @foo() 有什麼分別?
foo() 會執行這個函式,任何解譯錯誤、語法錯誤、執行錯誤都會在頁面上顯示出來。
@foo() 在執行這個函式時,會隱藏所有上述的錯誤訊息。
很多應用程式都使用 @mysql_connect() 和 @mysql_query 來隱藏 mysql 的錯誤訊息,我認為這是很嚴重的失誤,因為錯誤不該被隱藏,你必須妥善處理它們,可能的話解決它們。
7.你如何替 PHP 的應用程式偵錯?
我並不常這樣做,我曾經試過很多不同的偵錯工具,在 Linux 系統中設定這些工具一點也不容易。不過以下我會介紹一個近來頗受注目的偵錯工具。
PHP......余下全文>>
PHP面試題 有點難度的
take it easy