smarty 3 alpha开始开发了。

October 22nd, 2008 by admin

smarty 3 alpha 版正在开发中
smarty官网 上看到的消息:smarty 3 alpha版本正在进行中。
总的来说,模板语法和php自身的语法更加接近。对初学者来说这是一个福音。不用再花大量的时间去熟悉”一门新语言”的语法。当初学smarty,也是从新开始学它的语法。
smarty 3 讨论组 里看到,语法会有如下更改:
我正在琢磨smarty新语法。这是smarty 3的重要特色。它不仅会简化smarty的tag语法,而且也会使学习曲线更平缓。欢迎大家踊跃回帖!
我们将引进新的更明了的smarty 3 语法,相对之前的smarty版本来说,它和php语法更接近。实际上,和php语法相比,smartt3的语法只是在分界符等方面有些不一样。

比如:

PHP:    <?= $foo ?>
Smarty: {$foo}  // 和smarty 2 一样
PHP:    <?= $foo['bar'] ?>
Smarty: {$foo['bar']}  // 不再是 {$foo.bar}
PHP:    <?=  $foo[$bar][$foo['bar']] ?>
Smarty: {$foo[$bar][$foo['bar']] ?>  // 和 PHP 一样
PHP:    <?php foreach($foo as $bar) { … } ?>
Smarty: {foreach $foo as $bar} … {/foreach}  // 只是分界符不一样
PHP:    <?php for($x = 0; $x<$y; $x++) { … } ?>
Smarty: {for $x=0; $x<$y; $x++} … {/for}  // 避免用 {section}
PHP:    <?php if($foo == $bar && $blah !== ‘ziggy’) { … } ?>
Smarty: {if $foo == $bar && $blah !== ‘ziggy’} … {/if}
除了一些语义上的差别(semantic changes),Smarty 3变量语法和php基本上是一样的。我们仍然采用 { } 语法,而不是<?php ?>.但是,你不再需要学习一堆语言
构念(constructs).所有的东邪都是直接从PHP里搬过来的。这也使得Smarty 编译器的工作变得简单。它只需简单地作下预处理,把Smarty标签换成PHP标签,接着剩下的大部分工作都由PHP编译器来搞定。

这样的话,用不用模板语法:{$foo} 还是 <?=$foo?>,由你决定。只要你愿意,可以在模板里全部使用PHP语法。我们也会保留一些不错的Smarty 2语法:
{if $foo eq $bar and $blah ne ‘ziggy’} … {/if}
我还在仔细斟酌这个,但是我期待你告诉我你的想法。

查看原文
最新的Smarty 3 Alpha代码
svn checkout http://smarty-php.googlecode.com/svn/branches/Smarty3Alpha/

Posted in php, web开发 | No Comments »

apache日志忽略某些文件

October 16th, 2008 by admin

网站流量上去之后,用tail查看apache日志,呼呼地翻屏。对服务器来说,记日志已经成为了一种负担。
像一些js,css, 图片之类的文件,记日志没有太大的必要。还好我们可以用强大的SETEnv模块来实现 “apache对特定文件的请求不记入日志”
需要修改apache配置
首先保证”LoadModule env_module modules/mod_env.so”这一行前面没有#
然后在模块载入列表之后,加上

  1. <IfModule env_module>
  2. SetEnvIf Request_URI \.gif NOLOG
  3. SetEnvIf Request_URI \.jpg NOLOG
  4. SetEnvIf Request_URI \.png NOLOG
  5. SetEnvIf Request_URI \.swf NOLOG
  6. SetEnvIf Request_URI \.css NOLOG
  7. SetEnvIf Request_URI \.js NOLOG
  8. SetEnvIf Request_URI \/admin\/ad\/judge_js\.php NOLOG
  9. SetEnvIf Request_URI \/counter_cache\.php NOLOG
  10. SetEnvIf Request_URI \/s_count\.php NOLOG
  11. SetEnvIf Request_URI \/service\/captcha/imgcode\.php NOLOG
  12. </IfModule>

然后将日志记录的那一行改成
CustomLog “|/usr/local/sbin/cronolog /data/logs/httpd/www/%Y/%m/%d/access_log.%H” combined env=!NOLOG

OK,这样日志翻屏的速度能降低不少。

Posted in linux | No Comments »

用vmware建立服务器测试环境

September 20th, 2008 by admin

典型的 web 系统结构,一般有这么几种服务器(角色): 前端web缓存服务器(用squid等),后端正式web服务器,主数据库,从数据库。

在接下来的测试环境里,我给每种服务器起了一个名字 前端web缓存服务器(web-master),后端正式web服务器(web-slave),主数据库(db-master),从数据库(db-slave)。我自己的机器假设叫u8。

下面介绍一种比较快捷的方式来搭建这几个服务器。

1.首先我们在vmware workstation 里安装 web-master,我选的是ubuntu-server 8.04版,选择服务器软件的时候,我只选了opensshd。为了避免重复,我把那些squid,apache,mysql等服务器软件放到了后面安装。

2.在u8上运行ssh-kegen -t rsa,然后把生成的id_rsa.pub里的内容拷贝到 刚装好的web-master机器里.ssh下authorized_keys文件里。

3.修改web-master设置。 首先把ip改成静态方式。首先用ifconfig -a,看网卡标识,一般是eth0,并记录下ip(我的是192.168.47.130)。然后  vi /etc/networking/interfaces

把 auto eth0http://hi.baidu.com/thinkinginlamp/blog/item/e400f819abd9a37cdbb4bd7d.html
iface eth0 inet dhcp

换成

auto eth0
iface eth0 inet static
address 192.168.47.10
gateway 192.168.47.1
netmask 255.255.255.0

保存。然后hostname web-master

并且vi /etc/hostname,把里面的内容也改成 web-master

然后  vi /etc/hosts,在里面加上

192.168.47.1    u8
192.168.47.10   web-master
192.168.47.11   web-slave
192.168.47.12   db-master
192.168.47.13   db-slave

然后 /etc/init.d/networking restart  重启网络

然后 shutdown -h now 关掉这台机器,主要是怕ip冲突。

4.在wmware里克隆web-master,依次克隆为web-slave,db-master,db-slave

5.在web-slave,db-master,db-slave这几个机器里,按第三步的操作,修改hostname,网络设置,hosts,在本例里,

web-slave用192.168.47.11;db-master用192.168.47.12; db-slave用192.168.47.13;
6.设置好之后,修改 u8的hosts,在里面也加上

192.168.47.1    u8
192.168.47.10   web-master
192.168.47.11   web-slave
192.168.47.12   db-master
192.168.47.13   db-slave

7.把private key分发到各个机器上,以实现无障碍登录。因为现在已经可以从u8登录到各服务器了。所以直接用scp就可以了。

运行

scp .ssh/id_rsa web-master:/home/adam/.ssh/

scp .ssh/id_rsa web-slave:/home/adam/.ssh/

scp .ssh/id_rsa db-master:/home/adam/.ssh/

scp .ssh/id_rsa db-slave:/home/adam/.ssh/

8.OK,大功告成,现在从u8出发,ssh web-master,登上了web-master,然后ssh web-slave ….

9.其它的各种软件可以按照各个服务器的用途来安装。

Posted in linux | No Comments »

ssh key 登录

September 19th, 2008 by admin

经常要上服务器上查看实时的信息,服务器的密码出于安全考虑,一般都比较复杂,像我这种没什么记性的人当然是记不住。所以都是记载一个txt文件上,每次登录的时候就拷贝一下密码。

其实有更简单快捷的办法,那就是用ssh key登录。初次设定也很简单。

1)在客户端运行 ssh-keygen 之类的工具,如果是windows,也有 securecrt和putty keygen 这样对应的工具。

