Pfinal框架更新

Jun 06, 2016 pm 07:35 PM
できる 拡大する 更新する 機構 フレーム

本次更新点: 1.添加了扩展机制,可以自定义扩展 通过提供一个{$extensionName}Context.php的类,在启动配置中将上述扩展添加到系统,则可以实现扩展功能 2.添加了RPC模块,Pfinal_Remoting_Curl,提供基于权重的RR轮训调用策略 3.PfinalModelAbstract中添加

本次更新点:
1. 添加了扩展机制,可以自定义扩展
通过提供一个{$extensionName}Context.php的类,在启动配置中将上述扩展添加到系统,则可以实现扩展功能
2. 添加了RPC模块,Pfinal_Remoting_Curl,提供基于权重的RR轮训调用策略
3. PfinalModelAbstract中添加了数据库分布式策略,默认提供了一个MasterSlave策略,方便读写分离,可自行实现分库 PFinal
<?php
class CaptchaConfig extends Pfinal_Config_Base{
	/* (non-PHPdoc)
	 * @see Pfinal_Config_Base::configConstant()
	 */
	public function configConstant(Pfinal_Config_Constant $me) {
		// TODO Auto-generated method stub
		$me->setDevMode(Pfinal_Config_Constant::MODE_PRODUCT);
	}

	/* (non-PHPdoc)
	 * @see Pfinal_Config_Base::configRoute()
	 */
	public function configRoute(Pfinal_Config_Route $me) {
		// TODO Auto-generated method stub
		
	}

	/* (non-PHPdoc)
	 * @see Pfinal_Config_Base::configPlugin()
	 */
	public function configPlugin(Pfinal_Config_Plugin $me) {
		// TODO Auto-generated method stub
		$conf = array(
			'master'=>array(
				array('host'=>'127.0.0.1','port'=>3306,'user'=>'root','database'=>'test','passwd'=>'121'),
				array('host'=>'127.0.0.1','port'=>3306,'user'=>'root','database'=>'test','passwd'=>'567'),
			),
			'slave'=>array(
				array('host'=>'127.0.0.1','port'=>3306,'user'=>'root','database'=>'test','passwd'=>'aaa'),
				array('host'=>'127.0.0.1','port'=>3306,'user'=>'root','database'=>'test','passwd'=>'bbb'),
			),
		);
		$dbTest = new Pfinal_Plugin_DbConnection(new Pfinal_Model_Proxy_MasterSlave($conf));
		$active = new Pfinal_Plugin_ActiveRecord();
		$active->add('test', $dbTest);
		$me->add($dbTest);
		$me->add($active);
	}

	/* (non-PHPdoc)
	 * @see Pfinal_Config_Base::configExtension()
	 */
	public function configExtension(Pfinal_Config_Extension $me) {
		// TODO Auto-generated method stub
		$me->addExtension(LIB.DIRECTORY_SEPARATOR.'common');
	}

	/* (non-PHPdoc)
	 * @see Pfinal_Config_Base::configInterceptor()
	 */
	public function configInterceptor() {
		// TODO Auto-generated method stub
		
	}

	/* (non-PHPdoc)
	 * @see Pfinal_Config_Base::configHandler()
	 */
	public function configHandler() {
		// TODO Auto-generated method stub
		
	}

	
}
ログイン後にコピー
<?php 
class Pfinal_Model_Proxy_MasterSlave implements Pfinal_Model_Proxy_Strategy{
	
	protected $masterAdapters;
	
	protected $slaveAdapters;
	
	protected $adapter;
	
	public function __construct($dbConf,$adapter = 'mysql'){
		if (empty($dbConf)){
			throw new Pfinal_Exception_Argument("invalid master/slave dbconf", -1);
		}
		$this->adapter = $adapter;
		
		if (isset($dbConf['master'])&&!empty($dbConf['master'])){
			foreach ($dbConf['master'] as $conf){
				$this->cacheConnection($conf,$this->masterAdapters);
			}
		}
		if (isset($dbConf['slave'])&&!empty($dbConf['slave'])){
			foreach ($dbConf['slave'] as $conf){
				$this->cacheConnection($conf,$this->slaveAdapters);
			}
		}
		
	}
	
	/* (non-PHPdoc)
	 * @see Pfinal_Model_Proxy_Strategy::getAdapterProxy()
	 */
	public function getAdapterProxy(Pfinal_Model_Statement $stm) {
		// TODO Auto-generated method stub
		if ($stm instanceof Pfinal_Model_Selector){
			shuffle($this->slaveAdapters);
			$adapter = end($this->slaveAdapters);
			
		}
		
		if ($stm instanceof Pfinal_Model_Update || $stm instanceof Pfinal_Model_Insert || $stm instanceof Pfinal_Model_DDL){
			shuffle($this->masterAdapters);
			$adapter = end($this->masterAdapters);
		}
		return $adapter;
	}

