国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

php部分面試題

2019-11-11 02:21:43
字體:
供稿:網(wǎng)友

php部分我是按照面試常問的問題總結(jié)的,下面的問題在面試中出場率很高。問題比較基礎(chǔ)

1、HTTP Keep-Alive的作用

作用:Keep-Alive:使客戶端到服務(wù)器端的連接持續(xù)有效,當(dāng)出現(xiàn)對服務(wù)器的后繼請求時,Keep-Alive功能避免了建立或者重新建立連接。Web服務(wù)器,基本上都支持HTTP Keep-Alive。

缺點:對于提供靜態(tài)內(nèi)容的網(wǎng)站來說,這個功能通常很有用。但是,對于負(fù)擔(dān)較重的網(wǎng)站來說,雖然為客戶保留打開的連 接有一定的好處,但它同樣影響了性能,因為在處理暫停期間,本來可以釋放的資源仍舊被占用。當(dāng)Web服務(wù)器和應(yīng)用服務(wù)器在同一臺機器上運行時,Keep- Alive功能對資源利用的影響尤其突出。

解決:Keep-Alive: timeout=5, max=100timeout:過期時間5秒(對應(yīng)httpd.conf里的參數(shù)是:KeepAliveTimeout),max是最多一百次請求,強制斷掉連接。就是在timeout時間內(nèi)又有新的連接過來,同時max會自動減1,直到為0,強制斷掉。

 

數(shù)組相關(guān)----------|

1、php數(shù)組函數(shù)常見的那些? (array_merge、in_array的作用)2、PHP中以array_開頭的數(shù)組函數(shù)有哪些,并說出使用方法(至少6個) 一、數(shù)組操作的基本函數(shù)復(fù)制代碼復(fù)制代碼
1 array_values($arr);       //獲得數(shù)組的值2 array_keys($arr);         //獲得數(shù)組的鍵名3 array_flip($arr);         //數(shù)組中的值與鍵名互換(如果有重復(fù)前面的會被后面的覆蓋)4 array_search('PHP',$arr); //檢索給定的值,加true則是嚴(yán)格類型檢查5 array_reverse($arr);      //將數(shù)組中的元素翻轉(zhuǎn)6 in_array("apple", $arr);  //在數(shù)組中檢索apple7 array_key_exists("apple", $arr); // 檢索給定的鍵名是否存在數(shù)組中8 array_count_values($arr);        // 統(tǒng)計數(shù)組中所有值出現(xiàn)的次數(shù)復(fù)制代碼復(fù)制代碼二、數(shù)組的分段和填充
1 array_slice($arr, 0, 3);    //將數(shù)組中的一段取出,此函數(shù)忽略鍵名(數(shù)組的分段)2 array_splice($arr, 0, 3,array("black","maroon"));    //將數(shù)組中的一段取出,返回的序列從原數(shù)組中刪除3 array_chunk($arr, 3, TRUE);   //將一個數(shù)組分割成多個,TRUE為保留原數(shù)組的鍵名(分割多個數(shù)組)四、數(shù)組與棧,列隊
1 array_push($arr, "apple", "pear");    //將一個或多個元素壓入數(shù)組棧的末尾(入棧),返回入棧元素的個數(shù)2 array_pop($arr);    // 將數(shù)組棧的最后一個元素彈出(出棧)3 array_shift($arr);   //數(shù)組中第一個元素移出并返回(長度減1,其他元素向前移動一位,數(shù)字鍵名改為從零計數(shù),文字鍵名不變)4 array_unshift($arr,"a",array(1,2));  //在數(shù)組的開頭插入一個或多個元素六、數(shù)組的排序
1 sort($arr);       //由小到大,忽略鍵名       2 rsort($arr);      //由大到小,忽略鍵名3 asort($arr);     //由小到大,保留鍵名       4 arsort($arr);    // 由大到小,保留鍵名5 ksort($arr);     //按照鍵名正序排序           6 krsort($arr);   // 按照鍵名逆序排序七、數(shù)組的計算復(fù)制代碼復(fù)制代碼
1 array_sum($arr);   //對數(shù)組內(nèi)部的所有元素做求和運算(數(shù)組元素的求和)2 array_merge($arr1, $arr2); //合并兩個或多個(相同字符串鍵名,后面覆蓋前面,相同的數(shù)字鍵名,后面的附加到后面)3  4 array_diff($arr1, $arr2);           //返回差集結(jié)果數(shù)組   array_diff_assoc($arr1, $arr2, $arr3);  //返回差集結(jié)果數(shù)組,鍵名也做比較5 array_intersect($arr1, $arr2);  //返回交集結(jié)果數(shù)組    array_intersect_assoc($arr1, $arr2);   //返回交集結(jié)果數(shù)組,鍵名也做比較 復(fù)制代碼復(fù)制代碼八、其他的數(shù)組函數(shù)
1 array_unique($arr);   //移除數(shù)組中重復(fù)的值,新的數(shù)組中會保留原始的鍵名2 shuffle($arr);             // 將數(shù)組的順序打亂 PHP中幾個輸出函數(shù)echo,PRint(),print_r(),sprintf(),var_dump()的區(qū)別

1:echo:是語句不是函數(shù),沒有返回值,可輸出多個變量值,不需要圓括號。不能輸出數(shù)組和對象,只能打印簡單類型(如int,string)。

2:print:是語句不是函數(shù),有返回值 1 ,只能輸出一個變量,不需要圓括號。不能輸出數(shù)組和對象,只能打印簡單類型(如int,string)。

