Main Content RSS FeedArticles Entry

"__autoload" 进一步理解

上次说过 "__autoload" 的用法--------自动加载对象所需的类文件

原本我理解为当使用 new 产生一个对象时如果没有手动加载这个类的话,将使用 __autoload方法查找并加载此类.后面发现如果A类是一个抽象类,B类继承于A类. 这个时候如果没有手动加载A类. 那么__autoload方法也会自动加载这个抽象类A.

代码如下
  1. // include/class_A.php
  2. class A
  3. {
  4.     var $asd = '<br />father<br />';
  5.     public function __construct(){
  6.  
  7.     }
  8. }
  9.  
  10. // include/class_B.php
  11. class B extends A
  12. {
  13.     public function __construct(){
  14.         echo $this->asd;
  15.     }
  16. }
  17.  
  18. //index.php
  19. function __autoload($class){
  20.     require_once(ROOT_PATH.'include/class_'.$class.'.php');
  21. }
  22.  
  23. $a = new B();

有节省手动加载类的麻烦事了.

mysql_connect()和mysql_pconnect()区别

mysql_connect()是我们常用的打开Mysql数据库连接的函数.  

代码如下
  1. mysql_connect(server,user,pwd)


  这个函数打开的是非持久的 MySQL 连接. 当脚本一结束, 到服务器的连接就被关闭. 如果想提前关闭连接可以使用mysql_close().

而mysql_pconnect()是打开一个到 MySQL 服务器的持久连接的方法.  

代码如下
  1. mysql_pconnect(server,user,pwd)


mysql_pconnect()与mysql_connect()的主要区别在于当连接的时候mysql_pconnect()函数将先尝试寻找一个在同一个主机上用同样的用户名和密码已经打开的(持久)连接, 如果找到, 则返回此连接标识而不打开新连接.
其次, 当脚本执行完毕后到 SQL 服务器的连接不会被关闭, 此连接将保持打开以备以后使用(mysql_close() 不会关闭由 mysql_pconnect() 建立的连接).  

其实在CGI方式下 这两种连接并没有什么区别, 在CGI模式下每个PHP访问都为一个进程, 访问结束后进程也就结束了, 所有的资源也都被施放了.

但php以apache模块方式运行时, 由于apache有使用进程池, 一个httpd进程结束后会被放回进程池, 这也就使得用pconnect打开的的那个mysql连接资源不被释放, 于是有下一个连接请求时就可以被复用. 所以在apache并发访问量不大的时候, 由于使用了mysql_pconnect(), php节省了反复连接db的时间,  使得访问速度加快.

但是当并发数很大时就容易产生mysql_pconnect()还在处理任务时, 新的请求来到, 于是又建立一个持续连接.由于这个连接并不会在程序结束时关闭.所以会一直存在.当某一时刻并发数超过Mysql连接上限时就会产生很多访问变为连接超时.

所以如何选用在于最后程序部署的环境以及网站的并发量.所以Discuz有个选项就是让站长们自己来衡量自己的网站再来选取数据库连接的方式.

这几天折腾死我了

前几天把我的Xlog放到服务器上去运行,前台一切正常,当我准备登录后台写点东西时却发现怎么也登不上去,郁闷死我了,大冷天的汗都热出来了.最后检查发现是mysql_real_escape_string()转义函数出问题了,经由这个函数转义的字符串为空值.网上查了下才知道 当函数未获取到数据库连接时会返回空值,再本地一切正常,换服务器就出这个问题很是老火.

因为我连接数据库用的是new mysqli() 把函数换成mysqli_real_escape_string()也于事无补.
改用mysql_connect()来连接数据库又一切正常,于是我又换了台服务器试,结果这台服务器不支持mysqli 晕死呀,到群里面请教别人也没得出个所以然来.

一再思量决定还是改写我的数据库连接方式,这下工作量大了,MYSQL操作类需要完全重写,而且mysql不支持对象的方式,以往我用mysqli都是以对象的方式来写的. 这下需要在类里面定义所有需要用到的操作了.因为用过程方式生成的数据库连接,在类的外部是看不见的.

于是我郁闷了,决定去玩玩AION.结果不知道出什么问题了  运行不了游戏.哎... 匆忙上线的AION 还是有很多测试工作没完成呀,第一次见到从内测到公测到收费速度这么快的.(但也不得不佩服陈天桥了,抓住了9C,网易,BLZ的纷争,匆忙上线抢占WLK前夕的WOW玩家流失情况,迅速占领市场).

打算重启次电脑再玩AION,看到开机的系统选择,想起璇歌说的马上要发Ubuntu9.04.他已经升级到8.10准备迎接9.04了.反正也无聊,我也去升级到8.10

进去后一路狂升,这个速度呀 1MB/S 太爽了. 更新完了8.04的,换成8.10的源又是一路狂升,重启...

按我以往的记录来看 失败的几率高达90%.嘿嘿 想不到这次竟然成功了. 成功了就满意的去睡觉了,第2天再来解决显卡和声卡的问题.

第2天准备去社区看看高手的解决方案.服务器一直处于当机的状态. 原来是发布9.04了呀  怪不得社区访问不了.

璇歌说他已经下载了9.04的镜像文件了.而且他从8.10升级到9.04失败.从8.04升级到9.04却成功了. 既然他有镜像文件了的话 我就更不担心了,换了个源又从8.10往9.04升去.这次终于把系统升烂了.

直接重装9.04 选择ext4的分区格式来安装.却出现GRUB无法引导进入系统了.用LIVE CD进入系统 把引导区改到linux分区进入linux正常了,于是到/boot/grub/menu.lst里面添加进入WIONDWS的引导. 重启试了试,进入WINDOWS也正常,再重启进linux的时候又傻眼了.又变为WINDOWS的引导方式了.

