**1、冒泡排序**
```
function maopao($arr)
{
$len = count($arr);
$n = count($arr) - 1;
for ($i = 0; $i < $len; $i++) {
for ($j = 0; $j < $n; $j++) {
if ($arr[$j] > $arr[$j + 1]) {
$tmp = $arr[$j];
$arr[$j] = $arr[$j + 1];
$arr[$j + 1] = $tmp;
}
}
}
return $arr;
}
```
**2、快速排序**
```
function quick_sort($array) {
if (count($array) <= 1) return $array;
$key = $array[0];
$left_arr = array();
$right_arr = array();
for ($i=1; $i<count($array); $i++){
if ($array[$i] <= $key)
$left_arr[] = $array[$i];
else
$right_arr[] = $array[$i];
}
$left_arr = quick_sort($left_arr);
$right_arr = quick_sort($right_arr);
return array_merge($left_arr, array($key), $right_arr);
}
```
### 3、請說明 PHP 中傳值與傳引用的區別,什么時候傳值什么時候傳引用?
按值傳遞:函數范圍內對值的任何改變在函數外部都會被忽略
按引用傳遞:函數范圍內對值的任何改變在函數外部也能反映出這些修改
優缺點:按值傳遞時,php必須復制值。特別是對于大型的字符串和對象來說,這將會是一個代價很大的操作。按引用傳遞則不需要復制值,對于性能提高很有好處。(優缺點會考到)
### 4、MySQL數據庫中的字段類型varchar和char的主要區別是什么?
Varchar是變長,節省存儲空間,char是固定長度。查找效率要char型快,因為varchar是非定長,必須先查找長度,然后進行數據的提取,比char定長類型多了一個步驟,所以效率低一些。
### 5、MySQL數據庫的常用存儲引擎以及它們的區別?
MyISAM:不支持事務,表鎖,易產生碎片,要經常優化,讀寫速度較快,支持全文索引。
InnoDB:支持事務,行鎖,有崩潰恢復能力。讀寫速度比MyISAM慢,5.6之后支持全文索引。
存儲引擎是基于表的,而不是數據庫 (這道題還能更詳細點就詳細點)
### 6、對于大流量的網站,采用什么樣的方法來解決訪問量問題?
首先,確認服務器硬件是否足夠支持當前的流量
其次,優化數據庫訪問。
第三,禁止外部的盜鏈。
第四,控制大文件的下載。
第五,使用不同主機分流主要流量
第六,使用流量分析統計軟件
第七,盡量使用靜態頁,緩存
### 7、什么是面向對象?主要特征是什么?
面向對象是程序的一種設計方式,它利于提高程序的重用性,使程序結構更加清晰。主要特征:封裝、繼承、多態。
### 8、SESSION 與 COOKIE的區別是什么?
SESSION存儲在服務器端,COOKIE保存在客戶端。Session比較安全,cookie用某些手段可以修改,不安全。Session依賴于cookie進行傳遞。禁用cookie后,session還可以使用,在存儲session的文件中,生成sessionID,通過get傳參的方式將sessionID傳到要實現session共享的頁面,讀取sessionID,從而從session中獲取數據。
### 9、對緩存技術的了解
1、緩存技術是將動態內容緩存到文件中,在一定時間內訪問動態頁面直接調用緩存文件,而不必重新訪問數據庫。
2、使用memcache可以做緩存。
### 10、表單中get和post提交方式的區別
get是顯式的,數據從url中可以看到,傳輸的數據量小,安全性低; post是隱式的,傳送的數據量較大,安全性較高
### 11、優化數據庫的方法
選取最適用的字段屬性,盡可能減少定義字段寬度,盡量把字段設置NOTNULL 使用連接(JOIN)來代替子查詢 適用聯合(UNION)來代替手動創建的臨時表 事務處理 鎖定表、優化事務處理 使用外鍵,優化鎖定表 使用索引 優化查詢語句
### 12、語句include和require的區別是什么?語句include和require的區別是什么?
require是無條件包含,也就是如果一個流程里加入require,無論條件成立與否都會先執行require,當文件不存在或者無法打開的時候,會提示錯誤,并且會終止程序執行 include有返回值,而require沒有(可能因為如此require的速度比include快),如果被包含的文件不存在的化,那么會提示一個錯誤,但是程序會繼續執行下去
### 13、redis和memcacahe、mongoDB的區別?
都是非關系型數據庫,性能都非常高,但是mongoDB和memcache、redis是不同的兩種類型。后兩者主要用于數據的緩存,前者主要用在查詢和儲存大數據方面,是最接近數據庫的文檔型的非關系數據庫。 從數據存儲位置上來分,memcache的數據存在內存中,而redis既可以存儲在內存中,也可以存儲的到磁盤中,達到持久化存儲的功能,memcache一旦斷電,數據全部丟失,redis可以利用快照和AOF把數據存到磁盤中,當恢復時又從磁盤中讀取到內存中,當物理內存使用完畢后,可以把數據寫入到磁盤中。 從存儲數據的類型上來分,memcache和redis存儲的方式都是鍵值對,只不過redis值的類型比較豐富,有string(字符串),hash(哈希),list(列表),set(集合)zset(有序集合),而memcache主要存儲的是字符串。
### 14、PHP的基本變量類型
四種標量類型:boolean (布爾型)、integer (整型)、float (浮點型, 也稱作 double)、string (字符串) 兩種復合類型:array (數組)、object (對象) 最后是兩種特殊類型:resource(資源)、NULL(NULL)
### 15、靜態化如何實現的?偽靜態如何實現?
1、 靜態化指的是頁面靜態化,也即生成實實在在的靜態文件,也即不需要查詢數據庫就可以直接從文件中獲取數據,指的是真靜態。
實現方式主要有兩種: 一種是我們在添加信息入庫的時候就生成的靜態文件,也稱為模板替換技術。 一種是用戶在訪問我們的頁面時先判斷是否有對應的緩存文件存在,如果存在就讀緩存,不存在就讀數據庫,同時生成緩存文件。
2、偽靜態不是真正意義上的靜態化,之所以使用偽靜態,主要是為了SEO推廣,搜索引擎對動態的文件獲取難度大,不利于網站的推廣。實習原理是基于Apache或Nginx的rewrite機智
主要有兩種方式: 一種是直接在配置虛擬機的位置配置偽靜態,這個每次修改完成后需要重啟web服務器。 另一種采用分布式的,可以在網站的根目錄上創建.htaccess的文件,在里面配置相應的重寫規則來實現偽靜態,這種每次重寫時不需要重啟web服務器,且結構上比較清晰。
### 16、Mysql的讀寫分離?
讀寫分離的實現原理就是在執行SQL語句的時候,判斷到底是讀操作還是寫操作,把讀的操作轉向到讀服務器上(從服務器,一般是多臺),寫的操作轉到寫的服務器上(主服務器,一般是一臺,視數據量來看)。當然為了保證多臺數據庫數據的一致性,需要主從復制。
### 17、如何處理負載,高并發?
1、HTML靜態化
效率最高、消耗最小的就是純靜態化的html頁面,所以我們盡可能使我們的 網站上的頁面采用靜態頁面來實現,這個最簡單的方法其實也是最有效的方法。
2、圖片服務器分離
把圖片單獨存儲,盡量減少圖片等大流量的開銷,可以放在一些相關的平臺上,如七牛等
3、數據庫集群和庫表散列及緩存
數據庫的并發連接為100,一臺數據庫遠遠不夠,可以從讀寫分離、主從復制,數據庫集群方面來著手。另外盡量減少數據庫的訪問,可以使用緩存數據庫如memcache、redis。
4、鏡像:
盡量減少下載,可以把不同的請求分發到多個鏡像端。
5、負載均衡:
Apache的最大并發連接為1500,只能增加服務器,可以從硬件上著手,如F5服務器。當然硬件的成本比較高,我們往往從軟件方面著手。
### 18、說一下單引號雙引號?
單引號內部的變量不會執行, 雙引號會執行 單引號解析速度比雙引號快。 單引號只能解析部分特殊字符,雙引號可以解析所有特殊字符。
### 19、PHP7的新特性?
標量類型聲明:PHP 7 中的函數的形參類型聲明可以是標量了。在 PHP 5 中只能是類名、接口、array 或者 callable (PHP 5.4,即可以是函數,包括匿名函數),現在也可以使用 string、int、float和 bool 了。 返回值類型聲明:增加了對返回類型聲明的支持。 類似于參數類型聲明,返回類型聲明指明了函數返回值的類型。可用的類型與參數聲明中可用的類型相同。 NULL 合并運算符:由于日常使用中存在大量同時使用三元表達式和 isset()的情況,NULL 合并運算符使得變量存在且值不為NULL, 它就會返回自身的值,否則返回它的第二個操作數。 use 加強:從同一 namespace 導入的類、函數和常量現在可以通過單個 use 語句 一次性導入了 匿名類:現在支持通過new class 來實例化一個匿名類
### 20、PHP 數組排序
sort() - 以升序對數組排序 rsort() - 以降序對數組排序 asort() - 根據值,以升序對關聯數組進行排序 ksort() - 根據鍵,以升序對關聯數組進行排序 arsort() - 根據值,以降序對關聯數組進行排序 krsort() - 根據鍵,以降序對關聯數組進行排序
### 21、建立索引
```
(普通索引)->
創建:CREATE INDEX <索引名> ON tablename (索引字段)
修改:ALTER TABLE tablename ADD INDEX [索引名] (索引字段)
創表指定索引:CREATE TABLE tablename([...],INDEX[索引名](索引字段))
(唯一索引)->
創建:CREATE UNIQUE <索引名> ON tablename (索引字段
修改:ALTER TABLE tablename ADD UNIQUE [索引名] (索引字段)
創表指定索引:CREATE TABLE tablename([...],UNIQUE[索引名](索引字段))
(主鍵)->
它是唯一索引,一般在創建表是建立,格式為:
CREATA TABLE tablename ([...],PRIMARY KEY[索引字段])
```
### 22、使用過Memcache緩存嗎,如果使用過,能夠簡單的描述一下它的工作原理嗎?
Memcahce是把所有的數據保存在內存當中,采用hash表的方式,每條數據又key和value組成,每個key是獨一無二的,當要訪問某個值的時候先按照找到值,然后返回結果。Memcahce采用LRU算法來逐漸把過期數據清除掉。
### 23,優化MYSQL數據庫的方法
```
(1)選擇最有效率的表名順序
(2)WHERE子句中的連接順序
(3)SELECT子句中避免使用‘*’
(4)用Where子句替換HAVING子句
(5)通過內部函數提高SQL效率
(6)避免在索引列上使用計算。
(7)提高GROUP BY 語句的效率, 可以通過將不需要的記錄在GROUP BY 之前過濾掉。
(8). 選取最適用的字段屬性,應該盡量把字段設置為NOT NULL
(9). 使用連接(JOIN)來代替子查詢(Sub-Queries)
(10). 使用聯合(UNION)來代替手動創建的臨時表
(11).盡量少使用 LIKE 關鍵字和通配符
(12).使用事務和外鍵
```
### 24、MySQL主從備份的原理?
mysql支持單向、異步復制,復制過程中一個服務器充當主服務器,而一個或多個其它服務器充當從服務器。
### 25、error\_reporting() 的作用?
設置 PHP 的報錯級別并返回當前級別。
### 26、如何修改session的生存時間
在php.ini 中設置 session.gc\_maxlifetime = 1440 //默認時間 代碼實現
```
$lifeTime = 24 * 3600; // 保存一天
session_set_cookie_params($lifeTime);
session_start();
```
### 27、常見的 PHP 安全性攻擊 SQL注入:
用戶利用在表單字段輸入SQL語句的方式來影響正常的SQL執行。
防止: 使用mysql_real_escape_string()過濾數據 手動檢查每一數據是否為正確的數據類型 使用預處理語句并綁定變量 參數化SQL:是指在設計與數據庫鏈接并訪問數據時,在需要填入數值或數據的地方,使用參數 (Parameter) 來給值,用@或?來表示參數。
**XSS攻擊 **:跨站點腳本攻擊,由用戶輸入一些數據到你的網站,其中包括客戶端腳本(通常JavaScript)。如果你沒有過濾就輸出數據到另一個web頁面,這個腳本將被執行。
防止:為了防止XSS攻擊,使用PHP的htmlentities()函數過濾再輸出到瀏覽器。
**CSRF**:跨站點請求偽造,是指一個頁面發出的請求,看起來就像是網站的信任用戶,但是是偽造的
防止:一般來說,確保用戶來自你的表單,并且匹配每一個你發送出去的表單。有兩點一定要記住: 對用戶會話采用適當的安全措施,例如:給每一個會話更新id和用戶使用SSL。 生成另一個一次性的令牌并將其嵌入表單,保存在會話中(一個會話變量),在提交時檢查它。 如laravel中的 _token
代碼注入:代碼注入是利用計算機漏洞通過處理無效數據造成的。問題出在,當你不小心執行任意代碼,通常通過文件包含。寫得很糟糕的代碼可以允許一個遠程文件包含并執行。如許多PHP函數,如require可以包含URL或文件名。
防止代碼注入 過濾用戶輸入 在php.ini中設置禁用allow_url_fopen和allow_url_include。這將禁用require/include/fopen的遠程文件
### **28、**FILE**表示什么意思?**
文件的完整路徑和文件名。如果用在包含文件中,則返回包含文件名。自PHP4.0.2 起,**FILE**總是包含一個絕對路徑,而在此之前的版本有時會包含一個相對路徑。
### 29、如何獲取客戶端的IP地址?
~~~bash
$_SERVER[‘REMOTE_ADDR’]
~~~
### 30.寫出使用header函數跳轉頁面的語句
~~~css
Header(‘location:index.php’);
~~~
### 31, $str是一段html文本,使用正則表達式去除其中的所有js腳本
~~~bash
$pattern = ‘/<script.*>\.+<\/script>/’; Preg_replace($pattern,’’,$str);
~~~
### 32.寫出將一個數組里的空值去掉的語句
```
$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));
```
### 33.寫出獲取當前時間戳的函數,及打印前一天的時間的方法(格式:年-月-日 時:分:秒)
~~~css
Time(); Date(“Y-m-d H:i:s”,Strtotime(“-1 day”));
~~~
### 34.**寫出php進行編碼轉換的函數**
~~~bash
Iconv(‘utf-8’,’gb2312’,$str);
~~~
### 35,**$str = “1,3,5,7,9,10,20”,使用什么函數可以把字符串str轉化為包含各個數字的數組?**
~~~bash
$arr = explode(“,”,$str);
~~~
### 36,**serialize() /unserialize()函數的作用**
serialize()和unserialize()在 php 手冊上的解釋是:
serialize — 產生一個可存儲的值的表示,返回值為字符串,此字符串包含了表示 value 的字節流,不丟失其類型和結構,可以存儲于任何地方。
unserialize — 從已存儲的表示中創建 PHP 的值
具體用法:
~~~bash
$arr = array(“測試1″,”測試2″,”測試3″);//數組
$sarr = serialize($arr);//產生一個可存儲的值(用于存儲)
//用任意方法(例如:你要是吧$sarr存在一個文本文件中你就可以用file_get_contents取得)得到存儲的值保存在$newarr中;
$unsarr=unserialize($newarr);//從已存儲的表示中創建 PHP 的值
~~~
### 37,**寫出一個函數,參數為年份和月份,輸出結果為指定月的天數**
~~~php
function day_count($year,$month){
echo date(“t”,strtotime($year.”-”.$month.”-1”));
}
~~~
### 38,**一個文件的路徑為/wwwroot/include/page.class.php,寫出獲得該文件擴展名的方法**
~~~ruby
$arr = pathinfo(“/wwwroot/include/page.class.php”);
$str = substr($arr[‘basename’],strrpos($arr[‘basename’],’.’));
~~~
### 39,**你使用過哪種PHP的模板引擎?**
Smarty,thinkphp自帶的模板引擎
### 40,## i++和++i命令的區別有
i++先做別的事,再自己加1
++i先自己加1,再做別的事情
++i比i++效率要高
### 41, echo、print_r、print、var_dump
1. echo、print是php語句,var_dump和print_r是函數
2. echo 輸出一個或多個字符串,中間以逗號隔開,沒有返回值是語言結構而不是真正的函數,因此不能作為表達式的一部分使用
3. print也是php的一個關鍵字,有返回值 只能打印出簡單類型變量的值(如int,string),如果字符串顯示成功則返回true,否則返回false
4. print\_r 可以打印出復雜類型變量的值(如數組、對象)以列表的形式顯示,并以array、object開頭,但print\_r輸出布爾值和NULL的結果沒有意義,因為都是打印”\\n”,因此var\_dump()函數更適合調試
5. var_dump() 判斷一個變量的類型和長度,并輸出變量的數值
### 42, php中字符串處理函數
trim 移除空白字符或特定字符 ltrim rtrim
expload 數組轉化成字符串
substr 字符串截取
substr\_resplace 子字符串替換
strlen 字符串長度
strtolower
strtoupper
md5
implode
strpos在指定字符串中查找目標字符串第一次出現的位置
### 43,一條SQL語句在MySQL中如何執行的?
客戶端請求 —->
連接器(驗證用戶身份,給予權限) —->
查詢緩存(存在緩存則直接返回,不存在則執行后續操作) —->
分析器(對SQL進行詞法分析和語法分析操作) —->
優化器(主要對執行的sql優化選擇最優的執行方案方法) —->
執行器(執行時會先看用戶是否有執行權限,有才去使用這個引擎提供的接口) —->
去引擎層獲取數據返回(如果開啟查詢緩存則會緩存查詢結果)
### 44,PHP-FPM與Nginx的通信機制?
兩種方式 1 tcp (ip:端口) 2、unix domain socket
### 45,數組排序
```
sort() 函數用于對數組單元從低到高進行排序。
rsort() 函數用于對數組單元從高到低進行排序。
asort() 函數用于對數組單元從低到高進行排序并保持索引關系。
arsort() 函數用于對數組單元從高到低進行排序并保持索引關系。
ksort() 函數用于對數組單元按照鍵名從低到高進行排序。
krsort() 函數用于對數組單元按照鍵名從高到低進行排序。
```
### 46, memcache 和 Redis 的區別
數據結構:memcache僅支持簡單的key-value形式,Redis支持的數據更多(string字符串,set集合,list列表,hash散列,zset有序集合);
多線程:memcache支持多線程,Redis支持單線程
持久化:Redis支持持久化,memcache不支持持久化
分布式:Redis做主從結構,memcache服務器需要通過hash一致化來支撐主從結構
### 47,什么是 Redis 穿透和雪崩 緩存擊穿
**緩存穿透**:就是訪問redis中一個不存在的key的時候,會直接穿過緩存,去數據庫中進行查詢.
**緩存雪崩**:就是每秒有5000個請求過來時候,redis緩存庫崩了,然后這些請求瞬間落在了mysql數據庫上,直接導致數據庫死機.
**緩存擊穿**:簡單地說就是緩存過期大量線程訪問數據庫
### 48,說說對 SQL 語句優化有哪些方法?
不用\*來代替所有列名,盡量采用與訪問表相關的實際列名;
盡量減少表的查詢次數。
對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。
應盡量避免在 where 子句中對字段進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描
### 49,Mysql 中有哪幾種鎖
MyISAM支持表鎖,InnoDB支持表鎖和行鎖,默認為行鎖
* 表級鎖:開銷小,加鎖快,不會出現死鎖。鎖定粒度大,發生鎖沖突的概率最高,并發量最低
* 行級鎖:開銷大,加鎖慢,會出現死鎖。鎖力度小,發生鎖沖突的概率小,并發度最高
### 50,如何處理負載、高并發
* 動靜分類
* 添加cdn,同時可以把圖片等保存的cos對象儲存中
* 使用負載均衡
* 合理添加緩存,最好是以內存為基礎的緩存如redis
* 添加redis分布式鎖
* 前端頁面合理設計,避免高速點擊的狀況出現
* 添加隊列來處理高并發
* 使用數據庫連接池
* 對數據庫及程序優化,分庫分表
### 51,為什么要使用分布式鎖
分布式系統要訪問共享資源,為了避免并發訪問資源帶來錯誤,我們為共享資源添加一把鎖,讓各個訪問互斥,保證并發訪問的安全性
### 52,單線程的redis如何實現阻塞隊列
整個阻塞執行過程相當于是分散開的,每次請求結束后都判斷之前的阻塞列表是否滿足執行條件,類似我們用輪詢來實現長連接的功能。所以看似阻塞的命令對其他命令的執行時不會有影響的,它們依然是單線程的。
### 53,消息中間件
基于隊列與消息傳遞,降低系統耦合,提高系統響應速度,突破系統性能瓶頸。削鋒,解耦
### 54, PHP網絡通信是如何實現的
基于socket實現,可以用到現在的swoole,wokerman等
### 55, 事務的其特性有哪些?mysql是否支持嵌套事務?(默認不支持)
所謂事務就是針對數據庫的一組操作,它可以由一條或者多條SQL語句組成,同一個事務的操作具備同步的特點,如果其中有一條語句不能執行的話,那么所有的語句都不會執行
(1)原子性: 原子性是指事務是一個不可再分割的工作單位,事務中的操作要么都發生,要么都不發生。
(2)一致性:一致性是指在事務開始之前和事務結束以后,數據庫的完整性約束沒有被破壞。這是說數據庫事務不能破壞關系數據的完整性以及業務邏輯上的一致性。
(3)隔離性:隔離性是指并發的事務是相互隔離的。即一個事務內部的操作及正在操作的數據必須封鎖起來,不被企圖進行修改的事務看到 。
(4)持久性:持久性是指在事務完成以后,該事務所對數據庫所作的更改便持久的保存在數據庫之中,并不會被回滾。 即使出現了任何事故比如斷電等,事務一旦提交,則持久化保存在數據庫中
## 56, $this和self、parent這三個關鍵詞分別代表什么?在哪些場合下使用?
$this:當前對象
self: 當前類
parent: 當前類的父類
$this在當前類中使用,使用->調用屬性和方法。
self也在當前類中使用,不過需要使用::調用。
靜態屬性,不能在類里使用$this訪問,應該使用self后跟范圍解析操作符(::),后面是帶著美元符號的變量名。
## 57,PHP的性能優化方法總結
* 多用PHP自身能力解決問題
* 多使用PHP內置的變量、常量、函數
* 少用PHP魔術方法
* 利用unset()及時釋放不使用的內存
* 做PHP擅長的事情
* 盡量靜態化
* 盡量的少進行文件操作,雖然PHP的文件操作效率也不低的
* 其他自行挖掘
## 58,安全對一套程序來說至關重要,請說說在開發中應該注意哪些安全機制?
1. 防遠程提交
2. 防止SQL注入,對特殊代碼進行過濾
3. 防止注冊灌水,使用驗證碼
4. 數據加密處理等等
## 59, TCP長連接與短連接的區別,各自的優點與缺點,以及其使用場景
* 長連接的操作步驟是:建立連接->數據傳輸…(保持連接)…數據傳輸->關閉連接。
* 短連接的步驟是:建立連接->數據傳輸->關閉連接…建立連接->數據傳輸->關閉連接。
* 長鏈接做聊天室類似場景,短鏈接做網站場景
## 60, localhost與127.0.01的區別
* localhot(local)是不經網卡傳輸!這點很重要,它不受網絡防火墻和網卡相關的的限制。
* 127.0.0.1是通過網卡傳輸,依賴網卡,并受到網絡防火墻和網卡相關的限制。
* 一般設置程序時本地服務用localhost是最好的,localhost不會解析成ip,也不會占用網卡、網絡資源
## 61, Select Count (\*)和Select Count(1)以及Select Count(column)區別
* 一般情況下,Select Count (\*)和Select Count(1)兩者的返回結果是一樣的
* 假如表沒有主鍵(PK), 那么count(1)比count(*)快, 如果有主鍵PK的話,那count(主鍵)最快, 如果你的表只有一個字段的話那count(*)就是最快的
* count(\*) 跟 count(1) 的結果一樣,都包括對NULL的統計,而count(column) 是不包括NULL的統計
* count(column) 是表示結果集中有多少個column字段不為空的記錄
*
## 62,列關于PHP中大小寫說法正確的是
```
1. 內置的結構以及關鍵字、用戶定義的類和函數是不區分大小寫
2. 變量名嚴格區分大小寫
3. 常量名可以通過define()進行設置是否對大小寫敏感,詳細內容見下圖:
4. 魔術常量是不區分大小寫的
```
## 63,git cvs svn
CVS及SVN都是集中式的版本控制系統,而Git是分布式版本控制系統
Git 中的分支,其實本質上僅僅是個指向 commit 對象的可變指針
## 64, mysql索引不會命中的情況
* 如果條件中有 or ,即使其中有條件帶索引也不會命中(這也是為什么盡量少用or的原因)
注意:要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引如果出現OR的一個條件沒有索引時,建議使用 union ,拼接多個查詢語句
* like查詢是以%開頭,如果是int型索引不會命中,字符型的命中’test%’百分號只有在右邊才可以命中
* 如果列類型是字符串,那一定要在條件中將數據使用引號引用起來,否則不使用索引
* 沒有查詢條件,或者查詢條件沒有建立索引
* 查詢條件中,在索引列上使用函數(+, - ,\*,/), 這種情況下需建立函數索引
* 采用 not in, not exist
* B-tree 索引 is null 不會走, is not null 會走
* 聯合索引遵循最左原則,不滿足的不會命中
* 鏈表時,如果關聯字段的的編碼不同,也不會走索引。如一個表時 utf8,另外一個表是utf8mb4
## 65,varchar char
1. Varchar 對每個英文(ASCII)字符都占用2個字節,對一個漢字也只占用兩個字節
2. char 對英文(ASCII)字符占用1個字節,對一個漢字占用2個字節
## 66,$\_REQUEST
默認情況下包含了 $_GET, $_POST 和 $_COOKIE 的數組
## 67,psr規范
此處的“類”泛指所有的class類、接口、traits可復用代碼塊以及其他類似結構。
一個完整的類名需要具有以下結構
()\*
1.完整的類名必須要有一個頂級命名空間,被稱為“Vendor namespace”
2.完成的類名可以有一個或多個子命名空間
3.完整的類名必須有一個最終的類名
4.完整的類名中任意一部分中的下劃線都是沒有特殊意義的
5.完整的類名可以由任意大小寫字母組成
6.所有類名都必須是大小寫敏感的
當根據完整的類名載入相應的文件……
1.完整的類名中,去掉最前面的命名空間分隔符,前面連續的一個或多個命名空間和子命名空間,作為“命名空間前綴”,其必須與至少一個“文件基目錄”相對應。
2.緊接命名空間前綴后的子命名空間必須與相對應的“文件基目錄”相匹配,其中的命名空間分隔符作為目錄分割符
3.末尾的類名必須與對應的.php為后綴的文件同名
4.自動加載器(autoloader)的實現一定不能拋出異常,一定不能觸發任一級別的錯誤信息以及不應該有返回值。
## 68,Redis支持五種數據類型:
1. string(字符串),
2. hash(哈希),
3. list(列表),
4. set(集合)及
5. zset(sorted set:有序集合)。
### **69.詳述一次完整的HTTP請求過程**
這個問題的核心是域名解析和服務器(nginx)解析這兩部分,基本上這兩部分詳細闡述就可以了。
步驟一、解析URL
瀏覽器會解析當前的URL數據,判斷此URL是否為合法的鏈接。如果是合法鏈接則正常的向下一步驟前進。如果不是合法的鏈接,則會執行搜索功能,例如執行百度、360、Google搜索等。
步驟二、解析域名
服務器是以ip的形式存在的。而域名需要解析到ip上,解析IP會有三個小的步驟:
1)、從瀏覽器自身的緩存中解析此域名數據
2)、從本地電腦的HOST文件中解析域名
3)、通過DNS服務器解析域名
步驟三、拿信息
這個步驟我們拿到了URL的信息,主要是IP和端口信息。
步驟四、封包并進行三次握手
瀏覽器將請求信息進行打包,通過TCP的三次握手將數據傳遞至服務器。
步驟五、服務器解析、處理、返回數據
服務器通過種種層級、方式拿到傳遞的數據,對數據進行分析、處理,最后返回響應類MIME類型數據。正常狀態碼為200,非正常的錯誤碼有404、500、501等等
步驟六、瀏覽器獲得、渲染、展現數據
### **70, HTTP 狀態中302、403、 500代碼含義?**
一. 消息系列 二 成功系列 三. 重定向系列 四. 請求錯誤系列 五. 服務器端錯誤系列
302:臨時轉移成功,請求的內容已轉移到新位置 403:禁止訪問 500:服務器內部錯誤 401代表未授權。
### **71,Linux 下建立壓縮包,解壓縮包的命令**
Tar.gz:
打包: tar czf file.tar.gz file.txt
解壓: tar xzf file.tar.gz
Bz2:
打包: bzip2 [-k] 文件
解壓: bunzip2 [-k] 文件
Gzip(只對文件,不保留原文件)
打包: gzip file1.txt
解壓: gunzip file1.txt.gz
Zip: -r 對目錄
打包: zip file1.zip file1.txt
解壓: unzip file1.zip
### 72, **不使用cookie向客戶端發送一個cookie.**
理解:session_start()開啟時,生成一個常量 SID,當COOKIE開啟時,這個常量為空,當COOKIE關閉時,這個常量中存儲了PHPSESSID的值。通過在URL后加一個SID參數來傳遞SESSIONID的值,從而使客戶端頁面可以使用SESSION里面的值。 當客戶端開啟COOKIE和服務器端開啟SESSION時。 瀏覽器第一次請求,服務器會向瀏覽器端發送一個COOKIE里面存儲SESSIONID. 當瀏覽器第二次請求時,會把已存在
### 73,**isset() 和 empty() 區別**
Isset判斷變量是否存在,可以傳入多個變量,若其中一個變量不存在則返回假,empty判斷變量是否為空為假,只可傳一個變量,如果為空為假則返回真。
### 74, **持久化redis有幾種方式?**
主要有兩種方式:
1) 快照持久化
在redis配置文件中已經自動開啟了,
格式是:save N M
表示在N秒之內,redis至少發生M次修改則redis抓快照到磁盤。
當然我們也可以手動執行save或者bgsave(異步)命令來做快照
2)append only file AOF持久化
總共有三種模式,如
appendfsync everysec默認的是每秒強制寫入磁盤一次
appendfsync always 每次執行寫操作的時候就強制寫入磁盤
appendfsync no 完全取決于os,性能最好但是持久化沒法保證
其中第三種模式最好。redis默認的也是采取第三種模式。
### 75,**sql注入是什么及如何預防sql注入?**
SQL注入攻擊指的是用戶或者黑客通過構建特殊的輸入作為參數傳入我們的Web應用程序端,而這些輸入大都是SQL語法里的一些組合,通過執行SQL語句進而執行攻擊者所要的操作,其主要原因是程序員沒有細致地過濾用戶輸入的數據,致使非法數據侵入系統而造成的。因此我們在做開發過程中一定要預防sql注入,主要從兩方面著手:
1)占位符的方式,就是對sql語句進行預處理,然后執行sql語句
2)通過addslashes或者mysql_real_escape_string這兩個函數對用戶輸入的值進行轉義處理,把一些特殊的字符轉義掉。
### 76,**有用過預處理么?**
PDO類中,有個prepare方法可以實現預處理,PDOStament類中 的excute方法可以執行預處理,預處理的參數分為兩種,一種是:字符串占位符,另一種是?占位符,:字符串占位符在執行預處理傳遞參數時傳入的是關聯數組,而?占位符傳遞的是索引數組。兩者不能混合使用,但一般推薦使用:字符串占位符。
### 77,**用框架還用自己的處理嗎**
一般成熟的開源框架中都考慮到了數據安全這方面的東西,但有時候我們可能會使用一些原生的SQL語句時,我們就需要考慮自己對sql語句進行預處理。當然有時候框架中的過濾方法我們不希望采用,比如使用文本編輯器時,我們可以使用自己的過濾方式
### 78,**mysql優化怎么做的?**
mysql優化主要從以下幾個方面來實現:
1)設計角度:存儲引擎的選擇,字段類型選擇,范式
2)功能角度:可以利用mysql自身的特性,如索引,查詢緩存,碎片整理,分區、分表等
3)sql語句的優化方面:盡量簡化查詢語句,能查詢字段少就盡量少查詢字段,優化分頁語句、分組語句等。
4)部署大負載架構體系:數據庫服務器單獨出來,負載大時可以采用主從復制,讀寫分離機制進行設計
5)從硬件上升級數據庫服務器。
### 79,**PHP處理上傳文件信息數組中的文件類型$\_FILES\[‘type’\]由客戶端瀏覽器提供,有可能是黑客偽造的信息,請寫一個函數來確保用戶上傳的圖像文件類型真實可靠**
用getimagesize來判斷上傳圖片的類型比$_FILES函數的type更可靠
同一個文件,使用不同的瀏覽器php返回的type類型是不一樣的,由瀏覽器提供type類型的話,
就有可能被黑客利用向服務器提交一個偽裝撐圖片后綴的可執行文件。
可以通過getimagesize()函數來判斷上傳的文件類型,如果是頭像文件 會返回這樣的一個數組
### 80,**PHP的垃圾收集機制是怎樣的?**
說明:
1)如果,你熟悉PHP源碼,那么請從源碼入手,回答些問題,會獲得額外加分
2)如果,你不熟悉PHP源碼,那么盡你所能,多寫點東西,包括利用自己的編程直覺得到的信息,都可以。
3)對,則有分,錯誤不扣,不寫無分。
PHP可以自動進行內存管理,清除不再需要的對象。PHP使用了引用計數(referencecounting)這種單純的垃圾回收(garbagecollection)機制。每個對象都內含一個引用計數器,每個reference連接到對象,計數器加1。當reference離開生存空間或被設為NULL,計數器減1。當某個對象的引用計數器為零時,PHP知道你將不再需要使用這個對象,釋放其所占的內存空間。
### 81, **微信支付回調失敗該如何處理?**
他問的是已經支付成功后,但是回調失敗了。
自己可以創建定時任務在每天的凌晨執行,去微信那邊對賬,然后更新數據庫訂單狀態。
### 82, **調用區塊鏈接口的安全措施,有那些實現方法?**
1.使用MD5實現對接口加簽,目的是為了防止篡改數據。
2.基于網關實現黑明單與白名單攔截
3.可以使用rsa非對稱加密 公鑰和私鑰互換
4.如果是開放接口的話,可以采用oath2.0協議
5.使用Https協議加密傳輸,但是傳輸速度慢
6.對一些特殊字符實現過濾 防止xss、sql注入的攻擊
7.定期使用第三方安全掃描插件
8.接口采用dto、do實現參數轉化 ,達到敏感信息脫敏效果
9.使用token+圖形驗證碼方法實現防止模擬請求
10.使用對ip訪問實現接口的限流,對短時間內同一個請求(ip)一直訪問接口 進行限制。
### 83, **服務器受到dos攻擊,這個問題如何應付?**
看看你的服務的訪問日志,在防火墻中加過濾,或者在web服務器中加過濾吧。方法有以下幾種。
對于特定的IP訪問的情況,限制IP訪問
限制同一IP在單位時間內的訪問次數
上級服務器,提高吞吐能力
是消耗服務器資源為主還是純流量攻擊?消耗資源的可以通過配置防火墻過濾規則防御中小規模的攻擊。如果是純流量攻擊,考慮你用的是linode真心無解。即便你封了IP封了端口也沒用,人家不管你接不接受他的請求,他都會塞滿你的帶寬。linode必然認為你是被流量攻擊或者消耗過多資源然后給你掛起。
### 84,**對于大流量的網站,您采用什么樣的方法來解決訪問量問題?**
優化程序,優化數據庫,如果程序和數據庫已經最優化,使用以下解決方法:
1.確定當前服務器設備是否滿足流量需求。
2.使用Memcache緩存技術,把動態內容緩存到文件中,動態網頁直接調用這些文件,而不必再訪問數據庫。
3.禁止外部盜鏈,圖片和文件外部盜鏈會給服務器帶來大量的負載壓力,可以通過refer來禁止外部盜鏈,或者使用apache來配置禁止盜鏈。
4.控制大文件的下載,大文件的下載對于非SCSI硬盤來說會占用大量的資源,導致服務器的響應能力下降。
5.使用不同的主機分流主要流量,使服務器均衡負載。
6.使用流量統計軟件統計分析網站流量,可以知道哪些地方耗費了大量的流量,哪些頁面需要再進行優化。
### 85, **.對關系型數據庫而言,索引是相當重要的概念,請回答有關索引幾個問題:**
1)索引的目的是什么?
快速訪問數據表中的特定信息,提高檢索速度
創建唯一性索引,保證數據庫表中每一行數據的唯一性
加速表和表之間的連接
使用分組和排序子句進行數據檢索時,可以顯著減少查詢中分組和排序的時間
2) 索引對數據庫系統的負面影響是什么?
負面影響:創建索引和維護索引需要耗費時間,這個時間隨著數據量的增加而增加;索引需要占用物理空間,不光是表需要占用數據空間,每個索引也需要占用物理空間;當對表進行增、刪、改的時候索引也要動態維護,這樣就降低了數據的維護速度。
3) 為數據表建立索引的原則有哪些?
在最頻繁使用的、用以縮小查詢范圍的字段上建立索引
在平頻繁使用的、需要排序的字段上建立索引
4) 什么情況下不宜建立索引?
對于查詢中很少涉及的列或者重復值比較多的列,不宜建立索引
對于一些特殊的數據類型,不宜建立索引,比如文本字段(text),值范圍較少的知道等。
### 86,AJAX的優勢是什么?
ajax是異步傳輸技術,可以通過javascript實現,也可以通過JQuery框架實現,實現局部刷新,減輕了服務器的壓力,也提高了用戶體驗
### 87,安全對一套程序來說至關重要,請說說在開發中應該注意哪些安全機制?
①防遠程提交;②防SQL注入,對特殊代碼進行過濾;③防止注冊機灌水,使用驗證碼;
### 88,在程序的開發中,如何提高程序的運行效率?
①優化SQL語句,查詢語句中盡量不使用select *,用哪個字段查哪個字段;少用子查詢可用表連接代替;少用模糊查詢;②數據表中創建索引;③對程序中經常用到的數據生成緩存;
### 89,PHP可否與其它的數據庫搭配使用?
PHP與MYSQL數據庫是最優搭配,當然PHP也可以去其它的數據庫搭配使用,例如MSSQL等,PHP中預留了操作MSSQL的函數,只要開啟就可以使用
### 90,現在編程中經常采取MVC三層結構,請問MVC分別指哪三層,有什么優點?
MVC三層分別指:業務模型、視圖、控制器,由控制器層調用模型處理數據,然后將數據映射到視圖層進行顯示,優點是:①可以實現代碼的重用性,避免產生代碼冗余;②M和V的實現代碼分離,從而使同一個程序可以使用不同的表現形式
### 91,對json數據格式的理解?
`JSON(JavaScript Object Notation)`是一種輕量級的數據交換格式,json數據格式固定,可以被多種語言用作數據的傳遞
PHP中處理json格式的函數為`json_decode( string $json [, bool $assoc ] )`,接受一個 JSON格式的字符串并且把它轉換為PHP變量,參數json待解碼的json string格式的字符串。assoc當該參數為TRUE時,將返回array而非object;
`Json_encode`:將PHP變量轉換成json格式
### 92,Print、echo、print\_r有什么區別?
① echo和print都可以做輸出,不同的是,echo不是函數,沒有返回值,而print是一個函數有返回值,所以相對而言如果只是輸出echo會更快,而print\_r通常用于打印變量的相關信息,通常在調試中使用。
② print 是打印字符串
③ print\_r 則是打印復合類型 如數組 對象
### 93,PHP處理時間的常用函數?
`date_default_timezone_get()`返回默認時區。
`date_default_timezone_set()`設置默認時區。
`date()`格式化本地時間/日期。
`getdate()`返回日期/時間信息。
`gettimeofday()`返回當前時間信息。
`microtime()`返回當前時間的微秒數。
`mktime()`返回一個日期的 Unix時間戳。
`strtotime()`將任何英文文本的日期或時間描述解析為 Unix時間戳。
`time()`返回當前時間的 Unix時間戳。
---------------------------------mysql-----------------------------------------------
### 94,SQL語言包括哪幾部分?每部分都有哪些操作關鍵字?
SQL語言包括數據定義(DDL)、數據操縱(DML),數據控制(DCL)和數據查詢(DQL)四個部分。
數據定義:Create Table,Alter Table,Drop Table, Craete/Drop Index等
數據操縱:Select ,insert,update,delete,
數據控制:grant,revoke
數據查詢:select
### 95,完整性約束包括哪些?
數據完整性(Data Integrity)是指數據的精確(Accuracy)和可靠性(Reliability)。
分為以下四類:
1) 實體完整性:規定表的每一行在表中是惟一的實體。
2) 域完整性:是指表中的列必須滿足某種特定的數據類型約束,其中約束又包括取值范圍、精度等規定。
3) 參照完整性:是指兩個表的主關鍵字和外關鍵字的數據應一致,保證了表之間的數據的一致性,防止了數據丟失或無意義的數據在數據庫中擴散。
4) 用戶定義的完整性:不同的關系數據庫系統根據其應用環境的不同,往往還需要一些特殊的約束條件。用戶定義的完整性即是針對某個特定關系數據庫的約束條件,它反映某一具體應用必須滿足的語義要求。
與表有關的約束:包括列約束`(NOT NULL(非空約束))`和表約束`(PRIMARY KEY、foreign key、check、UNIQUE)`。
### 96,什么是事務?及其特性?
事務:是一系列的數據庫操作,是數據庫應用的基本邏輯單位。
事務特性:
(1)原子性:即不可分割性,事務要么全部被執行,要么就全部不被執行。
(2)一致性或可串性。事務的執行使得數據庫從一種正確狀態轉換成另一種正確狀態
(3)隔離性。在事務正確提交之前,不允許把該事務對數據的任何改變提供給任何其他事務,
(4) 持久性。事務正確提交后,其結果將永久保存在數據庫中,即使在事務提交后有了其他故障,事務的處理結果也會得到保存。
或者這樣理解:
事務就是被綁定在一起作為一個邏輯工作單元的SQL語句分組,如果任何一個語句操作失敗那么整個操作就被失敗,以后操作就會回滾到操作前狀態,或者是上有個節點。為了確保要么執行,要么不執行,就可以使用事務。要將有組語句作為事務考慮,就需要通過ACID測試,即原子性,一致性,隔離性和持久性。
### 97, 什么是鎖?
數據庫是一個多用戶使用的共享資源。當多個用戶并發地存取數據時,在數據庫中就會產生多個事務同時存取同一數據的情況。若對并發操作不加控制就可能會讀取和存儲不正確的數據,破壞數據庫的一致性。
加鎖是實現數據庫并發控制的一個非常重要的技術。當事務在對某個數據對象進行操作前,先向系統發出請求,對其加鎖。加鎖后事務就對該數據對象有了一定的控制,在該事務釋放鎖之前,其他的事務不能對此數據對象進行更新操作。
基本鎖類型:鎖包括行級鎖和表級鎖
### 98 ,什么叫視圖?游標是什么?
視圖是一種虛擬的表,具有和物理表相同的功能。可以對視圖進行增,改,查,操作,視圖通常是有一個表或者多個表的行或列的子集。對視圖的修改不影響基本表。它使得我們獲取數據更容易,相比多表查詢。
游標:是對查詢出來的結果集作為一個單元來有效的處理。游標可以定在該單元中的特定行,從結果集的當前行檢索一行或多行。可以對結果集當前行做修改。一般不使用游標,但是需要逐條處理數據的時候,游標顯得十分重要
### 99,什么是存儲過程?用什么來調用?
存儲過程是一個預編譯的SQL語句,優點是允許模塊化的設計,就是說只需創建一次,以后在該程序中就可以調用多次。如果某次操作需要執行多次SQL,使用存儲過程比單純SQL語句執行要快。可以用一個命令對象來調用存儲過程
### 100,如何通俗地理解三個范式?
第一范式:1NF是對屬性的原子性約束,要求屬性具有原子性,不可再分解;
第二范式:2NF是對記錄的惟一性約束,要求記錄有惟一標識,即實體的惟一性;
第三范式:3NF是對字段冗余性的約束,即任何字段不能由其他字段派生出來,它要求字段沒有冗余。
### 101, 什么是基本表?什么是視圖?
基本表是本身獨立存在的表,在 SQL 中一個關系就對應一個表。
視圖是從一個或幾個基本表導出的表。視圖本身不獨立存儲在數據庫中,是一個虛表
### 102,試述視圖的優點?
(1) 視圖能夠簡化用戶的操作
(2) 視圖使用戶能以多種角度看待同一數據;
(3) 視圖為數據庫提供了一定程度的邏輯獨立性;
(4) 視圖能夠對機密數據提供安全保護。
### 103,NULL是什么意思
NULL這個值表示UNKNOWN(未知):它不表示“”(空字符串)。
對NULL這個值的任何比較都會生產一個NULL值。您不能把任何值與一個 NULL值進行比較,并在邏輯上希望獲得一個答案。 使用IS NULL來進行NULL判斷
### 104,主鍵、外鍵和索引的區別?
主鍵、外鍵和索引的區別
定義:
主鍵–唯一標識一條記錄,不能有重復的,不允許為空
外鍵–表的外鍵是另一表的主鍵, 外鍵可以有重復的, 可以是空值
索引–該字段沒有重復值,但可以有一個空值
作用:
主鍵–用來保證數據完整性
外鍵–用來和其他表建立聯系用的
索引–是提高查詢排序的速度
個數:
主鍵–主鍵只能有一個
外鍵–一個表可以有多個外鍵
索引–一個表可以有多個唯一索引
### 105,你可以用什么來確保表格里的字段只接受特定范圍里的值?
Check限制,它在數據庫表格里被定義,用來限制輸入該列的值。
觸發器也可以被用來限制數據庫表格里的字段能夠接受的值,但是這種辦法要求觸發器在表格里被定義,這可能會在某些情況下影響到性能。
### 106,說說對SQL語句優化有哪些方法?
(1)Where子句中:where表之間的連接必須寫在其他Where條件之前,那些可以過濾掉最大數量記錄的條件必須寫在Where子句的末尾.HAVING最后。
(2)用EXISTS替代IN、用NOT EXISTS替代NOT IN。
(3) 避免在索引列上使用計算
(4)避免在索引列上使用IS NULL和IS NOT NULL
(5)對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。
(6)應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描
(7)應盡量避免在 where 子句中對字段進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描
### 107,SQL語句中‘相關子查詢’與‘非相關子查詢’有什么區別?
子查詢:嵌套在其他查詢中的查詢稱之。
子查詢又稱內部,而包含子查詢的語句稱之外部查詢(又稱主查詢)。
所有的子查詢可以分為兩類,即相關子查詢和非相關子查詢
(1)非相關子查詢是獨立于外部查詢的子查詢,子查詢總共執行一次,執行完畢后將值傳遞給外部查詢。
(2)相關子查詢的執行依賴于外部查詢的數據,外部查詢執行一行,子查詢就執行一次。
故非相關子查詢比相關子查詢效率高
### 108,數據表類型有哪些
MyISAM、InnoDB、HEAP、BOB,ARCHIVE,CSV等。
MyISAM:成熟、穩定、易于管理,快速讀取。一些功能不支持(事務等),表級鎖。
InnoDB:支持事務、外鍵等特性、數據行鎖定。空間占用大,不支持全文索引等。
### 109,MySQL數據庫作發布系統的存儲,一天五萬條以上的增量,預計運維三年,怎么優化?
a. 設計良好的數據庫結構,允許部分數據冗余,盡量避免join查詢,提高效率。
b. 選擇合適的表字段數據類型和存儲引擎,適當的添加索引。
c. mysql庫主從讀寫分離。
d. 找規律分表,減少單表中的數據量提高查詢速度。
e.添加緩存機制,比如memcached,apc等。
f. 不經常改動的頁面,生成靜態頁面。
g. 書寫高效率的SQL。
### 110,對于大流量的網站,您采用什么樣的方法來解決各頁面訪問量統計問題?
a. 確認服務器是否能支撐當前訪問量。
b. 優化數據庫訪問。
c. 禁止外部訪問鏈接(盜鏈), 比如圖片盜鏈。
d. 控制文件下載。
e. 使用不同主機分流。
f. 使用瀏覽統計軟件,了解訪問量,有針對性的進行優化。
----------------------- 面向對象部分-------------------------------
### 111,簡述 private、 protected、 public修飾符的訪問權限。
private : 私有成員, 在類的內部才可以訪問。
protected : 保護成員,該類內部和繼承類中可以訪問。
public : 公共成員,完全公開,沒有訪問限制。
### 112,堆和棧的區別?
棧是編譯期間就分配好的內存空間,因此你的代碼中必須就棧的大小有明確的定義;
堆是程序運行期間動態分配的內存空間,你可以根據程序的運行情況確定要分配的堆內存的大小。
### 113,XML 與 HTML 的主要區別
(1) XML是區分大小寫字母的,HTML不區分。
(2) 在HTML中,如果上下文清楚地顯示出段落或者列表鍵在何處結尾,那么你可以省略
或者
之類的結束 標記。在XML中,絕對不能省略掉結束標記。
(3) 在XML中,擁有單個標記而沒有匹配的結束標記的元素必須用一個 / 字符作為結尾。這樣分析器就知道不用 查找結束標記了。
(4) 在XML中,屬性值必須分裝在引號中。在HTML中,引號是可用可不用的。
(5) 在HTML中,可以擁有不帶值的屬性名。在XML中,所有的屬性都必須帶有相應的值。
### 114,面向對象的特征有哪些方面?
主要有封裝,繼承,多態。如果是4個方面則加上:抽象。
下面的解釋為理解:
封裝:
封裝是保證軟件部件具有優良的模塊性的基礎,封裝的目標就是要實現軟件部件的高內聚,低耦合,防止程序相互依賴性而帶來的變動影響.
繼承:
在定義和實現一個類的時候,可以在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的內容作為自己的內容,并可以加入若干新的內容,或修改原來的方法使之更適合特殊的需要,這就是繼承。繼承是子類自動共享父類數據和方法的機制,這是類之間的一種關系,提高了軟件的可重用性和可擴展性。
多態:
多態是指程序中定義的引用變量所指向的具體類型和通過該引用變量發出的方法調用在編程時并不確定,而是在程序運行期間才確定,即一個引用變量倒底會指向哪個類的實例對象,該引用變量發出的方法調用到底是哪個類中實現的方法,必須在由程序運行期間才能決定。
抽象:
抽象就是找出一些事物的相似和共性之處,然后將這些事物歸為一個類,這個類只考慮這些事物的相似和共性之處,并且會忽略與當前主題和目標無關的那些方面,將注意力集中在與當前目標有關的方面。例如,看到一只螞蟻和大象,你能夠想象出它們的相同之處,那就是抽象。
### 115,抽象類和接口的概念以及區別?
抽象類:它是一種特殊的,不能被實例化的類,只能作為其他類的父類使用。使用abstract關鍵字聲明。
它是一種特殊的抽象類,也是一個特殊的類,使用interface聲明。
(1)抽象類的操作通過繼承關鍵字extends實現,而接口的使用是通過implements關鍵字來實現。
(2)抽象類中有數據成員,可以實現數據的封裝,但是接口沒有數據成員。
(3)抽象類中可以有構造方法,但是接口沒有構造方法。
(4)抽象類的方法可以通過private、protected、public關鍵字修飾(抽象方法不能是private),而接口中的方法只能使用public關鍵字修飾。
(5)一個類只能繼承于一個抽象類,而一個類可以同時實現多個接口。
(6)抽象類中可以有成員方法的實現代碼,而接口中不可以有成員方法的實現代碼。
### 116,什么是構造函數,什么是析構函數,作用是什么?
構造函數(方法)是對象創建完成后第一個被對象自動調用的方法。它存在于每個聲明的類中,是一個特殊的成員方法。作用是執行一些初始化的任務。Php中使用`__construct()`聲明構造方法,并且只能聲明一個。
析構函數(方法)作用和構造方法正好相反,是對象被銷毀之前最后一個被對象自動調用的方法。是PHP5中新添加的內容作用是用于實現在銷毀一個對象之前執行一些特定的操作,諸如關閉文件和釋放內存等。
### 117,如何重載父類的方法,舉例說明
重載,即覆蓋父類的方法,也就是使用子類中的方法替換從父類中繼承的方法,也叫方法的重寫。
覆蓋父類方法的關鍵是在子類中創建于父類中相同的方法包括方法的名稱、參數和返回值類型。PHP中只要求方法的名稱相同即可。
### 118,常用的魔術方法有哪些?舉例說明
php規定以兩個下劃線(\_\_)開頭的方法都保留為魔術方法,所以建議大家函數名最好不用\_\_開頭,除非是為了重載已有的魔術方法。
`__construct()`實例化類時自動調用。
`__destruct()`類對象使用結束時自動調用。
`__set()`在給未定義的屬性賦值的時候調用。
`__get()`調用未定義的屬性時候調用。
`__isset()`使用isset()或empty()函數時候會調用。
`__unset()`使用unset()時候會調用。
`__sleep()`使用serialize序列化時候調用。
`__wakeup()`使用unserialize反序列化的時候調用。
`__call()`調用一個不存在的方法的時候調用。
`__callStatic()`調用一個不存在的靜態方法是調用。
`__toString()`把對象轉換成字符串的時候會調用。比如 echo。
`__invoke()`當嘗試把對象當方法調用時調用。
`__set_state()`當使用var\_export()函數時候調用。接受一個數組參數。
`__clone()`當使用clone復制一個對象時候調用。
### 119,類中如何定義常量、如何類中調用常量、如何在類外調用常量
類中的常量也就是成員常量,常量就是不會改變的量,是一個恒值。
定義常量使用關鍵字const.
例如:`const PI = 3.1415326;`
無論是類內還是類外,常量的訪問和變量是不一樣的,常量不需要實例化對象,
訪問常量的格式都是類名加作用域操作符號(雙冒號)來調用。
即:類名 :: 類常量名;
### 120,作用域操作符::如何使用?都在哪些場合下使用?
調用類常量
調用靜態方法
### 121,__autoload()方法的工作原理是什么?
使用這個魔術函數的基本條件是類文件的文件名要和類的名字保持一致。
當程序執行到實例化某個類的時候,如果在實例化前沒有引入這個類文件,那么就自動執行\_\_autoload()函數。
這個函數會根據實例化的類的名稱來查找這個類文件的路徑,當判斷這個類文件路徑下確實存在這個類文件后
就執行include或者require來載入該類,然后程序繼續執行,如果這個路徑下不存在該文件時就提示錯誤。
使用自動載入的魔術函數可以不必要寫很多個include或者require函數。
------------------------ThinkPHP部分 ----------------------
### 122,如何理解TP中的單一入口文件?
ThinkPHP采用單一入口模式進行項目部署和訪問,無論完成什么功能,一個項目都有一個統一(但不一定是唯一)的入口。應該說,所有項目都是從入口文件開始的,并且所有的項目的入口文件是類似的,入口文件中主要包括:
定義框架路徑、項目路徑和項目名稱(可選)
定義調試模式和運行模式的相關常量(可選)
載入框架入口文件(必須)
### 123,ThinkPHP中的MVC分層是什么?
MVC 是一種將應用程序的邏輯層和表現層進行分離的方法。ThinkPHP 也是基于MVC設計模式的。MVC只是一個抽象的概念,并沒有特別明確的規定,ThinkPHP中的MVC分層大致體現在:
模型(M):模型的定義由Model類來完成。
控制器(C):應用控制器(核心控制器App類)和Action控制器都承擔了控制器的角色,Action控制器完成業務過程控制,而應用控制器負責調度控制。
視圖(V):由View類和模板文件組成,模板做到了100%分離,可以獨立預覽和制作。
但實際上,ThinkPHP并不依賴M或者V ,也就是說沒有模型或者視圖也一樣可以工作。甚至也不依賴C,這是因為ThinkPHP在Action之上還有一個總控制器,即App控制器,負責應用的總調度。在沒有C的情況下,必然存在視圖V,否則就不再是一個完整的應用。
總而言之,ThinkPHP的MVC模式只是提供了一種敏捷開發的手段,而不是拘泥于MVC本身。
### 124,如何進行SQL優化?
1)選擇正確的存儲引擎
以 MySQL為例,包括有兩個存儲引擎 MyISAM 和 InnoDB,每個引擎都有利有弊。
MyISAM 適合于一些需要大量查詢的應用,但其對于有大量寫操作并不是很好。甚至你只是需要update一個字段,整個表都會被鎖起來,而別的進程,就算是讀進程都無法操作直到讀操作完成。另外,MyISAM 對于`SELECT COUNT(*)`這類的計算是超快無比的。
InnoDB 的趨勢會是一個非常復雜的存儲引擎,對于一些小的應用,它會比 MyISAM 還慢。但是它支持“行鎖” ,于是在寫操作比較多的時候,會更優秀。并且,他還支持更多的高級應用,比如:事務。
(2)優化字段的數據類型
記住一個原則,越小的列會越快。如果一個表只會有幾列罷了(比如說字典表,配置表),那么,我們就沒有理由使用 INT 來做主鍵,使用 MEDIUMINT, SMALLINT 或是更小的 TINYINT 會更經濟一些。如果你不需要記錄時間,使用 DATE 要比 DATETIME 好得多。當然,你也需要留夠足夠的擴展空間。
(3)為搜索字段添加索引
索引并不一定就是給主鍵或是唯一的字段。如果在你的表中,有某個字段你總要會經常用來做搜索,那么最好是為其建立索引,除非你要搜索的字段是大的文本字段,那應該建立全文索引。
(4)避免使用Select \*從數據庫里讀出越多的數據,那么查詢就會變得越慢。并且,如果你的數據庫服務器和WEB服務器是兩臺獨立的服務器的話,這還會增加網絡傳輸的負載。即使你要查詢數據表的所有字段,也盡量不要用\*通配符,善用內置提供的字段排除定義也許能給帶來更多的便利。
(5)使用 ENUM 而不是 VARCHAR
ENUM 類型是非常快和緊湊的。在實際上,其保存的是 TINYINT,但其外表上顯示為字符串。這樣一來,用這個字段來做一些選項列表變得相當的完美。例如,性別、民族、部門和狀態之類的這些字段的取值是有限而且固定的,那么,你應該使用 ENUM 而不是 VARCHAR。
(6)盡可能的使用 NOT NULL
除非你有一個很特別的原因去使用 NULL 值,你應該總是讓你的字段保持 NOT NULL。 NULL其實需要額外的空間,并且,在你進行比較的時候,你的程序會更復雜。 當然,這里并不是說你就不能使用NULL了,現實情況是很復雜的,依然會有些情況下,你需要使用NULL值。
(7)固定長度的表會更快
如果表中的所有字段都是“固定長度”的,整個表會被認為是 “static” 或 “fixed-length”。 例如,表中沒有如下類型的字段: VARCHAR,TEXT,BLOB。只要你包括了其中一個這些字段,那么這個表就不是“固定長度靜態表”了,這樣,MySQL 引擎會用另一種方法來處理。
固定長度的表會提高性能,因為MySQL搜尋得會更快一些,因為這些固定的長度是很容易計算下一個數據的偏移量的,所以讀取的自然也會很快。而如果字段不是定長的,那么,每一次要找下一條的話,需要程序找到主鍵。
并且,固定長度的表也更容易被緩存和重建。不過,唯一的副作用是,固定長度的字段會浪費一些空間,因為定長的字段無論你用不用,他都是要分配那么多的空間。
### 125,什么是慣例配置?
慣例配置上一頁下一頁慣例重于配置是系統遵循的一個重要思想,系統內置有一個慣例配置文件(位于系統目錄下面的Conf\\convention.php),按照大多數的使用對常用參數進行了默認配置。所以,對應用項目的配置文件,往往只需要配置和慣例配置不同的或者新增的配置參數,如果你完全采用默認配置,甚至可以不需要定義任何配置文件。
慣例配置文件會被系統自動加載,無需在項目中進行加載。
### 126,什么是SQL注入?
SQL注入攻擊是黑客對數據庫進行攻擊的常用手段之一。一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,注入者可以在表單中輸入一段數據庫查詢代碼并提交,程序將提交的信息拼湊生成一個完整sql語句,服務器被欺騙而執行該條惡意的SQL命令。注入者根據程序返回的結果,成功獲取一些敏感數據,甚至控制整個服務器,這就是SQL注入。
### 127,ThinkPHP如何防止SQL注入?
1)查詢條件盡量使用數組方式,這是更為安全的方式;
(2)如果不得已必須使用字符串查詢條件,使用預處理機制;
(3)開啟數據字段類型驗證,可以對數值數據類型做強制轉換;
(4)使用自動驗證和自動完成機制進行針對應用的自定義過濾;
(5)使用字段類型檢查、自動驗證和自動完成機制等避免惡意數據的輸入。
### 128,TP中支持哪些配置模式?優先級?
ThinkPHP在項目配置上面創造了自己獨有的分層配置模式,其配置層次體現在: 慣例配置->項目配置->調試配置->分組配置->擴展配置->動態配置
以上是配置文件的加載順序,因為后面的配置會覆蓋之前的同名配置(在沒有生效的前提下),所以優先順序從右到左。
### 129,TP中的URL模式有哪幾種?默認是哪種?
ThinkPHP支持四種URL模式,可以通過設置URL\_MODEL參數來定義,包括普通模式、PATHINFO、REWRITE和兼容模式。
默認模式為:PATHINFO模式,設置URL_MODEL 為1
### 130,TP中系統變量有哪些?如何獲取系統變量?
獲取系統變量的方法:
只需要在Action中調用下面方法:
$this->方法名(“變量名”,\[“過濾方法”\],\[“默認值”\])
### -----------------------smarty模板引擎----------------------
### 131,編譯和緩存區別?
smarty的編譯過程就是把模板拿過來,把里面的標簽替換成相應php代碼,這就是smarty的編譯, 其實就是php和html混合的過程
smarty的緩存需要手動開啟,smarty的緩存就是把編譯好的文件執行后,同時生成一份靜態的html頁面,再次訪問的時候,你訪問的就是是html文件了,所以就效率來說,要高一些
### 132,什么是smarty? Smarty的優點是什么?
Smarty是一個使用PHP寫出來的PHP模板引擎,目的是要使用PHP程序同美工分離,使的程序員改變程序的邏輯內容時不會影響到美工的頁面設計,美工重新修改頁面時不會影響到程序的程序邏輯,這在多人合作的項目中顯的尤為重要。(也易于程序的多樣式開發)
Smarty優點
1\. 速度快:相對其他模板引擎。
2\. 編譯型:采用smarty編寫的程序在運行時要編譯成一個非模板技術的PHP文件
3\. 緩存技術:它可以將用戶最終看到的HTML文件緩存成一個靜態的HTML頁
4\. 插件技術:smarty可以自定義插件。
不適合使用smarty的地方
1\. 需要實時更新的內容。例如像股票顯示,它需要經常對數據進行更新
2\. 小項目。小項目因為項目簡單而美工與程序員兼于一人的項目
### 133,php查詢mysql數據庫時,查詢中文結果時出現的亂碼。怎么解決?
1\. 文件屬性(另存為)
2.文件meta(設置瀏覽器解析的時候)
3\. 連接數據庫時編碼設定
4\. PHP文件中使用header函數確定編碼
### 134,緩存機制
如果開啟了緩存,smarty同時生成一份靜態的html頁面,如果在設定的時間沒有過期,再次訪問的時候,你訪問的就是是html文件了,減少了讀取數據庫,所以就效率來說,要高一些。
### 135,marty模板技術的用途是什么?
為了php與html分開,美工和程序員各司其職,互不干擾
### 136,smarty配置主要有哪幾項?
1\. 引入smarty.class.php;
2\. 實例化smarty對象;
3\. 重新修改默認的模板路徑;
4\. 重新修改默認的編譯后文件的路徑;
5\. 重新修改默認的配置文件的路徑;
6\. 重新修改默認的cache的路徑。
7\. 可以設置是否開啟cache。
8\. 可以設置左側和右側定界符。
### 137,smarty在使用過程中需要注意哪些細節?
Smarty是基于MVC概念的一種模板引擎,它將一個頁面程序分成了兩部分來實現:即視圖層和控制層,
也就是說smarty技術將用戶UI與php代碼分離開。
這樣程序員和美工各司其職,互不干擾。
### 138,smarty運用過程中要注意以下幾個問題:
1.正確配置smarty。主要要實例化smarty對象,配置smarty模板文件的路徑;
2.php頁面中使用assign賦值 和display顯示頁面;
3.smarty模板文件中不允許出現php代碼段,所有的注釋,變量,函數都要包含在定界符內。
A.{}
B. foreach
C. if else
D. include
E. Literal
### 139, MySQL表鎖了如何解鎖
1、查進程,查找被鎖表的那個進程的ID
show processlist;
2、kill掉鎖表的進程ID
kill id;
3、查詢是否鎖表
show OPEN TABLES where In_use > 0;
### 140, Mysql解鎖行鎖定
1.查詢 正在執行的事務
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
2.殺死進程id(就是上面查詢結果集的trx_mysql_thread_id列)
kill 線程ID
這樣行鎖鎖定就解決了
查詢mysql數據庫中還可以使用:
查看正在鎖的事務
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
查看等待鎖的事務
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
查詢mysql數據庫中存在的進程
select * from information_schema.PROCESSLIST(show processlist;)
查詢是否鎖表
show OPEN TABLES where In_use > 0;
- thinkphp
- websocket和tcp相互轉發
- 常用操作
- 二維碼生成
- 生成條形碼
- 獲取當前訪問電腦物理地址mac
- redis的用法和注釋
- excel導出信息
- 數組或字符串 null轉換為空
- 隱藏手機當中四位
- 根據詳細地址獲取經緯度(騰訊地圖)
- 文件讀取
- 獲取相對時間
- 創建文件和目錄
- 拼音和漢字互轉
- 域名生成
- 字符串和ASCII相互轉換
- 經緯度范圍
- 字母大小替換或反轉
- 常用方法
- 客戶端助手類
- 常用表單驗證規則
- 微信小程序部分常用接口
- 時間處理
- 字符串處理
- 隨機數生成
- base64圖片處理
- 數組處理
- Snowflake生成
- 設備
- 海康威視
- 串口
- 加密
- 3DES加密
- TEA加密
- UTP加密
- RSA加密
- 摩斯密碼
- SM4加密
- Base32加密
- Base64加密
- CRC8加密
- php和js的Aes加密解密
- 搜索引擎
- ElasticSearch
- api
- Api節流操作(令牌桶算法)
- api限流
- laravel
- 添加公共文件方法
- 秒殺功能
- 分表操作
- 算法
- 二分查找
- 炸金花
- 稠密圖-鄰接矩陣
- 稀疏圖-鄰接表
- 并查集
- 二分搜索樹
- KMP算法
- 迪克斯特拉算法
- 斐波那契查詢
- 歸并排序
- 排序算法
- 抽獎算法
- 上樓梯算法
- 判斷四個點能否組成正方形
- 以二維整數網格的形式給出地圖
- 回旋算法
- 算法題
- Prim算法
- 利用向量叉集判斷一個點是否在三角形中
- 快排同時做唯一標示
- 約瑟夫環問題
- 迷宮尋址
- 階乘
- 電梯調度算法
- 彩色磚塊算法
- 雙向隊列
- 螞蟻爬桿算法
- 線性表 順序存儲實現
- 矩陣算法
- 紅包算法
- CRC16校驗算法
- 金融P2P融資貸款相關算法
- 手氣紅包算法
- Apriori算法
- 面試
- http,Socket,WebSocket之間聯系與區別
- websocket 頭部信息請求
- mysql常見索引類型
- Mysql的兩種存儲引擎以及區別
- redis 數據類型詳解 以及 redis適用場景場合
- php常用字符串函數
- PHP常見數組函數
- php中的線程、進程和并發區別
- Mysql 多表聯合查詢效率分析及優化
- 面試題
- mysql