1、FILE表示什么意思?(5分)
文件的完整路徑和文件名准夷。如果用在包含文件中,則返回包含文件名莺掠。自 PHP 4.0.2 起冕象,FILE 總是包含一個絕對路徑,而在此之前的版本有時會包含一個相對路徑汁蝶。
2渐扮、如何獲取客戶端的IP地址?(5分)
$_SERVER[‘REMOTE_ADDR’]
3掖棉、寫出使用header函數(shù)跳轉(zhuǎn)頁面的語句(5分)
Header(‘location:index.php’);
4墓律、$str是一段html文本,使用正則表達(dá)式去除其中的所有js腳本(5分)
$pattern = ‘/<script.*>\.+<\/script>/’; Preg_replace($pattern,’’,$str);
5幔亥、寫出將一個數(shù)組里的空值去掉的語句(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ù),及打印前一天的時間的方法(格式:年-月-日 時:分:秒) (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)化為包含各個數(shù)字的數(shù)組香伴?(5分)
$arr = explode(“,”,$str);
9慰枕、serialize() /unserialize()函數(shù)的作用(5分)
serialize()和unserialize()在php手冊上的解釋是:
serialize — 產(chǎn)生一個可存儲的值的表示,返回值為字符串即纲,此字符串包含了表示 value 的字節(jié)流具帮,不丟失其類型和結(jié)構(gòu),可以存儲于任何地方。
unserialize — 從已存儲的表示中創(chuàng)建 PHP 的值
具體用法:
$arr = array(“測試1″,”測試2″,”測試3″);//數(shù)組 $sarr = serialize($arr);//產(chǎn)生一個可存儲的值(用于存儲)
//用任意方法(例如:你要是吧$sarr存在一個文本文件中你就可以用file_get_contents取得)得到存儲的值保存在$newarr中蜂厅;
$unsarr=unserialize($newarr);//從已存儲的表示中創(chuàng)建 PHP 的值
10匪凡、寫出一個函數(shù),參數(shù)為年份和月份掘猿,輸出結(jié)果為指定月的天數(shù)(5分)
Function day_count($year,$month){ Echo date(“t”,strtotime($year.”-”.$month.”-1”)); }
11病游、一個文件的路徑為/wwwroot/include/page.class.php,寫出獲得該文件擴(kuò)展名的方法(5分)
$arr = pathinfo(“/wwwroot/include/page.class.php”);
$str = substr($arr[‘basename’],strrpos($arr[‘basename’],’.’));
12稠通、你使用過哪種PHP的模板引擎衬衬?(5分)
Smarty,thinkphp自帶的模板引擎
13、請簡單寫一個類采记,實例化這個類佣耐,并寫出調(diào)用該類的屬性和方法的語句(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ù)庫db_test里已建有表friend唧龄,數(shù)據(jù)庫的連接用戶為root,密碼為123
friend表字段為:id,name,age,gender,phone,email
請使用php連接mysql奸远,選擇出friend表里age > 20的所有記錄打印結(jié)果既棺,并統(tǒng)計出查詢出的結(jié)果總數(shù)。(5分)
<?php
$link = Mysql_connect(“l(fā)ocalhost”,”root”,”123”) or die(“數(shù)據(jù)庫連接失敗!”);
Mysql_select_db(“db_test”,$link) or die(“選擇數(shù)據(jù)庫失敗!”);
$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懒叛、以下有兩個表
user表 字段id (int)丸冕,name (varchar)
score表 字段uid (int),subject (varchar) 薛窥,score (int)
score表的uid字段與user表的id字段關(guān)聯(lián)
要求寫出以下的sql語句
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在瀏覽器回退時是無害的诅迷,而POST會再次提交請求佩番。
GET請求會被瀏覽器主動cache,而POST不會罢杉,除非手動設(shè)置趟畏。
GET請求只能進(jìn)行url編碼,而POST支持多種編碼方式
GET請求在URL中傳送的參數(shù)是有長度限制的滩租,而POST沒有
GET比POST更不安全赋秀,因為參數(shù)直接暴露在URL上,所以不能用來傳遞敏感信息
GET比POST傳輸數(shù)據(jù)量更小
2.require,include 區(qū)別
include在引入不存文件時產(chǎn)生一個警告且腳本還會繼續(xù)執(zhí)行律想,
require則會導(dǎo)致一個致命性錯誤且腳本停止執(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用一個變量保存了整個表的行數(shù)展鸡,InnoDB不保存表的具體行數(shù)
MyISAM支持表級鎖屿衅,InnoDB支持表、行(默認(rèn))級鎖
InnoDB表必須有唯一索引(如主鍵)
MySQL5.5版本開始Innodb已經(jīng)成為Mysql的默認(rèn)引擎(之前是MyISAM)
兩個數(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語句响迂,var_dump和print_r是函數(shù)
- echo 輸出一個或多個字符串,中間以逗號隔開细疚,沒有返回值是語言結(jié)構(gòu)而不是真正的函數(shù)蔗彤,因此不能作為表達(dá)式的一部分使用
- print也是php的一個關(guān)鍵字,有返回值 只能打印出簡單類型變量的值(如int疯兼,string)然遏,如果字符串顯示成功則返回true,否則返回false
- print_r 可以打印出復(fù)雜類型變量的值(如數(shù)組吧彪、對象)以列表的形式顯示待侵,并以array、object開頭姨裸,但print_r輸出布爾值和NULL的結(jié)果沒有意義秧倾,因為都是打印”\n”,因此var_dump()函數(shù)更適合調(diào)試
- var_dump() 判斷一個變量的類型和長度傀缩,并輸出變量的數(shù)值
php中字符串處理函數(shù)
trim 移除空白字符或特定字符 ltrim rtrim
expload 數(shù)組轉(zhuǎn)化成字符串
substr 字符串截取
substr_resplace 子字符串替換
strlen 字符串長度
strtolower
strtoupper
md5
implode
strpos在指定字符串中查找目標(biāo)字符串第一次出現(xiàn)的位置
array_diff
array2 = array(“b” => “green”, “yellow”, “red”);
array1, $array2); //Array ( [1] => blue )
返回array1中有那先,array2中沒有的集合
有兩個數(shù)組[1,2,5,11,32,15,77]和[99,32,15,5,1,77]兩個數(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):同一類型的對象在執(zhí)行同一個方法時,可能表現(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ù)方法 必須 聲明為 public
mysql數(shù)據(jù)庫索引有哪些?什么情況下不適合建立索引运杭?
主鍵索引
普通索引
唯一索引
全文索引
數(shù)據(jù)重復(fù)率高
寫操作多
問:一條SQL語句在MySQL中如何執(zhí)行的夫啊?
答:
客戶端請求 —->
連接器(驗證用戶身份,給予權(quán)限) —->
查詢緩存(存在緩存則直接返回辆憔,不存在則執(zhí)行后續(xù)操作) —->
分析器(對SQL進(jìn)行詞法分析和語法分析操作) —->
優(yōu)化器(主要對執(zhí)行的sql優(yōu)化選擇最優(yōu)的執(zhí)行方案方法) —->
執(zhí)行器(執(zhí)行時會先看用戶是否有執(zhí)行權(quán)限撇眯,有才去使用這個引擎提供的接口) —->
去引擎層獲取數(shù)據(jù)返回(如果開啟查詢緩存則會緩存查詢結(jié)果)
問:PHP-FPM與Nginx的通信機(jī)制?
答:兩種方式 1 tcp (ip:端口) 2躁愿、unix domain socket
數(shù)組排序
sort() 函數(shù)用于對數(shù)組單元從低到高進(jìn)行排序叛本。
rsort() 函數(shù)用于對數(shù)組單元從高到低進(jìn)行排序沪蓬。
asort() 函數(shù)用于對數(shù)組單元從低到高進(jìn)行排序并保持索引關(guān)系彤钟。
arsort() 函數(shù)用于對數(shù)組單元從高到低進(jìn)行排序并保持索引關(guān)系。
ksort() 函數(shù)用于對數(shù)組單元按照鍵名從低到高進(jìn)行排序跷叉。
krsort() 函數(shù)用于對數(shù)組單元按照鍵名從高到低進(jìn)行排序逸雹。
4.常見的排序算法
冒泡排序
思路分析:在要排序的一組數(shù)中,對當(dāng)前還未排好的序列云挟,從前往后對相鄰的兩個數(shù)依次進(jìn)行比較和調(diào)整梆砸,讓較大的數(shù)往下沉,較小的往上冒园欣。即帖世,每當(dāng)兩相鄰的數(shù)比較后發(fā)現(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;">
$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)用來控制每輪 冒出一個數(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ù)中日矫,選出最小的一個數(shù)與第一個位置的數(shù)交換。然后在剩下的數(shù)當(dāng)中再找最小的與第二個位置的數(shù)交換绑榴,如此循環(huán)到倒數(shù)第二個數(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;">
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)更小的,記錄下最小值的位置窃诉;并且在下次比較時采用已知的最小值進(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個數(shù)插到前面的有序數(shù)中,使得這n個數(shù)也是排好順序的脖旱。如此反復(fù)循環(huán)堪遂,直到全部排好順序。
代碼實現(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 {
//如果碰到不需要移動的元素践险,由于是已經(jīng)排序好是數(shù)組猿妈,則前面的就不需要再次比較了。
break;
}
}
}
return $arr;
}
</pre>
4.快速排序
思路分析:選擇一個基準(zhǔn)元素巍虫,通常選擇第一個元素或者最后一個元素彭则。通過一趟掃描,將待排序列分成兩部分占遥,一部分比基準(zhǔn)元素小俯抖,一部分大于等于基準(zhǔn)元素。此時基準(zhǔn)元素在其排好序后的正確位置瓦胎,然后再用同樣的方法遞歸地排序劃分的兩部分芬萍。
代碼實現(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;
}
//選擇第一個元素作為基準(zhǔn)
$base_num = $arr[0];
//遍歷除了標(biāo)尺外的所有元素,按照大小關(guān)系放入兩個數(shù)組內(nèi)
//初始化兩個數(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];
}
}
//再分別對左邊和右邊的數(shù)組進(jìn)行相同的排序處理方式遞歸調(diào)用這個函數(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僅支持簡單的key-value形式搔啊,Redis支持的數(shù)據(jù)更多(string字符串柬祠,set集合,list列表负芋,hash散列漫蛔,zset有序集合);
多線程:memcache支持多線程旧蛾,Redis支持單線程
持久化:Redis支持持久化莽龟,memcache不支持持久化
分布式:Redis做主從結(jié)構(gòu),memcache服務(wù)器需要通過hash一致化來支撐主從結(jié)構(gòu)
什么是 Redis 穿透和雪崩 緩存擊穿
緩存穿透:就是訪問redis中一個不存在的key的時候,會直接穿過緩存,去數(shù)據(jù)庫中進(jìn)行查詢.
緩存雪崩:就是每秒有5000個請求過來時候,redis緩存庫崩了,然后這些請求瞬間落在了mysql數(shù)據(jù)庫上,直接導(dǎo)致數(shù)據(jù)庫死機(jī).
緩存擊穿:簡單地說就是緩存過期大量線程訪問數(shù)據(jù)庫
說說對 SQL 語句優(yōu)化有哪些方法蚜点?
不用*來代替所有列名轧房,盡量采用與訪問表相關(guān)的實際列名;
盡量減少表的查詢次數(shù)绍绘。
對查詢進(jìn)行優(yōu)化奶镶,應(yīng)盡量避免全表掃描迟赃,首先應(yīng)考慮在 where 及 order by 涉及的列上建立索引。
應(yīng)盡量避免在 where 子句中對字段進(jìn)行表達(dá)式操作厂镇,這將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描
Mysql 中有哪幾種鎖
MyISAM支持表鎖纤壁,InnoDB支持表鎖和行鎖,默認(rèn)為行鎖
表級鎖:開銷小捺信,加鎖快酌媒,不會出現(xiàn)死鎖。鎖定粒度大迄靠,發(fā)生鎖沖突的概率最高秒咨,并發(fā)量最低
-
行級鎖:開銷大,加鎖慢掌挚,會出現(xiàn)死鎖雨席。鎖力度小,發(fā)生鎖沖突的概率小吠式,并發(fā)度最高
如何處理負(fù)載陡厘、高并發(fā)
- 動靜分類
- 添加cdn,同時可以把圖片等保存的cos對象儲存中
- 使用負(fù)載均衡
- 合理添加緩存特占,最好是以內(nèi)存為基礎(chǔ)的緩存如redis
- 添加redis分布式鎖
- 前端頁面合理設(shè)計糙置,避免高速點擊的狀況出現(xiàn)
- 添加隊列來處理高并發(fā)
- 使用數(shù)據(jù)庫連接池
- 對數(shù)據(jù)庫及程序優(yōu)化,分庫分表
為什么要使用分布式鎖
分布式系統(tǒng)要訪問共享資源是目,為了避免并發(fā)訪問資源帶來錯誤谤饭,我們?yōu)楣蚕碣Y源添加一把鎖,讓各個訪問互斥胖笛,保證并發(fā)訪問的安全性
單線程的redis如何實現(xiàn)阻塞隊列
整個阻塞執(zhí)行過程相當(dāng)于是分散開的网持,每次請求結(jié)束后都判斷之前的阻塞列表是否滿足執(zhí)行條件宜岛,類似我們用輪詢來實現(xiàn)長連接的功能长踊。所以看似阻塞的命令對其他命令的執(zhí)行時不會有影響的,它們依然是單線程的萍倡。
消息中間件
基于隊列與消息傳遞身弊,降低系統(tǒng)耦合,提高系統(tǒng)響應(yīng)速度列敲,突破系統(tǒng)性能瓶頸阱佛。削鋒,解耦
PHP網(wǎng)絡(luò)通信是如何實現(xiàn)的
基于socket實現(xiàn)戴而,可以用到現(xiàn)在的swoole凑术,wokerman等
MySQL分庫分表策略 (根據(jù)id取模)
1要確定需要將數(shù)據(jù)平均分配到多少張表中,也就是:表容量
2有100張表進(jìn)行存儲所意,則我們在進(jìn)行存儲數(shù)據(jù)的時候淮逊,首先對用戶ID進(jìn)行取模操作催首,根據(jù) user_id%100 獲取對應(yīng)的表進(jìn)行存儲查詢操作
3例如,user_id = 101 那么泄鹏,我們在獲取值的時候的操作郎任,可以通過下邊的sql語句:
<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 計算所得备籽,表示分表之后的第一章order表舶治。
事務(wù)的其特性有哪些?mysql是否支持嵌套事務(wù)车猬?(默認(rèn)不支持)
所謂事務(wù)就是針對數(shù)據(jù)庫的一組操作霉猛,它可以由一條或者多條SQL語句組成,同一個事務(wù)的操作具備同步的特點珠闰,如果其中有一條語句不能執(zhí)行的話韩脏,那么所有的語句都不會執(zhí)行
(1)原子性: 原子性是指事務(wù)是一個不可再分割的工作單位,事務(wù)中的操作要么都發(fā)生铸磅,要么都不發(fā)生赡矢。
(2)一致性:一致性是指在事務(wù)開始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫的完整性約束沒有被破壞阅仔。這是說數(shù)據(jù)庫事務(wù)不能破壞關(guān)系數(shù)據(jù)的完整性以及業(yè)務(wù)邏輯上的一致性吹散。
(3)隔離性:隔離性是指并發(fā)的事務(wù)是相互隔離的。即一個事務(wù)內(nèi)部的操作及正在操作的數(shù)據(jù)必須封鎖起來八酒,不被企圖進(jìn)行修改的事務(wù)看到 空民。
(4)持久性:持久性是指在事務(wù)完成以后,該事務(wù)所對數(shù)據(jù)庫所作的更改便持久的保存在數(shù)據(jù)庫之中羞迷,并不會被回滾界轩。 即使出現(xiàn)了任何事故比如斷電等,事務(wù)一旦提交衔瓮,則持久化保存在數(shù)據(jù)庫中
$this和self浊猾、parent這三個關(guān)鍵詞分別代表什么?在哪些場合下使用热鞍?
$this:當(dāng)前對象
self: 當(dāng)前類
parent: 當(dāng)前類的父類
$this在當(dāng)前類中使用,使用->調(diào)用屬性和方法葫慎。
self也在當(dāng)前類中使用,不過需要使用::調(diào)用薇宠。
靜態(tài)屬性没炒,不能在類里使用$this訪問岂座,應(yīng)該使用self后跟范圍解析操作符(::),后面是帶著美元符號的變量名卿捎。
PHP的性能優(yōu)化方法總結(jié)
- 多用PHP自身能力解決問題
- 多使用PHP內(nèi)置的變量誉简、常量、函數(shù)
- 少用PHP魔術(shù)方法
- 利用unset()及時釋放不使用的內(nèi)存
- 做PHP擅長的事情
- 盡量靜態(tài)化
- 盡量的少進(jìn)行文件操作回梧,雖然PHP的文件操作效率也不低的
- 其他自行挖掘
安全對一套程序來說至關(guān)重要废岂,請說說在開發(fā)中應(yīng)該注意哪些安全機(jī)制铡溪?
- 防遠(yuǎn)程提交
- 防止SQL注入,對特殊代碼進(jìn)行過濾
- 防止注冊灌水泪喊,使用驗證碼
- 數(shù)據(jù)加密處理等等
TCP長連接與短連接的區(qū)別棕硫,各自的優(yōu)點與缺點,以及其使用場景
https://blog.csdn.net/weixin_41563161/article/details/105529382
長連接的操作步驟是:建立連接->數(shù)據(jù)傳輸…(保持連接)…數(shù)據(jù)傳輸->關(guān)閉連接袒啼。
短連接的步驟是:建立連接->數(shù)據(jù)傳輸->關(guān)閉連接…建立連接->數(shù)據(jù)傳輸->關(guān)閉連接哈扮。
-
長鏈接做聊天室類似場景,短鏈接做網(wǎng)站場景
36. 遍歷兩個一位數(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 3
foreach($a as $v){
//啥也不干
}
p($a); 1 2 2
</pre>
運算符題 //+= 與-=優(yōu)先級一致蚓再,靠右原則
<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ù)
<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:無限遞歸,B:2 摘仅,C:4靶庙, D:8
答:C
</pre>
localhost與127.0.01的區(qū)別
- localhot(local)是不經(jīng)網(wǎng)卡傳輸!這點很重要娃属,它不受網(wǎng)絡(luò)防火墻和網(wǎng)卡相關(guān)的的限制六荒。
- 127.0.0.1是通過網(wǎng)卡傳輸,依賴網(wǎng)卡矾端,并受到網(wǎng)絡(luò)防火墻和網(wǎng)卡相關(guān)的限制掏击。
- 一般設(shè)置程序時本地服務(wù)用localhost是最好的,localhost不會解析成ip秩铆,也不會占用網(wǎng)卡砚亭、網(wǎng)絡(luò)資源
Select Count (*)和Select Count(1)以及Select Count(column)區(qū)別
- 一般情況下,Select Count (*)和Select Count(1)兩者的返回結(jié)果是一樣的
- 假如表沒有主鍵(PK), 那么count(1)比count()快殴玛, 如果有主鍵PK的話捅膘,那count(主鍵)最快, 如果你的表只有一個字段的話那count()就是最快的
- count(*) 跟 count(1) 的結(jié)果一樣,都包括對NULL的統(tǒng)計滚粟,而count(column) 是不包括NULL的統(tǒng)計
- count(column) 是表示結(jié)果集中有多少個column字段不為空的記錄
列關(guān)于PHP中大小寫說法正確的是
- 內(nèi)置的結(jié)構(gòu)以及關(guān)鍵字寻仗、用戶定義的類和函數(shù)是不區(qū)分大小寫
- 變量名嚴(yán)格區(qū)分大小寫
- 常量名可以通過define()進(jìn)行設(shè)置是否對大小寫敏感,詳細(xì)內(nèi)容見下圖:
- 魔術(shù)常量是不區(qū)分大小寫的
git cvs svn
CVS及SVN都是集中式的版本控制系統(tǒng)坦刀,而Git是分布式版本控制系統(tǒng)
Git 中的分支愧沟,其實本質(zhì)上僅僅是個指向 commit 對象的可變指針
mysql索引不會命中的情況
- 如果條件中有 or ,即使其中有條件帶索引也不會命中(這也是為什么盡量少用or的原因)
注意:要想使用or鲤遥,又想讓索引生效,只能將or條件中的每個列都加上索引如果出現(xiàn)OR的一個條件沒有索引時林艘,建議使用 union 盖奈,拼接多個查詢語句 - like查詢是以%開頭,如果是int型索引不會命中狐援,字符型的命中’test%’百分號只有在右邊才可以命中
- 如果列類型是字符串钢坦,那一定要在條件中將數(shù)據(jù)使用引號引用起來,否則不使用索引
- 沒有查詢條件究孕,或者查詢條件沒有建立索引
- 查詢條件中,在索引列上使用函數(shù)(+, - ,*,/), 這種情況下需建立函數(shù)索引
- 采用 not in, not exist
- B-tree 索引 is null 不會走爹凹, is not null 會走
- 聯(lián)合索引遵循最左原則厨诸,不滿足的不會命中
- 鏈表時,如果關(guān)聯(lián)字段的的編碼不同禾酱,也不會走索引微酬。如一個表時 utf8,另外一個表是utf8mb4
varchar char
- Varchar 對每個英文(ASCII)字符都占用2個字節(jié)颤陶,對一個漢字也只占用兩個字節(jié)
- char 對英文(ASCII)字符占用1個字節(jié)颗管,對一個漢字占用2個字節(jié)
$_REQUESt
默認(rèn)情況下包含了 _POST 和 $_COOKIE 的數(shù)組
psr規(guī)范
此處的“類”泛指所有的class類滓走、接口垦江、traits可復(fù)用代碼塊以及其他類似結(jié)構(gòu)。
一個完整的類名需要具有以下結(jié)構(gòu)
<命名空間>(<子命名空間>)*<類名>
1.完整的類名必須要有一個頂級命名空間搅方,被稱為“Vendor namespace”
2.完成的類名可以有一個或多個子命名空間
3.完整的類名必須有一個最終的類名
4.完整的類名中任意一部分中的下劃線都是沒有特殊意義的
5.完整的類名可以由任意大小寫字母組成
6.所有類名都必須是大小寫敏感的
當(dāng)根據(jù)完整的類名載入相應(yīng)的文件……
1.完整的類名中比吭,去掉最前面的命名空間分隔符,前面連續(xù)的一個或多個命名空間和子命名空間姨涡,作為“命名空間前綴”梗逮,其必須與至少一個“文件基目錄”相對應(yīng)。
2.緊接命名空間前綴后的子命名空間必須與相對應(yīng)的“文件基目錄”相匹配绣溜,其中的命名空間分隔符作為目錄分割符
3.末尾的類名必須與對應(yīng)的.php為后綴的文件同名
4.自動加載器(autoloader)的實現(xiàn)一定不能拋出異常慷彤,一定不能觸發(fā)任一級別的錯誤信息以及不應(yīng)該有返回值。
Redis支持五種數(shù)據(jù)類型:
- string(字符串)怖喻,
- hash(哈希)底哗,
- list(列表),
- set(集合)及
- zset(sorted set:有序集合)锚沸。
以上就是最全最詳細(xì)的PHP面試題(帶有答案)的詳細(xì)內(nèi)容