PHP面試專用筆記精簡版

【PHP筆記】javascript

1.require 遇到即包含文件,require_once 只包含一次。require 遇到錯誤會終止,通常放在程序的最前面;include遇到錯誤會繼續執行,通常放在流程控制語句中。php

2.使用empty()函數檢測變量時,在」」、0、」0」、NULL、FALSE、array()、等狀況下都被認爲是空的。 css

3.提升PHP性能的方法:儘可能把類定義成static;echo比print快;echo用逗號鏈接字符串效率高;require_once()比require慢,而且儘可能不要使用相對路徑;使用函數代替正則;不要濫用@操做符;打開apache的mod_deflate模塊能夠提升網頁瀏覽速度;儘可能少用全局變量和對象屬性($this->num++);循環內部不要聲明變量;多維數組儘可能不要循所環嵌套賦值;使用ip2long()和long2ip()把IP地址轉成整型。 html

4.優化網站響應時間:① 減小HTTP請求。例如:合併JS和CSS文件,利用瀏覽器的Cache功能避免下載相同的文件。② 不長修改的動態內容靜態化。③ 優化數據庫。④ 使用負載均衡,例如HTTP重定向、反向代理服務器。⑤ 使用緩存,例如memcached。java

5.屏蔽全部錯誤輸出,使用:error_reporting(E_ALL & ~E_DEPRECATED & ~E_NOTICE  & ~E_WARNING);mysql

6.字符串函數: strtolower(),strlen($str),strstr(),strpos(),strrev($str),str_replace($old,$new,$str)。 linux

7.數組函數:sort(),rsort(),asort(),arsort(),ksort(),krsort();array_keys(),array_values(),array_key_exist();array_push(),array_pop(),array_unique();array_merge(),array_chunk();array_filter(),array_walk(),array_map();count(),in_array(),array_count_values(),array_reverse($arr)。ios

8.$this不能在類外部使用,析構函數不能傳參數。nginx

9.靜態變量 public static $a,[類外訪問] 類名::$a; [類內訪問] 類名::$a 或者 self::$a。靜態方法只能操做靜態變量;非靜態方法能夠操做靜態變量和非靜態變量。(訪問方式同上)git

10.繼承 extends:子類默認不會調用父類的構造函數。子類訪問父類的方法(包括構造函數): 父類::方法名(); 或者 parent::方法名(); 若是子類的方法和父類方法相同,稱爲 方法重寫(或者叫:方法覆蓋)。多態的體現:當子類沒有覆蓋父類的方法則調用父類的方法,當子類覆蓋了父類的方法,則調用本身的方法。

11. 抽象類(能夠是public/protected/private)和抽象方法是當父類的一些方法不能肯定時會用到。抽象類 abstract class Obj{}; 抽象方法不能有方法體 abstract public function func_name(param1,...); 抽象類中能夠沒有抽象方法,可是抽象方法必須存在於抽象類中!若是A1類繼承了一個抽象類 A,則要求A1類實現從A類繼承的全部抽象方法

12.接口(更加抽象的抽象類,接口的方法都不能有方法體且必須是public,不能去實例化接口)。接口中能夠有屬性,可是必須是常量,而且是public。一個接口不能繼承其餘的類,可是能夠繼承別的接口。一個接口能夠繼承多個其它的接口.當一個類去實現了某些接口,則必須把全部接口的方法都實現。 一個類能夠同時繼承他的父類,並且實現接口: class A1 extends A implements iUsb2,iUsb3{⋯}

13.final關鍵字:修飾類 或者 方法,不能修飾屬性。 ① 但願某個類不能被繼承: final class A{}  ② 但願某個方法不能被子類重載(改寫): class A{final public function func_name(){} }

14.操做文件和目錄的函數: dirname($path),pathinfo($path),realpath($path),filetype($path),getimagesize("1.jpg");mkdir(),opendir(),closedir(),rename(),rmdir(),readdir();fopen(),fclose(),unlink(),copy(),fwrite(),file_put_contents($filename [,FILE_APPEND]),is_writable(),fread(),move_uploaded_file($upload_file,$path);[enctype="multipart/form-data"],stat()。

15.HTTP端口80,HTTPS端口443.HTTP返回狀態碼:1xx請求已接受,2xx請求成功,3xx重定向,4xx客戶端錯誤,5xx服務器端錯誤。常見狀態碼:200 OK, 204 No Content(執行PHP但頁面不跳轉,header(‘HTTP/1.1 204 No Content’);),301(永久重定向),302(臨時重定向,默認),304 NOT MODIFIED(未修改,表示是從瀏覽器緩存中取的數據),307(重定向而且保留POST的數據),400(客戶端請求有語法錯誤),401(請求未經受權),403(服務器拒絕提供服務),404(請求資源不存在),500(服務器錯誤),503(服務器暫時錯誤,一段時間後可能會恢復正常)。

