PHP2021面試題(一)

1、FILE表示什么意思?(5分)
文件的完整路徑和文件名。如果用在包含文件中,則返回包含文件名。自 PHP 4.0.2 起,FILE 總是包含一個(gè)絕對(duì)路徑,而在此之前的版本有時(shí)會(huì)包含一個(gè)相對(duì)路徑。

2、如何獲取客戶端的IP地址?(5分)

$_SERVER[‘REMOTE_ADDR’]

3、寫出使用header函數(shù)跳轉(zhuǎn)頁(yè)面的語(yǔ)句(5分)

Header(‘location:index.php’);

4、$str是一段html文本,使用正則表達(dá)式去除其中的所有js腳本(5分)

$pattern = ‘/<script.*>\.+<\/script>/’;  Preg_replace($pattern,’’,$str);

5、寫出將一個(gè)數(shù)組里的空值去掉的語(yǔ)句(5分)

$arr = array(‘’,1,2,3,’’,19);
第一種方法:
$array1 = array('  ',1,'',2,3);  print_r(array_filter($array1, "del"));  function del($var)  
{ return(trim($var));  
}
第二種方法:
$arr=array("",1,2,3,"");  $ptn="/\S+/i";  print_r(preg_grep($ptn,$arr));

6、寫出獲取當(dāng)前時(shí)間戳的函數(shù),及打印前一天的時(shí)間的方法(格式:年-月-日 時(shí):分:秒) (5分)

Time();  Date(“Y-m-d H:i:s”,Strtotime(“-1 day”));

7、寫出php進(jìn)行編碼轉(zhuǎn)換的函數(shù)(5分)

Iconv(‘utf-8’,’gb2312’,$str);

8、$str = “1,3,5,7,9,10,20”,使用什么函數(shù)可以把字符串str轉(zhuǎn)化為包含各個(gè)數(shù)字的數(shù)組?(5分)

$arr = explode(“,”,$str);

9、serialize() /unserialize()函數(shù)的作用(5分)

serialize()和unserialize()在php手冊(cè)上的解釋是:
serialize — 產(chǎn)生一個(gè)可存儲(chǔ)的值的表示,返回值為字符串,此字符串包含了表示 value 的字節(jié)流,不丟失其類型和結(jié)構(gòu),可以存儲(chǔ)于任何地方。
unserialize — 從已存儲(chǔ)的表示中創(chuàng)建 PHP 的值
具體用法:

$arr = array(“測(cè)試1″,”測(cè)試2″,”測(cè)試3″);//數(shù)組  $sarr = serialize($arr);//產(chǎn)生一個(gè)可存儲(chǔ)的值(用于存儲(chǔ))
//用任意方法(例如:你要是吧$sarr存在一個(gè)文本文件中你就可以用file_get_contents取得)得到存儲(chǔ)的值保存在$newarr中;
$unsarr=unserialize($newarr);//從已存儲(chǔ)的表示中創(chuàng)建 PHP 的值

10、寫出一個(gè)函數(shù),參數(shù)為年份和月份,輸出結(jié)果為指定月的天數(shù)(5分)

Function day_count($year,$month){  Echo date(“t”,strtotime($year.”-”.$month.”-1”));  }

11、一個(gè)文件的路徑為/wwwroot/include/page.class.php,寫出獲得該文件擴(kuò)展名的方法(5分)

$arr = pathinfo(“/wwwroot/include/page.class.php”);  
$str = substr($arr[‘basename’],strrpos($arr[‘basename’],’.’));

12、你使用過(guò)哪種PHP的模板引擎?(5分)

Smarty,thinkphp自帶的模板引擎

13、請(qǐng)簡(jiǎn)單寫一個(gè)類,實(shí)例化這個(gè)類,并寫出調(diào)用該類的屬性和方法的語(yǔ)句(5分)

Class myclass{
Public $aaa;
Public $bbb;
Public function myfun(){
Echo “this is my function”;
}
$myclass = new myclass();
$myclass->$aaa;
$myclass->myfun();

14、本地mysql數(shù)據(jù)庫(kù)db_test里已建有表friend,數(shù)據(jù)庫(kù)的連接用戶為root,密碼為123
friend表字段為:id,name,age,gender,phone,email
請(qǐng)使用php連接mysql,選擇出friend表里age > 20的所有記錄打印結(jié)果,并統(tǒng)計(jì)出查詢出的結(jié)果總數(shù)。(5分)

<?php
$link = Mysql_connect(“l(fā)ocalhost”,”root”,”123”) or die(“數(shù)據(jù)庫(kù)連接失敗!”);

Mysql_select_db(“db_test”,$link) or die(“選擇數(shù)據(jù)庫(kù)失敗!”);

$sql = “select id,name,age,gender,phone,email from friend where age>20”;

$result = mysql_query($sql);

$count = mysql_num_rows($result);

While($row = mysql_fetch_assoc($result)){

Echo $row[‘id’];
….
}

15、以下有兩個(gè)表
user表 字段id (int),name (varchar)
score表 字段uid (int),subject (varchar) ,score (int)
score表的uid字段與user表的id字段關(guān)聯(lián)
要求寫出以下的sql語(yǔ)句
1)在user表里新插入一條記錄,在score表里插入與新加入的記錄關(guān)聯(lián)的兩條記錄(5分)
2)獲取score表里uid為2的用戶score最高的5條記錄(5分)
3)使用聯(lián)合查詢獲取name為“張三”的用戶的總分?jǐn)?shù)(5分)
4)刪除name為“李四”的用戶,包括分?jǐn)?shù)記錄(5分)
5)清空score表(5分)
6)刪除user表(5分)