	protected function cacheConnection($conf,&$pool){
		if (!is_array($pool)){
			$pool = array();
		}
		$host = $conf['host'];
		$port = $conf['port'];
		$user = $conf['user'];
		$passwd = $conf['passwd'];
		$database = $conf['database'];
		$instance = null;
		switch ($this->adapter){
			case 'mysql':
			default:
				$instance = new Pfinal_Model_Adapter_RMDBS();
				$instance->init($conf);
				break;
			
		}
		if (null===$instance){
			throw new Pfinal_Exception_Argument("unknow adaptername:{$this->adapter}", -1);
		}
		$key = md5(sprintf('%s:%s:%s:%s:%s',$host,$port,$user,$passwd,$database));
		$pool[$key] = $instance;
	}
	
}
ログイン後にコピー
<?php
/**
 * permision模块
 */
define ( 'EXTENSION_NAME', 'common' );
define ( 'VERSION', '1.0' );

define ( 'COMMON_DIR', dirname ( __FILE__ ) );

set_include_path ( get_include_path () . PATH_SEPARATOR . implode ( PATH_SEPARATOR, array (
COMMON_DIR
) ) );

class CommonContext implements Pfinal_Extension_Interface{
	/* (non-PHPdoc)
	 * @see Pfinal_Extension_Interface::bootstrap()
	 */
	public function bootstrap() {
		// TODO Auto-generated method stub
		
	}

	/* (non-PHPdoc)
	 * @see Pfinal_Extension_Interface::autoload()
	 */
	public function autoload($classname) {
		// TODO Auto-generated method stub
		$dirs = array(
				COMMON_DIR.DIRECTORY_SEPARATOR.'util',
				COMMON_DIR.DIRECTORY_SEPARATOR.'interceptor',
		);
		foreach ($dirs as $dir){
			$file = $dir.DIRECTORY_SEPARATOR.$classname.'.php';
			if (is_file($file)){
				require_once $file;
				return true;
			}
		}
		return false;
	}

	
}
ログイン後にコピー
<?php
class Test_Model extends PfinalModelAbstract{
	
	public function __construct($ormEnable){
		$this->tableName = 'test';
		$this->databaseName = 'test';
		parent::__construct($ormEnable);
	}
	
	public function add(){
		$this
			->set('id', 3)
			->set('name', StringUtil::MysqlEscapeString("adad'\\\n231'"))
			->save();
	}
	
	public function getXX($id){
		return $this->findById($id);
	}
}
ログイン後にコピー
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Windows は指定されたデバイス、パス、またはファイルにアクセスできません Windows は指定されたデバイス、パス、またはファイルにアクセスできません Jun 18, 2024 pm 04:49 PM

友人のコンピュータにはこのような障害があり、「この PC」と C ドライブのファイルを開くと、「Explorer.EXE Windows は指定されたデバイス、パス、またはファイルにアクセスできません。プロジェクトにアクセスするための適切な権限がない可能性があります。」と表示されます。フォルダ、ファイル、このコンピュータ、ごみ箱などを含め、ダブルクリックするとこのようなウィンドウが表示されますが、通常は右クリックで開きます。システムのアップデートが原因でこの状況が発生した場合は、以下のエディターで解決方法を説明します。 1. レジストリ エディターを開いて Win+R と入力し、「regedit」と入力するか、スタート メニューを右クリックして実行し、「regedit」と入力します。 2. レジストリ「Computer\HKEY_CLASSES_ROOT\PackagedCom\ClassInd」を見つけます。

Windows が更新を永久に一時停止し、Windows が自動更新をオフにする Windows が更新を永久に一時停止し、Windows が自動更新をオフにする Jun 18, 2024 pm 07:04 PM

Windows アップデートにより、次の問題が発生する可能性があります。 1. 互換性の問題: 一部のアプリケーション、ドライバー、またはハードウェア デバイスは、新しい Windows アップデートと互換性がなく、適切に動作しなかったり、クラッシュしたりする可能性があります。 2. パフォーマンスの問題: Windows アップデートにより、システムが遅くなったり、パフォーマンスが低下したりする場合があります。これは、新機能または改善により、実行するためにより多くのリソースが必要になることが原因である可能性があります。 3. システムの安定性の問題: 一部のユーザーは、Windows 更新プログラムをインストールした後、システムで予期しないクラッシュやブルー スクリーン エラーが発生する可能性があると報告しました。 4. データ損失: まれに、Windows アップデートによりデータ損失やファイル破損が発生する場合があります。このため、重要な更新を行う前に、バックアップを作成してください。

