一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - PHP教程 - php牛逼的面試題分享

php牛逼的面試題分享

2020-03-08 15:03PHP教程網(wǎng) PHP教程

群友發(fā)的php牛逼的面試題,喜歡的朋友可以看看

1.nginx使用哪種網(wǎng)絡(luò)協(xié)議? 
nginx是應(yīng)用層 我覺得從下往上的話 傳輸層用的是tcp/ip 應(yīng)用層用的是http 
fastcgi負責調(diào)度進程 


2. <? echo 'hello tusheng' ; ?> 沒有輸出結(jié)果, 可能是什么原因, 簡述的解決此問題的過程(提示: 語法沒有問題) 


可能服務(wù)器上面沒有開啟短標簽short_open_tag =設(shè)置為Off,,php.ini開啟短標簽控制參數(shù): short_open_tag = On 


3. 簡述下面程序的輸出結(jié)果, 簡要說明為什么, 如何解決這類問題? 
<?php 
$tmp = 0 == "a"? 1: 2; 
echo $tmp; 
?> 


結(jié)果 1 int和string類型強制轉(zhuǎn)換造成的,0==="a" 


0 == 0 肯定是true啊 
PHP是弱類型。。 
$tmp = 0 === "a"? 1: 2; 
echo $tmp; 這樣就是2 




4. 已知一個字符串如下: $str = "1109063 milo 1"; 
用一行代碼將該字符串里面的1109063賦值給$uid, milo賦值給$user, 1賦值給$type 


空格如下 
list($uid, $user, $type) = explode(" ", $str); 
\t如下 
list($uid, $user, $type) = explode("\t", $str); 


list($uid, $user, $type) = sscanf($str, "%d %s %d"); 


$n = sscanf($auth, "%d\t%s %s", $id, $first, $last); 


5. 分別列出如下類型的有符號和無符號范圍 TINYINT SMALLINT MEDIUMINT INT 


TINYINT-2^7 - 2^7-10 ~ 2^8-1 
SMALLINT-2^15 - 2^15-1 0 ~ 2^16-1 
MEDIUMINT-2^23 - 2^23-1 0 ~ 2^24-1 
INT-2^31 - 2^31-1 0 ~ 2^32-1 


6. 將下面的數(shù)組用一行拼裝成一個字符串i am milo! day day up! 
<?php 
$arr = array( 
'I', 'AM', 'MILO!', 'DAY', 'DAY', 'UP!' 
); 
?> 


$str = strtolower(implode(" ",$arr)); 


7. 調(diào)用如下函數(shù)獲取函數(shù)并獲取count的值 
<?php 
function get_list($cnd = array(), &$count = false) 

// 偽代碼 處理$cnd 并賦值datas 
$datas = 'i am call back'; 
$count && $count = rand(1, 10000); 
return $datas; 

?> 


$count=1; 
$data = get_list($cnd,&$count); 
echo $count; 


8. 幾種方式去取代session機制, 簡單描述各自的優(yōu)劣 


mysql、memcache、cookie保持一種唯一狀態(tài)標識碼 


9. 下列HTTP狀態(tài)碼出現(xiàn)的可能原因, 如何處理 
200, 301, 404, 502, 503 


200 
  請求已成功,請求所希望的響應(yīng)頭或數(shù)據(jù)體將隨此響應(yīng)返回。 
301 
  被請求的資源已永久移動到新位置,并且將來任何對此資源的引用都應(yīng)該使用本響應(yīng)返回的若干個 URI 之一。如果可能,擁有鏈接編輯功能的客戶端應(yīng)當自動把請求的地址修改為從服務(wù)器反饋回來的地址。除非額外指定,否則這個響應(yīng)也是可緩存的。   新的永久性的 URI 應(yīng)當在響應(yīng)的 Location 域中返回。除非這是一個 HEAD 請求,否則響應(yīng)的實體中應(yīng)當包含指向新的 URI 的超鏈接及簡短說明。   如果這不是一個 GET 或者 HEAD 請求,因此瀏覽器禁止自動進行重定向,除非得到用戶的確認,因為請求的條件可能因此發(fā)生變化。   注意:對于某些使用 HTTP/1.0 協(xié)議的瀏覽器,當它們發(fā)送的 POST 請求得到了一個301響應(yīng)的話,接下來的重定向請求將會變成 GET 方式。 


