1. 程式人生 > >盤點2019年PHP高階開發工程師面試題及答案彙總

盤點2019年PHP高階開發工程師面試題及答案彙總

今天小編給大家整理一下關於PHP培訓高階面試題及答案彙總,下面我們一起來看一下吧。

扣丁學堂盤點2018年PHP高階開發工程師面試題及答案彙總

1.寫出一個能建立多級目錄的PHP函式

/**

* 建立多級目錄

* @param $path string 要建立的目錄

* @param $mode int 建立目錄的模式,在windows下可忽略

*/

function create_dir($path,$mode = 0777)

{

if (is_dir($path)) {

# 如果目錄已經存在,則不建立

echo "該目錄已經存在";

} else {

# 不存在,建立

if (mkdir($path,$mode,true)) {

echo "建立目錄成功";

} else {

echo "建立目錄失敗";

}

}

}

?>

2.寫出smarty模板的特點?

速度快,編譯型,快取技術,外掛機制,強大的表現邏輯

3.開啟php.ini中的safe_mode,會影響哪些函式?至少說出6個

safe_mode,php安全模式,它提供一個基本安全的共享環境,在一個有多個使用者賬戶存在的php開發的web伺服器上。當安全模式開啟的時候,一 些函式將被完全的禁止,而另一些函式的功能將會受到限制, 如:chdir,move_uploaded_file,chgrp,parse_ini_file,chown,rmdir,copy,rename,fopen,require,mkdir,unlink 等。

注意,在php5.3以上版本,safe_mode被棄用,在php5.4以上版本,則將此特性完全去除了。

4.抓取遠端圖片到本地,你會用什麼函式?

file_get_contents或者curl

5.PHP的垃圾收集機制是怎樣的

PHP可以自動進行記憶體管理,清除不再需要的物件。

PHP使用了引用計數(reference counting)這種單純的垃圾回收(garbage collection)機制。每個物件都內含一個引用計數器,每個reference連線到物件,計數器加1。當reference離開生存空間或被設為 NULL,計數器減1。當某個物件的引用計數器為零時,PHP知道你將不再需要使用這個物件,釋放其所佔的記憶體空間。

6.請寫一段PHP程式碼,確保多個程序同時寫入同一個檔案成功?核心思路:加鎖

$fp = fopen("lock.txt","w+");

if (flock($fp,LOCK_EX)) {

//獲得寫鎖,寫資料

fwrite($fp, "write something");

// 解除鎖定

flock($fp, LOCK_UN);

} else {

echo "file is locking...";

}

fclose($fp);

?>

7.寫一個函式,儘可能高效的,從一個標準url裡取出檔案的副檔名?

// 方案一

function getExt1($url){

$arr = parse_url($url);

//Array ( [scheme] => http [host] => www.codingke.com [path] => /abc/de/fg.php [query] => id=1 )

$file = basename($arr['path']);

$ext = explode('.', $file);

return $ext[count($ext)-1];

}

// 方案二

function getExt2($url){

$url = basename($url);

$pos1 = strpos($url,'.');

$pos2 = strpos($url,'?');

if (strstr($url,'?')) {

return substr($url,$pos1+1,$pos2-$pos1-1);

} else {

return substr($url,$pos1);

}

}

$path = "http://www.codingke.com/abc/de/fg.php?id=1";

echo getExt1($path);

echo "

";

echo getExt2($path);

?>

相關題目:使用五種以上方式獲取一個檔案的副檔名,要求:dir/upload.image.jpg,找出.jpg或者jpg,必須使用PHP自帶的處理函式進行處理,方法不能明顯重複,可以封裝成函式,比如get_ext1(filename),getext2(file_name)

8.寫一個函式,能夠遍歷一個資料夾下的所有檔案和子資料夾。

function my_scandir($dir){

$files = array();

if(is_dir($dir)){

if ($handle = opendir($dir)) {

while (($flie = readdir($handle))!== false) {

if ($flie!="." && $file!="..") {

if (is_dir($dir."/".$file)) {

$files[$file] = my_scandir($dir."/".$file);

} else {

$files[] = $dir."/".$file;

}

}

}

closedir($handle);

return $files;

}

}

}

?>