1). mysql_query(“insert into user(name) values(‘test’)”);
$id = mysql_insert_id();
Mysql_query(“insert into score(uid,subjext,score) values(“.$id.”,’english’,’99’)”);

2).$sql = select uid,sunjext,score from score where uid=2 order by score desc limit 0,5;

3).select s.score from score s RIGHT JOIN user u ON u.id=s.uid where u.name=’張三;

4).delete from score where uid in(select id from user where name=’李四’);

Delete from user where name=’李四’;

5).delete from score;

6).drop table user;

1:get,post 的區(qū)別

GET在瀏覽器回退時(shí)是無(wú)害的,而POST會(huì)再次提交請(qǐng)求。
GET請(qǐng)求會(huì)被瀏覽器主動(dòng)cache,而POST不會(huì),除非手動(dòng)設(shè)置。
GET請(qǐng)求只能進(jìn)行url編碼,而POST支持多種編碼方式
GET請(qǐng)求在URL中傳送的參數(shù)是有長(zhǎng)度限制的,而POST沒(méi)有
GET比POST更不安全,因?yàn)閰?shù)直接暴露在URL上,所以不能用來(lái)傳遞敏感信息
GET比POST傳輸數(shù)據(jù)量更小

2.require,include 區(qū)別

include在引入不存文件時(shí)產(chǎn)生一個(gè)警告且腳本還會(huì)繼續(xù)執(zhí)行,
require則會(huì)導(dǎo)致一個(gè)致命性錯(cuò)誤且腳本停止執(zhí)行。

i++和++i命令的區(qū)別有

i++先做別的事,再自己加1
++i先自己加1,再做別的事情
++i比i++效率要高

兩數(shù)組直接相加,array_merge 與直接相加的區(qū)別

https://www.cnblogs.com/Cecil_1995/p/10909367.html

負(fù)載均衡的五種算法

https://blog.csdn.net/apple9005/article/details/79961391
輪詢(默認(rèn))
weight(輪詢權(quán)值)
ip_hash
fair(第三方)
url_hash(第三方)

InnoDB和MyISAM的區(qū)別

MyISAM不支持事務(wù),而InnoDB支持
MyISAM支持外鍵,而InnoDB不支持
MyISAM:支持(FULLTEXT類型的)全文索引
InnoDB:不支持(FULLTEXT類型的)全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。
MyISAM用一個(gè)變量保存了整個(gè)表的行數(shù),InnoDB不保存表的具體行數(shù)
MyISAM支持表級(jí)鎖,InnoDB支持表、行(默認(rèn))級(jí)鎖
InnoDB表必須有唯一索引(如主鍵)
MySQL5.5版本開始Innodb已經(jīng)成為Mysql的默認(rèn)引擎(之前是MyISAM)

兩個(gè)數(shù)組相加

<pre class="prettyprint linenums prettyprinted" style="padding: 10px; margin: 10px 0px; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); white-space: pre-wrap; overflow-wrap: break-word; background: rgb(39, 40, 34); border: 1px solid rgb(221, 221, 221); overflow: hidden; font: 400 12px / 1.6 Helvetica, "Hiragino Sans GB", 微軟雅黑, "Microsoft YaHei UI", SimSun, SimHei, arial, sans-serif; border-radius: 3px; box-shadow: rgb(57, 56, 46) 40px 0px inset, rgb(70, 71, 65) 41px 0px 0px inset; color: rgb(51, 51, 51); letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">

  1. $a=[0,1,2,3]; $b=[1,2,3,4,5];
  2. $a += $b;//Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 5 )

</pre>

echo、print_r、print、var_dump

  1. echo、print是php語(yǔ)句,var_dump和print_r是函數(shù)
  2. echo 輸出一個(gè)或多個(gè)字符串,中間以逗號(hào)隔開,沒(méi)有返回值是語(yǔ)言結(jié)構(gòu)而不是真正的函數(shù),因此不能作為表達(dá)式的一部分使用
  3. print也是php的一個(gè)關(guān)鍵字,有返回值 只能打印出簡(jiǎn)單類型變量的值(如int,string),如果字符串顯示成功則返回true,否則返回false
  4. print_r 可以打印出復(fù)雜類型變量的值(如數(shù)組、對(duì)象)以列表的形式顯示,并以array、object開頭,但print_r輸出布爾值和NULL的結(jié)果沒(méi)有意義,因?yàn)槎际谴蛴 盶n”,因此var_dump()函數(shù)更適合調(diào)試
  5. var_dump() 判斷一個(gè)變量的類型和長(zhǎng)度,并輸出變量的數(shù)值

php中字符串處理函數(shù)

trim 移除空白字符或特定字符 ltrim rtrim
expload 數(shù)組轉(zhuǎn)化成字符串
substr 字符串截取
substr_resplace 子字符串替換
strlen 字符串長(zhǎng)度
strtolower
strtoupper
md5
implode
strpos在指定字符串中查找目標(biāo)字符串第一次出現(xiàn)的位置

array_diff

array1 = array(“a” => “green”, “red”, “blue”, “red”);array2 = array(“b” => “green”, “yellow”, “red”);
result = array_diff(array1, $array2); //Array ( [1] => blue )
返回array1中有,array2中沒(méi)有的集合

有兩個(gè)數(shù)組[1,2,5,11,32,15,77]和[99,32,15,5,1,77]兩個(gè)數(shù)組,寫段程序找出它們共同都擁有的數(shù)

<pre class="prettyprint linenums prettyprinted" style="padding: 10px; margin: 10px 0px; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); white-space: pre-wrap; overflow-wrap: break-word; background: rgb(39, 40, 34); border: 1px solid rgb(221, 221, 221); overflow: hidden; font: 400 12px / 1.6 Helvetica, "Hiragino Sans GB", 微軟雅黑, "Microsoft YaHei UI", SimSun, SimHei, arial, sans-serif; border-radius: 3px; box-shadow: rgb(57, 56, 46) 40px 0px inset, rgb(70, 71, 65) 41px 0px 0px inset; color: rgb(51, 51, 51); letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">

  1. $array1 =[1,2,5,11,32,15,77];

  2. $array2 = [99,32,15,5,1,77];

  3. $result = array_diff($array1, $array2);

  4. $result2 = array_diff($array2, $array1);

  5. $s = array_diff( array_merge($array1+$array2) ,array_merge($result,$result2));

  6. p($s);

</pre>

面向?qū)ο笕筇卣?/h2>

封裝、
繼承、
多態(tài):同一類型的對(duì)象在執(zhí)行同一個(gè)方法時(shí),可能表現(xiàn)出多種行為特征。

魔術(shù)方法 [系統(tǒng)特定情境調(diào)用,如初始化construct]

__construct(),
__destruct(),
__call(),
__callStatic(),
__get(),
__set(),
__isset(),
__unset(),
__sleep(),
__wakeup(),
__serialize(),
__unserialize(),
__toString(),
__invoke(),
__set_state(),
__clone() 和
__debugInfo() 等方法在 PHP 中被稱為”魔術(shù)方法”(Magic methods)。在命名自己的類方法時(shí)不能使用這些方法名,除非是想使用其魔術(shù)功能。
所有的魔術(shù)方法 必須 聲明為 public

mysql數(shù)據(jù)庫(kù)索引有哪些?什么情況下不適合建立索引?

主鍵索引
普通索引
唯一索引
全文索引

數(shù)據(jù)重復(fù)率高
寫操作多

問(wèn):一條SQL語(yǔ)句在MySQL中如何執(zhí)行的?

答:
客戶端請(qǐng)求 —->
連接器(驗(yàn)證用戶身份,給予權(quán)限) —->
查詢緩存(存在緩存則直接返回,不存在則執(zhí)行后續(xù)操作) —->
分析器(對(duì)SQL進(jìn)行詞法分析和語(yǔ)法分析操作) —->
優(yōu)化器(主要對(duì)執(zhí)行的sql優(yōu)化選擇最優(yōu)的執(zhí)行方案方法) —->
執(zhí)行器(執(zhí)行時(shí)會(huì)先看用戶是否有執(zhí)行權(quán)限,有才去使用這個(gè)引擎提供的接口) —->
去引擎層獲取數(shù)據(jù)返回(如果開啟查詢緩存則會(huì)緩存查詢結(jié)果)

問(wèn):PHP-FPM與Nginx的通信機(jī)制?

答:兩種方式 1 tcp (ip:端口) 2、unix domain socket

數(shù)組排序

sort() 函數(shù)用于對(duì)數(shù)組單元從低到高進(jìn)行排序。
  rsort() 函數(shù)用于對(duì)數(shù)組單元從高到低進(jìn)行排序。
  asort() 函數(shù)用于對(duì)數(shù)組單元從低到高進(jìn)行排序并保持索引關(guān)系。
  arsort() 函數(shù)用于對(duì)數(shù)組單元從高到低進(jìn)行排序并保持索引關(guān)系。
  ksort() 函數(shù)用于對(duì)數(shù)組單元按照鍵名從低到高進(jìn)行排序。
  krsort() 函數(shù)用于對(duì)數(shù)組單元按照鍵名從高到低進(jìn)行排序。

4.常見的排序算法

冒泡排序

思路分析:在要排序的一組數(shù)中,對(duì)當(dāng)前還未排好的序列,從前往后對(duì)相鄰的兩個(gè)數(shù)依次進(jìn)行比較和調(diào)整,讓較大的數(shù)往下沉,較小的往上冒。即,每當(dāng)兩相鄰的數(shù)比較后發(fā)現(xiàn)它們的排序與排序要求相反時(shí),就將它們互換。

