PHP5 效率优化

Posted by gavinkwoe

静态调用的成员一定要定义成 static  (PHP5 ONLY)

5 引入了静态成员的概念,作用和 4 的函数内部静态变量一致,但前者是作为类的成员来使用。静态变量和 的类变量( variable)差不多,所有类的实例共享同一个静态变量。

<?
foo
{
    function
bar
() {
        echo
‘foobar’
;
    }
}

$foo = new foo;

// instance way

$foo->bar();

// static way

foo::bar();
?>

静态地调用非 static 成员,效率会比静态地调用 static 成员慢 50-60%。主要是因为前者会产生 E_STRICT 警告,内部也需要做转换。

使用类常量 (PHP5 ONLY)

5 新功能,类似于 C++ 的 const。

使用类常量的好处是:

- 编译时解析,没有额外开销
- 杂凑表更小,所以内部查找更快
- 类常量仅存在于特定「命名空间」,所以杂凑名更短
- 代码更干净,使除错更方便

(暂时)不要使用 require/include_once

require/include_once 每次被调用的时候都会打开目标文件!

- 如果用绝对路径的话, 5.2/6.0 不存在这个问题
- 新版的 APC 缓存系统已经解决这个问题

文件 I/O 增加 => 效率降低

如果需要,可以自行检查文件是否已被 require/include。

不要调用毫无意义的函数

有对应的常量的时候,不要使用函数。

<?
php_uname
(’s’) == PHP_OS
;
php_version() == PHP_VERSION
;
php_sapi_name() == PHP_SAPI
;
?>
虽然使用不多,但是效率提升大概在 3500% 左右。

最快的 Win32 检查

<?
$is_win
= DIRECTORY_SEPARATOR == ‘\\’
;
?>

- 不用函数
- Win98/NT/2000/XP/Vista/Longhorn/Shorthorn/Whistler…通用
- 一直可用

时间问题 (>5.1.0 ONLY)

你如何在你的软件中得知现在的时间?简单,「time() time() again, you ask me…」。

不过总归会调用函数,慢。

现在好了,用 $_SERVER['REQUEST_TIME'],不用调用函数,又省了。

加速 PCRE

 对于不用保存的结果,不用 (),一律用 (?:)

这样 不用为符合的内容分配内存,省。效率提升 15% 左右。

- 能不用正则,就不用正则,在分析的时候仔细阅读手册「字符串函数」部分。有没有你漏掉的好用的函数?

加速 strtr

如果需要转换的全是单个字符的时候,用字符串而不是数组来做 strtr:

<?
$addr
= strtr($addr, "abcd", "efgh");
// good
$addr = strtr($addr, array(‘a’ => ‘e’
,
                           
// …
                           
));
// bad
?>

效率提升:10 倍。

不要做无谓的替换

即使没有替换,str_replace 也会为其参数分配内存。很慢!解决办法:

- 用 strpos 先查找(非常快),看是否需要替换,如果需要,再替换

效率:

- 如果需要替换:效率几乎相等,差别在 0.1% 左右。
- 如果不需要替换:用 strpos 快 200%。

邪恶的 @ 操作符

不要滥用 @ 操作符。虽然 @ 看上去很简单,但是实际上后台有很多操作。用 @ 比起不用 @,效率差距:3 倍。

特别不要在循环中使用 @,在 5 次循环的测试中,即使是先用 error_reporting(0) 关掉错误,在循环完成后再打开,都比用 @ 快。

善用 strncmp

当需要对比「前 n 个字符」是否一样的时候,用 strncmp/strncasecmp,而不是 substr/strtolower,更不是 PCRE,更千万别提 ereg。strncmp/strncasecmp 效率最高(虽然高得不多)。

慎用 substr_compare (PHP5 ONLY)

按照上面的道理,substr_compare 应该比先 substr 再比较快咯。答案是否定的,除非:

- 无视大小写的比较
- 比较较大的字符串

不要用常量代替字符串

为什么:

- 需要查询杂凑表两次
- 需要把常量名转换为小写(进行第二次查询的时候)
- 生成 E_NOTICE 警告
- 会建立临时字符串

效率差别:700%。

不要把 count/strlen/sizeof 放到 for 循环的条件语句中

贴士:我的个人做法

<?
for ($i = 0, $max = count($array);$i < $max; ++$i
);
?>

效率提升相对于:

- count 50%
- strlen 75%

短的代码不一定快

<?
// longest
if ($a == $b
) {
   
$str .= $a
;
} else {
   
$str .= $b
;
}

