每月彙整: 2008 年 11 月

php preg_replace bug ??

這個問題在在Zend Framework 中
Zend/Db/Statement.php
裡面
[cc lang=”php” tab_size=”2″ lines=”40″]
protected function _stripQuoted($sql)
{
// get the character for delimited id quotes,
// this is usually ” but in MySQL is `
$d = $this->_adapter->quoteIdentifier(‘a’);
$d = $d[0];

// get the value used as an escaped delimited id quote,
// e.g. ” or “” or `
$de = $this->_adapter->quoteIdentifier($d);
$de = substr($de, 1, 2);
$de = str_replace(‘\’, ‘\\’, $de);

// get the character for value quoting
// this should be ‘
$q = $this->_adapter->quote(‘a’);
$q = $q[0];

// get the value used as an escaped quote,
// e.g. ‘ or ”
$qe = $this->_adapter->quote($q);
$qe = substr($qe, 1, 2);
$qe = str_replace(‘\’, ‘\\’, $qe);

// get a version of the SQL statement with all quoted
// values and delimited identifiers stripped out
// remove “foo”bar”
$sql = preg_replace(“/$q($qe|\\{2}|[^$q])*$q/”, ”, $sql);
// remove ‘foo’bar’
if (!empty($q)) {
$sql = preg_replace(“/$q($qe|[^$q])*$q/”, ”, $sql);
}

return $sql;
}

[/cc]
發現的
我是要執行一段db->query($sql)
sql 是 insert into xxx
有把sql 單純的print 出來到mysql 中執行是可以成功執行的
trace 到最後發現會卡在preg_replace這邊
而看httpd error , access log 都沒有訊息
看message log 就會出現
Nov 12 13:22:33 mail kernel: pid 50728 (httpd), uid 80: exited on signal 4
所以判斷應該是
php 的bug

我的解法是不用preg_replace 換成
ereg_replace, mb_ereg_replace
都可以.

DB Cache

目前在實做 db cache 的作法
是抓出 cache 後去判斷是否過期 再決定是否要用這個cache
不過經過貓哥的開示 ,比較好的作法應該是要在寫入cache 的時後就確保他是沒過期的資料
而取出cache 就直接使用 ,不要在取出的時後再去判斷他是否過期
若沒cache 就用正常的方式去取得資料
有cache 則直接使用!!!

看來須要再改寫一下 cache 的部份