关于PEAR的DB和MDB2方法对比
在从前的php4时代,我很喜欢使用pear的DB库,使用非常方便。但是现在pear官方站已经建议我们采用MDB2来代替它,虽然MDB2的前身可能有一些DB的影子,但是使用方法还是有一些不同,这些天一边使用,一边做些笔记。
MDB2
DB
queryAll
getAll
queryRow
getRow
queryCol
getCol
queryOne
getOne
其它方法貌似一致。
在从前的php4时代,我很喜欢使用pear的DB库,使用非常方便。但是现在pear官方站已经建议我们采用MDB2来代替它,虽然MDB2的前身可能有一些DB的影子,但是使用方法还是有一些不同,这些天一边使用,一边做些笔记。
MDB2
DB
queryAll
getAll
queryRow
getRow
queryCol
getCol
queryOne
getOne
其它方法貌似一致。
最近留意了一下,memcache出现了几个旁支项目,很有一点意思,也许在日后的项目中可以用的上。
memcached-tag
给memcache增加了tag功能,新增的命令如下:
tag_add <tag> <key>
tag_delete <tag>
Memcached is a high-performance, distributed memory object caching system.
We add “Tag Function” for memcached. Propose is remove several keys with the same tag in one operation. This function will help the API programmers (such as php) do the delete operation easily, and reduce the network load. We use hash and splay tree, […]
我们知道,在php中使用require_once/include_once虽然方便,但是代价昂贵,据测试数据来看,require_once比require慢3-4倍,所以在php开发中,我们应该尽量使用require/include。
列一下俺常用的避免require/include的方法。
使用__autoload
php5可以使用__autoload来避免require,用的好的话,代码里头甚至看不到几个require,实在是安逸啊。测试结果表明,使用__autoload之后的new Foo; 比 require_once 'foo.php'; new Foo; 大概要快3倍左右。
使用defined检测是否载入过
在代码开头使用defined检测是否定义过对应的常量,如果有的话,直接return。
PLAIN TEXT
PHP:
<?php
if(!defined('_MYCLASS_'))
return;
define('_MYCLASS_', 1);
class MyClass { ... }
?>
测试了一下,defined的性能也不是太好...
require前检查
用class_exists或者function_exists检查一下,确认没有载入过再出手,至少比require_once能快上3倍。php4也可以用上。
PLAIN TEXT
CODE:
class_exists('myClass') or require('/path/to/myClass.class.php');
之前在论坛上灌水的时候,也曾经看到别人提到过PDO的一些生僻用法。但是当时觉得短期内不会用上,所以不是太在意。等到要用的时候,满世界也找不到出处。
这使我下定决心,做点PDO的小笔记,慢慢补。
设定PDO的fetchMode
初始化pdo的时候,就设定好PDO的fetchMode,应该能省点事,比如我最喜欢的fetchMode是FETCH_OBJ。
PLAIN TEXT
PHP:
$dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO:FETCH_OBJ);
其中PDO::ATTR_DEFAULT_FETCH_MODE是php 5.2.0之后才新增的常量
还可以在实例化PDO对象的时候就完成这个设定:
PLAIN TEXT
PHP:
$dbh = new PDO("mysql:dbname=dbname", "user", "password",
array(PDO::ATTR_DEFAULT_FETCH_MODE => PDO:FETCH_OBJ));
最近两年干的php所有活儿,都是在php的short_tag关闭的情况下完成的。我也不爱使用那些乱七八糟的template engine,没意义,所以代码里面会有很多php的标签,看着有点晕,这时候会怀念当年php的short_tag,简单是美,短小精悍...应该也是美的吧?
贴个形式对比:
现在使用的
PLAIN TEXT
PHP:
I have <?php echo $foo?> foo.
从前的好日子
PLAIN TEXT
PHP:
I have <?=$foo?> foo.
可以少写9个字节,要是代码按字节算钱,boss应该可以省下一小笔。
PDO_MYSQL是PHP Data Objects (PDO) interface的一个mysql扩展。仔细看看php手册上面,其实还是有些有趣的参数可供使用,例如:
PDO::MYSQL_ATTR_INIT_COMMAND (integer)
Command to execute when connecting to the MySQL server. Will automatically be re-executed when reconnecting.
当我使用PDO_MYSQL连上mysql以后,可以利用这个参数自动执行一些QUERY。最常见的使用场合是连接mysql使用utf-8字符集:
PLAIN TEXT
CODE:
$db = new PDO("mysql:dbname=dbname", "user", "password",
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
以上代码会在连上mysql之后马上执行sql:
PLAIN TEXT
CODE:
set names 'utf8';
最近使用simplexml来解析各种feed源,碰到了一些小问题。
用simplexml处理atom数据
很多博客使用atom来输出数据,但是atom使用了名称空间(namespace),所以现在请求被命名的元素和本地名称时必须指定名称空间统一资源标识符(URI),还有一点就是simplexml的xpath方法无法直接query这个xml tree。
从 PHP 5.1 版开始,SimpleXML 可以直接对带名称空间的文档使用 XPath 查询。和通常一样,XPath 位置路径必须使用名称空间前缀,即使搜索的文档使用默认名称空间也仍然如此。registerXPathNamespace() 函数把前缀和后续查询中使用的名称空间 URL 联系在一起。
下面是使用xpath查询atom文档title元素的例子:
PLAIN TEXT
CODE:
$atom = simplexml_load_file('http://www.ooso.net/index.php/feed/atom');
$atom->registerXPathNamespace('atom', 'http://www.w3.org/2005/Atom');
$titles = $atom->xpath('//atom:title');
foreach ($titles as $title)
echo "<h2>" . $title . "</h2>";
用simplexml处理rss数据
wordpress可以输出rss2的数据源,这里面也有一些不同的namespace,比如dc。一个使用simplexml解析rss2的例子: