如何解决这个问题,建立唯一的数据库连接是必要的方式。
又如何知道与这个数据库的连接是否已经建立? 还是需要现在建立?
单例模式可以解决这个问题。
先假设我们需要一个类完成在内存中只有一份的功能,我们该如何做呢?
我们一步一步的使用前面学过的知识来写一个单例的例子。
前面学过,每次用 new 类名 的方式,就可以创建一个对象。我们必须禁止外部程序用 new 类名的方式来创建多个实例。
解决办法:将构造函数设置成 private ,让构造函数只能在内部被调用,而外部不能调用。这样,这个类就不能被外部用 new 的方式建立多个实例了。
以下是不能被外部用new实例化的类。
class A{
private function __construct(){}
}
$a = new A();
?>
程序运行结果为:
Fatal error: Call to private A::__construct() from invalid context in E:\PHPProjects\test.php on line 6
我们已经禁止外部用new实例化这个类,我们改如何让用户访问这个类呢?前门堵了,我们需要给用户留个后门。
解决办法是:static 修饰的方法,可以不经实例化一个类就可以直接访问这个方法。
//不能用new实例化的类.<br>
//static的方法留给外部访问.<br>
//在方法内部返回实例.<br><br>
class A{
private function __construct(){}
static function getClassA(){
$a = new A();
return $a;
}
}
// 看到这里确实返回的是 A 的实例.但不是同一个对象.
$a1 = A::getClassA();
$a2 = A::getClassA();
echo "\$a1 的类是 ".get_class($a1)." , \$a2 是 ".get_class($a1);
if($a1 === $a2){
echo "<br> \$a1 \$a2 指向同一对象.";
}else{
echo "<br> \$a1 \$a2 不是一个对象.";
}
?>
程序运行结果为:
$a1 的类是 A , $a2 是 A
$a1 $a2 不是一个对象.
我们已经通过static方法返回了A的实例。但还有问题。我们如何保证我们多次操作获得的是同一个实例的呢?
解决办法:
static的属性在内部也只有一个。
static 属性能有效的被静态方法调用。将这个属性也设置成private,以防止外部调用。
先将这个属性设置成 null。每次返回对象前,先判断这个属性是否为 null 。
如果为 null 就创建这个类的新实例,并赋值给这个 static 属性。如果不为空,就返回这个指向实例的 static 属性。
//不能用new实例化的类.<br>
//static的方法留给外部访问.<br>
//在方法内部返回实例.<br>
//定义静态属性保证这个实例能被静态方法调用.<br>
//增加判断部分.<br><br>
class A{
private static $a = null;
private function __construct(){}
static function getClassA(){
if( null == self::$a){
self::$a = new A();
}
return self::$a;
}
}
// 看到这里确实返回的是 A 的实例.但不是同一个对象.
$a1 = A::getClassA();
$a2 = A::getClassA();
echo "\$a1 的类是 ".get_class($a1)." , \$a2 是 ".get_class($a1);
if($a1 === $a2){
echo "<br> \$a1 \$a2 指向同一对象.";
}else{
echo "<br> \$a1 \$a2 不是一个对象.";
}
?>
程序运行结果为:
$a1 的类是 A , $a2 是 A
$a1 $a2 指向同一对象.
到此,我们写了一个最简单的单例模式 。
现在,你可以尝试写一个应用单例设计模式的数据库连接类。
要记住单例模式的使用效果和书写方式。
您可能感兴趣的文章:
php单例模式为何只能实例化一次
php设计模式之单例模式的实例代码
php常用设计模式之工厂模式与单例模式介绍
学习php设计模式之单例模式
php实现的单例模式的例子
学习php单例模式及应用实例
php单例模式的演示代码
有关php单例模式介绍及例子
php单例模式的例子
php读取sphinx的例子,有需要的朋友可以参考下。
1.未采用mysql二进制网络协议的代码:
//检查sphinx是否能连接,不能重试两次,能则连接,不用mysql协议,仅供参考
function checkSphinxNoMysql() {
$flag = true;
$retries = 0;
while ( $flag && $retries < 2 ) {
$s = new SphinxClient ();
$s->setServer ( $_ENV ['db_host'], $_ENV ['current_sphinx_port'] );
if (! $s->open ()) {
//此处为如果连接不上就更改配置文件,根据项目需要来写
//global $configDefault;
//updateConfig ( $configDefault );
$retries ++;
} else {
$flag = false;
break;
}
}
return $s;
if ($retries >= 2) {
//sendemail or not
return false;
}
}
$order_column = 'id DESC,time DESC';//排序规则
//$s = checkSphinx ();
$s = new SphinxClient ();
$s->setServer ( 'sphinx_host', 'sphinx_port');
//以上两句代码亦可使用$s = checkSphinx ();来代替
$indexname = "page_keyword";//索引名字
$s->setMatchMode ( SPH_MATCH_PHRASE );
$s->SetSortMode ( SPH_SORT_EXTENDED, $order_column );
$s->setMaxQueryTime ( 100000 );
$s->setLimits ( 0, $limit_total, $limit_total );
$keyword_sphinx = iconv ( "gbk", "utf-8", $keyword );
$result = $s->query ( $keyword_sphinx, $indexname );
$s->close ();
if ($result ['total'] > 0) {
var_dump($result ['matches']);
//根据打印出的结果进行相应的读取
}
?>
2.采用mysql二进制网络协议的代码:
//检查sphinx是否能连接,不能重试两次,能则连接,用mysql14协议
protected function checkSphinx() {
$flag = true;
$retries = 0;
while ( $flag && $retries < 2 ) {
$conn = mysql_connect() ( "{$_ENV ['db_host']}:{$_ENV ['current_sphinx_port']}" );
if (! $conn) {
//此处为如果连接不上就更改配置文件,根据项目需要来写
//global $configDefault;
//updateConfig ( $configDefault );
$retries ++;
} else {
$flag = false;
break;
}
}
if ($retries >= 2) {
die ( "Please contact with administrator." );
}
return $conn;
}
$order_column = 'id DESC,time DESC';//排序规则
$conn = mysql_connect ( "sphinx_host:sphinx_port" );
//以上代码亦可使用$conn = checkSphinx ();来代替
if (! $conn) {
return - 1;//连接不上返回状态
}
$keyword_sphinx = iconv ( "gbk", "utf-8", $keyword );
//keyword为索引名字
$sql = "select * from keyword where match('{$keyword_sphinx}') order by {$order_column} limit {$limit_total} option max_matches={$limit_total}";
$result = @mysql_query() ( $sql, $conn );
$i = 0;
while ( ($row = mysql_fetch_array ( $result )) !== false ) {
var_dump($row);
//根据打印出的结果进行相应的读取
}
$totals = $this->getTotalFound ($conn);//获取总记录个数
?>
如何获取总记录个数参考:sphinxql如何得到结果数?show meta的详细说明?
简单安装php-fpm,仅供参考。
1:下载最新版本的php:http://www.php.org
2:解压安装
tar -jxvf php-5.3.5.tar.bz2
cd php-5.3.5
./configure --prefix=/usr/local/php-fpm --enable-fpm --enable-mbstring=all --enable-sockets
--enable-ftp --enable-pcntl --with-mysql=mysqlnd--with-pdo-mysql=mysqlnd
--with-mcrypt --with-freetype-dir --with-jpeg-dir --with-png-dir
--with-gd --enable-gd-native-ttf --with-curl --with-zlib
make && make install
3:修改配置
cd /usr/local/php-fpm/etc/
cp php-fpm.conf.default php-fpm.conf
安装完成。
您可能感兴趣的文章:
nginx中php-fpm调优方法
centos 5.6中安装nginx+mysql+php(php-fpm)
nginx+php-fpm页面显示空白的解决方法
有关nginx+php-fpm配置文件的组织结构
nginx php(php-fpm)上传大文件的设置
在nginx中查看php-fpm工作状态