PHP引用机制和垃圾回收机制详解

作者 : admin 于 2008年12月12日, 22:16:09
2008
12-12

PHP对变量的跟踪,其实是采用引用,比如 $a = “test” 那么就是在内存中开辟一个存储区,保存 test,$a 做为test的引用。

同时我们可以 $b = &$a,$b作为 $a的引用,他们同时指向test存储空间。

在文章 http://www.sunboyu.cn/2008/11/19/php%E4%B8%AD%E5%8F%98%E9%87%8F%E5%BC%95%E7%94%A8%E8%AF%A6%E8%A7%A3.shtml 中,我们做了一个应用的测试,当删除一个引用后,变量并不消失,是因为PHP使用一个引用计数的东东。当$a=”test”建立后,test的引用计数就是1,建立 $b=&$a后,test的引用计数就是2,删除任何一个引用后,引用计数为1.

只要是引用计数不为0的数据,则为当前有效的数据。然而,当数据的引用计数为0的时候,系统就会识别此数据为垃圾数据,需要回收,这也就形成了PHP的垃圾回收机制。

山穷水复疑无路,柳暗花明又一村

作者 : admin 于 2008年12月07日, 00:13:48
2008
12-7

学习就是这样,突然发现了PHP居然有ssh2的模块,这样远程连接linux服务器就很容易,我正头疼用socket写个ssh2的连接类,突然就发现了这个玩意。手册看得还是少,罚吃巧克力一块。
官方文档:http://www.php.net/manual/en/book.ssh2.php

CentPHP V1.0 release

作者 : admin 于 2008年12月05日, 22:06:54
2008
12-5

1.0不发布,1.1就不会出来,折腾了半月,终于写了个简单的框架,虽然只有简单的几个类,但基本实现了全OOP的操作。这个归功于网上众多的开源软件,没有这些资源的帮助,就不会有我的进步。

取名CentPHP,是因为我希望它像CentPHP一样强大稳定,而且免费开源。

最终把session的数据库保存方式给去了,因为太麻烦,模板引擎基本没什么功能,只有传值和显示,虽然进行了一些优化,但没有彻底跟踪排查资源调用情况,这个在以后版本要逐渐修正。
下边是相关文件列表,源码~~~~~~~~~等实现完一个项目后放出……

F:.
│ Index.php

├─lib
│ └─kernel
│ CentPHP.php
│ Class.Controller.php
│ Class.CP.php
│ Class.Mysql.php
│ Class.Router.php
│ Class.URI.php
│ Class.View.php
│ Common.php

├─usr
│ ├─config
│ │ Config.Mysql.php
│ │ Config.View.php
│ │
│ ├─controllers
│ │ welcome.php
│ │
│ ├─lib
│ │ Class.Session.php
│ │
│ └─views
│ welcome.php

└─var

Session处理,比较怪异的应用

作者 : admin 于 2008年12月04日, 23:47:35
2008
12-4

其实我很不喜欢把session放在数据库中处理,不过公司一直这么用,就先这么写,更倒霉的是,花了老大力气集成在一个不适合大项目的小框架里。
session本来是用URI类统一处理,过滤全局变量中的不安全因素,这样依赖,因为要重写session的几个方法,把原来的流程整得乱七八糟。
我正在想,是不是要把他做成一个钩子,钩挂在原来系统中,通过命令的方式开关,这样貌似是个不错的办法,不过,得把钩子的类写好……

补充:session放到数据库中的好处:可以即时得查看在新的用户(当然不是非常准确),可以踢人,如果是有登录认证的话。缺点:速度贼拉得慢,不如放到内存中。操作一次内存,得反复读写数据库,且不说硬盘,网络传输就是不消的消耗。

PHP5.2.7RC版本发布

作者 : admin 于 2008年12月04日, 12:01:03
2008
12-4

官方地址 http://qa.php.net/

下载地址 http://downloads.php.net/ilia/php-5.2.7RC5.tar.gz

Windows下安装Apache,Mysql,PHP过程详解

作者 : admin 于 2008年12月04日, 09:40:14
2008
12-4

原则:使用官方程序,完全自己配置,不使用其他辅助工具套件等。