// longer
if ($a == $b
) {
   
$str .= $a
;
}
$str .= $b
;

// short
$str .= ($a == $b ? $a : $b
);
?>

你觉得哪个快?

效率比较:

- longest: 4.27
- longer: 4.43
- short: 4.76

不可思议?再来一个:
<?
// original
$d = dir(‘.’
);
while ((
$entry = $d->read()) !== false
) {
    if (
$entry == ‘.’ || $entry == ‘..’
) {
        continue;
    }
}

// versus
glob(‘./*’
);

// versus (include . and ..)
scandir(‘.’
);
?>

哪个快?

效率比较:

- original: 3.37
- glob: 6.28
- scandir: 3.42
- original without OO: 3.14
- SPL (PHP5): 3.95

画外音:从此也可以看出来 PHP5 的面向对象效率提高了很多,效率已经和纯函数差得不太多了。

提高 文件访问效率

需要包含其他 文件的时候,使用完整路径,或者容易转换的相对路径。

<?

include ‘file.; // bad approach

incldue ‘./file.; // good

include ‘/path/to/file.; // ideal

?>

物尽其用

有很多扩展和函数可用,在实现一个功能的之前,应该看看 是否有了这个功能?是否有更简单的实现?

<?
$filename
= "./somepic.gif"
;
$handle = fopen($filename, "rb"
);
$contents = fread($handle, filesize($filename
));
fclose($handle
);

// vs. much simpler

file_get_contents(‘./somepic.gif’);
?>

关于引用的技巧

引用可以:

- 简化对复杂结构数据的访问
- 优化内存使用
<?
$a
['b']['c'
] = array();

// slow 2 extra hash lookups per access
for ($i = 0; $i < 5; ++$i
)
   
$a['b']['c'][$i] = $i
;

// much faster reference based approach
$ref =& $a['b']['c'
];
for (
$i = 0; $i < 5; ++$i
)
   
$ref[$i] = $i
;
?>

<?
$a
= ‘large string’
;

// memory intensive approach
function a($str
)
{
    return
$str.’something’
;
}

// more efficient solution
function a(&$str
)
{
   
$str .= ’something’
;
}
?>

==============================================
参考资料
http://ilia.ws

Ilia 的个人网站,,他参与的开发以及出版的一些稿物链接等等。
http://ez.no

eZ components 官方网站,eZ comp 是针对 PHP5 的开源通用库,以效率为己任,Ilia 也参与了开发。
http://phparch.com

|architect,不错的 出版商/培训组织。买不起或者买不到的话,网上可以下到很多经典的盗版。

http://talks.php.net


PHP On Rails

Posted by gavinkwoe

这两天看了几本 On Rails 的书,后来在网上搜索时发现原来 也有 Rails 的东西,比如 Symfony、CakePHP 和国人开发的 FleaPHP 都很不错。

:)

不过因为封装得太多了,以至于程序运行效率有些下降,但是比起其它的语言还是很快。


各系Rails大点兵

Posted by gavinkwoe

不知道明年今日,会不会出现一队只会用 On Rails的毕业生,像当年的asp、jsp、迅速剿了C++/perl的CGI那样,把我们给剿了。同好们劝我,根据大公司经济学,这基本不会发生。

在茫茫的框架之海认出一个Rails框架,基本上靠四个特征
1.一门动态语言
2.一个extreme simple to use的ORM框架
3.一个extreme simple to use的MVC框架
4.一些自动生成代码的命令、模版
其余ajax、 service、i18n等特性自由扩展

1.: on Rails
Rails系的旗手,一己之力搞得J2EE阵营鸡飞蛋打。
旗手的作用表现在:
*最接近1.0的版本,目前已出到最后一个RC版 1.0 rc4(0.14.3)
*拥有一本amazon超级畅销的《Agile Development with Rails》,而且这本书的组织也好,part I是一个渐进的sample application 让你快速入门,partII是几个重要领域的深入介绍。
*拥有自己的IDE: RadRails ,基于Eclipse但独立成军,目前出到0.5。(是不是怕惨了Eclipse的多变,现在这些IDE的发行版本开始反包含了Eclipse在内。)

2.: DJango、turbogears
认识不深,所以DJango请看limodou的,turbogears看xlp123的。

3.Groovy: grails
如果能顺产,绝对是J2EE阵营里感情分最高涨的项目。因为它语言用Groovy,ORM用annotation版Hibernate,MVC用Spring。不用担心它换汤不换药,因为经过extreme的封装,再结合Groovy,绝对不再是原来的Spring+Hibernate,而是和差不多的一样东西了。不信可以看看他的Sample。
不过这个项目的源码目录树非一般的乱,也还没有0.1版释出。还有一样奇怪的事情,这个Groovy项目,大多数的代码都是写的。

4.: symfony ,cake
据说cake比symfony弱非常多,所以没看。
symfonys是基于php5的项目,成功整合了Propel(ORM)、Mojavi3(MVC),再配合自动生成的脚本打造而成。看他的sample,最后整合出来的东西也很Rails了,除了ORM层的xml文件。
还有一个发现是项目现在可以用pear来安装,很像的gem,的Maven要努力了。
C: />pear channel-discover pear.symfony-project.com
C: />pear install symfony/symfony
这样就装完了symfonys和propel&croel, mojavi3,还有用来运行脚本命令的pake( make),PHing( ant?),一大堆东西。

from :http://www.blogjava.net/calvin/archive/2005/11/22/20938.
author:江南白衣


Rails RESTful (1) 什麼是REST?

Posted by gavinkwoe

on Rails 1.2 的一個重要進展是 RESTful,在了解怎麼用之前,我們要先了解什麼是 REST(Representational State Transfer)?

什麼是REST?

REST 是一種分散式超媒體系統(如WWW)的軟體架構風格,你可以想像它是一個良好設計的應用程式規則: 一組網路頁面(虛擬的狀態機器),其中 Client 透過點選超連結(狀態變換),結果是下個頁面(表示應用程式的下一個狀態)。

REST 所描述的網路系統包括三個部份:
data elements (resource, resource identifier, representation)
connectors (client, , , resolver, tunnel)
components (origin , gateway, proxy, user agent)

幾個重點:
Data elements 由標準化介面存取
Components 透過介面傳輸 資源表徵 (representations of resources) 來溝通,而不是直接操作資源本身。
Connectors 提供 component 的抽象介面來溝通,隱藏溝通機制的實作細節。
Components 使用 connectors 來存取,connectors 提供資源的存取或居中。
所有來自 connector 的 requests 必須包含所有必要的資訊來了解該 request,不需要依靠之前的request (即 stateless)

嚴格來說REST符合以下幾個條件:
應用程式的狀態跟功能拆成 resources
每個 resource 使用獨一無二用來當作超連結的通用定位語法(在WWW中即URI)
所有 resources 共用一致的介面在 client 跟 resource 之間轉換狀態,包括:
一組有限的良好定義操作 well-defined operations
一組有限的內容格式 content types,也許包括 可執行的程式碼 code-on-demand (在WWW中即)
這種通訊協定 protocol (在WWW中即用HTTP) 包含以下特色:
使用者端/伺服器端 Client/
狀態無關 Stateless
可以快取 Cacheable
分層的 Layered

符合 REST principles 的系統稱做 RESTful。

一般來說REST這個詞彙常被用來描述任何使用XML (or YAML, JSON, plain text) 的簡單介面,而不須靠其他機制(如SOAP)。另外 REST 雖然是個來自 WWW 的架構概念(比WWW晚),但是這兩者並不是綁在一起,有可能設計一個大型軟體系統符合REST但是不用HTTP協定也不需跟WWW互動,也有可能設計一個簡單的 XML+HTTP 界面使用 RPC model 而不符合 REST principles。

Resources

REST的一個最重要的觀念就是 resources (特定資訊的資源),每一個 resource 由一個 global identifier (即URI)所表示。為了操作這些 resources,網路的 components (即 clients 跟servers) 透過標準化的介面 (即HTTP) 來溝通並交換這些 resources 的 representations (即實際上傳達資訊的文件).

任意數量的 connectors (如clients, servers, caches, tunnels等) 可以居中 request,但是都不可以 “seeing past” (不需要其他 layer層)。這樣的應用程式跟一個 resource 互動根據兩件事情: resource的URI 跟 要做的動作 – 它不需要知道是否有 caches, proxies, gateways, firewalls, tunnels, 或其他任何藏在sever之間的東西。這個應用程式只需要知道資訊的格式 (representation),通常是 或 XML 或圖片什麼的。

REST 有什麼優點?
支援快取 caching 將改善反應時間跟的負載能力。
因為不必維持連結狀態,大大改善 的 scalability 能力。這表示不同可以處理同一串 requests。
一個瀏覽器就可以存取任一應用程式跟資源,client 端不需使用別的軟體。
在HTTP之上不依存其他機制跟軟體。
跟其他連結方式相比(如RPC),可以提供相等的功能。
不需要其他的 discovery 機制,因為使用超連結了。
提供比RPC更好的長期相容性,因為 :
如同這種文件具有後前及向後的相容能力
支援新的內容格式不需要丟掉舊的

另外比起RPC-style,URL command line 有極佳的 human-friendly 優點,容易 discovered/ transmitted /scripted/bookmarked 一個 URL。請參考 The Beauty of REST 跟 Tangled in the Threads 的優點介紹。

跟 RPC 的比較

跟 REST 應用程式對比的就是 RPC (Remote procedure call,實作上有XML-RPC或SOAP等) 了。RPC 應用程式曝露一或多個網路物件,每個有特定的 functions 可以呼叫。在 client 與物件溝通之前,它必須知道這個物件的知識來操作。

REST 的設計限制了 resource 的面向,它定義了介面 (動詞 verbs 跟內容型別 content types),導致比RPC更少的型別,但是更多的resource identifiers (名詞nouns)。REST 的設計尋求定義一組 resources 讓 Clients 可以一致性的互動,而且提供超連結在資源之間可以瀏覽,而不需要了解整個 resources 的知識 。 提供的表單 forms 也可以被用在 RESTful 的環境來描述 clients 如何建構 URL 來跟特定的resource做溝通。

這張圖指出了REST的三位一體 : Nouns, 有限的 Verbs 跟 Content Types。

需注意的是,根據不同的用法要求跟效率,在不同的應用程式環境中,該使用哪種架構仍有很大討論的空間跟爭議(SOAP的支持者認為REST仍有其侷限,只適合簡單的應用)。REST的重要性在於它有個目前最成功的大型軟體架構應用: Wide World 。RESTful 是 的天性,也是讓 成功的原因,因此 RESTful 的支持者認為使用 RESTful 架構就是 上最好的方法來做到有擴充性(scalable),彈性跟有威力的應用程式。在有這麼多複雜的RPC技術之後,REST因其簡單又有威力的架構近來越來越受到矚目跟重視。

舉例

一個 RPC 應用程式可能會定義以下的操作:

getUser()
addUser()
removeUser()
updateUser()
getLocation()
addLocation()
removeLocation()
updateLocation()
listUsers()
listLocations()
findLocation()
findUser()

Client 的程式碼可能會這樣存取:

exampleAppObject = new ExampleApp(”example.com:1234″)
exampleAppObject.getUser()

在 REST中,重點在 resources(或稱作 nouns)的多樣性,比如說可能有以下的用法:

http://example.com/users/
http://example.com/users/{user} (one for each user)
http://example.com/findUserForm
http://example.com/locations/
http://example.com/locations/{location} (one for each location)
http://example.com/findLocationForm

Client 的程式碼可能這樣存取:

userResource = new Resource(http://example.com/users/001)
userResource.get()

每個 resource 擁有自己的識別名詞,而 Clients 從單一 resource 開始瀏覽,透過標準操作走訪 resource ,如 GET 下載,PUT更新,DELETE刪除,POST新增,注意到每個物件有自己的URL,而且可以容易被快取,複製跟書籤化(bookmarked)。

參考資源
Representational State Transfer
RestWiki
How to Create a REST Protocol

From :http://ihower.idv.tw//archives/1542


PHP & memcached

Posted by gavinkwoe

一、memcached 简介

在很多场合,我们都会听到 memcached 这个名字,但很多同学只是听过,并没有用过或实际了解过,只知道它是一个很不错的东东。这里简单介绍一下,memcached 是高效、快速的分布式内存对象缓存系统,主要用于加速 动态应用程序。

二、memcached 安装

首先是下载 memcached 了,目前最新版本是 1.1.12,直接从官方网站即可下载到 memcached-1.1.12.tar.gz。除此之外,memcached 用到了 libevent,我下载的是 libevent-1.1a.tar.gz

接下来是分别将 libevent-1.1a.tar.gz 和 memcached-1.1.12.tar.gz 解开包、编译、安装:

# tar -xzf libevent-1.1a.tar.gz# cd libevent-1.1a# ./configure --prefix=/usr# make# make install# cd ..# tar -xzf memcached-1.1.12.tar.gz# cd memcached-1.1.12# ./configure --prefix=/usr# make# make install

安装完成之后,memcached 应该在 /usr/bin/memcached。

三、运行 memcached 守护程序

运行 memcached 守护程序很简单,只需一个命令行即可,不需要修改任何配置文件(也没有配置文件给你修改 :) ):

/usr/bin/memcached -d -m 128 -l 192.168.1.1 -p 11211 -u httpd

参数解释:

-d 以守护程序(daemon)方式运行 memcached;-m 设置 memcached 可以使用的内存大小,单位为 M;-l 设置监听的 IP 地址,如果是本机的话,通常可以不设置此参数;-p 设置监听的端口,默认为 11211,所以也可以不设置此参数;-u 指定用户,如果当前为 root 的话,需要使用此参数指定用户。

当然,还有其它参数可以用,man memcached 一下就可以看到了。

四、memcached 的工作原理

首先 memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,客户端可以由各种语言编写,目前已知的客户端 API 包括 Perl/////C#/C 等等。 等客户端在与 memcached 服务建立连接之后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中的,并不是保存在 文件中的,这也是为什么 memcached 能够如此高效快速的原因。注意,这些对象并不是持久的,服务停止之后,里边的数据就会丢失。

三、 如何作为 memcached 客户端

有两种方法可以使 作为 memcached 客户端,调用 memcached 的服务进行对象存取操作。

第一种, 有一个叫做 memcache 的扩展 下编译时需要带上 –enable-memcache[=DIR] 选项,Window 下则在 .ini 中去掉 php_memcache.dll 前边的注释符,使其可用。

除此之外,还有一种方法,可以避开扩展、重新编译所带来的麻烦,那就是直接使用 php-memcached-client

本文选用第二种方式,虽然效率会比扩展库稍差一些,但问题不大。

四、 memcached 应用示例

首先 下载 memcached-client.php,在下载了 memcached-client. 之后,就可以通过这个文件中的类“memcached”对 memcached 服务进行操作了。其实代码调用非常简单,主要会用到的方法有 add()、get()、replace() 和 delete(),方法说明如下:

add ($key, $val, $exp = 0)
往 memcached 中写入对象,$key 是对象的唯一标识符,$val 是写入的对象数据,$exp 为过期时间,单位为秒,默认为不限时间;

get ($key)
从 memcached 中获取对象数据,通过对象的唯一标识符 $key 获取;

replace ($key, $value, $exp=0)
使用 $value 替换 memcached 中标识符为 $key 的对象内容,参数与 add() 方法一样,只有 $key 对象存在的情况下才会起作用;

delete ($key, $time = 0)
删除 memcached 中标识符为 $key 的对象,$time 为可选参数,表示删除之前需要等待多长时间。

下面是一段简单的测试代码,代码中对标识符为 ‘mykey’ 的对象数据进行存取操作:

<pre><?//  包含 memcached 类文件require_once(‘memcached-client.);//  选项设置$options = array(    ’servers’ => array(‘192.168.1.1:11211′), //memcached 服务的地址、端口,可用多个数组元素表示多个 memcached 服务    ’ => true,  //是否打开     ‘compress_threshold’ => 10240,  //超过多少字节的数据时进行压缩    ‘persistant’ => false  //是否使用持久连接    );//  创建 memcached 对象实例$mc = new memcached($options);//  设置此脚本使用的唯一标识符$key ‘mykey’;//  往 memcached 中写入对象$mc->add($key’some random strings’);$val $mc->get($key);echo “n”.str_pad(‘$mc->add() ’60‘_’).“n”;var_dump($val);//  替换已写入的对象数据值$mc->replace($key, array(’some’=>‘haha’‘array’=>‘xxx’));$val $mc->get($key);echo “n”.str_pad(‘$mc->replace() ’60‘_’).“n”;var_dump($val);//  删除 memcached 中的对象$mc->delete($key);$val $mc->get($key);echo “n”.str_pad(‘$mc->delete() ’60‘_’).“n”;var_dump($val);?></pre>

是不是很简单,在实际应用中,通常会把数据库查询的结果集保存到 memcached 中,下次访问时直接从 memcached 中获取,而不再做数据库查询操作,这样可以在很大程度上减轻数据库的负担。通常会将 SQL 语句 md5() 之后的值作为唯一标识符 key。下边是一个利用 memcached 来缓存数据库查询结果集的示例(此代码片段紧接上边的示例代码):

<?$sql ‘SELECT * FROM users’;$key md5($sql);   //memcached 对象标识符if ( !($datas $mc->get($key)) ) {    //  在 memcached 中未获取到缓存数据,则使用数据库查询获取记录集。    echo “n”.str_pad(‘Read datas from MySQL.’60‘_’).“n”;    $conn mysql_connect(‘localhost’‘test’‘test’);    mysql_select_db(‘test’);    $result mysql_query($sql);    while ($row mysql_fetch_object($result))        $datas[] = $row;    //  将数据库中获取到的结果集数据保存到 memcached 中,以供下次访问时使用。    $mc->add($key$datas);} else {    echo “n”.str_pad(‘Read datas from memcached.’60‘_’).“n”;}var_dump($datas);?>

可以看出,使用 memcached 之后,可以减少数据库连接、查询操作,数据库负载下来了,脚本的运行速度也提高了。

之前我曾经写过一篇名为《PHP 实现多服务器共享 SESSION 数据》文章,文中的 SESSION 是使用数据库保存的,在并发访问量大的时候,服务器的负载会很大,经常会超出 MySQL 最大连接数,利用 memcached,我们可以很好地解决这个问题,工作原理如下:

  • 用户访问网页时,查看 memcached 中是否有当前用户的 SESSION 数据,使用 session_id() 作为唯一标识符;如果数据存在,则直接返回,如果不存在,再进行数据库连接,获取 SESSION 数据,并将此数据保存到 memcached 中,供下次使用;
  • 当前的 运行结束(或使用了 session_write_close())时,会调用 My_Sess::write() 方法,将数据写入数据库,这样的话,每次仍然会有数据库操作,对于这个方法,也需要进行优化。使用一个全局变量,记录用户进入页面时的 SESSION 数据,然后在 write() 方法内比较此数据与想要写入的 SESSION 数据是否相同,不同才进行数据库连接、写入数据库,同时将 memcached 中对应的对象删除,如果相同的话,则表示 SESSION 数据未改变,那么就可以不做任何操作,直接返回了;
  • 那么用户 SESSION 过期时间怎么解决呢?记得 memcached 的 add() 方法有个过期时间参数 $exp 吗?把这个参数值设置成小于 SESSION 最大存活时间即可。另外别忘了给那些一直在线的用户延续 SESSION 时长,这个可以在 write() 方法中解决,通过判断时间,符合条件则更新数据库数据。

五、相关资源

肖理达 (KrazyNio AT hotmail.com), 2006.04. 06, 转载请注明出处

转载自:http://nio.infor96.com/-memcached/


Tim Bray 又有惊人之语:PHP比Java更具有伸缩性

Posted by gavinkwoe

在 CSDN 上看到的,原文在Tim bray的 :comparison intrinsic qualities of , Rails, and   中(http://www.tbray.org/ongoing/When/200x/2006/11/10/Comparing-Frameworks

Tim首先明确了它这个观点的适用的范围:应用程序。对于那些基于浏览器的,从数据库显示一些信息,然后能够更新数据库的这种应用程序。

Comparing Web Frameworks

1 伸缩性

开发了EBay ,而 开发了 Wikipedia 和 Yahoo! Finance. 它们的伸缩性都足够好。

2 开发速度

3 工具支持

是最大的赢家,Rails有TextMate,有Zend

4 可维护性

一个好的应用程序需要 面向对象,MVC架构,代码可读,代码的数量越少越好。

Tim认为这是的痛脚,虽然完全可以写出上面的代码,但是PHPer通常不这么做。大多数程序是意大利面式的代码裹着意大利面式的SQL和意大利面式的。(笑死人了)

Tim最后说,不要问它,Rails,那个好,它依赖于你对项目进行的选择。最近几年和Rails教会了我们开发的速度是多么的重要。在一切的开发中,维护才是最重要的。

InfoQ对Tim进行了访问:

             InfoQ: 为什么Rails比更具有可维护性?

主要是因为代码少。事实是强制使用MVC模式,其模板机制和ORM,以及测试和程序代码耦合的太紧密了。请记住,我们到现在还搞不清,Rails对于那些不适用于CRUD形式的程序到底有什么用。

InfoQ: 为什么更具有伸缩性?

不是这个意思,而是在应用领域,它易于伸缩(没有中间件或服务要共享)。

InfoQ: 那一种特性在你的比较中最为重要?

可维护性。

Tim 继续在其中解释了可维护性:

在这个疯狂的Web2.0的世界里,能够快速的构建系统非常重要。面对投资和开发需求,你要在最短的时间交付系统。但是真正做过企业开发的聪明的程序员和经理们都知道。开发最大的成本是从你产品交付的那一刻,才刚刚开始。