March 2009 Archives

php的一些闲扯

| No Comments | No TrackBacks

上几天javaeye的robbin抱怨rails2.3的性能低下,今天就看见他找到了原因。(详细上下文)

这几年,ROR思想对web开发语言影响颇深,常用web语言基本都出现了ROR的变种,比如python的Django,php的cakephp以及国产的FleaPHP等。Python的运行机制和rails比较相像,但是php作为web开发语言的特例(运行机制特别),很多java/python/rails的设计模式直接套在php上是严重不适用的。这里有robbin一段关于PHP/Ruby/Python的非常精彩的文字,UUSee的diogin在水木的php版也留下了很多经典的php原理的文章(请自动忽略掉他和某些人的版面吵架),不知道他那本《PHP的Web体系结构》什么时候能写完。

cakephp仿ror基本已经仿到家了,除了migration没有做出来,脚手架都有了个bake. cakephp开发很爽,但是他的处理流程很不爽,一如Rasmus Lerdorf在Simple is Hard所说: 如果想开发出有扩展性的Web应用,必须保证架构是Share-nothing Architecture(Like HTTP, each request is distinct / Shared data is pushed down to the data-store layer / Avoid front controllers)。而cakephp这种需要FrontController的框架,我一直觉得很邪恶,每个请求都跑一圈bootstrap, 速度能快么...bootstrap稍微大点就变成了zend framework的效率...可扩展性不说,所有的请求都交给一个php文件来负责,大型应用上肯定是不那么令人放心,曾经的6.cn也只是在个别子站点上实验性的使用zf. java思想的symfony的性能据说更是一塌糊涂。貌似,php本质上不适合太复杂的框架,用Nginx去rewrite多好。

cakephp很流行, Django也很火, 他们都是ror思想的变种,我要不要去看看ror呢...Sun TechDay上Matz这老头除了英文口音不太好之外,还是很迷人的...

btw:刚才javaeye.com宕掉了...

smarty学习笔记1

| No Comments | No TrackBacks
getting start
smarty优点:
速度很快,内建缓存支持
自动对模板文件进行编译,编译一次之后不需要再解析
仅仅对修改过的模板文件进行重新编译
可以自定义模板定界符、函数(包括缓存处理函数)、变量,编写plugin实现扩展,有完整的插件体系结构
引擎本身可以定制
section可以无限嵌套
支持if/elseif/else/endif等流程语句
smarty init:

require('/PATH/TO/Smarty/Smarty.class.php');
/* or
define('SMARTY_DIR','/PATH/TO/Smarty/');
require(SMARTY_DIR.'Smarty.class.php');  */
/* or set include_path */
$smarty = new Smarty;

$smarty->template_dir = 'APPPATH/templates/';
$smarty->compile_dir = 'APPPATH/templates_c/';
$smarty->config_dir = 'APPPATH/configs/';
$smarty->cache_dir = 'APPPATH/cache/';

$smarty->assign('name','kinslayer');
$smarty->display('index.tpl');
 
/* use oo ->  class Smarty_GuestBook extends Smarty {} */
 
smarty for template designer
 
