這篇文章主要介紹了關於PHP面試題的小結,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
csrf是什麼:
CSRF跨網站請求偽造,
1. 使用者C開啟瀏覽器,造訪受信任網站A,輸入使用者名稱和密碼請求登入網站A;
2. 在使用者資訊通過驗證後,網站A產生Cookie訊息並傳回瀏覽器,此時使用者登入網站A成功,可以正常傳送請求到網站A;
3. 使用者未登出網站A之前,在同一瀏覽器中,打開一個TAB頁訪問網站B;
4. 網站B接收到用戶請求後,返回一些攻擊性代碼,並發出一個請求要求訪問第三方站點A ;
5. 瀏覽器接收到這些攻擊性代碼後,根據網站B的請求,在使用者不知情的情況下攜帶Cookie訊息,向網站A發出請求。網站A並不知道該請求其實是由B發起的
,所以會根據用戶C的Cookie資訊以C的權限處理該請求,導致來自網站B的惡意程式碼被執行
session與cookie區別:
1.COOKIE 存在於客戶端。 SESSION 存在於服務端。
2.COOKIE 預設儲存大小為 4kb. 一般設定COOKIE 不會超過 20個,具體看需求。
3.SESSION 預設以檔案方式儲存。存活時間預設為 24分鐘,初始儲存大小為1M,可修改理論上無限制。可透過修改 php.ini 進行配置。
4.SESSION 預設是基於COOKIE SESSION開啟時會產生session_id 存在COOKIE中。
5.SESSION COOKIE 都是會話控制。因為咱們得http 是無狀態無連線得。所以需要透過會話控制來識別使用者。
php 超全域變數:
$GLOBALS $_SERVER $_REQUEST $_POST _COOKIE $_SESSION
PHP
與MYSQL事務處理:##1、用begin,rollback,commit來實現##begin開始一個交易
rollback 交易回溯commit 交易確認#2、直接用set來改變mysql的自動提交模 事務的4大功能(ACID):
事務是資料庫的邏輯工作單位,它對資料庫的修改要麼全部執行,要麼全部不執行。
一致性(Consistemcy): 事務前後,資料庫的狀態都符合所有的完整性限制。 隔離性(Isolation): 並發執行的交易是隔離的,且一個不會影響一個。如果有兩個事務,運行在相同的時間內,執行相同的功能,事務的隔離性將確保每一事務在系統中認為只有該事務在使用系統。這種屬性有時稱為串列化,為了防止交易操作間的混淆,必須串行化或序列化請求,使得在同一時間僅有一個請求用於同一資料。 透過設定資料庫的隔離級別,可以達到不同的隔離效果。 持久性(Durability): 在事務完成以後,該事務所對資料庫所做的更改便持久的保存在資料庫之中,並不會被回滾。xss
怎麼防止:
XSS又稱為CSS,全名為CrossSiteScript,跨站腳本攻擊防止: script注入,轉義過濾script標籤。
union
和unionall
的差別:union重,unionall不去重新#
#RBAC
角色為基礎的權限控制:
## 角色的權限控制:## 角色表、角色與功能表
redis持久化:記憶體快照(RDB) RDB 持久化可以在指定的時間間隔內產生資料集的時間點快照 日誌(AOF) AOF 持久化記錄伺服器執行的所有寫入作業命令,並在伺服器啟動時,透過重新執行這些命令來還原資料集。
分錶:減少資料庫的負擔,並縮短查詢時間。 垂直分錶:垂直分割就是依字段分.
水平分錶:以一列或多列資料的數值將資料行放到兩個獨立的表中。
水平分錶怎麼保證插入的id的唯一?
可以新建一個id服務,並將使用者的id放在資料庫或redis中。
jquery選擇器:
## 1.元素 2.屬性 3.id 4.類別 5.全域。行內元素與區塊內元素
行內:,,,,
,
,
轉換:display:#line,block,in#line-block.#nlock.
##132
#Slock.#區別:塊、
①總是在新行開始,佔據一整行;
②高度,行高以及外邊距和內邊邊邊邊距距離都可控制;
③寬頻永遠與瀏覽器寬度一樣,與內容無關;
④它可容納內嵌元素和其他區塊元素。
行、
①及其他元素皆在一行上;
②高,以高及外邊界與內邊界部分可變更;
##。 # ③寬度只與內容有關;
④行內元素僅可容納文字或其他行內元素。
分組查詢:orderby
表中統計男女數量20-30: select count(sex) from表where age between 20 and 30 group bysex
ORM:物件關係對應(Object Relational Mapping,簡稱ORM)模式是一種為了解決物件導向與關聯式資料庫存在的互不符的現象的技術
Linux檢視連接埠:刷選檔案:檢視程序:# netstat-antu //查看目前所有tcp連接埠·
netstat-ntulp |grep80 //檢視所有80埠使用狀況·
rep 情況·Linux
查看執行多少指令:history檔案操作函數: open開啟檔案
fstat 取得檔案
### file 寫入檔案(可安全用於二進位檔案)###### file_get_contents()將整個檔案讀入一個字串##########開啟檔案的幾種方式:######### Fopen(),######### ()###### 讀取與寫入,追加#########php######刪除資料夾指令######### Unlink();######## Unlink();###### ####中文字串截取:###mb_substr###### mb_substr($str,$start, $length, $encoding )###### $str,需要被截斷的字串字串### ### $start,截斷開始處,起始處為0####### $length,要截取的字數###### $encoding,為網頁編碼,如###### $encoding,則編碼網頁,如###### $encoding,則編碼網頁,如###### $enutf-23112,KGB# #######D######與M###的區別:###### M實例化基底類,D可以實例化自訂類別##########table ######隔行變色:######### 透過JQ辨識table tr td的雙數單數,對應單數雙數給予賦予不同CSS樣式,透過不同背景,即可實現隔行換色變色效果。 ###當滑鼠經過時候JQ呼叫另外設定的trtd背景,實作滑鼠經過背景顏色也會跟著變化
ajax同步非同步:
# # 同步等待服務端的回傳結果然後進行其他操作 非同步傳送請求後不等待服務端的回傳結果直接進行其他操作 Linux檢視所有檔案:ls設定一個p在另一個p上:
z-index數值越大越往上
ob函數:ob_start(); //以輸出緩衝區,所有的輸出資料不再直接被傳送至涉獵器,而是保存在輸出緩衝區裡面。 ob_clean(); //移除以內部緩衝區的內容,且未關閉緩衝區(未輸出)。
ob_end_clean(); //刪除內部緩衝區的內容,並關閉緩衝區(未輸出)。
ob_get_clean(); //返回內部緩衝區的內容,並關閉緩衝區。相當於履行 ob_get_contents() and ob_end_clean()
## ob_flush(); //傳送內部緩衝區的內容物至涉獵器,刪除緩衝區的內容,且未關閉/傳送內部緩衝區。 ob_end_flush(); //將內部緩衝區的內容傳送至涉獵器,移除緩衝區的內容,並關閉緩衝區。 ob_get_flush(); //返回內部緩衝區的內容,並關閉緩衝區,以釋放緩衝區的內容。相當於ob_end_flush()並傳回緩衝區內容。 flush(); //將ob_flush釋放所產生的內容,且不在PHP緩衝區中的內容,整個輸出至涉獵器;內部緩衝區的內容,並且已輸出至在PHP緩衝區中的內容,整個輸出至涉獵器;內部緩衝區的內容,並輸出。 ob_get_contents(); //返回緩衝區的內容,且不輸出。 ob_get_length(); //返回內部緩衝區的長度,則為緩衝區未已啟動,則此函數傳回FALSE。 ob_get_level(); //Return the nestinglevel of theoutput buffering mechanism. 3.購物車怎麼做的?流程。 。一、將商品加入購物車
1.先在頁面上新增一個連結 # 1.先取得商品加一個連結 # 1.先取得商品id
## 2.從資料庫中透過id將商品查詢出來。 3.將商品加入購物車,沒有的話,重新new 出一個 是否存在,如果不存在,數量為1,如果存在,數量在原始基礎上加1 c.將購物車重新裝入session。 問題:我們的購物使用的是一個HashMap集合,key是唯一的,保證key唯一的方式是透過hashCode與equals方法所以我們在使用時,需要將Product類別的hashCode與equals方法重寫,我們在重寫時,只比較id值就可以。二、顯示購物車商品
我們的購物車是存在於session中的。我們只需要在cart.jsp頁面將session中的cartt這個Map集合得到,並顯示出來就可以。 1.在購物車中商品操作 2.點選 或-號時可以修改購物車中商品的數量3.點選 或-按鈕時,我們會呼叫一個javascript中的函數。 changeCount();透過這個函數我們向伺服器發送請求,在伺服器端從session中獲取購物車中數據,並根據提交的數據將購物車中指定的商品數量修改在返回到購物車頁面展示。
最近一個月的銷售量怎麼取?三個月?一年呢?
# 查詢資料庫某個欄位
#怎麼在30萬條資料3秒內取出?建立什麼索引?
普通指標
索引類型:
普通索引、唯一指標、主鍵索引、組合指標
##
## ## ## ## ##
####
##redis與memecache的差別在於:
1.儲存方式:
memecache使用資料存在記憶體之中,並在斷電後斷電後會掛掉,資料不能超過記憶體大小。 redis有部份存在硬碟上,這樣能確保資料的持久性。
2、資料支援型別:
redis在資料支援上比memecache較多的數量。
3.使用底層模型不同:
新版本的redis直接自己建構了VM 機制 ,因為一般的系統呼叫系統函數的話,會浪費一定的時間去移動和請求。
redis 官方中目前只支持LINUX 上去行,從而省去了對於其它系統的支持,這樣的話可以更好的把精力用於本系統環境上的優化,雖然後來微軟有一個小組為其寫了補丁。但沒有放到主幹上
SKU#怎麼做:屬性規格。 其實sku是商品單數庫存量單位 包含商品表商品屬性表貨品表
#tp#的設定檔:
##tp #common/config.phpphp
的資料型態:
四種標量型態: boolean(布林型) integer (整數) float (浮點型, 也稱為double)## # :
array(陣列)
object(物件)
## (資源)NULL (NULL)
單例模式:
單例模式的主要特點是「三私一公」: 唯一的實例的私有靜態成員變數 建構子必須宣告為私有的,並且防止外部程式new一個物件而失去單一範例的意義 複製函數必須宣告為私有的,並防止物件被複製必須提供一個存取這個實例的公共靜態方法(通常命名為getInstance),從而傳回唯一實例的一個引用。
查詢出20-30
之間的男女數://select count(sex) from 表where age between 20 and 30group by sexSelect count(*) from 表名where age between 20 and 30 group by age. Group by#PHP
中有三種存取修飾符,分別為:
PHP中有三種存取修飾符,分別是:PHP
中有三種存取修飾符,分別是:
public(公開的、預設) protected(受保護的)######private(私有的)#########存取權修飾符的範圍:#########當類別的成員被宣告為public的存取修飾符時,該成員能被外部程式碼存取和操作。 ######private(私有的)######被定義為private的成員,對於類別內部所有成員都可見,沒有存取限制。對類別外部不允許存取。 ###protected(受保護的)
protected稍微有點複雜,被宣告為protected的成員,只允許該類別的子類別進行存取。
mysql int儲存:
bigint 儲存大小為 8 個位元組。
int儲存大小為 4 個位元組。
smallint儲存大小為 2 個位元組。
tinyint 從 0 到 255 的整數資料。儲存大小為1 位元組。
cookie的作用域:
domain本身。 domain底下的所有網域。
就是設定一個權限給cookie。當domain設定為空時,domain預設為目前域名,並且該域名下的子域名都可以接收到cookie。
但是domain參數設定其 子網域時,所有網域都接收不到了,包括那個子網域。
linux檢視日誌檔案內容指令
tail、cat、tac、head、echo
tail-f test. log
top檢視記憶體
df-lh檢視磁碟
ps-a16行程
ps-a
#就就就是所有程式
#。
變數使用$:定義並使用常數的時候則不需要使用$ 符號。
常數的值必須是定值,且不能是變量,類別屬性,數學運算的結果或函數呼叫。 介面(interface)中也可定義常數。 抽象類別不能被實例化。抽象類別中可以有靜態方法。抽象類別中可以沒有抽象方法。 普通方法,存放類別內,只有一份靜態方法,也是存放於類別內,只有一份
差別在於:
普通方法需要對象去調用,需要綁定$this 即,普通方法,必須要有對象,然後讓對象來調用 而靜態方法,因此不屬於哪一個對象,因此不屬於哪一個對象,因此不屬於哪一個對象,因此不屬於哪一個對象需要綁定$this 即,不需要物件也可以呼叫靜態成員:不需要實例化就能訪問,類別的靜態成員變數只屬於這個類別類別成員:一種是在類別中定義,一種是在建構函數中定義。方法和函數的差異:
函數是單獨存在的,方法是依賴類別存在的,只能透過物件呼叫。 類別檔案是否可以定義函數: 不行值傳遞與值參考:
(1)按值傳遞:函數範圍內對值的任何改變在函數外部都會被忽略(2)按引用傳遞:函數範圍內對值的任何改變在函數外部也能反映出這些修改
(3)優缺點: A:以值傳送時,php必須複製數值。特別是對於大型的字串和物件來說,這將會是一個代價很大的操作。B.依引用傳遞則不需要複製值,對於效能提升很有好處。
防止訂單重複提交:
1.使用JS讓按鈕在點擊一次後停用(disable)。採用此方法可以防止多次點擊的發生###### 2.設定session值.提交一次後,刪除,如果沒有session值,不讓提交.###### 3cookie一樣#### #####字串函數:######### strlen();strpos();echo();implode();trim();等、、、######### #字串反轉函數:######### strrev, mb_string;#########http1.0######與http1.1###的差異:## #### HTTP1.0規定瀏覽器與伺服器只保持短暫的連接,瀏覽器的每次請求都需要與伺服器建立一個TCP連接,伺服器完成請求處理後立即斷開TCP連接,######伺服器不追蹤每個客戶也不記錄過去的請求。 ###HTTP1.1支持持久连接,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。
HTTP1.1还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,
以保证客户端能够区分出每次请求的响应内容,这样也显著地减少了整个下载过程所需要的时间
HTTP1.0不支持Host请求头字段。
H TTP1.1中增加Host请求头字段。
全局变量跟局部变量的区别:
1.作用域不同:全局变量的作用域为整个程序,而局部变量的作用域为当前函数或循环等
2.内存存储方式不同:全局变量存储在全局数据区中,局部变量存储在栈区
3.生命期不同:全局变量的生命期和主程序一样,随程序的销毁而销毁,局部变量在函数内部或循环内部,随函数的退出或循环退出就不存在了
4.使用方式不同:全局变量在声明后程序的各个部分都可以用到,但是局部变量只能在局部使用。函数内部会优先使用局部变量再使用全局变量
需要注意一点的是,局部变量不能赋值为同名全局变量的值。
前端的优化:
第一:面向内容的优化
1.减少 HTTP 请求
2.减少 DNS 查找
3.避免重定向
4.使用 Ajax 缓存
5.延迟载入组件
6.预先载入组件
7.减少 DOM 元素数量
8.切分组件到多个域
9.最小化 iframe 的数量
10. 不要出现http 404 错误
第二:面向 Server
1.缩小 Cookie
2.针对 Web 组件使用域名无关性的
什么是缓存雪崩?
当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力。
如何避免?
1:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
2:不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。
3:做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期(此点为补充)
tp路由模式:
1.普通模式 2. 重写模式 3.兼容模式
niginx端口号怎么配置:
在那个nginx.conf中配置两个serve,分别为不同的端口号。
jq获取table标签的第二行:
$(tr:eq(1))
可变变量是什么:
可变变量允许我们动态地改变一个变量的名称。是用一个变量的值作为另一个变量的名称。
查看端口有没有被占用: 修改权限 修改所有者 修改用户组
netstat –apn chmod chown chgrp
查看进程
Top pa aux|grep
#所有人新增執行權限:
#所有人新增執行權限:##Mysql
主從複製: 從函式庫產生兩個線程,一個I/O線程,一個SQL執行緒;
i/ o線程去請求主庫的binlog,並將得到的binlog日誌寫到relay log(中繼日誌) 文件中;
主庫會產生一個log dump 線程,用來給從庫i/o線程傳binlog;
SQL線程,會讀取relay log檔案中的日誌,並解析成特定操作,以實現主從的操作一致,而最終資料一致;
主從複製所需要的指令:
## showmaster status;
startsalve; GRANTREPLICATIONSLAVE,RELOAD,SUPER ON *.* TOmysql_backup@'%'## TOmysql_backup@'%'
#### CHANGEMASTER TOmaster_host = '127.0.0.1',
master_user='mysql_backup',## log_file='mysql-bin .000001',master_log_pos = 3696;
解決主鍵衝突問題
建立一個總表,id從總表裡面分發。
#主機複製:
1.分別在兩台機器授權帳號: grant replication slave, file, select on *.* to'repl'@'10.17.%'identified by 'xxxx'
2.設定檔/etc/my.cnf,使用主函式庫設定檔的基礎上,加入以下組態項目
#nginx
反向代理程式:(1 )rr輪詢(預設)
依照請求順序分配到每個RS,和lvs中的rr演算法一樣,如果RS宕機,會自動剔除,預設只偵測80端口,如果RS報402、403、503、504錯誤,會直接回傳給客戶端。
(2)weight(權重)
在rr的基礎上加上權重(預設為rr weight),權重輪詢和存取成正比,值越大分配的越多,可以根據伺服器的設定設定權重,可以解決伺服器效能不均進行請求分配的問題(3)ip_hash 解決動態網頁session共享問題
每個每個每個每個存取請求依照IP位址的hash值分配,ip的hash值只要相同就會被分配到同一台伺服器上(lvs負載平衡的-p參數,keepalived配置裡的persistence_timeout50),該調度演算法可以解決動態網頁session共享問題,但有時會導致請求分配不均,
提示:由於國內用的都是nat模式,所以hash不適合使用
ip_hash無法和其他的一塊使用,即不能使weight或backup
(4)fair(第三方)
依照後端伺服器的回應時間來配置,回應時間短的優先分配,比上面的都更智能,此種演算法可以依照頁面大小和載入時間長短智慧的進行負載平衡,nginx本身不支援fair,需要下載nginx的upstrea_fair模組
(5)url_hash(第三方)
# 主要應用於快取伺服器上
依照存取的url來分配請求,讓相同的url定向到同一個伺服器,後端伺服器為快取伺服器的時候效果更顯著,在upstream中加入hash語句,server語句中不能寫入weight等其他的參數,hash_method是使用的hash演算法。
缺點:如果有機器宕機了,那就苦了,consistent_hash可以解決這個問題
可以提高後端快取伺服器的效率,nginx本身不支援url_hash的,需要下載hash軟體
(6)least_conn
最少連線數,哪個連線少就分配到哪台裝置
(7)consistent_hash
一致性演算法
#
3、負載平衡:
負載平衡部署方式: 路由模式(建議)# 路由模式(建議) 橋接模式 服務直接返回模式# 輪伺服器,從1至N然後重新開始。此種均衡演算法適合於伺服器群組中的所有伺服器都有相同的軟硬體配置並且平均服務請求相對均衡的情況。
權重輪循均衡:根據伺服器的不同處理能力,給每個伺服器分配不同的權值,使其能夠接受對應權值數的服務請求。例如:伺服器A的權值設計成1,B的權值是3,C的權 值是6,則伺服器A、B、C將分別接受到10%、30%、60%的服務請求。此種均衡演算法能確保高效能的伺服器得到更多的使用率,避免低效能的伺服器負載過重。
隨機平衡:將來自網路的請求隨機分配給內部中的多個伺服器。
權重隨機平衡:此種均衡演算法類似權重輪循演算法,不過在處理請求分擔時是個隨機選擇的過程
#4、負載平衡與反向代理的差異# 反向代理程式是指實現負載平衡的方法。
先談反向代理。使用者在請求時,先把請求發送給代理的伺服器,然後由代理伺服器根據演算法去請求真實的伺服器,最後再回傳給使用者。這種做法,其 一是提高了安全性;
其二是透過多台的real server分擔了使用者的請求,實現了負載平衡。
再談負載平衡。負載平衡的出現,是透過橫向的擴展,盡可能降低單一伺服器的壓力。常見WEB層面的負載平衡的方案有硬體F5、Nginx代理、LVS、各個雲端商的負載平衡服務(如AWS的ELB服務)等。負載平衡後面連的一般是實際提供服務的伺服器,如透過ELB服務,可以做到流量的平均分擔,從而減少單機伺服器的壓力。
由於增加了負載平衡這層,單純使用某一方案還是要考慮單點的問題。負責由於負載平衡這個伺服器未能承受壓力,宕機了,服務也是不可用的。所以Nginx、LVS盡量設定多台代理,可以故障轉移和故障警報,以便及時去處理代理層伺服器的問題。 ELB是亞馬遜提供的服務,它本身的實現底層就有數百甚至上千的機器,所以把它想像成一個代理集群就好。
#
怎麼實作session分享: 我們應該先明確,為什麼要實現共享,假設你的站點是存放在一個機器上,那麼是不存在這個問題的,由於會話資料就在這台機器,可是假設你使用了負載平衡把請求分發到不同的機器呢?這時候會話id在client是沒有問題的,可是假設用戶的兩次請求到了兩台不同的機器,而它的session數據可能存在當中一台機器,這個時候就會出現取不到session數據的情況,於是session的共享就成了一個問題
1.基於NFS的Session共享
2.基於資料庫的Session共享
## ## 4.基於快取(Memcache)的Session共享
5.session複製
#
變數的作用域:作用域的作用域:
全域變量,局部變量。
建立壓縮檔:zip、gzip、bzip2、tar Zcvf;
##varchar20
能存多少個漢字?
必須先確定mysql版本
4.0版本以下,varchar(20),指的是20字節,如果存放UTF8漢字時,只能存16個(每個漢字3字節)
5.0版本以上,varchar( 20),指的是20字符,無論存放的是數字、字母還是UTF8漢字(每個漢字3字節),都可以存放20個
其實最好的方法是在自己資料庫中建個表試試可以放多少漢字,現在mysql都5.0已上了,varchar(20)是可以存20個漢字的
做登入的時候用戶名和密碼怎麼儲存的:
一般我們用cookie將使用者資訊會儲存在客戶端,例如實現一個七天免登陸等。
我們在登入的時候先設定cookie的參數,將使用者名稱和密碼都儲存起來,下次當跳到下一個頁面的時候,
我們可以先判斷有沒有cookie的值,如果有就直接跳到下一個頁面,如果沒有那麼就要提示請登入。
實現cookie的儲存後,使用者就能不使用輸入密碼就可以登入成功了!
#檢視防火牆的指令(Centos7.0之前):
檢視防火牆狀態: service iptables status
開啟防火牆:service iptables start
關閉防火牆:service iptables stop
oo#簇索引與非聚集索引:
1、叢集索引 a)一個索引項目直接對應實際資料記錄的儲存頁,可謂「直達」 b)主鍵缺省使用它 c)索引項目的排序和資料行的儲存排序完全一致,利用這一點,想修改資料的儲存順序,可以透過改變主鍵的方法(撤銷原有主鍵,另找也能滿足主鍵要求的一個字段或一組字段,重建主鍵) d)一個表格只能有一個聚簇索引(理由:資料一旦存儲,順序只能有一種)2、非聚集索引
a)不能「直達」,且可能連鎖地存取多級頁表後,才能定位到資料頁 b)一個表格可以有多個非聚集索引
#單登入:
一.登陸原則說明 單一登入的技術實現機制:當使用者第一次造訪應用系統1的時候,因為尚未登入,會被引導到認證系統中進行登入;根據使用者提供的登入信息,認證系統進行身份效驗,如果通過效驗,應該返回給使用者一個認證的憑證--ticket;使用者再訪問別的應用程式的時候,就會將這個ticket帶上,作為自己認證的憑證,應用系統接受到請求之後會把ticket送到認證系統進行效驗,檢查ticket的合法性。如果透過效驗,使用者就可以在不用再登入的情況下存取應用系統2和應用系統3了。 可以看出,要實現SSO,需要以下主要的功能: a)所有應用系統共享一個認證系統; b)所有應用系統能夠識別和提取ticket資訊; c)應用系統能夠辨識已登入的用戶,且能自動判斷目前使用者是否已登入過,以完成單一登入的功能#基於上述基本原則,本人以php語言設計了一套單一登入系統的程序,目前已投入正式生成伺服器運作。本系統程序,將ticket資訊以全系統唯一的 session id作為媒介,從而取得目前線上使用者的全站資訊(登陸狀態資訊及其他所需要處理的使用者全站資訊)。
登陸流程:
## 1.第一次登陸某個站:
a)使用者輸入使用者名稱密碼,向使用者驗證中心發送登入請求
### b)目前登入站點,透過webservice請求,使用者驗證中心驗證使用者名,密碼的合法性。如果驗證通過,則產生ticket,用於標識目前會話的用戶,並將目前登陸子站的網站識別碼記錄到用戶中心,最後###c)將取得的使用者資料和ticket交回至子站。如果驗證不通過,則傳回對應的錯誤狀態碼。
d)根據上一步的webservice請求返回的結果,當前子站對用戶進行登陸處理:如狀態碼表示成功的話,則當前站點通過本站cookie保存ticket,並本站記錄用戶的登入狀態。狀態碼表示失敗的話,則給使用者對應的登入失敗提示。
2. 登陸狀態下,使用者前往另一子:
a)透過本站cookie或session驗證使用者的登入狀態:如驗證通過,進入正常本站處理程序;否則戶中心驗證使用者的登入狀態(發送ticket到使用者驗證中心),如驗證通過,則對傳回的使用者資訊進行本機的登入處理,否則表示使用者未登入。
登出流程:
a)目前登出站清除使用者本站的登入狀態及本地儲存的使用者全站唯一的隨機id
b)透過webservice接口,清除全站記錄的全站唯一的隨機id。 webservice介面會傳回,登出其他已登入子站的javascript程式碼,本站輸出此程式碼。
c)js程式碼存取對應站W3C標準的登出腳本
類別常數如何定義:
Const
#
什麼是抽象方法:
## 沒有方法的方法為抽象方法、使用關鍵字abstract來修飾.ajax的資料類型,參數:
1 .json 2.jsonp 3.xml 4.html#三級連動:## ##
解決主鍵衝突
設定檔指令
auto_increment_increment=2
5.#為什麼要使用會話控制
# http協定是一個無狀態的協定透過session ID來識別使用者
6.# httpHTTPS ip
7 HTTP
協議是什麼 超文本傳輸協議
8. XML
##與HTML是什麼; XML是可擴充標記語言 HTML HTML HTML為超文本標記語言
9、jsonp
是什麼 進行跨域請求的一種方式利用了
##10.yii
框架小部件
小部件基本上在views中使用,在視圖中可呼叫yii\base\Widget::widget() 方法使用小部件。
11.tp
框架設定檔
common/config.php
12.tp
框架的單字母方法
C獲取配置值 D實例化Model類
L語言定義函數 I取得輸入參數 M用於實例化一個沒有模型檔案的Model#...13 .
回呼函數
array_map、array_walk、array_reduce##
##方法
parent::$aphp錯誤等級:
fatalerror 致命錯誤:0000## fatalerror 致命錯誤:0000 0000100000001000開啟1warning警告錯誤: 0000 0000 0000 010 開啟 2
NOTICE警告: 0000 0000 0001 000
8> ##區別:while是先判斷再執行 dowhile 為先執行再判斷;
11方法:
__desctruct();__get();__set();__isset()
析構方法,程式結束時自動呼叫 __destrcut():
魔術常數:
##function class file
##子查詢:
(使用內層查詢結果當作外層查詢的比較條件)#orderorder by 來查詢最新的商品 selectgoods_id,goods_name from goods where goods_id = (select max(goods_id)fromgoods);
##
## MySAM InnoDB 差異:innodb寫入操作快速、支援事務、資料行鎖定、支援外鍵,但不支援全文索引, InnoDB的主鍵範圍較大,最大是MyISAM的2倍。 MyISAM不支援事務和外鍵,讀取操作快、支援資料鎖定表、 GIS資料 、全文索引(因為它不支援中文分詞,所以MyISAM的全文索引其實沒啥用)。
session#和cookie
的區別:
1,session 在伺服器端,cookie在客戶端(瀏覽器) 2,session 預設存在在伺服器的一個檔案裡(不是記憶體)
3,session 的運作依賴session id,而依賴session id 是存在cookie中的,也就是說,如果瀏覽器停用了cookie ,同時session 也會失效(但是可以透過其它方式實現,例如在url 中傳遞session_id) 4,session 可以放在檔案、資料庫、或記憶體中都可以。 5,使用者驗證此場合一般會用session
介面和抽象類別有何不同:#1
、抽象類別和介面都不能直接實例化,如果要實例化,抽象類別變數必須指向實作所有抽象方法的子類別對象,介面變數必須指向實作所有介面方法的類別對象。
2、抽象類別要被類別繼承,介面要被類別實作。
3、介面只能做方法申明,抽象類別中可以做方法申明,也可以做方法實作
4、介面裡定義的變數只能是公共的靜態的常數,抽象類別中的變數是普通變數。
5、抽象類別裡的抽象方法必須全部被子類別所實現,如果子類別無法全部實作父類別抽象方法,那麼此子類別只能是抽象類別。同樣,一個實作介面的時候,如不能全部實作介面方法,那麼該類別也只能為抽象類別。
6、抽象方法只能申明,不能實現,介面是設計的結果,抽象類別是重構的結果
7、抽象類別裡可以沒有抽象方法
###8###、如果一個類別裡面有抽象方法,那麼這個類別只能是抽象類別############ ###9###、抽象方法要實現,所以不能是靜態的,也不能是私有的。 ######10、介面可繼承接口,並可多繼承接口,但類別只能單一繼承。
for#迴圈和foreach迴圈哪個快?
foreach循環數組時,指針會自動指向下一個元素,不需要計算數組長度,沒有條件判斷和自增變量,所以性能肯定要比for高。
刪除表中20-30歲間,所有男性的所有資料:
Deleteform 表名where sex =0 and age between 20和 30;
靜態化和偽靜態的差異和好處?
靜態化的網頁一般以.html或htm結尾,位址對應的是一個文件,這個檔案實實在在的存在於網站伺服器的某個目錄中。
好處: 1.當訪客造訪網頁的時候,不讀取資料庫,直接存取網站空間對應的檔案。 (直接讀取文件)
2.純靜態的網頁對搜尋引擎友好,是最容易被搜尋引擎所收錄的。 (易收錄)
3.由於造訪網頁的時候,不需要伺服器做過多的處理,對伺服器的壓力最小,所以,更容易應付高訪問量。 (節省伺服器壓力)
4.一些面對資料庫的攻擊例如SQL注入攻擊,面對靜態網頁的時候常常難以從位址入手。 (安全性高)
偽靜態實質上還是動態的,在資料的處理過程上和動態的一樣。
好處:在網址的形式上看,偽靜態的位址和靜態的可以一摸一樣,普通的訪客不容易分出是真靜態還是偽靜態(易收錄)
#
支付寶同步回呼與非同步回呼:
當一個支付請求傳送到支付管道方,支付管道很快就會回傳一個結果。但這個結果,只是告訴你呼叫成功了,不是扣款成功,這叫同步呼叫。很多新手會拿這個結果當作支付成功了,那就會被坑死,結果就是支付成功率特別高,伴隨著一堆無法解釋的壞賬率,測試人員尤其要注意測試數據的篡改:金額,同步回傳結果,訂單號等。
同步請求參數裡面會有一個回呼位址,這個位址是支付頻道在扣款成功後呼叫的,這叫非同步呼叫。 一般同步介面只檢查參數是否正確,簽章是否無誤等。非同步介面才告訴你扣款結果。一般非同步介面有5秒以內的延遲。呼叫不成功會重試。有時候這邊成功了,但支付管道側沒收到返回,於是會繼續調。當天的支付到第二天還在 被非同步呼叫也都是正常的。這也是開發人員需要特別注意的地方,不要做重複付款。測試人員也要對重複回調進行測試,應只有一次有效。這還不是最坑的,一般支付管道側,只有支付成功了才通知你。要是支付失敗了,壓根兒都不告訴你。另一方面,如何老收不到非同步結果呢?那就得查查了。同步結果不可靠,非同步呼叫不可靠,那要怎麼確定支付結果?最終的殺招就是查單了,反查,一般支付渠道側都會提供反查接口,定時獲取DB中待支付的訂單調用支付渠道側的反查接口,最終把支付渠道側扣款成功的訂單完成掉。
以上是PHP面試題的小結的詳細內容。更多資訊請關注PHP中文網其他相關文章!

