LAMP知識點總結

LAMP組合:php

web資源的類型:html

靜態資源:原始形式與響應結果一致;java

動態資源:原始形似一般爲程序文件或者是程序片斷,須要在後臺運行以後將運行結果返回給用戶;在客戶端展現的是程序的運行結果;python

客戶端動態:js(java scripts)mysql

服務器動態:php,jsp,.Net(.asp, .aspx),python,go,perl程序員


CGI:Common Gateway Interface,通用網關接口web


CGI協議是簡裝版的而且有特殊功用的http協議;sql


做用:shell

可讓一個客戶端,從客戶端代理向運行於網絡服務器上的程序傳輸數據;CGI描述了客戶端和服務器程序之間數據傳輸的標準;數據庫


在整個過程當中,httpd充當了服務器程序的反向代理;


請求流程:

Client(http) --> httpd --> (cgi) --> application process(source code file) --> (mysql) --> MySQL(MariaDB) 


Facebook --> php (hhcp) C++ 


程序=指令+數據


數據模型:層次,網狀,關係


指令:命令、關鍵字、特定代碼;

數據:文件,數據存儲系統的內容;


PHP:腳本編程語言,專門爲web開發而設計,將代碼嵌入html文檔中;


關於PHP


1、PHP簡介

PHP是通用服務器端腳本編程語言,其主要用於web開發以實現動態web頁面,它也是最先實現將腳本嵌入HTML源碼文檔中的服務器端腳本語言之一。同時,php還提供了一個命令行接口,所以,其也能夠在大多數系統上做爲一個獨立的shell來使用。


Rasmus Lerdorf於1994年開始開發PHP,它是初是一組被Rasmus Lerdorf稱做「Personal Home Page Tool」 的Perl腳本, 這些腳本能夠用於顯示做者的簡歷並記錄用戶對其網站的訪問。後來,Rasmus Lerdorf使用C語言將這些Perl腳本重寫爲CGI程序,還爲其增長了運行Web forms的能力以及與數據庫交互的特性,並將其重命名爲「Personal Home Page/Forms Interpreter」或「PHP/FI」。此時,PHP/FI已經能夠用於開發簡單的動態web程序了,這便是PHP 1.0。1995年6月,Rasmus Lerdorf把它的PHP發佈於comp.infosystems.www.authoring.cgi Usenet討論組,今後PHP開始走進人們的視野。1997年,其2.0版本發佈。


1997年,兩名以色列程序員Zeev Suraski和Andi Gutmans重寫的PHP的分析器(parser)成爲PHP發展到3.0的基礎,並且今後將PHP重命名爲PHP: Hypertext Preprocessor。此後,這兩名程序員開始重寫整個PHP核心,並於1999年發佈了Zend Engine 1.0,這也意味着PHP 4.0的誕生。2004年7月,Zend Engine 2.0發佈,由此也將PHP帶入了PHP 5時代。PHP5包含了許多重要的新特性,如加強的面向對象編程的支持、支持PDO(PHP Data Objects)擴展機制以及一系列對PHP性能的改進。


2、PHP Zend Engine


Zend Engine是開源的、PHP腳本語言的解釋器,它最先是由以色列理工學院(Technion)的學生Andi Gutmans和Zeev Suraski所開發,Zend也正是此二人名字的合稱。後來兩人聯合創立了Zend Technologies公司。


Zend Engine 1.0於1999年隨PHP 4發佈,由C語言開發且通過高度優化,並可以作爲PHP的後端模塊使用。Zend Engine爲PHP提供了內存和資源管理的功能以及其它的一些標準服務,其高性能、可靠性和可擴展性在促進PHP成爲一種流行的語言方面發揮了重要做用。


Zend Engine的出現將PHP代碼的處理過程分紅了兩個階段:首先是分析PHP代碼並將其轉換爲稱做Zend opcode的二進制格式(相似Java的字節碼),並將其存儲於內存中;第二階段是使用Zend Engine去執行這些轉換後的Opcode。


