訂單號生成規則
function build_order_no() {
return date('Ymd').substr(implode(NULL,array_map('ord',str_split(substr(uniqid(),7,13),1))),0,8);
}
var_dump(build_order_no());
Linux 經常使用命令 http://www.javashuo.com/article/p-sawqjgwr-bb.html
1.GET和POST區別? HTTP請求方式 GET POST PUT DELETE?php
GET在瀏覽器回退時是無害的,而POST會再次提交請求。html
GET產生的URL地址能夠被收藏,而POST不能夠。前端
GET請求會被瀏覽器主動cache,而POST不會,除非手動設置。mysql
GET請求只能進行url編碼,而POST支持多種編碼方式。linux
GET請求參數會被完整保留在瀏覽器歷史記錄裏,而POST中的參數不會被保留。nginx
GET請求在URL中傳送的參數是有長度限制的,而POST麼有。web
對參數的數據類型,GET只接受ASCII字符,而POST沒有限制。正則表達式
GET比POST更不安全,由於參數直接暴露在URL上,因此不能用來傳遞敏感信息。redis
GET參數經過URL傳遞,POST放在Request body中。算法
(以上標準答案參考自w3schools)
GET和POST都是TCP鏈接。
GET產生一個TCP數據包;POST產生兩個TCP數據包。
對於GET方式的請求,瀏覽器會把http header和data一併發送出去,服務器響應200(返回數據);
而對於POST,瀏覽器先發送header,服務器響應100 continue,瀏覽器再發送data,服務器響應200 ok(返回數據)。
Http定義了與服務器交互的不一樣方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,咱們能夠這樣認爲:一個URL地址,它用於描述一個網絡上的資源,而HTTP中的GET,POST,PUT,DELETE就對應着對這個資源的查,改,增,刪4個操做。到這裏,你們應該有個大概的瞭解了,GET通常用於獲取/查詢資源信息,而POST通常用於更新資源信息。
https://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html
HTTP協議包含:通用頭域、請求消息、響應消息和主體信息。
2.nginx和Apache區別
最核心的區別在於apache是同步多進程模型,一個鏈接對應一個進程;nginx是異步 的,多個鏈接(萬級別)能夠對應一個進程。
Nginx自己就是一個反向代理服務器;Nginx支持7層負載均衡;其餘的固然, Nginx可能會比apache支持更高的併發。
Apache在處理動態有優點,Nginx併發性比較好,CPU內存佔用低,若是rewrite 頻繁,那仍是Apache吧
3.cookie和session區別?禁用cookie後,session還能用嗎?如何共享分佈式集羣下的session?
http://www.javashuo.com/article/p-ospdgarp-ba.html
cookie:存儲在瀏覽器中,有大小限制,相對不安全,會泄露用戶信息
session:存儲在服務器端,無大小限制,相對安全,session_id存儲在cookie中
禁用後,session能夠存儲在URL中. session_name(); SID;
session.save_handler 存儲位置 file redis memcache
4.PHP垃圾回收機制?運行原理?PHP-FPM是什麼?如何肯定一臺機器應該開啓多少個PHP進程?
垃圾回收機制:引用計數。
每一個php變量存在一個叫"zval"的變量容器中。一個zval變量容器,除了包含變量的類型和值,還包括兩個字節的額外信息。第一個是"is_ref",是個bool值,用來標識這個變量是不是屬於引用集合(reference set)。經過這個字節,php引擎才能把普通變量和引用變量區分開來,因爲php容許用戶經過使用&來使用自定義引用,zval變量容器中還有一個內部引用計數機制,來優化內存使用。第二個額外字節是"refcount",用以表示指向這個zval變量容器的變量(也稱符號即symbol)個數。全部的符號存在一個符號表中,其中每一個符號都有做用域(scope),那些主腳本(好比:經過瀏覽器請求的的腳本)和每一個函數或者方法也都有做用域。
https://zhuanlan.zhihu.com/p/30636538
PHP-FPM是一種進程管理工具。fastcgi是web服務器與處理程序之間的通信協議。
在php中 除了 array
和object
類型的變量,其他大部分是自動回收
php 普通變量的回收和 該變量的引用次數有關。
寫時複製(Copy On Write:COW),簡單描述爲:若是經過賦值的方式賦值給變量時不會申請新內存來存放新變量所保存的值,而是簡單的經過一個計數器來共用內存,只有在其中的一個引用指向變量的值發生變化時,才申請新空間來保存值內容以減小對內存的佔用。 - TPIP 寫時複製
這時候,咱們unset
操做時refcount 由2變爲1,由於有內部引用指向 $a,因此在外部 其所佔用的空間並不會被銷燬。
而後咱們的外部引用已經被中斷了,咱們也不能使用它。它就成了一個「孤兒」,在c語言中叫作野指針。在php中叫作循環引用。內存泄漏。想要銷燬變量的話,只能等 php腳本結束。
爲了清理這些垃圾,引入了兩個準則
循環引用基本上只會出如今 數組和對象中,對象是由於它的自己就是引用
php7的垃圾回收包含兩個部分,一個是垃圾收集器,一個是垃圾回收算法。
垃圾收集器,把剛剛提到的,多是垃圾的元素收集到回收池中 也就是把變量的 zend_refcount
的信息 放在回收池中。 當回收池的值達到必定額度了,會進行統一處理。
處理的過程呢,就比較簡單。
遍歷回收池中的每個變量,根據每個變量,再遍歷每個成員,若是成員還有嵌套的話繼續遍歷。而後把全部成員的 作模擬的 refcount -1。若是此時外部的變量的 引用次數爲 0 。那麼能夠視爲垃圾,清楚。若是大於0,那麼恢復引用次數,並從垃圾回收池中取出。
若是你這個變量不是垃圾,那麼它的全部成員變量的引用減一以後,必然不會是總變量的引用爲0。
http://www.javashuo.com/article/p-emmbacpf-d.html
http://www.laruence.com/2018/04/08/3170.html
https://my.oschina.net/shyl/blog/517656
5.你瞭解的設計模式是什麼?
https://designpatternsphp.readthedocs.io/zh_CN/latest/Creational/README.html
單例模式:instanceof 用於肯定一個 PHP 變量是否屬於某一類 class 的實例
工廠模式:
觀察者模式:
6.myisam和innodb的區別以及應用?索引結構如何實現?
http://www.javashuo.com/article/p-bfbqamtm-k.html
myisam:表鎖、不支持外鍵、不支持事務,支持全文檢索(英文),B+樹,索引存儲爲 物理內存地址
innodb:行鎖,支持外鍵,支持事務,不支持全文檢索,B+樹,索引存儲方式不一樣 主鍵ID值 以及數據
7.如何優化mysql?
數據表數據類型的優化;(字段類型和字段長度)
SQL語句的優化; (子查詢用關聯查詢代替;limit 所需條數;group by order by null;)
索引優化;(主鍵索引、惟一索引、普通索引、聯合索引 最左原則、外建索引、全文索引)
存儲引擎的優化;(myisam innodb)
數據表結構的優化; (冗餘字段,分庫分表,分區)
服務器架構的優化;(讀寫分離;主從;負載均衡;雙主熱備)
8.mysql的聯合索引?有什麼特性?何時考慮創建聯合索引?
多個字段 最左原則,abc => a,ab,abc,ac
9.深複製和淺複製;
變量有值傳遞和引用傳遞,其實,對象也相似如此,因此,對象有淺複製和深複製之說。
10.簡述一下數據庫的分表方式以及應用場景。
按時間、按主鍵ID取模或取餘、熱數據與冷數據
11.簡述一下nosql以及應用場景。
redis:
mongodb:
12.設計一個短地址方案,寫一個函數或思路。
網上比較流行的算法有兩種 自增序列算法、 摘要算法
http://www.javashuo.com/article/p-wefkleed-o.html
https://blog.csdn.net/xyz_lmn/article/details/8057270
13.有一個100G的文件,如何統計某個關鍵詞出現的次數。
substr_count() 函數計算子串在字符串中出現的次數。
grep -o 'text' text.txt | wc -l ( | wc -l是統計次數 )
strstr — 查找字符串的首次出現
stristr strstr不區分大小寫的版本
strpos -查找字符串首次出現的位置
substr ( string $string , int $start [, int $length ] )
strrchr ( string $haystack , mixed $needle )
strripos -計算指定字符串在目標字符串中最後一次出現的位置(不區分大小寫)
stripos -查找字符串首次出現的位置(不區分大小定)
strrpos -計算指定字符串在目標字符串中最後一次出現的位置
14.HTTP狀態碼? 詳細的狀態碼解析 https://baike.baidu.com/item/HTTP%E7%8A%B6%E6%80%81%E7%A0%81/5053660?fr=aladdin
(大部分狀況都是代碼 或者配置有問題 影響的)
HTTP狀態碼主要分爲5類:以1開頭的表明請求已被接受,須要繼續處理;以2開頭的表明請求已成功被服務器接收、理解、並接受;以3開頭的表明須要客戶端採起進一步的操做才能完成請求;以4開頭的表明了客戶端看起來可能發生了錯誤,妨礙了服務器的處理;以5開頭的表明了服務器在處理請求的過程當中有錯誤或者異常狀態發生,也有多是服務器意識到以當前的軟硬件資源沒法完成對請求的處理。
200 成功;
201;
301 永久重定向;
302 臨時重定向;
304:客戶端的緩存資源是最新的,要客戶端使用緩存。
400
403 禁止(服務器拒絕響應);
404 找不到資源;
500 服務器內部錯誤;
502 cgi或fastcgi通訊錯誤,php超時;
503:服務器目前沒法爲請求提供服務;
504 服務器超時 fastcgi 佔滿或其餘緣由 複雜 nginx 錯誤常見
(建議本地環境使用nginx 會出現的錯誤問題比較多 有助於之後處理服務器問題 解決問題 nginx 日誌文件 以及php-fpm 日誌文件 學會在linux 上查找文件 搜索文件 一般日誌文件會比較大 學會使用搜索 過濾查看日誌文件 頗有必要)
15.簡述長鏈接和短鏈接的特色以及應用場景,PHP如何選擇?
16.web開發中通常有哪些安全問題並簡述一下原理和處理方式。防護方式以及函數
XSS:跨站腳本攻擊
SQL注入:因爲服務端沒有作處理 ,直接插入數據庫。
CSRF:
DOOS:
17.使用過哪些PHP框架?簡述一下各自的優缺點?路由機制?
18.簡述一下閉包?匿名函數?
19.PHP有關的數據函數?
array_push
array_pop
array_shift
array_unshift
array_diff
array_interest
array_merge
array_splice
array_muiltysort
20.Linux 下如何把文件的權限設定成777,其中每一個777表明什麼?
chmod 777 文件
7 所屬者 讀寫執行
7 所屬組 讀寫執行
7 其餘 讀寫執行
21.讀寫一個函數,實現如下功能,字符串open_door替換成OpenDoor,make_by_id替換成 MakeById.
ucfirst — 將字符串的首字母轉換爲大寫
ucwords() - 將字符串中每一個單詞的首字母轉換爲大寫
lcfirst() - 使一個字符串的第一個字符小寫
strtolower() - 將字符串轉化爲小寫
strtoupper() - 將字符串轉化爲大寫
方法一:
function firstWords($str) {
return str_replace(' ','',ucwords(str_replace('_',' ',$str)));
}
echo firstWords('make_by_id');
方法二:
function firstWords($str) {
return str_replace(' ','',ucwords(preg_replace('/\_/i', ' ', $str)));
}
echo firstWords('make_by_id');
方法三:
function firstWords($str) {
$arr = explode('_',$str);
foreach ($arr as $key => $val) {
$arr[$key] = ucwords($val);
}
return implode('',$arr);
}
echo firstWords('make_by_id');
方法四: 數組形式
function firstWords($str) {
if(is_array($str)) {
$arr = str_replace('_',' ',$str);
foreach ($arr as $key => $val) {
$arr[$key] = str_replace(' ','',ucwords($val));
}
return $arr;
}
}
var_dump(firstWords(['make_by_id','hello_world','open_eye']));
22.字符串翻轉 不用內置函數
http://www.javashuo.com/article/p-ctfyzlii-ba.html
23.寫出最少5個PHP魔術函數,並說明用處。
__construct()具備構造函數的類會在每次建立新對象時先調用此方法,因此很是適合在使用對象以前作一些初始化工做。
Note: 若是子類中定義了構造函數則不會隱式調用其父類的構造函數。要執行父類的構造函數,須要在子類的構造函數中調用parent::__construct()。若是子類沒有定義構造函數則會如同一個普通的類方法同樣從父類繼承(假如沒有被定義爲 private 的話)。
24.簡述echo 0 == "a0" ? 1 : 2; 結果 1 true
25.請簡述left join ,right join ,inner join,corss join,
26.請描述數據庫中事務是什麼?以及事務常見的一些問題以及相應的解決方案?隔離級別?
27.寫10個linux經常使用命令?
cd more find mkdir chmod grep less top tail header ps tar ll ls whereis which locate make make install wget su awk
28.nginx 將全部到 /api/xxx 的請求重寫到 /api.php/xxx
29.用PHP打印出前一天的時間,格式是 2018-12-1 10:22:11;
date('Y-m-d H:i:s',strtotime('-1 days'));
30.echo print print_r 區別
31.寫一個函數,從URL中取出文件的擴展名。例如:http://www.sina.com/abc/de/fg.php?id=1, 須要取出PHP或.php
32.PHP5的權限控制修飾符
public 公共的 任何地方均可以調用
private 私有的 只能本身調用,不能被繼承也不能被重寫,子類也不可使用。
protected 受保護的 只有父類或子類可使用。
33.哪些函數能夠打開一個文件,以對文件進行讀和寫操做?列舉出你知道的。
34.MVC的理解?
35.論壇中的無限極分類的 實現原理?
36.SVN和GIT的區別?
SVN 集中式 無網絡不能提交或拉取數據
GIT 分佈式 有無網絡均可以commit add ,提交的數據會放在暫存區中,tag打包 標籤
37.對於大流量的網站,您採用什麼樣的方法來解決訪問量問題?
38.請寫一個匹配IP地址的正則表達式。
39.描述你所使用的數據接口實現方式,以及接口校驗的方法。
40.如何分析一條sql語句的性能?
41.數據表設計原則,常見的分庫分表策略?
42.微信朋友圈數據結構是如何設計的?
43.如何實現負載均衡,多服務器以前如何共享session?
44.經常使用排序算法有哪些?時間複雜度有什麼差別?寫出一種排序算法的具體實現代碼?
45.HTTP 三次握手 四次揮手
一、TCP/IP鏈接
HTTP的工做過程:當咱們請求一個超連接時,HTTP就開始工做了,客戶端先發送一個請求到服務器,請求內容包括:協議版本號、請求地址、請求方式、請求頭和請求參數;服務器收到請求後作相應的處理,並將響應數據返回到客戶端,響應內容包括:協議版本號、狀態碼和響應數據。前端根據響應數據作相應的處理,就是最終咱們看到的內容。這些過程是HTTP自動完成的,咱們只是輸入或點擊請求地址,而後查看前端給咱們展現的內容。更多關於HTTP協議的介紹請參考:http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html 很詳細的講解
46.一個網站從前端到後端有哪些能夠緩存的地方?
CSS JS 圖片服務器 CDN緩存,減小HTTP請求,數據緩存,靜態化頁面,
47.include 和require 、require_once 區別?
include在引入不存文件時產生一個警告且腳本還會繼續執行. 若是no.php文件不存在,echo '123'這句是能夠繼續執行的. warning
require則會致使一個致命性錯誤且腳本中止執行。若是no.php文件不存在,echo '123'這句是不能夠繼續執行的. error
48.mysql_fetch_row() 和 mysql_fetch_array()區別?
row 獲取一行數據
array 獲取全部數據
49.用PHP寫出顯示客戶端IP與服務器IP的代碼?
客戶端:<?=$_SERVER['REMOTE_ADDR']?>
服務器端:<?=$_SERVER['SERVER_ADDR']?>
51.mysql有哪幾種數據引擎,有何區別?
52.寫一個函數抓取遠程圖片並放在本地
53.寫一個函數驗證電子郵箱的格式是否正確。
int
1. 佔用4個字節
2. 創建索引以後,查詢速度快
3. 條件範圍搜索可使用使用between
4. 不能使用mysql提供的時間函數
Int佔據4個字節,以整形存儲時間戳,創建索引以後,查詢速度快,條件範圍搜索可使用使用between,不能使用mysql提供的時間函數。
結論:適合須要進行大量時間範圍查詢的數據表
datetime
1. 佔用8個字節,Mysql以 YYYY-MM-DD HH:MM:SS 形式檢索和顯示datetime類型的數據,理論上存儲的時間範圍爲 1000-01-01 00:00:00 到 9999-12-31 23:59:59
2. 容許爲空值,能夠自定義值,系統不會自動修改其值。
3. 實際格式儲存(Just stores what you have stored and retrieves the same thing which you have stored.)
4. 與時區無關(It has nothing to deal with the TIMEZONE and Conversion.)
5. 能夠在指定datetime字段的值的時候使用now()變量來自動插入系統的當前時間。
在建立或者修改表結構的語句中,若是咱們,使用下面的語句,默認值爲當前時間(更新表記錄並不會修改該時間):
ALTER TABLE test
ADD created_at
DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER updated_at
;
假如,一樣字段,咱們修改給該字段賦予屬性on update CURRENT_TIMESTAMP,則會在每次更新數據的時候自動更新修改時間:
ALTER TABLE test
CHANGE created_at
created_at
DATETIME on update CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
還有一個特性:與時區無關
應用場景:適合用來記錄數據的原始的建立時間,由於不管你怎麼更改記錄中其餘字段的值,datetime字段的值都不會改變,除非你手動更改它。
timestamp
1. 佔用4個字節
2. 容許爲空值,可是不能夠自定義值,因此爲空值時沒有任何意義。
3. TIMESTAMP值不能早於1970或晚於2037。這說明一個日期,例如'1968-01-01',雖然對於DATETIME或DATE值是有效的,但對於TIMESTAMP值卻無效,若是分配給這樣一個對象將被轉換爲0。
4.值以UTC格式保存( it stores the number of milliseconds)
5.時區轉化 ,存儲時對當前的時區進行轉換,檢索時再轉換回當前的時區。
6. 默認值爲CURRENT_TIMESTAMP(),其實也就是當前的系統時間。
7. 數據庫會自動修改其值,因此在插入記錄時不須要指定timestamp字段的名稱和timestamp字段的值,你只須要在設計表的時候添加一個timestamp字段便可,插入後該字段的值會自動變爲當前系統時間。
8. 默認狀況下之後任什麼時候間修改表中的記錄時,對應記錄的timestamp值會自動被更新爲當前的系統時間。
9. 若是須要能夠設置timestamp不自動更新。經過設置DEFAULT CURRENT_TIMESTAMP 能夠實現。
修改自動更新:
`field_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE
修改不自動更新
`field_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
結論:timestamp類型適合用來記錄數據的最後修改時間,由於只要你更改了記錄中其餘字段的值,timestamp字段的值都會被自動更新。(若是須要能夠設置timestamp不自動更新)
TIMESTAMP
新增timestamp 字段
alter table table_name add column created_at timestamp not null default CURRENT_TIMESTAMP;
TIMESTAMP佔據4個字節,存儲形式爲 YYYYMMDDHHMMSS即以UTC形式存儲 ,存儲範圍爲1970-01-01 08:00:01到2038-01-19 11:14:07.超出這個值會被存儲爲0.能夠設置字段的長度,設置字段的長度並不改變實際的值,可是會影響查詢顯示的結果。例如:
字段類型 顯示格式 保存格式
TIMESTAMP(14) YYYY-MM-DD-HH-MM-SS YYYYMMDDHHMMSS
TIMESTAMP(12) YY-MM-DD-HH-MM-SS YYMMDDHHMMSS
TIMESTAMP(10) YY-MM-DD-HH-MM YYMMDDHHMM
TIMESTAMP(8) YY-MM-DD-HH YYMMDDHH
TIMESTAMP(6) YY-MM-DD YYMMDD
TIMESTAMP(4) YY-MM YYMM
TIMESTAMP(2) YY YY
若是在一張數據表中,有多個列是TIMESTAMP類型的,只有第一個會在每次更新記錄的時候會自動更新時間,能夠做爲記錄修改時間,其餘的能夠做爲數據原始建立時間。
默認值爲CURRENT_TIMESTAMP(),其實也就是當前的系統時間
應用場景:適合記錄數據的最後修改時間,只要有修改記錄,就能夠把時間保存下來,不須要你手工去記錄。因爲佔用字節比較小,效率上也會高點,可是時間上的限制,不能超出2038年,不能早於1970年。
比較大的缺陷:TIMESTAMP比較受時區timezone的影響以及MYSQL版本和服務器的SQL MODE的影響
雖然咱們查詢顯示的格式相似於字符串,可是仍是能夠直接經過order 進行排序來實現簡單的時間比較
各類場景不同,能夠選擇適合的類型做爲時間存儲的列類型。
DATE
Date只存儲日期,不存儲時間,也就是說好比今天2016-03-04,並不存儲時分秒。MySQL 以 'YYYY-MM-DD' 格式檢索與顯示 DATE 值。支持的範圍是 '1000-01-01' 到 '9999-12-31'
spl_autoload_register()
若是須要多條 autoload 函數,spl_autoload_register() 知足了此類需求。 它實際上建立了 autoload 函數的隊列,按定義時的順序逐個執行。
相比之下, __autoload() 只能夠定義一次。
有表以下,只有一個select語句表,不及格科目大於或等於2科的學生,的平均分(全部科目的平均分)。
select * from student
----------------------------------------
name | subject | score |
張三 | 數學 | 80
張三 | 語文 |53
張三 | 英語 | 59
李四 | 數學 | 55
李四 | 語文 | 56
李四 | 英語 | 50
要點: 1.要統計每一個同窗不及格科目的個數。 2.計算平均值。3.查詢每一個學生的最大分數的科目以及分數。
簡述PHP這門編程語言的特色以及優缺點?
簡述一下HTML5的新特性?是否瞭解響應式佈局?其實現原理是什麼?