准备:

apache2.2.*   http://httpd.apache.org/download.cgi   如果有stable版本,最好用stable版,其实最新版作为调试也不错

PHP5.2.*  http://www.php.net/downloads.php  目前是5.2.6

mysql5.1  http://dev.mysql.com/downloads/mysql/5.1.html  下载windows安装版本

1、安装Apache,安装路径随意,默认即可,手工管理更好,建议放到 d:\Apache 放D盘是为了以后重装的话,所有的配置文件都还在(备份不仅要备份数据,还要备份不起眼的配置文件)

2、安装Mysql,同上,安装到 D:\Mysql  理由同上

3、解压PHP5.2.×至目录 D:\PHP5 理由还是同上

4、配置环境变量:在桌面上找到“我的电脑”,右键点击“我的电脑”,选择“属性”里的“高级”标签,点击“环境变量”,在“系统变量”里找到“Path”,点击“编辑”按钮,在“变量值”后面加上“;D:\PHP5\;D:\PHP5\ext”,然后点“确定”退出。环境变量配置完成。(windows下Path环境变量是做什么用,google一下先,这样设置后,系统会自动搜索PHP目录里的可执行文件和加载类库)

5、进入PHP5目录下,找到php.ini-dist文件,将其复制到C盘的WINDOWS目录下,并将其文件名修改为“php.ini”。(php会默认从这个路径找php.ini这个文件,当然也可以手工指定这个目录,修改apache的配置文件即可)

6、再次进入PHP5目录下,将以下文件复制到C盘的WINDOWS目录下的System32里:(原因,我也不太清楚,但貌似可以设置一个环境变量指向这个路径就ok,那个方法一直没找到,也没理解)
fdftk.dll
gds32.dll
libeay32.dll
libmcrypt.dll
libmhash.dll
libmysql.dll
msql.dll
news.txt
ntwdblib.dll

7、打开Apache的主目录,进入conf文件夹,找到“httpd.conf”文件,为操作方便起见,建议使用Dreamweaver打开它。打开后在第126行左右找到 LoadModule vhost_alias_module modules/mod_vhost_alias.so,在后面添加以下语句:
LoadModule php5_module “D:/PHP5/php5apache2_2_filter.dll
“AddType application/x-httpd-php .php
添加完成后保存文件。

8、在apache主目录下htdocs下创建index.php文件,内容为<?php phpinfo(); ?>保存。

9、在浏览器的地址栏里输入http://127.0.0.1/index.php。即可打开显示PHP信息的页面。配置成功。

框架资源消耗分析

作者 : admin 于 2008年12月03日, 22:42:09
2008
12-3

