Activex:windows上面的一種技術,在客戶端執行程序的一種技術。
JVM:java虛擬機,虛擬一個java的運行沙箱;裏面能夠加載java所需要的類等;
java被稱爲一次編譯,到處運行的程序。但是到處運行是有前提的,就是都要有一個JVM。
CGI:
protocol
web進程能夠根據對應程序的不同,調用不同的程序執行環境。
webapp:java,c,c++等;
編程語言:
靜態語言(編譯型語言)
c,c++,java
強類型,需要先編譯,才能運行。
優點:性能好
缺點:每一次改動都需要重新編譯;因此,C,C++特別適用於低端程序。可以操作硬件,
但是它們衆多的功能都需要用戶自己去開發。開發及維護成本大。
動態語言:解釋型語言
shell,perl,python,php
弱類型,不需要編譯,只需要有個動態解釋器即可。
優點:便於維護,有衆多的共享模塊,開發週期短,維護成本小。
缺點:性能差;
web服務器站點:
perl
python,
java(jsp,ssh(Spring,Structs,Hibernate)
ruby,rails
php:不需要其它框架就能用來開發web服務器站點。
facebook:
動態語言開發程序-->通過一個轉換器-->靜態語言;
如: php-->Hiphop->C++程序;
程序員形成紀律:
基本語法
算法,數據結構
編譯原理
Openstack:都是使用python開發的;
做自己更擅長的工作;
用自己最擅長的方式做自己正在做的工作;
bash:排錯的過程;
詞法分析-->語法分析-->生成執行路徑;
parser就是一個分析器;
php:
解釋器的工作:php
php source code -->編譯成二進制格式-->執行;
關於PHP
一、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。注意:opcode是放在內存中的。
4、Execution —— 順次執行Opcodes,每次一條,從而實現PHP腳本的功能
四、php的加速器(phpopcode的緩存器)
基於PHP的特殊擴展機制如opcode緩存擴展也可以將opcode緩存於php的共享內存中,從而可以讓同一段代碼的後續重複執行時跳過編譯階段以
提高性能。由此也可以看出,這些加速器並非真正提高了opcode的運行速度,而僅是通過分析opcode後並將它們重新排列以達到快速執行的目的。
常見的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優化器)
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
www.php.net:php的官方站點地址;
五、PHP源碼目錄結構
PHP的源碼在結構上非常清晰。其代碼根目錄中主要包含了一些說明文件以及設計方案,並提供瞭如下子目錄:
1、build —— 顧名思義,這裏主要放置一些跟源碼編譯相關的文件,比如開始構建之前的buildconf腳本及一些檢查環境的腳本等。
2、ext —— 官方的擴展目錄,包括了絕大多數PHP的函數的定義和實現,如array系列,pdo系列,spl系列等函數的實現。 個人開發的擴展在測試時也可以放到這個目錄,以方便測試等。
3、main —— 這裏存放的就是PHP最爲核心的文件了,是實現PHP的基礎設施,這裏和Zend引擎不一樣,Zend引擎主要實現語言最核心的語言運行環境。
4、Zend —— Zend引擎的實現目錄,比如腳本的詞法語法解析,opcode的執行以及擴展機制的實現等等。
5、pear —— PHP 擴展與應用倉庫,包含PEAR的核心文件。
6、sapi —— 包含了各種服務器抽象層的代碼,例如apache的mod_php,cgi,fastcgi以及fpm等等接口。
7、TSRM —— PHP的線程安全是構建在TSRM庫之上的,PHP實現中常見的*G宏通常是對TSRM的封裝,TSRM(Thread Safe Resource Manager)線程安全資源管理器。
8、tests —— PHP的測試腳本集合,包含PHP各項功能的測試文件。
9、win32 —— 這個目錄主要包括Windows平臺相關的一些實現,比如sokcet的實現在Windows下和*Nix平臺就不太一樣,同時也包括了Windows下編譯PHP相關的腳本。
問題是php的編譯結果如何跟我們的apache服務器結合起來?
CGI:COMMON GATEWAY INTERFACE
apache進程和php解釋器之間如何建立關聯關係???
ScriptsAlias查看其位置,將其進行訪問即可。
MVC是什麼?
model view control:模塊,視圖,控制。一種軟件設計理念。
將業務邏輯和數據顯示分離的一種編程技術。只需要將h1這個標籤放到一個獨立的文件中,而當前這個腳本只處理數據。
嵌入式web開發語言:
index.php語言,該怎麼寫,怎麼寫。
<html>
<head></head>
<h1> </h1>
<php
php>
</html>
當我們的web服務器去執行的時候,只將php這個框架內的語言給調入到php解釋器中去執行即可。
書籍:《大話設計模式》
我們的apache服務器如何與php進行交互。
200:php頁面;
3000個static content(滿足滿意)
prefork:
http協議是stateless的協議,無狀態協議。
將php進程和apache進程合二爲一。
DSO:dynamic shared object(動態共享模塊)
php_mod:將php給加載到apache裏面去。在apache內部就能完成php的處理。
在我們的apache進程內部,自己就能裝載php模塊。來完成對php頁面的加載。並且能夠將生成的結果直接給前端的其他處理機制即可。這樣一來我們需要的進程數目就少了。
缺點:性能不太好。
架構:
安裝一個php的服務器,而不是解釋器;不需要apache管理,需要php自己管理。
這樣子不要緊,apache與php服務器之間通信的機制就不叫CGI了。我稱爲FASTCGI。
這個模塊名字叫fpm,FAST PHP MODE.能夠幫我們實現這個功能。
apache與php結合的方式有三種:
CGI:
模塊:
FASTCGI:
對我們而言,最簡單的還是模塊模式。而fastcgi功能很好,但是這個時候的apache僅僅提供的是靜態頁面的功能,而另外一款服務器ngix的功能要比apache強大的多,所以
如果我們要使用FASTCGI的時候通常使用的是如下模式:
ngix+FPM
下面以php53作爲例子進行說明:
yum install php53 -y
rpm -ql php53
[root@localhost a.org]# cat index.php
<title>A</title>
<h1>D</h1>
<?php
phpinfo();
?>
[root@localhost a.org]#
這是php的一個內置函數,顯示當前php的版本號。以及php編譯時候要使用的選項。
[abc]
fdef
[bcd]
dddd
php的模塊採用類windows的模式,每個中括號是一個內容,只對當前的模塊生效;
;是註釋行的意思。