我若是我,谁又是我?我不是我,我又是谁?
php版本的ascii转utf8
Posted in PHP on 2012/04/25 / 评论(0) »
注意你的运行环境,64位机器跟32位机器的代码不同

64位版本:
function ascii2u8($u) {
    return iconv('ucs-2', 'utf-8//IGNORE', pack('S', $u));
}


32位版本:
function ascii2u8($u) {
    return iconv('ucs-2', 'utf-8//IGNORE', pack('n', $u));
}


可用于替代js中的fromCharCode方法
rsync主动同步代码
Posted in LINUX on 2012/01/16 / 评论(0) »
目前项目是由多台机器在提供的,他们的代码都一致,但是我又不想写crontab去定时同步代码,因为万一服务器之间连接稍有故障,负载就会飙升。而且我的代码更新并不会太频繁,所以设计了以下方案:
1.拿一台机器当工作机
2.需要同步代码的前端机器都搭建rsync服务端
3.我同步代码到工作机,执行一个shell脚本,代码同步到前端机

rsync的服务端即前端机配置如下
建立一个/etc/rsyncd.conf文件,内容
uid = root
gid = root
use chroot = no
max connections = 4
strict modes =yes
port = 873
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log

[app]
path = /data/www/xs8.cn/app.xs8.cn/
comment = app.xs8.cn
ignore errors
read only = no
list = yes
secrets file = /etc/rsync.pas
hosts allow = 10.0.0.100
hosts deny = 0.0.0.0/0

[www]
path = /data/www/xs8.cn/www.xs8.cn/
comment = www.xs8.cn
ignore errors
read only = no
list = yes
secrets file = /etc/rsync.pas
hosts allow = 10.0.0.100
hosts deny = 0.0.0.0/0

新建一个/etc/rsync.pas文件,内容为“用户名:密码”
xs8:xs8rsync

可以看到,我的其中一台前端需要提供app和www这两个二级域名的服务
启动前端机的rsync服务/usr/bin/rsync --daemon --config=/etc/rsyncd.conf 可以把这句写进/etc/rc.local

然后在工作机上建立与前端机相同的rsync.pas文件
在来个同步脚本sync_app

find /data/www/xs8.cn/app.xs8.cn/ -name ".svn"|xargs rm -r
/usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsync.pas --exclude-from=/data/www/xs8.cn/app.xs8.cn/exclude.txt /data/www/xs8.cn/app.xs8.cn/ xs8@10.0.0.11::app
/usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsync.pas --exclude-from=/data/www/xs8.cn/app.xs8.cn/exclude.txt /data/www/xs8.cn/app.xs8.cn/ xs8@10.0.0.12::app

给予执行权限chmod +x /opt/sbin/sync_app

你可以看到我排除了一些文件不进行同步,这个exclude文件内容如下
exclude.txt
application/cache
application/logs

从需要同步的目录算起,下面哪些不需要同步,写上就行,一行一个文件或者目录

这样,当我更改代码以后,先上传到我的工作机,然后执行/opt/sbin/sync_app就会将代码发布到所有前端提供服务的机器上了
处理统一资源文件的cdn地址
Posted in PHP on 2012/01/16 / 评论(0) »
在项目开发中,我们常常会使用到cdn,但是呢,浏览器针对单个域名只能同时发起2个请求,这就造成了空有大量带宽,但是处理时间却还是很长。
为了解决这个问题,常常会对cdn域名建立多个二级域名,来解决浏览器同域名限制2个并发的问题。

这里我使用的ci框架
<?php

if (!defined('BASEPATH'))
    exit(
'No direct script access allowed');

//如果未定义站点cdn二级路径名称,则自行定义之
if (!defined('SITE_CDN_NAME')) {
    
define('SITE_CDN_NAME''app');
}
//如果未定义站点cdn域名,则自行定义之
if (!defined('SITE_CDN_DOMAIN')) {
    
define('SITE_CDN_DOMAIN''.xs8xs8.cn');
}

/**
 * 获取CDN相关资源地址
 */
class cdn{

    public function 
expires($min) {
        
$expires $min*60;
        
header("Pragma: public");
        
header("Cache-Control: maxage=" $expires);
        
header("Expires: " gmdate("D, d M Y H:i:s"TIMESTAMP $expires) . " GMT");
    }

    
/**
     * 获取资源文件CDN路径
     * 例如:
     *     http://book.xs8.cn/static/js/jquery.js
     *     传递参数时需传递jquery.js
     * @param string $filename
     * @param bool $global 是否获取共用文件
     * @return string
     */
    
public function get_resources($filename$global false) {
        
$path_parts pathinfo($filename);
        
$ext strtolower($path_parts['extension']);

        if (
in_array($ext, array('js''css'))) {
            
$method 'get_cdn_' $ext;
            return 
$this->$method($filename$global);
        } else if (
in_array($ext, array('jpg''jpeg''gif''png''bmp'))) {
            return 
$this->get_cdn_img($filename$global);
        } else if (
in_array($ext, array('swf''flv'))) {
            return 
$this->get_cdn_flash($filename$global);
        } else {
            return 
SITE_URL $path;
        }
    }

    private function 
get_cdn_pre_config($filename$global) {
        
$site_cdn_name $global == false SITE_CDN_NAME 'www';
        
$url_pre sprintf("%u"crc32(md5(strtolower($filename)))) % 1//若要生成s1和s2则代码改为:%2+1
        
return array('site_cdn_name' => $site_cdn_name'url_pre' => $url_pre);
    }