简单使用了下CI框架,发现了不少技巧:在 Controller类中实例化了好多的类

  1. function _ci_initialize()
  2. {
  3. // Assign all the class objects that were instantiated by the
  4. // front controller to local class variables so that CI can be
  5. // run as one big super object.
  6. $classes = array(
  7. 'config' => 'Config',
  8. 'input' => 'Input',
  9. 'benchmark' => 'Benchmark',
  10. 'uri' => 'URI',
  11. 'output' => 'Output',
  12. 'lang' => 'Language',
  13. 'router' => 'Router'
  14. );
  15. foreach ($classes as $var => $class)
  16. {
  17. $this->$var =& load_class($class);
  18. }
  19.  
  20. // In PHP 5 the Loader class is run as a discreet
  21. // class.  In PHP 4 it extends the Controller
  22. if (floor(phpversion()) >= 5)
  23. {
  24. $this->load =& load_class('Loader');
  25. $this->load->_ci_autoloader();
  26. }
  27. else
  28. {
  29. $this->_ci_autoloader();
  30. // sync up the objects since PHP4 was working from a copy
  31. foreach (array_keys(get_object_vars($this)) as $attribute)
  32. {
  33. if (is_object($this->$attribute))
  34. {
  35. $this->load->$attribute =& $this->$attribute;
  36. }
  37. }
  38. }

然后在默认welcome的模型里print_r($this),那是一个密密麻麻阿,无数的实例化数据摆在这里,估计内存CPU消耗也是惊人。
当然,作者并不是没有解决这些问题,所有的类在实例化之后使用static的方式常驻内存中,在第一次加载后,响应时间明显缩短,我本地测试是否默认实例化如此多的对象速度没有明显的差别。
对于原来我写程序,其实是有洁癖的,或者是心理障碍,就是像写C一样仔细考虑每个变量和每个方法,计算操作复杂度,其实对于整个系统开发和PHP这们语言来说,这么开发其实是杞人忧天,因为PHP本身就可以处理这些问题,比如static方法,一些缓存。
在进行各种测试之后,我的类库居然也默认加载了一些方法,只是应用在小网站中。
对于大型网站,还是要充分考虑效率性能的问题。

框架开发的两个主方向

作者 : admin 于 2008年12月02日, 13:50:28
2008
12-2

最近一直在研究框架,翻阅了各大框架结构,最后总结出两点:性能和接口规范。
1、接口规范
框架的一大意义在于整合类库和资源,使用统一的接口和统一的方式进行调用,统一的接口又更加方便其他资源的整合,模块化的管理更容易对代码进行管理。这样,可以使得不同的开发人员形成一致的风格进行分工协作。
2、效率
框架在整合类库,判断路由的时候,毕竟消耗很多冗余操作。太多的类库加载也将耗费很多的内存和CPU,因此,框架开发的另一个要点就是要降低操作复杂性,降低内存消耗,在这个基础上有可优化性。

总结到这里,晚上继续玩命……

框架学习之起步阶段:罗马的出发

作者 : admin 于 2008年11月27日, 22:11:23
2008
11-27

罗马真的不是一天建成的,不能不承认,那些框架作者在此花费的精力。我的框架只写了一个说明,两个函数,就已经尽兴不下去了,当然跟这几天的感冒有关,不过,更多的是我没有理清框架应该有的结构。

一个优秀的框架除了规范化大部分操作外,其在效率和性能损耗上做了进步一的改进,从而能够高效处理复杂的操作。

第一个自动加载类的函数,参考了下PHP手册关于引用部分,才发现自己原来写类的方法,是如何的消耗内存和CPU,任何一个方法的诞生都是有其目的的,不能认为PHP是神,但PHP毕竟比我强,因此我还是要相信这些我不熟悉的操作是有用武之地的。

第二个方法,是要定义URI路由,URI路由我会尽量使用逐一匹配的方式进行解析,但有些操作不确定变量数量的时候,简单使用正则。我正则不很强,但也对着手册也可以写,但我总感觉这玩意太费劲,大脑想着费劲,电脑做着肯定费劲。有简单的方式,为何用难的,难道只是为了省点代码空间么,没必要的。

不过说到底,正则这东西还是很有用,不能因为效率差而失去,计划写个分支,把简单的用模板匹配,复杂的用正则,皆大欢喜。

不过写之前,还是要大量翻看别人的东西。

PHP中引用返回的用法

作者 : admin 于 2008年11月21日, 10:49:47
2008
11-21

先看个例子

  1. function &new_class( $classname )
  2. {
  3.         static $object = array();
  4.         if(isset( $object[$classname] ))
  5.         {
  6.                 return $object[$classname];
  7.         }
  8.         $object[$classname] = & new $classname();
  9.         return $object[$classname];
  10. }
  11. class abc
  12. {
  13. public $a;
  14. public $b;
  15. function abc()
  16. {
  17. $this->a = 1;
  18. $this->b = 2;
  19. }
  20. }
  21. class test
  22. {
  23. }
  24.  
  25. $a = new test();
  26. $a->abc = & new_class( 'abc' );
  27. print_r($a);

很显然,这样做的好处是减少了实例化对象的复制,直接绑定了对象。这样减少了内存的消耗和操作的复杂。但实际上官方又说了这么一句,很是纳闷:
Do not use return-by-reference to increase performance, the engine is smart enough to optimize this on its own.
不要尝试用引用返回提高性能,因为PHP引擎足够聪明,自己会解决。
闷中

 Page 5 of 9  « First  ... « 3  4  5  6  7 » ...  Last »