下了个最新版本的grub4dos-0.4.4 才解决这个问题.http://download.gna.org/grub4dos/

替换以前WINDOWS下的GRUB文件就行了. (注:我的WINDOWS C:盘下没有放menu.lst文件,这样会自动寻找linux下的menu.lst文件)

用GRUB2也能解决不能引导ext4的问题 下载: http://nufans.net/grub4dos/grub2/
方法一样把g2ldr.mbr拷到C:盘下 然后在boot.ini中加入
C:g2ldr.mbr="Start GRUB2"
就行了.

终于好了. 但是我发现这个版本爱死机,社区里面也有很多人反应 而且基本上都是选用ext4分区格式的. 还听说这个分区格式会导致文件丢失. (不知道是真是假,我只知道我正常重启后发现刚刚的QQ聊天记录不在了,汗...)

梦里面 我哭了.

昨晚糊里糊涂的梦,梦得昏天暗地,只依稀记得梦的结尾 我开车撞了运钞车然后就被抓了,但不知道为什么我会被关到铜中门口,几名武警+几名警察持枪守着我,而我也就站在铜中的门口.

后面学校开学了,见到了我的小学同学 初中同学 高中同学.最后还见到Jolin了. 她给了我一个拥抱.然后我笑着告诉他们我坐牢了,还要他们记得来看我. 我哭了.哭得很干脆,哭着哭着我就醒了. 还好只是一场梦.

//---------------------------------F1----------------------------------
昨天的F1第二站马来西亚站的比赛,雪邦赛场突降暴雨(其实不是突降啦,昨天笼罩在赛场上空的乌云让选手都看不清楚路线咯),一场暴雨打乱了整个比赛 比赛提前结束,巴顿又强势夺冠.这个当年英国的希望之星再沉默几年后终于再度爆发了.难道罗斯-布朗真的是神吗? 在法拉利担任技术总监时,联手托德与舒米 创造了法拉利非凡的创举,也成就了舒米无上的荣耀.
离开法拉利的布朗,去年加入本田车队,今年接手本田车队改名为布朗GP,今年的前2站连续包揽杆位与正赛冠军.我相信他就是一个神.舒米的退役,布朗的出走,托德的退隐,法拉利的铁三角不复存在.

目前法拉利与迈凯伦在积分榜上垫底,真的是让人们大跌眼睛呀,呵呵...
等待F1的第三站 上海大奖赛 或许会让我们见到风云突变,王者们的回归 真正的厮杀终将开始.

很久没写关于F1的东西了,只是今年开赛看得我太感慨了.当年巴顿被誉为英国的F1希望,可惜一直没能进入一流的车队而导致他的成绩平平,当汉密尔顿横空出世降落在迈凯伦,巴顿的光环就被这位英国新人全夺了去. 赛车不具备竞争力 谁也没有办法,阿隆索,KIMI 也只能很无奈的沉默. 现在的巴顿犹如王者般先夺杆位再揽冠军.


//--------------------------------Xlog-----------------------------------
终于写好我的缓存类,数据库操作类也写了一些了.很高兴呀 哈哈.

“__autoload” 自动加载对象所需的类文件

看了一下Zend Framework 觉得这个框架中的一个自动加载类的方式有点好玩,只需要把自己写的类文件按一定规则命名,然后放在指定的文件夹中 就能在程序中直接生成对象,很是方便呀.

昨天闲逛时发现,原来PHP5的 "__autoload" 的全局函数会自动帮忙加载对象所需的类文件喔,真的是太棒了,呵呵.

下面来说说这个函数怎么用的.

在根目录下建一个 index.php

代码如下
  1. <?php  
  2.    function __autoload($class)  //这里$class 就是类名
  3.    {  
  4.        //这里是加载类,并定义文件的命名规范,这里是以class_*.php的格式命名
  5.        include_once ("class_" . ucfirst($class) . ".php");  
  6.    }  
  7.  
  8.    //生成一个对象
  9.    $u = new Example;
  10. ?>




在根目录下建立一个class_Example.php

代码如下
  1. <?php
  2.     class Example  
  3.     {
  4.         public function __construct()
  5.         {
  6.             echo '很好很强大';
  7.         }
  8.     }
  9. ?>



这个方法真的是非常的好.省掉以前 许许多多的 include require 呵呵

 

PHP - 函数:sprintf()

sprintf()函数的作用是:输出格式化字符串到变量。

代码如下
  1. sprintf(format,arg1,arg2,arg++)
  2. //arg1, arg2, ++参数将被插入到主体字符串中的百分号(%)之后。这个函数是“一步一步[step-by-step]”执行的。在第一个“%”之后插入arg1,在第二个“%”之后插入arg2,依次类推。




今天在看代码时发现书上是这样写的:

代码如下
  1. $query = sprintf('select count(*) from %s where username = ?', $this->_table);
  2.            
  3. $result = $this->_db->fetchOne($query,$username);



于是很困惑 " %s "是什么意思 是怎么样让查询指定到相应的数据表.
查询了下才知道 原来是sprintf()函数起的作用 把$this->_table的值传递给 %s 了.

如何定义其中变量的格式,可能值如下:
%% -返回百分号

%b –返回二进制数

%c –返回与ASCII值相对应的字符

%d –带有正负号的十进制数

%e –科学计数符号(如:1.2e+2)

%u –不带正负号的十进制数

%f – 浮点数据(本地设置)

%F –浮点数据(非本地设置)

%o –十进制数

%s –字符串

%x –十六进制数(小写字母)

%X –十六进制数(大写字母)