以前总说 PHP + MySQL 部署简单, 免费, 效率高.
微软一看, 哈好啊, 于是从 .NET 运行库, 到编译器, IDE, 数据库后台也都顺应大众所好, 不仅 "Free" (免费), 而且还 "Express" (轻便快捷).
当然, 现在 Windows 这个顽固份子还要钱, 但我们可以想象既然微软已经迈出了第一步, 说不定哪天为了占领市场, 也开发个专用于 Web Server 的 Windows Express, 不仅免费, 而且还派送超市优惠券, 够吸引眼球吧. 要知道 Visual Studio 的价格比 Windows 贵得多. 仅从利益角度来说, 微软既然可以把 VS 赶下神坛, 搞出一个小弟 VS Express, 当然也可能对 Windows 做同样的事.
"为什么要痴迷于 PHP 呢 ?" 我已经估计到, 问这样老掉牙的问题的话大致将会得到以下同样老掉牙的回复:
1. 微软和 Windows 都是垃圾. (可能是, 不过说这话的人中, 能从理论上说出为什么Linux 就不垃圾的人有多少?)
2. 之所以 "诋毁" PHP 是因为楼主是个 PHP 半吊子. (这个我就认了)
3. 楼主是 sb. ( .... )
4. 走自己的路, 让别人说去吧. (不错, 暂时只有这个让我心悦诚服)
换个角度, 假设正在看贴的你是一个无所不能的程序大师, 而作者我是一个异想天开想学编程的新手, 或者勒紧裤腰带上了大学即将毕业梦想找份程序员工作的菜鸟, 你能如何说服我来选择 PHP 这条路 ?
1. PHP 上手简单, 开发快速!
看看 ASP.NET, 连不会写程序的菜鸟也能摆弄摆弄微软傻瓜式的 IDE 菜单和按钮, 做几个漂亮动态页面. PHP 就算弄个 Hello World 怎么样也得手动写几行代码吧.
2. PHP 功能强大!
我倒是可以列举出很多 .NET 比 PHP 强大的地方. 在 .NET 中可以轻易实现 url rewrite, PHP 的话没有 apache 权限实现这个是做梦. .NET 中的运行实例是可以重用的, 数据和状态是可以持久化的, 即使有一万个人刷新页面, 我可以只建立一个类的实例, 做一次初始化, 并只从数据源读一次数据. PHP 呢, 只好照单全收, 被奴役万世. 当然, 你会得意地说, PHP 远不如你想的那么简单, 咱可以用 Serialize 和文本 Cache 来降低运行开销! 唔 ... 那么你更应该品尝一下.NET 中支持更多格式的 Serialize 和 内存 Cache. 何况 .NET 还有 CacheDepency 的魔术呢.
3. PHP 是开源的 !
在微软的计划中, C#.NET 也是开源的. 其实是否开源和我们关系不大. 大多数人又能拿 PHP 的源代码干什么 ? PHP 的源代码非常庞大, 基本没有注释, 手册, 没有高人指点是很难找到你想要得东西的. (曾为 PHP 中引用的实现效率和机制翻过源代码, 鉴于本人 C 语言水平属于庶民级别, 看得很痛苦) 甚至研究 Linux 内核的源代码也方便多了, 好歹也有一堆先人所著的书籍可以参考.
4. PHP 效率高 !
唔, 如果写出来的程序满足 "一定要求", PHP 的效率确实足够了. 比如 discuz 论坛, 在很烂的服务器上也能撑不少并发访问. 不过上文所指的 "一定要求" 是什么呢 ? 当然, 编程者基本的代码优化能力是要有的. 譬如对字符串的操作算法等等, 如果是有数据库访问程序, 你的 SQL 索引, 特别是组合索引, 和对应的查询语句都需要安排得非常巧妙. 编程者需要精通 MySQL manual, 知道 MySQL 的处理机制. 除了这些基本的程序素质能力之外, 你必须还要克服 PHP 的另一个硬伤, PHP 是解释执行的 ! 假设我们在程序中 include 了一个 "foo.php" 的文件, 你可以将 include 之后所作的事情看成下面等效的两个动作:
PHP代码:--------------------------------------------------------------------------------
$code = file_get_contents('foo.php');
// step 1: 把文件 "include" 进来.
eval($code);
// step 2: 解释和运行 "include" 的代码.
// 这里仅为示意, 实际使用中 step2 中的 $code 参数要处理一下, 如 add_slashes, 并把首尾 tag 去掉. 否则不能成功 eval.
--------------------------------------------------------------------------------
发现了吗? 执行的速度竟然很大程度上取决于 foo.php 的文件大小! 文件越大, 读入内存就越慢, 读入的代码字符串越大, eval 所用的时间也越长, CPU 占用也是直线上升. 换句话说, 为了速度, 你的代码不能大 ! 也许你为了今后代码的维护, 在程序中写了很长的注释. 很遗憾, 虽然注释被忽略不执行, 但一样会读取被处理并影响效率. 几个以速度著称的论坛系统, 如 phpwind, discuz, 公共库函数的 PHP 文件大小基本都控制在 10k ~ 20k, 并且注释很少. 如果你怀疑, 可以自行写一大一小两个没有代码只有注释的 PHP 文件, 放到服务器上然后运行 microsoft application stress tool 进行压力测试看看吧. 附带一提, Zend Optimizer 是个花瓶, 效果有限得很.
而 ASP.NET 被编译为 dll 运行 (MSIL), 另外加上前面所说的状态可持久化不用每次都发送大量请求或者重复初始化的因素, 实际花销可以控制得很低.
5. 请相信 PHP 5.0 以及 PHP 的未来
PHP5.0 多了什么呢, 多了 public, private, interface 等等语法, 多了反射, SPL, PDO. 其实山也还是那座山.
如果说当年 Visual Basic 5.0 的 Native Code 相对于 Visual Basic 4.0 的 P-Code 是一场革命, 那么他确实成功了, 抢了 C++, Pascal 的不少生意. 设想如果 VB5 的升级不是下了狠心搞了个 Native Code 编译模式, 而只是语法模仿一下 C++, 来个 Class 或者指针什么的, 能引起人们多大的关注 ?
从语意上来说, PHP5 比 PHP4 确实要优秀, 现在不是流行 AOP 面向方向编程, 流行 IOC 控制反转吗, 看了几个用 PHP4 和 5 写的示例框架, 毫无疑问用 5 比 4 表述清楚得多, 动态代理 (dynamic proxy), 依赖注射 (depency injection) 在 5 中都可以用反射, 接口来实现, PHP4 必须另想办法. 老外中有多事者还写了个 PHP4 的模拟接口方法实现 depency injection. 但从另外一个方面来讲, PHP 作为脚本解释语言, 实现这些的代价是很高的, 语法搞得像 java 一样, 执行效率越来越差, 价值越来越低. Zend 公司下一步应该怎么走呢 ? 或许明天又会被后面的 RubyOnRails 超越了 ?




