1.用正則 寫出以139開頭的手機號碼:
$str = '13812345678';
$pattern = '/^139\d{8}$/';
preg_match($pattern,$str,$macth);
var_dump($macth);php
2.用PHP方式對目錄進行遍歷html
$dir = './test';mysql
function loopDir($dir){
$handle = opendir($dir);
while(false !==($file =readdir($handle))){
if($file!='.'&&$file!='..'){
echo $file."<br>";
if(filetype($dir.'/'.$file)=='dir'){
loopDir($dir.'/'.$file);
}
}
}
}
loopDir($dir);
3.冒泡排序:
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]){ $temp = $arr[$j+1]; $arr[$j+1] = $arr[$j]; $arr[$j] =$temp; } } } return $arr; }
4.快速排序laravel
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); }
5.MySQL數據庫中的字段類型varchar和char的主要區別是什麼?web
char和varchar最大的不一樣就是一個是固定長度,一個是可變長度.因爲是可變長度,所以存儲的是實際字符串再加上一個記錄字符串長度的字節。若是分配給char或varchar列的值超過 列的最大長度,則對值進行裁剪.ajax
varchar(M)和char(M),M都表示字符數.varchar的最大長度爲65535個字節,不一樣的編碼所對應的最大可存儲的字符數不一樣.char最多能夠存放255個字符,不一樣的編碼最大可用字節數不一樣redis
6.對於大流量的網站,採用什麼樣的方法來解決訪問量問題?sql
7.什麼是面向對象?主要特徵是什麼?數據庫
面向對象是程序的一種設計方式,它利於提升程序的重用性,使程序結構更加清晰。主要特徵:封裝、繼承、多態。瀏覽器
8.SESSION 與 COOKIE的區別是什麼?
SESSION存儲在服務器端,COOKIE保存在客戶端。Session比較安全,cookie用某些手段能夠修改,不安全。Session依賴於cookie進行傳遞。禁用cookie後,session還可使用,在存儲session的文件中,生成sessionID,經過get傳參的方式將sessionID傳到要實現session共享的頁面,讀取sessionID,從而從session中獲取數據。
9.優化mysql數據庫的方法
1,數據表中的數據類型的優化 如選擇合適的字段,選擇效率快速的字段
2,索引優化
三、SQL語句的優化
(1)優化查詢過程當中的數據訪問如使用limit、使用返回列不用*
(2)優化長難句的查詢語句 變複雜爲簡單、切分查詢、分解關聯查詢
(3)優化特定類型的查詢語句如優化count()、優化關聯查詢、優化子查詢、優化Group by、優化limit
四、存儲引擎的優化
(1)儘可能使用InnoDB存儲引擎,由於它支持事務、外鍵、使用獨立表空間、使用的是行級鎖、
五、數據表結構的設計優化
(1)分區操做 如經過特定的策略對數據進行物理拆分、對用戶透明的、partition by
(2)分庫分表 如水平拆分(以行級進行拆分)、垂直拆分(列及拆分)
六、數據架構的優化
(1)主從複製
(2)讀寫分離
(3)雙主熱備
(4)負載均衡 經過LVS的三種模式實現的、Mycat數據庫中間件實現的
9.redis和memcacahe、mongoDB的區別?
都是非關係型數據庫,性能都很是高,可是mongoDB和memcache、redis是不一樣的兩種類型。後二者主要用於數據的緩存,前者主要用在查詢和儲存大數據方面,是最接近數據庫的文檔型的非關係數據庫。
從數據存儲位置上來分,memcache的數據存在內存中,而redis既能夠存儲在內存中,也能夠存儲的到磁盤中,達到持久化存儲的功能,memcache一旦斷電,數據所有丟失,redis能夠利用快照和AOF把數據存到磁盤中,當恢復時又從磁盤中讀取到內存中,當物理內存使用完畢後,能夠把數據寫入到磁盤中。
從存儲數據的類型上來分,memcache和redis存儲的方式都是鍵值對,只不過redis值的類型比較豐富,有string(字符串),hash(哈希),list(列表),set(集合)zset(有序集合),而memcache主要存儲的是字符串。
10.靜態化如何實現的?僞靜態如何實現?
一、 靜態化指的是頁面靜態化,也即生成實實在在的靜態文件,也即不須要查詢數據庫就能夠直接從文件中獲取數據,指的是真靜態。
實現方式主要有兩種:
一種是咱們在添加信息入庫的時候就生成的靜態文件,也稱爲模板替換技術。
一種是用戶在訪問咱們的頁面時先判斷是否有對應的緩存文件存在,若是存在就讀緩存,不存在就讀數據庫,同時生成緩存文件。
二、僞靜態不是真正意義上的靜態化,之因此使用僞靜態,主要是爲了SEO推廣,搜索引擎對動態的文件獲取難度大,不利於網站的推廣。實習原理是基於Apache或Nginx的rewrite機智
主要有兩種方式:
一種是直接在配置虛擬機的位置配置僞靜態,這個每次修改完成後須要重啓web服務器。
另外一種採用分佈式的,能夠在網站的根目錄上建立.htaccess的文件,在裏面配置相應的重寫規則來實現僞靜態,這種每次重寫時不須要重啓web服務器,且結構上比較清晰。
11.如何處理負載,高併發
一、HTML靜態化
效率最高、消耗最小的就是純靜態化的html頁面,因此咱們儘量使咱們的 網站上的頁面採用靜態頁面來實現,這個最簡單的方法其實也是最有效的方法。
二、圖片服務器分離
把圖片單獨存儲,儘可能減小圖片等大流量的開銷,能夠放在一些相關的平臺上,如七牛等
三、數據庫集羣和庫表散列及緩存
數據庫的併發鏈接爲100,一臺數據庫遠遠不夠,能夠從讀寫分離、主從複製,數據庫集羣方面來着手。另外儘可能減小數據庫的訪問,可使用緩存數據庫如memcache、redis。
四、鏡像:
儘可能減小下載,能夠把不一樣的請求分發到多個鏡像端。
五、負載均衡:
Apache的最大併發鏈接爲1500,只能增長服務器,能夠從硬件上着手,如F5服務器。固然硬件的成本比較高,咱們每每從軟件方面着手。
12.Mysql的讀寫分離?
讀寫分離的實現原理就是在執行SQL語句的時候,判斷究竟是讀操做仍是寫操做,把讀的操做轉向到讀服務器上(從服務器,通常是多臺),寫的操做轉到寫的服務器上(主服務器,通常是一臺,視數據量來看)。
13.說一下單引號雙引號?
單引號內部的變量不會執行, 雙引號會執行
單引號解析速度比雙引號快。
單引號只能解析部分特殊字符,雙引號能夠解析全部特殊字符。
14.優化MYSQL數據庫的方法
(1)選擇最有效率的表名順序
(2)WHERE子句中的鏈接順序
(3)SELECT子句中避免使用‘*’
(4)用Where子句替換HAVING子句
(5)經過內部函數提升SQL效率
(6)避免在索引列上使用計算。
(7)提升GROUP BY 語句的效率, 能夠經過將不須要的記錄在GROUP BY 以前過濾掉。
(1).選取最適用的字段屬性,應該儘可能把字段設置爲NOT NULL
(2).使用鏈接(JOIN)來代替子查詢(Sub-Queries)
(3).使用聯合(UNION)來代替手動建立的臨時表
(4).儘可能少使用 LIKE 關鍵字和通配符
(5).使用事務和外鍵
15.常見的 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的遠程文件
16.請簡述一下數據庫的優化?
數據庫的優化能夠從四個方面來優化:
1.從結構層: web服務器採用負載均衡服務器,mysql服務器採用主從複製,讀寫分離
2.從儲存層: 採用合適的存儲引擎,採用三範式
3.從設計層: 採用分區分表,索引,表的字段採用合適的字段屬性,適當的採用逆範式,開啓mysql緩存
4.sql語句層:結果同樣的狀況下,採用效率高,速度快節省資源的sql語句執行
17.怎麼保證促銷商品不會超賣?
使用redis的隊列來實現。將要促銷的商品數量以隊列的方式存入redis中,每當用戶搶到一件促銷商品則從隊列中刪除一個數據,確保商品不會超賣。這個操做起來很方便,並且效率極高。
18.商城秒殺的實現?
搶購、秒殺是現在很常見的一個應用場景,主要須要解決的問題有兩個:
1 高併發對數據庫產生的壓力
2 競爭狀態下如何解決庫存的正確減小(
"超賣"
問題)
對於第一個問題,已經很容易想到用緩存來處理搶購,避免直接操做數據庫,例如使用Redis。第二個問題,咱們可使用redis隊列來完成,把要秒殺的商品放入到隊列中,由於pop操做是原子的,即便有不少用戶同時到達,也是依次執行,文件鎖和事務在高併發下性能降低很快,固然還要考慮其餘方面的東西,好比搶購頁面作成靜態的,經過ajax調用接口,其中也可能會出現一個用戶搶屢次的狀況,這時候須要再加上一個排隊隊列和搶購結果隊列及庫存隊列。高併發狀況下,將用戶進入排隊隊列,用一個線程循環處理從排隊隊列取出一個用戶,判斷用戶是否已在搶購結果隊列,若是在,則已搶購,不然未搶購,庫存減1,寫數據庫,將用戶入結果隊列。
19.購物車的原理?