Monday, March 22, 2010

Replace built-in PHP fatal errors with exceptions

We may want to use Exception instead of php4 style error handling systems to make error handling more consistent. We can build a bridge from old error handling to the new Exception handling.

class PhpErrorException extends Exception {}

function errorHandler($errno, $errstr, $errfile, $errline) {
throw new PhpErrorException ($errstr,$errno);
}

$handler= set_error_handler('errorHandler');

Now you can test it. For example: run echo 5/0; and you will see an exception is thrown instead that a PHP warning is given off.

Friday, March 19, 2010

memory usage in PHP

A very excellent blog about PHP memory usage: http://blog.preinheimer.com/index.php?/archives/354-Memory-usage-in-PHP.html

Unlike C/C++ developers, most PHP developers never think about memory management in PHP. It is true that PHP can free the memory after a request is processed. However, if you use PHP to process critical tasks with large amount of data, you'd better read this blog carefully, and test its memory-usage-example.php by yourself. You will see how different it is.

Monday, March 8, 2010

新版(浙版)西游记

张纪中拍的. 因为勾起了对儿时西游记的怀念, 就买了下来. 正如网上评价的, 不愧是2010年第一部雷人剧集.

白骨精是孙悟空的结拜兄妹, 最后为爱自尽.

最让我羡慕的是那个如来佛祖啊,座下美女菩萨如云: 观音, 文殊, 普贤, 全是美女. 看了真让人有恨不得早日成佛的感觉.

呵呵, 总的来说, 这部西游记作为无聊时的消遣也是可以的. 但是要和六小龄童演的西游记比起来, 考虑到时代和技术的进步, 实在是看不出新版的西游记有什么突破的地方.

哦, 对了, 剧中大牌明星云集: 唐国强是玉皇大帝, 陈冲是观音, 总而言之, 本剧可作消遣和笑料, 但成不了经典.

Tuesday, March 2, 2010

Interesting issue of Zend_Request Object

See the code below:
class TestController extends Zend_Controller_Action
{
public function testAction()
{
$params = $this->getRequest()->getParams();
}
}

It tries to get all parameters of a request. In most situations, it works fine. However, if the request contains a parameter like '?action=subscribe', and you try to get $action = $params['action']. Now, what do you think is the value of $action? If you say, it must be 'subscribe', then you are wrong.

How come this happen? The answer is, Zend_Request object set 3 default parameters: 'module', 'controller' and 'action', and they will overwrite the identified variables in the request. Back to the code above, if you var_dump($params), you probably will see the result like:
array(3) {
['module'] => string(7) "default"
['controller'] => string(5) "test"
['action'] => string(5) "test"
}

As you can see, the value of $action will be 'test'. What if we try to do $action = $this->getRequest()->getParam('action')? This doesn't help either, the value of $action is still 'test' instead of 'subscribe'. Same applies to $this->_getAllParams() and $this->_getParam().

So how do we get the correct value of action in the request? The answer is, for a POST request, we must exactly use $this->getRequest()->getPost('action'); for a GET request, we must use $this->getRequest()->getQuery('action')