3:print_r:是函數(shù),可以打印復(fù)合類型,例如:stirng、int、float、array、object等,輸出array時會用結(jié)構(gòu)表示,而且可以通過print_r($str,true)來使print_r不輸出而返回print_r處理后的值

4:printf:是函數(shù),把文字格式化以后輸出(參看C語言)

5:sprintf:是函數(shù),跟printf相似,但不打印,而是返回格式化后的文字(該函數(shù)把格式化的字符串寫寫入一個變量中,而不是輸出來),其    他的與printf一樣。 

例如:  

1 $str = "Hello";    2 $number = 123; 3 $txt = sprintf("%s world. Day number %u",$str,$number);4 //輸出: Hello world. Day number 123 

6:var_dump():函數(shù),輸出變量的內(nèi)容、類型或字符串的內(nèi)容、類型、長度。常用來調(diào)試。

可以通過function_exists('函數(shù)名稱')進行測試

1 var_dump(function_exists('print'));  //bool(false)2 3 var_dump(function_exists('echo'));  //bool(false)4 5 var_dump(function_exists('print_r')); //bool(true)

不用新變量直接交換現(xiàn)有兩個變量的值

復(fù)制代碼復(fù)制代碼
 1 1:  3     list($a, $b) = array($b, $a); 4 2:  5     $a = $a . $b; 5     $b = strlen( $b ); 6     $b = substr( $a, 0, (strlen($a) – $b ) ); 7     $a = substr( $a, strlen($b) ); 8  9 3:(必須用一個兩個字符串都都不能出現(xiàn)的字符做為分隔符)10     $a = $b.','.$a ;11     $a = explode(',', $a);12     $b = $a[1];13     $a = $a[0];14 15 4:這個是當(dāng)兩個數(shù)都是數(shù)字的時候:16     $a = $a + $b;17     $b = $a – $b;18     $a = $a – $b;19 20 5:借助數(shù)組21     $a = array($a,$b);22     $b = $a[0];23     $a = $a[1];復(fù)制代碼復(fù)制代碼

heredoc

Heredoc在正規(guī)的PHP文檔中和技術(shù)書籍中一般沒有詳細(xì)講述。他是一種Perl風(fēng)格的字符串輸出技術(shù)。使用heredoc技術(shù)可以實現(xiàn)界面與代碼的準(zhǔn)分離,比如phpwind模板

heredoc的語法是用”<<<”加上自己定義成對的標(biāo)簽,在標(biāo)簽范圍內(nèi)的文字視為一個字符串

規(guī)則如下:

1、以<<<End開始標(biāo)記開始,以End結(jié)束標(biāo)記結(jié)束,結(jié)束標(biāo)記必須頂頭寫,不能有縮進和空格,且在結(jié)束標(biāo)記末尾要有分號 。開始標(biāo)記和開始標(biāo)記相同,比如常用大寫的EOT、EOD、EOF來表示,也可以使用其他標(biāo)記,只要保證開始標(biāo)記和結(jié)束標(biāo)記不在正文中出現(xiàn)就行。

2、位于開始標(biāo)記和結(jié)束標(biāo)記之間的變量可以被正常解析,但是函數(shù)則不可以。在heredoc中,變量不需要用連接符 . 或 , 來拼接,比如:

1 $a=2;2 $b= <<<EOF3 "zyf"$a4 "zyf"5 EOF;6 echo $b; //結(jié)果連同雙引號一起輸出:"zyf"2 "zyf"

3、heredoc常用在輸出包含大量HTML語法文檔的時候。他要比傳統(tǒng)的echo輸出精煉很多,如下所示:

復(fù)制代碼復(fù)制代碼
 1 function getHtml() 2 { 3     echo "<html>"; 4     echo "<head><title>Title</title></head>"; 5     echo "<body>Content</body>"; 6     echo "</html>; 7 } 8  9 function getHtml()10 {11 echo <<<EOT12       <html>13       <head><title>Title</title></head>14       <body>Content</body>15       </html>16 EOT;17 }復(fù)制代碼復(fù)制代碼

 

寫個函數(shù)來解決多線程同時讀寫一個文件的問題。復(fù)制代碼復(fù)制代碼
 1 <?php 2     $fp = fopen("/tmp/lock.txt","w+"); 3     if(flock($fp, LOCK_EX)){// 進行排它型鎖定 4         fwrite($fp,"Write something here/n"); 5         flock($fp, LOCK_UN);// 釋放鎖定 6     }else{ 7         echo "Couldn't lock the file !"; 8     } 9     fclose($fp);10 ?>復(fù)制代碼復(fù)制代碼

 

禁掉cookie的session使用方案,設(shè)置session過期的方法,對應(yīng)函數(shù):

通過 url 傳值,把session id附加到url上(缺點:整個站點中不能有純靜態(tài)頁面,因為純靜態(tài)頁面session id 將無法繼續(xù)傳到下一頁面)通過隱藏表單,把session id 放到表單的隱藏文本框中同表單一塊提交過去(缺點:不適用<a>標(biāo)簽這種直接跳轉(zhuǎn)的非表單的情況)直接配置php.ini文件,將php.ini文件里的session.use_trans_sid= 0設(shè)為1,(好像在win上不支持)用文件、數(shù)據(jù)庫等形式保存Session ID,在跨頁過程中手動調(diào)用復(fù)制代碼復(fù)制代碼
 1 第一種  setcookie() 直接用setcookie設(shè)置session id的生命周期。 3     $lifetime=60; //保存1分鐘  4     session_start();  5     setcookie(session_name(), session_id(), time()+$lifetime, "/"); 6 第二種  session_set_cookie_params()     7     $lifetime=60;//保存1分鐘 8     session_set_cookie_params($lifetime); 9     session_start();10     session_regenerate_id(true);11     其中session_regenerate_id();方法用于改變當(dāng)前session_id的值,并保留session中數(shù)組的值。參數(shù)默認(rèn)為 false,如果設(shè)置為true則改變session_id的值,并清空當(dāng)前session數(shù)組。復(fù)制代碼復(fù)制代碼

 

json格式數(shù)據(jù)有哪些特點 

    JSON 一種輕量級的數(shù)據(jù)交換格式。它基于ECMAScript的一個子集。 JSON采用完全獨立于語言的文本格式,但是也使用了類似于C語言家族的習(xí)慣(包括C、C++、C#、javaJavascript、Perl、 Python等)。這些特性使JSON成為理想的數(shù)據(jù)交換語言。 易于人閱讀和編寫,同時也易于機器解析和生成(網(wǎng)絡(luò)傳輸速率)。

JSON的結(jié)構(gòu)基于下面兩點

1. "名稱/值"對的集合 不同語言中,它被理解為對象(object),記錄(record),結(jié)構(gòu)(struct),字典(dictionary),哈希表(hash table),鍵列表(keyed list)等2. 值的有序列表 多數(shù)語言中被理解為數(shù)組(array)  php獲取文件內(nèi)容的方法,對應(yīng)的函數(shù)1:file_get_contents得到文件的內(nèi)容(可以以get和post的方式獲取),整個文件讀入一個字符串中2:用fopen打開url, 以get方式獲取內(nèi)容(借助fgets()函數(shù))3:用fsockopen函數(shù)打開url(可以以get和post的方式獲取),以get方式獲取完整的數(shù)據(jù),包括header和body4:使用curl庫獲取內(nèi)容,使用curl庫之前,需要查看php.ini,查看是否已經(jīng)打開了curl擴展 php魔術(shù)方法與魔術(shù)常量方法:__construct(),__destruct()。    方法重載:__call(),__callStatic()。屬性重載:__get(),__set(),__isset(),__unset()  //這四個只對類中私有受保護的成員屬性有效__toString(),__autoload();_set_state(); //自 PHP 5.1.0 起當(dāng)調(diào)用 var_export() 導(dǎo)出類時,此靜態(tài) 方法會被調(diào)用。 本方法的唯一參數(shù)是一個數(shù)組。 __clone();       //通常用于對副本進行重新初始化,說明:this指副本對象引用,that指原對象引用 等方法在 PHP 中被稱為”魔術(shù)方法”。PHP 將所有以 __(兩個下劃線)開頭的類方法保留為魔術(shù)方法。所以在定義類方法時,除了上述魔術(shù)方法,建議不要以 __ 為前綴。在命名自己的類方法時不能使用這些方法名,除非是想使用其魔術(shù)功能。 常量:__LINK__      //文件中的當(dāng)前行號。__FILE__       //文件的完整路徑和文件名。如果用在被包含文件中,則返回被包含的文件名。__DIR__       //文件所在的目錄。如果用在被包括文件中,則返回被包括的文件所在的目錄,它等價于 dirname(__FILE__)。 __FUNCTION__       //函數(shù)名稱。自 PHP 5 起本常量返回該函數(shù)被定義時的名字(區(qū)分大小寫)。在 PHP 4 中該值總是小寫字母的。 __CLASS__              //類的名稱。自 PHP 5 起本常量返回該類被定義時的名字(區(qū)分大小寫)。在 PHP 4 中該值總是小寫字母的。 __METHOD__         //類的方法名(PHP 5.0.0 新加)。返回該方法被定義時的名字(區(qū)分大小寫)。 __NAMESPACE__   //當(dāng)前命名空間的名稱(大小寫敏感)。這個常量是在編譯時定義的(PHP 5.3.0 新增) 

PHP 如何獲取客戶端的IP地址,

用$_SERVER獲取的IP地址有什么問題?

$_SERVER['REMOTE_ADDR'] ;   通過全局?jǐn)?shù)組來獲得 

getenv('REMOTE_ADDR') ; 通過環(huán)境變量來獲得

當(dāng)客戶機使用代理的時候獲取不到真實的IP地址

 

寫一個函數(shù),可以遍歷文件夾下的所有文件和文件夾。

復(fù)制代碼復(fù)制代碼
 1     function get_dir_info($path){ 2           $handle = opendir($path);//打開目錄返回句柄 3           while(($content = readdir($handle))!== false){ 4                 $new_dir = $path . DIRECTORY_SEPARATOR . $content; 5                 if($content == '..' || $content == '.'){ 6                        continue; 7                 } 8                 if(is_dir($new_dir)){ 9                       echo "<br>目錄:".$new_dir . '<br>';10                       get_dir_info($new_dir);11                 }else{12                       echo "文件:".$path.':'.$content .'<br>';13                 }14           }15       }16       get_dir_info($dir);復(fù)制代碼復(fù)制代碼

 

有mail.log的一個文檔,內(nèi)容為若干郵件地址,用’/n’分隔換行。挑選sina.com的地址(包括從文件讀取、過濾到列印出來)。

思路1:用正則表達式(比較慢,效率地,不推薦用)

思路2:cat mail.log | grep sina.com

 

PHP緩存技術(shù)有哪些? tp是局部還是完全緩存?

1. 全頁面靜態(tài)化緩存,也就是將頁面全部生成html靜態(tài)頁面,用戶訪問時直接訪問的靜態(tài)頁面,而不會去走php服務(wù)器解析的流程2. 頁面部分緩存,將一個頁面中不經(jīng)常變的部分進行靜態(tài)緩存,而經(jīng)常變化的塊不緩存,最后組裝在一起顯示3. 數(shù)據(jù)緩存,通過一個id進行請求的數(shù)據(jù),將數(shù)據(jù)緩存到一個php文件中,id和文件是對應(yīng)的,下次通過這個id進行請求時 直接讀php文件4. 查詢緩存,和數(shù)據(jù)緩存差不多,根據(jù)查詢語句進行緩存;5. 常用的緩存技術(shù)有:redis和memcache個人認(rèn)為tp應(yīng)該是全局緩存 因為:tp緩存實在本地生成一個php文件來存儲數(shù)據(jù)庫中讀取出來的數(shù)據(jù) 

strlen()與mb_strlen的作用與區(qū)別

在PHP中,strlen與mb_strlen是求字符串長度的函數(shù)PHP內(nèi)置的字符串長度函數(shù)strlen無法正確處理中文字符串,它得到的只是字符串所占的字節(jié)數(shù)。對于GB2312的中文編碼,strlen得到的值是漢字個數(shù)的2倍,而對于UTF-8編碼的中文,就是3倍(在 UTF-8編碼下,一個漢字占3個字節(jié))。 采用mb_strlen函數(shù)可以較好地解決這個問題。mb_strlen的用法和strlen類似,只不過它有第二個可選參數(shù)用于指定字符編碼。例如得到UTF-8的字符串$str長度,可以用 mb_strlen($str,'UTF-8')。如果省略第二個參數(shù),則會使用PHP的內(nèi)部編碼。內(nèi)部編碼可以通過 mb_internal_encoding()函數(shù)得到。需要注意的是,mb_strlen并不是PHP核心函數(shù),使用前需要確保在php.ini中加載了php_mbstring.dll,即確保“extension=php_mbstring.dll”這一行存在并且沒有被注釋掉,否則會出現(xiàn)未定義函 數(shù)的問題。 寫一個函數(shù),盡可能高效的從一個標(biāo)準(zhǔn)url中取出擴展名$arr = parse_url('http://www.sina.com.cn/abc/de/fg.php?id=1'); $result = pathinfo($arr['path']);var_dump($arr); var_dump($result['extension']); 

php.ini 中safe mod關(guān)閉 影響哪些函數(shù)和參數(shù),至少寫6個?

move_uploaded_file()        exec()system()                              passthru()popen()                              fopen()mkdir()                               rmdir()rename()                            unlink()copy()                                 chgrp()chown()                              chmod()touch()                               symlink()link()                                   parse_ini_file()set_time_limit()                  max_execution_time mail()

 

一群猴子排成一圈,按1,2,…,n依次編號。然后從第1只開始數(shù),數(shù)到第m只,把它踢出圈,從它后面再開始數(shù),再數(shù)到第m只,在把它踢出去…,如此不停 的進行下去,直到最后只剩下一只猴子為止,那只猴子就叫做大王。要求編程模擬此過程,輸入m、n, 輸出最后那個大王的編號。

復(fù)制代碼復(fù)制代碼
 1 <?php 2  function fuhuan($allnum, $ti){ 3      $arr = array(); 4      for($i = 0; $i < $allnum; $i++){ 5          $arr[$i] = $i; 6      } 7   8      $nums = 1; 9      while(count($arr) > 1){10           foreach ($arr as $key => $value) {11               if($nums == $ti){12                   unset($arr[$key]);13                   $nums = 1;14               }else{15                   $nums++;16               }17          }18      }19      $new_arr = array_values($arr);20      var_dump($new_arr[0] + 1);21  }22  fuhuan(10,10);復(fù)制代碼復(fù)制代碼

isset() 、empty()與is_null的區(qū)別

1、當(dāng)變量未定義時,is_null() 和“參數(shù)本身”是不允許作為參數(shù)判斷的,會報Notice警告錯誤;

2、empty , isset首先都會檢查變量是否存在,然后對變量值進行檢測。而is_null 和 “參數(shù)本身”只是直接檢查變量值,是否為null,因此如果變量未定義就會出現(xiàn)錯誤!

3、isset():僅當(dāng)null和未定義,返回false;

4、empty():""、0、"0"、NULL、FALSE、array(),未定義,均返回true;

5、is_null():僅判斷是否為null,未定義報警告;

6、變量本身作為參數(shù),與empty()一致,但接受未定義變量時,報警告;

 

求兩個文件的相對路徑

復(fù)制代碼復(fù)制代碼
 1  getpath('/a/b/c/d/e.php', '/a/d/12/34/c.php'); 2    3 public function getpath($a, $b) 4 { 5      $aarr = explode('/', $a); 6      $barr = explode('/', $b); 7      $count = count($barr) - 2; 8      $pathinfo = ''; 9      for($i = 1; $i <= $count; $i++){10          if($aarr[$i] == $barr[$i]){11               $pathinfo .= '../';12          }else{13               $pathinfo .= $barr[$i] . '/';14          }15      }16      echo $pathinfo;17 }復(fù)制代碼復(fù)制代碼

 

MVC的優(yōu)缺點1、 MVC的優(yōu)點         (1) 可以為一個模型在運行時同時建立和使用多個視圖。變化-傳播機制可以確保所有相關(guān)的視圖及時得到模型數(shù)據(jù)變化,從而使所有關(guān)聯(lián)的視圖和控制器做到行為同步。         (2) 視圖與控制器的可接插性,允許更換視圖和控制器對象,而且可以根據(jù)需求動態(tài)的打開或關(guān)閉、甚至在運行期間進行對象替換。         (3) 模型的可移植性。因為模型是獨立于視圖的,所以可以把一個模型獨立地移植到新的平臺工作。需要做的只是在新平臺上對視圖和控制器進行新的修改。         (4) 潛在的框架結(jié)構(gòu)。可以基于此模型建立應(yīng)用程序框架,不僅僅是用在設(shè)計界面的設(shè)計中。 2、 MVC的不足之處         (1) 增加了系統(tǒng)結(jié)構(gòu)和實現(xiàn)的復(fù)雜性。對于簡單的界面,嚴(yán)格遵循MVC,使模型、視圖與控制器分離,會增加結(jié)構(gòu)的復(fù)雜性,并可能產(chǎn)生過多的更新操作,降低運行效率。         (2) 視圖與控制器間的過于緊密的連接。視圖與控制器是相互分離,但確實聯(lián)系緊密的部件,視圖沒有控制器的存在,其應(yīng)用是很有限的,反之亦然,這樣就妨礙了他們的獨立重用。         (3) 視圖對模型數(shù)據(jù)的低效率訪問。依據(jù)模型操作接口的不同,視圖可能需要多次調(diào)用才能獲得足夠的顯示數(shù)據(jù)。對未變化數(shù)據(jù)的不必要的頻繁訪問,也將損害操作性能。         (4) 目前,一般高級的界面工具或構(gòu)造器不支持MVC模式。改造這些工具以適應(yīng)MVC需要和建立分離的部件的代價是很高的,從而造成使用MVC的困難。   session與cookie的聯(lián)系和區(qū)別(運行機制),session共享問題解決方案:區(qū)別與聯(lián)系:    使用session_start()調(diào)用session,服務(wù)器端在生成session文件的同時生成session ID哈希值和默認(rèn)值為PHPSESSID的session name,并向客戶端發(fā)送變量為PHPSESSID(session name)(默認(rèn))值為一個128位的哈希值。服務(wù)器端將通過該cookie與客戶端進行交互,session變量的值經(jīng)php內(nèi)部系列化后保存在服務(wù)器 機器上的文本文件中,和客戶端的變量名默認(rèn)情況下為PHPSESSID的coolie進行對應(yīng)交互,即服務(wù)器自動發(fā)送了http 頭:header(‘Set-Cookie: session_name()=session_id(); path=/’);即setcookie(session_name(),session_id());當(dāng)從該頁跳轉(zhuǎn)到的新頁面并調(diào)用 session_start()后,PHP將檢查與給定ID相關(guān)聯(lián)的服務(wù)器端存貯的session數(shù)據(jù),如果沒找到則新建一個數(shù)據(jù)集。共享方案:1:使用數(shù)據(jù)庫保存session, 使用數(shù)據(jù)庫來保存session,就算服務(wù)器宕機了也沒事,session照樣在。

問題:程序需要定制;每次請求都進行數(shù)據(jù)庫讀寫開銷不小,另外數(shù)據(jù)庫是一個單點,可以做數(shù)據(jù)庫的hash來解 決這個問題。       

2:使用 memcached來保存session, 這種方式跟數(shù)據(jù)庫類似,內(nèi)存存取性能比數(shù)據(jù)庫好很多。

問題:程序需要定制,增加 了工作量;存入memcached中的數(shù)據(jù)都需要序列化,效率較低,斷電或者重啟電腦容易丟失數(shù)據(jù);

3: 通過加密的cookie,在A服務(wù)器上登錄,在用戶的瀏覽器上添加加密的cookie,當(dāng)用戶訪問B服務(wù)器時,檢查有無Session,如果沒有,就檢驗 Cookie是否有效,Cookie有效的話就在B服務(wù)器上重建session。簡單,高效, 服務(wù)器的壓力減小了,因為session數(shù)據(jù)不存在服務(wù)器磁盤上。根本就不會出現(xiàn)session讀取不到的問題。

問題:網(wǎng)絡(luò)請求占用很多。每次請求時,客戶端都要通過cookie發(fā)送session數(shù)據(jù)給服務(wù)器,session中數(shù)據(jù)不能太多,瀏覽器對cookie 的大

小存在限制。不適合高訪問量的情況,因為高訪問量的情況下。

 

 正則表達式

匹配中文字符的正則表達式: [/u4e00-/u9fa5] 匹配雙字節(jié)字符(包括漢字在內(nèi)):[^/x00-/xff] 匹配空行的正則表達式:/n[/s| ]*/r 匹配HTML標(biāo)記的正則表達式:/<(.*)>.*<///1>|<(.*) //>/ 匹配首尾空格的正則表達式:(^/s*)|(/s*$) 匹配Email地址的正則表達式:/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)* 匹配網(wǎng)址URL的正則表達式:^[a-zA-z]+://(//w+(-//w+)*)(//.(//w+(-//w+)*))*(//?//S*)?$ 匹配帳號是否合法(字母開頭,允許5-16字節(jié),允許字母數(shù)字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 匹配國內(nèi)電話號碼:(/d{3}-|/d{4}-)?(/d{8}|/d{7})? 匹配騰訊QQ號:^[1-9]*[1-9][0-9]*$ 

 

--------------------------------------MySQL部分-------------------------------------------

select * from table where (ID = 10)  or (ID = 32) or (ID = 22)  讓結(jié)果按10, 32, 22的順序檢索出來?

Select *from user_infoWhere (ID IN (10, 32, 22))

order BY FIND_IN_SET(ID, '10, 32, 22') 

---------------------------------------linux部分-------------------------------------------

core文件是什么,有什么用?

 core是unix系統(tǒng)的內(nèi)核。當(dāng)你的程序出現(xiàn)內(nèi)存越界的時候,操作系統(tǒng)會中止你的進程,并將當(dāng)前內(nèi)存狀態(tài)倒出到core文件中,以便進一步分析。程序員可以通過core文件來找出問題所在。它記錄了程序掛掉時詳細(xì)的狀態(tài)描述。
什么是core dump Core的意思是內(nèi)存, Dump的意思是扔出來, 堆出來。開發(fā)和使用Unix程序時, 有時程序莫名其妙的down了, 卻沒有任何的提示(有時候會提示core dumped). 這時候可以查看一下有沒有形如core.進程號的文件生成, 這個文件便是操作系統(tǒng)把程序down掉時的內(nèi)存內(nèi)容扔出來生成的,它可以做為調(diào)試程序的參考.    core dump又叫核心轉(zhuǎn)儲, 當(dāng)程序運行過程中發(fā)生異常, 程序異常退出時, 由操作系統(tǒng)把程序當(dāng)前的內(nèi)存狀況存儲在一個core文件中, 叫core dump。如何使用core文件 gdb -c core文件路徑 [應(yīng)用程序的路徑],進去后輸入where回車, 就可以顯示程序在哪一行當(dāng)?shù)舻? 在哪個函數(shù)中.
為什么沒有core文件生成呢? core文件的生成跟你當(dāng)前系統(tǒng)的環(huán)境設(shè)置有關(guān)系, 可以用下面的語句設(shè)置一下, 然后再運行程序便成生成core文件.
ulimit -c unlimited core文件生成的位置一般于運行程序的路徑相同, 文件名一般為core.進程號

不用core文件,程序出了問題產(chǎn)生信號是否知道?答:內(nèi)核向進程發(fā)信號嘛。

 

共享內(nèi)存除了文件映射還有什么方式?

共享內(nèi)存對象映射。

二者有什么區(qū)別:

答:內(nèi)存映射文件是由一個文件到一塊內(nèi)存的映射,使應(yīng)用程序可以通過內(nèi)存指針對磁盤上的文件進行訪問,其過程就如同對加載了文件的內(nèi)存的訪問,因此內(nèi)存文件映射非常適合于用來管理大文件。

 

請解釋下列10個shell命令的用途top、ps、mv、find、df、cat、chmod、chgrp、grep、wctop:命令是Linux下常用的性能分析工具,能夠?qū)崟r顯示系統(tǒng)中各個進程的資源占用狀況,類似于Windows的任務(wù)管理器。 ps:查看進程 mv:移動或者更改文件 find:在子目錄中搜索匹配的文件 df:linux中df命令參數(shù)功能:檢查文件系統(tǒng)的磁盤空間占用情況。