[!!!]9.簡述論壇中無限分類的實現原理。(新浪)

建立類別表如下:

CREATE TABLE category(

cat_id smallint unsigned not null auto_increment primary key comment'類別ID',

cat_name VARCHAR(30)NOT NULL DEFAULT''COMMENT'類別名稱',

parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0 COMMENT'類別父ID'

)engine=MyISAM charset=utf8;

編寫一個函式,遞迴遍歷,實現無限分類

function tree($arr,$pid=0,$level=0){

static $list = array();

foreach ($arr as $v) {

//如果是頂級分類,則將其存到$list中,並以此節點為根節點,遍歷其子節點

if ($v['parent_id'] == $pid) {

$v['level'] = $level;

$list[] = $v;

tree($arr,$v['cat_id'],$level+1);

}

}

return $list;

}

?>

10.寫一個函式,算出兩個檔案的相對路徑,如a=′/a/b/c/d/e.php′;b='/a/b/12/34/c.php';計算出b相對於a的相對路徑應該是../../c/d(新浪)

function releative_path($path1,$path2){

$arr1 = explode("/",dirname($path1));

$arr2 = explode("/",dirname($path2));

for ($i=0,$len = count($arr2); $i < $len; $i++) {

if ($arr1[$i]!=$arr2[$i]) {

break;

}

}

// 不在同一個根目錄下

if ($i==1) {

$return_path = array();

}

// 在同一個根目錄下

if ($i != 1 && $i < $len) {

$return_path = array_fill(0, $len - $i,"..");

}

// 在同一個目錄下

if ($i == $len) {

$return_path = array('./');

}

$return_path = array_merge($return_path,array_slice($arr1,$i));

return implode('/',$return_path);

}

$a = '/a/b/c/d/e.php';

$b = '/a/b/12/34/c.php';

$c = '/e/b/c/d/f.php';

$d = '/a/b/c/d/g.php';

echo releative_path($a,$b);//結果是../../c/d

echo "

";

echo releative_path($a,$c);//結果是a/b/c/d

echo "

";

echo releative_path($a,$d);//結果是./

echo "

";

?>

11.mysql_fetch_row()和mysql_fetch_array()有什麼分別?

mysql_fetch_row()把資料庫的一列儲存在一個以零為基數的陣列中,第一欄在陣列的索引0,第二欄在索引1,依此類推。

mysql_fetch_assoc()把資料庫的一列儲存在一個關聯陣列中,陣列的索引就是欄位名稱,例如我的資料庫查詢送回 “first_name”、“last_name”、“email”三個欄位,陣列的索引便是“first_name”、“last_name”和 “email”。

mysql_fetch_array()可以同時送回mysql_fetch_row()和mysql_fetch_assoc()的值。

12.有一個網頁地址,比如:http://www.codingke.com/php/,如何得到它的內容?

方法1(對於PHP5及更高版本):

$readcontents=fopen("http://www.codingke.com/php/","rb");

$contents=stream_get_contents($readcontents);

fclose($readcontents);

echo $contents;

方法2:

echo file_get_contents("http://www.codingke.com/php/");

13.談談對mvc的認識

由模型(model),檢視(view),控制器(controller)完成的應用程式。

model層負責提供資料,和資料庫有關的操作都交給模型層來處理,view層則提供互動的介面,並輸出資料,而controller層則負責接收請求,並分發給相應的model來處理,然後呼叫view層來顯示。

14.What does the GD library do?

GD庫提供了一系列用來處理圖片的API,使用GD庫可以處理圖片,或者生成圖片。在網站上GD庫通常用來生成縮圖或者用來對圖片加水印或者對網站資料生成報表。自從PHP 4.3.0版本後GD便內建在PHP系統中。

15.What function can you use to open a file for reading and writing?

A.fget();

B.file_open();

C.fopen();

D.open_file();

答案:C

fget()這不是一個PHP函式,會引致執行錯誤。

file_open()這不是一個PHP函式,會引致執行錯誤。

fopen()這是正確答案,fopen()可以用來開啟檔案以便讀寫。

open_file()這不是一個PHP函式,會引致執行錯誤。

16.Smarty的原理

