php面試常見(jiàn)問(wèn)題
PHP技術(shù)員的操作能力也會(huì)在面試中考察,能否快速準(zhǔn)確地回答問(wèn)題,快來(lái)學(xué)習(xí)php面試常見(jiàn)問(wèn)題啦,增加面試通過(guò)率,小編帶你一起學(xué)習(xí)。
php面試常見(jiàn)問(wèn)題(一)
1、表單提交get和post有何區(qū)別?
答:get的方式是把數(shù)據(jù)在地址欄中發(fā)送,get傳送的數(shù)據(jù)量較小,不能大于2KB。post傳送的數(shù)據(jù)量較大,一般被默認(rèn)為不受限制。但理論上,IIS4中最大量為80KB,IIS5中為100KB。
2、用PHP打印出前一天的時(shí)間格式是2006-5-10 22:21:21
echo date("Y-m-d H:i:s",time()-(3600*24));或echo date("Y-m-d H:i:s",strtotime("-1 day"));
3、php中include和require的區(qū)別?
這兩種結(jié)構(gòu)除了在如何處理失敗之外完全一樣。include() 產(chǎn)生一個(gè)警告而 require() 則導(dǎo)致一個(gè)致命錯(cuò)誤。換句話說(shuō),如果你想在遇到丟失文件時(shí)停止處理頁(yè)面就用 require()。include() 就不是這樣,腳本會(huì)繼續(xù)運(yùn)行。
4、echo(),print(),print_r()的區(qū)別
echo可以接多個(gè)參數(shù),print只能接一個(gè)參數(shù),它們都是PHP的語(yǔ)言結(jié)構(gòu),print_r是遞規(guī)打印,用來(lái)打印數(shù)組或?qū)ο?/p>
5、能夠使HTML和PHP分離開(kāi)使用的模板
smarty,phplib,SmartTemplate 6你如何理解MVC模式?
首先說(shuō)一下框架,框架:就是別人把一些底層,常用操作.比如數(shù)據(jù)操作(增,刪,改,查)寫好.你來(lái)直接用.其它的功能要自己來(lái)做。
MVC:設(shè)計(jì)模式,M模型,V顯示,C控制.現(xiàn)在許多框架都是基于MVC來(lái)做的把邏輯和顯示分開(kāi).比如你要換頁(yè)面,只需要改V里面的東西并不需要再去變動(dòng)程序(詳細(xì)的東西可以上網(wǎng)上!
查一下)
7、如何實(shí)現(xiàn)PHP、JSP交互?
PHP提供了支持JAVA的類庫(kù)文件,或者通過(guò)HTTP協(xié)議來(lái)交互數(shù)據(jù)
8、使用哪些工具進(jìn)行版本控制?
VSS,CVS,SVN
9、如何實(shí)現(xiàn)字符串翻轉(zhuǎn)?
不考慮中英文混合,不是最優(yōu)算法,不用php庫(kù)函數(shù)翻轉(zhuǎn)字符串:
function str_to_reverse( $str ){
for($length=0;$str[$length]!=null;$length++){;}
$strlength = $length-1;
unset($length);
for($start=0,$end=$strlength;$start<$end;$start++,$end--){
$temp = $str[$start];
$str[$start] = $str[$end];
$str[$end] = $temp;
}
unset($temp,$start,$end,$strlength);
return $str;
}
10、優(yōu)化MYSQL數(shù)據(jù)庫(kù)的方法。
1) 將where中用的比較頻繁的字段建立索引,聯(lián)合索引。
2) 保證單表數(shù)據(jù)不超過(guò)200W,適時(shí)分割表。
3) 避免使用長(zhǎng)連接。
4) 修改my.cnf里面的各項(xiàng)參數(shù),比如最大連接數(shù),查詢緩存等。根據(jù)你的服務(wù)器內(nèi)存來(lái)最大化調(diào)節(jié)那些配置參數(shù)。
5) 針對(duì)需求,使用正確的表引擎,是myisam或是innodb。
11.用PHP寫出顯示客戶端IP與服務(wù)器IP的代碼:
echo $_SERVER['REMOTE_Aphp面試常見(jiàn)問(wèn)題R'] //客戶端ip
echo $_SERVER['SERVER_Aphp面試常見(jiàn)問(wèn)題R'] //服務(wù)器端ip
12、apache+mysql+php實(shí)現(xiàn)最大負(fù)載的方法
1) 問(wèn)的太籠統(tǒng),生成靜態(tài)html頁(yè)面,squid反向代理,apache,mysql的負(fù)載均衡。
2) 可以采取數(shù)據(jù)緩存的方法,我們通常在統(tǒng)計(jì)數(shù)據(jù)的時(shí)候,需要在原始數(shù)據(jù)的基礎(chǔ)上經(jīng)過(guò)計(jì)算等一系列操作,才會(huì)得到最終的結(jié)果,如果每做一個(gè)查詢都需要這樣一系列操作,當(dāng)數(shù)據(jù)量大時(shí),勢(shì)必會(huì)帶來(lái)很多問(wèn)題??梢越⒁粋€(gè)結(jié)果表,寫一個(gè)腳本,用crontab定時(shí)觸發(fā)腳本去原始表取數(shù)據(jù),計(jì)算,寫入到結(jié)果表,前端查詢從結(jié)果表取數(shù)據(jù),這也是比較常用的一種做法。
3) 采用分布式,多個(gè)apache,多個(gè)mysql,其實(shí)就是dns負(fù)載均衡,dns根據(jù)當(dāng)前用戶解析幾個(gè)ip的ping值,將用戶轉(zhuǎn)移到某一臺(tái)最快的服務(wù)器,或者平均分配。
4 )money不是問(wèn)題的話,可以考慮F5硬件負(fù)載均衡!
5)可以使用Microsoft Windows Server系統(tǒng)的負(fù)載均衡設(shè)置
php面試常見(jiàn)問(wèn)題(二)
1. echo count(“abcd”);輸出多少?
int count(mixed var)
返回單元數(shù)目,通常是一個(gè)array,任何其他類型都只有一個(gè)單元,有一個(gè)例外, 如果var是null結(jié)果是0
2.
$a=$b=$c=0;
$a=$b && $c;
運(yùn)行以上代碼后$a $b $c 分別是?
$a=false
$c=0
$b=0
2. PHP打印出前一天的時(shí)間,格式是-12-29 22:21:21
echo date('Y-m-d H:i:s',strtotime('-1 day'));
strtotime 將任何英文文本的日期時(shí)間解析成時(shí)間戳
4. 請(qǐng)用php的heredoc語(yǔ)法格式輸出:hello world!
<?php
echo <<<EOT
hello world!
EOT;
5. $string = "abcdefg",那么$string{4}的值是?
$string{4}=e
因?yàn)镻HP是弱類型語(yǔ)言,可以將字符串“視為數(shù)組”,當(dāng)做字符集合看待,字符串中的字符可以在字符串之后用花括號(hào)指定所要字符從零開(kāi)始的偏移量來(lái)訪問(wèn)和修改。
6. 簡(jiǎn)述echo(),print(),print_r()的區(qū)別。
echo,print是PHP語(yǔ)言結(jié)構(gòu), print_r是函數(shù),語(yǔ)言結(jié)構(gòu)沒(méi)有返回值,函數(shù)可以有返回值(即便沒(méi)有用)
print只能打印出簡(jiǎn)單類型變量的值(如int,string)
print_r可以打印出復(fù)雜類型變量的值(如數(shù)組,對(duì)象)
7.用PHP寫出顯示客戶端IP與服務(wù)器IP的代碼。
客戶端: $_SERVER[REMOTE_Aphp面試常見(jiàn)問(wèn)題R]
服務(wù)器: $_SERVER[SERVER_Aphp面試常見(jiàn)問(wèn)題R]
8、用正則表達(dá)式判斷$a是否是一個(gè)以半角逗號(hào)分隔的多個(gè)手機(jī)號(hào)碼組成的字符串,是輸出yes
<?php
$phone = '13725439919,18588421409,18817006902';
$pattern = '/^(1[34568]\d{9},)+(1[34568]\d{9})?$/';
if(preg_match_all($pattern,$phone,$out)){
echo 'yes';
}else{
echo 'no';
}
echo '<pre>';
print_r($out);
9、解釋MVC,介紹幾種目前比較流行的MVC框架
由模型(model),視圖(view),控制器(controller)完成的應(yīng)用程序
MVC模式的目的就是實(shí)現(xiàn)Web系統(tǒng)的功能分工,它強(qiáng)制性地把應(yīng)用程序的輸入、處理和輸出分開(kāi),可以各自處理自己的任務(wù),是一種分層的概念。Model層實(shí)現(xiàn)系統(tǒng)中的業(yè)務(wù)邏輯,View層用于與用戶的交互,Controller層是Model和View之間溝通的橋梁。
Symfony:是為開(kāi)發(fā)大型web準(zhǔn)備的,學(xué)習(xí)曲線比較長(zhǎng)。
Laravel:簡(jiǎn)潔、優(yōu)雅。
10、描述一下大流量高并發(fā)網(wǎng)站的解決方案
1) LVS或nginx負(fù)載均衡器,通過(guò)負(fù)載均衡把壓力分擔(dān)到多臺(tái)服務(wù)器.
2) squid緩存或nginx web cache緩存
3) web 服務(wù)器選型(nginx代替apache)
4) 頁(yè)面靜態(tài)化(smarty或框架),數(shù)據(jù)緩存(memcache Redis)
5) memcache
6) sql語(yǔ)句一定要注意索引使用
7) 主從數(shù)據(jù)庫(kù)
8) 分庫(kù)分表或分區(qū)
主要從以下幾個(gè)方面回答:
1、硬件
1) 垂直拓展:買更好的服務(wù)器。一般不建議這么做,因?yàn)閱蝹€(gè)服務(wù)器都有上限
2) 水平拓展:多買幾臺(tái)服務(wù)器,利用負(fù)載均衡器(LVS、F5),將壓力分擔(dān)到不同服務(wù)器上。
2、 數(shù)據(jù)庫(kù)
a) 數(shù)據(jù)庫(kù)優(yōu)化 : 1、分表和分區(qū) 2、主從數(shù)據(jù)庫(kù)
b) 數(shù)據(jù)庫(kù)的選型 :可以考慮將apache換成nginx
c) SQl語(yǔ)句優(yōu)化
3、 緩存
a) 數(shù)據(jù)緩存 :使用memcache
B) 頁(yè)面靜態(tài)化 :框架的頁(yè)面靜態(tài)化、smarty
C) 使用CDN
參考答案:
1、硬件
購(gòu)買更好的服務(wù)器,這種是縱向擴(kuò)展,但是不太推薦。購(gòu)買更多的服務(wù)器,利用LVS或者F5搭建服務(wù)器集群。從而提高整個(gè)網(wǎng)站的計(jì)算速度。
2、web服務(wù)器
由于Apache的并發(fā)處理能力有限,所以可以考慮使用Nginx。
3、數(shù)據(jù)庫(kù)
Mysql要結(jié)合NoSQL使用,由于單個(gè)數(shù)據(jù)庫(kù)能力有限,所以要搭建主從數(shù)據(jù)庫(kù)。
4、緩存
a) 為了減小數(shù)據(jù)庫(kù)的壓力,考慮使用Memcache或Redis做緩存。 b) 把網(wǎng)站的絕大多數(shù)頁(yè)面進(jìn)行頁(yè)面靜態(tài)化。(phpcms)
c) 把靜態(tài)資源放到CDN上。
5、禁止外部的盜鏈
6、控制大文件的下載
11、如何防SQL注入
//表單盡量用post提交,核心用戶驗(yàn)證都走post,避開(kāi)get
1、 表單盡量用post,表單判斷控制走get,因?yàn)間et比post速度快
2、 $_SERVER[HTTP_REFERER]判斷提交者的源頭,只能本站提交。
3、 使用aphp面試常見(jiàn)問(wèn)題slashes轉(zhuǎn)義用戶提交的數(shù)據(jù)
4、 服務(wù)器本身的安全
5、 數(shù)據(jù)庫(kù)使用PDO,因?yàn)镻DO有預(yù)處理
12、如何實(shí)現(xiàn)多臺(tái)web服務(wù)器共享session數(shù)據(jù)
1、改變session的域 ,比如域名是www.baidu.com
域就應(yīng)該是.baidu.com
2、使用數(shù)據(jù)庫(kù)或者memcache存儲(chǔ)session數(shù)據(jù)
php面試常見(jiàn)問(wèn)題(三)
1、用PHP打印出前一天的時(shí)間格式是2006-5-10 22:21:21 $a = date("Y-m-d H:i:s", strtotime("-1 day"));
print_r($a);
2、echo(),print(),print_r()的區(qū)別
echo 和print不是一個(gè)函數(shù),是一個(gè)語(yǔ)言結(jié)構(gòu)
int print(string $arg), 只有一個(gè)參數(shù)
echo arg1,arg2; 可以輸出多個(gè)參數(shù),返回void
echo和print只能打印出string,不能打印出結(jié)構(gòu)
print_r能打印出結(jié)構(gòu)
比如
$arr = array("key"=>"value");
print_r($arr);
3、能夠使HTML和PHP分離開(kāi)使用的模板
smarty,phplib
4、使用哪些工具進(jìn)行版本控制?
svn,git,cvs
5、如何實(shí)現(xiàn)字符串翻轉(zhuǎn)?
英文:
strrev($a)
中文或其他文字:
中文:GB2312, 代碼是使用GB2312編碼
<?php
function reverse($str)
{
$ret = "";
len=mbstrwidth(str,"GB2312");
for(i=0;i< len;i++)
{
arr[]=mbsubstr(str, $i, 1, "GB2312"); }
return implode("", array_reverse($arr));
}
print_r(reverse("你好"));
6、優(yōu)化MYSQL數(shù)據(jù)庫(kù)的方法。
語(yǔ)句方面:
1 使用索引,增加查詢效率
2 優(yōu)化查詢語(yǔ)句,提高索引命中率
數(shù)據(jù)庫(kù)涉及方面:
1 構(gòu)造分庫(kù)分表,提高數(shù)據(jù)庫(kù)的存儲(chǔ)和擴(kuò)展能力
2 根據(jù)需要使用不同的存儲(chǔ)引擎
7、PHP的意思
超級(jí)文本預(yù)處理語(yǔ)言
Hypertext PreProcessor
8、MYSQL取得當(dāng)前時(shí)間的函數(shù)是?,格式化日期的函數(shù)是(2分) CURRENT_TIMESTAMP()
DATE_FORMAT()
select DATE_FORMAT("-11-21 10:10:10", "%Y-%m-%d");
9、實(shí)現(xiàn)中文字串截取無(wú)亂碼的方法。
mb_substr($str, 1, 1, "GB2312");
10、您是否用過(guò)版本控制軟件? 如果有您用的版本控制軟件的名字是?
svn
git
11、您是否用過(guò)模板引擎? 如果有您用的模板引擎的名字是? smarty
12、請(qǐng)簡(jiǎn)單闡述您最得意的開(kāi)發(fā)之作
XXX
13、對(duì)于大流量的網(wǎng)站,您采用什么樣的方法來(lái)解決訪問(wèn)量問(wèn)題? 1 有效使用緩存,增加緩存命中率
2 使用負(fù)載均衡
3 對(duì)靜態(tài)文件使用CDN進(jìn)行存儲(chǔ)和加速
4 想法減少數(shù)據(jù)庫(kù)的使用
5 查看出現(xiàn)統(tǒng)計(jì)的瓶頸在哪里
14、用PHP寫出顯示客戶端IP與服務(wù)器IP的代碼
$_SERVER["REMOTE_Aphp面試常見(jiàn)問(wèn)題R"]
$_SERVER["SERVER_Aphp面試常見(jiàn)問(wèn)題R"]
15、語(yǔ)句include和require的區(qū)別是什么?為避免多次包含同一文件,可用(?)語(yǔ)句代替它們?
在失敗的時(shí)候:
include產(chǎn)生一個(gè)warning,而require產(chǎn)生直接產(chǎn)生錯(cuò)誤中斷
require在運(yùn)行前載入
include在運(yùn)行時(shí)載入
require_once
include_once
16、如何修改SESSION的生存時(shí)間
session_set_cookie_params
17、有一個(gè)網(wǎng)頁(yè)地址, 比如PHP研究室主頁(yè): ...,如何得到它的內(nèi)容?
file_get_contents
curl
18、在HTTP 1.0中,狀態(tài)碼401的含義是(?);如果返回“找不到文件”的提示,則可用 header 函數(shù),其語(yǔ)句為(?);
未授權(quán)
header("HTTP/1.0 404 Not Found");
fast CGI中:
header("Status: 404 Not Found");
19、在PHP中,heredoc是一種特殊的字符串,它的結(jié)束標(biāo)志必須? 成對(duì)出現(xiàn)
$a = <<EOD
good test
EOD;