定界符
默认左右定界符分别是 {和}
修改默认定界符: $smarty->left_delimiter = '<!--{'; $smarty->right_delimiter = '}-->';
如果不修改默认定界符,模板中的JavaScript会被转义导致最终parse失败,解决办法是修改默认定界符,或者放在{literal}{/literal}中.{literal}中的数据会被当成文本处理,模板引擎不分析.
btw:尽量避免在JavaScript中用<!--和//-->来注释内容
注释
{* blablabla~ *}
变量
$开头, ""中自动解释, ''中不自动解释.
""中,变量建议只包含数字、字幕、下划线和[], 如果有特殊命名的变量需要解析,可以用``来包裹,比如"test `$foo.bar` test"
变量可以直接运算
变量分为三种:
PHP变量(Variables assigned from php) => {$var} / {$var[row].attr} / {$person->name}
从配置文件中读取的预定义变量(Variables loaded from config files) => {#var#}
smarty保留变量(smarty reserved variable) => {$smarty.get.page} / {$smarty.post.page} / {$smarty.cookies.username} / {$smarty.server.SERVER_NAME}
smarty保留变量中包含
  • Request variables
    • {$smarty.get.page}
    • {$smarty.post.page}
    • {$smarty.cookies.username}
    • {$smarty.server.SERVER_NAME}
    • {$smarty.env.PATH}
    • {$smarty.session.id}
    • {$smarty.request.username} {* display the variable "username" from merged get/post/cookies/server/env *}
    • ...
  • {$smarty.now}
  • {$smarty.const}
  • {$smarty.capture}
  • {$smarty.config}
  • {$smarty.section}
  • {$smarty.foreach}
  • {$smarty.template}
config_load之后可以使用$smarty.config.blabla来使用配置文件中的变量
变量调节器 Variable Modifiers
对于同一个变量,你可以使用多个修改器。它们将从左到右按照设定好的顺序被依次组合使用。使用时必须要用"|"字符作为它们之间的分隔符
capitalize:单词首字母大写
count_characters:字符计数
cat:将cat里的值连接到给定的变量后面
count_paragraphs:计算段数
count_sentences:计算局数
count_words:计算单词数
date_format:格式化时间日期
default:默认值
escape:用于转码,默认是html转码
indent:缩进
lower:纯小写
nl2br:转换\n为<br />
regex_replace:正则替换
replace:替换
spacify:在每个字符间插入空白或自定义字符
string_format:格式化字符串,多用于数字
strip:去除或者替换重复空格,\n,\t
strip_tags:去除<和>标签,包括在<和>之间的任何内容
truncate:截取字符串
upper:将变量改为全大写
wordwrap:行宽,自动换行
函数
{FuncName attr1="val1" attr2="val2"}
function的argv本质上是attr(attributes)
内建函数和自定义函数都有相同的语法.内建函数不能被override,比如 {if},{section},{strip}
自定义函数通过插件机制起作用,可以添加和修改,比如{html_options},{html_select_date}
attributes的value一般要加引号(详细参见变量),布尔值(TRUE,ON,YES,FALSE,OFF,NO)和变量作为属性的话不能加引号.
内建函数 Built-in Functions
capture:保存输出在变量中
config_load
foreach,foreachelse
include:包含其他模板
include_php:不建议使用
insert:不缓存的输出
if,elseif,else
ldelim,rdelim
literal
php:不建议使用直接嵌入php脚本
section,sectionelse:遍历数组
strip
自定义函数 Custom Functions
assign: 显示
counter: smarty内置counter
cycle: 轮转
debug
eval:将变量赋值给变量
fetch:本地文件系统、HTTP或FTP上取得文件并显示文件的内容
html_checkboxes
html_image
html_options
html_radios
html_select_date
html_select_time
html_table
math:尽量在php中计算(使用了php的eval函数)
mailto:自动生成电子邮件链接,可以防spam
popup_init
popup
textformat:格式化文本. 主要清理空格和特殊字符,对段落按单词边界换行和行缩进等段落格式化处理
配置文件
windows ini风格,可以通过section来实现类似namespace的功能
调试控制台 Debugging Console
详见文档

中国互联网啥最吸引人,当然是娱乐.孔老夫子说:食色性也, 但是我们也要反低俗~,直接搞色情网站是会被封禁的(不要问我为什么sexinsex,人性本色还有18p2p开的不亦乐乎)

两本书:

SM愛愛The Joy of SM色情消費啟示錄

虽然都是禁书(for china mainland)看了这两本书,肯定对互联网产品有好处! 香港,台湾,淘宝上都有的卖 ~ 淫民群众需要娱乐界!

btw:Google搜索引擎优化指南中文版出来了, 在这里

默认的Apache上是没有3GPP格式支持的,3GP封装的视频文件会直接乱码显示在网页中
在httpd.conf中添加以下内容即可解决问题:
AddType video/3gpp .3gp
AddType text/x-pcs-gcd .gcd
AddType text/vnd.sun.j2me.app-descriptor .jad
AddType application/java-archive .jar
AddType text/x-hdml .hdml
AddType text/vnd.wap.wml .wml
AddType text/vnd.wap.wmlscript .wmls
AddType image/vnd.wap.wbmp .wbmp
AddType audio/x-midi .mid
AddType audio/vnd.qcelp .qcp
AddType image/png .png

第一行是For 3gpp,其他的,都是手机用的
另外BS一下WindowsMobile手机, 什么都缓存...清空缓存功能都没在左右键提供...发现这个问题,重启机器还是不行,害的我改名才搞定, Opera则是检测到 3gpp格式就直接提示下载
土鳖WindowsMobile自带IE的UA:
Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 6.12) O2 Xda Atom Life
Opera 9.5b的UA:
Opera/9.51 Beta (Microsoft Windows; PPC; Opera Mobi/2723; U; en)
国产土鳖UCweb由于所有数据都通过他的Squid来访问,UA比较难拿到:
Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; PPC)
UCweb也是唯一一个点了mms地址不跳转到播放器的浏览器,不过鉴于UCweb自身也在开发手机播放器,这点可以理解

这里iana维护的标准的媒体MIME头列表