php常見面試題

1.如何取得來訪者的IP地址?

	$_SERVER[‘RRMOTE_ADDR’]; $_SERVER[‘CLIENT_IP’]; $_SERVER[‘HTTP_X_FORWARED_FOR’];

2.$_FILES的結構
Array
(
    [pic] => Array
        (
            [name] => 菜單2.jpg
            [type] => image/jpeg
            [tmp_name] => E:\sssssss\tmp\php1923.tmp
            [error] => 0
            [size] => 288583
        )

)

3.session,cookie的區別
	存儲位置: cookie存儲在瀏覽器,session存於服務器.
	存儲類型: cookie 能存儲字符串,數字,不能存儲數組,對象 session能夠存儲全部類型(除了資源)
	存儲大小不一樣:受瀏覽器的限制,不一樣瀏覽器對於cookie的個數和大小,有限制. session存儲在文件上,所以能夠存儲較大內容.
	安全性: 不可以直接信任cookie數據,由於能夠僞造,要加鹽驗證,
	session須要利用cookie來傳遞session_id.
	禁用cookie後的方法:一、<input type="text" name="PHPSESSID" value="g6fgb641che30nre1bccvgeu23">
    cookie和session的設置和過時時間問題
    setcookie('test','hello',3600,'/');cookie,只要是根目錄下的均可以訪問
    session_start();
    $_SESSION["username"]="lhp";
4.函數:
	pathinfo();
	$url = "http://www.lagou.com/jobs/2499163.html?source=delivered&i=delivered-5";
	$res = pathinfo($url);
	Array
	(
	    [dirname] => http://www.lagou.com/jobs
	    [basename] => 2499163.html?source=delivered&i=delivered-5
	    [extension] => html?source=delivered&i=delivered-5
	    [filename] => 2499163
	)

	字符串函數:
		截取查找等
		addslashes那幾個函數
	數組函數:
		排序等


	php獲取mysql查詢結果集總數的函數是?
		mysql_num_rows(資源) // 獲取select語句的返回行數
		mysql_affected_rows(); // 獲取insert/update/delete 語句的影響行數
	
5.請簡述你對MVC設計模式的理解和常見開發設計模式
    mvc模式:
      m model 
      v view 
      c controller
      請求訪問controller,通過controller進行邏輯處理,若須要進行數據增刪改查,則經過controller處理好數據而後調用model,再根據model返回的數據進行處理,顯示在view上
    
    開發設計模式
       單例模式:讓某個類的實例只有一個,不重複,能夠節約資源,防止new的濫用,經常使用在mysql,購物車
       工廠模式:將類的功能實現具體細節封裝起來,開放某些接口,供外部調用,不讓外部瞭解裏面具體細節
       觀察者模式:須要觀察者和被觀察者,經過被觀察者的一些狀態的變化,讓觀察者去進行相關業務處理

6.遞歸打印某個磁盤目錄,結構和文件
	使用到opendir(),readdir(),closedir();
	判斷是否爲.和.. 是的話要過濾掉
	判斷是不是目錄 是的話則遞歸調用本函數
7.PHP魔術方法(或函數)和魔術變量
	__construct(),__destruct(),__get(),__set(),__isset(),__unset(),__unset(),__clone()等
	__FILE__ 表明當前文件路徑
	__LINE__ 當前行數
	__DIR__ 當前目錄
	__FUNCTION__ 當前函數名
	__CLASS__ 當前類名
7.1	請簡述php異常處理機制 語法
	try{
		throw new Exception("Error Exception", 1);
	}catch(Exception $e){
		echo $e -> getMessage ();
	}
8.你的代碼在本地正常,上傳到購買的虛擬主機後,顯示空白. 該如何調試?
	查看日誌.
	若是程序沒有日誌, 只能看PHP的原始報錯,想一想,爲何空白?
	php.ini有2個設置: 
	display_errors,修改成on,
	error_reporting(E_ALL);
	同時,因爲虛擬主機,你無權修改php.ini, 
	在php腳本中,動態修改ini,用ini_set();
	綜上: ini_set(‘display_errors’ , 1);
	error_reporting(E_ALL); 
