HTTP是無狀態(tài)協(xié)議描扯,HTTP狀態(tài)碼含義:
302:臨時轉(zhuǎn)移成功趟薄,請求已經(jīng)轉(zhuǎn)移到新的位置
401:未授權(quán)
403:禁止訪問
404:文件未找到
500:服務(wù)器內(nèi)部錯誤
502:服務(wù)器內(nèi)部錯誤
200:請求成功
Session和Cookie的區(qū)別:
1. 存儲位置不同
cookie的數(shù)據(jù)信息存放在客戶端瀏覽器上
session的數(shù)據(jù)存放在服務(wù)器上
2. 存儲容量不同
單個cookie保存的數(shù)據(jù)<=4KB,一個站點最多保存20個Cookie
對于session來說并沒有上限恩够,但是處于服務(wù)器端的性能考慮,session內(nèi)不要存放過多的東西儡毕,并刪除session刪除機制
3. 存儲方式不同
cookie中只能保存ASCII字符串扑媚,并需要通過編碼方式存儲為Unicode字符或者二進制數(shù)據(jù)
session中能夠存儲任何類型的數(shù)據(jù),包括且不限于string, integer, list, map等
4. 隱私策略不同
cookie對客戶端是可見的费坊,別有用心的人可以分析存放在本地的cookie并進行cookie欺騙旬痹,所以它是不安全的
session是存儲再服務(wù)器端的,對客戶端是透明的永毅,不存在敏感信息泄露的風(fēng)險
5. 有效期上不同
開發(fā)可以通過設(shè)置cookie屬性磕昼,達到使cookie長期有效的效果
session依賴于名為Jsessionid的cookie,而cookie jsessionid的過期時間默認為-1漫雕, 只需要關(guān)閉窗口峰鄙,該session就會失效,因而session不能達到長期有效的效果
6. 服務(wù)器壓力不同
cookie保管在客戶端吟榴,不占用服務(wù)器資源吩翻。對于并發(fā)用戶十分多的網(wǎng)站,cookie是很好的選擇
session使保存再服務(wù)器端的狭瞎,每個用戶都會產(chǎn)生一個session熊锭。假如并發(fā)訪問的用戶十分多雪侥,會產(chǎn)生十分多的session精绎,耗費大量的內(nèi)存
7. 瀏覽器支持不同
假如客戶端瀏覽器不支持cookie
cookie使需要客戶端瀏覽器支持的,假如客戶端禁用了cookie代乃,或者不支持cookie搁吓,則會話跟蹤會失效,關(guān)于WAP上的應(yīng)用,常規(guī)的cookie就派不上用場
運用session需要使用URL地址重寫的方式贮预,一切用到session程序的URL都要進行URL地址重寫契讲,否則session會話跟蹤還會失效
假如客戶端支持cookie:
cookie既能夠設(shè)為本瀏覽器窗口以及子窗口內(nèi)有效,也能夠設(shè)為一切窗口內(nèi)有效捡偏。
session只能在本窗口以及子窗口內(nèi)有效银伟。
8、跨域支持上不同
cookie支持跨域名訪問彤避。
session不支持跨域名訪問。
PHP中的傳值和傳引用
按值傳遞:在函數(shù)范圍內(nèi)對值的修改董饰,在函數(shù)外部會被忽略圆米。按值傳遞是對值的復(fù)制,兩個變量指向不同的內(nèi)存地址也祠。
按引用傳遞:在函數(shù)范圍內(nèi)對值的修改块茁,在函數(shù)外部有效桂肌。按引用傳遞是將一個變量的內(nèi)存地址傳給另一個變量永淌,兩個變量最終指向同一個內(nèi)存地址遂蛀。
按值傳遞,是對值的復(fù)制李滴,對于大型的字符串和對象所坯,會是一個很大代價的操作,按引用傳遞對性能優(yōu)化有好處芹助。
include與require的區(qū)別
1. include()在執(zhí)行文件時每次都要讀取和評估,require()文件只處理一次
2. require()通常放在腳本的最前面无蜂,include()的使用和require()一樣蒙谓,一般都放在流程控制的處理區(qū)段,PHP腳本文件讀到include()語句時酣倾,才將它包含的文件讀進來慰照,這種方式,可以把程序執(zhí)行時的流程簡單化稚铣。
3. require()和include()語句是語言結(jié)構(gòu)墅垮,不是真正的函數(shù),可以像PHP的其他語言結(jié)構(gòu)一樣抬伺。即灾梦,可以不加圓括號妓笙,直接加參數(shù)能岩。
4. include_once()和require_once()語句也是在腳本執(zhí)行期間包括并運行指定文件拉鹃,與include()和require()的唯一區(qū)別是如果文件中的代碼被包括了,則不會再次包括膏燕。
5. require()引入文件時,如果碰到錯誤篷就,停止執(zhí)行近忙,給出錯誤提示(致命錯誤);include()引入文件時,如果碰到錯誤击纬,繼續(xù)運行钾麸,給出提示。
關(guān)于Cookie的小知識點
1. setcookie()函數(shù)用于設(shè)置cookie肯腕,且必須位于<html>標簽之前
2. cookie是服務(wù)器留在用戶計算機中的小文件
3. cookie常用于標識客戶端
4. 會話cookie的生命周期是:如果不設(shè)置過期時間钥平,則表示這個cookie生命周期為瀏覽器會話期間,只要關(guān)閉瀏覽器窗口知态,cookie就消失了立叛。這種生命周期為瀏覽器會話期的cookie被稱為會話cookie。會話cookie一般不保存在磁盤上其做,而是保存在內(nèi)存里。如果設(shè)置了過期時間驹沿,瀏覽器就會把cookie保存在硬盤上浮庐,關(guān)閉后再次打開瀏覽器,這些cookie依然有效梭域,直到超過設(shè)定的過期時間搅轿。
JS怎么取得用戶設(shè)備是手機還是瀏覽器
Navigator對象,userAgent屬性是一個只讀的字符串既穆,聲明了瀏覽器用于HTTP請求的用戶代理頭的值雀鹃。
mysql刪除drop、truncate囊颅、delete哪個更快
一踢代,從執(zhí)行速度來看
drop > truncate > delete
二慕爬,原理
1. delete
(1). delete屬于數(shù)據(jù)庫DML操作語言,只刪除數(shù)據(jù)隔显,不刪除表結(jié)構(gòu)括眠。會走事務(wù)题画,執(zhí)行時會觸發(fā)trigger
(2). 在InnoDB中壹置,delete其實并不會把真的數(shù)據(jù)刪除,Mysql實際上只是給刪除的數(shù)據(jù)打了個標記為已刪除步藕,因此delete刪除表中的數(shù)據(jù)時雾消,表文件在磁盤上所占空間不會變小桑腮,存儲空間不會釋放提陶,只是把刪除的數(shù)據(jù)行設(shè)置為不可見撑柔。雖然未釋放磁盤空間昼捍,但是下次插入數(shù)據(jù)時乍钻,仍然可以重用這部分空間(即覆蓋)。
(3). delete執(zhí)行時只怎,會先把所刪除數(shù)據(jù)緩存到rollback segment中身堡,事務(wù)commit之后提交。
(4). delete from table_name刪除表中的全部數(shù)據(jù)裁赠,對于MyISAM會立刻釋放磁盤空間,InnoDB不會釋放磁盤空間佩捞。
(5). 對于delete from table_name where xxx 帶條件的刪除一忱,不管是InnoDB還是MyISAM都不會釋放磁盤空間。
(6). delete操作以后使用optimize table table_name會立刻釋放磁盤空間票渠,不管是InnoDB還是MyISAM芬迄。所以要想達到釋放磁盤空間的目的,delete以后執(zhí)行optimize table操作杜窄。
(7). delete操作是一行一行執(zhí)行刪除的算途,并且同時將該行的刪除操作記錄在redo和undo表空間中,以便進行回滾(rollback)和重做操作扫外,生成的大量日志文件也會占用磁盤空間廓脆。
2. truncate
(1). truncate屬于數(shù)據(jù)庫DDL定義語言,不走事務(wù)驾讲,原數(shù)據(jù)不放在rollback segment中瞎嬉,操作不觸發(fā)trigger
執(zhí)行后立即生效厚柳,無法找回!!!
(2). truncate table table_name 立即釋放磁盤空間别垮,不管是InnoDB還是MyISAM。 truncate table有點類似于drop table之后create, 只不過create table的過程做了優(yōu)化烧董,比如表結(jié)構(gòu)文件之前已經(jīng)有了等等,所以速度上應(yīng)該是接近于drop table的速度预吆。
(3). truncate能夠快速清空一個表胳泉,并且重置auto_increment的值。
對于不同類型的存儲引擎需要注意的是:
對于MyISAM凤瘦,truncate會重置auto_increment(自增序列)的值為1案铺。而delete后仍然保持auto_increment。
對于InnoDB笔诵,truncate會重置auto_increment的值為1暇番。delete之后仍然保持auto_increment。但是在做delete整個表之后重啟Mysql的話次酌,則重啟后的auto_increment會被置為1.
也就是說舆乔,InnoDB的表本身是無法持久保持auto_increment的。delete表之后auto_increment仍然保存在內(nèi)存吊宋,但是重啟后就丟失了颜武,只能從1開始鳞上。實質(zhì)上重啟后的auto_increment會從select 1 + 1+max(ai_col) from t開始。
(4). 小心使用truncate篙议,尤其是沒有備份的時候
3. drop
(1). drop屬于數(shù)據(jù)庫DDL語言,同truncate
執(zhí)行后立即失效移怯,無法找回!!!
(2). drop table table_name立刻釋放磁盤空間舟误,不管是InnoDB還是MyISAM,drop語句將刪除表的結(jié)構(gòu)被依賴的約束(constrain),觸發(fā)器(trigger),索引(index);依賴于該表結(jié)構(gòu)的存儲過程同云、函數(shù)將被保留堵腹,但是變?yōu)閕nvalid狀態(tài)
可以這么理解,一本書旱易,delete是把目錄撕了腿堤,truncate是把書的內(nèi)容撕下來燒了笆檀,drop是把書燒了。
參考鏈接:https://www.cnblogs.com/winnerREN/p/14109352.html
項目運行一段時間后發(fā)現(xiàn)CPU占用過高士修,怎么排查
Linux平臺:
1. 命令:top
????找到cpu占用最高的進程PID
2. 命令:ps -mp "pid" -o THREAD,tid,time
????查詢pid進程中樱衷,哪個現(xiàn)成的cpu占用率高,記錄TID
3. 命令:jstack "pid" >> xxx.log??
? ? 打印出該pid進程下的進程日志
4. 命令:sz xxx.log
????將日志文件下載到本地
5. 將第2步記錄的TID(十進制)轉(zhuǎn)成十六進制
6. 在xxx.log中查找第5步的十六進制沸移,找到對應(yīng)線程
參考鏈接:https://blog.csdn.net/qq_35033270/article/details/89459197
Windows平臺:
1.?首先下載ProcessExplorer工具
2. 啟動jvisualvm雹锣,位于jdk/bin下癞蚕,打開需要監(jiān)聽的程序,點擊線程在辆,點擊線程dump
3.?打開ProcessExplorer匆篓,選中需要查看的程序寇窑,右擊,選擇properties
4.?找到cpu高的線程窗市,記錄首行tid咨察,此處tid是十進制福青,jvisualvm是十六進制,自行轉(zhuǎn)換无午,此處是9876宪迟,轉(zhuǎn)換是2694
5. 找到2694的線程,分析線程的具體情況穿仪,比如是哪個類產(chǎn)生的
參考鏈接:https://www.pianshen.com/article/6703796478/