首页 php教程 php手册 Pfinal框架更新

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 Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Windows无法访问指定设备、路径或文件 Windows无法访问指定设备、路径或文件 Jun 18, 2024 pm 04:49 PM

小伙伴电脑出现这样的故障,打开“此电脑”和C盘文件会提示“Explorer.EXEWindows无法访问指定设备、路径或文件。你可能没有适当的权限访问访问该项目。”包括文件夹、文件、此电脑、回收站等,双击都会弹出这样的窗口,右键打开又是正常的。这是系统更新导致,如果你也遇到这样的情况,下面小编教大家如何解决。一,打开注册表编辑器Win+R,输入regedit,或右键开始菜单运行输入regedit;二,定位注册表“计算机\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创建RESTAPI,仅500KB,高响应性、高吞吐量

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框架:Gin(Web应用)、Echo(Web服务)、Fiber(高吞吐量)、gorm(ORM)、fasthttp(速度)。实战案例:构建RESTAPI(Fiber),与数据库交互(gorm)。选择框架:性能关键选fasthttp,灵活Web应用选Gin/Echo,数据库交互选gorm。

PHP 框架的学习曲线与其他语言框架相比如何? PHP 框架的学习曲线与其他语言框架相比如何? Jun 06, 2024 pm 12:41 PM

PHP框架的学习曲线取决于语言熟练度、框架复杂性、文档质量和社区支持。与Python框架相比,PHP框架的学习曲线更高,而与Ruby框架相比,则较低。与Java框架相比,PHP框架的学习曲线中等,但入门时间较短。

谷歌浏览器如何更新 谷歌浏览器如何更新 Jul 20, 2024 am 12:26 AM

浏览器更新升级并不少见,我们上网遇到的一些问题也许就是系统没能及时更新造成的。稳定地更新才能保证浏览器使用正常,我们也才能更好使用里面的功能,最大程度发挥浏览器性能。那么谷歌浏览器如何更新?本站为大家带来谷歌浏览器更新的方法,解决大家的困难。谷歌浏览器更新的方法第一步:打开Chrome浏览器,点击右上角【三个点】。(如图所示)第二步:点击菜单下拉中的【设置】进入。(如图所示)第三步:找到右侧的【关于Chrome】,点击进入。(如图所示) 、第四步:Chrome浏览器会自动检查并安装更新。(如图所

See all articles