mysql與php


MySQL:

使用數據庫的原因和其基本原理:

    在沒有數據庫的情況下,當需要查詢/etc/passwd文件中/bin/bash的用戶名時,如果使用awk,sed等工具過濾必須首先將整個文件載入內存中,然後再進行篩選。但是如果這個文件有100G大,那麼不僅I/O無法承受,且內存佔用太多,檢索時間也會過長。

    所以,第一個需求就產生了:如果只將/etc/passwd每行的最後一個字段放到內存中進行檢索,那麼就會快很多。但是最後一個字段中的值只是用來做比較條件的,即使能夠最快得到/bin/bash這個比較條件,最後還是需要回頭去檢索整個passwd文件尋找用戶名。

    所以,第二個需求產生了:如果在將passwd最後一個字段在內存中檢索完成後的同時,也能夠得到其行號也是極好的,這樣就可以直接去取指定的行了。但是這樣我們雖然可以最快的去尋找指定目標了,但是我們依然需要載入整個文件。

    所以,第三個需求產生了:如果只載入指定的行到內存那麼將是多麼的美好。我們知道數據都是存在數據塊上,然後數據塊在分散的存在不同磁盤塊上面。而如果我們將passwd按照行進行分割,然後存放到不同的數據塊上面。比如1-10行放在第一個數據塊上面,11-20行放到第二個數據塊上面。那麼我們就可以在檢索時只載入我們需要的塊,而不必載入整個文件了。

    總結,上面第一個需求,就是我們的“一級索引”,也就是我們經常作爲查找條件的字段/bin/bash(列)單獨提取到一個文件中,然後寫上對應的行號,再寫上這一行在哪個數據塊上面,這樣我們在查找時,就可以先找"一級索引"/bin/bash,再找根據對應的數據塊編號載入指定的數據塊,最後我們再根據行號載入指定的字段name了。

    二級索引:當passwd有100TB時,那麼一級索引的量可能會有100G,這時就需要而進行二級索引,三級索引了。

    稠密索引:屬於二級索引往後的索引,也就是每個一級索引建立一個條目到一個文件,同時也記錄其行號、數據塊編號、上級索引條目名稱。

    稀疏索引:相對於稠密索引,它是每隔多少一級索引建一個條目錄,不如當第一個稠密索引的對應的一級索引爲ID號爲1時,那麼稀疏索引就是建立第二個稠密索引並對應一級索引ID號爲100.所以稀疏索引只是一個範圍。

    這樣,就是幾個基本的數據庫模型了。


數據模型:

    層次模型:類似linux的目錄結構,只能豎向查看當前目錄下的所有內容。

              無法很像查看其它目錄下的內容

    網狀模型:加上了橫向查看功能,但當數據變化時,整個結構變化很複雜,不易於管理

    關係模型:類似於定義好列名和行名的表。codd發明,使得豎向和橫向都能查看。


數據庫管理系統(DBMS)設計目標:

   1、數據的冗餘和不一致。

   2、數據訪問困難:當數據量很大時。

   3、數據孤立:由於數據量很大時,需要放在單獨小文件中。

   4、完整性問題:數據庫中的值要滿足一定的約束條件。

                  比如人的年齡要大於0而小於150。

                  銀行賬戶只有100元,而取錢時,不能取走200元。

   5、原子性問題:在jerry給tom進行銀行轉賬時,jerry賬戶減去1000元的同時,

                  tom賬戶也必須增加1000元。但是就在jerry賬戶已經被扣除1000元后,

                  服務器突然斷電,那麼服務器必須進行回滾,也就是給jerry再增加1000元。

   6、併發訪問問題:在進程讀取文件時,會給文件加上一個讀鎖,但是讀鎖可以共享給別的進程

                    在進程寫入文件時,給給文件加不可共享的寫鎖。

   7、安全性問題:在文件系統層面上,用戶的權限只能限制在整個文件上。而不能具體到行。


DBMS:

   物理層:將數據存儲到磁盤塊上。

   邏輯層:將數據存儲爲表。

   視圖層:給用戶進行授權,讓用戶進入服務器後,能夠看到指定表的哪幾行。

存儲引擎:

   將邏輯層操作轉換爲物理層寫入到磁盤塊上。


數據庫的安全:

   認證:決定用戶能否進入數據庫服務器

   授權:當用戶進入數據庫服務器後,是否具有對具體數據庫的訪問權限

   審計:記錄 得到授權的用戶 是否有濫用權限的行爲,常用手段是日誌。

   而mysql爲了安全,不能與web服務器一樣一個進程響應多個請求。而是使用類似prework的線程池