12. ob_start();session_start();$_SESSION[user]=1;ob_end_flush();session_unset(),session_destroy();setcookie()。

13. cur_init(),curl_setopt(),curl_exec($curl),curl_close()。

14. $mem->connect("localhost", 11211);$data=$mem->get($key); $mem->set($key, ‘abcdefg’, MEMCACHE_COMPRESSED, 3600);

15.【正則】:\d全部數字[0-9],\D除全部數字外[^0-9],\w全部字符[a-zA-Z_0-9],\W除全部字符外 [^a-zA-Z_0-9]。

* 匹配任意次;+ 匹配1次或屢次;?匹配0次或1次;.匹配任意次但不包含回車換行;|選擇匹配(或者);^匹配開頭;$匹配尾部;{m}匹配前一個內容的重複次數爲m次;{m,}大於等於m次;{m,n} m次到n次;( ) 合併總體匹配。

《模式修正符》: 【/正則/U 】  小寫i:不區分大小寫;小寫m:匹配首內容或尾內容時採用多行識別匹配;小寫s:將轉義回車取消視爲單行匹配;小寫x:忽略正則中的空白;大寫A:強制從頭開始匹配;大寫D:強制$匹配尾部無任何內容;大寫U:禁止貪婪匹配,只跟蹤到最近的一個匹配符並結束,經常使用在採集程序。

preg_grep()匹配查找,返回數組; preg_match()在字符串中查找匹配項,返回數組; preg_split()分割字符串; preg_replace()替換子字符串。 

[頁面超連接] '/<a(.*?)href="(.*?)"(.*?)>(.*?)<\/a>/i';[郵箱] /^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/;[手機號] "/^1(3|5|8)\d{9}$/" 。

16. 刪除分支:git branch -D staging;查看日誌:git log;提交代碼:git commit [指定文件] [-a] -m '說明註釋';查看當前分支: git branch;切換分支:git checkout master;將master分支拉下來:git pull origin master;將內容合併到master:git merge renxing;將最新的代碼提交到master:git push origin master。建立用戶:git config --global user.name 「renxing」;git config --global user.email renxing@qq.com;克隆項目到本地:git  clone ssh:renxing@svngit.qq.com:29418/qgzs_apiv2.git。

17.header("Content-type: text/html; charset=utf-8");ini_set ('memory_limit', '1280M');<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

18.【單例模式】

<?php 

class demo{

private static $obj;  //保存對象的靜態屬性

private function __construct(){}   //私有化構造函數

private function __clone(){}     //禁止克隆

public static function getInstance(){

if(!(self::$obj instanceof self)){

self::$obj = new self;

}

return self::$obj;

}

}

?>

19.【冒泡排序】

 function bubbleSort(&$arr){ //注意這裏&

$temp=0; 

for($i=0;$i<count($arr)-1;$i++){

for($j=0;$j<count($arr)-1-$i;$j++){

if($arr[$j]>$arr[$j+1]){  

$temp=$arr[$j];

$arr[$j]=$arr[$j+1];

$arr[$j+1]=$temp;

}

}

}

}

 

20.【CURL 獲取遠程網頁數據】

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, "http://www.baidu.com");

curl_setopt($curl, CURLOPT_RETURNTRANSFER, 0); //第三個參數是1表示不輸出,0容許輸出

$data = curl_exec($curl);

curl_close($curl);

 

21.【刪除非空目錄】

<?php

     header("Content-type: text/html; charset=utf-8");

     $dirname="phpMyAdmin";

     deldir($dirname);

 

     functiondeldir($dirname){

          if(file_exists($dirname)) {

              $dir=opendir($dirname);

              while($filename=readdir($dir)){

                   if($filename!="."&& $filename!=".."){

                        $file=$dirname."/".$filename;

                        if(is_dir($file)){

                        

                             deldir($file);//使用遞歸刪除子目錄  

                        }else{

                             echo'刪除文件<b>'.$file.'</b>成功<br>';

                             unlink($file);

                        }

                   }

              }

              closedir($dir);

              echo'刪除目錄<b>'.$dirname.'</b>成功<br>';

              rmdir($dirname);

          }

     }

?>

 

22.【PHP操做MySQL】

$conn=mysql_connect($db_host,$db_user,$db_pwd) or die("鏈接服務器失敗");

mysql_select_db($db_name,$conn) or die("選擇數據庫失敗");

$result=mysql_query("select * from employee") or die("查詢失敗");

while($row = mysql_fetch_array($result)){

$res[] = $row;

}

print_r($res);