404 
  請求失敗,請求所希望得到的資源未被在服務(wù)器上發(fā)現(xiàn)。沒有信息能夠告訴用戶這個狀況到底是暫時的還是永久的。假如服務(wù)器知道情況的話,應(yīng)當使用410狀態(tài)碼來告知舊資源因為某些內(nèi)部的配置機制問題,已經(jīng)永久的不可用,而且沒有任何可以跳轉(zhuǎn)的地址。404這個狀態(tài)碼被廣泛應(yīng)用于當服務(wù)器不想揭示到底為何請求被拒絕或者沒有其他適合的響應(yīng)可用的情況下。 
502 
  作為網(wǎng)關(guān)或者代理工作的服務(wù)器嘗試執(zhí)行請求時,從上游服務(wù)器接收到無效的響應(yīng)。 
503 
  由于臨時的服務(wù)器維護或者過載,服務(wù)器當前無法處理請求。這個狀況是臨時的,并且將在一段時間以后恢復(fù)。如果能夠預(yù)計延遲時間,那么響應(yīng)中可以包含一個 Retry-After 頭用以標明這個延遲時間。如果沒有給出這個 Retry-After 信息,那么客戶端應(yīng)當以處理500響應(yīng)的方式處理它。   注意:503狀態(tài)碼的存在并不意味著服務(wù)器在過載的時候必須使用它。某些服務(wù)器只不過是希望拒絕客戶端的連接。 




200 OK 一切正常,對GET和POST請求的應(yīng)答文檔跟在后面。 
301 Moved Permanently 客戶請求的文檔在其他地方,新的URL在Location頭中給出,瀏覽器應(yīng)該自動地訪問新的URL 
404 Not Found 無法找到指定位置的資源。這也是一個常用的應(yīng)答。 
502 Bad Gateway 服務(wù)器作為網(wǎng)關(guān)或者代理時,為了完成請求訪問下一個服務(wù)器,但該服務(wù)器返回了非法的應(yīng)答。 
503 Service Unavailable 服務(wù)器由于維護或者負載過重未能應(yīng)答。例如,Servlet可能在數(shù)據(jù)庫連接池已滿的情況下返回503。服務(wù)器返回503時可以提供一個Retry-After頭。 


10. 有如下數(shù)據(jù)庫, 用原生態(tài)mysql擴展去連接并查詢user表的前十行 
host: 192.168.0.254 
port: 3306 
user: one 
pass: piece 
database: db_user 
table: user 


$link = mysql_connect("192.168.0.254:3306","one","piece") or die('Could not connect: '.mysql_error()); 
mysql_select_db('db_user',$link); 
$query = mysql_query("select * from user limit 10"); 
while($rs = mysql_fetch_array($query,MYSQL_ASSOC)) 
{} 


11. 用autoload($class) 實現(xiàn)Lib目錄下的類的自動加載并可以兼容子目錄 
$request->action = lcfirst(implode(array_map( 
'ucfirst', 
explode('-', strtolower($request->action)) 
))); 
------------------------------------------------------------ 
function __autoload($class) 

$cls = strtolower(str_replace("_","/",$class)); 


if(file_exsits(LIB.$cls.'.php')) 

include_once(LIB.$cls.'.php'); 

else 

die("not found {$class} class"); 


defined("LIB",'/data/wwwroot/www.xx.com/lib/'); 
$author = new Lib_Author(); 
----------------------------------------------------------- 
function __authload($class) 

$cls = explode("_",$class); 
if(@is_dir($cls[1])) 

if(@is_file($cls[2])) 

include_once("CON_PATH".$cls[1].'/'.$cls[2].".php"); 

else 

dir('error'); 


else if(@is_file($cls[1].".php")) 

include_once("CON_PATH".$cls[1].".php"); 

else 

dir('error'); 


--------------------------------------- 
function __autoload($class) 

$cls = explode("_",$class); 
$file = get_file($cls); 
if($file=='error') 

die('error'); 

include_once($file); 

function get_file($dir) 

if(is_array($dir)) 

foreach($dir as $k=>$v) 

$tmpdir .= $v.'/'; 
if(is_dir('CON_PATH'.$tmpdir)) 