mysql的數據寫入步驟:

   磁盤的順序讀寫時,性能纔是最好的。但期望是美好,現實是殘酷的,我們不可能將所有的表數據按照磁盤塊的順序進行存放。但我們爲了提高mysql性能,可以先不往數據庫文件中寫入數據,但是這樣數據就會暫存在內存中,萬一發生宕機,後果你懂得。。。

    所以我們取了一個折中的方法,只要你的SQL語句(便於理解,事務)一提交,那麼我們立即將你的SQL語句同步到一個具有連續磁盤塊空間的文件,當然,這個磁盤必須是獨立於數據庫文件存放磁盤的(在單磁盤的情況下,而非RAID)。然後這個文件再異步的將SQL語句放到數據庫文件上逐個執行一遍,這樣就可以大大的提高效率了。這個文件就叫做事務日誌文件,它是隻能追加,不能刪除的文件。而且事務日誌文件有2個,當第一個寫滿時,就寫第二個,然後第一個開始同步到數據庫文件。當然,它有更復雜的工作機制!

    既然,事務日誌這麼好,我們能不能將此文件大小設的高些呢?

    但是如果我們在將SQL語句寫入了事務日誌後,還沒有來的及同步到數據庫文件中執行,就宕機了,那麼我們在下次開機時,就會自動的將事務日誌同步到數據庫文件中執行一遍。注意,這個過程是數據庫自動執行的,不能手工干預的,也就是如果我們在start mysql時,如果發現一直不能出現OK,那麼就是在同步事務日誌,如果我們CTRL+C了,那麼極有可能丟失事務日誌中的全部操作。所以當事務日誌文件越大,存的SQL語句越多,那麼開機恢復時間也就越長。所以爲了保險起見,我們不能將事務日誌文件設定過大。默認文件大小爲5M。

    但是一個事務特別大(應該可以理解爲SQL語句特別長,執行步驟特別多吧!!),當正在到數據庫文件中同步到一半時,就宕機了,那麼開機後就會回滾,然後重新同步。所以爲了預防萬一,儘量將語句寫的短些吧!

    另外,如果一組DML語句(數據庫操作語言,主要用來操作數據庫數據的。而且在mysql中,一般事務指的是DML語句)在事務日誌中寫好自己的SQL語句了,但是還沒有同步到數據庫文件中,但緊接着的下一個事務就需要查詢上一個操作的完成情況,這時我們的事務日誌必須還能夠生成一個視圖讓下一個操作進行查詢。

    事務日誌名稱:ib_logfile0、ib_logfile1

      

ACID:

   數據一致性:轉賬前後,雙方的總錢數要一致。

   持久性:當整個轉賬操作在內存完成後,磁盤上的數據庫狀態一定是改變的。

           持久性越嚴格,就越會影響性能。

   原子性:這一組DML要麼都執行,要麼都不執行。當同步事務日誌的一半內容到數據庫時便斷電的情況

   隔離性:轉賬的同時,用戶不能進行取款操作。

事物:

   ACID,就是將某些單獨的操作視爲一個整體的操作,使得要麼都執行成功,要麼都不執行。


CRUD:

   create增、Retrieve查、update改、delete刪  


wKiom1Sh98-jKTuvAAJKGXthDYQ462.jpg


上面這個圖是mysql數據庫的一個基本框架:



API接口:

    當程序(不只是mysql數據庫)要將自己的功能提供給別人使用時,就需要程序提供一個可以訪問的接口,而API接口就是其中之一,但是調用程序的人必須使用程序已有的API接口語言進行調用。比如你只懂PHP語言,那麼你必須給mysql服務器裝上php-mysql包,這個包就是php的API接口包,使得PHP能夠訪問mysql。這個php-mysql也就是相當於mysql數據庫系統的php語言驅動程序,也叫做連接器。

    php-mysql將我們需要用到東西封裝一個個的函數,比如我們只需要使用一個mysql_connect()這個函數便可以調用數據庫。比如你可以在論壇程序的配置文件中看到這麼一句“$link=mysql_connect(localhost,user_name,'user_pwd');”

    注意,這裏用PHP語言開發出來的程序叫做客戶端,而php-mysql連接器可以叫做這個客戶端的服務器程序。

    到了PHP5以後,PDO這個高級連接器便出現了,使得php能夠以數據庫對象的方式與mysql服務器進行交互。

    但是如果有很多人需要調用數據庫,他們使用的語言各不相同,怎麼辦?

    而且有的時候,作爲一個普通的系統管理員,也需要去管理數據庫,但不會各種語言,怎麼辦?