<pre class="prettyprint linenums prettyprinted" style="padding: 10px; margin: 10px 0px; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); white-space: pre-wrap; overflow-wrap: break-word; background: rgb(39, 40, 34); border: 1px solid rgb(221, 221, 221); overflow: hidden; font: 400 12px / 1.6 Helvetica, "Hiragino Sans GB", 微軟雅黑, "Microsoft YaHei UI", SimSun, SimHei, arial, sans-serif; border-radius: 3px; box-shadow: rgb(57, 56, 46) 40px 0px inset, rgb(70, 71, 65) 41px 0px 0px inset; color: rgb(51, 51, 51); letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">

  1. $arr=array(1,43,54,62,21,66,32,78,36,76,39);
  2. function bubbleSort($arr)
  3. {
  4. $len=count($arr);
  5. //該層循環(huán)控制 需要冒泡的輪數(shù)
  6. for($i=0;$i<$len-1;$i++)
  7. { //該層循環(huán)用來(lái)控制每輪 冒出一個(gè)數(shù) 需要比較的次數(shù)
  8. for($k=0;$k<$len-$i-1;$k++)
  9. {
  10. if($arr[$k]>$arr[$k+1])
  11. {
  12. $tmp=$arr[$k+1];
  13. $arr[$k+1]=$arr[$k];
  14. $arr[$k]=$tmp;
  15. }
  16. }
  17. }
  18. return $arr;
  19. }

</pre>

選擇排序

思路分析:在要排序的一組數(shù)中,選出最小的一個(gè)數(shù)與第一個(gè)位置的數(shù)交換。然后在剩下的數(shù)當(dāng)中再找最小的與第二個(gè)位置的數(shù)交換,如此循環(huán)到倒數(shù)第二個(gè)數(shù)和最后一個(gè)數(shù)比較為止

<pre class="prettyprint linenums prettyprinted" style="padding: 10px; margin: 10px 0px; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); white-space: pre-wrap; overflow-wrap: break-word; background: rgb(39, 40, 34); border: 1px solid rgb(221, 221, 221); overflow: hidden; font: 400 12px / 1.6 Helvetica, "Hiragino Sans GB", 微軟雅黑, "Microsoft YaHei UI", SimSun, SimHei, arial, sans-serif; border-radius: 3px; box-shadow: rgb(57, 56, 46) 40px 0px inset, rgb(70, 71, 65) 41px 0px 0px inset; color: rgb(51, 51, 51); letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">

  1. function selectSort($arr) {

  2. //雙重循環(huán)完成,外層控制輪數(shù),內(nèi)層控制比較次數(shù)

  3. $len=count($arr);

  4. for($i=0; $i<$len-1; $i++) {

  5. //先假設(shè)最小的值的位置

  6. $p = $i;

  7. for($j=$i+1; $j<$len; $j++) {

  8. //$arr[$p] 是當(dāng)前已知的最小值

  9. if($arr[$p] > $arr[$j]) {

  10. //比較,發(fā)現(xiàn)更小的,記錄下最小值的位置;并且在下次比較時(shí)采用已知的最小值進(jìn)行比較。

  11. $p = $j;

  12. }

  13. }

  14. //已經(jīng)確定了當(dāng)前的最小值的位置,保存到$p中。如果發(fā)現(xiàn)最小值的位置與當(dāng)前假設(shè)的位置$i不同,則位置互換即可。

  15. if($p != $i) {

  16. $tmp = $arr[$p];

  17. $arr[$p] = $arr[$i];

  18. $arr[$i] = $tmp;

  19. }

  20. }

  21. //返回最終結(jié)果

  22. return $arr;

  23. }

</pre>

插入排序

思路分析:在要排序的一組數(shù)中,假設(shè)前面的數(shù)已經(jīng)是排好順序的,現(xiàn)在要把第n個(gè)數(shù)插到前面的有序數(shù)中,使得這n個(gè)數(shù)也是排好順序的。如此反復(fù)循環(huán),直到全部排好順序。

代碼實(shí)現(xiàn):

<pre class="prettyprint linenums prettyprinted" style="padding: 10px; margin: 10px 0px; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); white-space: pre-wrap; overflow-wrap: break-word; background: rgb(39, 40, 34); border: 1px solid rgb(221, 221, 221); overflow: hidden; font: 400 12px / 1.6 Helvetica, "Hiragino Sans GB", 微軟雅黑, "Microsoft YaHei UI", SimSun, SimHei, arial, sans-serif; border-radius: 3px; box-shadow: rgb(57, 56, 46) 40px 0px inset, rgb(70, 71, 65) 41px 0px 0px inset; color: rgb(51, 51, 51); letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">

  1. function insertSort($arr) {
  2. $len=count($arr);
  3. for($i=1, $i<$len; $i++) {
  4. $tmp = $arr[$i];
  5. //內(nèi)層循環(huán)控制,比較并插入
  6. for($j=$i-1;$j>=0;$j--) {
  7. if($tmp < $arr[$j]) {
  8. //發(fā)現(xiàn)插入的元素要小,交換位置,將后邊的元素與前面的元素互換
  9. $arr[$j+1] = $arr[$j];
  10. $arr[$j] = $tmp;
  11. } else {
  12. //如果碰到不需要移動(dòng)的元素,由于是已經(jīng)排序好是數(shù)組,則前面的就不需要再次比較了。
  13. break;
  14. }
  15. }
  16. }
  17. return $arr;
  18. }

</pre>

4.快速排序