    public function 
get_cdn_js($filename$global false) {
        
$cdn_config $this->get_cdn_pre_config($filename$global);

        
$url 'http://s' $cdn_config['url_pre'] . SITE_CDN_DOMAIN '/' $cdn_config['site_cdn_name'] . '/js/' $filename;
        return 
$url;
    }

    public function 
get_cdn_css($filename$global false) {
        
$cdn_config $this->get_cdn_pre_config($filename$global);

        
$url 'http://s' $cdn_config['url_pre'] . SITE_CDN_DOMAIN '/' $cdn_config['site_cdn_name'] . '/css/' $filename;
        return 
$url;
    }

    public function 
get_cdn_img($filename$global false) {
        
$cdn_config $this->get_cdn_pre_config($filename$global);

        
$url 'http://s' $cdn_config['url_pre'] . SITE_CDN_DOMAIN '/' $cdn_config['site_cdn_name'] . '/images/' $filename;
        return 
$url;
    }

    public function 
get_cdn_flash($filename$global false) {
        
$cdn_config $this->get_cdn_pre_config($filename$global);

        
$url 'http://s' $cdn_config['url_pre'] . SITE_CDN_DOMAIN '/' $cdn_config['site_cdn_name'] . '/flash/' $filename;
        return 
$url;
    }

}
监控php后台脚本的shell
Posted in LINUX on 2012/01/16 / 评论(0) »
因为项目需要有脚本不停的处理队列信息,所以需要监控脚本是否停止了,如果停止则需要再次启动。于是写了个脚本
#! /bin/bash
cd /data/www/xs8.cn/app.xs8.cn/shell/ #脚本所在目录
F=(CHANGE_USER_TICKET.php CHANGE_USER_LEVEL.php USER_COST.php) #需要监控的脚本文件名
L=(log_ticket log_level log_cost) #脚本对应的日志文件
for((i=0;i<${#F[@]};i++));do
  n=`ps aux|grep ${F[$i]}|grep -v grep|wc -l`;
  if(($n < 1));then
    nohup /usr/bin/php ${F[$i]} >> ${L[$i]} 2>&1 &
  fi
done;

然后将其写入crontab,每10分钟执行
*/10 * * * * /bin/bash /opt/sbin/check_shell.sh > /dev/null 2>&1
局限性:1.服务器必须配置有cURL 2.增加一次服务器的请求

代码如下:
<?php

/**
 * AJAX代理程序,用于跨域提交请求
 * 用于发送post或get请求
 * 只能被ajax请求所访问,直接访问将被忽略
 * 
 * @author 废墟 <r.anerg@gmail.com>
 * @link http://anerg.com
 */
ini_set("display_error"0);
error_reporting(0);
date_default_timezone_set('Asia/Shanghai');
define('BASEPATH'dirname(__FILE__));

class 
ajaxproxy {

    public function 
__construct() {
        
ob_start();
        
header("Expires: -1");
        
header("Cache-Control: no-store, private, post-check=0, pre-check=0, max-age=0"FALSE);
        
header("Pragma: no-cache");
        
header("Content-type: text/html; charset=utf-8");
        if (
get_magic_quotes_gpc()) {
            
$in = array(& $_GET, & $_POST, & $_COOKIE, & $_REQUEST);
            while (list(
$k$v) = each($in)) {
                foreach (
$v as $key => $val) {
                    if (!
is_array($val)) {
                        
$in[$k][$key] = stripslashes($val);
                        continue;
                    }
                    
$in[] = & $in[$k][$key];
                }
            }
            unset(
$in);
        }
    }

    public function 
run() {
        if (
$_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest') {
            
$request_url $this->build_url();
            if (
$request_url !== FALSE) {
                
$rs $this->_curl($request_url$_POST);
                if (
$rs === FALSE) {
                    
$this->log($request_url'AJAX_PROXY');
                    
$out = array('error' => -2000'msg' => '系统连接超时!');
                    echo 
json_encode($out);
                } else {
                    echo 
$rs;
                }
            }
        }
    }

    private function 
build_url() {
        
$app trim($_GET['app']);
        
$act trim($_GET['act']);
        if (empty(
$app) || empty($act)) {
            return 
FALSE;
        } else {
            
$args $_GET;
            unset(
$args['app'], $args['act']);
            
$uri '';
            if (!empty(
$args)) {
                
$uri .= '?';
                foreach (
$args as $k => $v) {
                    
$tmp[] = $k '=' $v;
                }
                
$uri .= join('&'$tmp);
            }
            
$request_url 'http://' $app '.xs8.cn/ajax/' $act $uri;
            return 
$request_url;
        }
    }

    private function 
_curl($url$post_data = array(), $second 5) {
        
$ch curl_init();
        
curl_setopt($chCURLOPT_URL$url);
        
curl_setopt($chCURLOPT_HEADER0);
        
curl_setopt($chCURLOPT_TIMEOUT$second);
        
curl_setopt($chCURLOPT_COOKIE$_SERVER['HTTP_COOKIE']);
        if (!empty(
$post_data)) {
            
curl_setopt($chCURLOPT_POST1);
            
curl_setopt($chCURLOPT_POSTFIELDShttp_build_query($post_data));
        }
        
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
        
$content curl_exec($ch);
        
curl_close($ch);
        return 
$content;
    }

    private function 
log($log_data$log_file) {
        
$data date("Y-m-d H:i:s") . " --> " trim($log_data) . "n";
        
$file dirname(BASEPATH) . '/application/logs/' $log_file '_' date("Y-m-d");
        
error_log($data3$file);
    }

}

$obj = new ajaxproxy();
$obj->run();
?>
分页: 1/14 第一页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]