9.如下HTTP狀態碼的含義 404,403,200,302,304,500
	404 Not Found
	403 forbidden
	200 OK
	302 臨時重定向
	304 not modified
	500 服務器內部錯誤
10.各類服務的默認端口號:
	http:80
	https:443
	tomcat:8080

	mysql:3306
	
	ftp:21
	ssh:22
	telnet:23
	smtp:25
	
	php-fpm:9000

	memcached:11211
	redis:6379
	mongodb:27017
	sphinx:9312
11.寫一個最簡單的單例類
	final class single{
		protected static $ins=null;
		protected function __construct(){}
		public static function getIns(){
			if(self::$ins==null){
				self::$ins = new self();
			}
			return self::$ins;
		}
		protected function __clone(){}
	}
12.說出你用的框架,並比較他們之間的差別
	TP, laravel
	1. laravel的路由更簡單靈活,直接指向控制器的方法,而tp是經過m/c/a的方式獲取對應參數,來訪問對應模塊下控制器的方法
	2. laravel接管了網站的全過程,數據庫(遷移文件,migration)+mvc(路由)+錯誤處理
	3. laravel的傳參和獲取參數方式不同,它有一個強大的request對象
	4. laravel模板blade語法更接近php語法,相對tp裏面的改過的smarty模板更簡單
	5. laravel引入第三方類庫方式比較好,大大提升開發人員使用第三方類庫的效率

數據庫
13.簡述char與varchar的區別
	分別是定長與變長.
	以char(M)爲例, 能夠存儲0-M個字符,存儲不夠M個字符, 仍然佔據M個字符的寬度.(不夠M個,右側用空格補齊).
	varchar(M),能夠存儲0-M個字符,但須要1-2個額外的字節,來標註此字段具體的大小.
14.ddl語句,數據表創建等語句
    1.複習祕籍.html 練習一遍
    2.show TABLE status [where name='art'] 
        //查看錶的詳細信息
        //裏面有comment標註是 表 仍是 視圖
        show VARIABLES like '%character%':查看當前字符集設置

1五、如何查看SQL語句的執行效率?
1六、關係數據庫中,索引的做用主要有哪些,通常什麼狀況下須要建索引?
	並簡述索引都有哪幾種類型,有何區別?
		提升查詢速度,有利於排序和分組. (排序和分組如用不上索引,則會產生臨時表和filesort的過程)
		根據業務邏輯,分析列查詢的頻度和順序, 創建索引和複合索引.
		主鍵索引(primary key), ---->不須要有索引名,由於只有一個主鍵索引
		惟一索引(unique key)
		---->unique key email(email(10))
		括號裏面是表字段,外面是索引名字,其餘索引同樣
		裏面的10是指索引的長度,如1234567899@qq.com,只取出了前面10個字符作索引
		普通索引(key),
		全文索引(fulltext key)--->中文環境下基本無效,通常用第三方方案如sphinx(中文分詞)
		多列索引:key xm(xing,ming)用xing和ming兩個字段作索引
		冗餘索引:在某個字段上有多個索引,如 key xm(xing,ming) ,key m(ming),有兩個 就是冗餘索引
16.一、索引:提升了查詢速度,下降了增刪改的速度
	  索引操做:
	  	查看索引:show index from table tbname,show create table tbname	
	  	刪除索引:alter table tbname drop index key1,drop index key1 from tbname
	  	添加索引:alter table tbname add index key1(字段)
	  	添加主鍵索引:alter table tbname add primary key(id)
	  	刪除主鍵索引:alter table tbname drop primary key

1七、在使用多列索引或創建多列索引時,咱們通常要遵循「最左前綴原則」。請簡單說明「最左前綴原則」。
	針對單列索引, 左邊準確而右邊模糊,能夠用到索引,反之則不能夠.
	如 where name like ‘poly%’,能夠用到, 而」%poly」則不用到.
	針對多列索引, 左邊的列用到索引後,右側的列纔有可能用到索引.
	例 index(a,b,c), where a=? and b=? ,b列索引會用到.
	若是直接 where b=?, 由於a列沒用索引,因此b索引,用不到.