smarty是一個模板引擎,使用smarty主要是為了實現邏輯和外在內容的分離,如果不使用模板的話,通常的做法就是php程式碼和html程式碼混編。使用了模板之後,則可以將業務邏輯都放到php檔案中,而負責顯示內容的模板則放到html檔案中。

Smarty在執行display方法的時候,讀取模板檔案,並進行資料替換,生成編譯檔案,之後每次訪問都會直接訪問編譯檔案,讀取編譯檔案省去了讀取 模板檔案,和字串替換的時間,所以可以更快,編譯檔案裡時間戳記錄模板檔案修改時間,如果模板被修改過就可以檢測到,然後重新編譯(編譯是把靜態內容保 存起來,動態內容根據傳入的引數不同而不同)。

如果啟用了快取,則會根據編譯檔案生成快取檔案,在訪問的時候如果有快取檔案並且快取檔案沒有過期,則直接訪問快取檔案。

相關題目1:能夠使HTML和PHP分離開使用的模板

smarty,phplib等

相關題目2:您是否用過模板引擎?如果有您用的模板引擎的名字是?

Smarty

17.PHP如何實現頁面跳轉

方法一:php函式跳轉,缺點,header頭之前不能有輸出,跳轉後的程式繼續執行,可用exit中斷執行後面的程式。

header("Location:網址");//直接跳轉

header("refresh:3;url=http://www.codingke.com/");//三秒後跳轉

方法二:利用meta

echo"";

18.PHP可以和sql server/oracle等資料庫連線嗎?

可以

19.使用哪些工具進行版本控制?

SVN或者CVS

相關題目:您是否用過版本控制軟體?如果有您用的版本控制軟體的名字是?

TortoiseSVN-1.2.6

20.寫出一個正則表示式,過慮網頁上的所有JS/VBS指令碼(即把script標記及其內容都去掉):

過濾javascript指令碼參考:

header("content-type:text/html;charset=utf-8");

$script = "以下內容不顯示:";

$pattern = '/]*?>.*?/si';

echo preg_replace($pattern, "指令碼內容", $script);//以下內容不顯示:指令碼內容

?>

21.Given a line of text $string,how would you write a regular expression to strip all the HTML tags from it?

方案一,使用PHP內建函式strip_tags()除去HTML標籤

方案二,自定義函式,如下:

header("content-type:text/html;charset=utf-8");

