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的重大改進等等。
- MySQL:
-
- 1、從 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 類型的函數的結果會被轉換成時間型
-
- 2、再看從 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如下幾個改進值得關注:
- 一、極大地提升了面向對象能力;
- 二、支持try/catch異常處理;
- 三、改進了字符串地處理;
- 四、改經了xml和web服務支持;
- 五、對SQlite內置支持。
- HEREDOC介紹
- Heredoc技術,在正規的PHP文檔中和技術書籍中通常沒有詳細講述,只是提到了這是一種Perl風格的字符串輸出技術。可是如今的一些論壇程序,和部分文章系統,都巧妙的使用heredoc技術,來部分的實現了界面與代碼的準分離,phpwind模板就是一個典型的例子。
-
- 1.以<<<End開始標記開始,以End結束標記結束,結束標記必須頂頭寫,不能有縮進和空格,且在結束標記末尾要有分號 。開始標記和開始標記相同,好比經常使用大寫的EOT、EOD、EOF來表示,可是不僅限於那幾個,只要保證開始標記和結束標記不在正文中出現便可。
-
- 2.位於開始標記和結束標記之間的變量能夠被正常解析,可是函數則不能夠。在heredoc中,變量不須要用鏈接符.或,來拼接,以下:
-
- $v=2;
- $a= <<<EOF
- "abc"$v
- "123"
- EOF;
- echo $a;
-
- 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
- 一、__get、__set
- 這兩個方法是爲在類和他們的父類中沒有聲明的屬性而設計的
- __get( $property ) 當調用一個未定義的屬性時,此方法會被觸發,傳遞的參數是被訪問的屬性名
- __set( $property, $value ) 給一個未定義的屬性賦值時,此方法會被觸發,傳遞的參數是被設置的屬性名和值
- 這裏的沒有聲明包括當使用對象調用時,訪問控制爲proteced,private的屬性(即沒有權限訪問的屬性)。
- 二、__isset、__unset
- __isset( $property ) 當在一個未定義的屬性上調用isset()函數時調用此方法
- __unset( $property ) 當在一個未定義的屬性上調用unset()函數時調用此方法
- 與__get方法和__set方法相同,這裏的沒有聲明包括當使用對象調用時,訪問控制爲proteced,private的屬性(即沒有權限訪問的屬性)
- 三、__call
- __call( $method, $arg_array ) 當調用一個未定義的方法是調用此方法
- 這裏的未定義的方法包括沒有權限訪問的方法;若是方法不存在就去父類中找這個方法,若是父類中也不存在就去調用本類的__call()方法,若是本類中不存在__call()方法就去找父類中的__call()方法
-
- 四、__autoload
- __autoload 函數,它會在試圖使用還沒有被定義的類時自動調用。經過調用此函數,腳本引擎在 PHP 出錯失敗前有了最後一個機會加載所需的類。
- 若是要定義一個全局的自動加載類,則必須用spl_autoload_register()方法將處理類註冊到PHP標準庫:
- view plaincopy to clipboardprint?
- <?php
- class Loader
- {
- static function autoload_class($class_name)
- {
- }
- }
-
- spl_autoload_register(array('Loader', 'autoload_class'));
-
- $a = new Test();
-
- ?>
- 注意: 在 __autoload 函數中拋出的異常不能被 catch 語句塊捕獲並致使致命錯誤,因此應該在函數自己作捕獲。
- 五、__construct、__destruct
- __construct 構造方法,當一個對象建立時調用此方法,相對於PHP4使用此方法的好處是:可使構造方法有一個獨一無二的名稱,不管它所在的類的名稱是什麼.這樣你在改變類的名稱時,就不須要改變構造方法的名稱
- __destruct 析構方法,PHP將在對象被銷燬前(即從內存中清除前)調用這個方法。默認狀況下,PHP僅僅釋放對象屬性所佔用的內存並銷燬對象相關的資源,析構函數容許你在使用一個對象以後執行任意代碼來清除內存。當PHP決定你的腳本再也不與對象相關時,析構函數將被調用。
- 在一個函數的命名空間內,這會發生在函數return的時候。
- 對於全局變量,這發生於腳本結束的時候。
- 若是你想明確地銷燬一個對象,你能夠給指向該對象的變量分配任何其它值.一般將變量賦值勤爲NULL或者調用unset.
- 六、__clone
- PHP5中的對象賦值是使用的引用賦值,若是想複製一個對象則須要使用clone方法,在調用此方法是對象會自動調用__clone魔術方法,若是在對象複製須要執行某些初始化操做,能夠在__clone方法實現。
- 七、__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錯誤。
- 八、__sleep、__wakeup
- __sleep 串行化的時候用
- __wakeup 反串行化的時候調用
- serialize() 檢查類中是否有魔術名稱 __sleep 的函數。若是這樣,該函數將在任何序列化以前運行。它能夠清除對象並應該返回一個包含有該對象中應被序列化的全部變量名的數組。
- 使用 __sleep 的目的是關閉對象可能具備的任何數據庫鏈接,提交等待中的數據或進行相似的清除任務。此外,若是有很是大的對象而並不須要徹底儲存下來時此函數也頗有用。
- 相反地,unserialize() 檢查具備魔術名稱 __wakeup 的函數的存在。若是存在,此函數能夠重建對象可能具備的任何資源。
- 使用 __wakeup 的目的是重建在序列化中可能丟失的任何數據庫鏈接以及處理其它從新初始化的任務。
- 九、__set_state
- 當調用var_export()時,這個靜態 方法會被調用(自PHP 5.1.0起有效)。
- 本方法的惟一參數是一個數組,其中包含按array(’property’ => value, …)格式排列的類屬性。
- 十、__invoke
- 當嘗試以調用函數的方式調用一個對象時,__invoke 方法會被自動調用。
- PHP5.3.0以上版本有效
- 十一、__callStatic
- 它的工做方式相似於 __call() 魔術方法,__callStatic() 是爲了處理靜態方法調用,
- PHP5.3.0以上版本有效
- PHP 確實增強了對 __callStatic() 方法的定義;它必須是公共的,而且必須被聲明爲靜態的。一樣,__call() 魔術方法必須被定義爲公共的,全部其餘魔術方法都必須如此
- 一些編譯php時的configure 參數
- 向php傳入參數的兩種方法。
- (mysql)請寫出數據類型(int char varchar datetime text)的意思; 請問varchar和char有什麼區別;
- char是一種固定長度的類型,varchar則是一種可變長度的類型,它們的區別是:
-
- char(M)類型的數據列裏,每一個值都佔用M個字節,若是某個長度小於M,MySQL就會在它的右邊用空格字符補足.(在檢索操做中那些填補出來的空格字符將被去掉)在varchar(M)類型的數據列裏,每一個值只佔用恰好夠用的字節再加上一個用來記錄其長度的字節(即總長度爲L+1字節).
-
- 在MySQL中用來判斷是否須要進行對據列類型轉換的規則
-
- 一、在一個數據表裏,若是每個數據列的長度都是固定的,那麼每個數據行的長度也將是固定的.
- 二、只要數據表裏有一個數據列的長度的可變的,那麼各數據行的長度都是可變的.
- 三、若是某個數據表裏的數據行的長度是可變的,那麼,爲了節約存儲空間,MySQL會把這個數據表裏的固定長度類型的數據列轉換爲相應的可變長度類型.
- 例外:長度小於4個字符的char數據列不會被轉換爲varchar類型
-
- 一個定長
- 一個不定長
- a char(10)
- b varchar(10)
- 都存入'abc'
- a 10字節
- b 3字節
- error_reporting 等調試函數使用
- 您是否用過版本控制軟件? 若是有您用的版本控制軟件的名字是?
- posix和perl標準的正則表達式區別;
- Safe_mode 打開後哪些地方受限.
- 寫代碼來解決多進程/線程同時讀寫一個文件的問題。
- 你們都知道,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的區別。
- 簡單的表達。
- 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調試工具。
歡迎關注本站公眾號,獲取更多信息