無標題文檔

有关 PHP 实例化类的一点摘记

最近在编写 Grace PHP5 Framework 中,我得到很多类的实例化的心得。Grace PHP5 Framework 是一个完全基于 MVC 架构的框架,具有良好的扩展性。它对于类的调用可以说非常的灵活。

下面是调用一个模型(Module)的函数。这个函数的基本功能是指定一个模型(抽象化为类)的名称,然后它会在模型目录下面寻找这个类的脚本实例化以后返回。这样的做法有一点好处就是载入和实例化是自动的,你可以获得最大的灵活性。下面请看下面的代码,它并不长而且不复杂:

function &load_class($class_name, $param = null, $instantiate = true)
{
    static $objects = array();

    $class_name = ucfirst(strtolower($class_name));
    if (isset($objects[$class_name])) {
        return $objects[$class_name];
    }

    $class_file = DIR_MODELS . "/{$class_name}.inc.php";
    if (file_exists($class_file)) {
        require_once $class_file;

        if (!class_exists($class_name)) {
            return false;
        } else {
            $objects[$class_name] =& new $class_name($param);
            return $objects[$class_name];
        }

    }  else {
        if ($instantiate) {
            $objects[$class_name] = null;
        } 
        return null;
    }
}

函数只有三个参数,分别是 $class_name 、$param 以及 $instaniate ,其中 $param 是构造函数的参数,$instaniate 是可选的。请注意函数中的 $objects 数组是一个静态变量,也就是当调用完这个函数的时候数组并不会释放,下次调用此函数时这个数组的数据是会保存的。这样做的好处就是可以将大部分的类实例了以后,如需要重复调用则直接返回这个类的实例就可以了,避免了重复调用,提高了性能。代码如下:

    static $objects = array();

    if (isset($objects[$class_name])) {
        return $objects[$class_name];
    }

其它继续的代码就是检测是否有这个类名称的文件,如果有载入这个文件并寻找指定名称的类,如找到了这个类以后就实例化。这要求脚本中类的名称必须和脚本的文件名是一致的。我想这也有利于以后的代码管理。

$instaniate 参数这个时候就发挥了功效,这个参数会告诉函数如果未找到则在 $objects 下面做一个标记位(null)避免函数又重复的寻找文件名并重复载入和寻找。

    $class_file = DIR_MODELS . "/{$class_name}.inc.php";
    if (file_exists($class_file)) {
        require_once $class_file;

        if (!class_exists($class_name)) {
            return false;
        } else {
            $objects[$class_name] =& new $class_name($param);
            return $objects[$class_name];
        }

    }  else {
        if ($instantiate) {
            $objects[$class_name] = null;
        } 
        return null;
    }

其中语句:

$objects[$class_name] =& new $class_name($param);

可以多次的推敲一下。$class_name 在函数中是一个字符串变量。关键字 new 可以动态的实例化指定字符串的类(如果存在的话)。有关此调用方法可以参见 PHP 手册和 这里

此函数的不足之处就是如何去考虑传递不同个数的参数给每个不同的类的构造函数。或许可以使用 call_user_func_array 等函数实现,但是这样的做法非常的不 Grace。在这里需要推敲一下。其实 file_exists 等文件存在的测试可以交给 __autoload 函数处理,不过由于其他的函数比如 interface_exists 等也会调用 __autolaod 函数,出于兼容性的考虑,所以只在函数内做一个简单的测试。

PHP5 相对 PHP4 而言更加的面向对象。我想是时候更新我们我们的编码思想了。有关 PHP5 的类和对象, 这里 有一个非常好的教程。

附:此文档相关脚本 打包下载 ,请运行 index.php 文件。

我们亲爱的 1401

由于某种原因,我们接下来的几天要搬离公司宿舍了。心理虽然是有点舍不得,但是某种「不可抗拒力」还是让我们不得不这样做。

我习惯并已经喜欢从 14 楼的阳台往下面看了,在这里 生活也非常的惬意 (至少夏天不用担心蚊子的骚扰)。听说冬天在这里看雪景将是非常漂亮的。