17.1事務
	四大特性:隔離性,原子性,一致性,持久性
17.2 mysql引擎
	常見三種:
		innodb:全部數據在一個文件中
		myisam:數據分類存儲
		memory:內存
	innodb和myisam區別:
		innodb(李當心):支持事務,不支持全文索引,行鎖(更細),支持多種索引
		myisam(張馬虎):不支持事務,支持全文索引,表鎖,只支持B樹索引
linux
18.查找當前目錄下,全部的.php文件
	答: find . -name 「*.php」
19. 查找當前目錄下,全部的.php文件並匹配含有」dog」的行
	答: find . -name 「*.php」 | xargs  grep dog
20.有一個備份程序 mybackup.sh,須要天天凌晨3點執行一次,crontab命令格式怎麼寫?
	答: crontab -e 進入編輯狀態.
    0 3 * * * /bin/bash mybackup.sh
21.請簡述php會話(session)實現原理,並考慮以下問題:
	禁用了cookie,session可否使用?
	如何把session存儲數據庫/memcached/redis
	如何實現一個嚴格的30分鐘過時的會話?、
	如何實踐web服務器集羣的會話共享?
	如何實現兩個不一樣域站點的會話共享?
		答: 能!
		cookie和session的關係
		cookie傳遞session_id,供服務器決定session文件.
		因此只要能向服務器傳遞session_id,session就能正常使用.
		而cookie只是傳遞session_id的一種方式而已.
		用url也能傳遞session_id
		php.ini 配置以下:
		session.use_only_cookies = 0
		session.use_trans_sid = 1
		OK了.


	class sess {
	    protected static $mem = null;

	    public static function open() {
	        if(self::$mem === null) {
	            self::$mem = new memcache();
	            self::$mem->connect('localhost' , 11211);
	        }
	    }

	    public static function close() {
	        self::$mem->close();
	    }

	    public static function read($id) {
	        return self::$mem->get($id);
	    }

	    public static function write($id , $data) {
	        return self::$mem->add($id,$data , false);
	    }

	    public static function destroy($id) {
	        return self::$mem->delete($id);
	    }

	    public static function gc($lifetime) {
	        // 
	    }
	}

	session_set_save_handler('sess::open', 'sess::close', 'sess::read', 'sess::write', 'sess::destroy', 'sess::gc');

?>


如何實現30分鐘過時的session?
答: 1. 加時間戳, $_SESSION[‘expire’] = time()+1800;
	業務邏輯去判斷.

	2.ini_set(‘session.cookie_lifetime’ , 1800)
	3.或者用memcache,存儲的時候,加上1800的有效期.
	4.接管session處理權,第1題中,$mem->connect(‘專門的一臺memcached服務器’).
	把session文件放在專門的服務器中. 各個web服務器共享此session服務器.
	5.若是不跨主域, 如book.163.com, lady.163.com , mil.163.com
	在setcookie(‘key’,’value’,’expire’ , /path‘ , ‘.163.com’);
	域名只寫到主域名,cookie將會在各個子域名生效.

	若是必須跨域,咱們依照oauth原理.
22.在不刷新新頁面的前提下,js有哪幾種方式能夠向後端服務發起請求?怎麼經過先後端的配置實現跨域請求?
	ajax (默認不能跨域)
	jsonp(能夠跨域)
	document.createElement(‘img’);
	img.src=’xx.com/url’;
	也能夠經過最新的XHR對象的特色, 在服務端發送頭信息 Access-Control-Allow -Origin: *
	同步和異步的區別:
		同步須要等待返回結果才能繼續,異步沒必要等待

23請指出下面幾種編碼分別是什麼格式:
	%E4%B8%AD%E6%96%87
	%D6%D0%CE%C4  URL encoded, php有urlencoded, js用encodeURI
	0xe40xb80xad0xe60x960x87 ,十六進制
	\u4e2d\u6587   , unicode碼,返回的json數據中常見
	&#20013;&#25991 , html實體