思路分析:選擇一個(gè)基準(zhǔn)元素,通常選擇第一個(gè)元素或者最后一個(gè)元素。通過(guò)一趟掃描,將待排序列分成兩部分,一部分比基準(zhǔn)元素小,一部分大于等于基準(zhǔn)元素。此時(shí)基準(zhǔn)元素在其排好序后的正確位置,然后再用同樣的方法遞歸地排序劃分的兩部分。

代碼實(shí)現(xiàn):

<pre class="prettyprint linenums prettyprinted" style="padding: 10px; margin: 10px 0px; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); white-space: pre-wrap; overflow-wrap: break-word; background: rgb(39, 40, 34); border: 1px solid rgb(221, 221, 221); overflow: hidden; font: 400 12px / 1.6 Helvetica, "Hiragino Sans GB", 微軟雅黑, "Microsoft YaHei UI", SimSun, SimHei, arial, sans-serif; border-radius: 3px; box-shadow: rgb(57, 56, 46) 40px 0px inset, rgb(70, 71, 65) 41px 0px 0px inset; color: rgb(51, 51, 51); letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">

  1. function quickSort($arr) {
  2. //先判斷是否需要繼續(xù)進(jìn)行
  3. $length = count($arr);
  4. if($length <= 1) {
  5. return $arr;
  6. }
  7. //選擇第一個(gè)元素作為基準(zhǔn)
  8. $base_num = $arr[0];
  9. //遍歷除了標(biāo)尺外的所有元素,按照大小關(guān)系放入兩個(gè)數(shù)組內(nèi)
  10. //初始化兩個(gè)數(shù)組
  11. $left_array = array(); //小于基準(zhǔn)的
  12. $right_array = array(); //大于基準(zhǔn)的
  13. for($i=1; $i<$length; $i++) {
  14. if($base_num > $arr[$i]) {
  15. //放入左邊數(shù)組
  16. $left_array[] = $arr[$i];
  17. } else {
  18. //放入右邊
  19. $right_array[] = $arr[$i];
  20. }
  21. }
  22. //再分別對(duì)左邊和右邊的數(shù)組進(jìn)行相同的排序處理方式遞歸調(diào)用這個(gè)函數(shù)
  23. $left_array = quick_sort($left_array);
  24. $right_array = quick_sort($right_array);
  25. //合并
  26. return array_merge($left_array, array($base_num), $right_array);
  27. }

</pre>

memcache 和 Redis 的區(qū)別

數(shù)據(jù)結(jié)構(gòu):memcache僅支持簡(jiǎn)單的key-value形式,Redis支持的數(shù)據(jù)更多(string字符串,set集合,list列表,hash散列,zset有序集合);
多線程:memcache支持多線程,Redis支持單線程
持久化:Redis支持持久化,memcache不支持持久化
分布式:Redis做主從結(jié)構(gòu),memcache服務(wù)器需要通過(guò)hash一致化來(lái)支撐主從結(jié)構(gòu)

什么是 Redis 穿透和雪崩 緩存擊穿

緩存穿透:就是訪問(wèn)redis中一個(gè)不存在的key的時(shí)候,會(huì)直接穿過(guò)緩存,去數(shù)據(jù)庫(kù)中進(jìn)行查詢.
緩存雪崩:就是每秒有5000個(gè)請(qǐng)求過(guò)來(lái)時(shí)候,redis緩存庫(kù)崩了,然后這些請(qǐng)求瞬間落在了mysql數(shù)據(jù)庫(kù)上,直接導(dǎo)致數(shù)據(jù)庫(kù)死機(jī).
緩存擊穿:簡(jiǎn)單地說(shuō)就是緩存過(guò)期大量線程訪問(wèn)數(shù)據(jù)庫(kù)

說(shuō)說(shuō)對(duì) SQL 語(yǔ)句優(yōu)化有哪些方法?

不用*來(lái)代替所有列名,盡量采用與訪問(wèn)表相關(guān)的實(shí)際列名;
盡量減少表的查詢次數(shù)。
對(duì)查詢進(jìn)行優(yōu)化,應(yīng)盡量避免全表掃描,首先應(yīng)考慮在 where 及 order by 涉及的列上建立索引。
應(yīng)盡量避免在 where 子句中對(duì)字段進(jìn)行表達(dá)式操作,這將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描

Mysql 中有哪幾種鎖

MyISAM支持表鎖,InnoDB支持表鎖和行鎖,默認(rèn)為行鎖

  • 表級(jí)鎖:開銷小,加鎖快,不會(huì)出現(xiàn)死鎖。鎖定粒度大,發(fā)生鎖沖突的概率最高,并發(fā)量最低

  • 行級(jí)鎖:開銷大,加鎖慢,會(huì)出現(xiàn)死鎖。鎖力度小,發(fā)生鎖沖突的概率小,并發(fā)度最高

    如何處理負(fù)載、高并發(fā)

  1. 動(dòng)靜分類
  2. 添加cdn,同時(shí)可以把圖片等保存的cos對(duì)象儲(chǔ)存中
  3. 使用負(fù)載均衡
  4. 合理添加緩存,最好是以內(nèi)存為基礎(chǔ)的緩存如redis
  5. 添加redis分布式鎖
  6. 前端頁(yè)面合理設(shè)計(jì),避免高速點(diǎn)擊的狀況出現(xiàn)
  7. 添加隊(duì)列來(lái)處理高并發(fā)
  8. 使用數(shù)據(jù)庫(kù)連接池
  9. 對(duì)數(shù)據(jù)庫(kù)及程序優(yōu)化,分庫(kù)分表