3、PHP的Opcode


Opcode是一種PHP腳本編譯後的中間語言,就像Java的ByteCode,或者.NET的MSL。PHP執行PHP腳本代碼通常會通過以下4個步驟(確切的來講,應該是PHP的語言引擎Zend):

一、Scanning(Lexing) —— 將PHP代碼轉換爲語言片斷(Tokens)

二、Parsing —— 將Tokens轉換成簡單而有意義的表達式

三、Compilation —— 將表達式編譯成Opocdes

四、Execution —— 順次執行Opcodes,每次一條,從而實現PHP腳本的功能

hhvm


掃描-->分析-->編譯-->執行


4、php的加速器


基於PHP的特殊擴展機制如opcode緩存擴展也能夠將opcode緩存於php的共享內存中,從而可讓同一段代碼的後續重複執行時跳過編譯階段以提升性能。由此也能夠看出,這些加速器並不是真正提升了opcode的運行速度,而僅是經過分析opcode後並將它們從新排列以達到快速執行的目的。


常見的php加速器有:


一、APC (Alternative PHP Cache)

遵循PHP License的開源框架,PHP opcode緩存加速器,目前的版本不適用於PHP 5.4。項目地址,http://pecl.php.net/package/APC。


二、eAccelerator

源於Turck MMCache,早期的版本包含了一個PHP encoder和PHP loader,目前encoder已經不在支持。項目地址, http://eaccelerator.net/。


三、XCache

快速並且穩定的PHP opcode緩存,通過嚴格測試且被大量用於生產環境。項目地址,http://xcache.lighttpd.net/


四、Zend Optimizer和Zend Guard Loader

Zend Optimizer並不是一個opcode加速器,它是由Zend Technologies爲PHP5.2及之前的版本提供的一個免費、閉源的PHP擴展,其可以運行由Zend Guard生成的加密的PHP代碼或模糊代碼。 而Zend Guard Loader則是專爲PHP5.3提供的相似於Zend Optimizer功能的擴展。項目地址,http://www.zend.com/en/products/guard/runtime-decoders


五、NuSphere PhpExpress

NuSphere的一款開源PHP加速器,它支持裝載經過NuSphere PHP Encoder編碼的PHP程序文件,並可以實現對常規PHP文件的執行加速。項目地址,http://www.nusphere.com/products/phpexpress.htm


5、PHP源碼目錄結構


PHP的源碼在結構上很是清晰。其代碼根目錄中主要包含了一些說明文件以及設計方案,並提供了以下子目錄:


一、build —— 顧名思義,這裏主要放置一些跟源碼編譯相關的文件,好比開始構建以前的buildconf腳本及一些檢查環境的腳本等。

二、ext —— 官方的擴展目錄,包括了絕大多數PHP的函數的定義和實現,如array系列,pdo系列,spl系列等函數的實現。 我的開發的擴展在測試時也能夠放到這個目錄,以方便測試等。

三、main —— 這裏存放的就是PHP最爲核心的文件了,是實現PHP的基礎設施,這裏和Zend引擎不同,Zend引擎主要實現語言最核心的語言運行環境。

四、Zend —— Zend引擎的實現目錄,好比腳本的詞法語法解析,opcode的執行以及擴展機制的實現等等。

五、pear —— PHP 擴展與應用倉庫,包含PEAR的核心文件。

六、sapi —— 包含了各類服務器抽象層的代碼,例如apache的mod_php,cgi,fastcgi以及fpm等等接口。

七、TSRM —— PHP的線程安全是構建在TSRM庫之上的,PHP實現中常見的*G宏一般是對TSRM的封裝,TSRM(Thread Safe Resource Manager)線程安全資源管理器。

八、tests —— PHP的測試腳本集合,包含PHP各項功能的測試文件。

