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;">
$a=[0,1,2,3]; $b=[1,2,3,4,5];$a += $b;//Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 5 )
</pre>
echo、print_r、print、var_dump
- echo、print是php語(yǔ)句,var_dump和print_r是函數(shù)
- echo 輸出一個(gè)或多個(gè)字符串,中間以逗號(hào)隔開,沒(méi)有返回值是語(yǔ)言結(jié)構(gòu)而不是真正的函數(shù),因此不能作為表達(dá)式的一部分使用
- print也是php的一個(gè)關(guān)鍵字,有返回值 只能打印出簡(jiǎn)單類型變量的值(如int,string),如果字符串顯示成功則返回true,否則返回false
- print_r 可以打印出復(fù)雜類型變量的值(如數(shù)組、對(duì)象)以列表的形式顯示,并以array、object開頭,但print_r輸出布爾值和NULL的結(jié)果沒(méi)有意義,因?yàn)槎际谴蛴 盶n”,因此var_dump()函數(shù)更適合調(diào)試
- 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
array2 = array(“b” => “green”, “yellow”, “red”);
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;">
$array1 =[1,2,5,11,32,15,77];$array2 = [99,32,15,5,1,77];$result = array_diff($array1, $array2);$result2 = array_diff($array2, $array1);$s = array_diff( array_merge($array1+$array2) ,array_merge($result,$result2));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;">
$arr=array(1,43,54,62,21,66,32,78,36,76,39);function bubbleSort($arr){$len=count($arr);//該層循環(huán)控制 需要冒泡的輪數(shù)for($i=0;$i<$len-1;$i++){ //該層循環(huán)用來(lái)控制每輪 冒出一個(gè)數(shù) 需要比較的次數(shù)for($k=0;$k<$len-$i-1;$k++){if($arr[$k]>$arr[$k+1]){$tmp=$arr[$k+1];$arr[$k+1]=$arr[$k];$arr[$k]=$tmp;}}}return $arr;}
</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;">
function selectSort($arr) {//雙重循環(huán)完成,外層控制輪數(shù),內(nèi)層控制比較次數(shù)$len=count($arr);for($i=0; $i<$len-1; $i++) {//先假設(shè)最小的值的位置$p = $i;for($j=$i+1; $j<$len; $j++) {//$arr[$p] 是當(dāng)前已知的最小值if($arr[$p] > $arr[$j]) {//比較,發(fā)現(xiàn)更小的,記錄下最小值的位置;并且在下次比較時(shí)采用已知的最小值進(jìn)行比較。$p = $j;}}//已經(jīng)確定了當(dāng)前的最小值的位置,保存到$p中。如果發(fā)現(xiàn)最小值的位置與當(dāng)前假設(shè)的位置$i不同,則位置互換即可。if($p != $i) {$tmp = $arr[$p];$arr[$p] = $arr[$i];$arr[$i] = $tmp;}}//返回最終結(jié)果return $arr;}
</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;">
function insertSort($arr) {$len=count($arr);for($i=1, $i<$len; $i++) {$tmp = $arr[$i];//內(nèi)層循環(huán)控制,比較并插入for($j=$i-1;$j>=0;$j--) {if($tmp < $arr[$j]) {//發(fā)現(xiàn)插入的元素要小,交換位置,將后邊的元素與前面的元素互換$arr[$j+1] = $arr[$j];$arr[$j] = $tmp;} else {//如果碰到不需要移動(dòng)的元素,由于是已經(jīng)排序好是數(shù)組,則前面的就不需要再次比較了。break;}}}return $arr;}
</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;">
function quickSort($arr) {//先判斷是否需要繼續(xù)進(jìn)行$length = count($arr);if($length <= 1) {return $arr;}//選擇第一個(gè)元素作為基準(zhǔn)$base_num = $arr[0];//遍歷除了標(biāo)尺外的所有元素,按照大小關(guān)系放入兩個(gè)數(shù)組內(nèi)//初始化兩個(gè)數(shù)組$left_array = array(); //小于基準(zhǔn)的$right_array = array(); //大于基準(zhǔn)的for($i=1; $i<$length; $i++) {if($base_num > $arr[$i]) {//放入左邊數(shù)組$left_array[] = $arr[$i];} else {//放入右邊$right_array[] = $arr[$i];}}//再分別對(duì)左邊和右邊的數(shù)組進(jìn)行相同的排序處理方式遞歸調(diào)用這個(gè)函數(shù)$left_array = quick_sort($left_array);$right_array = quick_sort($right_array);//合并return array_merge($left_array, array($base_num), $right_array);}
</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ā)
- 動(dòng)靜分類
- 添加cdn,同時(shí)可以把圖片等保存的cos對(duì)象儲(chǔ)存中
- 使用負(fù)載均衡
- 合理添加緩存,最好是以內(nèi)存為基礎(chǔ)的緩存如redis
- 添加redis分布式鎖
- 前端頁(yè)面合理設(shè)計(jì),避免高速點(diǎn)擊的狀況出現(xiàn)
- 添加隊(duì)列來(lái)處理高并發(fā)
- 使用數(shù)據(jù)庫(kù)連接池
- 對(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;">
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é)
- 多用PHP自身能力解決問(wèn)題
- 多使用PHP內(nèi)置的變量、常量、函數(shù)
- 少用PHP魔術(shù)方法
- 利用unset()及時(shí)釋放不使用的內(nèi)存
- 做PHP擅長(zhǎng)的事情
- 盡量靜態(tài)化
- 盡量的少進(jìn)行文件操作,雖然PHP的文件操作效率也不低的
- 其他自行挖掘
安全對(duì)一套程序來(lái)說(shuō)至關(guān)重要,請(qǐng)說(shuō)說(shuō)在開發(fā)中應(yīng)該注意哪些安全機(jī)制?
- 防遠(yuǎn)程提交
- 防止SQL注入,對(duì)特殊代碼進(jìn)行過(guò)濾
- 防止注冊(cè)灌水,使用驗(yàn)證碼
- 數(shù)據(jù)加密處理等等
TCP長(zhǎng)連接與短連接的區(qū)別,各自的優(yōu)點(diǎn)與缺點(diǎn),以及其使用場(chǎng)景
https://blog.csdn.net/weixin_41563161/article/details/105529382
長(zhǎng)連接的操作步驟是:建立連接->數(shù)據(jù)傳輸…(保持連接)…數(shù)據(jù)傳輸->關(guān)閉連接。
短連接的步驟是:建立連接->數(shù)據(jù)傳輸->關(guān)閉連接…建立連接->數(shù)據(jù)傳輸->關(guān)閉連接。
-
長(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;">
$a = [1,2,3];foreach($a as &$v){//啥也不干}p($a); 1 2 3foreach($a as $v){//啥也不干}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;">
$a = 3;$a += $a -= $a*$a;$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;">
function f(x){return x>0 ?x*f(x-1) :2;}求f(f(1));A:無(wú)限遞歸,B:2 ,C:4, D:8答:C
</pre>
localhost與127.0.01的區(qū)別
- localhot(local)是不經(jīng)網(wǎng)卡傳輸!這點(diǎn)很重要,它不受網(wǎng)絡(luò)防火墻和網(wǎng)卡相關(guān)的的限制。
- 127.0.0.1是通過(guò)網(wǎng)卡傳輸,依賴網(wǎng)卡,并受到網(wǎng)絡(luò)防火墻和網(wǎng)卡相關(guān)的限制。
- 一般設(shè)置程序時(shí)本地服務(wù)用localhost是最好的,localhost不會(huì)解析成ip,也不會(huì)占用網(wǎng)卡、網(wǎng)絡(luò)資源
Select Count (*)和Select Count(1)以及Select Count(column)區(qū)別
- 一般情況下,Select Count (*)和Select Count(1)兩者的返回結(jié)果是一樣的
- 假如表沒(méi)有主鍵(PK), 那么count(1)比count()快, 如果有主鍵PK的話,那count(主鍵)最快, 如果你的表只有一個(gè)字段的話那count()就是最快的
- count(*) 跟 count(1) 的結(jié)果一樣,都包括對(duì)NULL的統(tǒng)計(jì),而count(column) 是不包括NULL的統(tǒng)計(jì)
- count(column) 是表示結(jié)果集中有多少個(gè)column字段不為空的記錄
列關(guān)于PHP中大小寫說(shuō)法正確的是
- 內(nèi)置的結(jié)構(gòu)以及關(guān)鍵字、用戶定義的類和函數(shù)是不區(qū)分大小寫
- 變量名嚴(yán)格區(qū)分大小寫
- 常量名可以通過(guò)define()進(jìn)行設(shè)置是否對(duì)大小寫敏感,詳細(xì)內(nèi)容見下圖:
- 魔術(shù)常量是不區(qū)分大小寫的
git cvs svn
CVS及SVN都是集中式的版本控制系統(tǒng),而Git是分布式版本控制系統(tǒng)
Git 中的分支,其實(shí)本質(zhì)上僅僅是個(gè)指向 commit 對(duì)象的可變指針
mysql索引不會(huì)命中的情況
- 如果條件中有 or ,即使其中有條件帶索引也不會(huì)命中(這也是為什么盡量少用or的原因)
注意:要想使用or,又想讓索引生效,只能將or條件中的每個(gè)列都加上索引如果出現(xiàn)OR的一個(gè)條件沒(méi)有索引時(shí),建議使用 union ,拼接多個(gè)查詢語(yǔ)句 - like查詢是以%開頭,如果是int型索引不會(huì)命中,字符型的命中’test%’百分號(hào)只有在右邊才可以命中
- 如果列類型是字符串,那一定要在條件中將數(shù)據(jù)使用引號(hào)引用起來(lái),否則不使用索引
- 沒(méi)有查詢條件,或者查詢條件沒(méi)有建立索引
- 查詢條件中,在索引列上使用函數(shù)(+, - ,*,/), 這種情況下需建立函數(shù)索引
- 采用 not in, not exist
- B-tree 索引 is null 不會(huì)走, is not null 會(huì)走
- 聯(lián)合索引遵循最左原則,不滿足的不會(huì)命中
- 鏈表時(shí),如果關(guān)聯(lián)字段的的編碼不同,也不會(huì)走索引。如一個(gè)表時(shí) utf8,另外一個(gè)表是utf8mb4
varchar char
- Varchar 對(duì)每個(gè)英文(ASCII)字符都占用2個(gè)字節(jié),對(duì)一個(gè)漢字也只占用兩個(gè)字節(jié)
- char 對(duì)英文(ASCII)字符占用1個(gè)字節(jié),對(duì)一個(gè)漢字占用2個(gè)字節(jié)
$_REQUESt
默認(rèn)情況下包含了 _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ù)類型:
- string(字符串),
- hash(哈希),
- list(列表),
- set(集合)及
- zset(sorted set:有序集合)。
以上就是最全最詳細(xì)的PHP面試題(帶有答案)的詳細(xì)內(nèi)容