continue(); 

else if(is_file('CON_PATH'.$tmpdir.".php")) 

return 'CON_PATH'.$tmpdir.".php"; 

else 

return 'error'; 


return 'error'; 

return 'error'; 



defined("CON_PATH","/data/wwwroot/www.xx.com/app/cntroller/"); 
$sb = new controller_sb(); 
------------------------------------ 
function __autoload_my_classes($classname) 

# ... your logic to include classes here 

spl_autoload_register('__autoload_my_classes'); 
----------------------------------------------------------- 
12. 用set_error_handle 去捕獲錯誤并輸出, 級別自己定 
set_error_handle(callback,level) 
function callback(int $errno , string $errstr [, string $errfile [, int $errline [, array $errcontext ]]] ){ 



function dealErrorHandler($errno,$errstr,$errfile,$errline) 

switch($errno){ 
case E_USER_ERROR: 
echo "error [$errno] $errstr fatal error on line $errline in file $errfile"; 
break; 
case E_USER_WARNING: 
echo "my warning [$errno] $errstr": 
break; 
case E_USER_NOTICE: 
echo "my notice[$errno] $errstr"; 
break; 
default: 
echo "unkonwn error type :[$errno] $errstr"; 
break; 


set_erro_handler(dealErrorHandler); 


trigger_error("notice", E_USER_NOTICE); 
trigger_error("warning", E_USER_WARNING); 
trigger_error("error", E_USER_ERROR); 


13. 簡述兩種屏蔽php程序的notice警告的方法 


初始化變量,文件開始設(shè)置錯誤級別或者修改php.ini 設(shè)置error_reporting 
set_error_handler 和 @抑制錯誤 


1.在程序中添加:error_reporting (E_ALL & ~E_NOTICE); 


2.或者修改php.ini中的:error_reporting = E_ALL 


改為:error_reporting = E_ALL & ~E_NOTICE 
3.error_reporting(0);或者修改php.inidisplay_errors=Off 




14. instanceof的作用, 經(jīng)常在什么設(shè)計模式中使用 


單例模式,但是其他的模式也會用到 


15. 1023用二進制表示, 并簡述計算過程 


10-2 
1023%2=1 
511%2 =1 
255%2 =1 
127%2 =1 
63%2 =1 
31%2 =1 
15%2 =1 
7%2 =1 
3%2 =1 
1%2 =1 
0 =0 
------------------------------------------- 
1023 
2^9=<N<2^10 
511 


k=9 
10 9 8 7 6 5 4 3 2 1 
1 1 1 1 1 1 1 1 1 1 
---------------------- 
1023 1 
1023-1/2=511 1 
511-1/2=255 1 
255-1/2=127 1 
127-1/2=63 1 
63-1/2=31 1 
31-1/2=15 1 
15-1/2=7 1 
7-1/2=3 1 
3-1/2=1 1 




----------------------------------------------- 


2-10 


只需用將二進制數(shù)的各個位上的數(shù)從最右邊開始,最右邊的第一個數(shù)乘以二的零次方,第二個數(shù)乘以二的一次方,第三個數(shù)乘以二的二次方,依次類推可得第n個數(shù)乘以二的(n-1)次方,然后把得到的結(jié)果相加即可 
例如:110011=1*2^0+1*2^1+0*2^2+0*2^3+1*2^4+1*2^5=51 
這也可以算是一個公式就是An*2^(n-1) An表示二進制數(shù)最右邊開始的第n個數(shù), 
將第一項第二項第三項一直到第n項用式子An*2^(n-1) 計算出來并加在一起即可 




16. 下面php程序輸出的內(nèi)容是什么? 為什么? 
<?php 
$str = "aa\tbb\tcc"; 
@list($a, $b, $c) = explode('\t', $str); 
echo $a,$b,$c; 
?> 


aabbcc;//'\t'不會以\t切割字符串,explode之后申城一個array(0=>"aa\tbb\tcc")所以。。。,'\t'換成"\t"就被切割 


17. include和require 分別返回什么錯誤級別 


include會系統(tǒng)警告并繼續(xù)執(zhí)行,require會發(fā)出系統(tǒng)警告但是會引致致命錯誤令腳本終止運行 


18. 現(xiàn)有一個函數(shù), 有不確定多少個的參數(shù)(可能有5個也可能有50個), 如何去定義這個函數(shù) 
方法一: 不借助php內(nèi)置函數(shù) 
方法二: 提示func_num_args() func_get_arg() unc_get_args() 




function param() 

$numargs = func_num_args(); 
echo "Number of arguments: $numargs<br />\n"; 
if ($numargs >= 2) { 
echo "Second argument is: " . func_get_arg(1) . "<br />\n"; 

$arg_list = func_get_args(); 
for ($i = 0; $i < $numargs; $i++) { 
echo "Argument $i is: " . $arg_list[$i] . "<br />\n"; 




param(1,2,3,4,5); 




/** 
2 * 例子寫完后,本來認為完事了,結(jié)果遇到有人問call_user_func_array(),看了一下手冊 
3 * 原來,我上面的那個test函數(shù)還可以精簡成如下的例子, 
4 */ 
5 function otest1 ($a) 
6 { 
7 echo( '一個參數(shù)' ); 
8 } 

10 function otest2 ( $a,$b) 
11 { 
12 echo( '二個參數(shù)' ); 
13 } 
14 
15 function otest3 ( $a,$b,$c) 
16 { 
17 echo( '三個啦' ); 
18 } 
19 
20 function otest () 
21 { 
22 $args=func_get_args(); 
23 $num=func_num_args(); 
24 call_user_func_array( 'otest'.$num,$args ); 
25 } 
26 
27 otest(1,2); 










19. 在一個函數(shù)(該函數(shù)沒有return語句)里面去處理全局變量, 并且改變他的值, 用兩種方法去實現(xiàn)(global和引用&) 


$var=1; 
function get_pra() 

global $var; 
$var = 'xxx'; 
echo $var; 

echo $var.'--'; 
get_pra(); 
echo $var; 
---------------------------------- 
$test = 1; 
$test1 = 2; 
function get_yinyong() 

global $test1; 
$GLOBALS["test"] = &$test1; 

echo $test."\n"; 
get_yinyong(); 
echo $test; 
---------------------------- 
20. 應(yīng)用中我們經(jīng)常會遇到在user表隨機調(diào)取10條數(shù)據(jù)來展示的情況, 簡述你如何實現(xiàn)該功能, 不能使用sql函數(shù)以及order by等語句 
表 user 字段uid, username 


估計一個user表中的區(qū)間,在此區(qū)間用php去一個隨機數(shù),sql語句大于或者小于此id去limit幾十條(保證10條數(shù)據(jù)),再不夠散亂的話,取出來的數(shù)據(jù)shuffle函數(shù)打亂數(shù)組,array_rand隨即取出10個 


21. 假設(shè)下面的sql語句里面的uid都能獲取到具體值, 經(jīng)過下面語句查詢后uid的順序是什么, 如何去按照uid in 輸入的順序去排序 
select uid from user where uid in(10, 1, 3, 8, 11, 4, 7); 


可觀的結(jié)果是1,3,4,7,8,10,11升序,有種情況特殊就是不確定因為中間的某些id人為直接修改可能不是升序了,如果按照uid in的順序需要重新循環(huán)一次根據(jù)id獲取查詢結(jié)果數(shù)組中的值放進新數(shù)組中即可 


22. 用PHP將一個字符串中的字母替換成** 


preg_replace('/[a-zA-Z]*/','**',$str); 
如果指定的字符就可以str_replace('ooxx','**',$str); 


23. 下面2.php中打印結(jié)果是什么? 為什么? 執(zhí)行順序1.php->2.php 


cookie,cookie時間就有問題time()+3600 




24. 簡述php常用的json編碼函數(shù), 如何將json解碼的時候返回數(shù)組 


25. mysql 在sql語句中有' / 等詞的時候, 要對sql語句的每個具體值做些什么處理 


mysql_real_escape_string 


26. 如何在php中設(shè)置header頭信息 


header(''); 


27.有如下幾個腳本, 請問2.php的輸出結(jié)果 


1.php 
<?php 
setcookie('test', 'cookie_test', 3600); 
?> 
2.php 
<?php 
$cookie = isset($_COOKIE['test'])? $_COOKIE['test']: 'cookie'; 
echo $cookie; 
?> 


i am here 

總結(jié) 
a.如果include或include_once不是在函數(shù)或方法中被調(diào)用,則輸出結(jié)果均一樣。 
b.如果include或 include_once在函數(shù)或方法中被調(diào)用,則如果想讓第二次及以后調(diào)用時有結(jié)果,則必須用include,而不能用include_once,這一點一定要注意。 


28. 簡述call_user_func的功能 


調(diào)用函數(shù)或者類里面的函數(shù),返回第一個參數(shù)的值。類似的功能call_user_func_array 


29. 訪假設(shè)nginx已經(jīng)配置server_name www.120.net xxx.120.net 
訪問問http://www.120.net/index.php和http://xxx.120.net/index.php之后 
$_SERVER["SERVER_NAME"] 和 $_SERVER["REQUEST_URI"]分別是什么 


www.120.net xxx.120.net 
/index.php /index.php 


30. linux下某文件的屬性為 drwxr-xr-x 用數(shù)字表示其權(quán)限是 


目錄權(quán)限為755所有者u擁有讀寫修改權(quán)限所屬組g擁有讀、修改權(quán)限所屬組之外o的擁有讀和修改權(quán)限 


31. 寬帶的1Mbps理論上的下載速度是多少KBps, 計算的方法 


1*1024/8 


1M=1024KB 
1KB=1024B 
1B=8bit 


第二部分 
1. 簡單實現(xiàn)一個單例+工廠的設(shè)計模式abstract class Example{ // The parameterized factory method public static function factory($type) { if (include_once 'Drivers/' . $type . '.php') { 
$classname = 'Driver_' . $type; 
return new $classname; 
} else { 
throw new Exception ('Driver not found'); 

}}// Load a MySQL Driver$mysql = Example::factory('MySQL'); 
// Load a SQLite Driver 
$sqlite = Example::factory('SQLite'); 
definded('DRIVER','/data/wwwroot/www.want.com/core/driver/');abstract class Example(){ private function __construct() { } public static function factory($type) { if(include_once(DRIVER.$type.'.php')) { return ExampleSon::singleton($type); } else { throw new Exception("Driver is not found!"); } } }class ExampleSon implements Example{ // Hold an instance of the class private static $instance; //靜態(tài)私有的類實例 // A private constructor; prevents direct creation of object private function __construct() { echo 'I am constructed'; } // The singleton method public static function singleton() { if (!isset(self::$instance)) { //如果沒有設(shè)置靜態(tài)私有類實例,創(chuàng)建之 $c = __CLASS__; //獲得類名稱 self::$instance = new $c } return self::$instance; } // Example method public function bark() { echo 'Woof!'; } // Prevent users to clone the instance public function __clone() //不允許被克隆 { trigger_error('Clone is not allowed.', E_USER_ERROR); 
}}關(guān)鍵詞: 
1 私有靜態(tài)成員變量 
2 __CLASS__獲取當前類名 
3 公共靜態(tài)方法獲取單例 
4 覆蓋__clone()方法 

----十個字:私有靜態(tài)量,公共靜態(tài)法-------- 

2. 例舉幾個常用的魔術(shù)方法, 并說明作用? 如何在打印一個對象的時候展示我們自定義的內(nèi)容? 

魔術(shù)函數(shù) 

1。__construct() 
實例化對象時被調(diào)用, 
當__construct和以類名為函數(shù)名的函數(shù)同時存在時,__construct將被調(diào)用,另一個不被調(diào)用。 

2。__destruct() 
當刪除一個對象或?qū)ο蟛僮鹘K止時被調(diào)用。 

3。__call() 
對象調(diào)用某個方法, 
若方法存在,則直接調(diào)用; 
若不存在,則會去調(diào)用__call函數(shù)。 

4。__get() 
讀取一個對象的屬性時, 
若屬性存在,則直接返回屬性值; 
若不存在,則會調(diào)用__get函數(shù)。 

5。__set() 
設(shè)置一個對象的屬性時, 
若屬性存在,則直接賦值; 
若不存在,則會調(diào)用__set函數(shù)。 

6。__toString() 
打印一個對象的時被調(diào)用。如echo $obj;或print $obj; 

7。__clone() 
克隆對象時被調(diào)用。如:$t=new Test();$t1=clone $t; 

8。__sleep() 
serialize之前被調(diào)用。若對象比較大,想刪減一點東東再序列化,可考慮一下此函數(shù)。 

9。__wakeup() 
unserialize時被調(diào)用,做些對象的初始化工作。 

10。__isset() 
檢測一個對象的屬性是否存在時被調(diào)用。如:isset($c->name)。 

11。__unset() 
unset一個對象的屬性時被調(diào)用。如:unset($c->name)。 

12。__set_state() 
調(diào)用var_export時,被調(diào)用。用__set_state的返回值做為var_export的返回值。 

13。__autoload() 
實例化一個對象時,如果對應(yīng)的類不存在,則該方法被調(diào)用。 

魔術(shù)常量 

1。__LINE__ 
返回文件中的當前行號。 

2。__FILE__ 
返回文件的完整路徑和文件名。如果用在包含文件中,則返回包含文件名。自 PHP 4.0.2 起,__FILE__ 總是包含一個絕對路徑,而在此之前的版本有時會包含一個相對路徑。 

3。__FUNCTION__ 
返回函數(shù)名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該函數(shù)被定義時的名字(區(qū)分大小寫)。在 PHP 4 中該值總是小寫字母的。 

4。__CLASS__ 
返回類的名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該類被定義時的名字(區(qū)分大小寫)。在 PHP 4 中該值總是小寫字母的。 

5。__METHOD__ 
返回類的方法名(PHP 5.0.0 新加)。返回該方法被定義時的名字(區(qū)分大小寫)。 

3. 類靜態(tài)方法和實例化類方法比較及優(yōu)缺點 

4. 有一個論壇 
threads表記錄主題以及標題等信息 
posts表記錄主題內(nèi)容以及回復(fù)內(nèi)容等信息 
threads 表主鍵為 tid 
posts 表主鍵為 pid, 所屬主題標記為tid 
通過tid將threads和posts 一對多關(guān)聯(lián)起來 
現(xiàn)在數(shù)據(jù)量posts表達到了1億, threads表2000萬, 大約一個主題有5篇回復(fù) 
請你設(shè)計一下分表, 將posts表和threads表進行mysql分表 

5. 現(xiàn)在有一個mysql 主庫/叢庫, 請問php mysql查詢的時候怎么在php程序中實現(xiàn)主從分離? 主從分離有什么好處配置主從數(shù)組文件,自己封轉(zhuǎn)幾個model函數(shù),查詢的加載slave配置實例化,破壞數(shù)據(jù)的操作加載master進行實例化優(yōu)點:并發(fā)負載能力提高,利于數(shù)據(jù)維護和安全,提高可用性缺點:數(shù)據(jù)同步有些延遲 

6. 簡述UCenter的單點登錄機制 
所謂單點登錄,無非就是幾個站點共用一個用戶中心,實現(xiàn)同步登陸,同步退出。 

其實最終還是用戶去登錄,只是采用了ajax (javascript利用src異步跨域調(diào)用)用戶不會發(fā)現(xiàn)。 

而且利用了p3p頭實現(xiàn)了,不同域名,單點登錄(ucenter用的cookie) 

缺點就是采用ajax 客服端請求 ,如果有10個以上應(yīng)用,登錄速度就慢下來了。 


7. linux相關(guān) 有一個包 http://www.120.net/test-1.0.0.tar.gz 
a. 將它下載到/usr/local/src 
b. 將其源碼編譯安裝到/usr/local/test 目錄 
c. 他依賴mysql包, 位于/usr/local/mysql 目錄 
寫出下載編譯安裝過程 

wget - c http://www.120.net/test-1.0.0.tar.gz/usr/local/srctar zxvf /usr/local/src/test-1.0.0.tar.gzcd /usr/local/src/test-1.0.0./configure --prefix=/usr/local/test --exec--prefix=/usr/local/mysqlmake testmake install 

8. 使用php 的memcache擴展編寫一個獲取數(shù)據(jù)的函數(shù)(緩存即將過期超時加鎖) 
a. 數(shù)據(jù)超時之后去mysql獲取, 獲取完后更新memcache 
b. 去mysql獲取數(shù)據(jù)的時候加鎖, 讓一個進程去mysql拉數(shù)據(jù), 其他人返回memcache中的數(shù)據(jù) 

public function get_cache($key) { if($this->memcahe) { $var = $this->memcahe->get($this->pre.$key); $valid = $this->memcahe->get($this->pre.$key.'_valid'); if($var && !$valid) { $lock = $this->memcahe->get($this->pre.$key.'_lock'); if(!$lock) { $this->memcahe->set($this->pre.$key.'_lock', true, 0, 60); return false; } } return $var; } return false; } 
public function set_cache($key, $var = null, $expire = 0) { if($this->memcahe) { $expire = (int)$expire; $expire = ($expire ? $expire : $this->expire); $this->memcahe->set($this->pre.$key, $var, 0, $expire+300); $this->memcahe->set($this->pre.$key.'_lock', false, 0, $expire); $this->memcahe->set($this->pre.$key.'_valid', true, 0, $expire); return true; } return false; } 

9. 簡述隊列, 堆棧的原理 


都可以看做是一維數(shù)組來操作,隊列先進先出,出列只能在列頭,進列只能在列尾,堆棧是后進先出,進棧和出棧都是從棧頂 


堆棧的工作原理是什么? 


堆棧是一種抽象數(shù)據(jù)結(jié)構(gòu),其操作機理是后進先出。當你把新條目推進堆棧時,已經(jīng)在堆棧內(nèi)的任何條目都會壓到堆棧的深處。同樣的,把一個條目從堆棧移出則會讓堆棧內(nèi)的其他條目都向堆棧的頂部移動。只有堆棧最頂端的條目能從堆棧中取出,條目離開堆棧的順序和它們被推進堆棧的順序一樣。你不妨回想下自動售貨機的裝貨和取貨過程就明白了。 
10. arrayaccess 定義如下 用它實現(xiàn)一個數(shù)組 
ArrayAccess { 
/* Methods */ 
abstract public boolean offsetExists ( string $offset ) 
abstract public mixed offsetGet ( string $offset ) 
abstract public void offsetSet ( string $offset , string $value ) 
abstract public void offsetUnset ( string $offset ) 

class Single implements ArrayAccess{ private $name; private static $_Instance = null; private function __construct() { } static function load() { if(null == self::$_Instance) { self::$_Instance = new Single(); } return self::$_Instance; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } /** * 實現(xiàn)四個方法 * offsetExists(),用于標識一個元素是否已定義 * offsetGet(),用于返回一個元素的值 * offsetSet(),用于為一個元素設(shè)置新值 * offsetUnset(),用于刪除一個元素和相應(yīng)的值 **/ public function offsetSet($offset, $value) { if (is_null($offset)) { $this->container[] = $value; } else { $this->container[$offset] = $value; } } public function offsetGet($offset) { return isset($this->container[$offset]) ? $this->container[$offset] : null; } public function offsetExists($offset) { return isset($this->container[$offset]); } public function offsetUnset($offset) { unset($this->container[$offset]); }}$s = Single::load();$s->setName("jack");$s["name"] = "mike";echo $s->getName(); //jackecho $s["name"]; //mike 
11. 假設(shè)coreseek安裝目錄為/usr/local/coreseek 
配置文件為/usr/local/coreseek/etc/test.conf 
索引名為 post 
a. 創(chuàng)建索引 
b. 啟動服務(wù) 
c. 重建索引(重建過程中保證搜索服務(wù)仍然可用) 

indexer -c /usr/local/coreseek/etc/test.conf --allsearchd -c /usr/local/coreseek/etc/test.conf indexer -c /usr/local/coreseek/etc/test.conf --all --rotate12. 假設(shè)您有一張posts帖子表 對該表進行sphinx增量準實時索引, 描述你的方案 
使用“主索引+增量索引”方法有個簡單的實現(xiàn),在數(shù)據(jù)庫中增加一個計數(shù)表,記錄每次重新構(gòu)建主索引時,被索引表的最后一個數(shù)據(jù)id,這樣在增量索引時只需要索引這個id以后的數(shù)據(jù)即可,每次重新構(gòu)建主索引時都更新這個表。 


13. php代碼: 
$i = 97;$a = ($i++) + (++$i) + $i ;$b = (--$i) + ($i--) + $i + 6; 

echo "$i, $a, $b";輸出結(jié)果是什么 

97, 295, 299 
97 
97+99+99 
98+98+97+6 


14. 以下代碼,用于取得客戶端IP: if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) { $onlineip = getenv('HTTP_CLIENT_IP');} elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) { $onlineip = getenv('HTTP_X_FORWARDED_FOR');} elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) { $onlineip = getenv('REMOTE_ADDR');} elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) { $onlineip = $_SERVER['REMOTE_ADDR'];}但是以HTTP_開始的請求header均屬于客戶端可以偽造的信息,在反向代理環(huán)境下,如何保證PHP不會接收到偽造的HTTP_CLIENT_IP, HTTP_X_FORWARDED_FOR值? 




