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后的方法:1、<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%':查看當前字符集設置

15、如何查看SQL語句的執行效率?
16、關系數據庫中,索引的作用主要有哪些,一般什么情況下需要建索引?
	並簡述索引都有哪幾種類型,有何區別?
		提高查詢速度,有利於排序和分組. (排序和分組如用不上索引,則會產生臨時表和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.1、索引:提高了查詢速度,降低了增刪改的速度
	  索引操作:
	  	查看索引: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

17、在使用多列索引或建立多列索引時,我們一般要遵循“最左前綴原則”。請簡單說明“最左前綴原則”。
	針對單列索引, 左邊准確而右邊模糊,可以用到索引,反之則不可以.
	如 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實體

24、請給出能滿足下面要求的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 查看文件大小

25、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個參數的值
		...
26、lnmp搭建步驟 
27、js事件委托
	有時候進行某個事件操作,可能操作對象是很多類似的對象,不可能全部綁定同一個方法
	這個時候用事件委托,將事件綁定到這些相似對象的上一級,如td綁定到table
	var table = document.getElementsByTagName('table')[0];
	table.onclick = function(ev){
		ev.srcElement.style.background = '#000';
	}
28、框架,tp,laravel(隊列?),yii,node.js
29、面向對象 單例模式  幾個類
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;
		    }
		}

31、memcached、redis、mongodb以及它們之間的區別
32、郵件發送協議:SMTP、POP3、IMAP4
33、

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

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

35、多練習理解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';
	?>

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

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

37、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
    ④索引的優化
        常用符合索引來優化,同時用幾個字段來索引

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

  設計模式,數據庫設計,優化,laravel,tp

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM