騰訊php面試題
騰訊php面試題(一)
1、以下題目,除了編程任務外其他都需要寫在給你提供的草紙上。紙張是珍貴的地球資源,請節約使用。編程任務在有相應的環境時,會要求上機書寫,實在沒有條件,就只能寫在草紙上了。
2、時間:
基礎任務+進階任務+設計任務 = 90分鐘
編程任務 = 60分鐘
基礎任務:
1、請列舉你能想到的UNIX信號,并說明信號用途。
2、請列舉、你能想到的所有的字符串查找算法,并加注釋簡單說明。
3、有一個IP地址(192.168.0.1),請寫出其32位無符號整數形式。
4、寫出、你能想到的所有HTTP返回狀態值,并說明用途(比如:返回404表示找不到頁面)
基礎任務-選作(會得到額外分數):
1、畫幾個你最熟悉的SERVER端模型出來(格式不重要,盡量將圖畫清楚,說明思路即可)
進階任務:
1、PHP的垃圾收集機制是怎樣的?
說明:
1)如果,你熟悉PHP源碼,那么請從源碼入手,回答些問題,會獲得額外加分
2)如果,你不熟悉PHP源碼,那么盡你所能,多寫點東西,包括利用自己的編程直覺得到的信息,都可以。
3)對,則有分,錯誤不扣,不寫無分。
2、請寫出HTTP頭,并符合以下要求:
1)這是一個post請求
2)目標:
3)POST變量:
username: test
pwd: test2
intro: Hello world!
4)包含以下COOKIE信息:
cur_query: you&me
說明:
1)如果,你記不得某個HTTP協議中的指令字了,那么,無奈這舉是用“漢字”代替。
2)如果,你能記住更多的HTTP協議指令字,那么多寫幾句,總是沒壞處,對吧?
3)最關鍵的,只需要畫出正確的“輪廓”(還記得httpwatch等工具打印出來的頭部嗎?那就是“輪廓”的含義),也會有分數,但如果,連“輪廓”都寫錯了,那么就很遺憾了。
設計任務:
1、最近總有人騷擾我們的投票模塊,需要你來設計一個投票限制的東東
要求如下:
1)要求每個QQ號碼(假設此QQ號碼在UNIT32內可以表示)10分鐘這內只能投5票。
2)我們的用戶很踴躍,平均每天要有2000萬人左右通過此程序投票。
說明:
1)無需寫代碼,只需要圖跟文字即可。
2)對于關鍵邏輯,請用圖加代碼表示出來,這也是對你文字表達能力的一個考驗。
3)對你能想到的所有的邊界條件列出來,這是對你邏輯思維全面與敏捷性的考驗。
4)存儲部分,盡你所能吧。如果,你需要一個自己設計的存儲層,那么把這個存儲層的實現,用文字+圖片方式描述清楚,要是設計合理,你會獲得華麗的獎分。
編程任務:
1、我們碰到了大麻煩,一個新來的傳教士惹惱了上帝,上帝很憤怒,要求我們把圣經(bbe.txt)背熟,直至他說哪個單詞,我們就要飛快的回答出這個單詞在第幾行第幾個單詞位置。聽說你是個優秀的程序員,那么髟助我們完成這個不可能的任務吧。
要求如下:
1)/myworks/example/bbe.txt,98版本英文圣經一本
2)輸入部分要求如下:php ./example.php [單詞]
3)輸出部分如下:[單詞] 1,2 2,4 5,6 表示:此單詞在1行2列(第二個單詞),2行4列...
說明:
1)此文本4MB之巨...
2)單詞的含義:由英文字母(大小寫),數字(0-9)組成的串
3)提供給你的機器OS為ubuntu 9.10,內存只有1G,而且,很不幸的,其中700M用來做了別的
4)上機考試不允許上網,但我裝了man文檔以及讀取CHM以及PDF的閱讀器,在電腦的桌面的CHM文件夾中,有相應的PHP參考手冊
5)算法復雜度要求不能大于O(N^2)(就是N的平方)
6)什么?PHP低效且用起來不順手,好的,你可以用別的語言來實現。但注意:提供給你的機器上只有python 2.4/perl 5.8/gcc[g++] 4.1
騰訊php面試題(二)
一、PHP開發部分
1.合并兩個數組有幾種方式,試比較它們的異同
2.請寫一個函數來檢查用戶提交的數據是否為整數(不區分數據類型,可以為二進制、八進制、十進制、十六進制數字)
3.PHP的strtolower()和strtoupper()函數在安裝非中文系統的服務器下可能會導致將漢字轉換為亂碼,請寫兩個替代的函數實現兼容Unicode文字的字符串大小寫轉換
4.PHP的is_writeable()函數存在Bug,無法準確判斷一個目錄/文件是否可寫,請寫一個函數來判斷目錄/文件是否絕對可寫
5.PHP的chmod()函數存在Bug,無法保證設置成功,請寫一個函數在指定路徑下創建一個目錄/文件并確保可以正確設置權限掩碼
6.PHP處理上傳文件信息數組中的文件類型$_FILES['type']由客戶端瀏覽器提供,有可能是黑客偽造的信息,請寫一個函數來確保用戶上傳的圖像文件類型真實可靠
7.PHP通過對數據的URL編碼來實現與Javascript的數據交互,但是對于部分特殊字符的編解碼與Javascript的規則不盡相同,請具體說明這種差異,并針對UTF-8字符集的數據,寫出PHP的編解碼函數和Javascript的編解碼函數,確保PHP編碼數據可以被Javascript正確解碼 、Javascript編碼的數據可以被PHP正確解碼
8.試闡述Memcache的key多節點分布的算法?當任一節點出現故障時PHP的Memcache客戶端將如何處置?如何確保Memcache數據讀寫操作的原子性?
9.如何實現PHP的安全最大化?怎樣避免SQL注入漏洞和XSS跨站腳本攻擊漏洞?
10.請設計一個數據結構可以實現無限級子菜單的樹型菜單功能并提供菜單生成算法,用UML描述設計并寫出相關PHP代碼
二、系統相關部分
1.請簡述Linux、FreeBSD、Soalaris、Mac OS、Windows幾種系統下進程與線程的內核實現方式、管理機制的異同
2.請簡述Linux/BSD系統下進程間通訊的方式有哪些,并具體說明在PHP下如何實現
3.請簡述Linux/BSD系統下系統的消息/事件異步通知機制有幾種,并加以比較
4.簡單比較TCP/UDP協議的異同,對于PHP的Socket擴展與Stream擴展,試比較兩者基于TCP/UDP協議的SOCKET編程差異?
5.為什么會出現僵死進程(孤兒進程)?怎樣查看僵死進程?如何解決僵死進程問題?
6.對于System-V消息隊列,如何解決系統本身對于消息隊列條數、總容量(字節數)的限制?如何設置消息的優先級別?請比較阻塞模式和非阻塞模式的異同,并說明如何避免非阻塞模式下的消息隊列堵塞?
7.請描述Apache 2.x版本的MPM(Multi-Processing Module)機制,并具體說明在不同的`MPM機制下如何支持PHP?
8.請簡述PHP在Apache下的幾種運行方式并加以比較?如何讓PHP在Linux+Apache下以Fast CGI方式運行?
9. 請寫出讓PHP能夠在命令行下以腳本方式執行時安裝PHP所必須指定的configure參數,并說明如何在命令行下運行PHP腳本(寫出兩種方式)同時向PHP腳本傳遞參數?
10.請簡述PHP 5.2的內存池及其內存管理機制、垃圾回收機制
騰訊php面試題(三)
1 . 請對 POSIX 風格和兼容 Perl 風格兩種正則 表達式的主要函數進行類比說明
ereg |
preg_match |
ereg_replace |
preg_replace |
2 . 請說明在 php .ini 中 safe_mode 開啟之后對于 PHP 系統 函數的影響
開啟之后,主要會對系統操作、文件、權限設置等方法產生影響,平常項目基本上也用不到這些方法。主要我想還是用來應對webshell吧,減少被人植入webshell所帶來的某些安全問題。
3 .PHP5 中魔術 方法 函數有哪幾個,請舉例說明各自的用法
__sleep
__wakeup
__toString
__set_state
__construct,
__destruct
__call,
__get,
__set,
__isset,
__unset
__sleep,
__wakeup,
__toString,
__set_state,
__clone
__autoload
4 . 請寫出讓,并說明如何在命令行下運行 PHP 腳本(寫出兩種方式)同時向 PHP 腳本傳遞參數?
1. Php filename.php $agr1 $agr2
2. php –r “”
5 . PHP 的垃圾收集機制是怎樣的
PHP作為腳本語言是頁面結束即釋放變量所占內存的。 當一個 PHP線程結束時,當前占用的所有內存空間都會被銷毀,當前程序中所有對象同時被銷毀。GC進程一般都跟著每起一個SESSION而開始運行的.gc目的是為了在session文件過期以后自動銷毀刪除這些文件. 在PHP中,沒有任何變量指向這個對象時,這個對象就成為垃圾。PHP會將其在內存中銷毀;這是PHP 的GC垃圾處理機制,防止內存溢出。 執行這些函數也可以起到回收作用 __destruct /unset/mysql_close /fclose php對session有明確的gc處理時間設定 session.gc_maxlifetime 如果說有垃圾,那就是整體的程序在框架使用中,會多次調用同一文件等等造成的非單件模式等。所以在出來的時候,必要的用_once 引用,在聲明類的時候使用單件模式。還有簡化邏輯等等。而如果妄想讓PHP自己本身管理內存,進行垃圾管理。呵呵。好像PHP還辦不到,對于析構函數,ANDI在他的書里寫的很明白。可有可無,不可置否。而內存管理的東西一般都是桌面程序更多去考慮的。
6 .使對象可以像數組一樣進行 foreach 循環,要求屬性必須是私有。
(Iterator 模式的 PHP5 實現,寫一類實現 Iterator 接口 )
class sample implements Iterator
{
private $_items = array(1,2,3,4,5,6,7);
public function __construct() {
;//void
}
public function rewind() { reset($this->_items); }
public function current() { return current($this->_items); }
public function key() { return key($this->_items); }
public function next() { return next($this->_items); }
public function valid() { return ( $this->current() !== false ); }
}
$sa = new sample();
foreach($sa as $key => $val){
print $key . "=>" .$val;
}
?>
7 .請寫一段 PHP 代碼 ,確保多個進程同時寫入同一個文件 成功
function write_file($filename, $content)
{
$lock = $filename . '.lck';
$write_length = 0;
while(true) {
if( file_exists($lock) ) {
usleep(100);
} else {
touch($lock);
$write_length = file_put_contents($filename, $content, FILE_APPEND);
break;
}
}
if( file_exists($lock) ) {
unlink($lock);
}
return $write_length;
}
8 . 用 PHP 實現一個雙向隊列
class DEQueue {
//存儲
protected $_storage = array();
//入頭
public function unshift($element)
{
return array_unshift($this->_storage, $element);
}
//入尾
public function push($element)
{
return array_push($this->_storage, $element);
}
//出尾
public function pop()
{
return array_pop($this->_storage);
}
//出頭
public function shift()
{
return array_shift($this->_storage);
}
//長度
public function length()
{
return count($this->_storage);
}
}
9 .使用正則表達式提取一段標識語言( html 或 xml )代碼段中指定標簽的指定屬性值(需考慮屬性值對不規則的情況,如大小寫不敏感,屬性名值與等號間有 空格等)。此處假設需提取 test 標簽的 attr 屬性值,請自行構建包含該標簽的串
10 .請使用 socket 相關函數(非 curl )實現如下功 能:構造一個 post 請求,發送到指定 http server 的指定端口的指定請求路徑(如 http://www.phpddt.com:8080/test )。請求中包含以下變量:
用戶名( username ):溫柔一刀
密碼( pwd ): &123=321&321=123&
個人簡介( intro ): Hello world !
且該 http server 需要以下 cookie 來進行簡 單的用戶動作跟蹤:
cur_query : you&me
last_tm : ... (上次請求的 unix 時間戳,定為當前請求時間前 10 分鐘)
cur_tm : ... (當前請求的 unix 時間戳)
設置超時為 10 秒,發出請求后, 將 http server 的響應內容輸出。
Function encode($data, $sep = ‘&’){
while (list($k,$v) = each($data)) {
$encoded .= ($encoded ? "$sep" : "");
$encoded .= rawurlencode($k)."=".rawurlencode($v);
}
Return $encoded;
}
Function post($url, $post, $cookie){
$url = parse_url($url);
$post = encode($data, ‘&’);
$cookie = encode($cookieArray, ‘;’);
$fp = fsockopen($url['host'], $url['port'] ? $url['port'] : 80,$errno,$errstr,10);
if (!$fp) return "Failed to open socket to $url[host]";
fputs($fp, sprintf("POST %s%s%s HTTP/1.0/n", $url['path'], $url['query'] ? "?" : "", $url['query']));
fputs($fp, "Host: $url[host]/n");
fputs($fp, "Content-type: application/x-www-form-urlencoded/n");
fputs($fp, "Content-length: " . strlen($encoded) . "/n");
fputs($fp, "Cookie: $cookie/n/n");
fputs($fp, "Connection: close/n/n");
fputs($fp, "$post /n");
while (!feof($fp)) {
echofgets($fp,128);
}
fclose($fp);
}
$url = ‘http://www.phpddt.com:8080/test ’;
$encoded = username= 溫柔一刀 & pwd=
$post = array(
‘ username ’ => ‘溫柔一刀’ ,
‘ pwd => ‘&123=321&321=123&’,
‘ intro => ‘Hello world!’
);
$cookie = array(
‘ cur_query’ => ‘ you&me,
‘ last_tm’ =>time() -600,
‘cur_tm ‘=> time()
);
Post($url, $post, $cookie);
11 .你用什么方法檢查 PHP 腳本的執行效率(通常是腳本執行時間)和數據庫 SQL 的效率(通常是數據庫 Query 時間), 并定位和分析腳本執行和數據庫查詢的瓶頸所在?
1.PHP執行時間:
$begin=microtime(true); //獲取程序開始執行的時間
// some code here 待執行的代碼
$stop=microtime(true); //獲取程序執行結束的時間
list($m0,$s0)=explode(" ",$begin);
list($m1,$s1)=explode(" ",$stop);
$runtime=($s1+$m1-$s0-$m0)*1000;
echo '
當前腳本執行時間:'.$etime-$stime.'微秒';
2.SQL執行時間(其實和上面一樣):
$begin=microtime();
mysql_query($sql);
$stop=microtime();
list($m0,$s0)=explode(" ",$begin);
list($m1,$s1)=explode(" ",$stop);
$runtime=round(($s1+$m1-$s0-$m0)*1000,4);
echo '
當前腳本執行時間:'.$runtime.'ms';
【騰訊php面試題】相關文章:
PHP面試題與答案10-25
2017基礎php面試題06-07
php常用面試題及答案06-19
常用php面試題及答案06-19
PHP的面試題集匯總推薦12-03
最新關于精選php面試題及答案08-07
優秀php高級工程師面試題及答案06-19
騰訊筆試題02-28
騰訊筆試經驗07-17
騰訊筆試試題08-11