2008年04月24日 星期四 下午 04:27
作者:老王
CakePHP的前景似乎越来越风雨飘摇了,这几天,CakePHP三巨头PhpNut,Gwoo,Nate正在起内讧,起因是Gwoo,Nate觉得PhpNut作为领导却对项目进展不上心,只顾打自己的小算盘。所谓占着茅坑不拉屎。
从我个人的观点,我一直不喜欢PhpNut,虽然他是CakePHP的老大,但是这厮相当狂妄,当初一句“Keep the house clean”就把Dho从核心团队扫地出门,足见其自以为是的本性,今天他也是罪有应得。
按最新的 |
2008年04月23日 星期三 下午 04:59
作者:老王
一台Web服务器:Lighttpd + PHP(fcgi)。本来一直运行好好的,突然发现若干PHP脚本不能运行了,页面显示500错误,Lighttpd错误日志记录:
(mod_fastcgi.c.2462) unexpected end-of-file (perhaps the fastcgi process died): pid: 0 socket: unix:/tmp/php-fastcgi.socket-3
开始以为是Lighttpd某些模块设置影响了PHP脚本的运行,可是反复试验没有发现问题,无意中发现是PHP的问题,其错误日志大小已经达到了2G。
# php-cgi -i | gre |
2008年04月09日 星期三 下午 09:33
作者:老王
补充:本文中,似乎我对Web MVC的理解有问题,最近这个老生常谈的话题把我折磨的够呛。这里我再理理思路:传统的MVC概念是应用在桌面软件之上的,V可以查询M,C可以改变M。一条判断MVC的很重要的原则是View是否能动态的感知Model的变化,这在桌面软件上是很简单的,只要使用观测者模式就很容易办到,但是到了Web环境下,因为HTTP是无状态的,我们无法让View去观察Model, |
2008年04月08日 星期二 下午 09:41
作者:老王
印象中,已经遇到好几次类似“老王”这个样子的”乱码“了,每次都是到处Google找转换方法,今天才发现mb_convert_encoding本身就可以实现这个功能:
echo mb_convert_encoding('老王', 'UTF-8', 'HTML-ENTITIES'); |
2008年03月29日 星期六 下午 10:50
作者:老王
这个陷阱在PHP里存在很久了,先看代码:
<?php
$array = array(1, 2, 3 |
2008年03月28日 星期五 上午 11:06
作者:老王
MySQL相当有个性。可能它也喜欢徐志摩的《再别康桥》:悄悄的我走了...。
今天遇到类似的情景,MySQL只是冷冷的说:MySQL server has gone away。
大概浏览了一下,主要可能是因为以下几种原因:
一种可能是发送的SQL语句太长,以致超过了max_allowed_packet的大小,如果是这种原因,你只要修改my.cnf,加大max_allowed_packet的值即可。
还有一种可能是因为某些原因导致超时,比如说程序中获取数据库连接时采用了Singleton的做法,虽然多次连接数据库,但其实使用的都是同一 |
2008年03月24日 星期一 下午 09:20
作者:老王
前些天我写了一篇《 PHP实现透明化事务处理》,讨论了如何利用装饰模式实现事务处理。如果具体点说,它是一个透明的装饰模式,因为装饰类和被装饰类实现了共同的接口。可惜当梦想照进现实的时候,我们猛然发现纯粹透明的装饰模式并不多,因为既然我们的类需要被“装饰”,很多时候就不可避免的要引入一些新方法,这些方法在原有的接口里是没有定义过的,对于这种情况,我们称之为半透明的装饰 |
2008年03月06日 星期四 下午 08:13
作者:老王
事务是极其重要的,不然代码就和炸弹差不多,即便现在它能正常运行,可是说不定啥时候就会爆炸。
先看看一般情况下,我们是如何实现事务处理的,以AdoDB为例,代码如下:
$conn->BeginTrans();
|
2008年03月04日 星期二 下午 08:31
作者:老王
==============================================
不要直接使用__autoload(),而应该使用spl_autoload_register(),这样可以避免出现命名冲突。
==============================================
尽量使用$_SERVER[‘REQUEST_TIME’](此变量在PHP5.1以上有效),而不是time(),因为time()不仅是一个函数,还涉及一次系统调用。
==============================================
Rowset和Resultset是两个很容易混淆的概念,它们的区别在于得到Rowset后,就 |
2008年03月03日 星期一 下午 04:30
作者:老王
什么样的代码算是好代码?逻辑区分清晰的代码就是好代码。可惜总有一些难啃的骨头,让我们的代码从好变坏,下面讲一个例子。
假设我们的代码是类似CakePHP风格的,其中有一个模型Article,还有一个控制器ArticlesController。
加入一些需求:
我们在ArticlesController控制器中操作Article模型的时候,如果执行了模型的save操作,那么就执行一些动作,比如说发送一封邮件,告诉老板某个文章已经保存了(老板说不定会因为这个功能而更加欣赏你)。
需求本身并不复杂,但是在哪 |
2008年02月26日 星期二 下午 08:39
作者:老王
SVN有很多钩子方法:
* start-commit
* pre-commit
* post-commit
* pre-revprop-change
* post-revprop-change
我们设置post-commit文件的内容:
/usr/bin/svn update /path/to/repository --username yourname --password yourpassword
设置可执行的权限:chmod +x post-commit
------------------------------------------------------------------------------
顺便说一句,别忘了设定Apache,以防止SVN目录被浏览: |
2008年02月22日 星期五 上午 11:12
作者:老王
一直没弄清楚NuSOAP里如何处理可选参数,今天才发现解决方法异常的简单:
$nusoap->wsdl->addComplexType(
|
2008年02月16日 星期六 下午 09:58
作者:老王
数据迁移中字段的unsigned问题
Rails数据迁移中,对一个int字段,比如说ip字段:
新版本:t.integer :ip
老版本:t.column :ip, :integer
不过这样生成的是int(11),没有设置unsigned,如果一定要用unsigned,可以采用一个权宜的方法:
t.column :ip, "int unsigned"
多少有点怪,而且t.column这样的老式写法已经不推荐了,其实最好的方法还是:
t.integer :ip, :unsigned => true
可惜这种写法不知道啥时候才 |
2008年02月14日 星期四 下午 08:41
作者:老王
在旧版本的数据迁移中,以创建表为例,用法如下:
class CreateProducts < ActiveRecord::Migration
def self.up
create_table :products do |t|
t.column :category_id, :integer
t.column :title, :string
t.column :description, :text
|
2008年02月13日 星期三 下午 04:57
作者:老王
Rails升级到2.0.2,发现以前的Depot无法运行了:
class AdminController < ApplicationController
scaffold :product
end
出错信息:
undefined method `scaffold' for AdminController:Class
这是因为新版的Rails已经把scaffold剥离为插件,安装scaffolding插件
还是无法运行:
undefined method `paginate' for #<AdminController:0x33243dc>
这是因为scaffolding插件里使用的还是老式的分页方式,接着安装classic_pagination |
|
|