九、win32 —— 這個目錄主要包括Windows平臺相關的一些實現,好比sokcet的實如今Windows下和*Nix平臺就不太同樣,同時也包括了Windows下編譯PHP相關的腳本。


LAMP:

L:Linux

A:Apache(httpd)

M:MySQL(MariaDB)

P:php/perl/python/ruby


httpd與php的結合方式:

CGI:httpd主進程管理php進程;

module:將php編譯爲httpd的擴展模塊;

MPM:

prefork:libphp5.so

event[,worker]:libphp5-zts.so

FastCGI:

fpm


LAMP的實現方式:

httpd(prefork) + libphp5.so + mysql

httpd(event) + libphp5-zts + mysql

httpd + php-fpm + mysql --僅在httpd2.4版本中能夠支持


LAMP(2)


數據庫管理系統——DBMS

RDBMS:表,行(實例,實體或記錄)和列(字段,域)


ANSI:SQL系列標準

SQL-86

SQL-89

SQL-99

SQL-03


補充材料:RDMBS設計範式基礎概念


設計關係數據庫時,聽從不一樣的規範要求,設計出合理的關係型數據庫,這些不一樣的規範要求被稱爲不一樣的範式,各類範式呈遞次規範,越高的範式數據庫冗餘越小。


目前關係數據庫有六種範式:第一範式(1NF)、第二範式(2NF)、第三範式(3NF)、巴德斯科範式(BCNF)、第四範式(4NF)和第五範式(5NF,又稱完美範式)。知足最低要求的範式是第一範式(1NF)。在第一範式的基礎上進一步知足更多規範要求的稱爲第二範式(2NF),其他範式以次類推。通常說來,數據庫只需知足第三範式(3NF)就好了。


(1) 第一範式(1NF)


所謂第一範式(1NF)是指在關係模型中,對域添加的一個規範要求,全部的域都應該是原子性的,即數據庫表的每一列都是不可分割的原子數據項,而不能是集合,數組,記錄等非原子數據項。即實體中的某個屬性有多個值時,必須拆分爲不一樣的屬性。在符合第一範式(1NF)表中的每一個域值只能是實體的一個屬性或一個屬性的一部分。簡而言之,第一範式就是無重複的域。


說明:在任何一個關係數據庫中,第一範式(1NF)是對關係模式的設計基本要求,通常設計中都必須知足第一範式(1NF)。不過有些關係模型中突破了1NF的限制,這種稱爲非1NF的關係模型。換句話說,是否必須知足1NF的最低要求,主要依賴於所使用的關係模型。


(2) 第二範式(2NF)


第二範式(2NF)是在第一範式(1NF)的基礎上創建起來的,即知足第二範式(2NF)必須先知足第一範式(1NF)。第二範式(2NF)要求數據庫表中的每一個實例或記錄必須能夠被惟一地區分。選取一個能區分每一個實體的屬性或屬性組,做爲實體的惟一標識。


第二範式(2NF)要求實體的屬性徹底依賴於主關鍵字(主鍵)。所謂徹底依賴是指不能存在僅依賴主關鍵字一部分的屬性,若是存在,那麼這個屬性和主關鍵字的這一部分應該分離出來造成一個新的實體,新實體與原實體之間是一對多的關係。爲實現區分一般須要爲表加上一個列,以存儲各個實例的惟一標識。簡而言之,第二範式就是在第一範式的基礎上屬性徹底依賴於主鍵。


(3) 第三範式(3NF)


第三範式(3NF)是第二範式(2NF)的一個子集,即知足第三範式(3NF)必須知足第二範式(2NF)。簡而言之,第三範式(3NF)要求一個關係中不能包含已在其它關係已包含的非主關鍵字信息。簡而言之,第三範式就是屬性不依賴於其它非主屬性,也就是在知足2NF的基礎上,任何非主屬性不得傳遞依賴於主屬性。


