1. 基本知識點
503:請求超時 500:內部服務錯誤,一般是php程序錯誤導致401:未受權訪問 200 :正確響應 301::永久重定向 302:臨時重定向
* Include require include_once require_once的區別.
include與require區別:
include包含文件可以return返回值,require不能 ;
require不能在控制結構中根據條件的不同而包含不同的文件。require()語句只會在第一次執行時調用它所包含的文件中的內容替換本身這條語句,當再次被執行時只能執行第一次所包含的語句。但是include()語句可以在循環體中來包含不同的文件,所以php解析器每次遇到include()語句時,對它進行重新處理。
在程序中只要有require,就會被包含,即使你在一個非真的if語句裏,所以require一般都放在程序的最頭部,
require()語句在PHP程序執行前就會將使用require引用的文件讀入,如果requrie包含文件出錯,程序會中止,include語句只有在被執行時纔會讀入要包含的文件,如果include包含文件出錯,程序會跳過錯誤,繼續執行
include_once與include(require_once與require) 區別
include_once會檢查是否在其它地方導入過,有導入過則不在重複導入,這樣可以避免函數或變量重複定義的錯誤,而include會無限數導入,
require_once同上
* PHP/Mysql中幾個版本的進化史,比如mysql4.0到4.1,PHP4.x到5.1的重大改進等等。
mysql4.1 改進了子查詢(MyIsam用了R-trees)5.0增加了存諸過程 視圖 遊標 5.1 有觸發器,約束,InnoDB外鍵等改進
php5主要增強了oo特性,比如構造/析構函數,類中屬性和方法的類型(public,private,protected)一些魔術方法(__call,__set,__get等),接口等
* HEREDOC介紹
* 寫出一些php魔幻方法;
* 一些編譯php時的configure 參數
prefix,with-config-file,with-mysql ,with-myqli,with-gd,with-curl,with-iconv,with-mbstr等
* 向php傳入參數的兩種方法。
get , post
* (mysql)請寫出數據類型(int char varchar datetime text)的意思;請問varchar和char有什麼區別;
int:數字型 範圍:-2147483648 to 2147483647
cahr:固定長度字符串
varchar :可變長度字符串
datetime : 0000-00-00 00:00:00 時間類型
text : 超長字符串,可存2^16-1字節
varchar與char區別:一個固定,一個可變,所以char一般情況下所佔空間更大,但查詢更快(不需要計算字符串長度)
* error_reporting等調試函數使用
一般在生產環境上設置爲:error_reporting(0)用來不顯示錯誤,開發環境設置爲:error_reporting(E_ALL)用來顯示所有錯誤
* 您是否用過版本控制軟件?如果有您用的版本控制軟件的名字是?
用過,subsvn
* 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次
- 邏輯區間與“()”相關:
- 使用()包含起來的區域是一個邏輯區間,邏輯區間的主要作用是體現出一些字符出現的邏輯次序,另一個用處就是可以用來引用(可以將此區間內的值引用給一個變量)。後一個作用比較奇特:
- 在引用的時候,括號是可以嵌套的,邏輯次序是按照“(”出現的次序來標定的。
- 類型匹配:
- 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 目標的結尾(獨立於多行模式)
會影響到system,passthru,exec,shell_exec,popen,phpinfo等等大部分的文件操作函數。
* 寫一段上傳文件的代碼。
functionuploadAllFile($file,$filename,$dir,$maxsize) {
if($_[$file]['size']>$maxsize)
{
return-2; //返回-2表示上傳文件大小大於規定大小
}
else
{
if(substr($dir,-1)!='/')
{
$dir =$dir.'/';
}
else
{
$dir =$dir;
}
if($filename=='')
{
$tempname= @explode('.',$_FILES[$file]['name']);
$filename= $tempname[0];
$FileExt= $tempname[1];
}else{
$tempname= @explode('.',$_FILES[$file]['name']);
$FileExt= $tempname[1];
}
$filepath =$dir.$filename.'.'.$FileExt;
if(@move_uploaded_file($_FILES[$file]['tmp_name'],$dir.$filename.'.'.$FileExt))
{
return$filepath; //表示上傳文件成功
}
else
{
return0; //返回0表示上傳文件失敗
} } }
* 寫代碼來解決多進程/線程同時讀寫一個文件的問題。
- 大家都知道,PH是沒有多線程概念的,儘管如此我們仍然可以用“不完美”的方法來模擬多線程。簡單的說,就是隊列處理。通過對文件進行加鎖和解鎖,來實現。當一個文件被一個用戶操作時,該文件是被鎖定的,其他用戶只能等待,確實不夠完美,但是也可以滿足一些要求不高的應用。
- 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事件冒泡的不同。
http://blog.sina.com.cn/s/blog_70a32ec401014yb8.html
* 什麼是怪異模式,標準模式,近標準模式。
* DTD的定義
* IE/firefox常用hack.
* firefox,IE下的前端js/css調試工具。