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