某公司,員工信息表:

5000人,五個部門,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX市場部


NoSQL:Not-Only SQL

Redis

Memcached

MangoDB

Hbase


關係型數據庫管理系統:

GreSQL,SyBase,DBII,InfoMIX

Oracle


PostGreSQL,MySQL


Unireg,


MySQL AB,Solaris,1994 第一個二進制版本;

http://www.mysql.com


MariaDB,

http://mariadb.org


CentOS 6:mysql-server-5.1

CentOS 7:mariadb-server-5.5


MySQL/MariaDB:

C/S架構,客戶端/服務器架構形式;

C:

命令行客戶端:mysql,mysqladmin

圖形客戶端:phpMyAdmin,SQLyog,navicot,...


S:

mysqld


客戶端到服務器端的鏈接方式:

客戶端和服務器端在同一臺主機上:

1.Unix Sock

2.IPv4的socket

3.IPv6的socket


客戶端和服務器端不在同一臺主機上:

1.IPv4的socket

2.IPv6的socket


MariaDB(MySQL)

數據模型:關係模型,二維關係;


表:row,column

視圖:虛表,view

索引:index

樹型:B-tree

hash:

SQL接口:SQL,Structured Query Language,結構化查詢語言;

分析器,操做求解器,計劃執行器,優化器


相似於OS的shell;也能夠提供編程功能;


能夠被SQL接口處理的SQL語句:

DDL:Data Defined Language,數據定義語言

CREATE,ALTER,DROP

DML:Data Manapulating Language,數據操縱語言

INSERT,DELETE,UPDATE,SELECT

DCL:Data Controlled Language,數據控制語言

GRANT,REVOKE


SQL接口也提供了編程接口:選擇、循環

存儲過程:Storage Procedure <-- call

存儲函數:Storage Function <-- select

觸發器:trigger

事件調度器:event scheduler

例程:routine = 過程 + 函數


事務(Tranaction):組織多個操做爲一個總體,這個總體要麼所有執行,要麼所有不執行;只要有任何操做沒有被成功執行,則整個事務回滾(RollBack);


在MySQL裏面,事務是存儲引擎的屬性;判斷標準,即ACID標準:

A:原子性;

C:一致性;

I:隔離性;

D:持久性;


存儲引擎:表空間,表類型


約束:constraint,向數據表插入的數據所必須遵照的限制規則;

主鍵約束:一個或多個字段構建的可以惟一標識記錄的組合,填入主鍵的數據,必須不能和已經填寫的數據相同,且不能爲空;

外鍵約束:也稱爲"引用性約束",一個表中的某個字段能插入的數據,取決於另一張表的主鍵中的數據;

唯一鍵約束:一個或多個字段構建的可以惟一標識記錄的組合,填入主鍵的數據,必須不能和已經填寫的數據相同,但能夠爲空;

檢查性約束:取決於表達式的要求;


關係運算:

選擇:根據指定的條件挑選出符合條件的行;

投影:根據指定的條件挑選出符合條件的列;

鏈接:多表關聯操做;


數據抽象:

物理層:決定數據的存儲格式,即如何將數據組織成物理文件;

邏輯層:描述了數據庫存儲什麼樣的數據,以及數據之間存在怎樣的關係;

視圖層:描述了數據庫中部分數據;


MySQL和MariaDB:

都支持插入式存儲引擎:

存儲管理器有多種實現版本,彼此間的功能和特性可能略有區別;用戶能夠根據本身的須要靈活選擇;


MariaDB的特性:

1.更多的存儲引擎

MyISAM:不支持事務

MyISAM:Aria

InnoDB:Percona-XtraDB

2.諸多的擴展和新特性;

3.提供了較多的測試組件;

4.truly open source


安裝MariaDB:

1.rpm包

2.OS發行商提供的;

3.官方提供的二進制包;

4.源代碼包

相關文章
相關標籤/搜索