https://friable.rocks/_/2007_10_29/1193649165.jpg

从阳台往西面眺望可以看到杭州城西的景色。那幢大的楼是一个软件园,里面据说有很多的牛人。晚上那桥上的路灯全部打开刚好又是另一番的景色。

https://friable.rocks/_/2007_10_29/1193649178.jpg

从正面看是农民房,远远得可以看见后面的房子也正在建造当中。杭州是一座充满活力的城市。

https://friable.rocks/_/2007_10_29/1193649191.jpg

https://friable.rocks/_/2007_10_29/1193649204.jpg

这是东区的门口,这似乎和一般的小区没什么两样。我拍照的时候刚好是星期天的下午,小区还是依旧的安静恬睦。

https://friable.rocks/_/2007_10_29/1193649219.jpg

咳咳,最后阳台旁边是窗户。是寝室女生的「闺房」,里面的东西凌乱不堪。看来 和我一样 ,在这里人都会变得很「懒」了,呵呵。

使用 Bootchart 分析 Linux 启动过程

LinuxSir 潜水的时候发现有一名叫 Bootchart 的程序可以分析系统启动的时间并生成图表。本人使用本机子做了一个测试,有很多的发现。

有关 Bootchart 的安装在这里不作复述。如需,请查看代码包中的 INSTALL 和 README 文件。

测试环境

本次的测试环境使用本人的 笔记本电脑(型号是 DELL L400) 。具体的硬件参数如下:

CPU 具体信息:

processor    : 0
vendor_id    : GenuineIntel
cpu family    : 6
model        : 8
model name    : Pentium III (Coppermine)
stepping    : 10
cpu MHz        : 696.982
cache size    : 256 KB
fdiv_bug    : no
hlt_bug        : no
f00f_bug    : no
coma_bug    : no
fpu        : yes
fpu_exception    : yes
cpuid level    : 2
wp        : yes
flags        : fpu vme de pse tsc msr pae mce cx8 sep mtrr pge mca cmov pat pse36 mmx fxsr sse
bogomips    : 1389.36

内存以及启动好了以后的占用量:

             total       used       free     shared    buffers     cached
Mem:        126360     104708      21652          0      11812      55560
-/+ buffers/cache:      37336      89024
Swap:       393584          0     393584

主板等相关的配置信息:

00:00.0 Host bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (rev 03)
00:01.0 PCI bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge (rev 03)
00:07.0 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ISA (rev 02)
00:07.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)
00:07.2 USB Controller: Intel Corporation 82371AB/EB/MB PIIX4 USB (rev 01)
00:07.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
00:08.0 Multimedia audio controller: Cirrus Logic Crystal CS4281 PCI Audio (rev 01)
00:0a.0 CardBus bridge: Texas Instruments PCI1410 PC card Cardbus Controller (rev 01)
00:0d.0 Ethernet controller: 3Com Corporation 3c905C-TX/TX-M [Tornado] (rev 78)
00:10.0 Communication controller: Agere Systems WinModem 56k (rev 01)
01:00.0 VGA compatible controller: ATI Technologies Inc Rage Mobility P/M AGP 2x (rev 64)

由于本次测试主要的目的是检查启动过程中是什么程序运行最慢,并如何的解决。所以此次的内核我采用 Slackware 11.0 原版的 bare.i 内核,并加载硬件必要的驱动。

第一部分测试

首先我启动日常所需要用到的所有程序和服务。更具如下图所示,总体从开机(引导内核)到控制台的时间刚好为一分钟(time: 1:00):

https://friable.rocks/_/2007_10_27/1193416091.gif

点击保存大图

仔细分析了下相关的服务,发现系统启动运行期间有两个位置 CPU 的负载非常的大。我看了下,主要是检测 usb.agent 程序和 fsck 程序在运行,并且磁盘的 IO 也比较的频繁。根据图示,此段的时间持续了 10s (时间点是在 10s - 18s 之间)。

第二个高峰是在 42s 上下,是系统正在启动服务器阶段。此时 httpd(Apache)和 MySQL 正在启动运行。

