php面試題之五——PHP綜合應用(高階部分)
五、PHP綜合應用
1.寫出下列服務的用途和預設埠(新浪網技術部)
ftp、ssh、http、telnet、https
- ftp:File Transfer Protocol,檔案傳輸協議,是應用層的協議,它基於傳輸層,為使用者服務,它們負責進行檔案的傳輸,其預設埠是21。
- ssh:Secure Shell,安全外殼協議,建立在應用層和傳輸層基礎上的安全協議。SSH是目前較可靠,專為遠端登入會話和其他網路服務提供安全性的協議,其默埠是22。
- http:hypertext transport protocol,超文字傳送協議,是一種詳細規定了瀏覽器和全球資訊網伺服器之間互相通訊的規則,通過因特網傳送全球資訊網文件的資料傳送協議,其預設埠是80。
- telnet:Telnet協議是TCP/IP協議族中的一員,是Internet遠端登陸服務的標準協議和主要方式。它為使用者提供了在本地計算機上完成遠端主機工作的能力,其預設埠是23。
- https:Hypertext Transfer Protocol over Secure Socket Layer,是以安全為目標的HTTP通道,用於安全的HTTP資料傳輸,它的主要作用可以分為兩種:
一種是建立一個資訊保安通道,來保證資料傳輸的安全;
另一種就是確認網站的真實性,其預設埠是443。
2.你用什麼方法檢查PHP指令碼的執行效率(通常是指令碼執行時間)和資料庫SQL的效率(通常是資料庫Query時間),並定位和分析指令碼執行和資料庫查詢的瓶頸所在?(騰訊)
指令碼執行時間,啟用xdebug,使用WinCacheGrind分析。
資料庫查詢,MySQL使用EXPLAIN分析查詢,啟用slow
query log記錄慢查詢。
[!!!]3.對於大流量的網站,您採用什麼樣的方法來解決訪問量問題?
- 確認伺服器硬體能否支援當前的流量
對於普通的pc server來說,它能夠獨立支援每天10萬個獨立ip訪問,如果訪問量過大,最好更好效能更高的專用伺服器。 - 優化資料庫的訪問伺服器的負載過大,一個重要的原因就是CPU和記憶體負載過高,而讀寫資料在這塊佔據較多的資源。可以從頁面靜態化、memcache快取和mysql優化幾個方面著手。
- 禁止外部盜鏈
佔用較大的流量,防盜鏈,使用reference來判斷一下。如果是圖片的話,使用新增水印即可很好的防止。 - 控制大檔案的下載
最好把檔案下載的容量控制為相對較小的一個值,如果有大檔案下載,最好使用專用的伺服器。 - 使用多臺主機實現分流,叢集
- 使用流量分析軟體進行分析統計谷歌和百度
4.請簡單闡述您最得意的開發之作
根據實際情況自由發揮
5.談談asp,php,jsp的優缺點
ASP全名Active Server Pages,是一個WEB伺服器端的開發環境,利用它可以產生和執行動態的、互動的、高效能的WEB服務應用程式。ASP採用指令碼語言VB Script作為自己的開發語言。
PHP是一種跨平臺的伺服器端的嵌入式指令碼語言。它大量地借用C、Java和Perl語言的語法,並結合自己的特性,使WEB開發者能夠快速地寫出動態生成頁面。它支援目前絕大多數資料庫。還有一點,PHP是完全免費的,不用花錢,你可以從PHP官方站點自由下載。而且你可以不受限制地獲得原始碼,甚至可以從中加進你自己需要的特色。
JSP是Sun公司推出的新一代站點開發語言,他完全解決了目前ASP和PHP的一個通病-----指令碼級執行(據說PHP4也已經在Zend的支援下,實現編譯執行)。Sun公司藉助自己在上的不凡造詣,將Java從Java應用程式和Java Applet之外,又有新的碩果,就是Java
Server Page。JSP可以在Serverlet和JavaBean的支援下,完成功能強大的站點。
三者都提供在HTML程式碼中混合某種程式程式碼、由語言引擎解釋執行程式程式碼的能力。但JSP程式碼被編譯成Servlet並由Java虛擬機器解釋執行,這種編譯操作僅在對JSP頁面的第一次請求時發生。
在ASP、PHP、JSP環境下,HTML程式碼主要負責描述資訊的顯示樣式,而程式程式碼則用來描述處理邏輯。普通的HTML頁面只依賴於Web伺服器,而ASP、PHP、JSP頁面需要附加的語言引擎分析和執行程式程式碼。程式程式碼的執行結果被重新嵌入到HTML程式碼中,然後一起傳送給瀏覽器。
ASP、PHP、JSP三者都是面向Web伺服器的技術,客戶端瀏覽器不需要任何附加的軟體支援。
6.請舉例說明在你的開發過程中用什麼方法來加快頁面的載入速度。
要用到伺服器資源時才打開,及時關閉伺服器資源,資料庫新增索引,頁面可生成靜態,圖片等大檔案單獨伺服器,使用程式碼優化工具等。
7.Is PHP better than Perl?–Discuss.(Yahoo)
我們不要為一個簡單的問題引發一場舌戰,為工作選擇適合的語言,不要為工作遷就語言。Perl十分適合用作命令列工具,雖然它在網頁應用上也有不錯的表現,但是它的真正實力在命令列上才能充分發揮。同樣地,PHP雖然可以在控制檯的環境中使用,但是它在網頁應用上有更好的表現,PHP有大量專門為網頁應用而設計的函式,Perl則似乎以命令列為設計之本。
8.What's the difference between the way PHP and Perl distinguish between arrays and hashes?(Yahoo)
這正是為何我老是告訴別人選擇適當的程式語言,若果你只用一種語言的話你怎麼能回答這道問題?這道問題很簡單,Perl所變數都是以@開頭,例如@myArray,PHP則沿用作為所有變量的開頭,例如myArray。
至於Perl表示散列表則用%,例如%myHash,PHP則沒有分別,仍是使用,例如myHash。
9.How do you debug a PHP application?(Yahoo)
使用Xdebug或者Advanced PHP Debugger
10.PEAR中的資料庫連線字串格式是____。
$dsn='mysql://username:[email protected]/test'
$options=array(
'debug'=>2,
'portability'=>DB_PORTABILITY_ALL,
)
DB::connect($dsn,$options)//其中options引數是可選的。
PEAR是PHP擴充套件與應用庫(the PHP Extension and Application Repository)的縮寫。它是一個PHP擴充套件及應用的一個程式碼倉庫,PEAR處理資料庫的模組是PEAR DB。
11.如何實現PHP、JSP互動?
題目有點含糊不清,SOAP,XML_RPC,Socket function,CURL都可以實現這些,如果是考慮PHP和Java的整合,PHP內建了這種機制(如果考PHP和.NET的整合,也可以這麼回答)。
PHP提供了支援JAVA的類庫檔案,或者通過HTTP協議來互動資料。
[!!!]12.apache+mysql+php實現最大負載的方法
- 問的太籠統,生成靜態html頁面,squid反向代理,apache,mysql的負載均衡。
- 可以採取資料快取的方法,我們通常在統計資料的時候,需要在原始資料的基礎上經過計算等一系列操作,才會得到最終的結果,如果每做一個查詢都需要這樣一系列操作,當資料量大時,勢必會帶來很多問題。可以建立一個結果表,寫一個指令碼,用crontab定時觸發指令碼去原始表取資料,計算,寫入到結果表,前端查詢從結果表取資料,這也是比較常用的一種做法。
- 採用分散式,多個apache,多個mysql,其實就是dns負載均衡,dns根據當前使用者解析幾個ip的ping值,將使用者轉移到某一臺最快的伺服器,或者平均分配。
- money不是問題的話,可以考慮F5硬體負載均衡!
- 可以使用Microsoft Windows Server系統的負載均衡設定
13.已知姓名A,姓名B,給一個求他們緣份的演算法(51.com)
開放性題目,沒有固定的演算法,可以通過計算兩個名字的筆畫差來確定緣分指數。
14.你覺得在PV10W的時候,同等配置下,LUNIX比WIN快多少?(51.com)
不做優化的情況下一樣。
[!!]15.Ajax,資料庫觸發器,GUI,中斷機制的共同思想。談一談該種思想(機制)(百度)
主要就是非同步,主程序不會被一個非同步任務阻塞,當程序發出命令之後,繼續執行主任務,不用等待子任務執行完,這樣效率更高。
資料庫觸發器和中斷機制是資料庫自動完成的,而ajax觸發器是使用者激發的。ajax把GUI和資料庫非同步優化。
16.把一篇英文文件中所有單詞的首字母轉為大寫,文件存在doc.txt中。可以在多種程式語言中選擇(C\C++,JAVA,PHP...)寫出你的思路,儘量優化你的程式。(百度)
$str=file_get_contents('doc.txt');
$str=ucwords($str);
file_put_contents('doc.txt',$str);
17.防止SQL注射漏洞一般用_____函式
addslashes
18.綜合運用,PHP+MySQL程式設計,檔案操作(CBSI)以下請用PHPMYADMIN完成
(1).建立新聞釋出系統,表名為message有如下欄位
欄位名 | 描述 |
---|---|
id | 文章id |
title | 文章標題 |
content | 文章內容 |
category_id | 文章分類id |
hits | 點選量 |
建立表語句如下:
CREATE TABLE message(
id iNT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200)NOT NULL DEFAULT‘’,
content TEXT,
category_id INT UNSIGNED NOT NULL DEFAULT 0,
hits INT UNSIGNED NOT NULL DEFAULT 0
)engine=InnoDB default charset=utf8
(2).同樣上述新聞釋出系統:表comment記錄使用者回覆內容,欄位如下
欄位名 | 描述 |
---|---|
comment_id | 回覆id |
id | 文章id,關聯message表中的id |
comment_content | 回覆內容 |
現通過查詢資料庫需要得到以下格式的文章標題列表,並按照回覆數量排序,回覆最高的排在最前面
文章id文章標題點選量回複數量
用一個SQL語句完成上述查詢,如果文章沒有回覆則回覆數量顯示為0
查詢語句如下:
SELECT message.id AS id,title,hits,IF(comment.id is NULL,0,count(*))AS number
FROM message
LEFT JOIN comment
ON message.id=comment.id
GROUP BY message.id
(3).上述內容管理系統,表category儲存分類資訊,欄位如下
欄位名 | 描述 |
---|---|
category_id | int(4)not null auto_increment; |
categroy_name | varchar(40)not null; |
使用者輸入文章時,通過選擇下拉選單選定文章分類
寫出如何實現這個下拉選單
function categoryList(){
$result=mysql_query("select category_id,category_name from category")or die("Invalid
query:".mysql_error());
echo"<select name='category'value=''>";
while($row=mysql_fetch_array($result)){
echo"<option value='".$row['category_id']."'>".$row['category_name']."</option>";
}
echo"</select>";
}
檔案操作部分:上述內容管理系統,使用者提交內容後,系統生成靜態HTML頁面,寫出實現的基本思路。
要生成靜態HTML頁面,需要使用輸出緩衝output buffering及檔案操作,首先使用ob_start()函式開啟輸出緩衝,在頁面內容執行完成時,使用ob_get_contents()函式獲取儲存在輸出緩衝區中的內容,然後使用file_put_contents()函式,生成靜態HTML頁面即可。
19.請問cgi和fastcgi有什麼不同,你在什麼情況下會選擇哪個?(酷訊)
原理一樣,都是利用標準輸入輸出流處理HTTP之類的文字協議,都是通過多程序模式處理多請求。不同之處在於FastCGI的一個程序處理完一個請求之後重置狀態並掛起,待下一個請求來時繼續處理;而CGI的一個程序則處理完一個請求後退出,下一個請求來時再建立新程序。
20.zend optimizer是什麼?(酷訊)
Zend Optimizer可以加速PHP指令碼的執行,提高PHP應用程式的執行速度。實現的原
理是對那些程式在被最終執行之前由執行編譯器(Run-Time Compiler)產生的程式碼進行優化。
一般情況下,執行使用Zend Optimizer的PHP程式比不使用的要快40%到100%。這意
味著網站的訪問者可以更快的瀏覽網頁,從而完成更多的事務,創造更好的客戶滿意度。
Zend Optimizer還可以給用Zend加密的檔案解密。
[!!]21.列舉web開發中的安全性問題
sql注入攻擊。
資料庫操作安全,UPDATE、DELETE、INSERT的操作沒有限制使用者操作許可權,這將是一件很危險的事情。
沒有驗證使用者http請求的方式POST或者GET,GET請求被合法通過。
沒有驗證表單來源的唯一性,不能識別是合法的表單提交還是黑客偽造的表單提交。
XSS攻擊。
[!]22.如何通過php程式防止外部頁面提交表單?編寫一段程式碼
<?php
session_start();
if(isset($_POST['name'])&&!empty($_POST['name'])){
if($_POST['check']==$_SESSION['check']){
echo'正常訪問';
}else{
echo'外部訪問';
}
}
$token=md5(uniqid(rand(),true));
$_SESSION['check']=$token;
?>
<form method="post"action="">
<input type="text"name="name">
<input type="hidden"name="check"value="<?php echo$token;?>">
<input type="submit">
</form>
[!]23.如果某段與資料庫互動的程式執行較慢你將如何處理?
一是首先提高資料庫的查詢速度,比如增加索引,優化表的結構。
二是優化程式程式碼,如果查詢比較多,可以儘量用條件查詢,減少查詢語句,比如能用一條查詢語句就不用兩條。
三就是提高伺服器的速度,優化伺服器,把不必要的程序關掉。
24.以下程式碼會產生什麼問題,如何解決?
<?php
$dir=$_POST['dir'];
include("/usr/local/apache/htdoc/inc/$dir");
?>
不安全,必須對使用者的輸入進行驗證和過濾。
[!!]25.請簡述作業系統的執行緒與程序的區別。列舉LINUX下面你使用過的軟體?
程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位。
執行緒是程序的一個實體是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位。
程序和執行緒的主要差別在於它們是不同的作業系統資源管理方式。程序有獨立的地址空間,一個程序崩潰後,在保護模式下不會對其它程序產生影響,而執行緒只是一個程序中的���同執行路徑。執行緒有自己的堆疊和區域性變數,但執行緒之間沒有單獨的地址空間,一個執行緒死掉就等於整個程序死掉,所以多程序的程式要比多執行緒的程式健壯,但在程序切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共享某些變數的併發操作,只能用執行緒,不能用程序。
Linux下常用軟體,vim,emacs,tar,openoffice,putty,wget,links,ssh等。
26.使用者在網站表單提交資料的時候,為了防止指令碼攻擊(比如使用者輸入<script>alert(111);</script>
),php端接收資料的時候,應該如何處理?
可以對使用者輸入資料進行轉義,如htmlspecialchars($_POST[‘title’]);
[!!!]27.使用過Memcache快取嗎,如果使用過,能夠簡單的描述一下它的工作原理嗎?
Memcahce是把所有的資料儲存在記憶體當中,採用hash表的方式,每條資料由key和value組成,每個key是獨一無二的,當要訪問某個值的時候先按照找到值,然後返回結果。
Memcahce採用LRU演算法來逐漸把過期資料清除掉。
28.一個Web開發團隊開發中,大致說說你所瞭解的所有成員的分工合作情況
每個公司的分工合作情況各不相同,一般會有策劃,美工,前端開發,後臺開發,維護,優化和推廣等。
[!!!]29.假設給你5臺伺服器,請大致的描述一下,如何使用你所熟悉的開源軟體,搭建一個日PV 300萬左右的中型網站?
參考結構:
3臺Web伺服器,兩臺MySQL資料庫伺服器,採用Master/Slave同步的方式減輕資料庫負載,Web伺服器可以結合Memcache快取來減少負載,同時三臺Web伺服器內容一致,
可以採用DNS輪詢的方式來進行負載平衡。
30.談談對你PHP認識或你擅長的技術?
自由發揮
[!!!]31.什麼是Ajax?Ajax的原理是什麼?Ajax的核心技術是什麼?Ajax的優缺點是什麼?
Ajax是Asynchronous JavaScript and XML的縮寫,是JavaScript、XML、CSS、DOM等多個技術的組合。
Ajax的工作原理是一個頁面的指定位置可以載入另一個頁面所有的輸出內容,這樣就實現了一個靜態頁面也能獲取到資料庫中的返回資料資訊了。所以Ajax技術實現了一個靜態網頁在不重新整理整個頁面的情況下與伺服器通訊,減少了使用者等待時間,同時也從而降低了網路流量,增強了客戶體驗的友好程度。
Ajax的核心技術是XMLHttpRequest,它是JavaScript中的一個物件。
Ajax的優點是:
(1).減輕了伺服器端負擔,將一部分以前由伺服器負擔的工作轉移到客戶端執行,利用客戶端閒置的資源進行處理;
(2).在只區域性重新整理的情況下更新頁面,增加了頁面反應速度,使使用者體驗更友好。
Ajax的缺點是不利於SEO推廣優化,因為搜尋引擎無法直接訪問到Ajax請求的內容。
32.請用PHP實現一個函式,將一個2進位制數的無符號非負電位字串非浮點字串轉成一個10進位制數,返回該10進位制數。不許使用BIN等系統內建函式(嘀嗒團)
題目意思有些模糊,題目本意可能是將一個無符號的2進位制字串轉成10進位制數,如'10100010',應該得到10100010的十進位制表示162。
<?php
function bin2dec($bin){
$temp = strrev($bin);
$result = 0;
for ($i=0,$len = strlen($temp); $i < $len; $i++) {
$result += pow(2,$i) * $temp[$i];
}
return $result;
}
$a = '10100010';
echo bin2dec($a);//結果162
?>
33.請使用PHP設計一個函式,對學生英語考試得分從高到低排序,輸入時所有學生的學號和考試得分,返回排好序的考試得分和對應學生的學號。考試滿分為100,得分可能會有小數,由於考試評分要求,小數位只會是0或0.5
要求:
請不要使用qsort等系統內建排序函式
請使用你認為最快最優的方法實現該函式並使排序的效能最高。(嘀嗒團)
<?php
// 快速排序實現
function array_sort(&$arr,$left,$right){
if ($left < $right) {
$pivot = $arr[$left];
$low = $left;
$high = $right;
while ($low < $high) {
while ($low < $high && $arr[$high]['score'] >= $pivot['score']) {
$high--;
}
$arr[$low] = $arr[$high];
while ($low < $high && $arr[$low]['score'] <= $pivot['score']) {
$low++;
}
}
$arr[$low] = $pivot;
array_sort($arr,$left,$low-1);
array_sort($arr,$low+1,$right);
}
}
$english = array(
array('sid'=>1,'score'=>76),
array('sid'=>2,'score'=>93),
array('sid'=>3,'score'=>68.5),
array('sid'=>4,'score'=>82.5),
);
$left = 0;
$right = count($english) - 1;
array_sort($english,$left,$right);
print_r($english);
?>
34.需要設定一個有效期為31天,的memcach值,請補充下面的程式碼(奇矩互動)
<?php
$memcache_obj=new memcache
$memcache_obj->connect(‘memcache_host,11211’);
$memcache_obj->set(‘varKey’,’varValue’,0,____);
?>
time()+36002431
35.你從_____時候開啟接觸PHP的?從可以寫出連結mysql資料庫查詢更改資料到現在大約有____時間?(奇矩互動)
根據自身情況填寫
36.現在請你設計一個留言板系統,請簡要的寫出你設計的其中分頁演算法的思路。(奇矩互動)
主要是資料庫的設計系統的架構思想
分頁演算法的原理是limit offset,pagesize其中,pagesize是設定好的,而offset則要通過計算得到,不同的頁數對應的offset也不同,設當前頁為currentpage,則offset=(currentpage-1)*pagesize。
37.假設有"123abc456def789"這麼一個字串,寫一個函式,可以傳入一個字串,和一個要擷取的長度。返回擷取後的結果。(小米)
要求:
(1).和標記不得計算在長度之內。
(2).擷取後的字串,要保留原有標籤,不過如果最後有一個標籤沒有閉合,則
去掉其開始標籤。
示例:題中的字串,要擷取長度5,則返回的字串應該為123ab,要擷取長度8,
應返回123abc45。
<?php
function cut($str,$len=null){
$last=0;
$str_len=strlen($str);
$result='';
$result_len=0;
do{
$pattern='/<em>(.*?)<\/em>/i';
$num=preg_match($pattern,$str,$m,PREG_OFFSET_CAPTURE,$last);
if($num){
$result.=substr($str,$last,
$add_len=($m[0][1]-$last<$len-$result_len)?$m[0][1]-$last:$len-$result_len);
$result_len+=$add_len;
$last=$m[0][1]+strlen($m[0][0]);
if($result_len<$len){
if($len-$result_len>=strlen($m[1][0])){
$result.=$m[0][0];
$result_len+=strlen($m[1][0]);
}else{
$result.=substr($m[1][0],0,$len-$result_len);
break;
}
}
}else{
$result.=substr($str,$last,$len-$result_len);
break;
}
}while($last