Session與cookie的區別
- cookie資料存放在客戶的瀏覽器上,session資料放在伺服器上,以檔案的形式存放,可以從php.ini裡面的session.save_path找到存放位置
- cookie不是很安全 ,cookie可以進行cookie欺騙,別人可以獲取cookie中的session id考慮到安全應當使用session。
- session會在一定時間內儲存在伺服器上。當訪問增多,會比較佔用你伺服器的效能
- 考慮到減輕伺服器,效能方面,應當使用COOKIE。
- 單個cookie儲存的資料不能超過4K,很多瀏覽器都限制一個站點最多儲存20個cookie。
- 所以個人建議:將登陸資訊等重要資訊存放為SESSION其他資訊如果需要保留,可以放在COOKIE中
什麼是Session?
- Session是另一種記錄客戶狀態的機制,不同的是Cookie儲存在客戶端瀏覽器中,而Session儲存在伺服器上。
- 客戶端瀏覽器訪問伺服器的時候,伺服器把客戶端資訊以某種形式記錄在伺服器上。
- 這就是Session。客戶端瀏覽器再次訪問時只需要從該Session中查詢該客戶的狀態就可以了。
.什麼是Cookie?
- Cookie意為“甜餅”,是由W3C組織提出,最早由Netscape社群發展的一種機制。
- 目前Cookie已經成為標準,所有的主流瀏覽器如IE、Netscape、Firefox、Opera等都支援Cookie。
- 由於HTTP是一種無狀態的協議,伺服器單從網路連線上無從知道客戶身份。
- 怎麼辦呢?就給客戶端們頒發一個通行證吧,每人一個,無論誰訪問都必須攜帶自己通行證。
- 這樣伺服器就能從通行證上確認客戶身份了。這就是Cookie的工作原理。
- Cookie實際上是一小段的文字資訊。
- 客戶端請求伺服器,如果伺服器需要記錄該使用者狀態,就使用response向客戶端瀏覽器頒發一個Cookie。
- 客戶端瀏覽器會把Cookie儲存起來。
- 當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給伺服器。
- 伺服器檢查該Cookie,以此來辨認使用者狀態。伺服器還可以根據需要修改Cookie的內容。
Session的優缺點?優點
- 如果要在諸多Web頁間傳遞一個變數,那麼用Session變數要比通過QueryString傳遞變數可使問題簡化。
- 要使WEb站點具有使用者化,可以考慮使用Session變數。
- 你的站點的每位訪問者都有使用者化的經驗,基於此,隨著LDAP和諸如MS Site Server等的使用,已不必再將所有使用者化過程置入Session變數了,而這個使用者化是取決於使用者喜好的。
- 你可以在任何想要使用的時候直接使用session變數,而不必事先宣告它,這種方式接近於在VB中變數的使用。
- 使用完畢後,也不必考慮將其釋放,因為它將自動釋放。
缺點
- Session變數和cookies是同一型別的。
- 如果某使用者將瀏覽器設定為不相容任何cookie,那麼該使用者就無法使用這個Session變數!
- 當一個使用者訪問某頁面時,每個Session變數的執行環境便自動生成,這些Session變數可在使用者離開該頁面後仍保留20分鐘!(事實上,這些變數一直可保留至“timeout”。“timeout”的時間長短由Web伺服器管理員設定。一些站點上的變數僅維持了3分鐘,一些則為10分鐘,還有一些則保留至預設值20分鐘。)所以,如果在Session中置入了較大的物件(如ADO recordsets,connections, 等等),那就有麻煩了!隨著站點訪問量的增大,伺服器將會因此而無法正常執行!
- 因為建立Session變數有很大的隨意性,可隨時呼叫,不需要開發者做精確地處理,所以,過度使用session變數將會導致程式碼不可讀而且不好維護。
Cookie的優缺點?
優點
- 極高的擴充套件性和可用性
- 通過良好的程式設計,控制儲存在cookie中的session物件的大小。
- 通過加密和安全傳輸技術(SSL),減少cookie被破解的可能性。
- 只在cookie中存放不敏感資料,即使被盜也不會有重大損失。
- 控制cookie的生命期,使之不會永遠有效。偷盜者很可能拿到一個過期的cookie。
缺點
- Cookie數量和長度的限制。
- 每個domain最多隻能有20條cookie,每個cookie長度不能超過4KB,否則會被截掉。
- 安全性問題。如果cookie被人攔截了,那人就可以取得所有的session資訊。即使加密也與事無補,因為攔截者並不需要知道cookie的意義,他只要原樣轉發cookie就可以達到目的了。
- 有些狀態不可能儲存在客戶端。例如,為了防止重複提交表單,我們需要在伺服器端儲存一個計數器。如果我們把這個計數器儲存在客戶端,那麼它起不到任何作用。
使用場景
- cookie用於存放前臺臨時內容,比如sessionid,購物車業務中的商品資訊,使用容易被竊取。
- Session用於存放後臺的使用者資訊跟cookie進行會話機制,用於系統登入業務邏輯
作用
- cookie的作用是解決HTTP協議中缺少無狀態缺陷的問題
- 由於cookie是在客戶端,並不安全,另外如果瀏覽器禁用了cookie也會導致會話記錄失敗.
- 而session儲存在伺服器,是相對安全的.由服務端很方便控制儲存到各種介質中.
- php的php.ini配置檔案裡可以設定session的路徑和回收空置率的.
Cookie被禁用session能否使用?
Cookie被禁用時並不影響session的使用,只不過coookie不能存放sessionid而已,可以使用hidden隱藏區域存放
Token的作用?
Token學名就是令牌,就是定於驗證碼,比如網站後臺使用時間戳md5加密每20加密一次存放在cookie,或者前端中,當前端與後臺進行通訊時在驗證這個自定義的驗證碼是否於後。 臺的驗證碼一致,如果一致為正常,如果不一致則為惡意攻擊
什麼是Xss攻擊?怎麼防止?
什麼是Xss攻擊
Xss又稱css,全稱:跨站式指令碼攻擊,問題出現的原因:使用者在輸入內容時故意輸入css或者js程式碼使網站在載入內容時執行惡意程式造成網站無法正常執行或者惡意盜取資訊
防止
- 正則過濾特殊字元,比如< > = ‘’
- 去除html標籤 strp_tags()
- 利用php函式特殊字元轉義 htmlentities() addslashes()
Php資料型別有那些?
- 4種標量 int 整型 float浮點型 boolean布林型 string字串型
- 2種複合 object物件 array陣列
- 2種資源 null空 resource資源
Php執行模式?如何執行?
Nignx+php fast cgi
命令列模式 cli
Apache+php web模式
Iss+php ISAPI模式
老版本的nginx+php cgi
Fastcgi執行機制
cgi的升級版,多程式,說明cgi每次執行都需要載入php.ini等配置檔案,所以速度慢,而fastcgi父程式載入一次,子程式不需要載入,所以速度快。
Web模組執行機制
是以php的擴充套件形式安裝在apache下當需要解析php程式碼時,則直接呼叫php擴充套件功能。
cLi命令列模式
就是直接執行在命令列,linux和windos都支援
ISAPI模式
是IIS微軟作業系統自帶的web伺服器把php原始碼發給php進行解析
Php-fpm是什麼?php-fpm與ningx如何互動?
是什麼
- Php-fpm是php的程式管理器,f代表fast-cgi,p代表process,m代表manager
- Php-fpm是fast –cgI程式管理器,他是對於fast ci協議的具體實現他負責管理一個程式池,來處理web伺服器的請求,在php5.3版本以後,php-fpm是內建與php中。
如何互動
fpm預設通過監聽9000埠,當請求到nginx web伺服器時,nginx開啟相應地址下的php檔案把原始碼通過9000埠傳送到php-fpm,php-fpm再把原始碼通過php程式進行解析原始碼,把結果返回到ningx在返回客戶端。
php是單繼承還是多繼承?如何實現多繼承?
- PHP類不支援多繼承,也就是子類只能繼承一個父類,但是介面可以實現多繼承, 可以繼承一個或者多個介面。當然介面的繼承也是和類的繼承一樣使用extends關鍵字,要多個繼承的話只要用逗號把繼承的介面隔開即可。
- 自 PHP 5.4.0 起,PHP 實現了一種程式碼複用的方法,稱為
trait
。Trait
是為類似 PHP 的單繼承語言而準備的一種程式碼複用機制。Trait 和 Class 相似,Trait
可以理解為一組能被不同的類都能呼叫到的方法集合,但Traits
不是類!不能被例項化.
Git merge與git rebsae的區別?,git pull與git fetch的區別?
-
Git merge是多分支合併,按時間順序排序,比如主分支有歷史版本是前天,今天,二從分支只有昨天,則合併後歷史版本是前天,昨天,今天
-
Git rebase 多分支合併時,時間有的時候會缺失,並且把當前的分支歷史版本放在別合併的歷史版本後面座位最新版本,則合併後的歷史版本是,前天,今天,昨天。
-
git pull是把拉下的分支內容與當前分支進行權柄,
-
git fetch只把資料拉下來並不合併。Git pull = git fetch+git merge
原生php如何動態獲取函式引數個數,引數列表與引數值?
- func_num_args — 返回傳入函式的引數總個數
- func_get_args — 返回傳入函式的引數列表
- func_get_arg — 根據引數索引從引數列表返回引數值
mysql資料庫怎麼備份?
- 備份資料庫 mysqldump 資料庫名> sql
- 備份資料表 mysqldump -uroot -p -B 資料庫名 –table 表名
- 匯入資料庫 mysqldump –uroot -p 資料庫,名 < sql
常見的魔術類方法?分別是什麼時候觸發?
- __construct 建構函式 初始化賦值 例項化物件的時候自己呼叫
- __destruct 析構方法,PHP將在物件被銷燬前(即從記憶體中清除前)呼叫這個方法
- __get( $property ) 當呼叫一個未定義的屬性時,此方法會被觸發,傳遞的引數是被訪問的屬性名
- __set( $property, $value ) 給一個未定義的屬性賦值時,此方法會被觸發,傳遞的引數是被設定的屬性名和值 這裡的沒有宣告包括當使用物件呼叫時,訪問控制為proteced,private的屬性(即沒有許可權訪問的屬性)。
- __isset( $property ) 當在一個未定義的屬性上呼叫isset()函式時呼叫此方法
- __unset( $property ) 當在一個未定義的屬性上呼叫unset()函式時呼叫此方法
- _call( $method, $arg_array ) 當呼叫一個未定義的方法是呼叫此方法
- __autoload 函式,它會在試圖使用尚未被定義的類時自動呼叫。通過呼叫此函式,指令碼引擎在 PHP 出錯失敗前有了最後一個機會載入所需的類。
- clone 複製一個物件時自動呼叫clone方法,如果在物件複製需要執行某些初始化操作,可以在clone方法實現。
- __toString 方法在將一個物件轉化成字串時自動呼叫,比如使用echo列印物件時。
- __sleep 序列化的時候用
- __wakeup 反序列化的時候呼叫 _invoke
- invoke當嘗試以呼叫函式的方式呼叫一個物件時,invoke 方法會被自動呼叫。
- callStatic 它的工作方式類似於 call() 魔術方法,__callStatic() 是為了處理靜態方法呼叫
什麼是rest api?
- 一種軟體架構風格、設計風格,而不是標準,只是提供了一組設計原則和約束條件。
- 它主要用於客戶端和伺服器互動類的軟體。
- 基於這個風格設計的軟體可以更簡潔,更有層次,更易於實現快取等機制。每一個URI代表一種資源;
什麼是json?json支援那些資料型別?
什麼是josn
- JSON(JavaScript Object Notation, JS 物件簡譜) 是一種輕量級的資料交換格式。
- 它基於 ECMAScript (歐洲計算機協會制定的js規範)的一個子集,採用完全獨立於程式語言的文字格式來儲存和表示資料。簡潔和清晰的層次結構使得 JSON 成為理想的資料交換語言。
- 易於人閱讀和編寫,同時也易於機器解析和生成,並有效地提升網路傳輸效率。
- JSON 具有自我描述性,更易理解
- JSON 比 XML 更小、更快,更易解析。
資料格式
數字(整數或浮點數)
字串(在雙引號中)
布林(true 或 false )
陣列(在方括號中)
物件(在花括號中)
null
簡述php的垃圾回收機制是如何實現的?
- 簡稱gc,PHP使用了引用計數機制來回收。
- 每個物件都內含一個引用計數器,每個reference連結到物件,計數器加1,當reference離開物件被設為null,計數器減1,當某個引用計數器的物件為0時,PHP知道你將不再需要使用這個物件,釋放其所佔有的記憶體空間
- 簡單來說就是:在PHP中,沒有任何變數指向一個物件的時侯,這個物件就成為垃圾。
寫出構造方法的兩種表現形式和解構函式的作用?
- 構造方法的兩種表現形式:__construct(){}類名(){}
- 解構函式的作用:是物件被銷燬時被呼叫,作用是釋放記憶體(__destruct())
請分別寫出定義常量和靜態常量的區別?
- 定義常量:使用 define() 函式 - 它使用三個引數:
首個引數定義常量的名稱
第二個引數定義常量的值
可選的第三個引數規定常量名是否對大小寫不敏感。預設是 false
- 靜態常量:靜態常量,一般用const修飾
請簡述http和https的區別?
區別
- http 的URL 以http:// 開頭,https以https:// 開頭。
- http 標準埠是80 ,https是443。
- https 協議需要到ca申請證照,http不需要。
- http 是超文字傳輸協議,資訊是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。
- http 的連線很簡單,是無狀態的,https協議是由SSL+http協議構建的可進行加密傳輸、身份認證的網路協議 要比http協議安全。
優點:
- 通過證照可以更信任伺服器。
- 更安全,防篡改。
缺點:
- https 需要證照。
- 因為對傳輸進行加密,會一定程度增加cpu消耗。
- 由於https 要還金鑰和確認加密演算法的需要,所以首次建立連線會慢一些。
- 頻寬消耗會增加。
簡述composer的原理?以及composer include composer install composer require的區別?
composer 是 PHP5.3以上 的一個依賴管理工具。
它允許你宣告專案所依賴的程式碼庫,它會在你的專案中為你安裝他們。Composer 不是一個包管理器。
是的,它涉及 "packages" 和 "libraries",但它在每個專案的基礎上進行管理,在你專案的某個目錄中(例如 vendor)進行安裝。
預設情況下它不會在全域性安裝任何東西。因此,這僅僅是一個依賴管理
composer install命令從當前目錄讀取 composer.json 檔案,處理了依賴關係,並把其安裝到 vendor 目錄下
composer update為了獲取依賴的最新版本,並且升級 composer.lock 檔案
composer require 指定下載的版本
陣列實現佇列用那些函式?
- PHP的陣列處理函式還可以將陣列實現佇列,堆疊是“先進後出”。在堆疊中,最後壓入的資料(進棧),將會被最先彈出(出棧)。而佇列是先進先出,就如同銀行的排號機
- 而PHP中,將陣列當作是佇列則主要是用array_push()和array_shift()實現
- 出棧主要是利用array_shift()函式將陣列的第一個元素彈出,並將陣列的長度減1
Php的工作原理?
PHP的所有應用程式都是通過WEB伺服器(如IIS,Nginx或Apache)和PHP引擎程式解釋執行完成的工作過程
(1)當使用者在瀏覽器地址中輸入要訪問的PHP頁面檔名,然後觸發一個web請求,並將請求傳送到WEB伺服器。
(2)WEB伺服器接受這個請求,並根據其字尾進行判斷是一個PHP請求,WEB伺服器從硬碟或記憶體中調出使用者要訪問的PHP應用程式,並將其傳送給PHP引擎程式。
(3)PHP引擎程式將會對WEB伺服器傳送過來的檔案從頭到尾進行掃描並根據命令從後臺讀取,處理資料,並動態地生成相應的HTML頁面。
(4)PHP引擎將生成HTML頁面返回給WEB伺服器。WEB伺服器再將HTML頁面返回給客戶端瀏覽器。
什麼是類,什麼是抽象類,什麼是介面,什麼是繼承?
類的概念
- 類是具有相同屬性和行為的一組物件的集合,它為屬於該類的全部物件提供了統一的抽象描述,其內部包括屬性和行為兩個主要部分。
- 舉例:類就好比人類,類有各種屬性和各種方法,就像每個人類有姓名,年齡,身高,體重等屬性,也有吃飯,睡覺,走路等,具有相同的行為, 所以,人構成一個類,即人類。
- 使用的關鍵詞是class。
抽象類
- 抽象就是不具體,不能例項化成具體的例項,可以理解成類的模板,定義為抽象的類不能被例項化。
- 在任何一個類,如果它裡面至少有一個方法是被宣告為抽象的,那麼這個類就必須被宣告為抽象類,否則會報錯。
- 被定義為抽象的方法只是宣告瞭其呼叫方式(引數),不能定義其具體的功能實現。使用“abstract”修飾
介面
- 我們可以通過interface來定義一個介面,就像定義一個標準的類一樣,但其中定義所有的方法都是空的。
- 使用介面(interface),你可以指定某個類必須實現哪些方法,但不需要定義這些方法的具體內容。
- 介面中定義的所有方法都必須是public,這是介面的特性。
實現介面
- 要實現一個介面,可以使用implements操作符。類中必須實現介面中定義的所有方法,否則 會報一個fatal錯誤。如果要實現多個介面,可以用逗號來分隔多個介面的名稱。
- 實現多個介面時,介面中的方法不能有重名。
- 介面也可以繼承,通過使用extends操作符。
- 介面中也可以定義常量。介面常量和類常量的使用完全相同。 它們都是定值,不能被子類或子介面修改。
繼承
Php單繼承 ,PHP類不支援多繼承,也就是子類只能繼承一個父類,但是支援多層次繼承。
概念 關鍵詞
父類只是一個平常的類,要想有後代你只需要在平常類後加一個extends關鍵字就可以繼承,這樣子類只擁有了父類所有的屬性和方法。
繼承許可權問題
- 父類private方法不可被繼承,父類私有化
- 父類protected方法可以被繼承,但不能被例項化物件呼叫,父類對此方法置於保護模式下
- 父類public方法可以被繼承、可以被例項化物件呼叫,屬於公開方法
- 子類可重寫父類public或者protected的方法,不能重寫private的方法,如果同名只是在本類重新宣告
Include,require,include_once,require_once 的區別?
include與require的區別
- include與require除了在處理引入檔案的方式不同外,
- 最大的區別就是:include 在引入不存檔案時產生一個警告且指令碼還會繼續執行, require在引入不存檔案則會導致一個致命性錯誤且指令碼停止執行。
include_once與require_once的區別
include_once,require_once函式的作用與include相同,不過它會首先驗證是否已包含該檔案。如果已經包含,則不再執行include_once。其他同include一樣。
ajax的優點
- 最大的一點是頁面無重新整理,在頁面內與伺服器通訊,給使用者的體驗非常好。
- 使用非同步方式與伺服器通訊,不需要打斷使用者的操作,具有更加迅速的響應能力。
- 可以把以前一些伺服器負擔的工作轉嫁到客戶端,利用客戶端閒置的能力來處理,減輕伺服器和頻寬的負擔,
- 基於標準化的並被廣泛支援的技術,不需要下載外掛或者小程式。
ajax的缺點
- ajax幹掉了back按鈕,即對瀏覽器後退機制的破壞
- 安全問題因為ajax技術就像是直接建立一個通道,會暴露比以前資料和伺服器邏輯
- 對搜尋引擎的支援比較弱
- 一些手機裝置現在還不能更好的支援ajax
簡述DOM載入順序和常用的事件
DOM載入順序
1.解析HTML結構。
2.載入外部指令碼和樣式表檔案。
3.解析並執行指令碼程式碼。
4.構造HTML DOM模型。
5.載入圖片等外部檔案。
6.頁面載入完畢
焦點事件
:當元素獲得焦點或失去焦點時觸發
- blur:失去焦點時觸發,這個事件不會冒泡
- focus:獲得焦點時觸發,不冒泡
- focusin:在獲得焦點時觸發,但他冒泡,DOM3新增
- focusout:在失去焦點時觸發,冒泡
滑鼠事件
:當使用者通過滑鼠在頁面上執行操作時觸發
- click:單擊事件,使用者單機滑鼠按鈕(一般是左鍵)或按下Enter鍵時觸發
- dbclick:雙擊事件,當雙擊滑鼠時觸發(一般是左鍵)
- mousedown:當使用者在按下任意滑鼠按鈕時觸發
- mouseup:當使用者釋放滑鼠按鈕時觸發
鍵盤事件
- keydown:當使用者在按下任意鍵盤按鈕時觸發
- keyup:當使用者釋放鍵盤按鈕時觸發
- Change: 當內容發生變動時
簡述MySQL的引擎,myisam和innodb的區別?
(1)[事務]MyISAM是非事務安全型的,而InnoDB是事務安全型的,
(2)[鎖]MyISAM鎖的粒度是表級,而InnoDB支援行級鎖定。
(3)[全文索引]MyISAM支援全文型別索引,而InnoDB不支援全文索引(5.7之前)。
(4)[查詢效率]MyISAM相對簡單,所以在效率上要優於InnoDB,小型應用可以考慮使用MyISAM。
(5)[外健]MyISAM不支援外健,InnoDB支援。
(6) MyISAM表是儲存成檔案的形式,在跨平臺的資料轉移中使用MyISAM儲存會省去不少的麻煩。
簡述session儲存原理和實現session共享的方式
儲存原理
- 當使用者第一次訪問站點時,PHP會用session_start()函式為使用者建立一個session ID,這就是針對這個使用者的唯一標識
- 每一個訪問的使用者都會得到一個自己獨有的session ID,這個session ID會存放在響應頭裡的cookie中,之後傳送給客戶端。這樣客戶端就會擁有一個該站點給他的session ID。
- 當使用者第二次訪問該站點時,瀏覽器會帶著本地存放的cookie(裡面存有上次得到的session ID)隨著請求一起傳送到伺服器,服務端接到請求後會檢測是否有session ID,如果有就會找到響應的session檔案,把其中的資訊讀取出來;如果沒有就跟第一次一樣再建立個新的。
- 通常站點的退出功能,實際上就是呼叫一下session_destroy()函式(也有可能更復雜些),把該使用者的session檔案刪除,再把使用者的cookie清除。這樣客戶端和服務端就算沒有聯絡了。
- 因為HTTP是無狀態的,所以一次請求完成後客戶端和服務端就不再有任何關係了,誰也不認識誰。但由於一些需要(如保持登入狀態等),必須讓服務端和客戶端保持聯絡,session ID就成了這種聯絡的媒介了。
客戶端的工作
- 通過上面的分析我們可以知道session實際上是依賴與cookie的,當使用者訪問某一站點時,瀏覽器會根據使用者訪問的站點自動搜尋可用的cookie,如果有可用的就隨著請求一起傳送到了服務端。每次接收到服務端的響應時又會更新本地的cookie資訊。
- 當然也可以用GET方式來傳遞session ID,但不推薦用GET,這樣不安全。
服務端的工作
由上面的流程圖可以看到,服務端實際上是把產生的一些資料存放在了session檔案中,該檔案的名字就是”sess“加上session ID,這些檔案的存放位置就是phpinfo()查到的session.savepath值。
Session共享:
php支援把session資料儲存到memcache/redis記憶體伺服器,手動把seesion的檔案改為nfs網路系統檔案,從而實現檔案的跨機器共享。
什麼是mvc?
- Mvc是程式分為 模型 model-檢視 view-控制器 controller
- 模型(m) 是指資料庫層操作,比如資料庫操作。
- 檢視(v) 是展示給使用者的圖形化介面,試圖還需要護理使用者的操作
- 控制器(c)
- MVC全名是Model View Controller,是模型(model)-檢視(view)-控制器(controller)的縮寫,一種軟體設計典範,用一種業務邏輯、資料、介面顯示分離的方法組織程式碼,將業務邏輯聚集到一個部件裡面,在改進和個性化定製介面及使用者互動的同時,不需要重新編寫業務邏輯。
- MVC被獨特的發展起來用於對映傳統的輸入、處理和輸出功能在一個邏輯的圖形化使用者介面的結構中。
優點
耦合性低、重用性高、生命週期成本低、部署快、可維護性高、有利軟體工程化管理
缺點
沒有明確的定義、不適合小型,中等規模的應用程式、增加系統結構和實現的複雜性、檢視與控制器間的過於緊密的連線、檢視對模型資料的低效率訪問、一般高階的介面工具或構造器不支援模式
Js 中網頁前進和後退的程式碼
- 前進: history.forward();或者history.go(1);
- 後退: history.back()或者history.go(-1);
- 重新整理:window.location.reload();
列舉你常見的設計模式,並說明在什麼場景下使用?
單例模式
- 單例模式是一種常用的軟體設計模式。
- 在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。
- 應用場景:如果希望在系統中某個類的物件只能存在一個,單例模式是最好的解決方案。
工廠模式
- 工廠模式主要是為建立物件提供了介面。
- 應用場景如下:
- a、 在編碼時不能預見需要建立哪種類的例項。
- b、 系統不應依賴於產品類例項如何被建立、組合和表達的細節。
策略模式
- 策略模式:定義了演算法族,分別封裝起來,讓它們之間可以互相替換。此模式讓演算法的變化獨立於使用演算法的客戶。
- 應用場景如下。
a、 一件事情,有很多方案可以實現。
b、我可以在任何時候,決定採用哪一種實現。
c.、未來可能增加更多的方案。
d、 策略模式讓方案的變化不會影響到使用方案的客戶。- 舉例業務場景如下。
系統的操作都要有日誌記錄,通常會把日誌記錄在資料庫裡面,方便後續的管理,但是在記錄日誌到資料庫的時候,可能會發生錯誤,比如暫時連不上資料庫了,那就先記錄在檔案裡面。日誌寫到資料庫與檔案中是兩種演算法,但呼叫方不關心,只負責寫就是。
觀察者模式
- 觀察者模式又被稱作釋出/訂閱模式,定義了物件間一對多依賴,當一個物件改變狀態時,它的所有依賴者都會收到通知並自動更新。
- 應用場景如下:
a、對一個物件狀態的更新,需要其他物件同步更新,而且其他物件的數量動態可變。
b、物件僅需要將自己的更新通知給其他物件而不需要知道其他物件的細節。
迭代器模式
- 迭代器模式提供一種方法順序訪問一個聚合物件中各個元素,而又不暴露該物件的內部表示。
- 應用場景如下:
當你需要訪問一個聚集物件,而且不管這些物件是什麼都需要遍 歷的時候,就應該考慮用迭代器模式。其實stl容器就是很好的迭代器模式的例子。
模板方法模式
- 模板方法模式定義一個操作中的演算法的骨架,將一些步驟延遲到子類中,模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些步驟。
- 應用場景如下:
對於一些功能,在不同的物件身上展示不同的作用,但是功能的框架是一樣的。
請寫出php5許可權控制修飾符?
- Private私有的
- protected受保護的
- public 共有的
如何例項化一個名為myclass的物件?
$myclass=new 物件()
如何我的網站使用的utf8編碼,為防止亂碼出現,需要注意那些問題?
- 資料庫中庫和表欄位中都用utf8_general_ci編碼
- php連線mysql,指定資料庫編碼為utf8 mysql_query(“set namesutf8”);
- php檔案指定頭部編碼為utf-8 header(“content-type:text/html;charset=utf-8”);
- 網站下所有檔案的編碼為utf8
- html檔案指定編碼為utf-8 < content="text/html;charset=utf-8" />
請解析如下錯誤提示可能是什麼問題?Catchable fatal error:Argument 1 passed to dok() must be an array,integer given ,called in /www/html/test.php on line 2
問題是引數1傳遞時不是陣列
請問PHP中 echo 和 print print_r var_dump有什麼區別?
- Echo 不是一個函式,可以一次輸出多個值,多個值之間用逗號分隔,echo只能列印出普通變數的值。
- print是一個語法結構(language constructs), 他並不是一個函式
- Print_r作用是輸出一個陣列結構
- Var_dump函式輸出陣列結構,但並不格式化
請問 GET和POST方法有什麼區別?
- GET在瀏覽器回退時是無害的,而POST會再次提交請求。
- GET產生的URL地址可以被注入,而POST不可以。
- GET請求會被瀏覽器主動cache,而POST不會,除非手動設定。
- GET請求只能進行url編碼,而POST支援多種編碼方式。
- GET請求引數會被完整保留在瀏覽器歷史記錄裡,而POST中的引數不會被保留。
- GET請求在URL中傳送的引數是有長度限制的,而POST麼有。
- 對引數的資料型別,GET只接受ASCII字元,而POST沒有限制。
- GET引數通過URL傳遞,POST放在請求體中。
如何使用php實現多繼承?
- PHP類不支援多繼承,也就是子類只能繼承一個父類,但是介面可以實現多繼承, 可以繼承一個或者多個介面。當然介面的繼承也是和類的繼承一樣使用extends關鍵字,要多個繼承的話只要用逗號把繼承的介面隔開即可。
- 自 PHP 5.4.0 起,PHP 實現了一種程式碼複用的方法,稱為 trait。Trait 是為類似 PHP 的單繼承語言而準備的一種程式碼複用機制。Trait 和 Class 相似,Trait可以理解為一組能被不同的類都能呼叫到的方法集合,但Traits不是類!不能被例項化.
如何解決ajax請求快取的問題?
url引數新增隨機數或時間戳 , 字尾的方式解決問題,這樣就會多了一個一直在變的引數
寫出一下服務預設使用的埠號 FTP ssh https redis smtp Php-fpm mysql mongo
- FTP的埠是 21
- SSH服務使用tcp 22 埠
- HTTPS伺服器,預設的埠號為 443/tcp 443/udp
- SMTP預設的埠號為25/tcp
- mysql預設埠是3306
- redis預設埠號6379
- Php-fpm預設埠號9000
- Mongo預設埠號27017
如何防止sql 注入?簡要說明常用的方法以及和其優缺點?
什麼是sql注入
所謂SQL隱碼攻擊,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的SQL命令。具體來說,它是利用現有應用程式,將(惡意的)SQL命令注入到後臺資料庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的資料庫,而不是按照設計者意圖去執行SQL語句
如何防止
1:對使用者的輸入進行校驗,可以通過正規表示式,或限制長度;對單引號和雙"-"進行轉換等
2:檢查輸入的資料是否具有所期望的資料格式,嚴格限制變數的型別
3 : 不要把機密資訊直接存放,加密或者hash掉密碼和敏感的資訊
4:使用pdo過濾傳入的引數
5.應用的異常資訊應該給出儘可能少的提示,最好使用自定義的錯誤資訊對原始錯誤資訊進行包裝
6::永遠不要使用動態拼裝sql,可以使用引數化的sql或者直接使用儲存過程進行資料查詢存取
簡要說明以下PHP擴充套件的用途 APC iconv curl sockets reflection
- APC PHP快取”。它為我們提供了快取和優化PHP的中間程式碼的框架。 APC的快取分兩部分:系統快取和使用者資料快取。
- iconv字符集轉換 可以轉換檔案或者資料的字符集編碼格式
- curl curl是一個非常強大的開源庫,支援很多協議,包括HTTP、FTP等,我們使用它來傳送HTTP請求。它給我 們帶來的好處是可以通過靈活的選項設定不同的HTTP協議引數,並且支:持HTTPS。CURL可以根據URL字首是“HTTP” 還是“HTTPS”自動選擇是否加密傳送內容。
- Socket:又稱之為“套接字”,是系統提供的用於網路通訊的方法。比如使用php搭建web伺服器,長連結使用
- reflection:這個功能使得程式設計師可以通過PHP程式碼,就可以得到某object的所有資訊,並且可以和它互動
PHP獲取遠端的內容有哪些方法?
1.用file_get_contents方法 以get方式獲取遠端內容:
2.使用curl庫,使用curl庫之前,可能需要檢視一下php.ini擴充套件是否已經開啟了,curl擴充套件可實現不通過瀏覽器 從本伺服器直接請求另一個伺服器的作用
Memache和memcached的區別?
memcached 支援 Binary Protocol,而 memcache 不支援,意味著 memcached 會有更高的效能。不過,還需要注意的是,memcached 目前還不支援長連線。memcached 比 memcache 支援更多的 memcache 協議,大概也就是說 memcached 有更多的方法,比如 getMulti() 和 setMulti() 函式非常有用,但是 memcache 並不支援。
防止session_id洩露的方法?
1:在登入驗證成功後,通過重置session,使之前的匿名sessionId失效,這樣可以避免使用偽造的sessionId進行攻擊。request.getSession().invalidate();這樣登入前與登入後的sessionID就不會相同
2設定httpOnly屬性
httponly是微軟對cookie做的擴充套件,該值指定 Cookie 是否可通過客戶端指令碼訪問, 解決使用者的cookie可能被盜用的問題,減少跨站指令碼攻擊
主流的大多數瀏覽器已經支援此屬性。httpOnly是cookie的擴充套件屬性,並不包含在servlet2.x的規範裡,因此一些javaee應用伺服器並不支援httpOnly,針對tomcat,>6.0.19或者>5.5.28的版本才支援httpOnly屬性,具體方法是在conf/context.xml新增httpOnly屬性設定。3:另一種設定httpOnly的方式是使用Tomcat的servlet擴充套件直接寫header
response.setHeader( "Set-Cookie", "name=value; HttpOnly");
Ning日誌怎麼統計每個ip的訪問量?
日誌檔案所在地方:
/var/log/nginx/access_iqueendress.com.log
/var/log/nginx/access_m.iqueendress.com.log
cd /var/log/nginx/
1.根據訪問IP統計UV
awk '{print $1}' access_iqueendress.com.log|sort | uniq -c |wc -l
awk '{print $1}' access_m.iqueendress.com.log|sort | uniq -c |wc -l
awk '{print $1}' access*.log|sort | uniq -c |wc -l
4.查詢訪問最頻繁的IP 倒序排序列表
awk '{print $1}' access*.log|sort | uniq -c |sort -n -k 1 -r|more
1.根據訪問IP統計UV
awk '{print $1}' access.log|sort | uniq -c |wc -l
2.統計訪問URL統計PV
awk '{print $7}' access.log|wc -l
3.查詢訪問最頻繁的URL
awk '{print $7}' access.log|sort | uniq -c |sort -n -k 1 -r|more
4.查詢訪問最頻繁的IP
awk '{print $1}' access.log|sort | uniq -c |sort -n -k 1 -r|more
5.根據時間段統計檢視日誌
cat access.log| sed -n '/14\/Mar\/2015:21/,/14\/Mar\/2015:22/p'|more
Laravel框架的中介軟體如何實現?
中介軟體為過濾進入應用的 HTTP 請求提供了一套便利的機制。例如,Laravel 內建了一箇中介軟體來驗證使用者是否經過認證(如登入),如果使用者沒有經過認證,中介軟體會將使用者重定向到登入頁面,而如果使用者已經經過認證,中介軟體就會允許請求繼續往前進入下一步操作。
當然,除了認證之外,中介軟體還可以被用來處理很多其它任務。比如:CORS 中介軟體可以用於為離開站點的響應新增合適的頭(跨域);日誌中介軟體可以記錄所有進入站點的請求,從而方便我們構建系統日誌系統。
Php框架中單入口功能的實現原理以及必要性?
大部分php框架都是單一入口模式,竟來的所有http請求都會指向一個檔案,從這個入口檔案進去,進去再去訪問別的檔案進行相應的操作,而這個原理就是php與伺服器的配合,講所有請求的路徑轉換給index。Php做字串請求的判斷即可達到路由解析功能,由於所有的http請求都由index。Php接受,所以可以集中的安全性檢查
請分別寫出避免sql注入和xss攻擊的方法?
xss防止
1: 正則過濾特殊字元,比如< > = ‘’
2去除html標籤 strp_tags()
3 利用php函式特殊字元轉義 htmlentities() addslashes()
sql如何防止
1對使用者的輸入進行校驗,可以通過正規表示式,或限制長度;對單引號和雙"-"進行轉換等
2:檢查輸入的資料是否具有所期望的資料格式,嚴格限制變數的型別
3 : 不要把機密資訊直接存放,加密或者hash掉密碼和敏感的資訊
4:使用pdo過濾傳入的引數
5.應用的異常資訊應該給出儘可能少的提示,最好使用自定義的錯誤資訊對原始錯誤資訊進行包裝
6::永遠不要使用動態拼裝sql,可以使用引數化的sql或者直接使用儲存過程進行資料查詢存取
Apache和ningx的區別以及用法?優缺點?
Apache
:Web伺服器端軟體,由於其跨平臺和安全性被廣泛使用,是最流行的web伺服器端軟體之一,特點是:簡單、速度快、效能穩定,並可做代理伺服器來使用。
Apache優點:
- Apache的rewrite比nginx強大,在rewrite頻繁的情況下,用apache。
- Apache超穩定。
- Apache對php支援比較簡單,nginx需要配合其他後端使用。
- apache 在處理動態請求有優勢,nginx 在這方面是雞肋,一般動態請求要 apache 去做,nginx 適合靜態和反向。
- apache 仍然是目前的主流,擁有豐富的特性,成熟的技術和開發社群。
- apache 更為成熟,少 bug ,nginx 的 bug 相對較多
- Nginx:輕量級的web伺服器/反向代理伺服器及電子郵件代理伺服器,其特點是:佔用記憶體少,併發能力強,國內向百度、京東、淘寶等都在使用。
ningx優點:
- 輕量級,採用 C 進行編寫,同樣的 web 服務,會佔用更少的記憶體及資源。
- 抗併發,nginx 以 epoll and kqueue 作為開發模型,處理請求是非同步非阻塞的,負載能力比 apache 高很多,而 apache 則是阻塞型的。在高併發下 nginx 能保持低資源低消耗高效能 ,而 apache 在 PHP 處理慢或者前端壓力很大的情況下,很容易出現程式數飆升,從而拒絕服務的現象。
- nginx 的設計高度模組化,編寫模組相對簡單。
- nginx 作為負載均衡伺服器,支援 7 層負載均衡。
- nginx 處理靜態檔案好,靜態處理效能比 apache 高三倍以上。
- nginx 配置簡潔,正則配置讓很多事情變得簡單,而且改完配置能使用 -t 測試配置有沒有問題,apache 配置複雜 ,重啟的時候發現配置出錯了,會很崩潰。
對於框架中路由實現的大致方法?
通過偽靜態來實現單一入口,將所有請求通過apache偽靜態解析轉給某個指定檔案,然後通過php的
$_SERVER[]
這個全域性變數來去的請求的路徑字串,對其進行解析再分配指定的類去處理。
基本思路
瀏覽器端通過URL字串提供控制器類的名字和方法的名字,PHP據此找到對應得類和方法。
幾種程式設計模式,在什麼時候使用?
- 初級模式:初級模式就是前臺介面和業務處理程式碼混合在一起,在哪裡顯示,就在哪裡處理。這種模式是php程式設計最初級的模式,也是最原始的。如果一個程式比較小,不需要太複雜的處理,就可以使用這種模式。
- 分層模式:分層模式就是把介面和業務分開,放在不同檔案中,是一種物件導向程式設計模式,形成多個層次,責任分工。
- MVC模式:一種物件導向程式設計模式,把軟體系統 分為三個基本部分:模型 (Model)、檢視(View)和控制器(Controller)。MVC模式用一種業務邏輯、資料、介面顯示分離的方法組織程式碼,可有效提升程式碼的重用性。
控制器有兩個作用:
1.調取檢視進行頁面顯示
2.調取模型實現具體邏輯程式碼的執行程式,最終將結果返回給控制器
Echo count(’www.baidu.com’)輸出什麼?
Count() 函式用來計算取值範圍內的數字項的個數。
www.baidu.com是一個字串所以輸出的是1
http協議中的幾個狀態碼以及含義?
- 100:客戶必須繼續傳送請求
- 200:請求成功
- 203:返回資訊不確定或者不完整
- 205:伺服器完成了請求,使用者代理必須復位當前已經瀏覽過的檔案
- 301:刪除請求資料
- 302:在其他地址發現了請求資料
- 400:錯誤請求
- 403:請求不允許
- 404:找不到檔案
- 500:伺服器產生內部錯誤
- 501:伺服器不支援請求的函式
- 503:伺服器所在或暫停維修
單點登入的實現原理?
簡介
單點登入是在多個應用系統中,使用者只需要登入一次就可以訪問所有相互信任的應用系統的保護資源,若使用者在某個應用系統中進行登出登入,所有的應用系統都不能再直接訪問保護資源,
像一些知名的大型網站,如:淘寶與天貓、新浪微博與新浪部落格等都用到了這個技術。
原理
單點登入 有一個獨立的認證中心,只有認證中心才能接受使用者的使用者名稱和密碼等資訊進行認證,其他系統不提供登入入口,只接受認證中心的間接授權。
間接授權通過令牌實現,當使用者提供的使用者名稱和密碼通過認證中心認證後,認證中心會建立授權令牌,在接下來的跳轉過程中,授權令牌作為引數傳送給各個子系統,子系統拿到令牌即得到了授權,然後建立區域性會話。
對名稱空間的理解?
- 一般情況向,在一個php程式原始碼檔案或同一個請求中是不允許有兩個以上相同名稱的類名、常量名或者函式名的,這樣的話,程式在執行的時候就會報錯。但是,在很多實際情況下,我們是無法避免在同一個檔案下有兩個以上相同名稱的類名、常量名或者函式名的。這種情況下就需要引入名稱空間。
- 我們把這個PHP檔案想象成是一個資料夾,而裡面的兩個函式想象成是兩個檔案,但是在同一個資料夾下是不允許有兩個相同名稱的檔案的,所以我們就必須的將他們分到兩個不同名稱的資料夾中。名稱空間的道理就是這樣的。
名稱空間可以解決下面兩個問題:
(1)使用者編寫的程式碼與PHP內部的類/函式/常量或第三方類/函式/常量之間的名字衝突。
(2)為很長的識別符號建立一個別名,提高程式碼的可讀性,減少程式碼的編寫量。
往一張資料量比較大的表中新增欄位,怎麼新增?
Php魔術方法?
- __construct 建構函式 初始化賦值 例項化物件的時候自己呼叫
- __destruct 析構方法,PHP將在物件被銷燬前(即從記憶體中清除前)呼叫這個方法
- __get 當呼叫一個未定義的屬性時,此方法會被觸發,傳遞的引數是被訪問的屬性名
- __set( $property, $value ) 給一個未定義的屬性賦值時,此方法會被觸發,傳遞的引數是被設定的屬性名和值 這裡的沒有宣告包括當使用物件呼叫時,訪問控制為proteced,private的屬性(即沒有許可權訪問的屬性)。
- __isset( $property ) 當在一個未定義的屬性上呼叫isset()函式時呼叫此方法
- __unset( $property ) 當在一個未定義的屬性上呼叫unset()函式時呼叫此方法
- _call( $method, $arg_array ) 當呼叫一個未定義的方法是呼叫此方法
- __autoload 函式,它會在試圖使用尚未被定義的類時自動呼叫。通過呼叫此函式,指令碼引擎在 PHP 出錯失敗前有了最後一個機會載入所需的類。
- clone 複製一個物件時自動呼叫clone方法,如果在物件複製需要執行某些初始化操作,可以在clone方法實現。
- __toString 方法在將一個物件轉化成字串時自動呼叫,比如使用echo列印物件時。
- __sleep 序列化的時候用
- __wakeup 反序列化的時候呼叫 _invoke
- invoke當嘗試以呼叫函式的方式呼叫一個物件時,invoke 方法會被自動呼叫。
- callStatic 它的工作方式類似於 call() 魔術方法,__callStatic() 是為了處理靜態方法呼叫
請看一下$_SERVER[‘REMOTE_ADDR’]和$_SERVER[‘HTTP_X_FORWARED_FOR’]的作用和區別?
- php中
$_SERVER參
數HTTP_X_FORWARDED_FOR &REMOTE_ADDR與獲取IP- 在PHP 中使用
$_SERVER["REMOTE_ADDR"]
來取得客戶端的 IP地址,但如果客戶端是使用代理伺服器來訪問,那取到的就是代理伺服器的 IP 地址,而不是真正的客戶端 IP 地址。- 要想透過代理伺服器取得客戶端的真實 IP 地址,就要使用
$_SERVER["HTTP_X_FORWARDED_FOR"]
來讀取。
請列舉自己常用的PHP函式,並說明其作用?
陣列函式
- array_change_key_case — 返回字串鍵名全為小寫或大寫的陣列
- array_chunk — 將一個陣列分割成多個
- array_slice — 從陣列中取出一段
- array_keys — 返回陣列中部分的或所有的鍵名
- array_flip — 交換陣列中的鍵和值
- array_count_values — 統計陣列中所有的值出現的次數
字串函式
- strlen:獲取字串長度,位元組長度
- substr_count 某字串出現的次數
- substr:字串擷取,獲取字串
- str_split 函式把字串分割到陣列中
- trim:去掉函式兩邊的字元,預設是空格
- ucfirst 首字母大寫
如何確保多個程式同時寫一個檔案成功,請用PHP實現?
function write_file($filename, $content)
{
$lock = $filename . '.lck';
$write_length = 0;
while(true) {
if( file_exists($lock) ) {
usleep(100);
} else {
touch($lock);
$write_length = file_put_contents($filename, $content, FILE_APPEND);
break;
}
}
if( file_exists($lock) ) {
unlink($lock);
}
return $write_length;
}
如何把一個正常頁面的狀態碼輸出為404?
404
關於400狀態碼代表請求時出現的錯誤 404狀態碼代表未找到
如何輸出
- 我們要把正常頁面得狀態碼輸出為404非常簡單 可以使用PHP頭部header的方法
- Header(‘http/1.1 404 NOT FOUND’) 頁面未找到
- 禁止用echo直接輸0出一個404 例如 echo 404; 這種方法禁止
jQuery中ajax 方式有同步和非同步的方式請問引數名是什麼?什麼時候用同步方式?什麼時候非同步方式?
- jquery中ajax方法有個屬性async用於控制同步和非同步,預設是true,即ajax請求預設是非同步請求,如果是false,表示同步。
- async值為true (非同步)
- 當ajax傳送請求後,在等待server端返回的這個過程中,前臺會繼續 執行ajax塊後面的指令碼,直到server端返回正確的結果才會去執行success
- async值為false (同步)
- 當執行當前AJAX的時候會停止執行後面的JS程式碼,直到AJAX執行完畢後時,才能繼續執行後面的JS程式碼
應用場景
- 當AJAX處理業務,並且不希望在有返回值後執行其後的程式碼,這個時候採用非同步
- 當AJAX處理業務,並且希望在有返回值後執行其後的程式碼,這個時候採用同步
Memcache記憶體滿了怎麼辦?
存到硬碟,作業系統都有虛擬記憶體,當記憶體滿了,都會存到虛擬記憶體裡而虛擬記憶體是存放在硬碟上,所以MEMCACHE滿了會存到硬碟要麼就增加記憶體空間,要麼將一些臨時用的資料操作完之後,立即銷燬,避免佔記憶體。
Php中魔術常量以及作用?
- LINE 檔案中的當前行號。
- FILE 檔案的完整路徑和檔名。如果用在被包含檔案中,則返回被包含的檔名
- DIR 檔案所在的目錄。如果用在被包括檔案中,則返回被包括的檔案所在的目錄
- FUNCTION 本常量返回該函式被定義時的名字(區分大小寫)
- TRAIT 返回 trait 被定義時的名字(區分大小寫)Trait 名包括其被宣告的作用區域
- METHOD類的方法名,返回該方法被定義時的名字(區分大小寫)
- NAMESPACE當前名稱空間的名稱
什麼是魔術常量?
講解PHP常量的時候,我們知道PHP中的常量大部分都是不變的,但是有8個預定義常量會隨著他們所在程式碼位置的變化而變化,這8個常量被稱為魔術常量,這些特殊的常量是不區分大小寫。
Php的按值傳遞和引用值傳遞? ~
按值傳遞
:原來引數的值在呼叫其他函式之後還是原來的值,函式內對值的任何改變在函式外部都會被忽略。引用傳遞
:改變了原來的值, 函式內對值的任何改變在函式外部也能反映出這些修改應用場景
:按值傳遞時,php必須複製值,而按引用傳遞則不需要複製值,故引用傳遞一般用於大字串或物件。優缺點
: 按值傳遞時,php必須複製值。對於大型字串和物件來說,這樣做代價很大。按引用傳遞則不需要複製值,對於效能提高有好處。
Mysql中說出二個聚合函式?
- 聚合函式 count(),求資料表的行數
- 聚合函式 max(),求某列的最大數值
- 聚合函式min(),求某列的最小值
- 聚合函式sum(),對資料表的某列進行求和操作
- 聚合函式avg(),對資料,表的某列進行求平均值操作
什麼是聚合函式?
聚合函式aggregation function又稱為組函式。 認情況下 聚合函式會對當前所在表當做一個組進行統計。
聚合函式的特點
1.每個組函式接收一個引數(欄位名或者表示式) 統計結果中預設忽略欄位為NULL的記錄
2.要想列值為NULL的行也參與組函式的計算,必須使用IFNULL函式對NULL值做轉換。
3.不允許出現巢狀 比如sum(max(xx))
簡述論壇中無限分類的實現原理(常用方法)?
舉例
就像windows下新建一個資料夾,在新建的資料夾下又可以新建一個資料夾,這樣無限迴圈下去,無限分類也是這樣,父類可以分 出它子類,子類又可以分出它的子類,這樣一直無限迴圈下去。
實現方法
是對資料完成多次分類,如同一棵樹一樣,從根開始,到主幹、枝幹、葉子……完成無限極分類,主要運用了兩種方法一是遞迴方式,二是迭代方式。
用PHP列印出前一天的時間格式是2006-5-10 22:21:21?
- echo date('Y-m-d H:i:s',strtotime('-1 month',time()))//列印出前一個月
- echo date('Y-m-d H:i:s', strtotime('-1day')); //前一天
- echo date('Y-m-d H:i:s', strtotime('-1week'));//前一週
- echo date('Y-m-d H:i:s');//現在時間
- echo date('Y-m-d H:i:s', strtotime('next Monday'));//下一個星期一
- echo date('Y-m-d H:i:s', strtotime('last Monday'));//上一個星期一
如果要求每隔5分鐘執行一次腳five.php如何實現?
linux的指令碼程式
crontab */5 * * * * /usr/local/php/bin/php five.php
請用正規表示式寫出一個函式驗證ip地址的格式是否正確?
#[1-255]\.[1-255]\.[1-255]\.[1-255]#
用PHP寫出顯示客戶端IP和伺服器IP的程式碼?
echo "(1)瀏覽當前頁面的使用者的 IP 地址為:";
echo $_SERVER['REMOTE_ADDR'];
echo "(2)瀏覽當前頁面的使用者的 IP 地址為:";
echo getenv('REMOTE_ADDR');
echo "主機 www.baidu.com 的 IP 地址為:";
echo gethostbyname(www.baidu.com);
如何增加PHP指令碼的允許執行時間?
1、在php.ini裡面設定
max_execution_time = 120;
2、通過PHP的ini_set()函式設定
ini_set("max_execution_time", "120");
3、通過set_time_limit ()函式設定
set_time_limit(120);
以上幾個數字設定為0則無限制,指令碼會一直執行下去,直到執行結束。
所以,需要長時間執行的指令碼,一般在php程式碼開頭處新增如下程式碼就可以了set_time_limit(0)
常用的PHP debug工具以及debug思路有哪些?
12個PHP除錯工具,它們將有助於開發人員輕鬆找出並除錯應用程式及指令碼中的錯誤。下面的PHP除錯工具支援Ajax請求,幷包含通用資料採集器和基於堆疊的錯誤處理器。我希望你能在未來的專案中體會到這個列表的方便和有用之處。
Kint
當除錯PHP程式碼時,var_dump()、print_r()和debug_backtrace()是我們最常用的工具。Kint,一個開源軟體,一個不需安裝的替代者,它提供了更好的除錯體驗。它巧妙地檢測幾乎不可讀的資料,並將它們定製成規則的輸出顯示。變數名、檔案、行號及包裝的函式它全能提示出來。
DebugBar
DebugBar是一個自由開源軟體,它可以被整合到任何PHP專案用來收集和定位資料。它沒有第三方依賴,支援Ajax請求,包含通用資料收集器且整合常見的庫。生成的bar是100% JavaScript實現的並被放置在頁面底部(像開發工具一樣)。新的收集器和檢視可以被輕鬆的新增,並且可以儲存或重新執行以前的請求。
Pinba
Pinba是一個可作為PHP統計服務使用的開源MySQL儲存引擎。它使用收到的資料來分析PHP應用效能並快速定位任何問題。
PHPMD
PHPMD是一個易於配置,對PHP原始依賴指標友好的前端。它在你的程式碼中的尋找多種潛在問題,包括可能的bug、不適合的程式碼、未使用的引數等。
Xde Bug
Xdebug是一個自由開源的用於除錯足浴盆和分析PHP指令碼細節的PHP擴充套件。由於它是一個擴充套件,所以使用起來很方便,且在編碼端只需要很少的設定。它可以提供錯誤資訊中堆疊跟蹤和函式跟蹤的所有資料,包括使用者定義函式的所有引數、函式名、檔名以及行標誌。Xdebug還可以提供記憶體分配、分析資訊和程式碼覆蓋率分析的資料。
Whoops
Whoops是一個使錯誤處理和除錯更容易的PHP庫。這個庫提供基於堆疊的錯誤處理,並且有一個好看的介面。它有一個處理異常的簡單API,能夠跟蹤幀及它們的資料,並可以與任何框架整合(end和Silex已經內建整合)。
Krumo
很多PHP開發者使用print_r()和var_dump()對輸出難讀或未格式化的結果進行除錯。Krumo是這些足浴盆函式的一個替代者,它可以顯示任何 PHP變數的結構化資訊。Krumo執行後,輸出會顯示成一個圍繞PHP變數的可摺疊的DHTML樹結構。同時,它通過自身把除錯過程“關掉”而不是禁用程式碼裡的所有追溯路徑的能力加快了除錯過程。
Php Debugger
除錯是發現並修復bug的過程,PHP Debugger是幫助你快速的找到錯誤並將它們從你的PHP程式中移除的最好的工具。你可以在PHPEd中設定足浴盆遠端除錯,通過Wizardand DBG嚮導中的PHP除錯設定開啟。
Php Debug
PHP_Debug的基本目的是在除錯PHP程式碼時提供援助。
Webgrind
Xdebug是最受歡迎的PHP除錯擴充套件之一。它提供了許多有用資料來幫助你在原始碼中查詢bug。
PHP_Dyn
PHP_Dyn是有一個優秀的開源PHP除錯工具。你可以跟蹤函式執行並得到函式引數和返回值的一個輸出。
MacGDBp
MacGDBp是一個MAC OS上的PHP偵錯程式。它有你所期望的所有特性,是一個包含逐句執行及設定斷點等功能的全功能偵錯程式。
debug思路
首先從問題看起,因為問題都是介面顯示出來的,所以先找到介面問題所觸及到的方法,然後通過頁面debug,看引數傳遞是否有問題,若無問題,再看到介面然後找到對應問題操作時所對應的方法,整個debug跑一遍方法,確定問題所在。
Php超全域性變數有那些?
1:
$_SERVER
超級全域性變數包含由web伺服器建立的資訊,它提供了伺服器和客戶配置及當前請求環境的有關資訊
2:$_GET
超級全域性變數包含使用GET方法傳遞的引數的有關資訊。
3:$_POST
超級全域性變數包含用POST方法傳遞的引數的有關資訊。
4:$_COOKIE
超級全域性變數儲存了通過HTTP cookie傳遞到指令碼的資訊。這些cookie一般是由以前執行的PHP指令碼通過PHP函式setcookie ( ) 設定的。
5:$_FILES
超級全域性變數包含通過POST方法向伺服器上傳的資料的有關資訊。這個超級全域性變數與其他的變數有所不同,它是一個二維陣列,包含5個元素。第一個下標標示表單的檔案上傳元素名;第二個下標是五個預定義下標之一,這些下標描述了上傳檔案的某個屬性
6:$_ENV
超級全域性變數提供PHP解析所在伺服器環境的有關資訊
7:$_REQUEST
超級全域性變數是一個全能選手,它記錄了通過各種方法傳遞給指令碼的變數,特別是GET ,POST 和 COOKIE 。
8:$_SESSION
超級全域性變數包含與所有會話有關的資訊。註冊會話資訊能為你提供便利,這樣就能在整個網站中引用這些會話資訊,而無需通過GET或POST顯示的傳遞資料。
9:$GLOBALS
超級全域性變數陣列可以認為是超級全域性變數的超集,包含全域性作用域內的所有變數。
PHP中幾種合併陣列的方法?並說出優缺點和注意事項?
Array_merge();
優點
可以加快合併的速度,
缺點
當兩個陣列進行合併的時候,同樣鍵名的欄位就會被覆蓋,如果當兩個陣列中的資料的值都需要取得準確值的時候不可以使用
運算子‘+’號合併陣列
缺點 使用‘+’號合併陣列,是前面覆蓋後面的,和array_merge()相反,如果以索引形式出現的陣列的內容,合併後如果鍵值相同也會覆蓋掉!
關於網站靜態檔案訪問提高效能的方法或方式有哪些?
1程式碼壓縮 利用其他的壓縮檔案對已經寫好的html程式碼進行壓縮減少檔案體積
2檔案合併 合併js指令碼檔案 合併css樣式檔案 合併css引用的圖
3使用sprite雪碧圖 將多張圖片合成一張上傳 減少請求次數。
4CDN加速 CDN 是一個全球(或者只有國內,具體看供應商)分散式網路
本質上仍然是一個快取, CDN一般快取的是靜態資源,如圖片,檔案,CSS,Script指令碼,靜態網頁等,但是這些檔案問頻率很高,將其快取在CDN可極大改善網頁的開啟速度
5不要出現404錯誤:HTTP請求時間消耗是很大的,因此使用HTTP請求來獲得一個沒有用處的響應(例如404沒有找到頁面)是完全沒有必要的,它只會降低使用者體驗而不會有一點好處
抽象類和介面的區別?
0、聲名抽象類關鍵字:abstract 宣告介面關鍵字:interface
1、抽象類和介面都不能直接例項化,如果要例項化,抽象類變數必須指向實現所有抽象方法的子類物件,介面變數必須指向實現所有介面方法的類物件。
2、抽象類要被子類繼承,介面要被類實現。
3、介面只能做方法申明,抽象類中可以做方法申明,也可以做方法實現
4、介面裡定義的變數只能是公共的靜態的常量,抽象類中的變數是普通變數。
5、抽象類裡的抽象方法必須全部被子類所實現,如果子類不能全部實現父類抽象方法,那麼該子類只能是抽象類。同樣,一個實現介面的時候,如不能全部實現介面方法,那麼該類也只能為抽象類。
6、抽象方法只能申明,不能實現,介面是設計的結果 ,抽象類是重構的結果
7、抽象類裡可以沒有抽象方法
8、如果一個類裡有抽象方法,那麼這個類只能是抽象類
9、抽象方法要被實現,所以不能是靜態的,也不能是私有的。
10、介面可繼承介面,並可多繼承介面,但類只能單根繼承。
- 抽象類 和 介面 都是用來抽象具體物件的. 但是介面的抽象級別最高
- 抽象類可以有具體的方法 和屬性, 介面只能有抽象方法和不可變常量
- 抽象類主要用來抽象類別,介面主要用來抽象功能.
- 抽象類中,且不包含任何實現,派生類必須覆蓋它們。介面中所有方法都必須是未實現的。
empty is_null isset 個字的作用分別是什麼?
empty():判斷變數是否為空
如果變數沒有定義、定義後沒有賦值、賦的為null、賦的為0、賦的為"" 空字串、賦的為array() 空陣列 該函式都將返回true
is_null():判斷變數是否為null值
如果變數沒有定義、定義後沒有賦值、賦的為null 該函式都將返回true
isset():判斷變數是否被賦值
asdqwe DFGZXCGHFDRREW123456
只要變數被賦值了,非NULL的值,則返回true
對比說明PHP7和以前版本的區別,做了哪些優化?
1.型別的宣告。
可以使用字串(string), 整數 (int), 浮點數 (float), 以及布林值 (bool),來宣告函式的引數型別與函式返回值。
標量型別宣告 有兩種模式: 強制 (預設) 和 嚴格模式。
declare(strict_types=1),必須放在檔案的第一行執行程式碼,當前檔案有效!
2.set_exception_handler() 不再保證收到的一定是 Exception 物件
在 PHP 7 中,很多致命錯誤以及可恢復的致命錯誤,都被轉換為異常來處理了。 這些異常繼承自 Error 類,此類實現了 Throwable 介面 (所有異常都實現了這個基礎介面)。
PHP7進一步方便開發者處理, 讓開發者對程式的掌控能力更強. 因為在預設情況下, Error會直接導致程式中斷, 而PHP7則提供捕獲並且處理的能力, 讓程式繼續執行下去, 為程式設計師提供更靈活的選擇。
3.新增操作符“<=>”
4.新增操作符“??”
如果變數存在且值不為NULL, 它就會返回自身的值,否則返回它的第二個運算元。
操作符“??”在php7版本就相當於三目運算子的升級版。
5.define() 定義常量陣列
6.AST: Abstract Syntax Tree, 抽象語法樹
AST在PHP編譯過程作為一箇中介軟體的角色, 替換原來直接從直譯器吐出opcode的方式, 讓直譯器(parser)和編譯器(compliler)解耦, 可以減少一些Hack程式碼, 同時, 讓實現更容易理解和可維護.
PHP5 : PHP程式碼 -> Parser語法解析 -> OPCODE -> 執行
PHP7 : PHP程式碼 -> Parser語法解析 -> AST -> OPCODE -> 執行
7.匿名函式
8.Unicode字元格式支援(echo “\u{9999}”)
9.Unserialize 提供過濾特性
防止非法資料進行程式碼注入,提供了更安全的反序列化資料。
10.名稱空間引用優化
列舉出HTTP中常用的幾個Header屬性?
- Accept 可接受的型別
- Accept-Charset 可接受的字符集
- Accept-Language 可接受的響應語言
- Accept-Encoding 可接受的編碼
- Content-Type, 響應的資料型別:text/html;charset=gbk
- Content-Length, 響應的資料體大小
- Content-Encoding, 如果為文字、HTML資訊,則使用的編碼方式
- Date, 當前伺服器日期
- Server, 伺服器名
Cookie HTTP請求傳送時,會把儲存在該請求域名下的所有cookie值一起傳送給web伺服器。
手機訪問 www.baidu.com 會自動跳轉到 M.bdaidu.com ?
用重定向的方法強制要求訪問的地址有三種方法第一種
$url=m.baidu.com
If(!isset($url)){
Header(‘location:$url’)
}
<?php $url=m.baidu.com
If(!isset($url)){
Exit();}
?>
第一種
<meta http-equiv=’refresh’; content=’跳轉的時間’;url=’<?php echo $url ?>’ >
怎麼保證介面安全?做了那些操作?
選擇攔截過濾器。
-
在請求的時候對請求方法進行一次攔截處理。比如非正常訪問的方法已經注入插入可執行語句引數驗證等在攔截中進行一次安全校驗保證
-
請求不是非法請求。
資料加密
我們知道目前大部分APP介面都是通過Http協議進行呼叫的容易被抓包攔截。
- 我們可以對客戶端和服務端都對資料傳輸的時候進行一個加密處理。常用的MD5 hash等。
- Curl 和 file_get_contronts()區別?
- Curl 不會快取 DNS file_get_contronts(可以快取 DNS,這樣多次訪問同一個網站的時候,後者的速度會更快
- Curl 請求 http 時不會 keepalive , file_get_contronts(會,這樣多次請求同一個連結時後者的速度會更快
- Curl 會受 php.ini 檔案中配置的影響,關閉之後無法使用,file_get_contronts 不會
- Curl 只有 get 請求,file_get_contronts 以模擬 post,ftp,tcp 等請求
- Curl 得到的結果儲存在一個字串中,後者會儲存到陣列中,這樣更方便分析使用
簡述原生ajax實現的步驟?
- 建立一個3例項化物件 XMLHttpRequest
- 監聽事件:使用 onreadystatechange 來監聽,在裡面有一個if判斷,當 readystate ==4時,表示解析完畢,並且當 state ==200時,表示請求成功。另外從資料庫傳遞過來的是以 responseText 來接收的,但它本身是一種 json 形式,我們要把它轉換成 json 物件格式
- 建立連線,使用 open 形式,open 裡面有3個引數,第一個引數就是請求方式 get 或者 post,第二個引數就是 url 地址,第三個引數就是同步非同步,用 true 或者 false 來表示 ,但一般預設情況下是 true 非同步的
- 傳送請求,使用 send
Mysql中索引失效的原因?
1.如果條件中有 or,即使其中有條件帶索引也不會使用(這也是為什麼儘量少用 or 的原因)
要想使用 or,又想讓索引生效,只能將 or 條件中的每個列都加上索引
2.對於多列索引,不是使用的第一部分,則不會使用索引
3.like 查詢以%開頭
4.如果列型別是字串,那一定要在條件中將資料使用引號引用起來,否則不使用索引
5.如果 mysql 估計使用全表掃描要比使用索引快,則不使用索引
Vi編輯環境下?使用什麼鍵進行模式轉換?
掌握 vi 一般模式: vi 編輯器是所有 unix 和 linux 系統下標準的編輯器,他就相當於 windows 系統中的記事本一樣,他的強大不遜色於任何最新的文字編輯器.他是我們使用 linux 系統不可缺少的工具.由於對 unix 及 linux 系統的任何版本, vi 編輯器都是完全相同的所有的 unix like 系統都會內建vi文字編輯器,其他的文字編輯器則不一定會存在,一些軟體的編輯器介面都會主動呼叫 vi.
vi有三種模式
- 命令列模式(一般模式),文字輸入模式
- vi開啟一個檔案就直接進入了一般模式(這是預設模式),這個模式中你可以使用上下左右鍵來移動游標,可以使用刪除字元或刪除整行來處理檔案內容,也可以使用複製,貼上來出來你的檔案資料;
- 掌握vi編輯模式:
- 在一般模式中可以進行刪除,複製,貼上等操作,但是卻無法編輯檔案內容,只有當你按下[A,a,i,I,O,o,R,r]任何一個
- 字母之後才會進入編輯模式;這時候螢幕下方會出現[insert]字樣,此時才能進進行編輯;要回到一般模式,必須要按下[ESC]鍵
- 退出編輯模式;
- 掌握vi命令列模式:
- 輸入[: 或 / 或 ?]三個中的任何一個,就可以將游標移動到最底下的行.在這個模式中,可以提供查詢,讀取,存檔,替換字元,離開vi,顯示行號等動作.
Linux下如何清空一個檔案的命令,監視一個日誌檔案a.log的最新內容 ?
echo "" > a.log
或> a.log
tail -n 50 -f a.log
顯示檔案 a.log 的後50行內容並在檔案內容增加後,自動顯示新增的檔案內容。tail: -n
是顯示行號;相當於 nl 命令;例子如下:tail -100f test.log
實時監控100行日誌tail -n 10 test.log
查詢日誌尾部最後10行的日誌;-n +10 test.log
查詢10行之後的所有日誌;head:
跟 tail 是相反的,tail 是看後多少行日誌;例子如下:head -n 10 test.log
查詢日誌檔案中的頭10行日誌;head -n -10 test.log
查詢日誌檔案除了最後10行的其他所有日誌;cat: cat -n test.log |grep "debug"
查詢關鍵字的日誌
10g的訪問日誌檔案中?檢視訪問日誌中訪問次數前十的IP?
`
cat access_log | awk ‘{print $1}’ | uniq -c|sort -rn|head -10`
//這個別的方法也能統計,但有些命令是必要的 awk , sort,uniq ,主要看是否這些命令都 使用了。
檢視當前伺服器的http連結有哪些?
`
netstat -n|grep 80`
Php在linux如何安裝擴充?寫出安裝步驟及命令?
下載你要安裝的軟體包,解壓得到目錄(如:
phpredis
)
- 進入軟體包目錄(
cd phpredis
)- 執行phpsize命令(
/usr/local/php/bin/phpize
)
成功後,當前目錄將得到configure
檔案。- 進行配置(
./configure --with-php-config=/usr/local/php/bin/php-config
#指定安裝在哪個PHP)注:如果系統缺少phpize命令,且你使用的是預編譯的RPM包,那麼一定要安裝適當的PHP開發版本,因為它們一般都包含phpize命令連同合適的標頭檔案來編譯PHP及其擴充套件。- 編譯安裝
`
make
make install`
- 安裝成功出現如下提示:
擴充套件存放位置:- 修改PHP配置檔案(
vim /usr/local/php/etc/php.ini
)`
extension = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/redis.so";
或extension = "redis.so";(注意前面不要加分號,如果已有extension_dir, 則不需要再寫)`
- 重啟伺服器
`
pkill -9 nginx ; /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf`
用phpinfo()在瀏覽器中檢視PHP配置清單,ok, 到此安裝已完成。
-----------------------------------------------------------------------------------------------------
一些服務開啟的命令:
pkill php-fpm; /usr/local/php/sbin/php-fpm
linux:
- /etc/init.d/nginx start|stop|restart #啟動|停止|重啟nginx
- /etc/init.d/php-fpm start|stop|restart #啟動|停止|重啟php-fpm
- /etc/init.d/mysql start|stop|restart #啟動|停止|重啟msyq
freebsd:
/usr/local/etc/rc.d/nginx start|stop|restart #啟動|停止|重啟nginx
/usr/local/etc/rc.d/mysql-server start|stop|restart #啟動|停止|重啟mysql
/usr/local/etc/rc.d/php-fpm start|stop|restart #啟動|停止|重啟php-fpm
/usr/local/sbin/nginx #啟動nginx
/usr/local/sbin/nginx -s stop #停止nginx
/usr/local/sbin/nginx -s reload #重啟nginx
Ningx和php如何通訊?在ningx檔案中如何配置?
- Nginx本身不會對PHP進行解析,終端對PHP頁面的請求將會被Nginx交給FastCGI程式監聽的IP地址及埠,由php-fpm作為動態解析伺服器處理,最後將處理結果再返回給nginx。其實,Nginx就是一個反向代理伺服器。Nginx通過反向代理功能將動態請求轉向後端php-fpm,從而實現對PHP的解析支援,這就是Nginx實現PHP動態解析的原理。
- Nginx不支援對外部程式的直接呼叫或者解析,所有的外部程式(包括PHP)必須通過FastCGI介面來呼叫。FastCGI介面在Linux下是socket(這個socket可以是檔案socket,也可以是ip socket)。為了呼叫CGI程式,還需要一個FastCGI的wrapper(wrapper可以理解為用於啟動另一個程式的程式),這個wrapper繫結在某個固定socket上,如埠或者檔案socket。當Nginx將CGI請求傳送給這個socket的時候,通過FastCGI介面,wrapper接收到請求,然後派生出一個新的執行緒,這個執行緒呼叫直譯器或者外部程式處理指令碼並讀取返回資料;接著,wrapper再將返回的資料通過FastCGI介面,沿著固定的socket傳遞給Nginx;最後,Nginx將返回的資料傳送給客戶端。
Nginx 簡單配置
location ~ \.php$ {
root /home/admin/web/nginx/html/;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/admin/web/nginx/html/$fastcgi_script_name;
include fastcgi_params;
}
location ~ \.php$ {
root /webpath;
fastcgi_pass 127.0.0.1:9000;
...
...
}
這個location指令把以php為檔案字尾的請求,交給127.0.0.1:9000處理。我想你看到這個應該猜到了,這是一個C/S架構東西。 而這裡的IP地址和埠(127.0.0.1:9000)就是fastcgi程式監聽的IP地址和埠。fastcgi是一個可伸縮地、高速地在http server和動態指令碼語言間通訊的介面。多數流行的http server都支援fastcgi,包括apache、nginx和lighttpd等。同時,fastcgi也被許多指令碼語言支援,其中就有php。
那這個fastcgi的配置IP和埠從何而來呢?在php-fpm.conf中可以看到如下:
- listen = 127.0.0.1:9000 #這個表示php的fastcgi程式監聽的ip地址以及埠
- pm.start_servers = 2
- php-fpm作為fastcgi的程式管理器,可以有效控制記憶體和程式,並且平滑過載php配置。php5.3以後,php-fpm被整合到php的core中,預設安裝,無須配置。
- fastcgi程式管理器php-fpm自身初始化,啟動主程式php-fpm和啟動start_servers個fastcgi子程式。主程式php-fpm主要是管理fastcgi子程式,監聽9000埠,fastcgi子程式等待請求。當客戶端請求到達nginx時,nginx通過location指令,將所有以php為字尾的檔案都交給 127.0.0.1:9000 來處理。php-fpm選擇並連線到一個fastcgi子程式,並將環境變數和標準輸入傳送到fastcgi子程式。fastcgi子程式完成處理後將標準輸出和錯誤資訊返回。當fastcgi子程式關閉連線時,請求便告處理完成,等待下次處理。
寫出過濾html標籤的函式或方法?
- 過濾html標籤的函式程式碼本文章提供四款利用php 過濾html標籤的函式程式碼
- 方法一最簡單的利用了php自帶函式strip_tags來過濾所有的html標籤,
- 方法二利用了正規表示式來過濾html標籤,
- 方法三是清除HTML標籤的使用者自定義函式,根據ascii編碼值來判斷是否為字母再過濾
簡述orm是什麼?
ORM,即Object-Relational Mapping(物件關係對映),它的作用是在關係型資料庫和業務實體物件之間作一個對映,這樣,我們在具體的操作業務物件的時候,就不需要再去和複雜的SQL語句打交道,只需簡單的操作物件的屬性和方法。
優點?
- 第一:隱藏了資料訪問細節,“封閉”的通用資料庫互動,ORM的核心。他使得我們的通用資料庫互動變得簡單易行,並且完全不用考慮該死的SQL語句。快速開發,由此而來。
- 第二:ORM使我們構造固化資料結構變得簡單易行。在ORM年表的史前時代,我們需要將我們的物件模型轉化為一條一條的SQL語句,通過直連或是DB helper在關聯式資料庫構造我們的資料庫體系。而現在,基本上所有的ORM框架都提供了通過物件模型構造關聯式資料庫結構的功能。這,相當不錯。
缺點?
- 第一:無可避免的,自動化意味著對映和關聯管理,代價是犧牲效能(早期,這是所有不喜歡ORM人的共同點)。現在的各種ORM框架都在嘗試使用各種方法來減輕這塊(LazyLoad,Cache),效果還是很顯著的。
- 第二:物件導向的查詢語言(X-QL)作為一種資料庫與物件之間的過渡,雖然隱藏了資料層面的業務抽象,但並不能完全的遮蔽掉資料庫層的設計,並且無疑將增加學習成本.
- 第三:對於複雜查詢,ORM仍然力不從心。雖然可以實現,但是不值的。檢視可以解決大部分calculated column,case ,group,having,order by, exists,但是查詢條件(a and b and not c and (d or d))。
簡述trait的作用?
- 從PHP的5.4.0版本開始,PHP提供了一種全新的程式碼複用的概念,那就是Trait。Trait其字面意思是”特性”、”特點”,我們可以理解為,使用Trait關鍵字,可以為PHP中的類新增新的特性。
- 熟悉物件導向的都知道,軟體開發中常用的程式碼複用有繼承和多型兩種方式。在PHP中,只能實現單繼承。而Trait則避免了這點。繼承的方式雖然也能解決問題,但其思路違背了物件導向的原則,顯得很粗暴;多型方式也可行,但不符合軟體開發中的DRY原則,增加了維護成本。而Trait方式則避免了上述的不足之處,相對優雅的實現了程式碼的複用。
linux下解壓abc.tar.gz的命令是什麼?常用的文字編輯器是什麼?
命令格式:
tar -zxvf abc.tar.gz
。解壓縮後的檔案只能放在當前的目錄。
解壓好處
在linux中使用壓縮檔案有兩個明顯好處:一是可以減少儲存空間,二是通過網路傳輸檔案時,可以減少傳輸時間,另外,在向線上傳送專案的時候,就可以使用壓縮工具來壓縮程式碼,保持程式碼的完整性。
常見的文字編輯器?
常見的文字編輯器有vi 和vim 以及nano 而我最常用的是vim因為vim是vi 的升級版
- 1.vim可以多級撤銷(u鍵,在vim裡面可以無限級撤銷,vi只能撤銷一次);
- 2.易用性(vi只能執行於[unix]中,vim可以執行在[linux,unix,mac,windows]等多操作平臺);
- 3.語法加亮(可以用不同的顏色來加亮程式碼);
- 4.視覺化操作(vim不僅可以在終端執行,還可以執行於xwindow,mac os,windows);
- 5.最主要的一點就是vim對vi完全相容(某些情況下,可以把vim當成vi來使用)
vi有三種模式:
- 一般模式:以vi開啟或新建一個檔案就可以直接進入一般模式,在此模式中,你可以使用上下左右來進行游標的移動,可以刪除字元或整行,可以複製貼上檔案資料。
- 編輯模式:顧名思義,就是可以編輯文字的模式,在一般模式下,按下“i,I,o,O,a,A,r,R"這些字母可進入編輯模式,進入編輯模式後在左下方會有INSERT或REPLACE的字樣。
- 在編輯模式下按下ESC鍵會退出到一般模式下。
- 命令列模式:在一般模式下,輸入” :, / , ? "這三個字元中的任意一個會將游標移動到最下面的一行,在這個模式中可以進行資料查詢、替換、儲存、離開vi等操作。
Vim有四種模式:
正常模式:
啟動vim預設處於正常模式;
插入模式:
在正常模式下按下A,O,I,a,o,i等鍵,會進入插入模式;
命令模式:
在正常模式中下按 :(英文冒號)進入命令模式,可以執行一些輸入,並執行一些vim指令或外掛提供的指令
可視模式:
v進入面向字元的可視模式 V進入面向行的可視模式,Ctrl + v進入面向列塊的可視模式,gv重選上次的高亮選區
相比於vi我更喜歡vim.
當然了,在Linux還有另一個常用文字編輯器nano,它是可以直接在命令列中敲入nano filename即可開啟檔案或新建檔案。
nano下可以使用的一些快捷鍵,其對應的含義翻譯如下:
ctrl+G: 取得線上幫助
ctrl+O: 儲存檔案,如果你有許可權就可儲存修改的檔案
ctrl+R: 從其他檔案讀入資料,可將某個檔案的內容貼在本檔案中
ctrl+Y: 顯示前一頁
ctrl+K: 剪下當前行的內容
ctrl+C: 顯示游標所在的位置
請列舉幾個你常用的linux命令以及說明?
我最常用的linux命令一般分為系統命令,檔案以及目錄操作的一些命令
系統命令有:
- date 顯示系統日期
- cat /cpuinfo 顯示CPU資訊的資訊
- uname - r 顯示正在使用的核心版本
還有檔案的一些操作:
- mkdir dir1建立一個叫做' dir1 '的目錄'
- rm - f file1 刪除一個叫做'file1' 的檔案'
- rmdir dir1刪除一個叫做' dir1 '的目錄'
- rm - rf dir1 刪除一個叫做'dir1' 的目錄並同時刪除其內容
- mv dir1 new_dir 重新命名/移動一個目錄
- cp file1 file2 複製一個檔案
以及給檔案設定許可權的命令:
- Chmod
- u 表示該檔案的擁有者,g 表示與該檔案的擁有者屬於同一個群體(group)者,o 表示其他以外的人,a 表示這三者皆是。
- 表示增加許可權、- 表示取消許可權、= 表示唯一設定許可權。
- r 表示可讀取,w 表示可寫入,x 表示可執行,X 表示只有當該檔案是個子目錄或者該檔案已經被設定過為可執行。
- Chmod -R : 對目前目錄下的所有檔案與子目錄進行相同的許可權變更
對使用者和使用者組的一些命令有:
- groupadd group_name 建立一個新使用者組
- groupdel group_name 刪除一個使用者組
- useradd user1 建立一個新使用者
- userdel - r user1 刪除一個使用者
寫一個linux命令,以實現檢視程式中是否有php 程式?
- ps -ef可以檢視當前所有的的程式
- ps -ef |grep ‘php’less 可以逐條檢視匹配php的所有的程式
找到相關的pid
- --1.用top找出CPU佔用率高的PHP程式
- --2.用 strace -p <程式編號> 可以檢視程式的具體工作內容
- ps –ef 可以檢視當前的所有程式
- ps -ef|grep 可以逐條檢視匹配PHP的所有的程式
如何檢視伺服器當前cpu使用情況?
檢視cpu使用情況 top命令是Linux下常用的效能分析工具,能夠實時顯示系統中各個程式的資源佔用狀況,類似於Windows的任務管理
檢視記憶體使用情況 使用命令:free -m
檢視顯示卡使用情況 使用命令:nvidia-smi
使用linux命令實現按照日期排序 顯示/home/abc下面所有.txt檔案?
按照日期的順序,顯示/home/abc/ 下面的的所有.txt檔案
如果我們要查詢某個目錄下的所有的 .txt檔案,並且還要按照日期的順序,我們可以用ls這個命令來檢視指定的檔案,其中ls有以下幾個引數:
-a 顯示所有檔案及目錄 (ls內定將檔名或目錄名稱開頭為"."的視為隱藏檔,不會列出)
-l 除檔名稱外,亦將檔案型態、許可權、擁有者、檔案大小等資訊詳細列出
-R 若目錄下有檔案,則以下之檔案亦皆依序列出
比如我們這個題要求的檢視/home/abc/下的所有txt檔案,這時我們就可以使用ls -al /home/abc/ *.txt這個命令來顯示該目錄下的所有txt檔案,如果要是按照時間進行排序的話,可以使用sort 命令,在使用sort命令的時候可以在後面加上按照時間排序的引數--time,另外,sort還有一下其他的引數比如:
none(-U), 無
extension(-X), 副檔名
size (-S), 大小
time(-t), 修改時間
version (-v),版本
如果不接引數的話,sort會預設採用升序的方式進行排序,總結一下,這個命令就是
Ls -al /home/abc/ * .txt --sort=time
請說出top ps mv find df cat chmod chgrp grep wc 的命令用法?
- top:命令是Linux下常用的 效能分析工具,能夠實時顯示系統中各個程式的資源佔用狀況,類似於Windows
- 的工作管理員。
- ps:檢視程式
- mv:移動或者更改檔案
- find:在子目錄中搜尋匹配的檔案
- df:linux中df命令引數功能:檢查檔案系統的磁碟空間佔用情況。
- cat:把一個或多個檔案內容顯示到標準輸出
- chmod:改變檔案屬性
- chgrp:改變使用者分組
- grep:在77檔案內進行搜尋
- wc:命令的功能為統計指定檔案中的位元組數、字數、行數, 並將統計結果顯示輸出。
Php的語言結構和函式有什麼區別?
什麼是語言結構和函式
- 語言結構:就是PHP語言的關鍵詞,語言語法的一部分;它不可以被使用者定義或者新增到語言擴充套件或者庫中;它可以有也可以沒有變數和返回值。
- 函式:由程式碼塊組成的,可以複用。從原始碼的角度來說,也就是基於Zend引擎的基礎來實現的,ext擴充庫中的函式都是這樣實現的。
語言結構和函式的不同
- (1)語言結構比對應功能的函式快
- (2)語言結構在錯誤處理上比較魯棒,由於是語言關鍵詞,所以不具備再處理的環節
- (3)語言結構不能在配置項(php.ini)中禁用,函式則可以。
- (4)語言結構不能被用做回撥函式
語言結構為什麼比函式快
- 原因是在PHP中,函式都要先被PHP解析器(Zend引擎)分解成語言結構,所以有此可見,函式比語言結構多了一層解析器解析。這樣就能比較好的理解,什麼語言結構比函式快了。
- 語言結構列表
- echo() print() die() isset() unset() include() require() array() list() empty()
資料庫中的事務是什麼?
是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。 事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過將一組相關操作組合為一個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程式更加可靠。一個邏輯工作單元要成為事務,必須滿足所謂的ACID(原子性、一致性、隔離性和永續性)屬性。事務是資料庫執行中的邏輯工作單位,由DBMS中的事務管理子系統負責事務的處理。
只有這樣才能成為一個事務:
原子性
事務必須是原子工作單元;對於其資料修改,要麼全都執行,要麼全都不執行。
一致性
- 事務在完成時,必須使所有的資料都保持一致狀態。在相關資料庫中,所有規則都必須應用於事務的修改,以保持所有資料的完整性。
- 事務結束時,所有的內部資料結構(如 B 樹索引或雙向連結串列)都必須是正確的。
隔離性
- 由併發事務所作的修改必須與任何其它併發事務所作的修改隔離。事務檢視資料時資料所處的狀態,要麼是另一併發事務修改它之前的狀態,
- 要麼是另一事務修改它之後的狀態,事務不會檢視中間狀態的資料。這稱為可序列性,因為它能夠重新裝載起始資料,
- 並且重播一系列事務,以使資料結束時的狀態與原始事務執行的狀態相同。
永續性
事務完成之後,它對於系統的影響是永久性的。該修改即使出現系統故障也將一直保持。
優化mysqlSQL語句的方式或方法是什麼?
- (1)開啟慢查詢(檢視需要優化的語句)
- (2)show processlist
- (3)使用explain 分析SQL語句是否是否需要索引以及索引是否盡到最大的優化效果(得到最優化的SQL語句)
- (4)使用效能優化器profile(分析SQL語句的執行時間 以及快取的佔用量)
- (5)使用聯合(UNION)來代替手動建立的臨時表
- 它可以把需要使用臨時表的兩條或更多的select查詢合併的一個查詢中。在客戶端的查詢會話結束的時候,臨時表會被自動刪除,從而保證資料庫整齊、高效。使用union來建立查詢的時候,我們只需要用UNION作為關鍵字把多個select語句連線起來就可以了
- (6)選取最適用的欄位屬性
- 可能的情況下,應該儘量把欄位設定為NOTNULL,這樣在將來執行查詢的時候,資料庫不用去比較NULL值
- (7)使用連線(JOIN)來代替子查詢(Sub-Queries)
- 雖然使用子查詢可以一次性的完成很多邏輯上需要多個步驟才能完成的SQL操作,同時也可以避免事務或者表鎖死,並且寫起來也很容易,但是有些情況下子查詢可以被更有效率的連線(JOIN)..替代,比如在查詢使用者訂單的時候,使用連線的效果就比子查詢要好得多。
- (8)使用事務
- 當一個語句塊中的某一條語句執行出錯的時候,整個語句塊的操作就會變得不確定起來,會造成資料的不完整,甚至會破壞資料庫中的資料。要避免這種情況,就應該使用事務,這時候事物的作用就是要麼語句塊中每條語句都操作成功,要麼都失敗。換句話說,就是可以保持資料庫中資料的一致性和完整性
- (9)使用索引
- 索引是提高資料庫效能的常用方法,它可以令資料庫伺服器以比沒有索引快得多的速度檢索特定的行,尤其是在查詢語句當中包含有MAX(),MIN()和ORDERBY這些命令的時候,效能提高更為明顯
- (10)優化的查詢語句
- 對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。
- 應儘量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。
- 應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描
- 應儘量避免在 where 子句中使用 or 來連線條件in 和 not in 也要慎用,否則會導致全表掃描
- 應儘量避免在 where 子句中對欄位進行表示式操作
- 儘量避免在where子句中對欄位進行函式操作
- 當我們優化查詢語句的時候注意以下幾點:
- 首先,最好是在相同型別的欄位間進行比較的操作
- 其次,在建有索引的欄位上儘量不要使用函式進行操作
- 最後,應該注意避免在查詢中讓MySQL進行自動型別轉換,因為轉換過程也會使索引變得不起作用
Mysql中varchar 和char的區別是什麼?那種效率高,為啥麼?
- 在mySQL 中char 和 varchar 都是儲存字串的,區別在於char有固定的長度,而varchar屬於可變長的字元型別。
- char(M)型別的資料列裡,每個值都佔用M個位元組,如果某個長度小於M,MySQL就會在它的右邊用空格字元補足.(在檢索操作中那些填補出來的空格字元將被去掉)在varchar(M)型別的資料列裡,每個值只佔用剛好夠用的位元組再加上一個用來記錄其長度的位元組(即總長度為L+1位元組)。
- char 固定長度,所以在處理速度上要比varchar快速很多,但是對費儲存空間,所以對儲存不大,但在速度上有要求的可以使用char型別。
- 總的說來:char定長,儲存效率不如varchar,對於短資料的查詢優於varchar
用shell命令找出‘當前目錄下檔案內容最近兩天內被修改過且字尾為.txt’的檔案?
- find -name ‘*.txt’ –mtime 1 –type –f ls
- find . -name ‘*.txt’ -mtime 1 -type f -ls
- find命令:在指定的目錄搜尋檔案
常用的option:
- -name:指定檔名,或者使用“*.py”來指定檔案的字尾名,
- -type:指定要搜尋的檔案型別,常見的檔案型別有:b表示塊裝置,c字元裝置,d檔案目錄,f普通檔案等
- -readable:檔案可讀
- -writable:檔案可寫
- -executable:檔案可執行
- -ls:在搜尋結果中顯示檔案的詳細資訊
- -empty:普通檔案或者資料夾是空的
查詢最近修改的檔案:
- -ctime:指定時間內檔案的許可權被修改過,change
- -atime:指定時間內檔案被訪問過(讀取),access
- -mtime:指定時間(以天為單位)內檔案被修改過,modify 0(最近24小時內) 1(最近24-48小時內)
- -mmin:指定時間(以分鐘為單位)內檔案被修改過,modify -30(最近三十分鐘)
請說出mysql 常用的儲存引擎?Memory儲存引擎的特點?
mysql的儲存引擎是什麼呢?
簡單來說,儲存引擎就是指表的型別以及表在計算機上的儲存方式,不同的儲存引擎決定了MySQL資料庫中的表可以用不同的方式來儲存。我們可以根據資料的特點來選擇不同的儲存引擎
儲存引擎有
- InnoDB儲存引擎
- MyIsam儲存引擎
- Memory儲存引擎(也叫HEAP)堆記憶體
- Mrg_Myisam儲存引擎(分表的一種方式–水平分表)
- Blackhole(黑洞引擎)
而我做常用的儲存引擎有InnoDB、MyISAM、MEMORY這三種。
- InnoDB給MySQL的表提供了事務處理、回滾、崩潰修復能力和多版本併發控制的事務安全。它是MySQL上第一個提供外來鍵約束的表引擎。而且InnoDB對事務處理的能力,也是其他儲存引擎不能比擬的。靠後版本的MySQL的預設儲存引擎就是InnoDB。
- InnoDB的優點:支援事務處理,支援外來鍵,支援崩潰修復能力和併發控制。如果需要對事務的完整性要求比較高(比如銀行),要求實現併發控制(比如售票),那選擇InnoDB有很大的優勢。如果需要頻繁的更新、刪除操作的資料庫,也可以選擇InnoDB,因為支援事務的提交和回滾。
- MyISAM是MySQL中常見的儲存引擎,曾經是MySQL的預設儲存引擎。基於MyISAM儲存引擎的表支援3種不同的儲存格式。包括靜態型、動態型和壓縮型。其中,靜態型是MyISAM的預設儲存格式,它的欄位是固定長度的;動態型包含變長欄位,記錄的長度不是固定的;壓縮型需要用到myisampack工具,佔用的磁碟空間較小。MyISAM的優勢在於佔用空間小,處理速度快。
- MyISAM的優點:插入資料快,空間和記憶體使用比較低。如果表主要是用於插入新記錄和讀出記錄,那麼選擇MyISAM能實現處理高效率。如果應用的完整性、併發性要求比較低,也可以使用。
- Memory是MySQL中一類特殊的儲存引擎最主要的特點有兩個,一個是他使用儲存在記憶體中的內容來建立表,而且資料全部存放在記憶體中,而且每個基於MEMORY儲存引擎建立的表實際上都對應一個磁碟檔案,該檔案的檔名與表名相同,型別為frm型別。
- 其中資料檔案,都是儲存在記憶體中,這樣有利於資料的快速處理,提高整個表的效率。另一個特點是MEMORY預設使用雜湊索引,使用雜湊索引時索引速度比使用B型樹索引快。但是,使用memory有一個需要注意的地方,因為memory是把資料存到記憶體中,如果記憶體出現異常就會影響資料。如果重啟或者關機,所有資料都會消失。因此,基於MEMORY建立的表的生命週期都很短,一般都是一次性的。
什麼是佇列?排它鎖,myisam死鎖如何解決?
- 佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,在前端進行刪除操作在預設情況下MYisam是表級鎖,所以同時操作單張表的多個動作只能以佇列的方式進行;而在表的後端(rear)進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭
- 排它鎖又名寫鎖,在SQL執行過程中為排除其它請求而寫鎖,在執行完畢後會自動釋放;
共享鎖與排它鎖區別
1.共享鎖只用於表級,排他鎖用於行級。?
2.加了共享鎖的物件,可以繼續加共享鎖,不能再加排他鎖。加了排他鎖後,不能再加任何鎖。?
3.比如一個DML操作,就要對受影響的行加排他鎖,這樣就不允許再加別的鎖,也就是說別的會話不 能修改這些行。同時為了避免在做這個DML操作的時候,有別的會話執行DDL,修改表的定義, 所以要在表上加共享鎖,這樣就阻止了DDL的操作。?
4.當執行DDL操作時,就需要在全表上加排他鎖
資料庫死鎖的原因
- 若干事務相互等待對方釋放封鎖,就陷入了無限期等待狀態,系統進入死鎖。
- 表級鎖不會產生死鎖.所以解決死鎖主要還是針對於最常用的InnoDB.
解除資料庫死鎖的方法
- 允許死鎖發生,然後解除它,如果發現死鎖,則將其中一個代價較小的事務撤銷,回滾這個事務,並釋放此事務持有的封鎖,使其他事務繼續進行。
- 死鎖解決:先找到死鎖的執行緒號,然後殺掉執行緒ID
怎麼防止form表單多次提交?
背景與介紹
- 為由於使用者誤操作,多次點選表單提交按鈕。
- 由於網速等原因造成頁面卡頓,使用者重複重新整理提交頁面。
- 黑客或惡意使用者使用postman等工具重複惡意提交表單(攻擊網站)。
如何防止
1、禁掉提交按鈕
表單提交後使用 Javascript 使提交按鈕disable。這種方法防止心急的使用者多次點選按鈕。但有個問題,如果客戶端把 Javascript 給禁止掉,這種方法就無效了。
2、Post/Redirect/Get 模式
在提交後執行頁面重定向,這就是所謂的 Post-Redirect-Get (PRG)模式。簡言之,當使用者提交了表單後,你去執行一個客戶端的重定向,轉到提交成功資訊頁面。
這能避免使用者按 F5 導致的重複提交,而其也不會出現瀏覽器表單重複提交的警告,也能消除按瀏覽器前進和後退按導致的同樣問題。
3、在 session 中存放一個特殊標誌
當表單頁面被請求時,生成一個特殊的字元標誌串,存在 session 中,同時放在表單的隱藏域裡。接受處理表單資料時,檢查標識字串是否存在,並立即從 session 中刪除它,然後正常處理資料。如果發現表單提交裡沒有有效的標誌串,這說明表單已經被提交過了,忽略這次提交。這使你的 web 應用有了更高階的 XSRF 保護。
4、使用Cookie處理
使用Cookie記錄表單提交的狀態,根據其狀態可以檢查是否已經提交表單。
5、在資料庫裡新增約束
在資料庫裡新增唯一約束或建立唯一索引,防止出現重複資料。這是最有效的防止重複提交資料的方法。
如何得到當前執行指令碼路徑,包括得到的引數?
當前執行指令碼路徑:使用魔術常量:FILE
手冊解釋
- 檔案的完整路徑和檔名。如果用在被包含檔案中,則返回被包含的檔名。自 PHP 4.0.2 起,FILE 總是包含一個絕對路徑(如果是符號連線,則是解析後的絕對路徑),而在此之前的版本有時會包含一個相對路徑。
- 包括所得到引數
- $_GET包括get請求的引數,$_POST包括post請求的引數,如果需要解析路徑中的引數可以使用函式pathinfo(string $path)
客戶端開啟網頁是空白頁的原因分析幾種?
因更換伺服器(硬體)或系統引發的快取不一致或異常(快取引發空白);解決方案
1、如果您的網站管理後臺可以正常登陸,可以到管理後臺進行清空快取或更新快取操作,一般可以恢復;
2、如果上面操作不能解決問題,而您的網站程式屬於可安裝的模版程式,可以償試重新安裝網站程式(重灌前,為了資料安全,建議備份網站和資料庫)
3、如果上面兩步還不能解決,可以償試重啟IIS或伺服器償試;
4、上面三步全做了,依然不能解決問題,基本可以排除快取引發的空白,另找其它可能產生該問題的原因。
因資料庫連結錯誤引發的網頁顯示空白;解決方案
1、找到資料庫連結檔案,修改為正常的資料庫連結;
2、個別網站系統可能對檔案編碼有要求,直接使用文字編輯資料庫連結檔案,也可能會導致資料庫連結不成功而顯示空白,可以償試用Macromedia Dreamweaver之類的編輯軟體對原始檔進行修改。
因部分函式被禁用,或檔案不全,程式錯誤引發的網頁顯示空白;解決方案
1、首先要找到具體的錯誤提示
錯誤提示,一般有兩種方法可以看到
一種是檢視錯誤日誌檔案,快網VPS預設記錄在:D:\PHPLOG\php-errors.log,開啟該檔案,分析錯誤日誌
如果您的php.ini中,沒有配製記錄錯誤日誌,可以手動開啟,具體方法如下:
先找到php.ini這個檔案,一般放在PHP的安裝目錄,快網VPS預設安裝在:C:\Program Files\PHP
用記事本開啟php.ini,找到:error_log=專案,該專案是指示錯誤日誌的記錄路徑;
找到:log_errors =專案,該專案決定是否記錄錯誤日誌,On代表記錄,Off 代表關閉;
另一種是直接開啟網頁的錯誤提示:
找到php.ini,用記事本開啟;
找到:display_errors = ***專案,該專案一般預設為Off,代表關閉錯誤顯示,可以將其修改為On來開啟錯誤顯示
特別說明:修改php.ini檔案後,需要重啟IIS才能生效!!!
2、找到具體的錯誤提示後,就可以分析原因了,一般報錯是英文,如果您不太懂英文,可以到google翻譯後,針對性解決問題!!!
一般可能出現的問題主要集中在:
少檔案或檔案為0位元組,說明在上傳過程中出現了錯誤,或有病毒,被防毒軟體處理掉了,這種情況可以重新上傳相關檔案來解決!
什麼是高內聚低耦合?
起因
:模組獨立性指每個模組只完成系統要求的獨立子功能,並且與其他模組的聯絡最少且介面簡單,兩個定性的度量標準――耦合性和內聚性。
耦合性也稱塊間聯絡。指軟體系統結構中各模組間相互聯絡緊密程度的一種度量。模組之間聯絡越緊密,其耦合性就越強,模組的獨立性則越差。模組間耦合高低取決於模組間介面的複雜性、呼叫的方式及傳遞的資訊。
耦合性分類(低――高): 無直接耦合;資料耦合;標記耦合;控制耦合;公共耦合;內容耦合;
1 無直接耦合:
2 資料耦合: 指兩個模組之間有呼叫關係,傳遞的是簡單的資料值,相當於高階語言的值傳遞;
3 標記耦合: 指兩個模組之間傳遞的是資料結構,如高階語言中的陣列名、記錄名、檔名等這些名字即標記,其實傳遞的是這個資料結構的地址;
4 控制耦合: 指一個模組呼叫另一個模組時,傳遞的是控制變數(如開關、標誌等),被調模組通過該控制變數的值有選擇地執行塊內某一功能;
5 公共耦合: 指通過一個公共資料環境相互作用的那些模組間的耦合。公共耦合的複雜程式隨耦合模組的個數增加而增加。
6 內容耦合: 這是最高程度的耦合,也是最差的耦合。當一個模組直接使用另一個模組的內部資料,或通過非正常入口而轉入另一個模組內部。
內聚性又稱塊內聯絡。指模組的功能強度的度量,即一個模組內部各個元素彼此結合的緊密程度的度量。若一個模組內各元素(語名之間、程式段之間)聯絡的越緊密,則它的內聚性就越高。
內聚性匪類(低――高): 偶然內聚;邏輯內聚;時間內聚;通訊內聚;順序內聚;功能內聚;
1 偶然內聚: 指一個模組內的各處理元素之間沒有任何聯絡。
2 邏輯內聚: 指模組內執行幾個邏輯上相似的功能,通過引數確定該模組完成哪一個功能。
3 時間內聚: 把需要同時執行的動作組合在一起形成的模組為時間內聚模組。
4 通訊內聚: 指模組內所有處理元素都在同一個資料結構上操作(有時稱之為資訊內聚),或者指各處理使用相同的輸入資料或者產生相同的輸出資料。
5 順序內聚: 指一個模組中各個處理元素都密切相關於同一功能且必須順序執行,前一功能元素輸出就是下一功能元素的輸入。
6 功能內聚: 這是最強的內聚,指模組內所有元素共同完成一個功能,缺一不可。與其他模組的耦合是最弱的。
耦合性與內聚性是模組獨立性的兩個定性標準,將軟體系統劃分模組時,儘量做到高內聚低耦合,提高模組的獨立性,為設計高質量的軟體結構奠定基礎。
有個例子很容易明白:一個程式有50個函式,這個程式執行得非常好;然而一旦你修改其中一個函式,其他49個函式都需要做修改,這就是高耦合的後果。
一旦你理解了它,你編寫概要設計的時候設計類或者模組自然會考慮到“高內聚,低耦合”
Linux 下建立壓縮包,解壓縮包的命令
- 壓縮:tar -czvf FileName.tar DirName
- 解壓:tar -zxvf FileName.tar.gz
百萬級以上的資料表,分頁面臨哪些額問題?如何構建高效的mysql分頁功能?
1、將LIMIT M,N的查詢改為LIMIT N
例如,使用LIMIT 10000,20,Mysql將需要讀取前10000行,然後獲取後面的20行 ,這是非常低效的,使用LIMIT N的方式,通過每頁第一條或最後一條記錄的id來做條件篩選,再配合降序和升序獲得上/下一頁的結果集 。
2、限制使用者翻頁數量
產品實際使用過程中使用者很少關心搜尋結果的第1萬條資料。
3、使用延遲關聯
通過使用覆蓋索引來查詢返回需要的主鍵,再根據返回的主鍵關聯原表獲得需要的行,這樣可以減少Mysql掃描那些需要丟棄的行數。
資料庫內連線,外連結的區別
內連線,也被稱為自然連線,只有兩個表相匹配的行才能在結果集中出現。返回的結果集選取了兩個表中所有相匹配的資料,捨棄了不匹配的資料。由於內連線是從結果表中刪除與其他連線表中沒有匹配的所有行,所以內連線可能會造成資訊的丟失。內連線語法如下:
select fieldlist from table1 [inner] join table2 on table1.column = table2.column
- 內連線是保證兩個表中所有行都滿足連線條件,而外連線則不然。
- 外連線不僅包含符合連線條件的行,還包含左表(左連線時)、右表(右連線時)或兩個邊接表(全外連線)中的所有資料行。SQL外連線共有三種型別:左外連線(關鍵字為LEFT OUTER JOIN)、右外連線(關鍵字為RIGHT OUTER JOIN)和全外連線(關鍵字為FULL OUTER JOIN)。外連線的用法和內連線一樣,只是將INNER JOIN關鍵字替換為相應的外連線關鍵字即可。
- 內連線:指連線結果僅包含符合連線條件的行,參與連線的兩個表都應該符合連線條件。
- 外連線:連線結果不僅包含符合連線條件的行同時也包含自身不符合條件的行。包括左外連線、右外連線和全外連線。
- 左外連線:左邊表資料行全部保留,右邊表保留符合連線條件的行。
- 右外連線:右邊表資料行全部保留,左邊表保留符合連線條件的行。
- 全外連線:左外連線 union 右外連線。
解析一下資料庫名詞:主鍵,儲存過程,檢視,事務
- 主鍵:能夠唯一表示資料表中的每個記錄的【欄位】或者【欄位】的組合就稱為主碼(主鍵)。一個主鍵是唯一識別一個表的每一記錄,但這只是其作用的一部分,主鍵的主要作用是將記錄和存放在其他表中的資料進行關聯。在這一點上,主鍵是不同表中各記錄之間的簡單指標。主鍵約束就是確定表中的每一條記錄。主鍵不能是空值。唯一約束是用於指定一個或多個列的組合值具有唯一性,以防止在列中輸入重複的值。所以,主鍵的值對使用者而言是沒有什麼意義,並且和它要賦予的值也沒有什麼特別的聯絡。
- 事務:事務是一組原子操作單元,從資料庫角度說,就是一組SQL指令,要麼全部執行成功,若因為某個原因其中一條指令執行有錯誤,則撤銷先前執行過的所有指令。更簡答的說就是:要麼全部執行成功,要麼撤銷不執行。
- 儲存過程:儲存過程(Stored Procedure)是在大型資料庫系統中,一組為了完成特定功能的SQL 語句集,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給出引數(如果該儲存過程帶有引數)來執行它。
- 檢視:檢視是一張虛擬表,它表示一張表的部分資料或多張表的綜合資料,其結構和資料是建立在對錶的查詢基礎上。檢視中並不存放資料,而是存放在檢視所引用的原始表(基表)中同一張原始表,根據不同使用者的不同需求,可以建立不同的檢視
描述對mysql連線池的理解?
- 官方:資料庫連線池(Connection pooling)是程式啟動時建立足夠的資料庫連線,並將這些連線組成一個連線池,由程式動態地對池中的連線進行申請,使用,釋放。
- 個人理解:建立資料庫連線是一個很耗時的操作,也容易對資料庫造成安全隱患。所以,在程式初始化的時候,集中建立多個資料庫連線,並把他們集中管理,供程式使用,可以保證較快的資料庫讀寫速度,還更加安全可靠。
資料庫連線池的執行機制
(1) 程式初始化時建立連線池
(2) 使用時向連線池申請可用連線
(3) 使用完畢,將連線返還給連線池
(4) 程式退出時,斷開所有連線,並釋放資源
為何要使用資料庫連線池?
- 假設網站一天有很大的訪問量,資料庫伺服器就需要為每次連線建立一次資料庫連線,極大的浪費資料庫的資源,並且極易造成資料庫伺服器記憶體溢位、拓機。
- 資料庫連線是一種關鍵的有限的昂貴的資源,這一點在多使用者的網頁應用程式中體現的尤為突出.對資料庫連線的管理能顯著影響到整個應用程式的伸縮性和健壯性,影響到程式的效能指標.資料庫連線池正式針對這個問題提出來的.資料庫連線池負責分配,管理和釋放資料庫連線,它允許應用程式重複使用一個現有的資料庫連線,而不是重新建立一個。
- 資料庫連線池在初始化時將建立一定數量的資料庫連線放到連線池中, 這些資料庫連線的數量是由最小資料庫連線數來設定的.無論這些資料庫連線是否被使用,連線池都將一直保證至少擁有這麼多的連線數量.連線池的最大資料庫連線數量限定了這個連線池能佔有的最大連線數,當應用程式向連線池請求的連線數超過最大連線數量時,這些請求將被加入到等待佇列中.
使用資料庫連線池的關鍵點?
1、併發問題
為了使連線管理服務具有最大的通用性,必須考慮多執行緒環境,即併發問題。這個問題相對比較好解決,因為各個語言自身提供了對併發管理的支援像java,c#等等,使用synchronized(java)lock(C#)關鍵字即可確保執行緒是同步的。使用方法可以參考,相關文獻。
2、事務處理
- DB連線池必須要確保某一時間內一個 conn 只能分配給一個執行緒。不同 conn 的事務是相互獨立的。
- 我們知道,事務具有原子性,此時要求對資料庫的操作符合“ALL-ALL-NOTHING”原則,即對於一組SQL語句要麼全做,要麼全不做。
- 我們知道當2個執行緒共用一個連線Connection物件,而且各自都有自己的事務要處理時候,對於連線池是一個很頭疼的問題,因為即使Connection類提供了相應的事務支援,可是我們仍然不能確定那個資料庫操作是對應那個事務的,這是由於我們有2個執行緒都在進行事務操作而引起的。為此我們可以使用每一個事務獨佔一個連線來實現,雖然這種方法有點浪費連線池資源但是可以大大降低事務管理的複雜性。
3、連線池的分配與釋放
- 連線池的分配與釋放,對系統的效能有很大的影響。合理的分配與釋放,可以提高連線的複用度,從而降低建立新連線的開銷,同時還可以加快使用者的訪問速度。
- 對於連線的管理可使用一個List。即把已經建立的連線都放入List中去統一管理。每當使用者請求一個連線時,系統檢查這個List中有沒有可以分配的連線。如果有就把那個最合適的連線分配給他(如何能找到最合適的連線文章將在關鍵議題中指出);如果沒有就丟擲一個異常給使用者,List中連線是否可以被分配由一個執行緒來專門管理捎後我會介紹這個執行緒的具體實現。
4、連線池的配置與維護
- 連線池中到底應該放置多少連線,才能使系統的效能最佳?系統可採取設定最小連線數(minConnection)和最大連線數(maxConnection)等引數來控制連線池中的連線。比方說,最小連線數是系統啟動時連線池所建立的連線數。如果建立過多,則系統啟動就慢,但建立後系統的響應速度會很快;如果建立過少,則系統啟動的很快,響應起來卻慢。這樣,可以在開發時,設定較小的最小連線數,開發起來會快,而在系統實際使用時設定較大的,因為這樣對訪問客戶來說速度會快些。最大連線數是連線池中允許連線的最大數目,具體設定多少,要看系統的訪問量,可通過軟體需求上得到。
- 如何確保連線池中的最小連線數呢?有動態和靜態兩種策略。動態即每隔一定時間就對連線池進行檢測,如果發現連線數量小於最小連線數,則補充相應數量的新連線,以保證連線池的正常運轉。靜態是發現空閒連線不夠時再去檢查。
使用資料庫連線池的優勢?
1、連線池的優勢
連線池用於建立和管理資料庫連線的緩衝池技術,緩衝池中的連線可以被任何需要他們的執行緒使用。當一個執行緒需要用JDBC對一個資料庫操作時,將從池中請求一個連線。當這個連線使用完畢後,將返回到連線池中,等待為其他的執行緒服務。
連線池的主要優點有以下三個方面。
- 第一、減少連線建立時間。連線池中的連線是已準備好的、可重複使用的,獲取後可以直接訪問資料庫,因此減少了連線建立的次數和時間。
- 第二、簡化的程式設計模式。當使用連線池時,每一個單獨的執行緒能夠像建立一個自己的JDBC連線一樣操作,允許使用者直接使用JDBC程式設計技術。
- 第三、控制資源的使用。如果不使用連線池,每次訪問資料庫都需要建立一個連線,這樣系統的穩定性受系統連線需求影響很大,很容易產生資源浪費和高負載異常。連線池能夠使效能最大化,將資源利用控制在一定的水平之下。連線池能控制池中的連線數量,增強了系統在大量使用者應用時的穩定性。
- 連線池的工作原理?
下面,簡單的闡述下連線池的工作原理。
連線池技術的核心思想是連線複用,通過建立一個資料庫連線池以及一套連線使用、分配和管理策略,使得該連線池中的連線可以得到高效、安全的複用,避免了資料庫連線頻繁建立、關閉的開銷。
連線池的工作原理主要由三部分組成,分別為連線池的建立、連線池中連線的使用管理、連線池的關閉。
- 第一、連線池的建立。一般在系統初始化時,連線池會根據系統配置建立,並在池中建立了幾個連線物件,以便使用時能從連線池中獲取。連線池中的連線不能隨意建立和關閉,這樣避免了連線隨意建立和關閉造成的系統開銷。Java中提供了很多容器類可以方便的構建連線池,例如Vector、Stack等。
- 第二、連線池的管理。連線池管理策略是連線池機制的核心,連線池內連線的分配和釋放對系統的效能有很大的影響。其管理策略是:
- 當客戶請求資料庫連線時,首先檢視連線池中是否有空閒連線,如果存在空閒連線,則將連線分配給客戶使用;如果沒有空閒連線,則檢視當前所開的連線數是否已經達到最大連線數,如果沒達到就重新建立一個連線給請求的客戶;如果達到就按設定的最大等待時間進行等待,如果超出最大等待時間,則丟擲異常給客戶。
- 當客戶釋放資料庫連線時,先判斷該連線的引用次數是否超過了規定值,如果超過就從連線池中刪除該連線,否則保留為其他客戶服務。
- 該策略保證了資料庫連線的有效複用,避免頻繁的建立、釋放連線所帶來的系統資源開銷。
- 第三、連線池的關閉。當應用程式退出時,關閉連線池中所有的連線,釋放連線池相關的資源,該過程正好與建立相反
常用的連線池:
- dbcp可能是使用最多的開源連線池,原因大概是因為配置方便,而且很多開源和tomcat應用例子都是使用的這個連線池吧。這個連線池可以設定最大和最小連線,連線等待時間等,基本功能都有。這個連線池的配置在具體專案應用中,發現此連線池的持續執行的穩定性還是可以,不過速度稍慢,在大併發量的壓力下穩定性
事物的四大特性和事物的隔離級別 鎖之間的區別?
如果一個資料庫聲稱支援事務的操作,那麼該資料庫必須要具備以下四個特性(ACID):
⑴ 原子性(Atomicity)
原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,這和前面兩篇部落格介紹事務的功能是一樣的概念,因此事務的操作如果成功就必須要完全應用到資料庫,如果操作失敗則不能對資料庫有任何影響。
⑵ 一致性(Consistency)
- 一致性是指事務必須使資料庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之後都必須處於一致性狀態。
- 拿轉賬來說,假設使用者A和使用者B兩者的錢加起來一共是5000,那麼不管A和B之間如何轉賬,轉幾次賬,事務結束後兩個使用者的錢相加起來應該還得是5000,這就是事務的一致性。
⑶ 隔離性(Isolation)
- 隔離性是當多個使用者併發訪問資料庫時,比如操作同一張表時,資料庫為每一個使用者開啟的事務,不能被其他事務的操作所干擾,多個併發事務之間要相互隔離。
- 即要達到這麼一種效果:對於任意兩個併發的事務T1和T2,在事務T1看來,T2要麼在T1開始之前就已經結束,要麼在T1結束之後才開始,這樣每個事務都感覺不到有其他事務在併發地執行。
- 關於事務的隔離性資料庫提供了多種隔離級別,稍後會介紹到。
⑷ 永續性(Durability)
- 永續性是指一個事務一旦被提交了,那麼對資料庫中的資料的改變就是永久性的,即便是在資料庫系統遇到故障的情況下也不會丟失提交事務的操作。
- 例如我們在使用JDBC運算元據庫時,在提交事務方法後,提示使用者事務操作完成,當我們程式執行完成直到看到提示後,就可以認定事務以及正確提交,即使這時候資料庫出現了問題,也必須要將我們的事務完全執行完成,否則就會造成我們看到提示事務處理完畢,但是資料庫因為故障而沒有執行事務的重大錯誤。
當多個執行緒都開啟事務運算元據庫中的資料時,資料庫系統要能進行隔離操作,以保證各個執行緒獲取資料的準確性,在介紹資料庫提供的各種隔離級別之前,我們先看看如果不考慮事務的隔離性,會發生的幾種問題:
1,髒讀
髒讀是指在一個事務處理過程裡讀取了另一個未提交的事務中的資料。
2,不可重複讀
不可重複讀是指在對於資料庫中的某個資料,一個事務範圍內多次查詢卻返回了不同的資料值,這是由於在查詢間隔,被另一個事務修改並提交了。
3,虛讀(幻讀)
幻讀是事務非獨立執行時發生的一種現象。例如事務T1對一個表中所有的行的某個資料項做了從“1”修改為“2”的操作,這時事務T2又對這個表中插入了一行資料項,而這個資料項的數值還是為“1”並且提交給資料庫。而操作事務T1的使用者如果再檢視剛剛修改的資料,會發現還有一行沒有修改,其實這行是從事務T2中新增的,就好像產生幻覺一樣,這就是發生了幻讀。
現在來看看MySQL資料庫為我們提供的四種隔離級別:
① Serializable (序列化):可避免髒讀、不可重複讀、幻讀的發生。
② Repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。
③ Read committed (讀已提交):可避免髒讀的發生。
④ Read uncommitted (讀未提交):最低階別,任何情況都無法保證。
以上四種隔離級別最高的是Serializable級別,最低的是Read uncommitted級別,當然級別越高,執行效率就越低。像Serializable這樣的級別,就是以鎖表的方式(類似於Java多執行緒中的鎖)使得其他的執行緒只能在鎖外等待,所以平時選用何種隔離級別應該根據實際情況。在MySQL資料庫中預設的隔離級別為Repeatable read (可重複讀)。
一般可以分為兩類,一個是悲觀鎖,一個是樂觀鎖,悲觀鎖一般就是我們通常說的資料庫鎖機制,樂觀鎖一般是指使用者自己實現的一種鎖機制,比如hibernate實現的樂觀鎖甚至程式語言也有樂觀鎖的思想的應用。
1、悲觀鎖
悲觀鎖:顧名思義,就是很悲觀,它對於資料被外界修改持保守態度,認為資料隨時會修改,所以整個資料處理中需要將資料加鎖。悲觀鎖一般都是依靠關聯式資料庫提供的鎖機制,事實上關聯式資料庫中的行鎖,表鎖不論是讀寫鎖都是悲觀鎖。
悲觀鎖按照使用性質劃分:
- 共享鎖(Share locks簡記為S鎖):也稱讀鎖,事務A對物件T加s鎖,其他事務也只能對T加S,多個事務可以同時讀,但不能有寫操作,直到A釋放S鎖。
- 排它鎖(Exclusivelocks簡記為X鎖):也稱寫鎖,事務A對物件T加X鎖以後,其他事務不能對T加任何鎖,只有事務A可以讀寫物件T直到A釋放X鎖。
- 更新鎖(簡記為U鎖):用來預定要對此物件施加X鎖,它允許其他事務讀,但不允許再施加U鎖或X鎖;當被讀取的物件將要被更新時,則升級為X鎖,主要是用來防止死鎖的。因為使用共享鎖時,修改資料的操作分為兩步,首先獲得一個共享鎖,讀取資料,然後將共享鎖升級為排它鎖,然後再執行修改操作。這樣如果同時有兩個或多個事務同時對一個物件申請了共享鎖,在修改資料的時候,這些事務都要將共享鎖升級為排它鎖。這些事務都不會釋放共享鎖而是一直等待對方釋放,這樣就造成了死鎖。如果一個資料在修改前直接申請更新鎖,在資料修改的時候再升級為排它鎖,就可以避免死鎖。
悲觀鎖按照作用範圍劃分:
- 行鎖:鎖的作用範圍是行級別,資料庫能夠確定那些行需要鎖的情況下使用行鎖,如果不知道會影響哪些行的時候就會使用表鎖。舉個例子,一個使用者表user,有主鍵id和使用者生日birthday當你使用update … where id=?這樣的語句資料庫明確知道會影響哪一行,它就會使用行鎖,當你使用update … where birthday=?這樣的的語句的時候因為事先不知道會影響哪些行就可能會使用表鎖。
- 表鎖:鎖的作用範圍是整張表。
樂觀鎖
樂觀鎖:顧名思義,就是很樂觀,每次自己運算元據的時候認為沒有人回來修改它,所以不去加鎖,但是在更新的時候會去判斷在此期間資料有沒有被修改,需要使用者自己去實現。既然都有資料庫提供的悲觀鎖可以方便使用為什麼要使用樂觀鎖呢?對於讀操作遠多於寫操作的時候,大多數都是讀取,這時候一個更新操作加鎖會阻塞所有讀取,降低了吞吐量。最後還要釋放鎖,鎖是需要一些開銷的,我們只要想辦法解決極少量的更新操作的同步問題。換句話說,如果是讀寫比例差距不是非常大或者你的系統沒有響應不及時,吞吐量瓶頸問題,那就不要去使用樂觀鎖,它增加了複雜度,也帶來了額外的風險。
樂觀鎖實現方式:
- 版本號(記為version):就是給資料增加一個版本標識,在資料庫上就是表中增加一個version欄位,每次更新把這個欄位加1,讀取資料的時候把version讀出來,更新的時候比較version,如果還是開始讀取的version就可以更新了,如果現在的version比老的version大,說明有其他事務更新了該資料,並增加了版本號,這時候得到一個無法更新的通知,使用者自行根據這個通知來決定怎麼處理,比如重新開始一遍。這裡的關鍵是判斷version和更新兩個動作需要作為一個原子單元執行,否則在你判斷可以更新以後正式更新之前有別的事務修改了version,這個時候你再去更新就可能會覆蓋前一個事務做的更新,造成第二類丟失更新,所以你可以使用update … where … and version=”old version”這樣的語句,根據返回結果是0還是非0來得到通知,如果是0說明更新沒有成功,因為version被改了,如果返回非0說明更新成功。
- 時間戳(timestamp):和版本號基本一樣,只是通過時間戳來判斷而已,注意時間戳要使用資料庫伺服器的時間戳不能是業務系統的時間。
- 待更新欄位:和版本號方式相似,只是不增加額外欄位,直接使用有效資料欄位做版本控制資訊,因為有時候我們可能無法改變舊系統的資料庫表結構。假設有個待更新欄位叫count,先去讀取這個count,更新的時候去比較資料庫中count的值是不是我期望的值(即開始讀的值),如果是就把我修改的count的值更新到該欄位,否則更新失敗。java的基本型別的原子型別物件如AtomicInteger就是這種思想。
- 所有欄位:和待更新欄位類似,只是使用所有欄位做版本控制資訊,只有所有欄位都沒變化才會執行更新。
怎麼改session儲存位置?
- 使用phpinfo()檢視PHP的配置資訊,定位配置檔案的路徑
- Loaded Configuration File,的值即是PHP配置檔案的路徑
- 在配置檔案中查詢:session.save_path,並修改其值
- 重啟Apache伺服器
Memcache的儲存原理和lru機制?
memcache的記憶體分配機制:
- memcache程式會預先分配一部分記憶體給slab,給slab分配的記憶體也叫page(page的預設大小是1M),每個page下面會有若干個chunk(chunk預設大小96B),而資料就會封裝成item儲存在chunk裡面,若干個大小相同的chunk稱為slab class,相同大小的chunk未必在一個slab中。所以在預設情況下一個slab存放的chunk數量為10922個chunk:10922×96+ 64 = 1048576(1M) 。
- 但是在一個slab中所有的chunk的大小是不同的,不同大小的chunk存放不同大小的資料。
memcache的資料刪除機制:
- 當資料過期時,memcache並不會直接從記憶體中刪除資料,因為memcache並不會回收已經分配的記憶體,而只是在get資料時檢查時間戳是否過期,如果過期那麼客戶端就不可見,但是原來分配的記憶體可以重複使用,這叫做惰性失效。所以memcache不會對過期的資料進行監視,因此也就節省了cpu的資源。
- 但是在memcache中使用LRU機制進行刪除資料,即最近最少使用。通過計數器來記錄哪些資料最少被使用來刪除它,所以也有可能刪除一些尚未過期或者永久有效的資料。
- 在每個slab中資料都是存放在連結串列上的,連結串列有head和tail指標,分別指向最老和最新的資料。當LRU機制啟動時,兩個指標同時發揮作用查詢失效資料,如果沒有失效資料那麼就會刪除最近的最少被使用的資料。
- LRU只針對每個slab,並不針對整體。只有在slab不能分配新的page記憶體時才會呼叫LRU。
一種有效緩解使用LRU的方法是:
1,避免大物件
如果系統上只有及個別幾個大物件的話,會浪費記憶體空間,因為Slab申請了Page是不能釋放記憶體的,及個別大物件會導致Slab申請了記憶體資源而得不到充分的利用。
2,調整增長因子
根據專案的需求調整增長因子,使記憶體充分利用。
對於大流量的網站?採用什麼方法解決訪問量的問題優化程式,優化資料庫,如何程式和資料庫已經最優化,使用以下解決方法?
硬體方面
普通的一個p4的伺服器每天最多能支援大約10萬左右的IP,主要影響伺服器的速度有:網路-硬碟讀寫速度-記憶體大小-cpu處理速度。
軟體方面
- 靜態頁面 前臺實現完全的靜態化當然最好,可以完全不用訪問資料庫
- 資料庫優化
- 表欄位優化
- 語句優化
- 索引優化
- 分庫分表
- 讀寫分離
禁止外部的盜鏈
- 外部盜鏈往往會加大伺服器的請求和流量的負載壓力,因此應該嚴格限制外部對於自身的圖片或者檔案盜鏈,
- 好在目前可以簡單地通過refer來控制盜鏈,
- Apache自己就可以通過配置來禁止盜鏈
- IIS也有一些第三方的ISAPI可以實現同樣的功能。
- 或者使用非技術手段來解決,比如在圖片上增加水印
控制大檔案的下載。
- 大檔案的下載會佔用很大的流量,並且對於非SCSI硬碟來說,大量檔案下載會消耗
- CPU,使得網站響應能力下降。因此,儘量不要提供超過2M的大檔案下載,如果需要
- 提供,建議將大檔案放在另外一臺伺服器上
使用不同主機分流主要流量
- 將檔案放在不同的主機上,提供不同的映象供使用者下載。比如如果覺得RSS檔案佔用
- 流量大,那麼使用FeedBurner或者FeedSky等服務將RSS輸出放在其他主機上,這
- 樣別人訪問的流量壓力就大多集中在FeedBurner的主機上,RSS就不佔用太多資源了
使用流量分析統計軟體。
在網站上安裝一個流量分析統計軟體,可以即時知道哪些地方耗費了大量流量,哪些頁面需要再進行優化,因此,解決流量問題還需要進行精確的統計分析才可以。比如:Google Analytics(Google分析)。
變數與常量有哪些區別?(必做)
- 常量前面沒有美元符號($)
- 常量只能用 define() 函式定義,而不能通過賦值語句
- 常量可以不用理會變數範圍的規則而在任何地方定義和訪問
- 常量一旦定義就不能被重新定義或者取消定義
- 常量的值只能是標量
- 常量前面沒有$
- 兩者的作用域不同,變數的定義和訪問有作用域的限制,常量可在任何地方定義與訪問
- 常量一旦定義不可更改或取消定義他的值只是標量
- 常量只能通過define()函式定義,而不能同過賦值定義
資料庫索引是什麼?有什麼優點和缺點
索引就像是書的目錄,是與表或檢視關聯的磁碟上結構,可以加快從表或檢視中檢索行的速度。索引中包含由表或檢視中的一列或多列生成的鍵。這些鍵儲存在一個結構(BTree)中,使SQL可以快速有效地查詢與鍵值關聯的行。
優點:
① 建立索引的列可以保證行的唯一性,生成唯一的rowId
② 建立索引可以有效縮短資料的檢索時間
③ 建立索引可以加快表與表之間的連線
④ 為用來排序或者是分組的欄位新增索引可以加快分組和排序順序
缺點:
① 建立索引和維護索引需要時間成本,這個成本隨著資料量的增加而加大
② 建立索引和維護索引需要空間成本,每一條索引都要佔據資料庫的物理儲存空間,資料量越大,佔用空間也越大(資料表佔據的是資料庫的資料空間)
③ 會降低表的增刪改的效率,因為每次增刪改索引需要進行動態維護,導致時間變長
資料庫的效能優化主要包含哪些方面
- 1、sql語句的執行計劃是否正常
- 2、減少應用和資料庫的互動次數、同一個sql語句的執行次數
- 3、資料庫實體的碎片的整理(特別是對某些表經常進行insert和delete動作,尤其注意,索引欄位為系列欄位、自增長欄位、時間欄位,對於業務比較頻繁的系統,最好一個月重建一次)
- 4、減少表之間的關聯,特別對於批量資料處理,儘量單表查詢資料,統一在記憶體中進行邏輯處理,減少資料庫壓力(java處理批量資料不可取,儘量用c或者c++ 進行處理,效率大大提升)
- 5、對訪問頻繁的資料,充分利用資料庫cache和應用的快取
- 6、資料量比較大的,在設計過程中,為了減少其他表的關聯,增加一些冗餘欄位,提高查詢效能
設計和建立無限極分類的資料表結構
資訊表
`ID` int(10) unsigned NOT NULL auto_increment,
`cID` tinyint(3) unsigned NOT NULL default '0',
`title` varchar(255) NOT NULL default 'No Title',
`content` mediumtext NOT NULL,
分類表
`cID` tinyint(3) unsigned NOT NULL auto_increment,
`parentID` tinyint(3) unsigned NOT NULL default '0',
`order` tinyint(3) NOT NULL default '0',
`name` varchar(255) NOT NULL default '',
請設計使用者登入功能,儘量完整的寫出from表單,並設計使用者表tb_user,其中含欄位id,name ,pwd,寫一高效sql語句,用於匹配使用者表中使用者名稱和密碼是否正確。
$info = self::(‘id’,’name’,’pwd’)
->where(‘name’,$username)
->where(‘pwd’,$pwd)
->first();
Create table tb_user(
Id int(11) unsigned primary key auto_increment comment ‘主鍵id’,
Name varchar(50) not null comment ‘姓名’,
Pwd varchar(50) not null comment ‘密碼’
)ENGINE = MYISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
Left join right join inner join的區別是什麼?
left join(左連線) 返回包括左表中的所有記錄和右表中連線欄位相等的記錄
right join(右連線) 返回包括右表中的所有記錄和左表中連線欄位相等的記錄
左連線和右連線很相似,只是左右表位置的不同罷了。適用場景,如:員工表中有個欄位是詳細地址資訊表的主鍵id,這兩個表相關聯時,就可以用左連線或右連線,因為在詳細地址資訊表中找不到某員工的地址資訊也要將員工這條記錄顯示出來,相應的詳細地址資訊欄位為空即可,而不能因為地址沒有存在資料庫裡,這個員工就沒了(簡單理解成不重要的資訊不影響整條記錄的顯示)
inner join(等值連線、內連線) 只返回兩個表中連線欄位相等的行
內連線的適用場景:相連線的兩個表中必須在某個欄位上有相等的值才可以將整條記錄顯示出來,如一條服務單記錄在了兩個表中,A表中記錄了該服務單的服務時間、坐席名稱和錄音地址等基本資訊,B表中記錄了該服務單的業務詳情,如保險單號,車牌號,保單日期等,當顯示該服務單時,要將A表與B表做內連線,因為少這兩表任何一個表,該服務單都不算完整,缺失的資訊會使業務上沒法繼續。
總結:可以將可使用左連線和右連線的兩個表理解成其中一個表的資訊明顯比另外一個表的資訊重要得多;使用內連線的兩個表理解成重要程度區別不太大的兩個表。
描述sql語句的執行順序?
- 1、 from子句組裝來自不同資料來源的資料;
- 2、where子句基於指定的條件對記錄行進行篩選;
- 3、group by子句將資料劃分為多個分組;
- 4、使用聚集函式進行計算;
- 5、使用having子句篩選分組;
- 6、計算所有的表示式;
- 7、使用order by對結果集進行排序。
select 集合輸出。
1)語法分析,分析語句的語法是否符合規範,衡量語句中各表示式的意義。
2)語義分析,檢查語句中涉及的所有資料庫物件是否存在,且使用者有相應的許可權。
3)檢視轉換,將涉及檢視的查詢語句轉換為相應的對基表查詢語句。
4)表示式轉換, 將複雜的 SQL 表示式轉換為較簡單的等效連線表示式。
5)選擇優化器,不同的優化器一般產生不同的“執行計劃”
6)選擇連線方式, ORACLE 有三種連線方式,對多表連線 ORACLE 可選擇適當的連線方式。
7)選擇連線順序, 對多表連線 ORACLE 選擇哪一對錶先連線,選擇這兩表中哪個表做為源資料表。
8)選擇資料的搜尋路徑,根據以上條件選擇合適的資料搜尋路徑,如是選用全表搜尋還是利用索引或是其他的方式。
9)執行“執行計劃”
Linux下如何檢視IO負載?
第一種:用 top 命令 中的cpu 資訊觀察
Top可以看到的cpu資訊會有:0.0% wa 的百分比可以大致的體現出當前的磁碟io請求是否頻繁。如果 wa的數量比較大,說明等待輸入輸出的的io比較多。
第二種:用vmstat 命令報告
- IO引數
- bi: 傳送到塊裝置的塊數,單位:塊/秒
- bo: 從塊裝置接收到的塊數,單位:塊/秒
- r: 等待執行的程式數 b: 處在非中斷睡眠狀態的程式數
- 輸入命令:vmstat 2 5
- 如果發現等待的程式和處在非中斷睡眠狀態的程式數非常多,並且傳送到塊裝置的塊數和從塊裝置接收到的塊數非常大,那就說明磁碟io比較多。
第三種 ps -aux
- Linxu下如何給一個目錄以及子目錄,檔案更該使用者組合檔案許可權?
- chmod -R abc 目錄名
- 其中a,b,c各為一個數字,分別表示User、Group、及Other的許可權。
- r=4,w=2,x=1
對一個目錄來說,rwx分別代表什麼含義?
- r(Read,讀取):對檔案而言,具有讀取檔案內容的許可權;對目錄來說,具有瀏覽目錄的許可權。
- w(Write,寫入):對檔案而言,具有新增、修改檔案內容的許可權;對目錄來說,具有刪除、移動目錄內檔案的許可權。
- x(eXecute,執行):對檔案而言,具有執行檔案的許可權;對目錄了來說該使用者具有進入目錄的許可權。
- 也就是說,如果對一個目錄具有寫許可權,但是這個目錄下的檔案卻只有讀許可權,最終的結果是,你可以刪除這個檔案,但是無法修改它!
Mysql中explain方法的引數和使用方法?
MySQL常見的效能瓶頸一般都是出現在CPU和I/O上,即在資料裝入記憶體中或磁碟上讀取資料時,CPU發生了飽和或裝入資料過大,記憶體容量不足,磁碟I/O效能被限制。這時候就要使用到Explain關鍵字來進行分析和調優。
基本使用
- Explain關鍵字可以用來模擬優化器執行SQL查詢語句,從而瞭解SQL語句的處理方式,來達到分析查詢語句或表結構的效能瓶頸。
- 通過Explain可以獲得
- 表的讀取順序和引用
- 資料讀取操作的基本型別
- 可使用的索引以及實際使用的索引
- 優化器的查詢行數
對一個目錄來說,rwx分別代表什麼含義?
- r(Read,讀取):對檔案而言,具有讀取檔案內容的許可權;對目錄來說,具有瀏覽目錄的許可權。
- w(Write,寫入):對檔案而言,具有新增、修改檔案內容的許可權;對目錄來說,具有刪除、移動目錄內檔案的許可權。
- x(eXecute,執行):對檔案而言,具有執行檔案的許可權;對目錄了來說該使用者具有進入目錄的許可權。
- 也就是說,如果對一個目錄具有寫許可權,但是這個目錄下的檔案卻只有讀許可權,最終的結果是,你可以刪除這個檔案,但是無法修改它!
列舉出linux程式具有哪些屬性和數值上限?
- 基本屬性包括:程式號PID、父程式號PPID、程式組號PGID
- 程式狀態:狀態分為執行R、休眠S、殭屍Z;
- 程式執行的優先順序;
- 程式所連線的終端名;
- 程式資源佔用:比如佔用資源大小(記憶體、CPU佔用量);
- 列舉出df cat chmod wc awk sed sysct netstat vmstat iostat
- df命令用於顯示磁碟分割槽上的可使用的磁碟空間。預設顯示單位為KB。可以利用該命令來獲取硬碟被佔用了多少空間,目前還剩下多少空間等資訊。
- cat命令連線檔案並列印到標準輸出裝置上,cat經常用來顯示檔案的內容
- chmod命令用來變更檔案或目錄的許可權。在UNIX系統家族裡,檔案或目錄許可權的控制分別以讀取、寫入、執行3種一般許可權來區分,另有3種特殊許可權可供運用。
- wc命令用來計算數字。利用wc指令我們可以計算檔案的Byte數、字數或是列數,若不指定檔名稱,或是所給予的檔名為“-”,則wc指令會從標準輸入裝置讀取資料。
- awk命令用於在linux/unix下對文字和資料進行處理。資料可以來自標準輸入(stdin)、一個或多個檔案,或其它命令的輸出。它支援使用者自定義函式和動態正規表示式等先進功能,是linux/unix下的一個強大程式設計工具 / AWK是一種處理文字檔案的語言,是一個強大的文字分析工具。
- sed命令Stream Editor文字流編輯,sed是一個“非互動式的”面向字元流的編輯器。能同時處理多個檔案多行的內容,可以不對原檔案改動,把整個檔案輸入到螢幕,可以把只匹配到模式的內容輸入到螢幕上。還可以對原檔案改動,但是不會再螢幕上返回結果。
- sysctl命令被用於在核心執行時動態地修改核心的執行引數,可用的核心引數在目錄/proc/sys中。
- 它包含一些TCP/ip堆疊和虛擬記憶體系統的高階選項,這可以讓有經驗的管理員提高引人注目的系統效能。用sysctl可以讀取設定超過五百個系統變數 / 語法:sysctl(選項)(引數)
- netstat命令用來列印Linux中網路系統的狀態資訊,可讓你得知整個Linux系統的網路情況。
- vmstat命令的含義為顯示虛擬記憶體狀態(“Viryual Memor Statics”),但是它可以報告關於程式、記憶體、I/O等系統整體執行狀態。
- iostat 命令主要通過觀察物理磁碟的活動時間以及他們的平均傳輸速度,監控系統輸入 / 輸出裝置負載。
mysql欄位型別各佔幾個位元組:Smallint int bigint datetime varchar(8)
- smallint 較小整數 2位元組
- int 標準整數 4位元組
- bigint 較大整數 8位元組
- datetime “yyyy-mm-dd hh:mm:ss”格式 8位元組
- varchar(8) 8個字元,4個漢字,一個漢字佔兩個字元
網站後臺資料庫許可權模型設計?要求設計出想管所有的資料表以及關鍵欄位?
- 我們都知道,RBAC(Role-Based Access Control,基於角色的訪問控制),就是使用者通過角色與許可權進行關聯。簡單地說,一個使用者擁有若干角色,每一個角色擁有若干許可權。這樣,就構造成“使用者-角色-許可權”的授權模型。在這種模型中,使用者與角色之間,角色與許可權之間,一般者是多對多的關係。
- 角色是什麼?可以理解為一定數量的許可權的集合,許可權的載體。例如:一個論壇系統,“超級管理員”、“版主”都是角色。版主可管理版內的帖子、可管理版內的使用者等,這些是許可權。要給某個使用者授予這些許可權,不需要直接將許可權授予使用者,可將“版主”這個角色賦予該使用者。
- 當使用者的數量非常大時,要給系統每個使用者逐一授權(授角色),是件非常煩瑣的事情。這時,就需要給使用者分組,每個使用者組內有多個使用者。除了可給使用者授權外,還可以給使用者組授權。這樣一來,使用者擁有的所有許可權,就是使用者個人擁有的許可權與該使用者所在使用者組擁有的許可權之和。
- 在應用系統中,許可權表現成什麼?對功能模組的操作,對上傳檔案的刪改,選單的訪問,甚至頁面上某個按鈕、某個圖片的可見性控制,都可屬於許可權的範疇。有些許可權設計,會把功能操作作為一類,而把檔案、選單、頁面元素等作為另一類,這樣構成“使用者-角色-許可權-資源”的授權模型。而在做資料表建模時,可把功能操作和資源統一管理,也就是都直接與許可權表進行關聯,這樣可能更具便捷性和易擴充套件性。
這樣設計的好處有二:
其一,不需要區分哪些是許可權操作,哪些是資源,(實際上,有時候也不好區分,如選單,把它理解為資源呢還是功能模組許可權呢?)。
其二,方便擴充套件,當系統要對新的東西進行許可權控制時,我只需要建立一個新的關聯表“許可權XX關聯表”,並確定這類許可權的許可權型別字串。
這裡要注意的是,許可權表與許可權選單關聯表、許可權選單關聯表與選單表都是一對一的關係。(檔案、頁面許可權點、功能操作等同理)。也就是每新增一個選單,就得同時往這三個表中各插入一條記錄。這樣,可以不需要許可權選單關聯表,讓許可權表與選單表直接關聯,此時,須在許可權表中新增一列用來儲存選單的ID,許可權表通過“許可權型別”和這個ID來區分是種型別下的哪條記錄。
隨著系統的日益龐大,為了方便管理,可引入角色組對角色進行分類管理,跟使用者組不同,角色組不參與授權。例如:某電網系統的許可權管理模組中,角色就是掛在區局下,而區局在這裡可當作角色組,它不參於許可權分配。另外,為方便上面各主表自身的管理與查詢,可採用樹型結構,如選單樹、功能樹等,當然這些可不需要參於許可權分配。
MySQL有多少種日誌?
- MySQL如何判斷一個表的索引是有效的?
- 使用方法,在select語句前加上explain就可以了:
- Explain select surname,first_name form a,b where a.id=b.id
- Redis實現佇列關鍵點是什麼?用了什麼函式?
個人理解在專案中使用訊息佇列一般是有如下幾個原因:
- 把瞬間伺服器的請求處理換成非同步處理,緩解伺服器的壓力
- 實現資料順序排列獲取
redis實現訊息佇列步驟如下:
- 1).redis函式rpush,lpop
- 2).建議定時任務入佇列
- 3)建立定時任務出佇列
Php的加密有那些?寫出對於的函式以及作用?
MD5加密:
- 1.md5()預設情況下以 32 字元十六進位制數字形式返回雜湊值,它接受兩個引數,第一個為要加密的字串,第二個為raw_output的布林值,預設為false,如果設定為true,md5()則會返回原始的 16 位二進位制格式報文摘要
- 2.md5()為單向加密,沒有逆向解密演算法,但是還是可以對一些常見的字串通過收集,列舉,碰撞等方法破解
Crypt加密:
crypt()接受兩個引數,第一個為需要加密的字串,第二個為鹽值(就是加密干擾值,如果沒有提供,則預設由PHP自動生成);返回雜湊後的字串或一個少於 13 字元的字串,後者為了區別鹽值。
2.crypt()為單向加密,跟md5一樣。
Sha1加密:
- 1.跟md5很像,不同的是sha1()預設情況下返回40個字元的雜湊值,傳入引數性質一樣,第一個為加密的字串,第二個為raw_output的布林值,預設為false,如果設定為true,sha1()則會返回原始的20 位原始格式報文摘要
- 2.sha1()也是單行加密,沒有逆向解密演算法‘
base64編碼加密:
- 1.base64_encode()接受一個引數,也就是要編碼的資料(這裡不說字串,是因為很多時候base64用來編碼圖片)
- 2.base64encode()為雙向加密,可用base64decode()來解密
加密型別?
1.單向雜湊加密
- 就是把任意長度的資訊進行雜湊計算,得到固定長度的輸出,這個雜湊計算過程是單向的,即不能對固定長度的輸出資訊進行計算從而得到輸入資訊。
- (1)特徵:雪崩效應、定長輸出和不可逆。
- (2)作用是:確保資料的完整性。
- (3)加密演算法:md5(標準金鑰長度128位)、sha1(標準金鑰長度160位)、md4、CRC-32
2.對稱雜湊加密
- 對稱加密是指加密和解密是使用同一個金鑰,或者可以互相推算。
- (1)加密方和解密方使用同一個金鑰。
- (2)加密解密的速度比較快,適合資料比較長時的使用。
- (3)金鑰傳輸的過程不安全,且容易被破解,金鑰管理也比較麻煩。
- (4)加密演算法:DES(Data Encryption Standard)、3DES、AES(Advanced Encryption Standard,支援128、192、256、512位金鑰的加密)、Blowfish。
3.非對稱雜湊加密
- 非對稱加密和解密使用的不是同一個金鑰,其中一個對外公開,稱作公鑰,另一個只有所屬者知道,稱作私鑰。
- (1)每個使用者擁用一對金鑰加密:公鑰和私鑰。
- (2)公鑰加密,私鑰解密;私鑰加密,公鑰解密。
- (3)公鑰傳輸的過程不安全,易被竊取和替換。
- (4)由於公鑰使用的金鑰長度非常長,所以公鑰加密速度非常慢,一般不使用其去加密。
- (5)某一個使用者用其私鑰加密,其他使用者用其公鑰解密,實現數字簽名的作用。
- (6)公鑰加密的另一個作用是實現金鑰交換。
- (7)加密和簽名演算法:RSA、ELGamal。
- (8)公鑰簽名演算法:DSA。
Redis如何切庫?redis如何實現備份的機制?rdb和aof的區別?
區別
- RDB持久化是指在指定的時間間隔內將記憶體中的資料集快照寫入磁碟,實際操作過程是fork一個子程式,先將資料集寫入臨時檔案,寫入成功後,再替換之前的檔案,用二進位制壓縮儲存。
- AOF持久化以日誌的形式記錄伺服器所處理的每一個寫、刪除操作,查詢操作不會記錄,以文字的方式記錄,可以開啟檔案看到詳細的操作記錄。
二者優缺點
RDB存在哪些優勢呢?
1). 一旦採用該方式,那麼你的整個Redis資料庫將只包含一個檔案,這對於檔案備份而言是非常完美的。比如,你可能打算每個小時歸檔一次最近24小時的資料,同時還要每天歸檔一次最近30天的資料。通過這樣的備份策略,一旦系統出現災難性故障,我們可以非常容易的進行恢復。
2). 對於災難恢復而言,RDB是非常不錯的選擇。因為我們可以非常輕鬆的將一個單獨的檔案壓縮後再轉移到其它儲存介質上。
3). 效能最大化。對於Redis的服務程式而言,在開始持久化時,它唯一需要做的只是fork出子程式,之後再由子程式完成這些持久化的工作,這樣就可以極大的避免服務程式執行IO操作了。
4). 相比於AOF機制,如果資料集很大,RDB的啟動效率會更高。
RDB又存在哪些劣勢呢?
1). 如果你想保證資料的高可用性,即最大限度的避免資料丟失,那麼RDB將不是一個很好的選擇。因為系統一旦在定時持久化之前出現當機現象,此前沒有來得及寫入磁碟的資料都將丟失。
2). 由於RDB是通過fork子程式來協助完成資料持久化工作的,因此,如果當資料集較大時,可能會導致整個伺服器停止服務幾百毫秒,甚至是1秒鐘。
AOF的優勢有哪些呢?
1). 該機制可以帶來更高的資料安全性,即資料永續性。Redis中提供了3中同步策略,即每秒同步、每修改同步和不同步。事實上,每秒同步也是非同步完成的,其效率也是非常高的,所差的是一旦系統出現當機現象,那麼這一秒鐘之內修改的資料將會丟失。而每修改同步,我們可以將其視為同步持久化,即每次發生的資料變化都會被立即記錄到磁碟中。可以預見,這種方式在效率上是最低的。至於無同步,無需多言,我想大家都能正確的理解它。
2). 由於該機制對日誌檔案的寫入操作採用的是append模式,因此在寫入過程中即使出現當機現象,也不會破壞日誌檔案中已經存在的內容。然而如果我們本次操作只是寫入了一半資料就出現了系統崩潰問題,不用擔心,在Redis下一次啟動之前,我們可以通過redis-check-aof工具來幫助我們解決資料一致性的問題。
3). 如果日誌過大,Redis可以自動啟用rewrite機制。即Redis以append模式不斷的將修改資料寫入到老的磁碟檔案中,同時Redis還會建立一個新的檔案用於記錄此期間有哪些修改命令被執行。因此在進行rewrite切換時可以更好的保證資料安全性。
4). AOF包含一個格式清晰、易於理解的日誌檔案用於記錄所有的修改操作。事實上,我們也可以通過該檔案完成資料的重建。
AOF的劣勢有哪些呢?
1). 對於相同數量的資料集而言,AOF檔案通常要大於RDB檔案。RDB 在恢復大資料集時的速度比 AOF 的恢復速度要快。
2). 根據同步策略的不同,AOF在執行效率上往往會慢於RDB。總之,每秒同步策略的效率是比較高的,同步禁用策略的效率和RDB一樣高效。二者選擇的標準,就是看系統是願意犧牲一些效能,換取更高的快取一致性(aof),還是願意寫操作頻繁的時候,不啟用備份來換取更高的效能,待手動執行save的時候,再做備份(rdb)。rdb這個就更有些 eventually consistent的意思了。
寫出PHP常用的語句
- A如何判斷一個變數是否為空 empty()
- B如何判斷一個變數是否是NULL is null
- C 如何判斷一個變數是否存在 isset()
- D如何判斷一個變數是否型別和值都等於false 變數名===false
- E如何釋放一個變數 unset()
- F 迴圈陣列之前,檢查陣列 is_array()
PHP中error_reporting函式的作用是什麼?
error_reporting([ int $level ] ) — 設定應該報告何種 PHP 錯誤。
在js中我們經常使用document.onload=function()來實現文件載入後實現函式的呼叫,jquery 中也有和之相似的方法,是什麼他們之間有什麼異同?
1.執行時間
- onload指示頁面包含圖片等檔案在內的所有元素都載入完成
- ready()表示文件結構已經載入完成(不包含圖片等非文字媒體檔案)。、
2.編寫個數不同
- onload不能同時編寫多個,如果有多個onload方法,只會執行一個
- ready()可以同時編寫多個,並且都可以得到執行
3.簡化寫法
- onload沒有簡化寫法
- ready()可以簡寫;
PHP讀取計算機記憶體大的檔案,該怎麼操作?
1.直接呼叫linux的tail命令來顯示最 後幾行
2.簡單粗暴,簡單直接採用file函式來操作
3.直接使用php的fseek來進行檔案操作
實現中文字串擷取無亂碼的方法,如何實現字串反轉?
function str_rev($str){
//先判斷引數是否為字串,且為UTF8編碼
if(!is_string($str)||!mb_check_encoding($str,"utf-8")){
die("輸入的不是utf8型別的字串");
}
//用mb_strlen函獲取算utf8字串的長度
$length=mb_strlen($str,"utf-8");
//宣告一個陣列備用
$arr=array();
//將字串拆開放入陣列
for($i=0;$i<$length;$i++){
$arr[$i]=mb_substr($str,$i,1,"utf-8");
}
//將陣列按鍵名大小反轉
krsort($arr);
//將陣列中單個字元元素重新組合成字串
$str=implode("",$arr);
//將翻轉後的字串返回
return $str;
}
echo $s."<br>";
echo str_rev($s);
寫程式碼來解決多程式/執行緒同時讀取一個檔案的問題?
function T_put($filename,$string){
//追加方式開啟
$fp = fopen($filename,'a');
//加寫鎖
if (flock($fp, LOCK_EX)){
//寫檔案
fputs($fp,$string);
//解鎖
flock($fp, LOCK_UN);
}
fclose($fp);
}
function T_get($filename,$length){
//追加方式開啟
$fp = fopen($filename,'r');
//加讀鎖
if (flock($fp, LOCK_SH)){
//讀取檔案
$result = fgets($fp,$length);
//解鎖
flock($fp, LOCK_UN);
}
fclose($fp);
}
如何在linux系統中檢查mysql 服務是否啟動?
- 使用命令 # service mysqld status 或者 # service mysql status 命令來檢視mysql 的啟動狀態
- 如果是 mysqld is stopped 那就說明mysql服務是停止狀態,
- 如果是 mysqld is running 那就說明mysql服務是啟動狀態
Mysql中值為空和值為null 有什麼區別?
- 空值不一定為空
- 空值是一個比較特殊的欄位。在MySQL資料庫中,在不同的情形下,空值往往代表不同的含義。這是MySQL資料庫的一種特性。如在普通的欄位中(字元型的資料),空值就是表示空值。但是如果將一個空值的資料插入到TimesTamp型別的欄位中,空值就不一定為空
- 空值('')是不佔用空間的
- MySQL中的NULL其實是佔用空間的。
Laravel框架中依賴注入和控制反轉的意義和作用?
- 依賴注入就控制反轉的一種是實現方式,物件導向的特徵的重要體現 ,是我自身的,卻是我需要的,都是我所依賴的。一切需要外部提供的,都是需要進行依賴注入的
- 控制反轉 是物件導向程式設計中的一種設計原則,可以用來減低計算機程式碼之間的耦合度。其中最常見的方式叫做依賴注入(Dependency Injection, DI), 還有一種叫”依賴查詢”(Dependency Lookup)。
- 通過控制反轉,物件在被建立的時候,由一個調控系統內所有物件的外界實體,將其所依賴的物件的引用傳遞給它。也可以說,依賴被注入到物件中。
- 也就是說,我們需要一個調控系統,這個調控系統中我們存放一些物件的實體,或者物件的描述,在物件建立的時候將物件所依賴的物件的引用傳遞過去
資料庫觸發器和儲存過程的實現方式和作用?
觸發器:
1)觸發器是一種特殊型別的儲存過程,它由事件觸發,而不是程式呼叫或手工啟動,當資料庫有特殊的操作時,這些操作由資料庫中的事件來觸發,自動完成這些SQL語句。
2使用觸發器可以用來保證資料的有效性和完整性,完成比約束更復雜的資料約束
3)觸發器可以查詢其他表,而且可以包含複雜的 SQL 語句。 它們主要用於強制服從複雜的業務規則或要求。 例如,您可以根據客戶當前的帳戶狀態,控制是否允許插入新訂單。
4)觸發器也可用於強制引用完整性,以便在多個表中新增、更新或刪除行時,保留在這些表之間所定義的關係。
作用:
1)觸發器可通過資料庫中的相關表實現級聯更改;通過級聯引用完整性約束可以更有效地執行這些更改。
2)觸發器可以強制比用 CHECK 約束定義的約束更為複雜的約束。與 CHECK 約束不同,觸發器可以引用其它表中的列。例如,觸發器可以使用另一個表中的 SELECT 比較插入或更新的資料,以及執行其它操作,如修改資料或顯示使用者定義錯誤資訊。
3)觸發器還可以強制執行業務規則
4)觸發器也可以評估資料修改前後的表狀態,並根據其差異采取對策。
觸發器 儲存過程
- 當某類資料操作DML語句發生時隱式地呼叫 從一個應用或過程中顯示地呼叫
- 在觸發器體內禁止使用COMMIT和ROLLBACK語句 在過程體內可以使用所有PL/SQL塊中都能使用的SQL語句,包括COMMIT和ROLLBACK語句
- 不能接受引數輸入 可以接受引數輸入
.foo()和@foo()之間有什麼區別?
- foo() 會執行這個函式,任何解譯錯誤、語法錯誤、執行錯誤都會在頁面上顯示出來。
- @foo() 在執行這個函式時,會隱藏所有上述的錯誤訊息。
- PHP 支援一個錯誤控制運算子:@。當將其放置在一個 PHP 表示式之前,該表示式可能產生的任何錯誤資訊都被忽略掉。
有一個網頁地址,比如http://www.vogue.com.cn如何得到它的內容?
$str = file_get_contents(‘http://www.phpres.com/index.html’);
file_put_contents
.isset()和empty()的區別?
- PHP的isset()函式 一般用來檢測變數是否設定
- PHP的empty()函式 判斷值為否為空
簡述mysql 的加鎖機制?
mysql鎖能在併發情況下的mysql進行更好的優化
MySQL有三種鎖的級別:頁級、表級、行級,這3種鎖的特性可大致歸納如下:
- 表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的概率最高,併發度最低。
- 行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。
- 頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,併發度一般。
共享鎖
共享鎖的代號是S,是Share的縮寫,共享多的鎖粒度是行或者元組(多個行),一個事務獲取了共享多之後,可以對鎖定範圍內的資料執行讀操作。
排它鎖
排它鎖的代號是X,是eXclusive的縮寫,排他鎖的粒度是行或元組,與共享鎖相同,一個事務獲取了排它鎖之後,可以對鎖定範圍內的資料執行寫操作。
意向鎖
- 意向鎖是一種表鎖,鎖定的粒度是整張表,分為意向共享鎖(IS)和意向排它鎖(IX)兩類。
- 意向共享鎖表示一個事務“有意“對資料上共享鎖。“有意“這兩個字表達的意思比較微妙,說的明白點就是指事務想幹這個事但還沒有真去幹。
鎖的互斥和相容關係
- 鎖與鎖之間的關係,要麼相容,要麼互斥
- 鎖a和鎖b的相容是指:操作同樣一組資料時,如果事務t1獲取了鎖a,另一個事務t2還可以獲取鎖b。
- 鎖a和鎖b的互斥是指:操作同樣一組資料時,如果事務t1獲取了鎖a,另一個事務t2必須在t1釋放鎖a之後方可獲取鎖b。
兩臺伺服器之間快速拷貝檔案方法?
- 1.ftp
- 2.samba服務
- 3.sftp
- 4.scp
scp 本地使用者名稱@IP地址:檔名1 遠端使用者名稱@IP地址:檔名2
[本地使用者名稱@IP地址:] 可以不輸入,可能需要輸入遠端使用者名稱所對應的密碼.
可能有用的幾個引數:
- -v 和大多數linux命令中的-v意思一樣,用來顯示進度.可以用來檢視連線,認證,或是配置錯誤.
- -C 使能壓縮選項.
- -P 選擇埠.注意-p已經被rcp使用.
- -4 強行使用IPV4地址.
- -6 強行使用IPV6地址.
apache 伺服器,檢視併發數的命令?
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
mysql中where 和 having子句的區別?
- Where查詢的欄位資料表中有就可以,結果集中不顯示也可以
- Having查詢的欄位必須在結果集中顯示
作用的物件不同。
- WHERE 子句作用於表和檢視,HAVING 子句作用於組。
- having字句可以讓我們篩選成組後的各種資料,
- where字句在聚合前先篩選記錄,也就是說作用在group by和having字句前。
- 而 having子句在聚合後對組記錄進行篩選。
Redis事務如何實現?跟mysql事務的區別?
- redis和mysql的區別非常大。
- mysql中一箇中小型的網路資料庫,比oracle和sqlserver小, 但是併發能力遠超過acess這樣的桌面資料庫。
- redis是一個支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫。
- 可以認為redis比mysql簡化很多。
- mysql支援叢集。
- 現在大量的軟體使用redis作為mysql在本地的資料庫快取,然後再適當的時候和mysql同步.
請寫出5個以上git的命令及其用途,若不熟悉git,可以寫svn命令
- git init 在哪一目錄下,就會在該目錄下生成.git目錄。
- git status檢視本地庫的狀態
- git add .將所有發生改變的檔案新增到暫存區
- git commit -m 'git_initCommit' 將暫存區的檔案實際儲存到倉庫的歷史紀錄.
- git log檢視提交日誌
- git pull取回遠端倉庫的變化,並與本地分支合併
- .git clone +專案的url 該命令會把遠端的庫克隆到本地庫目錄下,與.git目錄同級
- git remote –v 顯示所有遠端倉庫
- git push推送所有分支到遠端倉庫
Mysql中覆蓋索引指的是什麼?
解釋一: 就是select的資料列只用從索引中就能夠取得,不必從資料表中讀取,換句話說查詢列要被所使用的索引覆蓋。
解釋二: 索引是高效找到行的一個方法,當能通過檢索索引就可以讀取想要的資料,那就不需要再到資料表中讀取行了。如果一個索引包含了(或覆蓋了)滿足查詢語句中欄位與條件的資料就叫做覆蓋索引。
解釋三:是非聚集組合索引的一種形式,它包括在查詢裡的Select、Join和Where子句用到的所有列(即建立索引的欄位正好是覆蓋查詢語句[select子句]與查詢條件[Where子句]中所涉及的欄位,也即,索引包含了查詢正在查詢的所有資料)。
Session_id和伺服器session檔案的關係?
- session的工作原理如下,即為sessionid在客戶端和瀏覽器端的互動:
- 當瀏覽器A去訪問一個有開啟了session機制的php1檔案時,session檔案會建立,同時會將該session檔案的id以cookie的形式
- 傳送給瀏覽器(session檔案的id號可以session_id()這個函式來獲得)。當瀏覽器A沒有關閉(會話沒有結束),反而去訪問另一個也開啟
- session機制的php2檔案時,那麼該sessionid也會跟著http協議從瀏覽器傳送到伺服器上,訪問到之前建立的session檔案,將相
- 關記憶體也儲存到該session檔案內。
- 當我們開啟了另一個瀏覽器B,也就是建立了另一個會話,那麼該瀏覽器訪問一個帶有開啟session機制的網頁,會另外生成一個新的session檔案,並將該session檔案id號以cookie的形式傳遞給瀏覽器B.
- 可以這麼理解,一個會話對應一個sessionid。
Mysql count(1)和count(*)的區別?
- 如果你的資料表沒有主鍵,那麼count(1)比count(*)快
- 如果有主鍵的話,那主鍵(聯合主鍵)作為count的條件也比count(*)要快
- 如果你的表只有一個欄位的話那count(*)就是最快的啦
- count(*) count(1) 兩者比較。主要還是要count(1)所相對應的資料欄位。
- 如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。
- 因為count(),自動會優化指定到那一個欄位。所以沒必要去count(?),用count(),sql會幫你完成優化的
簡述php中的autoload?
在PHP中使用類時,我們必須在使用前載入進來,不管是通過 require 的方式還是 include 的方式,但是會有兩個問題影響我們做出載入的決定 這時候我們可以使用魔術方法Autoload 的載入機制,當通過 new 來例項化一個類時,PHP會通過定義的autoload 函式載入相應的檔案,如果這個類檔案使用了 extends 或者 implements 需要用到其他的類檔案,php會重新執行 autoload 去進行類檔案的查詢和載入,如果發生了兩次對同一類檔案的請求,就會報錯
靜態變數適用情況?有什麼優缺點分別是什麼?
- static方法是類中的一個成員方法,屬於整個類,即使不用建立任何物件也可以直接呼叫!
- 靜態方法效率上要比例項化高,靜態方法的缺點是不自動進行銷燬,而例項化的則可以做銷燬。
- 靜態方法和靜態變數建立後始終使用同一塊記憶體,而使用例項的方式會建立多個記憶體。