ssh-keygen -t rsa

2.上一步的操作会生成两个文件 id-rsa, id-rsa.pub。
id-rsa保留
3.打开要登录的服务器,在相应的帐号对应的主目录下,vi .ssh/authorized_keys,在文件的最后加上刚生成的id-rsa.pub里的内容。
4. ssh user@server
不用输入密码,这样就能登录系统了。

Posted in linux | No Comments »

简单灵活的url rewrite(php实现)

July 23rd, 2008 by admin

做seo,免不了要用url rewrite。
在项目中遇到这样的问题:一个程序可选参数特别多,可能有6-7个之多。这个时候用apache自身的rewrite去实现优美的链接,就有点力不从心。
还好我们有php。
rewrite之前的链接规则可能是这样的:
index.php?id=100 rewrite成 index_id100.html
index.php?id=100&vb=1 rewrite成 index_id100_vb1.html
index.php?id=100&o=2&c=7 rewrite成 index_id100_o2_c7.html
index.php?id=100&vb=1&o=2&c=7 rewrite成 index_id100_vb1_o2_c7.html
index.php?id=100&vb=1&o=2&c=7&b=121&s=124 rewrite成 index_id100_vb1_o2_c7_b121_s124.html
一共有6个选项,分别是id,vb,o,c,b,s。每个参数都可能出现。如果不出现就不要在rewrite之后的链接里出现。如果用apache自身的rewrite。实现起来比较麻烦,我想到的是把每个选项做一次rewrite,最后rewrite成最终的结果。这样很复杂,而且也不灵活。

