web基礎知識筆記整理
學習筆記
為了儘量理解,都是多篇文章綜合之後整理起來的,連結有的已經遺失,為了複習和擴充套件,最重要的是尊重別人勞動成果,所以今後要儘量貼出連結,但是不能只貼連結,沒有自己的理解,達不到學習的目的
1. 跨域
同源策略:同源策略是一個重要的安全策略,它用於限制一個origin的文件或者它載入的指令碼如何能與另一個源的資源進行互動。它能幫助阻隔惡意文件,減少可能被攻擊的媒介
跨域:當一個請求url的 協議 、域名、埠 三者之間任意一個與當前頁面url不同即為跨域
解決辦法:
- CORS
CORS是Cross-Origin Resources Sharing的簡寫,中文翻譯為“跨域資源共享”,是W3C的 標準。通過CORS,瀏覽器允許向其他源伺服器傳送資源請求
附:阮一峰的網路日誌跨域資源共享 CORS 詳解
講的非常清楚,易懂 - 使用代理
通過Nginx做代理伺服器,請求都發給代理伺服器代理伺服器再向後端伺服器請求就可以規避跨域的問題server{ # 監聽80埠 listen 80; # 域名是localhost server_name localhost; #凡是localhost:8080/api這個樣子的,都轉發到真正的服務端地址http://localhost:8080 location ^~ /api { proxy_pass http://localhost:8080; } }
2. redis
Redis是一個開源的使用ANSI C語言編寫、遵守BSD協議、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API
它通常被稱為資料結構伺服器,因為值(value)可以是 字串(String), 雜湊(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等型別
資料結構
- String: 字串
- Hash: 雜湊
Redis hash 是一個 string 型別的 field(欄位) 和 value(值) 的對映表,hash 特別適合用於儲存物件 - List: 列表
Redis列表是簡單的字串列表,按照插入順序排序。你可以新增一個元素到列表的頭部(左邊)或者尾部(右邊) - Set: 集合
Redis 的 Set 是 String 型別的無序集合。集合成員是唯一的,這就意味著集合中不能出現重複的資料
Redis 中集合是通過雜湊表實現的,所以新增,刪除,查詢的複雜度都是 O(1) - Sorted Set: 有序集合
Redis 有序集合和集合一樣也是string型別元素的集合,且不允許重複的成員
不同的是每個元素都會關聯一個double型別的分數。redis正是通過分數來為集合中的成員進行從小到大的排序
有序集合的成員是唯一的,但分數(score)卻可以重複
3.快取
- 快取穿透
訪問一個不存在的key,快取不起作用,請求會穿透到DB,流量大時DB會掛掉
解決辦法
採用布隆過濾器,使用一個足夠大的bitmap,用於儲存可能訪問的key,不存在的key直接被過濾;
訪問key未在DB查詢到值,也將空值寫進快取,但可以設定較短過期時間。 - 快取雪崩
大量的key設定了相同的過期時間,導致在快取在同一時刻全部失效,造成瞬時DB請求量大、壓力驟增,引起雪崩
解決辦法
可以給快取設定過期時間時加上一個隨機值時間,使得每個key的過期時間分佈開來,不會集中在同一時刻失效 - 快取擊穿
一個存在的key,在快取過期的一刻,同時有大量的請求,這些請求都會擊穿到DB,造成瞬時DB請求量大、壓力驟增
解決辦法
在訪問key之前,採用SETNX(set if not exists)來設定另一個短期key來鎖住當前key的訪問,訪問結束再刪除該短期key
簡單地來說,就是在快取失效的時候(判斷拿出來的值為空),不是立即去讀資料庫,而是先使用快取工具的某些帶成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一個mutex key,當操作返回成功時,再進行讀資料庫的操作並回設快取;否則,就重試整個get快取的方法
SETNX,是「SET if Not eXists」的縮寫,也就是隻有不存在的時候才設定,可以利用它來實現鎖的效果
4.多維陣列轉成一維陣列
array_reduce($arr, 'array_merge', array());
array_merge;//把兩個陣列合併為一個陣列
array_reduce ( array $array , callable $callback [, mixed $initial = NULL ] ) : mixed
array_reduce()
將 callback
函式迭代地應用於 的元素, array
以將陣列簡化為單個值
參考文章:https://blog.csdn.net/luoangen/article/details/83654731
5. PHP open_basedir 問題
報錯內容
Warning: require(): open_basedir restriction in effect.
open_basedir
: 將PHP所能開啟的檔案限制在指定的目錄樹中,包括檔案本身。當程式要使用例如fopen()或file_get_contents()開啟一個檔案時,這個檔案的位置將會被檢查。當檔案在指定的目錄樹之外,程式將拒絕開啟
本指令不受安全模式開啟或關閉的影響
配置
在php.ini 加入
open_basedir="指定目錄"
在程式碼中
ini_set('open_basedir', '指定目錄');//不建議
在apache的httpd.conf中的Directory配置
php_admin_value open_basedir "指定目錄"
nginx fastcgi.conf
fastcgi_param PHP_VALUE "open_basedir=指定目錄"
.user.ini配置
首先,要使
.user.ini
生效,要設定php.ini 中的user_ini.filename = ".user.ini" user_ini.cache_ttl = 300
關於這兩個配置的意義,請看php手冊 php.net/manual/zh/configuration.fil...
註釋掉 fastcgi.conf 中的 open_basedir 的配置。
在專案根目錄 建立 .user.ini檔案,寫入如下內容
open_basedir=/tmp/:/proc/:/you_web_path
/you_web_path
是你要新增的讓php可以訪問的路徑。多個路徑直接分號隔開
重啟一下php-fpm 服務即可
參考文章
www.php.cn/php-weizijiaocheng-1126....user.ini
配置篇
www.cnblogs.com/blibli/p/8657736.h...
www.cnblogs.com/xiezhi/p/7063896.h...
本作品採用《CC 協議》,轉載必須註明作者和本文連結