為什么要使用分布式鎖

分布式系統(tǒng)要訪問(wèn)共享資源,為了避免并發(fā)訪問(wèn)資源帶來(lái)錯(cuò)誤,我們?yōu)楣蚕碣Y源添加一把鎖,讓各個(gè)訪問(wèn)互斥,保證并發(fā)訪問(wèn)的安全性

單線程的redis如何實(shí)現(xiàn)阻塞隊(duì)列

整個(gè)阻塞執(zhí)行過(guò)程相當(dāng)于是分散開的,每次請(qǐng)求結(jié)束后都判斷之前的阻塞列表是否滿足執(zhí)行條件,類似我們用輪詢來(lái)實(shí)現(xiàn)長(zhǎng)連接的功能。所以看似阻塞的命令對(duì)其他命令的執(zhí)行時(shí)不會(huì)有影響的,它們依然是單線程的。

消息中間件

基于隊(duì)列與消息傳遞,降低系統(tǒng)耦合,提高系統(tǒng)響應(yīng)速度,突破系統(tǒng)性能瓶頸。削鋒,解耦

PHP網(wǎng)絡(luò)通信是如何實(shí)現(xiàn)的

基于socket實(shí)現(xiàn),可以用到現(xiàn)在的swoole,wokerman等

MySQL分庫(kù)分表策略 (根據(jù)id取模)

1要確定需要將數(shù)據(jù)平均分配到多少?gòu)埍碇?,也就是:表容?br> 2有100張表進(jìn)行存儲(chǔ),則我們?cè)谶M(jìn)行存儲(chǔ)數(shù)據(jù)的時(shí)候,首先對(duì)用戶ID進(jìn)行取模操作,根據(jù) user_id%100 獲取對(duì)應(yīng)的表進(jìn)行存儲(chǔ)查詢操作
3例如,user_id = 101 那么,我們?cè)讷@取值的時(shí)候的操作,可以通過(guò)下邊的sql語(yǔ)句:

<pre class="prettyprint linenums prettyprinted" style="padding: 10px; margin: 10px 0px; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); white-space: pre-wrap; overflow-wrap: break-word; background: rgb(39, 40, 34); border: 1px solid rgb(221, 221, 221); overflow: hidden; font: 400 12px / 1.6 Helvetica, "Hiragino Sans GB", 微軟雅黑, "Microsoft YaHei UI", SimSun, SimHei, arial, sans-serif; border-radius: 3px; box-shadow: rgb(57, 56, 46) 40px 0px inset, rgb(70, 71, 65) 41px 0px 0px inset; color: rgb(51, 51, 51); letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">

  1. select * from order_1 where user_id= 101

</pre>

其中,order_1是根據(jù) 101%100 計(jì)算所得,表示分表之后的第一章order表。

事務(wù)的其特性有哪些?mysql是否支持嵌套事務(wù)?(默認(rèn)不支持)

所謂事務(wù)就是針對(duì)數(shù)據(jù)庫(kù)的一組操作,它可以由一條或者多條SQL語(yǔ)句組成,同一個(gè)事務(wù)的操作具備同步的特點(diǎn),如果其中有一條語(yǔ)句不能執(zhí)行的話,那么所有的語(yǔ)句都不會(huì)執(zhí)行
(1)原子性: 原子性是指事務(wù)是一個(gè)不可再分割的工作單位,事務(wù)中的操作要么都發(fā)生,要么都不發(fā)生。

(2)一致性:一致性是指在事務(wù)開始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫(kù)的完整性約束沒(méi)有被破壞。這是說(shuō)數(shù)據(jù)庫(kù)事務(wù)不能破壞關(guān)系數(shù)據(jù)的完整性以及業(yè)務(wù)邏輯上的一致性。

(3)隔離性:隔離性是指并發(fā)的事務(wù)是相互隔離的。即一個(gè)事務(wù)內(nèi)部的操作及正在操作的數(shù)據(jù)必須封鎖起來(lái),不被企圖進(jìn)行修改的事務(wù)看到 。

(4)持久性:持久性是指在事務(wù)完成以后,該事務(wù)所對(duì)數(shù)據(jù)庫(kù)所作的更改便持久的保存在數(shù)據(jù)庫(kù)之中,并不會(huì)被回滾。 即使出現(xiàn)了任何事故比如斷電等,事務(wù)一旦提交,則持久化保存在數(shù)據(jù)庫(kù)中

$this和self、parent這三個(gè)關(guān)鍵詞分別代表什么?在哪些場(chǎng)合下使用?

$this:當(dāng)前對(duì)象

self: 當(dāng)前類

parent: 當(dāng)前類的父類

$this在當(dāng)前類中使用,使用->調(diào)用屬性和方法。

self也在當(dāng)前類中使用,不過(guò)需要使用::調(diào)用。

靜態(tài)屬性,不能在類里使用$this訪問(wèn),應(yīng)該使用self后跟范圍解析操作符(::),后面是帶著美元符號(hào)的變量名。

