搜尋
首頁後端開發php教程基于yaf的模块化开发方案

随着我们网站流量越来越大,用户越来越多,需求也越来越复杂,一站式开发已经远远不能支撑我们的业务发展需要,在产品发展期内碰到的问题越来越多,技术架构限制了业务的发展,这对于研发人员来讲是不能忍的,业务制约技术发展可以接受,但技术制约了业务的发展就是问题了。

我先来总结下一站式开发将面临的问题:

1、代码量大,开发、部署、测试都将是问题

这个很容易理解,我们的业务需求全部在一个系统中的时候,开发、部署、测试必然都会存在很大的风险,比如开发,即使从一开始就参与项目的成员,在业务规模庞大的时候,也很难做把控控制风险;比如部署,因为量大,导致代码发布会非常慢,大部分发布平台会先打包,到线上服务器解压,这个过程当在紧急上线发布的时候会急死人的,一旦上线出现问题,回滚成本将会更高,影响的不单单是发布系统,严重的将导致服务不可用的状态。

2、严重制约业务发展

有一个好的习惯,开发人员会在开发过程中习惯性的将公用的功能封装成类或方法,如果这是核心功能,那它可能出现在整个系统的任何地方,当核心功能需要开发的时候,则会牵一发动全身,很可能面临的将是系统重构。

举个很简单的例子。

如我们有一个函数(或者一个类)

function custom_function($a,$b) {//TODO}

实现了最基础的业务功能,一开始它满足了当前的业务,实现了基本功能,但随着业务发展,这个基础功能变得更强大,支持的特性更多了,为了支持业务,我们把函数扩展根据参数做兼容,如:

function custom_function($a,$b,$c){if(empty($c)){//兼容老业务}else if($c== "XXX"){//支持新业务}else if($c == "ccc"){//新业务}}

虽然能满足需求,但可以想像维护这样一段代码会让后来人骂娘多少次?当然,虽然我们听不见,但毕竟让后人非常不爽。

3、不得已的推倒重构

基于各种压力,更多的是基于业务发展的压力,我们不得已痛苦的对整个系统进行重构,这个过程漫长而痛苦,一方面要支持现有系统的业务,另一方面还要对整个系统进行技术重构,让他们之间的耦合更少,这个成本和风险将会让我们痛不欲生。

那我们在项目最初是不是就该考虑从业务上拆分成多个模块?答案是肯定的。但是也将带来一些问题:

1、PM不懂技术,不清楚怎么拆分

这个问题还好解决,在规划和项目评审的时候,跟技术一起讨论,侧重于在业务功能上进行拆分,比如用户相关操作全部归为用户模块,后台相关归为后台模块,浏览的归为view模块

2、怎么控制粒度,控制不好反而会增加更多的成本

这个要在技术内部好好的做沟通和规划,控制好边界

3、数据共享?

虽然拆成了多个模块,但是对于数据俩讲,它遍布整个系统,模块与模块之间的数据如何共享?

在项目初期的解决方案是,

- 将最基础的数据独立成library模块,它提供最细单元的数据共享,这些可以在整个模块中调用;

- 提供跨模块调用的业务接口,比如在模块A下,让框架支持调用B模块下的接口;

- 提供http服务化接口,这个大多数是在项目成熟阶段的时候才会做的事情;

解决困难问题的方向就在框架身上了,它将具备以下特性:

1、代码量少、精简

2、可跨模块调用,模块中几乎不用包含任何框架的实现

3、可调用最基础的library模块

4、管理配置化

在目前所有php框架中,要想实现模块化编程还是比较困难的,大部分的框架实现都是在框架内部有自己的application或module,这里面是具体的模块化的业务代码。

还有一种完全的模块化,每一个模块业务都有这样一套框架实现:

但是这样的缺点显而易见,一方面很难做到跨模块调用,需要在外层在包一层逻辑实现,另一方面框架维护和代码量让模块显得更重。

所以更多的是采用第一种方式,今天的主题yaf,其实也是这样一种架构,只是框架逻辑实现在so扩展中了,

但今天所要谈的是基于这两种方案之中的办法,既能让模块之间完全独立,又能让它跨模块调用接口,而且模块中基本不用维护任何框架代码,只需要按照框架的规范写代码就可以了。

每个模块之间提供interface,供其他模块直接调用,每个模块只处理自己的业务,当有业务需要共享时直接按照规范写interface就可以了。

项目目录如下:

但是yaf不支持跨模块的调用,模块与模块之间是不能通过interface来通信的,为了解决这个问题,我增加了两个类Yaf_Init和Yaf_Caller

Yaf_Init

$app = Yaf_Init::init();$app->Bootstrap()->run();

这个只是一层封装,根据目录解析出当前模块名,省去配置config.ini的烦恼,为了灵活性,Yaf_init::init()后面将增加参数可以灵活自定义配置,每一个webroot/module/index.php中都是上面的代码。

等同于下面

$config = array('application'=> array('directory' => app目录))$application = new Yaf_Application($config);$application->Bootstrap()->run();

为了能够找到app的目录,还需要在php.ini中增加一个配置,

yaf.app_path = /home/admin/web/htdocs/app/

如果访问/home/admin/web/webserver/webroot/module/index.php时,

会解析出module拼成app目录:

/home/admin/web/htdocs/app/module/传给$config.application.directory,

将$config 配置传递给yaf_application的构造函数进行初始化

Yaf_Caller

$Object = new Yaf_Caller('moduleName','className');$Object->test();

这个类用来实例化其他模块中interface的类库,其实它也是一层简单的包装,保存环境变量,切换到某模块,然后调用Yaf_loader::autoload(),该构造函数接收两个参数,第一个是模块名,第二个是interface的类名,

interface的命名规范:

/app/htdocs/moduleA/Interface/Admin.php

比如模块A提供了一个interface,类名是admin

则Admin.php的类写法

class Interface_Admin{   function test(){        //TODO   }}

其他模块调用时

//object返回的是Interface_Admin类$object = new Yaf_Caller('moduleA','Admin');它直接可以调用Interface_Admin下的public方法。$object->test();

这套方案有以下优点:

- 模块代码量小,只需要实现业务代码就可以

- 模块之间可以无缝调用inteface接口

未完待续……

原文出处:

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
使用數據庫存儲會話的優點是什麼?使用數據庫存儲會話的優點是什麼?Apr 24, 2025 am 12:16 AM

使用數據庫存儲會話的主要優勢包括持久性、可擴展性和安全性。 1.持久性:即使服務器重啟,會話數據也能保持不變。 2.可擴展性:適用於分佈式系統,確保會話數據在多服務器間同步。 3.安全性:數據庫提供加密存儲,保護敏感信息。

您如何在PHP中實現自定義會話處理?您如何在PHP中實現自定義會話處理?Apr 24, 2025 am 12:16 AM

在PHP中實現自定義會話處理可以通過實現SessionHandlerInterface接口來完成。具體步驟包括:1)創建實現SessionHandlerInterface的類,如CustomSessionHandler;2)重寫接口中的方法(如open,close,read,write,destroy,gc)來定義會話數據的生命週期和存儲方式;3)在PHP腳本中註冊自定義會話處理器並啟動會話。這樣可以將數據存儲在MySQL、Redis等介質中,提升性能、安全性和可擴展性。

什麼是會話ID?什麼是會話ID?Apr 24, 2025 am 12:13 AM

SessionID是網絡應用程序中用來跟踪用戶會話狀態的機制。 1.它是一個隨機生成的字符串,用於在用戶與服務器之間的多次交互中保持用戶的身份信息。 2.服務器生成並通過cookie或URL參數發送給客戶端,幫助在用戶的多次請求中識別和關聯這些請求。 3.生成通常使用隨機算法保證唯一性和不可預測性。 4.在實際開發中,可以使用內存數據庫如Redis來存儲session數據,提升性能和安全性。

您如何在無狀態環境(例如API)中處理會議?您如何在無狀態環境(例如API)中處理會議?Apr 24, 2025 am 12:12 AM

在無狀態環境如API中管理會話可以通過使用JWT或cookies來實現。 1.JWT適合無狀態和可擴展性,但大數據時體積大。 2.Cookies更傳統且易實現,但需謹慎配置以確保安全性。

您如何防止與會議有關的跨站點腳本(XSS)攻擊?您如何防止與會議有關的跨站點腳本(XSS)攻擊?Apr 23, 2025 am 12:16 AM

要保護應用免受與會話相關的XSS攻擊,需採取以下措施:1.設置HttpOnly和Secure標誌保護會話cookie。 2.對所有用戶輸入進行輸出編碼。 3.實施內容安全策略(CSP)限制腳本來源。通過這些策略,可以有效防護會話相關的XSS攻擊,確保用戶數據安全。

您如何優化PHP會話性能?您如何優化PHP會話性能?Apr 23, 2025 am 12:13 AM

优化PHP会话性能的方法包括:1.延迟会话启动,2.使用数据库存储会话,3.压缩会话数据,4.管理会话生命周期,5.实现会话共享。这些策略能显著提升应用在高并发环境下的效率。

什麼是session.gc_maxlifetime配置設置?什麼是session.gc_maxlifetime配置設置?Apr 23, 2025 am 12:10 AM

theSession.gc_maxlifetimesettinginphpdeterminesthelifespanofsessiondata,setInSeconds.1)它'sconfiguredinphp.iniorviaini_set().2)abalanceisesneededeededeedeedeededto toavoidperformance andunununununexpectedLogOgouts.3)

您如何在PHP中配置會話名?您如何在PHP中配置會話名?Apr 23, 2025 am 12:08 AM

在PHP中,可以使用session_name()函數配置會話名稱。具體步驟如下:1.使用session_name()函數設置會話名稱,例如session_name("my_session")。 2.在設置會話名稱後,調用session_start()啟動會話。配置會話名稱可以避免多應用間的會話數據衝突,並增強安全性,但需注意會話名稱的唯一性、安全性、長度和設置時機。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。