Linux做PHP守护进程

PHP代码
  1. <?php    
  2. /*  
  3.  * Unix中 nohup 命令功能就是不挂断地运行命令,同时 nohup 把程序的所有输出到放到当前目录 nohup.out 文件中,  
  4.  * 如果文件不可写,则放到 <用户主目录>/nohup.out 文件中。那么有了这个命令以后我们php就写成shell 脚本使用  
  5.  * 循环来让我们脚本一直运行下去,不管我们终端窗口是否关闭都能够让我们php 脚本一直运行下去。  
  6.  */    
  7. #!/usr/bin/php    
  8. set_time_limit(0);    
  9. while(true){    
  10.     file_put_contents('timer.txt',date('Y-m-d H:i:s')."
    "
    ,FILE_APPEND);    
  11.     echo date("Y-m-d H:i:s"), 'OK!';    
  12.     sleep(30);    
  13. }    
 #chmod +x timer.php 
 * 让它在后台运行: 
 # nohup /var/www/html/timer.php & 
 * &符号的作用是让进程在后端挂起 
 *  
 # ps 
 * 将会在终端显示  5155 pts/1 00:00:00 timer.php 
 *  
 * 终结进程 
 # kill -9 5155 

YII架构与流程简单剖析

 为了便于理解,按YII包里的Demo中的博客项目执行的流程来解析。

YII是单入口形式,项目的所有的访问都通过一个入口文件来进行,index.php:
PHP代码
  1. <?php  
  2.   
  3. // change the following paths if necessary  
  4. $yii=dirname(__FILE__).'/../../framework/yii.php';  
  5. $config=dirname(__FILE__).'/protected/config/main.php';  
  6.   
  7. // remove the following line when in production mode  
  8. // defined('YII_DEBUG') or define('YII_DEBUG',true);  
  9.   
  10. require_once($yii);  
  11. Yii::createWebApplication($config)->run();  
入口文件的内容很简单,包含框架里的yii.php文件和项目的配置文件(一般是项目文件夹下的protected/config/main.php)。Yii继承于YiiBase,YiiBase的最后有这么几行(其中注释是我添加的)
PHP代码
  1. spl_autoload_register(array('YiiBase','autoload'));//注册__autoload()函数  
  2. require(YII_PATH.'/base/interfaces.php');//引入接口定义  
再回到入口文件上,最后一行,顾名思义就是运行WebApp,进入到YiiBase.php,有这些代码:
PHP代码
  1. public static function createWebApplication($config=null)  
  2. {  
  3.     return self::createApplication('CWebApplication',$config);  
  4. }  
  5.   
  6.   
  7. public static function createApplication($class,$config=null)  
  8. {  
  9.     return new $class($config);  
  10. }  
从这些代码可以看出入口文件里的createWebApplication($config)其实是创建了一个新的对象CWebApplication  
 Yii::createWebApplication($config)->run();等价于执行了CWebApplication($config)->run();
今天至此为止,改天继续。

 

windows,linux下SVN实现自动更新WEB目录

 通过SVN进行版本库管理,每次提交后,都要在SVN服务器更新最新上传的版本到WEB目录进行同步。操作比较烦琐,而且效率也低。使用SVN钩子脚本进行WEB目录同步,可很好的解决这方面的问题。由于测试机器与SVN库都在同一台机器里,所以处理起来比较方便。

 
svn项目下面有hooks目录,里面存放的是全部的钩子脚本的模板
 
post-commit.tmpl 为客户端commit提交后触发
 
以下是windows和linux下自动更新版本库的方法:
 
在SVN 项目版本库的存储目录下的hooks 目录,新建立一个post-commit.bat 文件:
 
windows:
 
@echo off
SET REPOS=%1
SET REV=%2
SET DIR=%REPOS%/hooks
SET PATH=%PATH%;
SET WORKING=E:/www/o135
svn update %WORKING% –username o135 –password o135123
 
注意:以上方法必须把SVN服务器安装目录下的bin加入到path路径(环境变量)中。SVN通过setup进行安装,默认会将bin目录增加到path路径中,如果通过压缩包进行安装,必须要手动增加。
 
要想知道此脚本是否出错,可在cmd命令行里输入:C:Documents and SettingsAdministrator>e:/svn/hooks/post-commit.bat  进行测试。出现以下信息则表明脚本成功执行:
 
C:Documents and SettingsAdministrator>e:/svn/hooks/post-commit.bat
正在升级 ‘E:wwwo135′:
版本 15。
 
红色部分是版本库的位置,大家按实际位置进行修改。
 
以后不管那台机器,只能通过svn commit命令,都会触发此脚本,自动同步web目录中。
 
linux:
 
linux下原理跟windows是一样的。只是新建的文件名不一样。
 
在SVN 项目版本库的存储目录下的hooks 目录,新建立一个post-commit文件:
 
vi post-commit
 
增加以下代码:
 
#!/bin/sh
WEB=/home/data/o135
export LANG=en_US.UTF-8
svn update $WEB –username o135 –password 'o135123'
 
保存,退出。。
 
给予此脚本的权限:
 
chmod 777 post-commit
 
测试一下,看脚本是否有权限问题
 
./post-commit
 
以后每次客户端提交操作,就会自动运行该脚本。

CI的一个Session丢失的Bug

  今天同组的同事跟我反映前台点击一些功能跳转到用户中心登陆后不会自动返回登陆前的页面。之前也没仔细测试,乘现在仔细调试调试。

  这个项目是基于CodeIgniter开发的,进入登陆页面时会把来源网址记录在CI的Session里,登陆成功后跳转回去,看来是记录的数据丢失了。

  CI的Session其实是将数据序列化后存在于数据库或者Cookie中,我用的是存在Cookie中,用开发者工具查看数据是在保存起来的,但是用CI的Session类读取数据就是读取不到,经过调试,初步发现原数据被清除了。进一步跟踪,发现是在检验Cookie数据的MD5值时与原值对不上,一时纳闷了,为什么会对不上呢?仔细看了下取出来的Cookie的值,发现urlencode后保存的网址数据被自动解码了,存之前的MD5是编码后的数据,取出来的是解码后的,因此对不上,CI为了安全,认为此数据被人为修改了,就销毁了它。

  这是在谷歌Chrome浏览器下出现的状况,不知道在其它浏览器下读取Cookie会不会自动解码,暂时没时间一一测试。

  找到原因,就好解决了,存数据的时候不要进行网址编码,如有必要在取出来后再进行urlencode编码。