cat:把一個或多個文件內(nèi)容顯示到標(biāo)準(zhǔn)輸出 

chmod:改變文件屬性 

chgrp:改變用戶分組 

grep:在文件內(nèi)進行搜索 

wc:命令的功能為統(tǒng)計指定文件中的字節(jié)數(shù)、字?jǐn)?shù)、行數(shù), 并將統(tǒng)計結(jié)果顯示輸出。

 

Linux文件屬性有哪些?(共十位)

-rw-r--r--那個是權(quán)限符號,總共是- --- --- ---這幾個位。

第一個短橫處是文件類型識別符:-表示普通文件;c表示字符設(shè)備(character);b表示塊設(shè)備(block);d表示目錄 (directory);l表示鏈接文件(link);后面第一個三個連續(xù)的短橫是用戶權(quán)限位(User),第二個三個連續(xù)短橫是組權(quán)限位 (Group),第三個三個連續(xù)短橫是其他權(quán)限位(Other)。每個權(quán)限位有三個權(quán)限,r(讀權(quán)限),w(寫權(quán)限),x(執(zhí)行權(quán)限)。如果每個權(quán)限位都 有權(quán)限存在,那么滿權(quán)限的情況就是:-rwxrwxrwx;權(quán)限為空的情況就是- --- --- ---。