mysql_free_result($result);// 釋放結果集內存

mysql_close($conn);

 

23.【PHP操做mysqli】

$mysqli=new mysqli($db_host,$db_user,$db_pwd,$db_name) ;

$result=$mysqli->query("select * from employee");

while($row =$result->fetch_array()){   

$res[] = $row;

}

print_r($res);

$result->free();

$mysqli->close();

 

【Linux筆記】

ps aux | grep mysql  檢測MySQL服務是否在運行 

【目錄處理命令】mkdir,cd,pwd,rmdir,rm -rf,cp,mv,ls。

【文件處理命令】touch,cat,more,less,head -n,tail -n,ln -s。

【權限管理命令】chmod -R 777 myname,chown用戶,chgrp用戶組。

【文件搜索命令】find  /etc  -name  *init*,find  /etc  -size  +204800,find /home -user renxing, 查找出來執行刪除操做: find /etc -name -exec rm {} \;which cp;whereis ls;whatis ls。

【用戶管理命令】useradd 用戶名,passwd 用戶名,who,w,uptime。

【解壓】tar -zc(x)vf abcd.tar.gz abcd,unzip abcd.zip。

【關機】shutdown -h(r) now 當即關機(重啓);logout。

【vim】aio/AIO,:set nu,gg到第一行,G到最後一行,nG到第n行,:n到第n行,$ 移至行尾,0移至行首。yy複製,dd剪切。:w保存,:wq保存退出,:q!退出。

【定時任務】crontab -e|l|r.

【多命令順序執行】分號→順序執行,&&→邏輯與,||→邏輯或。

【管道符】 命令1 | 命令2  (命令1的正確輸出做爲命令2的操做對象)