2四、請給出能知足下面要求的linux命令:

  1) 查看系統的運行狀態(CPU/內存/負載等);
top   ,  
cat /proc/meminfo 查看內層狀態
cat /proc/cpuinfo
w 命令能夠看到  load average: 0.00, 0.00, 0.00

  2)重啓apache/httpd/nginx服務(寫出一條便可);
apache:  /path/to/apache/httpd -k start|stop|restart
nginx:   /path/to/nginx/sbin/nginx -s reload

24.1 查看文件大小

2五、PHP運行模式:
	1) CGI (通用網關接口 / Common Gatew ay I nterface)
	CGI 即通用網關接口:每有一個用戶請求,都會先要建立CGI 的子進程,而後處理請求,
	處理完後結束這個子進程,
	這就是Fork-And-Ex ecute模式。 當用戶請求數量很是多時,會大量擠佔系統的資源如
	內存, CPU 時間等,形成效能低下。
	屬於PH P早期的運行模式,目前使用較少;
	2) FastCGI (常駐型CGI  / Long-Live CGI )
	FastCGI 是CGI 的升級版本, FastCGI 像是一個常駐 (long-live)型的 CGI ,它能夠一直執行
	着,只要激活後,
	不會每次都要花費時間去 Fork 一次 (這是 CGI  最爲人詬病的 fork-and-ex ecute 模
	式)。
	3) Web模塊模式( Apache等Web服務器運行的模式)
	模塊的做用是接收Apache傳遞過來的PH P文件請求,並處理這些請求,而後將處理後
	的結果返回給Apache。而後在返回給用戶;
	4) CLI (命令行運行 / Command Line I nterface)
	PH P-CLI 是PH P Command Line I nterface的簡稱,如同它名字的意思,就是PH P在命令行運行的接口,
	區別於在Web服務器上運行的PH P環境( PH P-CGI , I SAPI 等)。
	PH P 的命令行模式能使得 PH P 腳本能徹底獨立於 w eb 服務器單獨運行。
	切換目錄到php.ex e所在文件夾;

	在cli命令行模式下:
		命令行下如何接收參數 命令行下如何接收參數
		用$argv來接收參數,
		$argv是一個數組,
		第0個單元,表明php文件的名稱
		第1個單元,表明第1個參數的值
		第2個單元,表明第2個參數的值
		...
2六、lnmp搭建步驟 
2七、js事件委託
	有時候進行某個事件操做,可能操做對象是不少相似的對象,不可能所有綁定同一個方法
	這個時候用事件委託,將事件綁定到這些類似對象的上一級,如td綁定到table
	var table = document.getElementsByTagName('table')[0];
	table.onclick = function(ev){
		ev.srcElement.style.background = '#000';
	}
2八、框架,tp,laravel(隊列?),yii,node.js
2九、面向對象 單例模式  幾個類
30、排序算法代碼(冒泡,快速等)
	冒泡排序:
		1.比較相鄰的元素。若是第一個比第二個大,就交換他們兩個。
		2.對每一對相鄰元素做一樣的工做,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
		3.針對全部的元素重複以上的步驟,除了最後一個。
		4.持續每次對愈來愈少的元素重複上面的步驟,直到沒有任何一對數字須要比較
	代碼:
		function bubbleSort($numbers) {
		    $cnt = count($numbers);
		    for ($i = 0; $i < $cnt; $i++) {
		        for ($j = 0; $j < $cnt - $i - 1; $j++) {
		            if ($numbers[$j] > $numbers[$j + 1]) {
		                $temp = $numbers[$j];
		                $numbers[$j] = $numbers[$j + 1];
		                $numbers[$j + 1] = $temp;
		            }
		        }
		    }	 
		    return $numbers;
		}
		 
		$num = array(20, 40, 60, 80, 30, 70, 90, 10, 50, 0);
		var_dump(bubbleSort($num));

	快速排序:
		經過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的全部數據都比另一部分的全部數據都要小,而後再按此方法對這兩部分數據分別進行快速排序,整個排序過程能夠遞歸進行,以此達到整個數據變成有序序列
	代碼:
		function quickSort(&$arr){
		    if(count($arr)>1){
		        $k=$arr[0];
		        $x=array();
		        $y=array();
		        $_size=count($arr);
		        for($i=1;$i<$_size;$i++){
		            if($arr[$i]<=$k){
		                $x[]=$arr[$i];
		            }elseif($arr[$i]>$k){
		                $y[]=$arr[$i];
		            }
		        }
		        $x=quickSort($x);
		        $y=quickSort($y);
		        return array_merge($x,array($k),$y);
		    }else{
		        return $arr;
		    }
		}