權(quán)限的設(shè)定可以用chmod命令,其格式位:chmod ugoa+/-/=rwx filename/directory。例如:

一個文件aaa具有完全空的權(quán)限- --- --- ---。

chmod u+rw aaa(給用戶權(quán)限位設(shè)置讀寫權(quán)限,其權(quán)限表示為:- rw- --- ---)

chmod g+r aaa(給組設(shè)置權(quán)限為可讀,其權(quán)限表示為:- --- r-- ---)

chmod ugo+rw aaa(給用戶,組,其它用戶或組設(shè)置權(quán)限為讀寫,權(quán)限表示為:- rw- rw- rw-)

如果aaa具有滿權(quán)限- rwx rwx rwx。

chmod u-x aaa(去掉用戶可執(zhí)行權(quán)限,權(quán)限表示為:- rw- rwx rwx)

如果要給aaa賦予制定權(quán)限- rwx r-x r-x,命令為:

chmod u=rwx,go=rx aaa

 linux查詢命令1:find / -name "文件名"    在目錄結(jié)構(gòu)中搜索文件,并執(zhí)行指定的操作。 2:grep 3:local 文件名  ---他是 'find -name' 的另一種寫法,但要比后者快得多,原因在于它不搜索具體目錄,而是搜索一個數(shù)據(jù)庫(/var/lib/locatedb),這個數(shù)據(jù)庫中含 有本地所有文件信息。Linux系統(tǒng)自動創(chuàng)建這個數(shù)據(jù)庫,并且每天自動更新一次,所以改命令查不到最新變動過的文件。為了避免這種情況,可以在使用locate之前,先使用updatedb命令,手動更新數(shù)據(jù)庫。 4. whereis ---是定位可執(zhí)行文件、源代碼文件、幫助文件在文件系統(tǒng)中的位置。whereis命令只能用于程序名的搜索,而且只搜索二進制文件(參數(shù)-b)、man說明文件(參數(shù)-m)和源代碼文件(參數(shù)-s)。如果省略參數(shù),則返回所有信息。 5:which  作用是在PATH變量指定的路徑中,搜索某個系統(tǒng)命令的位置,并且返回第一個搜索結(jié)果。也就是說,使用which命令,就可以看到某個系統(tǒng)命令是否存在,以及執(zhí)行的到底是哪一個位置的命令。

 -------------------------------------服務(wù)器部分-------------------------------------

 Apache與Nginx的優(yōu)缺點比較 1、nginx相對于apache的優(yōu)點: 輕量級,比apache 占用更少的內(nèi)存及資源。高度模塊化的設(shè)計,編寫模塊相對簡單 抗并發(fā),nginx 處理請求是異步非阻塞,多個連接(萬級別)可以對應(yīng)一個進程,而apache 則是阻塞型的,是同步多進程模型,一個連接對應(yīng)一個進程,在高并發(fā)下nginx 能保持低資源低消耗高性能 nginx處理靜態(tài)文件好,Nginx 靜態(tài)處理性能比 Apache 高 3倍以上 2、apache 相對于nginx 的優(yōu)點: apache 的rewrite 比nginx 的rewrite 強大 ,模塊非常多,基本想到的都可以找到 ,比較穩(wěn)定,少bug ,nginx 的bug 相對較多  3:原因:這得益于Nginx使用了最新的epoll(Linux 2.6內(nèi)核)和kqueue(freebsd)網(wǎng)絡(luò)I/O模型,而Apache則使用的是傳統(tǒng)的select模型。目前Linux下能夠承受高并發(fā)訪問的 Squid、Memcached都采用的是epoll網(wǎng)絡(luò)I/O模型。 處理大量的連接的讀寫,Apache所采用的select網(wǎng)絡(luò)I/O模型非常低效。  cgi 與fastcgi的區(qū)別

