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:
- makeUrl($action = '', $mgr = '', $mod = '', $aList = array(), $params = '', $idx = 0)
makeUrl由Output调用别名函数
- 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的每个元素进行如下检查:
- if ($aList不为空且$aList最后一个单元为数组
- 或者$aList是数组且最后一个单元为对象
- 或者$aList单元数目不为零。
- 或者$aList等于0 )
- { if( $aList[$idx][$listKey]存在且$listKey不为空){
- $qsParamValue = $aList[$idx][$listKey]
- }elseif( $aList[$idx]存在且$listKey为空 ) {
- $qsParamValue = $idx;
- }else{
- if($listKey包含'[') {
- #$listKey为hash
- $aElems = array_filter(preg_split('/[^a-z_0-9]/i', $listKey), 'strlen');
- #用非数字字母和下划线拆分不含空元素的数组
- if (!($aList) && is_a($output, 'SGL_Output')) {
- #如果$aList空且$output为SGL_Output的实例
- // variable is of type $output->org['organisation_id'] = 'foo';
- $qsParamValue = $output>{$aElems[0]}[$aElems[1]];
- //$qsParamValue = $output->a[1] ;
- } else {
- $qsParamValue = $aList[$idx][$aElems[0]][$aElems[1]];
- //$qsParamValue = $aList[$idx][a][1] ;
- }
- }elseif( is_a($output, 'SGL_Output') &&
- !empty($listKey) &&
- isset($output->{$listKey})){
- $qsParamValue = $output->{$listKey}
- # 此例中$qsParamName为image_id时 $qsParamValue = $output->imageId
- }else{
- $qsParamValue = $listKey # 否则直接 a = 2
- }
- }
- }else{
- $qs .= '/' . $qsParamName . '/' . $aList[$idx]->$listKey;
- }
由此可以看出$aList,$idx和不同格式的$params可以变化出非常多的参数取值,
下面是 $params = qsParamName|imageId||qsParamName||2||qsParamName|[a,1,2,3-4,,4] 时,一些有可能的结果,
这些结果很大程度上取决于$aList,$idx和两个参数的取值:
- $qsParamName = $aList[$idx][$imageId];
- $qsParamName = $idx;
- $qsParamName = $output->a[1];
- $qsParamName = $aList[$idx][a][1];
- $qsParamName = $output->imageId;
- $qsParamName = 2;
这其实是一个取值链,举个例子:
- {makeUrl(#add#,#favorite#,#favorite#,##,#image_id|imageId||a|2#)}
- ?>
的结果为:
- /favorite/action/add/image_id/60/a/2/
- {makeUrl(#add#,#favorite#,#favorite#,##,#image_id|imageId||a|2||qsParamName|[imageName,1,2,3-4,,4]#,)}
- ?>
的结果为:
- /favorite/action/add/image_id/60/a/2/qsParamName/$output->imageName[1]
的结果为:
- makeUrl(#add#,#favorite#,#favorite#,##,#image_id|imageId||a|2||qsParamName|imageName#)
- ?>
的结果为:
- /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 Read the rest of this entry »
echo strlen($str); //结果却是24
?>