15. 例如google,baidu等大型網(wǎng)站,當使用不同客戶端(如手機和PC機)訪問同樣的URL時,呈現(xiàn)的頁面卻不相同,這是何原理? 如果能給出實際解決方案,可加分。 




簡單的可以用user_agent判斷,但是及其初步 

可以的話通過服務(wù)器或者手機終端特征或者wap網(wǎng)關(guān)accept信息等 





16. 生產(chǎn)環(huán)境php.ini中magic_quotes_gpc及magic_quotes_runtime值應(yīng)該設(shè)置為什么?onoff17. PHP調(diào)用遠程http接口時可使用file_get_contents, 但當遠程主機不可達或響應(yīng)過慢,會導致本地PHP進程被長時間掛起,從而影響本地服務(wù)器穩(wěn)定性,如何避免超時時,PHP進程長時間被掛起? 




file_get_contents可以設(shè)置下超時時間$ctx = stream_context_create(array( 'http' => array( 'timeout' => 1 


); 
file_get_contents("http://www.want.com/", 0, $ctx); 
curl實現(xiàn)獲取遠程http接口也可以,同樣需要設(shè)置超時時間curl_setopt($s,CURLOPT_TIMEOUT,$timeout); 
18. 同上題,如何避免DNS查詢過慢導致超時?19. mysql字符集set names * 命令設(shè)置哪幾個系統(tǒng)變量的值?(ACE) A、Character_set_client B、Character_set_system C、Character_set_results D、Character_set_server E、Character_set_connection F、Character_set_database20. 以下哪種校對規(guī)則不區(qū)分大小寫?(A) A、utf8_general_ci B、utf8_general_cs C、utf8_general_bin21. 如何杜絕XSS攻擊? 
strip_tags可以初步過濾,也可以自己寫過濾函數(shù)針對特殊標簽進行處理,用ascii碼進行替換23. 如何杜絕CSRF攻擊? 
在Web應(yīng)用程序側(cè)防御CSRF漏洞,一般都是利用referer、token或者驗證碼,tokenf方式還是比較可信

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 处女呦呦 | 手机在线免费观看视频 | 女人被爽到呻吟娇喘的视频动态图 | 日韩激情视频在线观看 | 男同巨黄gay小说好爽 | hd性欧美俱乐部中文 | 日韩中文字幕一区 | 美国video| 日本大学jalapsikix | 精品一二三区久久AAA片 | 秋霞一级成人欧美理论 | 国模丰满美女冰漪34d | 人与动人物人a级特片 | 国产精品视频久久久久 | 爱福利视频一区 | 99久久精品国产片久人 | 天天av天天翘天天综合网 | 九9热这里只有真品 | 五月桃花网婷婷亚洲综合 | 九九精品视频在线免费观看 | 日本在线视频网 | 美女被无套进入 | 欧美一卡2卡三卡4卡5卡免费观看 | 经典欧美gifxxoo动态图暗网 | 亚洲国产精品自在在线观看 | 亚洲 欧美 国产 综合久久 | 国产精品美女久久久久 | 亚洲精品成人AV在线观看爽翻 | 亚洲国产在线观看免费视频 | 婷婷色综合网 | 精品久久久噜噜噜久久7 | 男人综合网 | 欧美午夜网站 | 亚洲第一网站免费视频 | 国产黑丝一区 | 日本高清在线播放一区二区三区 | 污网站免费观看在线高清 | 精品国产自在现线久久 | 亚洲精品tv久久久久久久久久 | 欧美ggg666| 91香蕉影院 |