cgi在2000年或更早的時候用得比較多, 以前web服務(wù)器一般只處理靜態(tài)的請求,web服務(wù)器會根據(jù)這次請求的內(nèi)容,然后會fork一個新進程來運行外部c程序 (或perl腳本...), 這個進程會把處理完的數(shù)據(jù)返回給web服務(wù)器,最后web服務(wù)器把內(nèi)容發(fā)送給用戶,剛才fork的進程也隨之退出。 如果下次用戶還請求改動態(tài)腳本,那么web服務(wù)器又再次fork一個新進程,周而復(fù)始的進行。

后來出現(xiàn)了一種更高級的方式是, web服務(wù)器可以內(nèi)置perl解釋器或php解釋器。 也就是說這些解釋器做成模塊的方式,web服務(wù)器會在啟動的時候就啟動這些解釋器。 當(dāng)有新的動態(tài)請求進來時,web服務(wù)器就是自己解析這些perl或php腳本,省得重新fork一個進程,效率提高了。

fastcgi的方式是,web服務(wù)器收到一個請求時,他不會重新fork一個進程(因為這個進程在web服務(wù)器啟動時就開啟了,而且不會退 出),web服務(wù)器直接把內(nèi)容傳遞給這個進程(進程間通信,但fastcgi使用了別的方式,tcp方式通信),這個進程收到請求后進行處理,把結(jié)果返回 給web服務(wù)器,最后自己接著等待下一個請求的到來,而不是退出。 fastcgi跟cgi的區(qū)別是:                  在web服務(wù)器方面                                                         在對數(shù)據(jù)進行處理的進程方面cgi         fork一個新的進程進行處理                                           讀取參數(shù),處理數(shù)據(jù),然后就結(jié)束生命期fastcgi   用tcp方式跟遠程機子上的進程或本地進程建立連接       要開啟tcp端口,進入循環(huán),等待數(shù)據(jù)的到來,處理數(shù)據(jù)

