1. 程式人生 > >PHP面試題及答案解析(8)—PHP綜合應用題

PHP面試題及答案解析(8)—PHP綜合應用題

java應用程序 外殼 sleep 服務應用程序 解釋 源碼 use lee eve

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.對於大流量的網站,您采用什麽樣的方法來解決訪問量問題?
  1. 確認服務器硬件能否支持當前的流量
    對於普通的pc server來說,它能夠獨立支持每天10萬個獨立ip訪問,如果訪問量過大,最好更好性能更高的專用服務器。
  2. 優化數據庫的訪問服務器的負載過大,一個重要的原因就是CPU和內存負載過高,而讀寫數據在這塊占據較多的資源。可以從頁面靜態化、memcache緩存和mysql優化幾個方面著手。
  3. 禁止外部盜鏈
    占用較大的流量,防盜鏈,使用reference來判斷一下。如果是圖片的話,使用添加水印即可很好的防止。
  4. 控制大文件的下載
    最好把文件下載的容量控制為相對較小的一個值,如果有大文件下載,最好使用專用的服務器。
  5. 使用多臺主機實現分流,集群。
  6. 使用流量分析軟件進行分析統計谷歌和百度。
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)

這正是為何我老是告訴別人選擇適當的編程語言,若果你只用一種語言的話你怎麽能回答這道問題?這道問題很簡單,[email protected],[email protected],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實現最大負載的方法。
  1. 問的太籠統,生成靜態html頁面,squid反向代理,apache,mysql的負載均衡。
  2. 可以采取數據緩存的方法,我們通常在統計數據的時候,需要在原始數據的基礎上經過計算等一系列操作,才會得到最終的結果,如果每做一個查詢都需要這樣一系列操作,當數據量大時,勢必會帶來很多問題。可以建立一個結果表,寫一個腳本,用crontab定時觸發腳本去原始表取數據,計算,寫入到結果表,前端查詢從結果表取數據,這也是比較常用的一種做法。
  3. 采用分布式,多個apache,多個mysql,其實就是dns負載均衡,dns根據當前用戶解析幾個ip的ping值,將用戶轉移到某一臺最快的服務器,或者平均分配。
  4. money不是問題的話,可以考慮F5硬件負載均衡!
  5. 可以使用Microsoft Windows Server系統的負載均衡設置
13.已知姓名A,姓名B,給一個求他們緣份的算法。

開放性題目,沒有固定的算法,可以通過計算兩個名字的筆畫差來確定緣分指數。

14.你覺得在PV10W的時候,同等配置下,LUNIX比WIN快多少?

不做優化的情況下一樣。

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()+3600*24*31

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<$str_len&&$result_len<$len);
        return$result;
    }
?>
38.請僅使用一次正則替換,將下面內容

private long contract_id;
private string contract_number;
private string customer_name;
替換為
private long contractId;
private string contractNumber;
private string customerName;

<?php
    $str = "private long contract_id;
    private string contract_number;
    private string customer_name;";

    $pattern = ‘/_(\w)/em‘;
    $result = preg_replace($pattern,"strtoupper(‘\\1‘)",$str);
    echo $result;
?>
39.列舉流行的Ajax框架?說明Ajax實現原理是什麽及json在Ajax中起什麽作用?

流行的Ajax框架有jQuery,Prototype,Dojo,MooTools。
Ajax的工作原理是一個頁面的指定位置可以加載另一個頁面所有的輸出內容,這樣就實現了一個靜態頁面也能獲取到數據庫中的返回數據信息了。所以Ajax技術實現了一個靜態網頁在不刷新整個頁面的情況下與服務器通信,減少了用戶等待時間,同時也從而降低了網絡流量,增強了客戶體驗的友好程度。
在使用Ajax時,涉及到數據傳輸,即將數據從服務器返回到客戶端,服務器端和客戶端分別使用不同的腳步語言來處理數據,這就需要一種通用的數據格式,XML和json就是最常用的兩種,而json比XML更簡單。

40.在UNIX或windows系統內以()為單位分配資源以()單位分配時間調度。

進程,時間片

41.正則表達式中?+的作用分別是什麽。

?+都有用來匹配數量的,*表示0或多個,?表示0個或1個,+表示1個或多個。

42.寫出你所知道的XML解析器。

DOM,SAX,SimpleXML,其中前兩種是通用的解析器,和具體語言無關,而SimpleXML則是PHP提供的解析器。

43.在程序中表示時間可以使用哪幾種變量類型。

在PHP中可以使用int或字符串來表示(php中沒有日期時間類型),在MySQL中,可以使用int,date,datetime,timestamp。

44.使用Utf-8編碼存儲中文姓名,一般會分配多少個字節的存儲空間。

UTF-8編碼是可變長編碼,對於中文而言,一個字符使用3個字節來存儲。

45.用正則表達式判斷$a是否是一個以半角逗號分隔的多個手機號碼組成的字符串,是輸出yes。
<?php
    $pattern = ‘/^1[358]\d{9}(,1[358]\d{9})*$/‘;
    $subject = ‘13507224985,13833103237‘;

    if (preg_match($pattern,$subject)) {
        echo "yes";
    }
?>
46.如果要求每隔5分鐘執行一次腳本five.php,如何實現?

用到的函數ignore_user_abort(),set_time_limit(0),sleep($interval),此代碼只要運行一次後關閉瀏覽器即可。

<?php
    ignore_user_abort();//關掉瀏覽器,PHP腳本也可以繼續執行.
    set_time_limit(0);//通過set_time_limit(0)可以讓程序無限制的執行下去

    $interval=60*5;//每隔5分鐘運行
    do{
        //這裏是你要執行的代碼
        sleep($interval);//等待5分鐘
    }while(true);

?>
47.假設有一個博客系統,數據庫存儲采用mysql,用戶數量為1000萬,預計文章總數為10億,每天有至少10萬的更新量,每天訪問量為5000萬,對數據庫的讀寫操作的比例超過10:1,你如何設計該系統,以確保其系統高效,穩定的運行?

提示:可以從數據庫設計,系統框架,及網絡架構方面進行描述,可以自由發揮。

轉自:鈦21網 ? PHP面試題及答案解析(8)—PHP綜合應用題

PHP面試題及答案解析(8)—PHP綜合應用題