ODBC接口:

    它是mysql數據庫非常底層的一個對外接口,它能夠被所有的語言調用,而不再需要專用的語言驅動。但是愈是底層的東西,開發週期越長,這樣又不利於工作。


sql接口:

    在萬衆期待下,ANSI,美國國家標準委員會提出了一個sql數據庫標準,。這大大提高了開發效率,也方便了系統管理。

    同時sql標準有sql-86,sql-92、sql-99、sql-03分別表示不同的年份標準。

    sql接口的客戶端可以是mysql,而在mysql服務器上的sql接口叫做其客戶端。

    



"查詢求解引擎"包含以下組件,它決定了數據庫的性能:

   分  析  器:第一個功能,它使用空格將sql語句進行切片,然後分析出那些是關鍵字,哪些是查詢條件,哪些是數據庫對象,然後對整個語句進行語法分析,判斷語句語法正確與否。

               第二個功能,sql語句第一次查詢時首先查詢就是緩存。但第一次緩存未命中時,就交到分析器,分析器發現還能命中,就再次交到緩存中查詢。如果仍然沒有命中就會交到優化器中。

   操作求解器:對用戶的請求進行計算,查詢那種方式能夠完成要求

   查詢  計劃:根據操作求解器 的計算結果,選擇一個最合適的方式

   優  化  器:分析sql語句,發現修改sql語句後可以變得更快,就修改。

               分析是否能夠使用索引。

               分析查詢代價。


緩衝管理器:

    爲了提高查詢速度,mysql會將索引等提前加載到內存,或者將查詢過的內容緩存下來

磁盤空間管理器:控制文件是如何進行存儲數據的,這裏就是存儲引擎的發揮作用的地方了,也就是將邏輯層操作轉換爲物理層。


事物管理器:

    保證ACID的四個特性


鎖:

    鎖是爲了保證一致性的,用來控制併發的。


恢復管理器:

    在轉賬操作已經在內存中完成,需要寫入日誌時,由於一個事物的操作步驟特別多,比如有100個步驟,到了99個斷電了,那麼在重啓後就需要回滾。


數據文件、索引文件:

   索引相當於linux系統的目錄,以提高查詢速率。

   由於搜索標準的不同,索引文件也不同,所以有一個主索引,多個輔助索引。


MySQL的下載:

    http://www.mysql.com/downloads/   →  MySQL Community Edition(GPL)最下面  →  http://dev.mysql.com/downloads/  →  MySQL Community Server (GPL) 最上面  →  http://dev.mysql.com/downloads/mysql/  →  Select Platform:  

下載首頁:

Download  GA  Current Downloads (Generally Available):

公共可用的程序包

MySQL Enterprise Edition (commercial)

        收費版mysql

MySQL Cluster CGE (commercial)

        收費的

MySQL Community Edition (GPL)

        遵循GPL開源規定免費版,在這裏點擊進去


免費版下載首頁:

MySQL Community Server (GPL)

這是客戶端和服務器端組合起來的核心包,點擊進去

MySQL Cluster (GPL)

        集羣包,很少用

MySQL Workbench (GPL)

        輔助設計mysql數據庫的,少用

MySQL Utilities (GPL)

        管理工具組件,用於管理和維護,又時用到

MySQL Proxy (GPL)

        代理,有用

MySQL Connectors

        連接mysql的語言驅動,比如php-mysql一類

MySQL on Windows (Installer & Tools)

         微軟系統用的工具等

MySQL Benchmark Tool

        壓力測試工具

Mirrors 選擇離自己比較近的鏡像進行下載比如搜狐鏡像源就包含mysql目錄

    

免費版client+server核心包下載頁:(選擇平臺時也會遇到很多疑惑的了)

RHEL/ORACLE LINUX :      

        RPM Bundle這是rpm格式的包,一個包就包含了所有內容。而下面則是分割開來的。

linux generic:

        後面的rpm對系統沒有要求,只要能安裝rpm,無論suse都可以安裝

Linux - Generic (glibc 2.5) (x86, 64-bit), Compressed TAR Archive

這裏是我們需要的二進制格式的歸檔壓縮包


下面是二進制包的簡單安裝步驟:

# mkdir /data/mydata
        數據庫文件的存放位置,一般是獨立於操作系統。而且線上的操作系統根大小一般都是10G。
# useradd -r mysql
# chown -R mysql.mysql /data/mydata
        mysql用戶必須對數據庫目錄有絕對的讀寫權限
# tar xf mysql-5.5.33-linux2.6-x86_64.tar.gz -C /usr/local/
        一般都是解壓到/usr/local/