Java フレームワークの商用サポートの費用対効果を評価する方法 Java フレームワークの商用サポートの費用対効果を評価する方法 Jun 05, 2024 pm 05:25 PM

Java フレームワークの商用サポートのコスト/パフォーマンスを評価するには、次の手順が必要です。 必要な保証レベルとサービス レベル アグリーメント (SLA) 保証を決定します。研究サポートチームの経験と専門知識。アップグレード、トラブルシューティング、パフォーマンスの最適化などの追加サービスを検討してください。ビジネス サポートのコストと、リスクの軽減と効率の向上を比較検討します。

PHP フレームワークの軽量オプションはアプリケーションのパフォーマンスにどのような影響を与えますか? PHP フレームワークの軽量オプションはアプリケーションのパフォーマンスにどのような影響を与えますか? Jun 06, 2024 am 10:53 AM

軽量の PHP フレームワークは、サイズが小さくリソース消費が少ないため、アプリケーションのパフォーマンスが向上します。その特徴には、小型、高速起動、低メモリ使用量、改善された応答速度とスループット、および削減されたリソース消費が含まれます。 実際のケース: SlimFramework は、わずか 500 KB、高い応答性と高スループットの REST API を作成します。

Golang フレームワークのドキュメントのベスト プラクティス Golang フレームワークのドキュメントのベスト プラクティス Jun 04, 2024 pm 05:00 PM

明確で包括的なドキュメントを作成することは、Golang フレームワークにとって非常に重要です。ベスト プラクティスには、Google の Go コーディング スタイル ガイドなど、確立されたドキュメント スタイルに従うことが含まれます。見出し、小見出し、リストなどの明確な組織構造を使用し、ナビゲーションを提供します。スタート ガイド、API リファレンス、概念など、包括的で正確な情報を提供します。コード例を使用して、概念と使用法を説明します。ドキュメントを常に最新の状態に保ち、変更を追跡し、新機能を文書化します。 GitHub の問題やフォーラムなどのサポートとコミュニティ リソースを提供します。 API ドキュメントなどの実践的なサンプルを作成します。

さまざまなアプリケーションシナリオに最適な Golang フレームワークを選択する方法 さまざまなアプリケーションシナリオに最適な Golang フレームワークを選択する方法 Jun 05, 2024 pm 04:05 PM

アプリケーションのシナリオに基づいて最適な Go フレームワークを選択します。アプリケーションの種類、言語機能、パフォーマンス要件、エコシステムを考慮します。一般的な Go フレームワーク: Jin (Web アプリケーション)、Echo (Web サービス)、Fiber (高スループット)、gorm (ORM)、fasthttp (速度)。実際のケース: REST API (Fiber) の構築とデータベース (gorm) との対話。フレームワークを選択します。主要なパフォーマンスには fasthttp、柔軟な Web アプリケーションには Jin/Echo、データベース インタラクションには gorm を選択してください。

PHP フレームワークの学習曲線は他の言語フレームワークと比較してどうですか? PHP フレームワークの学習曲線は他の言語フレームワークと比較してどうですか? Jun 06, 2024 pm 12:41 PM

PHP フレームワークの学習曲線は、言語熟練度、フレームワークの複雑さ、ドキュメントの品質、コミュニティのサポートによって異なります。 PHP フレームワークの学習曲線は、Python フレームワークと比較すると高く、Ruby フレームワークと比較すると低くなります。 Java フレームワークと比較すると、PHP フレームワークの学習曲線は中程度ですが、開始までの時間は短くなります。

Google Chromeをアップデートする方法 Google Chromeをアップデートする方法 Jul 20, 2024 am 12:26 AM

ブラウザのアップデートやアップグレードは珍しいことではありません。オンラインで遭遇する問題の中には、システムのアップデートが間に合わないことが原因である場合もあります。安定した更新により、ブラウザーを正常に使用できるようになり、ブラウザー内の機能をより適切に使用して、ブラウザーのパフォーマンスを最大化することができます。では、Google Chrome を更新するにはどうすればよいでしょうか?このサイトでは、皆様の問題を解決するために Google Chrome を更新する方法を紹介します。 Google Chrome を更新する最初のステップ: Chrome ブラウザを開き、右上隅にある [3 つの点] をクリックします。 (図に示すように) ステップ 2: メニューのドロップダウンで [設定] をクリックしてに入ります。 (図に示すように) ステップ 3: 右側で [Chrome について] を見つけ、クリックして入力します。 (図に示すように) ステップ 4: Chrome ブラウザが自動的にアップデートを確認してインストールします。 (写真に示すように

See all articles