PHP的性能優(yōu)化方法總結(jié)

  1. 多用PHP自身能力解決問(wèn)題
  2. 多使用PHP內(nèi)置的變量、常量、函數(shù)
  3. 少用PHP魔術(shù)方法
  4. 利用unset()及時(shí)釋放不使用的內(nèi)存
  5. 做PHP擅長(zhǎng)的事情
  6. 盡量靜態(tài)化
  7. 盡量的少進(jìn)行文件操作,雖然PHP的文件操作效率也不低的
  8. 其他自行挖掘

安全對(duì)一套程序來(lái)說(shuō)至關(guān)重要,請(qǐng)說(shuō)說(shuō)在開發(fā)中應(yīng)該注意哪些安全機(jī)制?

  1. 防遠(yuǎn)程提交
  2. 防止SQL注入,對(duì)特殊代碼進(jìn)行過(guò)濾
  3. 防止注冊(cè)灌水,使用驗(yàn)證碼
  4. 數(shù)據(jù)加密處理等等

TCP長(zhǎng)連接與短連接的區(qū)別,各自的優(yōu)點(diǎn)與缺點(diǎn),以及其使用場(chǎng)景

https://blog.csdn.net/weixin_41563161/article/details/105529382

  1. 長(zhǎng)連接的操作步驟是:建立連接->數(shù)據(jù)傳輸…(保持連接)…數(shù)據(jù)傳輸->關(guān)閉連接。

  2. 短連接的步驟是:建立連接->數(shù)據(jù)傳輸->關(guān)閉連接…建立連接->數(shù)據(jù)傳輸->關(guān)閉連接。

  3. 長(zhǎng)鏈接做聊天室類似場(chǎng)景,短鏈接做網(wǎng)站場(chǎng)景

    36. 遍歷兩個(gè)一位數(shù)組最后的結(jié)果

<pre class="prettyprint linenums prettyprinted" style="padding: 10px; margin: 10px 0px; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); white-space: pre-wrap; overflow-wrap: break-word; background: rgb(39, 40, 34); border: 1px solid rgb(221, 221, 221); overflow: hidden; font: 400 12px / 1.6 Helvetica, "Hiragino Sans GB", 微軟雅黑, "Microsoft YaHei UI", SimSun, SimHei, arial, sans-serif; border-radius: 3px; box-shadow: rgb(57, 56, 46) 40px 0px inset, rgb(70, 71, 65) 41px 0px 0px inset; color: rgb(51, 51, 51); letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">

  1. $a = [1,2,3];
  2. foreach($a as &$v){
  3. //啥也不干
  4. }
  5. p($a); 1 2 3
  6. foreach($a as $v){
  7. //啥也不干
  8. }
  9. p($a); 1 2 2

</pre>

運(yùn)算符題 //+= 與-=優(yōu)先級(jí)一致,靠右原則

<pre class="prettyprint linenums prettyprinted" style="padding: 10px; margin: 10px 0px; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); white-space: pre-wrap; overflow-wrap: break-word; background: rgb(39, 40, 34); border: 1px solid rgb(221, 221, 221); overflow: hidden; font: 400 12px / 1.6 Helvetica, "Hiragino Sans GB", 微軟雅黑, "Microsoft YaHei UI", SimSun, SimHei, arial, sans-serif; border-radius: 3px; box-shadow: rgb(57, 56, 46) 40px 0px inset, rgb(70, 71, 65) 41px 0px 0px inset; color: rgb(51, 51, 51); letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">

  1. $a = 3;
  2. $a += $a -= $a*$a;
  3. $a = ?;//$a += $a-($a*$a) $a = -6+(-6) = -12

</pre>

2. TCP/IP協(xié)議支持哪些協(xié)議? //面試的時(shí)候是多選題,沒(méi)選全······

計(jì)算函數(shù)

<pre class="prettyprint linenums prettyprinted" style="padding: 10px; margin: 10px 0px; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); white-space: pre-wrap; overflow-wrap: break-word; background: rgb(39, 40, 34); border: 1px solid rgb(221, 221, 221); overflow: hidden; font: 400 12px / 1.6 Helvetica, "Hiragino Sans GB", 微軟雅黑, "Microsoft YaHei UI", SimSun, SimHei, arial, sans-serif; border-radius: 3px; box-shadow: rgb(57, 56, 46) 40px 0px inset, rgb(70, 71, 65) 41px 0px 0px inset; color: rgb(51, 51, 51); letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">

  1. function f(x){
  2. return x>0 ?x*f(x-1) :2;
  3. }
  4. 求f(f(1));
  5. A:無(wú)限遞歸,B:2 ,C:4, D:8
  6. 答:C

</pre>

localhost與127.0.01的區(qū)別

  1. localhot(local)是不經(jīng)網(wǎng)卡傳輸!這點(diǎn)很重要,它不受網(wǎng)絡(luò)防火墻和網(wǎng)卡相關(guān)的的限制。
  2. 127.0.0.1是通過(guò)網(wǎng)卡傳輸,依賴網(wǎng)卡,并受到網(wǎng)絡(luò)防火墻和網(wǎng)卡相關(guān)的限制。
  3. 一般設(shè)置程序時(shí)本地服務(wù)用localhost是最好的,localhost不會(huì)解析成ip,也不會(huì)占用網(wǎng)卡、網(wǎng)絡(luò)資源

