我若是我,谁又是我?我不是我,我又是谁?
注意你的运行环境,64位机器跟32位机器的代码不同
64位版本:
32位版本:
可用于替代js中的fromCharCode方法
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方法
目前项目是由多台机器在提供的,他们的代码都一致,但是我又不想写crontab去定时同步代码,因为万一服务器之间连接稍有故障,负载就会飙升。而且我的代码更新并不会太频繁,所以设计了以下方案:
1.拿一台机器当工作机
2.需要同步代码的前端机器都搭建rsync服务端
3.我同步代码到工作机,执行一个shell脚本,代码同步到前端机
rsync的服务端即前端机配置如下
建立一个/etc/rsyncd.conf文件,内容
新建一个/etc/rsync.pas文件,内容为“用户名:密码”
可以看到,我的其中一台前端需要提供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文件内容如下
从需要同步的目录算起,下面哪些不需要同步,写上就行,一行一个文件或者目录
这样,当我更改代码以后,先上传到我的工作机,然后执行/opt/sbin/sync_app就会将代码发布到所有前端提供服务的机器上了
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
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
application/cache
application/logs
从需要同步的目录算起,下面哪些不需要同步,写上就行,一行一个文件或者目录
这样,当我更改代码以后,先上传到我的工作机,然后执行/opt/sbin/sync_app就会将代码发布到所有前端提供服务的机器上了
在项目开发中,我们常常会使用到cdn,但是呢,浏览器针对单个域名只能同时发起2个请求,这就造成了空有大量带宽,但是处理时间却还是很长。
为了解决这个问题,常常会对cdn域名建立多个二级域名,来解决浏览器同域名限制2个并发的问题。
这里我使用的ci框架
为了解决这个问题,常常会对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)))) % 4 + 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;
}
}
因为项目需要有脚本不停的处理队列信息,所以需要监控脚本是否停止了,如果停止则需要再次启动。于是写了个脚本
然后将其写入crontab,每10分钟执行
#! /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;
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($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, $second);
curl_setopt($ch, CURLOPT_COOKIE, $_SERVER['HTTP_COOKIE']);
if (!empty($post_data)) {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$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($data, 3, $file);
}
}
$obj = new ajaxproxy();
$obj->run();
?>







