五、PHP綜合應用 ftp、ssh、http、telnet、https ftp:File Transfer Protocol,文件傳輸協議,是應用層的協議,它基於傳輸層,為用戶服務,它們負責進行文件的傳輸,其預設埠是21。 ssh:Secure Shell,安全外殼協議,建立在應用層和傳輸層基礎上 ...
五、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:password@localhost/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<$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);
?>