# ln -s /usr/local/mysql-5.5.33-linux2.6-x86_64/ /usr/local/mysql
	軟連接必須是/usr/local/mysql路徑,因爲啓動腳本mysqld就是這麼指定的。
# chown -R root.mysql /usr/local/mysql/*
	這裏修改mysql目錄下的所有文件,而mysql這個軟連接不用改。
	而且如果想使用/usr/local/mysql/data作爲目錄其屬主、屬組都要改爲mysq
# service mysqld stop
        停掉原來的mysql服務器,如果有!
# mv /etc/rc.d/init.d/mysqld{,.bak}
# cp /usr/loca/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
# mv /etc/my.cnf{,.bak}
        先備份原來的配置文件,線上環境這是必須的!
# cp my-large.cnf /etc/my.cnf
        large表示內存大於512M
        huge表示內存大於1G
# vim /etc/my.cnf
  [mysqld]
  thread_concurrency = 8    改爲自己的物理核心數
  datadir = /data/mydata    數據庫目錄,
  socket      = /tmp/mysql.sock  
         socket是進程間通信的文件,有些程序使用數據庫時默認會
         調用/var/lib/mysql/mysql.sock 這個文件件。所以可以做一個軟連接。
         這種方式理論上比TCP/IP的方式性能好,但僅僅是理論。

# echo "export PATH=/usr/local/mysql/bin/:$PATH" > /etc/profile.d/mysql.sh
# . /etc/profile.d/mysql.sh
        修改mysql的執行PATH爲自己的,可以執行mysql命令退出後,使用hash命令看到

#vim /etc/man.config
MANPATH /usr/local/mysql/man
        添加自定義man手冊的位置。指定到man即可,不要指定man8

# ln -sv /usr/local/mysql/include/ /usr/include/mysql
	導出庫文件
# vim /etc/ld.so.conf.d/mysql.conf
  /usr/local/mysql/lib
        連接頭文件,這是指導系統如果調用庫的說明書
# ldconfig -v | grep mysql
        重新生成緩存並顯示過程,其中包含帶有18字樣的標識。

基本安裝完成。




        






MySQL:作者二女兒的名字,2008年被Oracle公司收購,然後商業版價格翻四倍,但承諾開源5年。

MariaDB:作者三女兒的名字。

PostgreSQL:發行較晚的成熟數據庫

Percona:***團隊percona優化後的mysql,功能比mysql強大。後期會經常用到其研發的工具。


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帶入了PHP5時代。PHP5包含了許多重要的新特性,如增強的面向對象編程的支持、支持PDO(PHP Data Objects)擴展機制以及一系列對PHP性能的改進。


二、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。


三、PHP的Opcode

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

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

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

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

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


四、php的加速器:提高php的執行

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


常見的php加速器有:以php解釋器的模塊存在


1、APC (Alternative PHP Cache)

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


2、eAccelerator

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


3、XCache,

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


4、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


5、NuSphere PhpExpress

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



php.ini官方文檔:

配置參數:http://www.php.net/manual/zh/ini.list.php

核心配置參數詳解:http://www.php.net/manual/zh/ini.core.php



# yum list all *php*

php.x86_64            5.3.3-22.el6 主包,默認以模塊安裝CGI。

php-mysql.x86_64      5.3.3-22.el6 與mysql相連的語言驅動

php-common.x86_64     5.3.3-22.el6  必需包

php-cli.x86_64        5.3.3-22.el6  必需包,客戶端工具

php-gd.x86_64         5.3.3-22.el6  繪圖專用,在使用圖形監控工具時會用到

php-odbc.x86_64       5.3.3-22.el6  與各種數據庫連接時使用的ODBC接口工具


yum方法安裝php:

   # yum install php

配置文件:

   /etc/php.ini 主配置文件

   /etc/httpd/conf.d/php.conf  與RPM包安裝的httpd協同工作的額外的配置文件。

<IfModule prefork.c>如果httpd以prefork工作,就裝載這個模塊
 LoadModule php5_module modules/libphp5.so
</IfModule>
<IfModule worker.c>以非獨立的線程方式工作
 LoadModule php5_module modules/libphp5-zts.so
</IfModule>


php語言的格式:

<html>
   <title>瀏覽器標籤頁標題</title>
   <body>
       <h1>一級標題</h1>
       <?php phpinfo(); ?>這裏纔是php解釋器執行的部分,其他的不執行。phpinfo()是php自身的一個測試函數
   </body>
</html>


配置httpd的主配置文件:

   Directory  index.php

   只需要增加這一點即可。不用增加與編譯安裝一樣的其他的類型


























發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章