第二部分测试

第二部分的测试我关闭了 Apache 和 MySQL 等服务的运行,发现系统的启动时间只用了 46s。主要的系统滞留时间主要还是第一项测试的 fsck 阶段和 ldconfig 程序。

https://friable.rocks/_/2007_10_27/1193416058.gif

点击保存大图

总结

Bootchart 可以非常直观的分析出系统启动过程的状态。在本机中,可以看出系统的主要瓶颈是磁盘的 IO 和 CPU 的性能。Linux 内核本身对内存的要求并不高,而相应的应用服务却需要一定的硬件资源。建议根据相应的服务「对症下药」。

同时这也是可以优化的。比如内核是没有经过重新编译的、 fsck 也可以在每次开机的过程中设置成关闭,以提高启动速度。

最后,启动速度的快慢并不代表启动以后的运行速度的快慢。Linux 安装于服务器上时,对于系统启动的速度并不是一个非常严格的量,毕竟服务器是应用为主。过份的优化可能会导致不必要的麻烦。

Safari 3.0.3beta for Windows 英文版测试

上周五的时候就听说 Apple 发布了新版本的 Safari 浏览器。今天红光兄弟反应用 Safari 浏览器浏览我的网页的时候有部分乱码。虽然我的网站经过 IE、Firefox 和 Opera 的测试,不过对于 Safari 的确是没有花什么心思。此次的 BUG 刚好让我体验了把 Safari 浏览器的使用。

从苹果的官方网站下载 Safari 浏览器( http://www.apple.com/safari)非常的方便。一路安装下来也没有出现任何的问题(系统是 Windows XP SP2)。

目前安装好了以后的版本如下:

https://friable.rocks/_/2007_10_23/1193126784.gif

安装好了以后发现中文的支持的确相对以前的版本来说有非常大的改进。我尤其喜欢它的字体渲染引擎,在液晶上看起来非常的舒服。如图:

https://friable.rocks/_/2007_10_23/1193126727.gif

但页面表单的中文输入还是有部分的问题,比如反应缓慢等等。而相对于 Opera 和 Firefox 的用户来说,Safari for Windows 版本已经可以是另外的一个非常好的选择了。

另,上述 PHP 的乱码解决方案非常的简单,只要在页面输出前指定 HTTP 流的编码即可。

header("Content-Type: text/html; charset=utf-8");

欢迎我们家的新成员,小白

小蒋同学给我们抱回了一只非常可爱的狗狗。现在它已经来我们寝室快一个星期时间了,自然也熟悉了不少。可怜我隔壁的女孩子的丝袜经常被这个狗狗给咬了(注:这狗狗的性别为男性)。晚上经常「啊呜,啊呜」的吵得人睡不着觉。但出此这小小的牢骚之外,我们很是欢迎这位「小朋友」。

哎,从此小蒋同学就有很正常的理由来我们寝室打劫了(搞不好难道这个狗狗是他安排在我们这里的卧底?!)。

https://friable.rocks/_/2007_10_20/1192880683.jpg

https://friable.rocks/_/2007_10_20/1192880695.jpg

https://friable.rocks/_/2007_10_20/1192880705.jpg

https://friable.rocks/_/2007_10_20/1192880718.jpg

我的照片

嗨!我叫「明城」,八零后、码农、宁波佬,现居杭州。除了这里,同时也欢迎您关注我的 GitHubTwitterInstagram 等。

这个 Blog 原先的名字叫 Gracecode.com 、现在叫 「無標題文檔」 。 其实无所谓叫什么名字,作为码农知道取名是件很难的事情。最后想到的这个名字,其实都没啥特别的含义,系统默认的文件名而已。

作为八零后,自认为还仅存点傲娇式的幽默感,以及对平淡生活的追求和向往。 为了免得对号入座和不必要的麻烦,声明本站点所持观点仅代表个人意见,不代表自己所服务公司的立场。

如果您想联系我,可以发我邮件 `echo bWluZ2NoZW5nQGdyYWNlY29kZS5jb20K | base64 -d`

文章

项目