【位置參數變量】[$n] ,[$*] ,[$@],[$#]。

【接收鍵盤輸入】read [選項] [變量名]

【declare聲明變量類型】declare [+/-][選項] 變量名

【數值運算】「$((運算式))」或「$[運算式]」 → $[$aa+$bb]

【字符截取命令】

① cut [選項] 文件名,通常和管道符 grep 一塊兒使用。cut命令不能識別空格做爲分隔符的字符串,awk命令能夠。

② awk命令:awk 'BEGIN{print "start" }END{print "over"} {print $2 "\t" $6}' student.txt  #給內容先後都追加

③ printf  '輸出類型輸出格式'  輸出內容

【printf 和 echo 和 cat】

① 用cat 能夠查看一個文本的內容:cat stu.txt

② 要使用printf查看文本內容:printf  ‘%s’  $(cat student.txt)

③ 調整格式輸出: printf '%s\t %s\t %s\t %s\t %s\t %s\t \n' $(cat student.txt) 

④ 學習printf 的緣由在於:awk命令中不支持cat 和 echo。 

◆ 在awk命令的輸出中支持print和printf命令

① print:會在每一個輸出以後自動加入一個換行符(Linux默認沒有print命令,可是awk中有)

② printf:是標準格式輸出命令,並不會自動加入換行符,若是須要換行,須要手工加入換行符。

【sed命令】sed [選項-n/-e/-i] [動做] 文件名  ([動做]a \:追加。c \:行替換。i \:插入。d:刪除指定的行。p:打印輸出指定的行。s:字串替換) 

案例①:df -h | sed -n ‘2p’   #獲取磁盤信息df -h 的第二行數據

案例②:sed ‘2,4d’ student.txt  #刪除第二行到第四行的數據,但不修改文件自己

案例③:sed ‘2a hello’ student.txt  #在第二行後追加hello

案例④:sed ‘2i hello’ student.txt   #在第二行前插入數據

案例⑤:sed ‘2c person’ student.txt   #替換第二行的數據

【字符串替換】sed ‘s/舊字串/新字串/g’ 文件名  (容許多個條件同時執行,使用 -e ,條件之間使用分號。)

案例①:sed ‘3s/74/99/g’ student.txt   #在第三行中,把74換成99

案例②:sed -i ‘3s/74/99/g’ student.txt  #sed操做的數據直接寫入文件,可是沒有輸出

案例③:sed -e ‘s/Liming//g ; s/Gao//g’ student.txt  #同時把「Liming」和「Gao」替換爲空

 

【排序命令】: sort [選項] 文件名,【統計命令】:wc [選項] 文件名

【條件判斷】-d是否爲目錄,-e文件是否存在,-f是否爲普通文件。

【if語句】if [ 條件判斷式 ];then  程序  fi

【for1】for 變量 in 值1 值2 值3⋯  do 程序 done,在批量處理文件中很是實用!

【for2】for (( 初始值;循環控制條件;變量變化 )) do 程序 done

【while】while [ 條件判斷式 ]  do  程序  done

 

 

【數據庫筆記】

 

【MySQL ALTER操做字段】

添加字段:ALTER TABLE tbname ADD username varchar(5) NOT NULL DEFAULT '' COMMENT 'beizhu';

修改字段的信息:alter table tbname MODIFY username varchar(20) not null default '' comment '備註' [after name | first] ;

替換字段爲新值:alter table tbname CHANGE username userinfo int(11) NOT NULL DEFAULT 0 COMMENT '備註';

刪除字段:ALTER TABLE tbname DROP COLUMN userinfo; [或者 DROP field userinfo]

 

【MySQL ALTER操做索引】

添加主鍵索引:ALTER TABLE tbname ADD PRIMARY KEY s1(column)

添加惟一索引:ALTER TABLE tbname ADD UNIQUE s2(column)

添加普通索引:ALTER TABLE tbname ADD [INDEX|KEY] idx_name (column1,column2,column3)

添加全文索引:ALTER TABLE tbname ADD FULLTEXT s3(column)

刪除索引:ALTER TABLE tbname DROP index s1;

 

【MySQL執行一次update更改多條數據】

UPDATE tbName SET name = CASE myid WHEN 2 THEN 'Hello' WHEN 3 THEN 'world' WHEN 8 THEN 'Jerry' END WHERE myid IN (2,3,8) .

 

【MySQL優化的基本方法】

① 用啥查啥,不要select *;

② 儘可能避免在列上運算,這樣會致使索引失效;

③ 使用批量插入語句;

④ limit基數較大時使用between:order by id limit 1000,10 優化爲:where id between 1000 and 1010 order by id

⑤ 不要使用rand函數獲取多條隨機記錄

⑥ 避免使用NULL

⑦ 不要使用count(id),而用count(*)

⑧ 使用order by null  禁用排序

 

【使用explain】返回的信息:select_type[查詢的類型],table,type[表的鏈接類型],possible_keys[可能使用的索引],key[實際使用的索引],key_len[索引字段的長度],ref,rows[掃描的行數],Extra[執行狀況的描述和說明].

 

【存儲引擎的選擇】

① MyISAM:讀取大約是寫入的100倍以上,update較少,併發不高,不須要事務,數據量小,硬件資源有限。(定時清理MyISAM:optimize table 表名)

② InnoDB:讀取和寫入差很少,頻繁更新大字段,表數據量超過1000萬,併發高,安全性和可用性要求高。

 

【MySQL的瓶頸(千萬級別數據量,性能會顯著下降)】

① 增長MySQL配置中buffer和cache的數值,提升硬件配置

② 使用第三方引擎或者衍生版本

③ 遷移到其餘數據庫,如PostgreSQL、Oracle

④ 對數據庫分區、分表。按日期和取模餘數分表較常見,例如按照uid%10的計算方式。

⑤ 使用NoSQL等輔助解決方案,如Memcache、Redis

⑥ 使用數據庫鏈接池技術

 

 

【Redis實戰】

MySQL的user表:|userid:9|username:lisi|password:222|email:lisi@163.com|

轉換爲Redis存儲:

set  user:userid:9:username lisi

set  user:userid:9:password 111111

set  user:userid:9:email   lisi@163.com

 

◆ 查詢方法

① 查詢有哪些字段:keys user:userid:9* ,結果以下:

② 查詢某個字段的值:get user:userid:9:username ===> lisi

◆ 注意:冗餘字段。

按照username查詢,須要生成一條按照username列爲主的key-value:set  user:username:lisi:uid  9  

這樣就能夠根據username:lisi:uid ,查出userid=9。 再查user:9:password/email ... 

 

【增刪改查分頁完整操做】

使用hash類型存儲數據。hmset:批量添加數據,例如:$redis->hmset(‘user:1’,array(‘name’=>「renxing」,‘age’=>「28」)); hgetall:獲取全部數據;del:刪除數據。

$redis->incr("userid"); //設定一個自增的數值,相似於主鍵

$redis->hmset("user:".$uid,array $add_data); //批量添加

$incr_id = $redis->get("uid"); //獲取當前自增的數值

for($i=1;$i<=$incr_id;$i++){

$data[] = $redis->hgetall("user:".$i); //使用hgetall獲取數據

}

$res = $redis->del("user:".$uid); //刪除數據

 

[分頁操做思路分析] 將全部的uid存在鏈表結構list中,用rpush uid 1 存儲,用lrange uid 0 -1 獲取所有數據。在刪除數據的時候,用lrem刪除對應的id號。PHP中用lsize能夠獲取list的總數。假設每頁顯示3條,那麼,第1頁:lrange uid 0 2,第2頁:lrange uid 3 5,第3頁:lrange uid 6 8。

 

 

【基本信息】

Redis 使用select 1能夠切換到1號數據庫

rdb的工做原理:每隔N分鐘或N次寫操做後,從內存dump數據造成rdb文件,壓縮,放在備份目錄。優點在於:恢復速度很快!rdb的缺陷:在2個保存點之間斷電,將會丟失1-N分鐘的數據。出於對持久化的更精細要求,redis增添了aof方式 append only file,把最終的結果逆化爲新的變量,只存儲最終的結果,忽略中間變化的過程,叫作:aof重寫。bgrewriteaof 能夠直接立刻重寫。使用aof後性能稍微會降低。若是不當心運行了flushall, 當即 shutdown nosave ,關閉服務器。而後手工編輯aof文件, 去掉文件中的 「flushall 」相關行, 而後開啓服務器,就能夠導入回原來數據。若是flushall以後,系統剛好bgrewriteaof了,那麼aof就清空了,數據丟失.

 

【rdb和aof的一些注意事項】 

① 在dump rdb過程當中,aof若是中止同步,會不會丟失? (不會,全部的操做緩存在內存的隊列裏, rdb執行dump完成後,統一操做.)

② aof重寫是指什麼? (aof重寫是指把內存中的數據,逆化成命令,寫入到.aof日誌裏.解決 aof日誌過大的問題.)

③ rdb和aof,兩種是否能夠同時用? (能夠,並且推薦這麼作)

④ 若是rdb文件和aof文件都存在,優先用誰來恢復數據? (優先aof)

⑤ 恢復時rdb和aof哪一個恢復的快 (rdb快,由於其是數據的內存映射,直接載入到內存,而aof是命令,須要逐條執行)

 

【info:顯示服務器所有信息】

① Memory(內存)

② Persistence (持久化的信息)

③ Status中的fork耗時:latest_fork_usec:936

④ Replication (主從複製的信息)

 

【sentinel運維監控】./bin/redis-server ./sentinel.conf --sentinel 啓動sentinel

 

【PHP面試題】

 

1.用PHP打印出前一天的時間格式是2006-5-10 22:21:21。 echo date(‘Y-m-d H:i:s’, strtotime(‘-1 days’));
2.不使用第三個變量交換兩個變量的值。$a = "php";$b = "java";$a = explode('-',$a.'-'.$b); $b =$a[0];$a =$a[1];
3. 簡述如何獲得當前執行腳本路徑,包括所獲得參數。答:$script_name = basename(__file__); print_r($script_name);
4. error_reporting(2047)什麼做用?答:PHP 顯示全部錯誤 E_ALL.
5. PHP中heredoc是一種特殊的字符串,它的結束標誌必須?答:結束標識符所在的行不能包含任何其它字符除。
10.表單中 get與post提交方法的區別:get是發送請求HTTP協議經過url參數傳遞進行接收。而post是實體數據,能夠經過表單提交大量信息.
11.數組的查找方法:(1) 順序查找——從頭至尾逐個查找。(2)二分查找——使查找的範圍不斷縮小一半,因此查找效率較高。
12.數據的排序方法:(1)冒泡排序 (2)選擇排序 (3)插入排序
12. 如何修改SESSION的生存時間:setcookie() and session_set_cookie_params($lifeTime)
14. 用PHP寫出顯示客戶端IP與服務器IP的代碼: $_SERVER['SERVER_ADDR']服務器IP,$_SERVER['REMOTE_ADDR']客戶端IP,$_SERVER['REMOTE_HOST']當前用戶主機名,$_SERVER['PHP_SELF']當前腳本的名稱(不包括路徑和查詢字符串),$_SERVER['HTTP_REFERER']連接到當前頁面的前一頁面的 URL 地址。
18.HTTP 狀態中30二、40三、 500代碼含義: 302:臨時轉移成功,請求的內容已轉移到新位置;403:禁止訪問;500:服務器內部錯誤。
18.在HTTP 1.0中,狀態碼 401 的含義是(未受權);若是返回「找不到文件」的提示,則可用 header 函數,其語句爲:header("HTTP/1.0 404 Not Found");
20. isset() 和 empty() 區別:isset()判斷是否存在,存在就爲真,無論是否爲假。empty()判斷是否爲空,爲空時爲真值,不存在也爲真值。
24. 引用和普通變量的區別:普通變量是開闢了一塊新的存儲空間,引用是直接指向其餘的存儲空間。 
25. 請說明php中傳值與傳引用的區別:按值傳遞時,php必須複製值,特別是對於大型的字符串和對象來講,這將會是一個代價很大的操做。按引用傳遞則不須要複製值,對於性能提升頗有好處。  
31. php://input和$_POST有什麼區別:$_POST 與 php://input能夠取到值,$HTTP_RAW_POST_DATA 爲空。$_POST 以關聯數組方式組織提交的數據,並對此進行編碼處理,如urldecode,甚至編碼轉換。 php://input 可經過輸入流以文件讀取方式取得未經處理的POST原始數據,php://input 容許讀取 POST 的原始數據。和 $HTTP_RAW_POST_DATA 比起來,它給內存帶來的壓力較小,而且不須要任何特殊的 php.ini 設置。php://input 不能用於 enctype="multipart/form-data"。
37.如何經過javascript判斷一個窗口是否已經被屏蔽:答:獲取open()的返回值,若是是null,就是屏蔽了。 
1.假設a.html和b.html在同一個文件夾下面,用javascript實現當打開a.html五秒鐘後,自動跳轉到b.html:setTimeout( "go2b()",5000 );
2.以Apache模塊的方式安裝PHP,在文件http.conf中首先要用語句(LoadModule php5_module "c:/php/php5apache2.dll")動態裝載PHP模塊,而後再用語句(AddType application/x-httpd-php .php)使得Apache把全部擴展名爲php的文件都做爲PHP腳本處理。 
3.一個函數的參數不能是對變量的引用,除非在php.ini中把(allow_call_time_pass_reference boolean)設爲on
1.MYSQL取得當前時間的函數是:now();格式化日期的函數是:date()。
2.數據庫中的事務是什麼:事務就是一系列的操做,這些操做完成一項任務。只要這些操做裏有一個操做沒有成功,事務就操做失敗,發生回滾事件。即撤消前面的操做,這樣能夠保證數據的一致性。並且能夠把操做暫時放在緩存裏,等全部操做都成功有提交數據庫,這樣保證費時的操做都是有效操做。
5. MyISAM 和 InnoDB 的基本區別:MyISAM不支持事務,而InnoDB類型支持。MyISAM強調的是性能,其執行速度比InnoDB類型更快,可是不提供事務支持,而InnoDB提供事務支持以及外部鍵等高級數據庫功能。
7.對於大流量的網站,您採用什麼樣的方法來解決訪問量問題?①PHP生成靜態文件 ②mamcached緩存技術 ③升級硬件 ④優化數據庫訪問 ⑤禁止外部的盜鏈 ⑥控制大文件下載 ⑦負載均衡。
8.優化sql語句執行效率的方法:①SELECT子句中避免使用‘*’ ②用Where子句替換HAVING子句 ③避免在索引列上使用計算 ④提升GROUP BY 語句的效率,將不須要的記錄在GROUP BY 以前過濾掉 ⑤儘可能把字段設置NOT NULL⑥使用鏈接(JOIN)來代替子查詢 ⑦使用外鍵,優化鎖定表 ⑧索引字段上儘可能減小函數操做。
9.apche 和 nginx 的優缺:nginx輕量級,比apache佔用更少的內存及資源,抗併發,nginx處理請求是異步非阻塞的,而apache 則是阻塞型的,在高併發下nginx 能保持低資源低消耗高性能。apache 相對於nginx 的優勢:rewrite比nginx 的rewrite 強大,少bug,穩定。(須要性能用nginx,求穩定就apache)。 
10.要想透過代理服務器取得客戶端的真實 IP 地址,就要使用 $_SERVER["HTTP_X_FORWARDED_FOR"] 來讀取。
11.重寫list_010_1.html到list.php?city=010&page=1須要在Apache配置中增長以下RewriteRule_________。 答:RewriteRule  /list-([0-9]+)-([0-9]+)\.html$  /list.php?fid=$1&page=$2。分析:([0-9]+) 表示1個或多個數字, rewirterule 語句分前面部分和後面部分,意思是把前面部分重寫成後面的語句,每一個括號內的內容爲一個單元,第一個括號在後面就用$1 代替,第二個括號用$2代替,依次類推。
12.Redis和memcache的區別有哪些:memecache 把數據存在內存之中,斷電後會掛掉,數據不能超過內存大小。redis有部份存在硬盤上,這樣能保證數據的持久性。redis在數據支持上要比memecache多;memcache性能要高於redis。
13.關於網站靜態文件訪問提升性能的方法:減小生成cookie,將靜態文件(如圖片、css、js 等)放在不一樣域下;將JS代碼中沒必要要的空格去掉。
14.舉例說明在開發過程當中用什麼方法來加快頁面的加載速度:頁面壓縮技術(壓縮js),使用存儲過程,把CSS樣式放在頭部、把js代碼放在尾部,頁面緩存,使用Gzip壓縮文檔,圖片使用height和width屬性一個目錄地址,而後就直接加載默認文檔index.html或index.php就好了。這樣服務器就不用花時間來分析這個地址,也起到了必定加速的做用。
15.php中session的運行機制:session是在服務器端保持用戶會話數據的一種方法,它以文件的形式存儲在服務器端,session將客戶端和服務器端創建一一聯繫,每一個客戶端都得有一個惟一標識(也就是session_id),服務器經過這個session_id來區分不一樣的客戶端,session_id默認創建一個名叫」PHPSESSID」的cookie(能夠經過php.ini修改session.name值指定)存儲在客戶端,咱們也可讓session_id以地址欄來進行傳輸(修改php.ini中session.use_trans_sid等參數來改變session_id的傳輸方式),客戶端將session_id傳輸給服務器端,服務器以傳輸過來的session_id來找到相對應的文件,讀取的時候對文件內容進行反序列化就獲得session的值,保存的時候先序列化再寫入。
16. [Mongodb優勢] ①弱一致性(最終一致),更能保證用戶的訪問速度 ②文檔結構的存儲方式能更便捷的獲取數據 ③支持大容量的存儲 ⑤第三方支持豐富 ⑥性能優越。 [Mongodb缺點]不支持事務,佔用空間大,沒有成熟的維護工具。
17.禁用COOKIE後SESSION還能用嗎:PHP中經過相關的配置,可讓Session不依賴Cookie而存在。這是由於Session儲存於服務器端(默認以文件方式存儲Session),根據客戶端提供的Session ID來獲得用戶的文件,取得變量的值,Session ID可使用客戶端的Cookie或者Http1.1協議的Query_String(就是訪問的URL的「?」後面的部分)來傳送給服務器,而後服務器 讀取Session的目錄。session是經過cookie來工做的,session和cookie之間是經過$_COOKIE['PHPSESSID']來聯繫的,經過$_COOKIE['PHPSESSID']能夠知道session的id,從而獲取到其餘的信息。

1:列舉linux系統經常使用信號及使用場景:信號的名稱是在頭文件signal.h中定義的,信號都以SIG開頭,經常使用的信號以下:SIGALRM、SIGHUP、SIGINT、SIGKILL、SIGPIPE、SIGTERM、SIGUSR1.SIGUSR2。
2:說說linux下的find命令和grep命令的區別:grep是將一段數據通過分析後,取出咱們所想要的,和cut相似。find用於搜尋檔案,可是速度慢,佔硬盤,一般都是先使用 whereis 或者是 locate檢查,若是找不到才用find。
3:linux下如何看到當前機器運行狀況(內存使用,cpu使用等)?top命令或者free命令,包含了緩存。若是要查看應用程序真正的內存使用狀況,應該是used-cached-buffers。 
4:請解釋下列10個shell命令的用途(top,ps,mv,find,df,cat,chmod,chgrp,grep,wc):top:對系統處理器的狀態實時監視;ps:哪些進程正在運行和運行的狀態;mv移動文件;find:搜索文件;df:磁盤信息;cat:查看文件內容;chmod:設置權限;Chgrp:設置所屬組;wc:統計文件中的字節數、字數、行數。
7:linux下,tail,grep,awk命令如何使用?
8:linux下,如何分析日誌文件?(工具)
10:在linux服務器負載高的時候,你會經過哪些命令來查找緣由?必須搞清楚的問題有:故障的表現是什麼?無響應?報錯?故障是何時發現的?故障是否可重現?有沒有出現的規律(好比每小時出現一次)....(有誰在? w、last;以前發生了什麼? history;如今在運行的進程是啥:pstree –a、ps aux。)
11:怎鏈接一臺服務器(ssh命令,ssh root@192.168.1.1)?怎麼拉下來一個文件和上傳文件:ssh,ftp,secureCRT.
12:linux 大文件的分割和查詢:分割:split 命令,例子:split -b 100m filename ;查詢:find / -size +20000k -exec ls -lh {} \;
13:請書寫Linux/Unix命令,將文件/etc/my.cnf複製到/tmp目錄下: cp /etc/my.cnf/ /tmp 
14:查看linux負載的命令(CPU:uptime,內存:vmstat free,硬盤:iostat),查看某個進程的命令(ps aux|grep 進程名),linux經常使用軟件安裝方式有哪幾種(yum,apt)。
15:linux和windows環境開發須要注意哪些問題:windows用來作前段開發圖形界面之類的比較好,linux是搭建服務器這方面比較牛。
18: Linux/unix命令,查看全部含有關鍵詞"php"的進程:ps -aux|grep php
19:建立「/home/dir1」的目錄:mkdir -p /home/dir1
20:解壓縮archive.tar.gz : tar -zxvf archive.tar.gz 
28:$# 是傳給腳本的參數個數;$0 是腳本自己的名字;$1 是傳遞給該shell腳本的第一個參數;$2 是傳遞給該shell腳本的第二個參數;$@ 是傳給腳本的全部參數的列表;$* 是以一個單字符串顯示全部向腳本傳遞的參數,與位置變量不一樣,參數可超過9個;$$ 是腳本運行的當前進程ID號;	$? 是顯示最後命令的退出狀態,0表示沒有錯誤,其餘表示有錯誤。
29:統計日誌相關記錄數 awk:awk [-v 變量名=變量值] [-Fre] [--] '模式 { 語句 }' 變量名=變量值 文件名  
30、域名解析發起TCP的3次握手:創建TCP鏈接後發起http請求->服務器端響應http請求,瀏覽器獲得html代碼->瀏覽器解析html代碼,並請求html代碼中的資源->瀏覽器對頁面進行渲染呈現給用戶
3一、watch -n 1 :是每隔一秒查看後面跟着的命令結果;& 後臺運行這個命令

1.框架中什麼是單一入口和多入口?單一入口是什麼優缺點?答案:單一入口一般是指一個項目或者應用具備一個統一(但並不必定是惟一)的入口文件,也就是說項目的全部功能操做都是經過這個入口文件進行的,而且每每入口文件是第一步被執行的。多入口即經過訪問不一樣的 php 文件運行對應的功能。優勢:單一入口應用程序的全部http請求都是經過 index.php 接收並轉發到功能代碼去的,因此咱們在 index.php 裏面就能完成許多實際工做。
缺點:任何事情都有兩面性,單一入口應用程序也不例外。因爲全部 http 請求都是針對 index.php,因此應用程序的 url 看起來確實不那麼美觀。特別是對搜索引擎來講很不友好。
2.列舉你所使用過的mvc框架,簡述它們的優缺點;[ThinkPHP]優勢:開發速度快,利於拓展,源代碼公開;缺點:不靈活,耦合太深,不少組件無法替換。[Yii]優勢:可配置,可重用,可擴展組件;缺點:文檔實例較少,英文太多。[CI]優勢:配置簡單,所有的配置使用PHP腳原本配置,執行效率高,文檔詳細;缺點:缺少擴展能力,只可以知足小型應用。
3.用框架(mvc)作一個項目時,沒有手冊提供模板標籤的使用方法,怎麼辦:查看源代碼。
4.thinkphp的數據模型中的create方法,大概都作了那些事情:create():建立數據對象、數據自動驗證、數據自動完成、令牌驗證、字段類型檢查。
5.若是模板是用smarty模板,怎樣用section語句來顯示一個名爲$data的數組,若用foreahc語句又要怎樣顯示呢:{section name=sn loop=$data}{$news[sn].id}{/section} 、{foreach from=$data item=foo}{$foo}{/foreach}
十二、什麼是命名空間,如何聲明和使用:命名空間是爲了把一些類和類的實例更好地管理而定義的把這些類和實體集合起來的一個團體,它是_Namespace system class的一個實例,或者是_Namespace類的一個派生類,_Namespace類只有一個屬性:Name。經過這個屬性用戶能夠把某個命名空間和其餘的命名空間分開來,命名空間的Name不能包括頭綴和後綴的下劃線。由關鍵字 namespace後邊接着命名空間名字,以後接一對花括弧括住的一塊聲明和定義;

1.php的面向對象的主要關鍵字:final使類不被繼承,方法不被覆蓋;parent能夠調用父類成員中的成員變量,成員方法和常量;self,能夠調用當前類中的靜態成員和常量;const 在類中定義常量;static靜態屬性和靜態方法,不須要被實例化就能直接使用;clone對象的克隆。
2.接口起什麼做用,抽象類起什麼做用:接口是對外開放的,調用接口而後重寫其中的方法,若是你不要使用接口裏面的方法,那麼接口就沒有意義了,這樣也是爲了總體代碼的控制性。
3.單例模式:保證一個類中,有且只有一個實例存在並提供一個訪問點供全局訪問,該實例能夠被全部的程序來訪問。使用場景:①當要用一個類時,又要用該類中的一個實例;②new 來建立實例時會給程序形成資源的浪費,並且實例越多也很差控制。③不一樣的線程調用時,可能會引發不一樣步的現象。
4.寫出你經常使用的php魔術方法:__construct(),構造函數;__destruct(),析構函數;__get(),得到一個類的成員變量時調用;__set(),設置一個類的成員變量時調用;__callStatic(),用靜態方式中調用一個不可訪問方法時調用;__call(),當調用類實例中不存在的函數時自動執行;__isset(),判斷類中私有屬性或方法是否存在時自動調用;__unset(),清除類中私有變量時自動調用。
相關文章
相關標籤/搜索