舉個例子: 服務(wù)端現(xiàn)在有個10萬個字單詞, 客戶每次會發(fā)來一個字符串,問以這個字符串為前綴的單詞有多少個。 那么可以寫一個程序,這個程序會建一棵trie樹,然后每次用戶請求過來時可以直接到這個trie去查找。 但是如果以cgi的方式的話,這次請求結(jié)束后這課trie也就沒了,等下次再啟動該進程時,又要新建一棵trie樹,這樣的效率就太低下了。   而用fastcgi的方式的話,這課trie樹在進程啟動時建立,以后就可以直接在trie樹上查詢指定的前綴了。

 

select, poll和epoll的區(qū)別select

select最早于1983年出現(xiàn)在4.2BSD中,它通過一個select()系統(tǒng)調(diào)用來監(jiān)視多個文件描述符的數(shù)組,當(dāng)select()返回后,該數(shù)組中就緒的文件描述符便會被內(nèi)核修改標(biāo)志位,使得進程可以獲得這些文件描述符從而進行后續(xù)的讀寫操作。

select目前幾乎在所有的平臺上支持,其良好跨平臺支持也是它的一個優(yōu)點,事實上從現(xiàn)在看來,這也是它所剩不多的優(yōu)點之一。

select的一個缺點在于單個進程能夠監(jiān)視的文件描述符的數(shù)量存在最大限制,在Linux上一般為1024,不過可以通過修改宏定義甚至重新編譯內(nèi)核的方式提升這一限制。