3一、memcached、redis、mongodb以及它們之間的區別
3二、郵件發送協議:SMTP、POP三、IMAP4
3三、

3三、$GLOBALS和global區別
	$GLOBALS:全局變量數組
	global:在函數內容聲明某個變量是全局變量中的某一個變量,
			而後能夠對這個聲明的變量進行全局增刪改查
			例如:
				$c = 1;
				echo $c;//1
				function a(){
					global $c;
					$c = 222;	
				}
				a();
				echo $c;//222

3四、字符串函數:
	正則經常使用函數:
	preg_split()將字符串,按正則一個一個字符分割到數組中
	字符串函數:
	strrev,反轉字符串
	str_split,按指定字符串長度拆成數組
	chunk_split,按照指定的長度進行切割字符串並加上其餘字符如 123434--->123,434
	number_format 千分位格式化數字

3五、多練習理解memcached、redis、momgodb
	
	三者應用以下
	<?php
		$mem = new memcache;
		$mem->connect('localhost',11211);
		//經過memcached來設置一個自增的id
		$_id = $mem->increment('_id');

		$mongo = new mongoClient;
		$test = $mongo->test;
		$book = $test->book;

		//用自增的id來放到mongodb的json串中
		$data = ['_id'=>$_id,'title'=>$_POST['title']];
		$book->insert($data);

		$tags = explode(',',$_POST['tags']);
		$redis = new redis;
		var_dump($redis->connect('localhost',6379));

		foreach($tags as $v){
		    echo $v;
			//使用redis來保存標籤tags的內容
		    $redis->sAdd($v,$_id);
		}
		echo 'OK';
	?>

3六、服務器反向代理,集羣,負載均衡
	反向代理:動靜分離等,
		
		也就是對應不一樣的請求使用不一樣的服務器,
		如:訪問一個頁面時,用一個服務器來解析html,一個解析php,一個服務器來存圖片並,請求的時候返回圖片資源等

	集羣:多個服務器,放在一個服務器組裏面,當有請求時,將請求給服務器組。
		配置例子: 
			upstream aaaserver{
				sever 192.168.3.1:80.......
				sever 192.168.3.2:80.......
				sever 192.168.3.3:80.......
			}
    
    負載均衡:當請求給服務器組時,將請求按照必定(算法、策略),分發給服務器組裏面的各個服務器

3七、mysql優化
	①原則:不查-->少查-->內存查-->磁盤查-->少排序(最好的優化是少查詢)
	②表的優化:
	    a定長和變長字段分離--->核心且經常使用字段宜建成定長,放一張表
	    b經常使用和不經常使用字段分離
	    c須要關聯同級的表中,添加冗餘字段
	        如:一個文章表中,展現文章的時候常常要用到做者名,
	            這個時候能夠在文章表中加上用戶(做者)uname,從而不用去連表查用戶表
    ③列的選擇:
    	a字段類型優先級--->int>date,time<enum.char>varchar>blob,text
    	b長度夠用就行--->如age用tinyint最大可存255,用int浪費了3個字節
    	 由於大的字段,浪費內存,影響速度
    	c儘可能避免用null
    	  由於null不利於索引,要用特殊字段來標註
    	  另外查詢也不方便,還須要用is null或is not null
    ④索引的優化
        經常使用符合索引來優化,同時用幾個字段來索引

3八、查看sql語句執行效率
	a:使用explain + select語句 
	b:set profiling=1,show profiles

  設計模式,數據庫設計,優化,laravel,tp
相關文章
相關標籤/搜索