其实我们有简单的解决办法。
apache rewrite部分依然是需要的,但是很简单:

  1. RewriteEngine On
  2. RewriteRule ^/index(.*)\.html$ /index.php?q=$1

意思是不管有多少参数,都作为一个整体传给index.php

然后在index.php里,程序开始的地方,加上:

  1. if(isset($_GET['q']) && !empty($_GET['q']))
  2.     {
  3.         $q = $_GET['q'];
  4.         if(preg_match_all('#_([a-z]+)(\d+)#',$q,$matches))
  5.         {
  6.             foreach ($matches[1] as $i=>$key)
  7.             {
  8.                 ${$key}=$matches[2][$i];
  9.             }
  10.         }
  11.     }
  12.     //在程序的其它部分,就可以使用这些选项和选项的值了。

比如index_id100_o2_c7.html会被解析到 index.php?q=id100_o2_c7
然后程序部分,会解析,得到$id=100;$o=2;$c=7;然后在程序里使用这些变量。

其实像很多框架,像cakephp,都是通过类似的思路来实现复杂的路由和rewrite。

Posted in life | No Comments »

一些cakephp的书将要出来了

July 11th, 2008 by admin

至少有三本cakephp的书要出版了
cake php in action
上个月好像在the pirate bay上看到有下载。不过等我决定去下的时候已经没种了。而且连续一个月都没种。
Beginning CakePHP: From Novice to Professional apress的 from novice to professional 系列
再加上一本CakePHP Application Development Packt Publishing cakephp-application-development下载 出了很多不错的关于opensource的书。
cakephp的资料一直比较匮乏,相信这三本书的出版肯定会减轻广大cake爱好者的痛苦。

Posted in books, php | No Comments »

fleaphp中使用基于smarty的webControls

July 11th, 2008 by admin

需要让flea载入smarty view的配置

  1. <?php
  2. return array(
  3.       'view' => 'FLEA_View_Smarty',
  4.         'viewConfig' => array(
  5.             'smartyDir'         => realpath(VENDER_DIR.DS.'smarty'),
  6.             'template_dir'      => SMARTY_TEMPLATES,
  7.             'compile_dir'       => APP_TMP_DIR .DS . 'templates_c',
  8.             'left_delimiter'    => '<!--{',
  9.             'right_delimiter'   => '}-->',
  10.         ),
  11. );

一个使用smarty 做 view 的 webcontrol

  1. <?php
  2.     function _ctlCellNews()
  3.     {
  4.         $view = FLEA::getSingleton(FLEA::getAppInf('view'));
  5.        
  6.         //公告
  7.         $modelBulletins = FLEA::getSingleton('Model_Bulletins');
  8.        
  9.         $bulletin = $modelBulletins->find(null,'id desc');
  10.         $view->assign('bulletin',$bulletin);
  11.        
  12.        
  13.         //文章
  14.         $modelArticles = FLEA::getSingleton('Model_Articles');
  15.         $modelArticleCategories = FLEA::getSingleton('Model_ArticleCategories');
  16.         $tmp = $modelArticles->findAll(null,'id desc');
  17.         $articles = array();
  18.         foreach ($tmp as $v)
  19.         {
  20.             $rowCategory = $modelArticleCategories->find("id=$v[article_category_id]");
  21.             $v['category_name'] = $rowCategory['name'];
  22.             $articles[] = $v;
  23.         }
  24.         $view->assign('articles',$articles);
  25.        
  26.         return $view->fetch('webControls/cell_news.html');
  27.     }

模板部分(webControls/cell_news.html)

  1. <div class="cell-news">
  2.  
  3. <div id="tab-title">
  4. <span id="NOTICE" class="tab-front">商店公告</span>
  5. <span id="ARTICLE" class="tab-back">最新文章</span>
  6. </div>
  7. <div class="content-div" id="NOTICE_BODY">
  8.   <!--{$bulletin.content}--></div>
  9. <div class="content-div" id="ARTICLE_BODY" style="display:none" >
  10.   <ul class="article-list">
  11.   <!--{foreach from=$articles item=v}-->
  12.         <li>[<a href="<!--{url controller=categories action=list id=$v.article_category_id}-->"><!--{$v.category_name}--></a>] <a href="<!--{url controller=articles action=view id=$v.id}-->" title="<!--{$v.title}-->"><!--{$v.title}--></a></li>
  13.         <!--{/foreach}-->    
  14.       </ul>
  15. </div>
  16.  </div>

Posted in life | No Comments »

apache无法用http://127.0.0.1/ 访问

July 11th, 2008 by admin