PHPSession失效的原因包括配置錯誤、Cookie問題和Session過期。 1.配置錯誤:檢查並設置正確的session.save_path。 2.Cookie問題:確保Cookie設置正確。 3.Session過期:調整session.gc_maxlifetime值以延長會話時間。

在PHP中調試會話問題的方法包括:1.檢查會話是否正確啟動;2.驗證會話ID的傳遞;3.檢查會話數據的存儲和讀取;4.查看服務器配置。通過輸出會話ID和數據、查看會話文件內容等方法,可以有效診斷和解決會話相關的問題。

多次調用session_start()會導致警告信息和可能的數據覆蓋。 1)PHP會發出警告,提示session已啟動。 2)可能導致session數據意外覆蓋。 3)使用session_status()檢查session狀態,避免重複調用。

在PHP中配置會話生命週期可以通過設置session.gc_maxlifetime和session.cookie_lifetime來實現。 1)session.gc_maxlifetime控制服務器端會話數據的存活時間,2)session.cookie_lifetime控制客戶端cookie的生命週期,設置為0時cookie在瀏覽器關閉時過期。

使用數據庫存儲會話的主要優勢包括持久性、可擴展性和安全性。 1.持久性:即使服務器重啟,會話數據也能保持不變。 2.可擴展性:適用於分佈式系統,確保會話數據在多服務器間同步。 3.安全性:數據庫提供加密存儲,保護敏感信息。

在PHP中實現自定義會話處理可以通過實現SessionHandlerInterface接口來完成。具體步驟包括:1)創建實現SessionHandlerInterface的類,如CustomSessionHandler;2)重寫接口中的方法(如open,close,read,write,destroy,gc)來定義會話數據的生命週期和存儲方式;3)在PHP腳本中註冊自定義會話處理器並啟動會話。這樣可以將數據存儲在MySQL、Redis等介質中,提升性能、安全性和可擴展性。

SessionID是網絡應用程序中用來跟踪用戶會話狀態的機制。 1.它是一個隨機生成的字符串,用於在用戶與服務器之間的多次交互中保持用戶的身份信息。 2.服務器生成並通過cookie或URL參數發送給客戶端,幫助在用戶的多次請求中識別和關聯這些請求。 3.生成通常使用隨機算法保證唯一性和不可預測性。 4.在實際開發中,可以使用內存數據庫如Redis來存儲session數據,提升性能和安全性。

在無狀態環境如API中管理會話可以通過使用JWT或cookies來實現。 1.JWT適合無狀態和可擴展性,但大數據時體積大。 2.Cookies更傳統且易實現,但需謹慎配置以確保安全性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

Atom編輯器mac版下載
最受歡迎的的開源編輯器