Archive for the 'PHP' Category

Apache乱码问题

很多时候,浏览器并不按照指定的编码来显示页面。 导致乱码。其实这和http头中的设置有很大关系:
Content-Type: text/html; charset=utf-8
当http头中有这一行的时候,浏览器总是按照这个头指示的编码来显示页面内容,
而忽略Meta tag中的设置。如果Meta和Content-Type 的charset一致时,一切都是正常的,
而一旦不一样,那就会出现问题。
而apache本身是可以通过AddDefaultCarset XXX来来设置 http头中的默认字符编码,
同时当apache和php在一起的时候,还有php.ini的一个设置会影响这个http头的默认编码:
default_charset = “utf-8″
而这个default_charset 的设置会覆盖apache的AddDefaultCarset配置,
当然也可以在每个php里面手动调用
header(”content-type:text/html; charset=xxx”)
来覆盖default_charset 的值,这么看来一共有四个地方 会对php的执行结果产生影响: 优先级别从高到低:
php的header(”content-type:text/html; charset=xxx”)函数
php.ini里面的default_charset 设置
httpd.conf 中的AddDefaultCarset设置
最后才是html代码中的:META tag
其实最简单的办法是把php.ini中的default_charset和httpd.conf中的AddDefaultCarset置空。 通过Meta tag来指定编码,header只是临时性的改变编码的最后关口。

p spell和recode居然会让php5挂掉?

从port安装的php5和extension中,pspell和recode两个扩展居然会导致php 挂掉,
有些不可思意,也许是 这两个扩展需要额外的lib没有安装,引发经典的库依赖问题??
;extension=pspell.so
;extension=recode.so
还好,这两个扩展根本用不到,注释之
不能从根本上解决问题,那让问题根本不会出现,未尝不是一个根本上解决问题的法子 :P

Seagull中的makeUrl解析

makeUrl原型位于Output:

  1. makeUrl($action = '', $mgr = '', $mod = '', $aList = array(), $params = '', $idx = 0)

makeUrl由Output调用别名函数

  1. SGL_Url::makeLink SGL_Url::makeLink($action, $mgr, $mod, $aList, $params, $idx, $this)

实现.
 而SGL_Url::makeLink则是从$conf[’site’][’outputUrlHandler’]的实例中调用
makeLink(tion, $mgr, $mod, $aList, $params, $idx, $output)完成真正的url生成。
默认情况下$conf[’site’][’outputUrlHandler’]的值为SGL_UrlParser_SefStrategy。
它是从SGL_UrlParserStrategy中继承而来。解析makeLink即可解释默认的makeUrl所发生的动作,
当然也可以自己继承SGL_UrlParserStrategy,来实现自己独特风格的makeUrl函数。
makeLink($action, $mgr, $mod, $aList, $params, $idx) $action、$action, $mgr, $mod,从名字就可以看出来。 关键是后面$aList, $params, $idx三个参数。 makeLinnk首先将$params中的参数使用’||’拆分成’参数名|值’对的形式,比如#image_id|imageId||a|2||b|[a,1,2,3-4,,4] 将拆分成 image_id|iamgeId和 a|2和 b|[1,2,3-4,4] 两个’参数名|值’对。
然后分别将这些值对使用’|'拆成$qsParamName和$listKey循环带入$aList的每个元素进行如下检查:

  1. if ($aList不为空且$aList最后一个单元为数组
  2.     或者$aList是数组且最后一个单元为对象
  3.     或者$aList单元数目不为零。
  4.     或者$aList等于0 )
  5.     { if( $aList[$idx][$listKey]存在且$listKey不为空){
  6.              $qsParamValue = $aList[$idx][$listKey]
  7.     }elseif( $aList[$idx]存在且$listKey为空 ) { 
  8.              $qsParamValue = $idx;
  9.     }else{
  10.              if($listKey包含'[') {
  11.                     #$listKey为hash 
  12.                     $aElems = array_filter(preg_split('/[^a-z_0-9]/i', $listKey), 'strlen')
  13.                     #用非数字字母和下划线拆分不含空元素的数组 
  14.                     if (!($aList) && is_a($output, 'SGL_Output')) { 
  15.                         #如果$aList空且$output为SGL_Output的实例 
  16.                         // variable is of type  $output->org['organisation_id'] = 'foo'; 
  17.                         $qsParamValue = $output>{$aElems[0]}[$aElems[1]]
  18.                         //$qsParamValue = $output->a[1] ; 
  19.                     } else { 
  20.                         $qsParamValue = $aList[$idx][$aElems[0]][$aElems[1]]
  21.                         //$qsParamValue = $aList[$idx][a][1] ; 
  22.                     } 
  23.                 }elseif( is_a($output, 'SGL_Output') && 
  24.                             !empty($listKey) && 
  25.                             isset($output->{$listKey})){ 
  26.                     $qsParamValue = $output->{$listKey}
  27.                      # 此例中$qsParamName为image_id时 $qsParamValue = $output->imageId 
  28.                 }else{ 
  29.                     $qsParamValue = $listKey # 否则直接 a = 2 
  30.                 }
  31.          }
  32. }else{ 
  33.     $qs .= '/' . $qsParamName . '/' . $aList[$idx]->$listKey;
  34. }

由此可以看出$aList,$idx和不同格式的$params可以变化出非常多的参数取值,
下面是 $params = qsParamName|imageId||qsParamName||2||qsParamName|[a,1,2,3-4,,4] 时,一些有可能的结果,
这些结果很大程度上取决于$aList,$idx和两个参数的取值:

  1. $qsParamName = $aList[$idx][$imageId];
  2. $qsParamName = $idx;
  3. $qsParamName = $output->a[1];
  4. $qsParamName = $aList[$idx][a][1];
  5. $qsParamName = $output->imageId;
  6. $qsParamName = 2;

这其实是一个取值链,举个例子:

  1. {makeUrl(#add#,#favorite#,#favorite#,##,#image_id|imageId||a|2#)}
  2. ?>

的结果为:

  1. /favorite/action/add/image_id/60/a/2/
  2. {makeUrl(#add#,#favorite#,#favorite#,##,#image_id|imageId||a|2||qsParamName|[imageName,1,2,3-4,,4]#,)}
  3. ?>

的结果为:

  1. /favorite/action/add/image_id/60/a/2/qsParamName/$output->imageName[1]

的结果为:

  1. makeUrl(#add#,#favorite#,#favorite#,##,#image_id|imageId||a|2||qsParamName|imageName#)
  2. ?>

的结果为:

  1. /favorite/action/add/image_id/60/a/2/qsParamName/60.jpg/

Port中得PHP5没有session?

服务器上面只用python,便没有安装PHP。 前几天需要PHP了,于是打算从port构建PHP5。 但是出来得PHP5很多功能都没有(其实就是没有对应得extenssion) 比较奇怪得就是session,手册上面说默认是可以使用得。 但是从port构建出来得PHP5却无法使用session: Fatal error: Call to undefined function session_start ()
其原因就是port中得PHP默认是不支持session得,而且也不在php5-extenssion 中,而是在/www/php5-session。过去make&&make install就OK了!

PHP中的多字节字符串处理

PHP中处理单字节编码的字符串(ASCII-compatible)时,str*()系列函数就可以完全正常工作,但是在处理多多字节编码的字符串时,比如处理下面utf-8编码的中文字符串$str=”多字节字符串测试”;时,问题就出来了大大:

$str="多字节字符串测试";  //8 characters
echo strlen($str);             //结果却是24
?>

Read the rest of this entry »

Creative Commons License
This work is licensed under a Creative Commons License.