最好最實用的PHP二次開發教程

huidaoli發表於2013-07-25

◆二次開發

  1、什麼是二次開發?

二次開發,簡單的說就是在現有的軟體上進行定製修改,功能的擴充套件,然後達到自己想要的功能和效果,一般來說都不會改變原有系統的核心。

  2、為什麼要二次開發?

隨著資訊化技術的不斷髮展,IT行業湧現出了一系列優秀的開源作品,其作者或是個人,或是專案小組,或是軟體公司。選擇和應用這些優秀的開源軟體,並在此基礎上進行符合業務需求的二次開發,將給企業節省資訊化成本(時間成本及開發成本)的同時,更能帶來技術上的保障。這就是我們常聽的:站在巨人的肩膀上,你將看的更遠。所以國內很多公司需要二次開發的人才。

  3、怎麼做二次開發?

第一,你要有這個開源產品的所用語言的語言基礎,能看懂程式碼是最基本的。

第二,你要對這個開源產品的功能和使用要有比較熟悉,因為你熟悉了,你才知道一個需求下來,你要改什麼,什麼是系統自帶的,大概要怎麼改。

第三,你要熟悉這個開源產品的資料結構,程式碼結構,系統的框架結構,核心是哪裡,附屬功能是在哪裡。簡單點說,就是資料庫,程式碼邏輯,檔案目錄的熟悉。

第四,根據你的需求,然後利用開源產品的核心,進行系統的擴充套件和修改,以達到你的需求

  4、介紹PHP的開源產品的二次開發的基本要求:

第一, 基本要求:HTML(必須要非常熟悉),PHP(能看懂程式碼,能寫一些小系統,如:留言板,小型CMS),Mysql(至少會一種資料庫),Javascript(能看懂,能改現成的一些程式碼),Div+Css(能進行介面的調整,明白CSS是怎麼使用的)

第二, 熟悉開源產品的使用,比如 Dedecms,你要知道怎麼登入,怎麼新建欄目,怎麼新增文章,模板標籤的使用方法,模型的概念和使用方法等等一些功能

第三, 要熟悉這個開源產品的資料庫結構,還要理解裡面核心檔案的內容,比如:資料庫類怎麼使用,常用的安全過濾是怎麼做的,模板引擎又是怎麼使用的等等一些核心內容。還要知道這個開源產品的目錄結構,就是說,你要知道哪是放模板的,哪裡是做控制的,哪裡是放樣式的,等等

第四, 熟悉你的需求,對需求進行解讀,然後確定如何對這個開源產品進行修改和擴充套件 經過二次開發後,你能獲取到的是什麼呢? 你能完成你的需求,你能積累經驗,這裡的經驗有你自己的,也有別人的。所謂別人的,就是在你做這個二次開發的時候,你能吸收到這個系統的精華,然後融入到你自己的思想裡,你還能總結專案架構的經驗。有句話說的好,就是:聰明的人會把別人的失敗的經驗當作自己的經驗,而傻的人就是自己無數次體驗失敗後才作為自己的經驗。

  二次開發不僅僅是開發,而更重要的是吸取精華,總結經驗,理順思路,少走彎路,提升自己。

站在巨人的肩膀上,你將看的更遠!!! 

◆DedeCMS二次開發

  1、DedeCMS的二次開發

  為了讓更多人瞭解二次開發,並更方便的瞭解DedeCMS的二次開發,下面將會簡單的介紹關於DedeCMS二次開發的一些基礎和大綱

  2、DedeCMS二次開發必備基礎:

· 非常熟悉HTML 

· 熟悉DIV+CSS的佈局 

· 紮實的PHP基礎,熟悉結構化程式設計,瞭解OOP,並能看懂和使用 

· 熟悉MYSQL,掌握SQL語言 

  3、DedeCMS二次開發學習過程

· 理解CMS是什麼 

· 熟悉DedeCMS的功能(如:欄目的分類,文件管理,模型的使用,系統的設定等常用的功能) 

· 掌握DedeCMS的模板標籤使用及原理 

· DedeCMS目錄結構分析 熟悉每個資料夾裡面主要裝什麼檔案,這樣在二次開發的時候知道在哪個資料夾下的什麼檔案修改

目錄結構摘要:

./a 生成檔案存放路徑 .

/data 快取檔案及資料中心

/admin 管理後臺資料

/backupdata 備份資料

/cache 快取檔案

/enums 級別聯動資料,JS,列舉型別的快取檔案

/js 常用的JS

/mark 水印相關檔案

/module 模組安裝檔案

/rss Rss相關

/sessions Session 存放路徑

/textdata 文字資料

/tplcache 模板快取

/uploadtmp 上傳檔案快取位置

/ziptmp zip包解壓快取位置 …… 

· DedeCMS檔案結構分析 熟悉每個檔案的基本功能,方便做修改,知道每個檔案的大概作用之後,可以方便的對檔案進行修改

檔案結構摘要:

common.inc.php 資料庫配置檔案

config.cache.bak.php 後臺系統配置備份

config.cache.inc.php 後臺系統配置檔案快取

downmix.data.php 採集混淆快取檔案

mysql_error_track.inc MYSQL錯誤志

safequestions.php 安全問題

sitemap.html 站點地圖

sys_pay.cache.php 支付閘道器配置

template.rand.php 隨機模板設定 ……

· DedeCMS資料庫結構分析,至少要熟悉每個表的作用 熟悉每個表的作用,瞭解幾個核心表的設計及欄位的含義,方便拿到新的需求之後,能快速的判斷是否加欄位,還是新建表來處理。同時也能理解DedeCMS的資料庫設計思想,把有用的設計思路加到自己的系統中。 

· DedeCMS的流程控制,及一些核心檔案的解析 熟悉一些登陸,註冊,文件管理,許可權控制,分類管理,模型設定等一些常用流程控制。對幾個核心檔案進行解剖,瞭解其程式設計技巧及安全機制 

· DedeCMS外掛的開發(****式外掛和內嵌式外掛) 熟悉兩種外掛的編寫,外掛的匯入匯出,外掛搭配模型的使用

◆Ecshop二次開發

  1、EcShop二次開發學習方法

      近年來,隨著網際網路的發展,電子商務也跟著一起成長,B2B,C2C,B2C的電子商務模式也不斷的成熟。這時催生出了眾多電子商務相關的PHP開源產品。B2C方面有Ecshop,Zencart,Magento等國內外知名產品。 下面我們就來簡單介紹一下學習Ecshop二次開發的過程和要注意的一些東西:  

  2、Ecshop二次開發必備基礎:

· 非常熟悉HTML 

· 熟悉DIV+CSS的佈局 

· 紮實的PHP基礎,熟悉結構化程式設計,瞭解OOP,並能看懂和使用 

· 熟悉Smarty模板引擎 

· 熟悉MYSQL,掌握SQL語言 

  3、Ecshop二次開發學習過程

· 熟悉電子商務基本概念 

· 熟悉EcShop 的基本功能使用(商品型別,商品分類,商品屬性設定,促銷活動使用等) 

· 掌握Ecshop的資料庫結構和資料庫設計思想 

· 熟悉ER的模式,實體與關係的建立 熟悉每個表的作用,瞭解幾個核心表的設計及欄位的含義,方便拿到新的需求之後,能快速的判斷是否加欄位,還是新建表來處理。同時也能理解Ecshop的資料庫設計思想,把有用的設計思路加到自己的系統中  

· 檔案結構分析及程式碼分析 熟悉一些登陸,註冊,文件管理,許可權控制,分類管理,商品型別等一些常用流程控制。對幾個核心檔案進行解剖,瞭解其程式設計技巧及安全機制 

Ecshop檔案結構分析:

\includes\cls_captcha.php:   驗證碼圖片類

\includes\cls_ecshop.php:   基礎類

\includes\cls_ecshop.php(56):    密碼編譯方法;

\includes\cls_rss.php:   RSS 類

\includes\cls_smtp.php:   SMTP 郵件類

\includes\inc_constant.php:   常量

\includes\init.php: 前臺公用檔案

\includes\lib_common.php:   公用函式庫

\includes\lib_goodscat.php:   前臺公用函式庫

\includes\lib_insert.php:   動態內容函式庫

\includes\lib_main.php:   前臺公用函式庫

\includes\lib_payment.php:   支付介面函式庫

\includes\iconv\cls_iconv.php:   字符集轉換類

\includes\ip\cls_ip.php:   IP 歸屬地查詢類

\includes\modules\integrates\discuz.php:   會員資料處理類

\includes\modules\integrates\ecshop.php:   會員資料處理類 ……

· Ecshop模板更換 熟悉Smarty的精簡版的使用,嵌入自己的介面,EcShop模板的跟換技巧  

· Ecshop二次開發例項 中英文切換的功能,秒殺功能,京東商城模板的製作等   

學習目的:

1,會使用Ecshop進行二次開發

2,會換普通的模板及一些功能的修改

3,吸取裡面的開發經驗   掌握基礎知識-》模仿裡面的一些寫法-》修改裡面的模式(形成自己的開發模式)   掌握Ecshop裡面的程式設計技巧及系統設計技巧

◆快取技術分析

常見的PHP快取技術分析[概念版]

 在大部份情況下我們的網站都會使用資料庫作為站點資料儲存的容器。當你執行一個SQL查詢時,典型的處理過程是:連線資料庫->準備SQL查詢->傳送查詢到資料庫->取得資料庫返回結果->關閉資料庫連線。但資料庫中有些資料是完全靜態的或不太經常變動的,快取系統會通過把SQL查詢的結果快取到一個更快的儲存系統中儲存,從而避免頻繁運算元據庫而很大程度上提高了程式執行時間,而且快取查詢結果也允許你後期處理。

  普遍使用的快取技術

  1、資料快取:

這裡所說的資料快取是指資料庫查詢快取,每次訪問頁面的時候,都會先檢測相應的快取資料是否存在,如果不存在,就連線資料庫,得到資料,並把查詢結果序列化後儲存到檔案中,以後同樣的查詢結果就直接從快取檔案中獲得。

  2、頁面快取:

  每次訪問頁面的時候,都會先檢測相應的快取頁面檔案是否存在,如果不存在,就連線資料庫,得到資料,顯示頁面並同時生成快取頁面檔案,這樣下次訪問的時候頁面檔案就發揮作用了。(模板引擎和網上常見的一些快取類通常有此功能)

  3、記憶體快取:

  在裡就不介紹了,不是本文所要討論的,只簡單提一下:

  Memcached是高效能的,分散式的記憶體物件快取系統,用於在動態應用中減少資料庫負載,提升訪問速度。

  dbcached 是一款基於 Memcached 和 NMDB 的分散式 key-value 資料庫記憶體快取系統。

  以上的快取技術雖然能很好的解決頻繁查詢資料庫的問題,但其缺點在在於資料無時效性,下面我給出我在專案中常用的方法:

  4、時間觸發快取:

  檢查檔案是否存在並且時間戳小於設定的過期時間,如果檔案修改的時間戳比當前時間戳減去過期時間戳大,那麼就用快取,否則更新快取。

  設定時間內不去判斷資料是否要更新,過了設定時間再更新快取。以上只適合對時效性要求不高的情況下使用 ,否則請看下面。

  5、內容觸發快取:

  當插入資料或更新資料時,強制更新快取。

  在這裡我們可以看到,當有大量資料頻繁需要更新時,最後都要涉及磁碟讀寫操作。怎麼解決呢?我在日常專案中,通常並不快取所有內容,而是快取一部分不經常變的內容來解決。但在大負荷的情況下,最好要用共享記憶體做快取系統。

  到這裡PHP快取也許有點解決方案了,但其缺點是,因為每次請求仍然要經過PHP解析,在大負荷的情況下效率問題還是比效嚴重,在這種情況下,也許會用到靜態快取。

  6、靜態快取

  這裡所說的靜態快取是指HTML快取,HTML快取一般是無需判斷資料是否要更新的,因為通常在使用HTML的場合一般是不經常變動內容的頁面。資料更新的時候把HTML也強制更新一下就可以了。

  其實一個快取系統涉及的問題是比較多的,我在這裡只介紹一下我平時的快取思路,並沒有介紹利用軟體來實現快取和寫出具體程式碼。

  如果您有什麼好的解決方案也請在下面提出,讓我們一起互相探討。

◆PHP使用函式呼叫命令

php中使用exec,system等函式呼叫系統命令

php的內建函式exec,system都可以呼叫系統命令(shell命令),當然還有passthru,escapeshellcmd等函式。

  在很多時候利用php的exec,system等函式呼叫系統命令可以幫助我們更好更快的完成工作。比如前二天筆者在批量處理.rar檔案時exec就幫我了大忙了。

  今天整理一下常用的呼叫系統函式發出來和大家分享經驗。

  注意:要想使用這二個函式php.ini中的安全模式必須關閉,要不然為了安全起見php是不讓呼叫系統命令的。

  先看一下php手冊對這二個函式的解釋:

  exec --- 執行外部程式

  語法 : string exec ( string command [, array &output [, int &return_var]] )

  說明 :

  exec( )執行給予的命令command,不過它並不會輸出任何東西,它簡單的從命令的結果中傳回最後一行,如果你需要去執行一個命令,並且從命令去取得所有資料時,可以使用passthru( )這個函式。

  如果有給予引數array,則指定的陣列將會被命令所輸出的每一行填滿,注意 : 如果陣列先前已經包含了一些元素的話,exec( )將會把它附加在陣列的後面,如果你不想要此函式附加元素的話,你可以在傳遞此陣列給exec( )之前呼叫unset( )。

  如果有給予引數array和return_var,則傳回執行的狀態命令將會寫到這個變數。

  注意 : 如果你允許來自使用者輸入的資料,可以傳遞到此函式,那麼你應該使用escapeshellcmd( )來確定此使用者無法哄騙(trick)系統來執行武斷的(arbitrary)命令。

  注意 : 如果你使用此函式來啟動一個程式,而且希望在背景裡(background)執行的時候離開它,你必須確定此程式的輸出是轉向(redirected)到一個檔案或是一些輸出的資料流,否則PHP將會懸掛(hang)直到程式執行結束。

  system --- 執行外部程式並且顯示輸出

  語法 : string system ( string command [, int &return_var] )

  說明 :

  system( )執行給予的命令command,並且輸出結果。如果有給予引數return_var,則執行命令的狀態碼將會寫到這個變數。

  注意 : 如果你允許來自使用者輸入的資料,可以傳遞到此函式,那麼你應該使用escapeshellcmd( )來確定此使用者無法哄騙(trick)系統來執行武斷的(arbitrary)命令。

  注意 : 如果你使用此函式來啟動一個程式,而且希望在背景裡(background)執行的時候離開它,你必須確定此程式的輸出是轉向(redirected)到一個檔案或是一些輸出的資料流,否則PHP將會懸掛(hang)直到程式執行結束。

  如果PHP是運作成伺服器模組,在輸出每一行後,system( )會試著自動地清除web伺服器的輸出緩衝。

  成功則傳回命令的最後一行,失敗則傳回false。

  如果你需要去執行一個命令,並且從命令去取得所有資料時,可以使用passthru( )這個函式。

  這二個都是用來呼叫系統shell命令,

  不同點:

  exec可以把執行的結果全部返回到$output函式裡(陣列),$status是執行的狀態 0為成功 1為失敗

  systerm不需要提供$output函式,他是直接把結果返回出來,同樣$return_var是執行的狀態碼 0為成功 1為失敗

◆關於開源

開源最大的成功來源於Web

開源運動廣受歡迎,並且在軟體開發史上寫下了濃重一筆。但是它影響最深遠的地方在哪呢?有史以來,最成功的開源“專案”又是什麼呢?

事實上,總體來看,Web不就是開源運動最大的成功麼?

可能最有名的例子就是隱藏域眾多網站背後的LAMP,也就是Linux、Apache、MySQL和PHP。但當你仔細考慮後,你會發現更多。

下面列出了Web得以運轉的一些開源專案。

1、Web browsers-網路瀏覽器

在網路瀏覽器市場中,雖然微軟的封閉原始碼軟體IE瀏覽器仍然佔有很大的份額,但其它功能相似的開源專案已經流行起來,並在不斷壯大。像Mozilla公司的Firefox瀏覽器(它是開源的,還有Flock、PaleMoon)。還有增長迅速的基於Webkit的瀏覽器,像Safari,但最著名的是Chrome瀏覽器。

如果把手機網路也算到這裡面,其中Webkit主宰著iPhone、Android和Blackberry手機中的瀏覽器。

2、Web server software-Web伺服器軟體

迄今為止,Apache是使用範圍最廣的網路伺服器軟體,它是開源的,但是一個叫做Nginx的輕量級伺服器軟體在最近幾年開始流行起來。事實上,三大頂級網路伺服器軟體中有兩個是開源的(排名第二的微軟的IIS是例外,但其距離第一相差甚遠)。

另外,大量伺服器端底層軟體也是開源的。例如,很多大流量網站使用Varnish作為與網站訪問者之間的快取層,而使用Memcached作為與網站資料庫之間的快取層。這只是眾多例子中的兩個。

3、Scripting languages and web frameworks-指令碼語言和Web框架

網路上使用的大部分程式設計和指令碼語言都是開源的,比如PHP、Perl、Python、Ruby等。

但是,很少有網站完完全全是從零開始。毫不誇張的說,有成百上千的開源內容管理系統(CMS)和網路框架來協助開發人員,例如WordPress、Drupal、Ruby on Rails、Django、Joomla、DedeCMS、Ecshop等。

4、Databases-資料庫

開源軟體MySQL是目前為止最流行的網站資料庫,但還有其它功能相似的開源軟體,比如PostgreSQL,更不用說近來出現的眾多“非關係型(NoSQL)”資料庫。

既然我們說到了底層軟體,那就不得不提一下每次我們使用網際網路或因特網上的任何東西時都要依靠的基礎系統:

5、DNS-域名解析系統

Web(就此而言是整個因特網)離開了域名解析系統就一無是處。大家都知道,域名解析系統可以讓使用者使用像example.com之類的域名,而不是IP地址。BIND幾乎是DNS伺服器(亦稱名稱伺服器)軟體的實際標準,並且,你現在可能已經猜到了,它是開源的。

6、Server operating systems-伺服器作業系統

所有網站都必須在伺服器上執行,而那也是開源的統治領域。雖然Windows統治著桌面領域,但是網站賴以執行的伺服器大部分採用開源的Linux作業系統,其他比較流行的選擇是freeBSD和OpenBSD。

7、開源的誘惑

由於在許多情況下,開源軟體能夠提供與商業的封閉原始碼軟體相同的效能,並且又是免費的,所以開源軟體如此流行並不奇怪。免費是一個難以挑戰的價格。

假如Web不是執行在所有這些免費軟體上,那麼它很可能需要一段艱苦的過程,才能讓人們廣泛接受。

注意我們並沒說過Web中沒有任何封閉原始碼軟體,而那顯然是存在的。但是,從統計資料看,Web開源統治領域中真正的例外是微軟的基於Windows系列系統。

除了那個,你通常需要深入研究才能發現更多私有封閉原始碼技術,像路由器和類似裝置上的作業系統。但那是因特網,而不是Web。

8、結束語

多虧了80年代因特網、便捷通訊以及合作與共享的興起,開源運動才得以蓬勃發展。在90年代,當Web誕生於頂層因特網裝置時,開源運動已經準備好助其一臂之力了。

沒有人會否認開源統治著Web的大部分。開源和Web是一個合作共生的關係,互利互惠,合作共贏。這就是為什麼我們認為Web可以說是迄今為止是開源最大的成功。(我們並沒有否定Tim Berners-Lee的意思。注:Tim Berners-Lee,全球資訊網之父、第一位站長  

 

相關文章