前几天修改过机器的apache配置。其实所做的工作主要是把一堆的配置拆成很多个小文件。就像ubuntu里装的apache一样,会把各个虚拟主机放到一个叫sites目录下,每个主机单独一个文件。这样修改起来很方便,也很清晰。
不过问题来来了。之前用http://127.0.0.1/ 这么访问的页面现在打不开了。

  1. wget http://127.0.0.1/

提示转到 mysite.com
而不是我之前配置的域名 www.mysite.com
马上想到,如果没有配置默认虚拟主机,就会以第一个读入的为准。
现在我的虚拟主机都是放到sites目录下,第一个被读入的应该是mysite.com 而不是 www.mysite.com
mysite.com 默认是没有首页的,自然会出错
那接下来有两种做法。
1.破坏配置文件可读性的做法
把默认主机 www.mysite.com 的配置内容拷贝到 httpd.conf,放到NameVirtualHost * 和 Include sites/*.conf 之间,然后删掉 sites/www.mysite.com.conf
2.把sites/www.mysite.com.conf 重命名为 sites/0www.mysite.com.conf
因为apache的Include指令会按照目录下文件的字母顺序读。
“Shell风格(fnmatch())的通配符可以用于按照字母顺序一次包含多个文件。”

../bin/apachectl restart

OK问题解决。

Posted in life | No Comments »

不用session的验证码

July 7th, 2008 by admin

1.为什么不用session
刚来公司的时候在一个公用文件头部加上了

  1. session_start();

结果网站奇慢无比,一开始还找不到原因,后来去掉了这一行代码就好了。从那个时候起,我只敢在后台用用session。
还有一个问题是基于session的验证码,对于整个站点,比如同时打开两个页面,每个页面都有session验证码,而且这两个验证码不一致,这样其中的一个就会覆盖另一个。

2.怎么办
可以用GET方式的验证码
1)生成验证码
服务器根据当前时间戳生成一个验证码。这个过程是不可逆的:由时间戳可以得到唯一的验证码,但是由验证码无法得到时间戳。
2)客户端重新请求生成验证码
有时候生成的验证码图片不够清晰,客户端需要能够刷新,获取一张新的清晰的验证码。这个时候,可以让从用户的机器获取一个时间戳,然后传到服务器,服务器再用步骤1)里的方法生成一个验证码。
3)检校验证码
验证码表单里提交了用户的验证码和验证码生成时的时间戳,服务器根据提交的时间戳,先和服务器当前的时间做比较,如果差距比较大,就认为这个验证码过期了。如果没有过期,用用户提交的时间戳生成验证码,然后再用这个验证码和用户提交的验证码比较,如果一致就认为正确,如果不一致就认为验证码错误。

可能我说得不清楚,看代码可能会好点。

  1. <?php
  2. class ImgCode
  3. {
  4.     //密码,只存在服务器上
  5.     var $privateCode = 'ifFBi21813';
  6.     //过期时间
  7.     var $maxAge      = 300;
  8.  
  9.     //生成明码
  10.     function generate()
  11.     {
  12.         return time();
  13.     }
  14.    
  15.     //生成密码(验证码)
  16.     function generateCode($time)
  17.     {
  18.         return substr(md5($time.$this->privateCode),0,4);
  19.     }
  20.    
  21.     //检校,$verify是用户提交的密码,$time是用户提交的明码
  22.     function verify($verify,$time)
  23.     {
  24.         $now = time();
  25.         $stamp = $now-$time;
  26.         if($stamp>=0 && $stamp<=$this->maxAge)
  27.         {
  28.             $code = $this->generateCode($time);
  29.             return  $code== $verify;
  30.         }else{
  31.             return 0;
  32.         }
  33.     }
  34.    
  35. }

Posted in php | No Comments »

js表单参数utf8编码

July 1st, 2008 by admin

车网搜索上线了,是.net那边的人做的。页面默认编码是UTF8.可是车网的页面都是gb2312的,搜索表单传过去,查询参数就全乱码了。试验了一会,最后找到了解决办法,用escape函数就可以了。贴代码

  1. <form action="http://sou.che168.com/series.aspx" method="POST" accept-charset="UTF-8" id="searchForm0" onsubmit="document.getElementById('searchForm0').action='http://sou.che168.com/series.aspx?keyword='+escape(document.getElementById('s_q_0').value);">
  2. <input type="text" class="inp"  id="s_q_0" /><input type="submit" class="but" value='' style="cursor:pointer;">
  3. </form>

用escape处理过后,.net那边的程序就能识别了。貌似encodeURI也可以。

Posted in web开发 | No Comments »

« Previous Entries