另外,select()所維護的存儲大量文件描述符的數(shù)據(jù)結(jié)構(gòu),隨著文件描述符數(shù)量的增大,其復(fù)制的開銷也線性增長。同時,由于網(wǎng)絡(luò)響應(yīng)時間的延遲 使得大量TCP連接處于非活躍狀態(tài),但調(diào)用select()會對所有socket進行一次線性掃描,所以這也浪費了一定的開銷。

poll

poll在1986年誕生于System V Release 3,它和select在本質(zhì)上沒有多大差別,但是poll沒有最大文件描述符數(shù)量的限制。 

poll和select同樣存在一個缺點就是,包含大量文件描述符的數(shù)組被整體復(fù)制于用戶態(tài)和內(nèi)核的地址空間之間,而不論這些文件描述符是否就緒,它的開銷隨著文件描述符數(shù)量的增加而線性增大。 

另外,select()和poll()將就緒的文件描述符告訴進程后,如果進程沒有對其進行IO操作,那么下次調(diào)用select()和poll() 的時候?qū)⒃俅螆蟾孢@些文件描述符,所以它們一般不會丟失就緒的消息,這種方式稱為水平觸發(fā)(Level Triggered)。

epoll

直到Linux2.6才出現(xiàn)了由內(nèi)核直接支持的實現(xiàn)方法,那就是epoll,它幾乎具備了之前所說的一切優(yōu)點,被公認(rèn)為Linux2.6下性能最好的多路I/O就緒通知方法。

epoll可以同時支持水平觸發(fā)和邊緣觸發(fā)(Edge Triggered,只告訴進程哪些文件描述符剛剛變?yōu)榫途w狀態(tài),它只說一遍,如果我們沒有采取行動,那么它將不會再次告知,這種方式稱為邊緣觸發(fā)),理論上邊緣觸發(fā)的性能要更高一些,但是代碼實現(xiàn)相當(dāng)復(fù)雜。

epoll同樣只告知那些就緒的文件描述符,而且當(dāng)我們調(diào)用epoll_wait()獲得就緒文件描述符時,返回的不是實際的描述符,而是一個代表 就緒描述符數(shù)量的值,你只需要去epoll指定的一個數(shù)組中依次取得相應(yīng)數(shù)量的文件描述符即可,這里也使用了內(nèi)存映射(mmap)技術(shù),這樣便徹底省掉了 這些文件描述符在系統(tǒng)調(diào)用時復(fù)制的開銷。

另一個本質(zhì)的改進在于epoll采用基于事件的就緒通知方式。在select/poll中,進程只有在調(diào)用一定的方法后,內(nèi)核才對所有監(jiān)視的文件描 述符進行掃描,而epoll事先通過epoll_ctl()來注冊一個文件描述符,一旦基于某個文件描述符就緒時,內(nèi)核會采用類似callback的回調(diào) 機制,迅速激活這個文件描述符,當(dāng)進程調(diào)用epoll_wait()時便得到通知。

 

Memcache和Redis區(qū)別

Redis中,并不是所有的數(shù)據(jù)都一直存儲在內(nèi)存中的,這是和Memcached相比一個最大的區(qū)別。Redis在很多方面具備數(shù)據(jù)庫的特征,或者說就是一個數(shù)據(jù)庫系統(tǒng),而Memcached只是簡單的K/V緩存。他們的擴展都需要做集群;實現(xiàn)方式:master-slave、Hash。在100k以上的數(shù)據(jù)中,Memcached性能要高于Redis。如果要說內(nèi)存使用效率,使用簡單的key-value存儲的話,Memcached的內(nèi)存利用率更高,而如果Redis采用hash結(jié)構(gòu)來做key-value存儲,由于其組合式的壓縮,其內(nèi)存利用率會高于Memcached。當(dāng)然,這和你的應(yīng)用場景和數(shù)據(jù)特性有關(guān)。如果你對數(shù)據(jù)持久化和數(shù)據(jù)同步有所要求,那么推薦你選擇Redis,因為這兩個特性Memcached都不具備。即使你只是希望在升級或者重啟系統(tǒng)后緩存數(shù)據(jù)不會丟失,選擇Redis也是明智的。Redis和Memcache在寫入性能上面差別不大,讀取性能上面尤其是批量讀取性能上面Memcache更強
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 阿巴嘎旗| 凤凰县| 张家界市| 梅河口市| 府谷县| 阿鲁科尔沁旗| 房山区| 文安县| 深泽县| 五台县| 调兵山市| 巴塘县| 扶沟县| 巩义市| 维西| 泽库县| 万荣县| 竹北市| 茂名市| 富蕴县| 沾益县| 江油市| 桃园市| 垫江县| 德钦县| 东台市| 四平市| 临西县| 合肥市| 水富县| 前郭尔| 临漳县| 仙游县| 巫山县| 嘉祥县| 莎车县| 鞍山市| 日喀则市| 固镇县| 宝应县| 通江县|