Select Count (*)和Select Count(1)以及Select Count(column)區(qū)別

  1. 一般情況下,Select Count (*)和Select Count(1)兩者的返回結(jié)果是一樣的
  2. 假如表沒(méi)有主鍵(PK), 那么count(1)比count()快, 如果有主鍵PK的話,那count(主鍵)最快, 如果你的表只有一個(gè)字段的話那count()就是最快的
  3. count(*) 跟 count(1) 的結(jié)果一樣,都包括對(duì)NULL的統(tǒng)計(jì),而count(column) 是不包括NULL的統(tǒng)計(jì)
  4. count(column) 是表示結(jié)果集中有多少個(gè)column字段不為空的記錄

列關(guān)于PHP中大小寫說(shuō)法正確的是

  1. 內(nèi)置的結(jié)構(gòu)以及關(guān)鍵字、用戶定義的類和函數(shù)是不區(qū)分大小寫
  2. 變量名嚴(yán)格區(qū)分大小寫
  3. 常量名可以通過(guò)define()進(jìn)行設(shè)置是否對(duì)大小寫敏感,詳細(xì)內(nèi)容見下圖:
  4. 魔術(shù)常量是不區(qū)分大小寫的

git cvs svn

CVS及SVN都是集中式的版本控制系統(tǒng),而Git是分布式版本控制系統(tǒng)
Git 中的分支,其實(shí)本質(zhì)上僅僅是個(gè)指向 commit 對(duì)象的可變指針

mysql索引不會(huì)命中的情況

  1. 如果條件中有 or ,即使其中有條件帶索引也不會(huì)命中(這也是為什么盡量少用or的原因)
    注意:要想使用or,又想讓索引生效,只能將or條件中的每個(gè)列都加上索引如果出現(xiàn)OR的一個(gè)條件沒(méi)有索引時(shí),建議使用 union ,拼接多個(gè)查詢語(yǔ)句
  2. like查詢是以%開頭,如果是int型索引不會(huì)命中,字符型的命中’test%’百分號(hào)只有在右邊才可以命中
  3. 如果列類型是字符串,那一定要在條件中將數(shù)據(jù)使用引號(hào)引用起來(lái),否則不使用索引
  4. 沒(méi)有查詢條件,或者查詢條件沒(méi)有建立索引
  5. 查詢條件中,在索引列上使用函數(shù)(+, - ,*,/), 這種情況下需建立函數(shù)索引
  6. 采用 not in, not exist
  7. B-tree 索引 is null 不會(huì)走, is not null 會(huì)走
  8. 聯(lián)合索引遵循最左原則,不滿足的不會(huì)命中
  9. 鏈表時(shí),如果關(guān)聯(lián)字段的的編碼不同,也不會(huì)走索引。如一個(gè)表時(shí) utf8,另外一個(gè)表是utf8mb4

varchar char

  1. Varchar 對(duì)每個(gè)英文(ASCII)字符都占用2個(gè)字節(jié),對(duì)一個(gè)漢字也只占用兩個(gè)字節(jié)
  2. char 對(duì)英文(ASCII)字符占用1個(gè)字節(jié),對(duì)一個(gè)漢字占用2個(gè)字節(jié)

$_REQUESt

默認(rèn)情況下包含了 _GET,_POST 和 $_COOKIE 的數(shù)組

psr規(guī)范

此處的“類”泛指所有的class類、接口、traits可復(fù)用代碼塊以及其他類似結(jié)構(gòu)。
一個(gè)完整的類名需要具有以下結(jié)構(gòu)
<命名空間>(<子命名空間>)*<類名>
1.完整的類名必須要有一個(gè)頂級(jí)命名空間,被稱為“Vendor namespace”
2.完成的類名可以有一個(gè)或多個(gè)子命名空間
3.完整的類名必須有一個(gè)最終的類名
4.完整的類名中任意一部分中的下劃線都是沒(méi)有特殊意義的
5.完整的類名可以由任意大小寫字母組成
6.所有類名都必須是大小寫敏感的
當(dāng)根據(jù)完整的類名載入相應(yīng)的文件……
1.完整的類名中,去掉最前面的命名空間分隔符,前面連續(xù)的一個(gè)或多個(gè)命名空間和子命名空間,作為“命名空間前綴”,其必須與至少一個(gè)“文件基目錄”相對(duì)應(yīng)。
2.緊接命名空間前綴后的子命名空間必須與相對(duì)應(yīng)的“文件基目錄”相匹配,其中的命名空間分隔符作為目錄分割符
3.末尾的類名必須與對(duì)應(yīng)的.php為后綴的文件同名
4.自動(dòng)加載器(autoloader)的實(shí)現(xiàn)一定不能拋出異常,一定不能觸發(fā)任一級(jí)別的錯(cuò)誤信息以及不應(yīng)該有返回值。

Redis支持五種數(shù)據(jù)類型:

  1. string(字符串),
  2. hash(哈希),
  3. list(列表),
  4. set(集合)及
  5. zset(sorted set:有序集合)。

以上就是最全最詳細(xì)的PHP面試題(帶有答案)的詳細(xì)內(nèi)容

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容