function strip_html_tags($str){

$pattern = '/<("[^"]*"|'[^']*'|[^>"'])*>/';

return preg_replace($pattern,'',$str);

}

// 例項

$html = '

ddddd

';

echo strip_html_tags($html);

echo "

";

$html = '

bb

aaa

';

echo strip_html_tags($html);

?>

22.請寫一個函式驗證電子郵件的格式是否正確(要求使用正則)

preg_match('/^[w-.]+@[w-]+(.w+)+$/',$email);

23.請對POSIX風格和相容Perl風格兩種正則表示式的主要函式進行類比說明

主要區別有以下三種:

preg_replace()裡面的正則可以寫成型如:"/.xxx/"而ereg_replace()裡面的正則需寫成型如 "xxx"

preg_replace()能運算元組,而ereg_replace()不可以

在逆向引用用preg_replace()可使用0-99個,而ereg_replace()最多為9個

使用Perl相容正則表示式語法的preg_match()函式通常是比ereg()更快的替代方案。

24.請寫出並說明如何在命令列下執行PHP指令碼(寫出兩種方式)同時向PHP指令碼傳遞引數?(騰訊)

首先進入php安裝目錄

php -f d:/wamp/www/1.php 其中-f引數指定要執行的php檔案

php -r phpinfo(); 其中-r表示直接執行php程式碼,無需寫開始結束標記

25.使用正則表示式提取一段標識語言(html或xml)程式碼段中指定標籤的指定屬性值(需考慮屬性值對不規則的情況,如大小寫不敏感,屬性名值與等號間有空格等)。此處假設需提取test標籤的attr屬性值,請自行構建包含該標籤的串(騰訊)

編寫如下函式:

header("content-type:text/html;charset=utf-8");

function getAttrValue($str,$tagName,$attrName){

$pattern1="/<".$tagName."(\s+\w+s*=\s*([\'\"]?)([^\'\"]*)(\2))*\s+".$attrName."\s*=\s*([\'\"]?)([^\'\"]*)(\5)(\s+\w+\s*=\s*([\'\"]?)([^\'\"]*)(\9))*\s*>/i";

$arr=array();

$re=preg_match($pattern1,$str,$arr);

if($re){

echo"

$arr[6]={$arr[6]}";

}else{

echo"

沒找到。";

}

}

// 示例

$str1="";

getAttrValue($str1,"test","attr");//找test標籤中attr屬性的值,結果為ddd

$str2="";

getAttrValue($str2,"test2","t1");//找test2標籤中t1屬性的值,結果為t1 value

?>

26.What does the following code do?Explain what's going on there.date=′08/26/2003′;printeregreplace(“([0−9]+)/([0−9]+)/([0−9]+)”,2/1/3,date);(Yahoo)

這是把一個日期從MM/DD/YYYY的格式轉為DD/MM/YYYY格式。

輸出26/08/2003

27.What function would you use to redirect the browser to a new page?

A.redir()

B.header()

C.location()

D.redirect()

答案:B

redir()這不是一個PHP函式,會引致執行錯誤。

header()這個是正確答案,header()函式傳送頭資訊,可以用來使瀏覽器轉向到另一個頁面,例如:header("Location:http://www.search-this.com/")。

location()這不是一個PHP函式,會引致執行錯誤。

redirect()這不是一個PHP函式,會引致執行錯誤。

28.When turned on____________will_________your script with different variables from HTML forms and cookies.

A.show_errors,enable

B.show_errors,show

C.register_globals,enhance

D.register_globals,inject

答案:C

29.一個函式的引數不能是對變數的引用,除非在php.ini中把____設為on。

allow_call_time_pass_reference

是否啟用在函式呼叫時強制引數被按照引用傳遞

30.在HTML語言中,頁面頭部的meta標記可以用來輸出檔案的編碼格式,以下是一個標準的meta語句,請使用PHP語言寫一個函式,把一個標準HTML頁面���的類似meta標記中的charset部分值改為big5。(新浪)

請注意:

(1)需要處理完整的html頁面,即不光此meta語句

(2)忽略大小寫

(3)'和"在此處是可以互換的

(4)'Content-Type'兩側的引號是可以忽略的,但'text/html;charset=gbk'兩側的不行

(5)注意處理多餘空格

編寫正則表示式如下:

$reg1="/()/i";

31.PHP中如何判斷一個字串是否是合法的日期模式:2007-03-13 13:13:13。要求程式碼不超過5行。  function checkDateTime($data){

if (date('Y-m-d H:i:s',strtotime($data)) == $data) {

return true;

} else {

return false;

}

}

// 示例

$data = '2015-06-20 13:35:42';

var_dump(checkDateTime($data));//bool(true)

$data = '2015-06-36 13:35:42';

var_dump(checkDateTime($data));//bool(false)

?>

32.PHP中,如何獲得一個數組的鍵值?

使用key()可以獲得陣列中當前元素的鍵名,使用current()則可以返回當前元素的值。

使用array_keys()則可以得到陣列中所有的鍵名。

使用foreach結構foreach($arr as key=>value)可以通過key和value分別獲取鍵名和值。

33.如果模板是用smarty模板。怎樣用section語句來顯示一個名為$data的組。比如:

$data=array(

0=>array('id'=>8,'name'=>'name1'),

1=>array('id'=>10,'name'=>'name2'),

2=>array('id'=>15,'name'=>'name3')

);

寫出在模板頁的程式碼?若用foreach語句又要怎樣顯示呢?

用section語句:

<{section name=test loop=$data start=0 step=1}>

id:<{$data[test].id}>

name:<{$data[test].name}>

<{sectionelse}>

陣列為空

<{/section}>

用foreach語句:

<{foreach from=$data item=test}>

id:<{$test.id}>

name:<{$test.name}>

<{foreachelse}>

陣列為空

<{/foreach}>

34.哪個選項會匹配下邊的這個正則表示式?(/.*xyzd/)

A.*****xyz

B.*****xyz1

C.******xyz2

D.*xyz

答案:C

35.以下哪個錯誤無法被標準的錯誤控制器獲取?

A.E_WARNING

B.E_USER_ERROR

C.E_PARSE

D.E_NOTICE

答案:B

36.以下哪種錯誤型別無法被自定義的錯誤處理器捕捉到?

A.E_WARNING

B.E_USER_ERROR

C.E_PARSE

D.E_NOTICE

答案:C

37.(^s)|(s$)這個正則表示式作用是:__________;

匹配以0個或多個空白符開頭或者0個或多個空白符結尾的字串

38.編寫函式取得上一月的最後一天

date_default_timezone_set('PRC');

/**

* 獲取給定月份的上一月最後一天

* @param $date string 給定日期

* @return string 上一月最後一天

*/

function get_last_month_last_day($date = ''){

if ($date != '') {

$time = strtotime($date);

} else {

$time = time();

}

$day = date('j',$time);//獲取該日期是當前月的第幾天

return date('Y-m-d',strtotime("-{$day} days",$time));

}

// 測試

echo get_last_month_last_day();

echo "

";

echo get_last_month_last_day("2013-3-21");

?>

39.在很多時候,我們可以通過apache的主配置檔案來設定對test目錄的訪問許可權控制,如http://IP/test請問如果需設定test下的一個子目錄的訪問控制權限,是否可以在主配置檔案中修改,如果不可以應如何解決。

可以,還可以在需要控制的子目錄下建立.htaccess檔案,寫入訪問控制。

40.如果我的網站用的utf-8編碼,為防止亂碼出現,都需要注意哪些地方?

從以下幾個方面考慮:

資料庫中庫和表都用utf8編碼

php連線mysql,指定資料庫編碼為utf8 mysql_query(“set names utf8”);

php檔案指定頭部編碼為utf-8header(“content-type:text/html;charset=utf-8”);

網站下所有檔案的編碼為utf8

html檔案指定編碼為utf-8

41.在url中用get傳值的時候,若中文出現亂碼,應該用哪個函式對中文進行編碼?

urlencode()

42.寫出兩種對變數加密的函式?

md5(str);sha1(str);

43.如何把2009-9-2 10:30:25變成unix時間戳?

date_default_timezone_set("PRC");

// 將字串轉成Unix時間戳

$unix_time = strtotime("2009-9-2 10:30:45");

echo $unix_time;

echo "

";

// 格式化Unix時間戳為正常時間格式

echo date("Y-m-d H:i:s",$unix_time);

?>

44.如何把一個GB2312格式的字串裝換成UTF-8格式?

iconv('GB2312','UTF-8','悄悄是別離的笙簫');

?>

45.如果需要原樣輸出使用者輸入的內容,在資料入庫前,要用哪個函式處理?

htmlspecialchars或者htmlentities

46.寫出五種以上你使用過的PHP的擴充套件的名稱(提示:常用的PHP擴充套件)

mb_sring、iconv、curl、GD、XML、socket、MySQL、PDO等

47.瞭解MVC模式嗎?請寫出三種以上目前PHP流行的MVC框架名稱(不區分大小寫)

FleaPHP、Zend Framework、CakePHP、Symfony、ThinkPHP、YII、CodeIgniter等

48.php中WEB上傳檔案的原理是什麼,如何限制上傳檔案的大小?

上傳檔案的表單使用post方式,並且要在form中新增enctype='multipart/form-data'。

一般可以加上隱藏域:,位置在file域前面。

value的值是上傳檔案的客戶端位元組限制。可以避免使用者在花時間等待上傳大檔案之後才發現檔案過大上傳失敗的麻煩。

使用file檔案域來選擇要上傳的檔案,當點選提交按鈕之後,檔案會被上傳到伺服器中的臨時目錄,在指令碼執行結束時會被銷燬,所以應該在指令碼結束之前,將 其移動到伺服器上的某個目錄下,可以通過函式move_uploaded_file()來移動臨時檔案,要獲取臨時檔案的資訊,使用$_FILES。

限制上傳檔案大小的因素有:

客戶端的隱藏域MAX_FILE_SIZE的數值(可以被繞開)。

伺服器端的upload_max_filesize,post_max_size和memory_limit。這幾項不能夠用指令碼來設定。

自定義檔案大小限制邏輯。即使伺服器的限制是能自己決定,也會有需要個別考慮的情況。所以這個限制方式經常是必要的。

49.簡述UBB code的實現原理。(YG)

UBB程式碼是HTML的一個變種,通過程式自定義我們的標籤,比如“[a]PHP中UBB的使用[/a]”這樣的標籤,其實質就是查詢[a][/a]標籤,將其替換成的標準html,說白了,就是將標準的html標記通過技術手段使其簡化,其輸出出來的結果還是標準的html。

明白了ubb的原理,那麼再製作一個簡單的ubb編輯器就不難了,和fck之類的編輯器比較起來,ubb程式碼最大的優點就是程式碼簡單,功能很少,簡單的ubb只需要一個檔案,而且ubb標籤可以自己來定義,更改起來很方便,在php中就是利用替換函式就可以將

html進行標籤化,輸出時進行標籤的轉化。

50.怎麼把檔案儲存到指定目錄?怎麼避免上傳檔案重名問題?

可以自己設定上傳檔案的儲存目錄,與檔名拼湊形成一個檔案路徑,使用move_uploaded_file(),就可以完成將檔案儲存到指定目錄。

可以通過上傳的檔名獲取到檔案字尾,然後使用時間戳+隨機數+檔案字尾的方式為檔案重新命名,這樣就避免了重名。

51._____函式能返回腳本里的任意行中呼叫的函式的名稱。該函式同時還經常被用在除錯中,用來判斷錯誤是如何發生的。(奇矩互動)

debug_print_backtrace()

52.在Smarty模板語法中怎麼能遍歷陣列a=array(array(′id′=>0),array(′id′=>1),array(′id′=>2),……)id=>0−10000,怎麼判斷當id=>500,讓輸出的值在HTML裡變為紅色?(億郵)設陣列分配過來的陣列名為ids

{section name=temp loop=$ids}

{if $ids[temp].id==500}

{$ids[temp].id}

{esle}

{$ids[temp].id}

{/if}

{/section}

53.在Smarty模板語法中如何獲取當前時間,並且使用Y-m-d H:i:s的格式輸出?

使用{$smarty.now}來獲取當前時間,得到的是unix系統時間戳

使用變數調節器進行格式化,如下:

{$smarty.now|date_format:“%Y-%m-%d%H:%M:%S”}

54.在Smarty模板語法中如何獲取php的全域性環境變數

$smarty.get.變數 #顯示通過get方式傳過來的指定變數的值

$smarty.post.變數 #顯示通過post方式傳過來的指定變數的值

$smarty.cookies.變數 #顯示通過cookie中指定變數的值

$smarty.server.SERVER_NAME #顯示server變數值,$_SERVER系列變數

$smarty.env.PATH #顯示系統環境變數值,$_ENV系列變數

$smarty.session.變數 #顯示session中指定變數的值

$smarty.request.變數 #顯示通過post、get、cookie中指定變數的值

55.在Smarty模板中如何用自定義函式

使用模板分隔符包含,傳遞引數則使用HTML屬性的方式,例如:

{html_image file="pumpkin.jpg"}

56.列舉出你所知道的php系統函式庫例如,數學函式庫

mysql,gd,pdo,XML,zip,filesystem,mail等

57.假如讓你來寫一個函式實現Utf-8轉gb2312,那麼函式的名稱應該怎麼命名?(億郵)

utf8_to_gb2312或者utf8togb2312

58.請描述如下URL重寫規則的用意。

RewriteEngineon

RewriteCond%{REQUEST_FILENAME}!-f

RewriteCond%{REQUEST_FILENAME}!-d

RewriteBase/

RewriteRule./index.php[L]

如果REQUEST_FILENAME檔案存在,就直接訪問檔案,不進行下面的rewrite規則,

如果REQUEST_FILENAME目錄存在,就直接訪問目錄,不進行下面的rewrite規則,

RewriteRule./index.php[L]的意思是把所有的請求都給index.php處理。

59.Warning:Cannot modify header information-headers already sent by(output started at D:srcinit.php:7)in D:srcinit.php on line10通常什麼情況下php會報該警告資訊?

一般是在header、set_cookie以及session_start函式前面有輸出(包括空格)的情況下,會報該警告資訊

免費php框架效能優化微服務網站架構資料發放,需要評論留言或+V: