當前位置:首頁 » 編程語言 » php常用模式

php常用模式

發布時間: 2022-11-27 08:07:30

『壹』 php有幾種設計模式

5種啊工廠模式,單元素模式,觀察者模式,命令鏈模式,策略模式,希望能幫到你,我還要在後盾網上課學習呢,有不會的可以問我。(´ω`*)

『貳』 PHP中幾種常見的開發模式

單例模式

  • $_instance必須聲明為靜態的私有變數

  • 構造函數和析構函數必須聲明為私有,防止外部程序new 類從而失去單例模式的意義

  • getInstance()方法必須設置為公有的,必須調用此方法 以返回實例的一個引用

  • ::操作符只能訪問靜態變數和靜態函數

  • new對象都會消耗內存

  • 使用場景:最常用的地方是資料庫連接。

  • 使用單例模式生成一個對象後, 該對象可以被其它眾多對象所使用。

  • 私有的__clone()方法防止克隆對象

  • 單例模式,使某個類的對象僅允許創建一個。構造函數private修飾,
    申明一個static getInstance方法,在該方法里創建該對象的實例。如果該實例已經存在,則不創建。比如只需要創建一個資料庫連接。

    工廠模式

    工廠模式,工廠方法或者類生成對象,而不是在代碼中直接new。
    使用工廠模式,可以避免當改變某個類的名字或者方法之後,在調用這個類的所有的代碼中都修改它的名字或者參數。

  • * 如果某個類在很多的文件中都new ClassName(),那麼萬一這個類的名字

  • * 發生變更或者參數發生變化,如果不使用工廠模式,就需要修改每一個PHP

  • * 代碼,使用了工廠模式之後,只需要修改工廠類或者方法就可以了。

  • 注冊模式

    注冊模式,解決全局共享和交換對象。已經創建好的對象,掛在到某個全局可以使用的數組上,在需要使用的時候,直接從該數組上獲取即可。將對象注冊到全局的樹上。任何地方直接去訪問。


  • 策略模式

    策略模式,將一組特定的行為和演算法封裝成類,以適應某些特定的上下文環境。
    eg:假如有一個電商網站系統,針對男性女性用戶要各自跳轉到不同的商品類目,並且所有的廣告位展示不同的廣告。在傳統的代碼中,都是在系統中加入各種if else的判斷,硬編碼的方式。如果有一天增加了一種用戶,就需要改寫代碼。使用策略模式,如果新增加一種用戶類型,只需要增加一種策略就可以。其他所有的地方只需要使用不同的策略就可以。
    首先聲明策略的介面文件,約定了策略的包含的行為。然後,定義各個具體的策略實現類。

    執行結果圖:

    總結:
    通過以上方式,可以發現,在不同用戶登錄時顯示不同的內容,但是解決了在顯示時的硬編碼的問題。如果要增加一種策略,只需要增加一種策略實現類,然後在入口文件中執行判斷,傳入這個類即可。實現了解耦。
    實現依賴倒置和控制反轉(有待理解)
    通過介面的方式,使得類和類之間不直接依賴。在使用該類的時候,才動態的傳入該介面的一個實現類。如果要替換某個類,只需要提供一個實現了該介面的實現類,通過修改一行代碼即可完成替換。

    觀察者模式

    1:觀察者模式(Observer),當一個對象狀態發生變化時,依賴它的對象全部會收到通知,並自動更新。
    2:場景:一個事件發生後,要執行一連串更新操作。傳統的編程方式,就是在事件的代碼之後直接加入處理的邏輯。當更新的邏輯增多之後,代碼會變得難以維護。這種方式是耦合的,侵入式的,增加新的邏輯需要修改事件的主體代碼。
    3:觀察者模式實現了低耦合,非侵入式的通知與更新機制。
    定義一個事件觸發抽象類。

    當某個事件發生後,需要執行的邏輯增多時,可以以松耦合的方式去增刪邏輯。也就是代碼中的紅色部分,只需要定義一個實現了觀察者介面的類,實現復雜的邏輯,然後在紅色的部分加上一行代碼即可。這樣實現了低耦合。

    裝飾器模式

    1:裝飾器模式,可以動態的添加修改類的功能
    2:一個類提供了一項功能,如果要在修改並添加額外的功能,傳統的編程模式,需要寫一個子類繼承它,並重寫實現類的方法
    3:使用裝飾器模式,僅需要在運行時添加一個裝飾器對象即可實現,可以實現最大額靈活性。

『叄』 怎麼理解php中的設計模式

1、單例模式:PHP中的對象生存期間是從該腳本開始一直到該腳本結束為止,因此PHP的單例模式只是在一個頁面中(這里可能包含很多其他頁面,不是狹義的單頁面)多次用到該對象時才會起作用,多次用到時不去重復的new對象(多個人做一個項目時,難免會碰到一次請求中多次實例一個對象的情況),將不會耗費不必要的資源(數據控連接操做效果很明顯),還有一點就是可以保證整個腳本中都是同一個對象,這種模式是怎麼實現的呢,他的實現有幾個要注意的點:

a. 首先就是要將__construct()方法定義為私有方法,這樣就不能通過new來得到一個新的實例了,單例模式不能在外部進行實例化,這能字自身內部進行實例化;

『肆』 PHP進程管理三種模式

ondemand:按請示創建進程數;

dynamic:初始化啟動number進程數;

static:固定啟動進程數;

php-fpm進程管理一共有三種模式: ondemand、static、dynamic ,我們可以在同一個fpm的master配置三種模式,看下圖1。php-fpm的工作模式和nginx類似,都是一個master,多個worker模型。每個worker都在accept本pool內的監聽套接字(linux已不存在驚群現象)。

ondemand

在php-fpm啟動的時候,不會給這個pool啟動任何一個worker,是按需啟動,當有連接過來才會啟動。

配置文件(我的配置文件地址為:/usr/local/php/etc/php-fpm.conf)

當前pool的名字為test

原理

 ondemand原理圖

1. 從上圖可以看出,新建worker的觸發條件是連接的到來,而不是實際的請求(例如,只進行連接比如telnet,不發請求數據也會新建worker)

2. worker的數量受限於pm.max_children配置,同時受限全局配置process.max(准確的說,三種模式都受限於全局配置)

3.1秒定時器作用

找到空閑worker,如果空閑時間超過pm.process_idle_timeout大小,關閉。這個機制可能會關閉所有的worker。

配置項要求

1. pm.max_children> 0

2. pm.process_idle_timeout> 0,如果不設置,默認10s

優缺點

優點:按流量需求創建,不浪費系統資源(在硬體如此便宜的時代,這個優點略顯雞肋)

缺點:由於php-fpm是短連接的,所以每次請求都會先建立連接,建立連接的過程必然會觸發上圖的執行步驟,所以,在大流量的系統上master進程會變得繁忙,佔用系統cpu資源,不適合大流量環境的部署

dynamic

在php-fpm啟動時,會初始啟動一些worker,在運行過程中動態調整worker數量,worker的數量受限於pm.max_children配置,同時受限全局配置process.max

當前pool的名字為test

原理

dynamic原理圖

1. 1秒定時器作用

檢查空閑worker數量,按照一定策略動態調整worker數量,增加或減少。增加時,worker最大數量<=max_children· <=全局process.max;減少時,只有idle >pm.max_spare_servers時才會關閉一個空閑worker。

idle > pm.max_spare_servers,關閉啟動時間最長的一個worker,結束本次處理

idle >= pm.max_children,列印WARNING日誌,結束本次處理

idle < pm.max_children,計算一個num值,然後啟動num個worker,結束本次處理

配置項要求

1. pm.min_spare_servers/pm.max_spare_servers有效范圍(0,pm.max_children]

2. pm.max_children> 0

3. pm.min_spare_servers<=pm.max_spare_servers

4. pm.start_servers有效范圍[pm.min_spare_servers,pm.max_spare_servers]如果沒有配置,默認pm.min_spare_servers + (pm.max_spare_servers - pm.min_spare_servers) / 2

優缺點

優點:動態擴容,不浪費系統資源,master進程設置的1秒定時器對系統的影響忽略不計;

缺點:如果所有worker都在工作,新的請求到來只能等待master在1秒定時器內再新建一個worker,這時可能最長等待1s;

static

php-fpm啟動採用固定大小數量的worker, 在運行期間也不會擴容,雖然也有1秒的定時器,僅限於統計一些狀態信息,例如空閑worker個數,活動worker個數,網路連接隊列長度等信息。

當前pool的名字為test

原理

配置項要求

1、pm.max_children> 0 必須配置,且只有這一個參數生效

優缺點

如果配置成static,只需要考慮max_children的數量,數量取決於cpu的個數和應用的響應時間,我司配置的是50。

我司不考慮動態的增加減少那麼十幾個或者幾十個worker,我們的內存沒有緊張到這個程度,所以,我們一步到位,把worker數配置到支持最大流量,(哈哈,50也是隨便定的,足矣足矣呢)

最後我們再介紹下worker的工作流程

fastcgi與php-fpm的關系一句話解讀:fastcgi只是通信應用協議,php-fpm就是實現了fastcig協議,並嵌入了一個 PHP 解釋器。

『伍』 了解php設計模式么

php最常見的設計模式是單例,工廠。相較來說單利還是很常用的。很多的工具,比如資料庫操作、緩存操作或某一個功能操作都可以寫成一個單例去做。代碼的一個開發思想都是mvc,這是幾乎所有框架都遵循的一個原則。

『陸』 PHP有哪幾種設計模式

PHP 一般有五種常見的設計模式

工廠模式

工廠模式 是一種類,它具有為您創建對象的某些方法。您可以使用工廠類創建對象,而不直接使用 new。這樣,如果您想要更改所創建的對象類型,只需更改該工廠即可。使用該工廠的所有代碼會自動更改。

例如:
<?php
interface IUser
{
function getName();
}

class User implements IUser
{
public function __construct( $id ) { }

public function getName()
{
return "Jack";
}
}

class UserFactory
{
public static function Create( $id )
{
return new User( $id );
}
}

$uo = UserFactory::Create( 1 );
echo( $uo->getName()."\n" );
?>

單元素模式

某些應用程序資源是獨占的,因為有且只有一個此類型的資源。例如,通過資料庫句柄到資料庫的連接是獨占的。您希望在應用程序中共享資料庫句柄,因為在保持連接打開或關閉時,它是一種開銷,在獲取單個頁面的過程中更是如此。

單元素模式可以滿足此要求。如果應用程序每次包含且僅包含一個對象,那麼這個對象就是一個單元素(Singleton)。

例如:
<?php
require_once("DB.php");

class DatabaseConnection
{
public static function get()
{
static $db = null;
if ( $db == null )
$db = new DatabaseConnection();
return $db;
}

private $_handle = null;

private function __construct()
{
$dsn = 'mysql://root:password@localhost/photos';
$this->_handle =& DB::Connect( $dsn, array() );
}

public function handle()
{
return $this->_handle;
}
}

print( "Handle = ".DatabaseConnection::get()->handle()."\n" );
print( "Handle = ".DatabaseConnection::get()->handle()."\n" );
?>

觀察者模式

觀察者模式為您提供了避免組件之間緊密耦合的另一種方法。該模式非常簡單:一個對象通過添加一個方法(該方法允許另一個對象,即觀察者 注冊自己)使本身變得可觀察。當可觀察的對象更改時,它會將消息發送到已注冊的觀察者。這些觀察者使用該信息執行的操作與可觀察的對象無關。結果是對象可以相互對話,而不必了解原因。

例如:
<?php
interface IObserver
{
function onChanged( $sender, $args );
}

interface IObservable
{
function addObserver( $observer );
}

class UserList implements IObservable
{
private $_observers = array();

public function addCustomer( $name )
{
foreach( $this->_observers as $obs )
$obs->onChanged( $this, $name );
}

public function addObserver( $observer )
{
$this->_observers []= $observer;
}
}

class UserListLogger implements IObserver
{
public function onChanged( $sender, $args )
{
echo( "'$args' added to user list\n" );
}
}

$ul = new UserList();
$ul->addObserver( new UserListLogger() );
$ul->addCustomer( "Jack" );
?>

命令鏈模式

命令鏈 模式以鬆散耦合主題為基礎,發送消息、命令和請求,或通過一組處理程序發送任意內容。每個處理程序都會自行判斷自己能否處理請求。如果可以,該請求被處理,進程停止。您可以為系統添加或移除處理程序,而不影響其他處理程序。

例如:
<?php
interface ICommand
{
function onCommand( $name, $args );
}

class CommandChain
{
private $_commands = array();

public function addCommand( $cmd )
{
$this->_commands []= $cmd;
}

public function runCommand( $name, $args )
{
foreach( $this->_commands as $cmd )
{
if ( $cmd->onCommand( $name, $args ) )
return;
}
}
}

class UserCommand implements ICommand
{
public function onCommand( $name, $args )
{
if ( $name != 'addUser' ) return false;
echo( "UserCommand handling 'addUser'\n" );
return true;
}
}

class MailCommand implements ICommand
{
public function onCommand( $name, $args )
{
if ( $name != 'mail' ) return false;
echo( "MailCommand handling 'mail'\n" );
return true;
}
}

$cc = new CommandChain();
$cc->addCommand( new UserCommand() );
$cc->addCommand( new MailCommand() );
$cc->runCommand( 'addUser', null );
$cc->runCommand( 'mail', null );
?>

策略模式

我們講述的最後一個設計模式是策略 模式。在此模式中,演算法是從復雜類提取的,因而可以方便地替換。例如,如果要更改搜索引擎中排列頁的方法,則策略模式是一個不錯的選擇。思考一下搜索引擎的幾個部分 —— 一部分遍歷頁面,一部分對每頁排列,另一部分基於排列的結果排序。在復雜的示例中,這些部分都在同一個類中。通過使用策略模式,您可將排列部分放入另一個類中,以便更改頁排列的方式,而不影響搜索引擎的其餘代碼。

例如:
<?php
interface IStrategy
{
function filter( $record );
}

class FindAfterStrategy implements IStrategy
{
private $_name;

public function __construct( $name )
{
$this->_name = $name;
}

public function filter( $record )
{
return strcmp( $this->_name, $record ) <= 0;
}
}

class RandomStrategy implements IStrategy
{
public function filter( $record )
{
return rand( 0, 1 ) >= 0.5;
}
}

class UserList
{
private $_list = array();

public function __construct( $names )
{
if ( $names != null )
{
foreach( $names as $name )
{
$this->_list []= $name;
}
}
}

public function add( $name )
{
$this->_list []= $name;
}

public function find( $filter )
{
$recs = array();
foreach( $this->_list as $user )
{
if ( $filter->filter( $user ) )
$recs []= $user;
}
return $recs;
}
}

$ul = new UserList( array( "Andy", "Jack", "Lori", "Megan" ) );
$f1 = $ul->find( new FindAfterStrategy( "J" ) );
print_r( $f1 );

$f2 = $ul->find( new RandomStrategy() );
print_r( $f2 );
?>

『柒』 簡述php的靜動態模式

php-fpm的進程數可以根據設置分為動態和靜態
A: 靜態static:直接開啟指定數量的php-fpm進程,不再增加或者減少;
B :動態dynamic:開始的時候開啟一定數量php-fpm進程,當請求變大的時候,動態的增加php-fpm進程數到上限,當空閑的時候自動釋放空閑進程數到一個下限。
這兩種不同的執行方式,可以根據伺服器實際需求來進行調整。
pm表示用哪種方式,有兩個值可以選擇,就是static靜態或者dynamic動態。
C: 4個相關參數參:
pm.max_children靜態方式下開啟的php-fpm進程數量;
pm.start_servers動態方式下的起始php-fpm進程數量;
pm.min_spare_servers動態方式下的最小php-fpm進程數量;
pm.max_spare_servers動態方式下的最大php-fpm進程數量。
你學會了不?沒有學會也沒關系,可以去找視頻看,跟著老師看視頻學習,我看的是黑馬程序員的學習視頻,你也可以看看。

『捌』 php 單例模式

單例模式是一種常用的軟體設計模式,可以保證系統中一個類只有一個實例,從而達到節約系統資源提升特殊類使用效率的目的


php實現單例模式的方法

classA{
//靜態屬性
privatestatic$_instance;

//空的克隆方法,防止被克隆
privatefunction__clone(){}

//獲取實例
(){
if(!(self::$_instanceinstanceofself)){
self::$_instance=newA();
}
returnself::$_instance;
}
}

//調用
$obj=A::getInstance();

『玖』 php有幾種運行模式最常用的是那種

php一共分為五大運行模式:包括cgi 、fast-cgi、cli、isapi、apache 模塊的 DLLCGI
CGI即通用網關介面(Common Gateway Interface),它是一段程序,通俗的講CGI就象是一座橋,把網頁和WEB伺服器中的執行程序連接起來,它把HTML接收的指令傳遞給伺服器的執 行程序,再把伺服器執行程序的結果返還給HTML頁。CGI 的跨平台性能極佳,幾乎可以在任何操作系統上實現。
CGI方式在遇到連接請求(用戶 請求)先要創建cgi的子進程,激活一個CGI進程,然後處理請求,處理完後結束這個子進程。這就是fork-and-execute模式。所以用cgi 方式的伺服器有多少連接請求就會有多少cgi子進程,子進程反復載入是cgi性能低下的主要原因。都會當用戶請求數量非常多時,會大量擠占系統的資源如內 存,CPU時間等,造成效能低下。CGI-FCGI
fast-cgi 是cgi的升級版本,FastCGI像是一個常駐(long-live)型的CGI,它可以一直執行著,只要激活後,不會每次都要花費時間去fork一 次。PHP使用PHP-FPM(FastCGI Process Manager),全稱PHP FastCGI進程管理器進行管理。FastCGI的工作原理
1、Web Server啟動時載入FastCGI進程管理器(IIS ISAPI或Apache Mole)
2、FastCGI進程管理器自身初始化,啟動多個CGI解釋器進程(可見多個php-cgi)並等待來自Web Server的連接。
3、當客戶端請求到達Web Server時,FastCGI進程管理器選擇並連接到一個CGI解釋器。Web server將CGI環境變數和標准輸入發送到FastCGI子進程php-cgi。
4、 FastCGI子進程完成處理後將標准輸出和錯誤信息從同一連接返回Web Server。當FastCGI子進程關閉連接時,請求便告處理完成。FastCGI子進程接著等待並處理來自FastCGI進程管理器(運行在Web Server中)的下一個連接。 在CGI模式中,php-cgi在此便退出了。在上述情況中,你可以想像CGI通常有多慢。每一個Web 請求PHP都必須重新解析php.ini、重新載入全部擴展並重初始化全部數據結構。使用FastCGI,所有這些都只在進程啟動時發生一次。一個額外的 好處是,持續資料庫連接(Persistent database connection)可以工作。APACHE2HANDLER
PHP作為Apache模塊,Apache伺服器在系統啟動後,預先生成多個進程副本駐留在內存中,一旦有請求出 現,就立即使用這些空餘的子進程進行處理,這樣就不存在生成子進程造成的延遲了。這些伺服器副本在處理完一次HTTP請求之後並不立即退出,而是停留在計 算機中等待下次請求。對於客戶瀏覽器的請求反應更快,性能較高。
apache模塊的DLL:
該運行模式是我們以前在windows環境下使用apache伺服器經常使用的,而在模塊化(DLL)中,PHP是與Web伺服器一起啟動並運行的。(是apache在CGI的基礎上進行的一種擴展,加快PHP的運行效率)ISAPI:
ISAPI即Internet Server Application Program Interface,是微軟提供的一套面向Internet服務的API介面
一個ISAPI的DLL,可以在被用戶請求激活後長駐內存,等待用戶的另一個請求,還可以在一個DLL里設置多個用戶請求處理函數,此外,
ISAPI的DLL應用程序和WWW伺服器處於同一個進程中,效率要顯著高於CGI。(由於微軟的排他性,只能運行於windows環境)cli:
cli是php的命令行運行模式,大家經常會使用它,但是可能並沒有注意到(例如:我們在linux下經常使用 「php -m」查找PHP安裝了那些擴展就是PHP命令行運行模式;有興趣的同學可以輸入php -h去深入研究該運行模式)總結:
每種運行模式都有自己的優缺點,沒有絕對的好與壞,主要是看大家處理何種環境。

熱點內容
馬自達編程 發布:2025-01-17 14:21:41 瀏覽:492
android語音demo 發布:2025-01-17 14:19:25 瀏覽:700
點歌機怎麼選切換安卓系統 發布:2025-01-17 14:05:33 瀏覽:720
java壓縮與解壓縮 發布:2025-01-17 14:03:24 瀏覽:926
python代碼保護 發布:2025-01-17 14:02:22 瀏覽:324
王者榮耀電腦如何改戰區安卓 發布:2025-01-17 13:23:18 瀏覽:815
華為手機如何開啟說出密碼 發布:2025-01-17 13:23:12 瀏覽:102
伺服器在美國說明什麼 發布:2025-01-17 13:14:10 瀏覽:12
啟辰t90有哪些配置 發布:2025-01-17 13:05:40 瀏覽:39
手機微博密碼怎麼改密碼忘了怎麼辦 發布:2025-01-17 13:04:44 瀏覽:960