单例模式
:使得类的一个对象成为系统中的唯一实例.
PHP中使用单例模式最常见的就是数据库操作了.避免在系统中有多个连接数据库的操作,浪费系统资源的现象,就可以使用单例模式.每次对数据库操作都使用一个实例.
简单示例
class
AClass
{
//
用来存储自己实例
public
static
$instance;
私有化构造函数,防止外界实例化对象
private
function
__construct()
{}
私有化克隆函数,防止外界克隆对象
__clone()
静态方法,单例访问统一入口
getInstance()
if
(!(self::$instance
instanceof
self)){
self::$instance
=
new
self();
}
return
self::$instance;
test
test()
"done";
BClass
extends
AClass{
获取实例
$aclass
AClass::getInstance();
$bclass
BClass::getInstance();
调用方法
echo
$aclass-test();
对一些比较大型的应用来说,可能连接多个数据库,那么不同的数据库公用一个对象可能会产生问题,比如连接句柄的分配等,我们可以通过给$instance变成数组,通过不同的参数来控制
DB
$instance
array();
$conn;
__construct($host,
$username,
$password,
$dbname,
$port)
$this-conn
mysqli($host,
$port);
getInstance($host,
$key
$host.":".$port;
(!(self::$instance[$key]
self::$instance[$key]
self($host,
$port);#实例化
self::$instance[$key];
//query
query($ql)
$this-conn-query($sql);
//释放资源
__destruct(){
$this-conn-close();
本文实例讲述了PHP利用pdo_odbc实现连接数据库.分享给大家供大家参考,具体如下:
目的:从sql
server数据库里面把某个视图文件调用出来,以键值对的方式显示在页面上.
利用pdo
odbc来实现PHP连接数据库:
在PHP配置文件里面开启pdo_odbc.dll服务.重启Apache服务器.
代码如下:
php
[
数据库类型
'type'
'sqlsrv',
服务器地址
'hostname'
'localhost',
数据库名
'database'
'mysql',
用户名
'username'
'sa',
密码
'password'
端口
'hostport'
'',
连接dsn
'dsn'
'odbc:Driver={SQL
Server};Server=localhost;Database=mysql',
数据库连接参数
'params'
[],
'charset'
数据库表前缀
'prefix'
数据库调试模式
'debug'
true,
数据库部署方式:0
集中式(单一服务器),1
分布式(主从服务器)
'deploy'
0,
数据库读写是否分离
主从式有效
'rw_separate'
false,
读写分离后
主服务器数量
'master_num'
指定从服务器序号
'slave_no'
是否严格检查字段是否存在
'fields_strict'
数据集返回类型
'resultset_type'
'array',
自动写入时间戳字段
'auto_timestamp'
时间字段取出后的默认时间格式
'datetime_format'
'Y-m-d
H:i:s',
是否需要进行SQL性能分析
'sql_explain'
Builder类
'builder'
Query类
'query'
'\\think\\db\\Query',
是否需要断线重连
'break_reconnect'
断线标识字符串
'break_match_str'
];
在控制器controller里面建一个控制文件Test.php
namespace
app\index\controller;
use
think\Db;
think\Controller;
Test
Controller
zz(){
json_encode($data);
最后调用入口文件即可访问.
我的效果:
更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:< FrameWork框架入门教程>>及< 希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助. 搭建好php开发环境,这个就不多讲了,能找单例模式的应该有一定的php基础 新建一个database.php文件存放数据库信息 $db = array( 'host'='localhost',//地址 'user'='root',//数据库用户名 'password'='root',//数据库密码 'database'='ceshi',//数据库名 ) 新建Mysql.class.php编写数据库连接类操作类添加需要的属性和构造方法 构造函数加载数据库配置文件连接数据库 class db { public $conn; public static $sql; public static $instance=null; private function __construct(){ require_once('database.php'); $this-conn = mysqli_connect($db['host'],$db['user'],$db['password']); if(!mysqli_select_db($this-conn,$db['database'])){ echo "失败"; }; 这样试试吧如果你对php这类有兴趣的话,可以和我一样在后盾人经常看看教材,自己多看几遍,慢慢的以后就明白了,希望能帮到你,给个采纳吧谢谢 本文实例讲述了PHP基于单例模式实现的数据库操作基类.分享给大家供大家参考,具体如下: 配置文件: $db array( 'host'='localhost', 'user'='root', 'password'='', 'database'='test', 数据库基类: db $sql; $instance=null; __construct(){ require_once('db.config.php'); mysql_connect($db['host'],$db['user'],$db['password']); if(!mysql_select_db($db['database'],$this-conn)){ "失败"; mysql_query('set names getInstance(){ if(is_null(self::$instance)){ db; /** * 查询数据库 */ select($table,$condition=array(),$field array()){ $where=''; if(!empty($condition)){ foreach($condition as $k=$v){ $where.=$k."='".$v."' and "; $where='where '.$where .'1=1'; $fieldstr ''; if(!empty($field)){ foreach($field $fieldstr.= $v.','; rtrim($fieldstr,','); }else{ '*'; self::$sql "select {$fieldstr} from {$table} {$where}"; $result=mysql_query(self::$sql,$this-conn); $resuleRow $i 0; while($row=mysql_fetch_assoc($result)){ foreach($row $resuleRow[$i][$k] $v; $i++; $resuleRow; 添加一条记录 insert($table,$data){ $values $datas foreach($data $values.=$k.','; $datas.="'$v'".','; rtrim($values,','); rtrim($datas,','); "INSERT INTO ({$values}) VALUES ({$datas})"; if(mysql_query(self::$sql)){ mysql_insert_id(); false; 修改一条记录 update($table,$data,$condition=array()){ $updatastr if(!empty($data)){ $updatastr.= $k."='".$v."',"; 'set '.rtrim($updatastr,','); "update {$updatastr} mysql_query(self::$sql); 删除记录 delete($table,$condition){ "delete getLastSql(){ self::$sql; db::getInstance(); //$list $db-select('demo',array('name'='tom','password'='ds'),array('name','password')); //echo db::getLastSql(); "pre"; 更多关于PHP操作数据库相关内容感兴趣的读者可查看本站专题:< 希望本文所述对大家PHP程序设计有所帮助. PHP的轻量消息队列php-resque使用说明 消息队列处理后台任务带来的问题 为了实现类似的需求,Web项目中一般的实现方法是使用消息队列(Message Queue),比如MemcacheQ,RabbitMQ等等,都是很著名的产品. 消息队列说白了就是一个最简单的先进先出队列,队列的一个成员就是一段文本.正是因为消息队列实在太简单了,当拿着消息队列时,反而有点无从下手的感觉,因为这仅仅一个发送邮件的任务,就会引申出很多问题: 消息队列只能存储字符串类型的数据,如何将一个发送邮件这样的"任务",转换为消息队列中的一个"消息"? 消息队列只负责数据的存放与进出,本身不能执行任何程序,那么我们要如何从消息队列中一个一个取出数据,再将这些数据转化回任务并执行. 我们无法预知消息队列何时会有数据产生,所以我们的任务执行程序还需要具备监控消息队列的能力,也就是一个常驻后台的守护进程. 一般的Web应用PHP都以cgi方式运行,无法常驻内存.我们知道php还有cli模式,那么守护进程是否能以php cli来实现,效率如何? 当守护进程运行时,Web应用能否与后台守护进程交互,实现开启/杀死进程的功能以及获得进程的运行状态? Resque对后台任务的设计与角色划分 对以上这些问题,目前为止我能找到的最好答案,并不是来自php,而是来自Ruby的项目Resque,正是由于Resque清晰简单的解决了后台任务带来的一系列问题,Resque的设计也被Clone到Python、php、NodeJs等语言:比如Python下的pyres以及PHP下的php-resque等等,这里有各种语言版本的Resque实现,而在本篇日志里,我们当然要以PHP版本为例来说明如何用php-resque运行一个后台任务,可能一些细节方面会与Ruby版有出入,但是本文中以php版为准. Resque是这样解决这些问题的: 后台任务的角色划分 其实从上面的问题已经可以看出,只靠一个消息队列是无法解决所有问题的,需要新的角色介入.在Resque中,一个后台任务被抽象为由三种角色共同完成: Job | 任务 : 一个Job就是一个需要在后台完成的任务,比如本文举例的发送邮件,就可以抽象为一个Job.在Resque中一个Job就是一个Class. Queue | 队列 : 也就是上文的消息队列,在Resque中,队列则是由Redis实现的.Resque还提供了一个简单的队列管理器,可以实现将Job插入/取出队列等功能. Worker | 执行者 : 负责从队列中取出Job并执行,可以以守护进程的方式运行在后台. 那么基于这个划分,一个后台任务在Resque下的基本流程是这样的: 将一个后台任务编写为一个独立的Class,这个Class就是一个Job. 在需要使用后台程序的地方,系统将Job Class的名称以及所需参数放入队列. 以命令行方式开启一个Worker,并通过参数指定Worker所需要处理的队列. Worker作为守护进程运行,并且定时检查队列. 当队列中有Job时,Worker取出Job并运行,即实例化Job Class并执行Class中的方法. 至此就可以完整的运行完一个后台任务. 在Resque中,还有一个很重要的设计:一个Worker,可以处理一个队列,也可以处理很多个队列,并且可以通过增加Worker的进程/线程数来加快队列的执行速度. php-resque的安装 需要提前说明的是,由于涉及到进程的开辟与管理,php-resque使用了php的PCNTL函数,所以只能在Linux下运行,并且需要php编译PCNTL函数.如果希望用Windows做同样的工作,那么可以去找找Resque的其他语言版本,php在Windows下非常不适合做后台任务. apt-get install redis-server 安装Composer apt-get install curl cd /usr/local/bin curl -s | phpchmod a+x composer.phar alias composer='/usr/local/bin/composer.phar' 使用Composer安装php-resque 假设web目录在/opt/htdocs apt-get install git git-core cd /opt/htdocs git clone git://github.com/chrisboulton/php-resque.gitcd php-resque composer install php-resque的使用 编写一个Worker 其实php-resque已经给出了简单的例子, demo/job.php文件就是一个最简单的Job: class PHP_Job public function perform() fwrite(STDOUT, 'Hello!'); 在Resque的设计中,一个Job必须存在一个perform方法,Worker则会自动运行这个方法. 将Job插入队列 php-resque也给出了最简单的插入队列实现 demo/queue.php: if(empty($argv[1])) { die('Specify the name of a job to add. e.g, php queue.php PHP_Job');} require __DIR__ . '/init.php'; date_default_timezone_set('GMT'); $args = array( 'time' = time(), 'array' = array( 'test' = 'test', ), ); $jobId = Resque::enqueue('default', $argv[1], $args, true);echo "Queued job ".$jobId."\n\n"; 在这个例子中,queue.php需要以cli方式运行,将cli接收到的第一个参数作为Job名称,插入名为'default'的队列,同时向屏幕输出刚才插入队列的Job Id.在终端输入: php demo/queue.php PHP_Job 结果可以看到屏幕上输出: php-resque同样提供了查看Job运行状态的例子,直接运行: 运行Worker 这次我们直接编写demo/resque.php: require 'job.php'; require '../bin/resque'; 可以看到一个Worker至少需要两部分: 可以直接包含Job类文件,也可以使用php的自动加载机制,指定好Job Class所在路径并能实现自动加载包含Resque的默认Worker: bin/resque 在终端中运行: QUEUE=default php demo/resque.php 前面的QUEUE部分是设置环境变量,我们指定当前的Worker只负责处理default队列.也可以使用QUEUE=* php demo/resque.php 来处理所有队列. 运行后输出为 #!/usr/bin/env php *** Starting worker 用ps指令检查一下: ps aux | grep resque 可以看到有一个php的守护进程已经在运行了 至此我们已经成功的完成了一个最简单的Resque实例的全部演示,更复杂的情况以及遗留的问题会在下一次的日志中说明. 当然是重新连接了,你是跳转不是包含. 跳转两者之间共享值要专门的传值操作,cookie\ session\ POST/GET \静态输出单例模式 数据库 php 怎么用
PHP基于单例模式实现的数据库操作基类
在php队列php-resque里头使用了数据库的单例模式显示MySQL server has gone away
php中连接数据库,使用单例模式遇到的问题