环境:
从windows的svn文件目录 拷贝到mac os x下调用svn up 或是任何svn 命令
出现错误:
Can’t move ‘.svn/tmp/entries’ to ‘.svn/entries’
解决办法:
cd working folder
chflags -R nouchg ./
环境:
从windows的svn文件目录 拷贝到mac os x下调用svn up 或是任何svn 命令
出现错误:
Can’t move ‘.svn/tmp/entries’ to ‘.svn/entries’
解决办法:
cd working folder
chflags -R nouchg ./
coreseek索引更新机制
原文地址:
http://fatal.blogbus.com/logs/45153968.html
今天的时间都花在coreseek的索引更新机制上了,原来是每隔一分钟更新增量索引,每天再重建一次索引。sph_counter 中存放区分主索引和增量索引的maxid。现在的方法,依旧是每分钟更新增量索引,但是重建索引改成合并,将增量索引合并到主索引中,并更改 sph_counter中的maxid值,清空增量索引。搜索则都是同时从两个索引中搜索。
这个可是折腾了大半天才得出来的结果,合并索引不难。
其他两个都有问题,先说下今天碰到的情况。
先是更新sph_counter的maxid值,这个时候还没有考虑到清空增量索引,所以合并索引这步暂时是没有问题的,而合并索引后,再更新增量 索引,还会得到第一次建立索引后的所有增量,因为没有改变maxid,后来在coreseek.cn上看到有人提到 sql_query_post_index,可以更新增量索引后改变maxid值,于是在增量index中加入了这个选项,= =开始是手工更新增量索引,合并到主索引,这两步一起做,没有问题,后来用crontab才发现,增量索引每更新一次,前面的记录都会丢失,因为这些记录 还没有合并到主索引就被更新的增量索引覆盖了。这个方法行不通,后来问了神仙,= =,原来脚本也可以更改数据表中的值,请教了一下,此问题解决。说完另一个问题,一起贴最终的脚本内容。
在内网的vps上安装Varnish的最新版3.0来用做测试
Varnish有centos下的rpm和ubuntu下的deb二进制包下载,但我选择的是源码编译安装
先下载 wget http://repo.varnish-cache.org/source/varnish-3.0.0.tar.gz
分分享一个Varnish老版本的中文手册,比起看英文原版的省事的多。
tar -xzvf varnish-3.0.0.tar.gz
解压varnish进行编译安装
cd varnish-3.0.3
./autogen.sh
./configure
make
make install
安装成功后
varnish -V 查看版本,看是否安装成功
测试varnish
先编辑配置文件
vim /user/local/varnish/etc/varnish/default.vcl
backend default {
.host = “192.168.1.154″;
.port = “80″;
}
表示,通过varnish访问192.168.1.154的80端口
varnishd -f /usr/local/varnish/etc/varnish/default.vcl -s malloc,50m -T 127.0.0.1:200 -a 0.0.0.0:80
启动varnishd服务,端口号绑定80 设最大内存50m (VPS内存小,没办法,将就着做试验)
现在可以打开varnish了
http://192.168.1.153 (开启varnish的端口号)
戴图显示,nginx 为154上运行的web服务器,出现了varnish字样,表示缓存架设成功,已正常工作了。
有时候需要象Apache那样为指定的目录添加访问验证,一般在Apache下使用htpasswd来添加,而htpasswd是包含在apache2-utils里,一般LNMP一键安装包或自己编译安装LNMP都不会安装apache2-utils。
1、创建类htpasswd文件
执行:wget -c soft.vpser.net/lnmp/ext/htpasswd.sh;bash htpasswd.sh
按提示输入用户名、密码、及认证文件名。脚本会自动生成认证文件。记录下脚本返回的文件路径。如:/usr/local/nginx/conf/vpser.net.auth。
2、为Nginx添加auth认证配置
下面是以某域名下面的soft目录为例,在域名的server段里加上如下代码:
location ^~ /soft/
{
auth_basic “Authorized users only”;
auth_basic_user_file 这里写前面脚本返回的文件路径;
}
Authorized users only为提示信息,可以修改成自己想让他提示的信息;auth_basic_user_file 后面需要填htpasswd.sh脚本返回的人家文件的路径。按上面的提示修改好配置后,重启nginx,访问 http://yourdomainname/soft/ 就会提示输入用户名和密码。
注意,加上认证之后该目录下的PHP将不会被解析,会出现下载提示,如果想可以解析PHP可以将上面的配置改为:
location ^~ /soft/ {
location ~ .*\.(php|php5)?$ {
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fcgi.conf;
}
auth_basic “Authorized users only”;
auth_basic_user_file 这里写前面脚本返回的文件路径;
}
目前公司的开发流程是开发人员工作机win7 ,一台开发服务器,安装xen虚拟化,虚拟出n台vps,所有的vps安装centos + nginx + mysql + php-fpm 。每人一台vps或每个项目一台vps,通过samba做共享,开发机磁盘映射的方式进行远程开发。但这样做硬件资源上太过浪费,还一个问题是对网络硬盘提交svn时经常出现冲突及需要清理的问题,还经常在win下无法清理,需要进行ssh进行操作,比较麻烦。所以对公司的开发流程做出了一些改动!
开发环境 192.168.1.152这台vps运行php-fpm 开发人员win7运行nginx for win,并把每个win7的程序根目录共享出去,152 vps 按ip不同挂载所有开发人员的共享目录。 使nginx for win 远程调用152上的fast-cgi解析php.
这样,采用一台vps就可以为公司所有的开发人员提供php解析服务。win7电脑上无需安装php、php拓展或是php方面的设置,非常方便进行开发调试
当win7 svn ci操作时,svn服务器通过钩子脚本,自动对152(整合开发环境)及146(测试环境)二台vps进行svn up操作,这样多人同时开发时,直接localhost就可以看到自己开发时的效果,提交svn就可以在152上看到完整的效果了。
貌似挺有趣的,注册的博主人数满1000人,5万元1千人平分,嘿嘿。50块,差不了可以解决一年的域名费了
这个广告是从踢扑网看到的。我也挂上去玩玩~~建议有博客的童鞋们都去注册注册···
工作方式:
网站接收用户上传的doc exl pdf txt 等源文档,存放在一个需要http auth认证的目录下,防止网站用户web方式读取
然后把要转换的文档存mysql中,供fpserver转换
fpserver采用线下转换方式,比如当一台fpserver转换速度较慢时,可以在另一台pc或是服务器上再运行一套程序,只需要设定不同的标识号即可!
不知道这算不算是分布式计算,嘿嘿,每台计算机上运行一套服务器程序,从web服务器获取要转换的文档并下载下来,转换,转换成功后上传。完善的机制保证下载失败或是转换失败再者上传失败等异常问题出现后的问题解决!
fpserver无需放置机房,通过http上传,只需网速ok就行!
在使用svn钩子脚本之前,各个开发人员的开发环境中的代码采用svn进行管理,在测试环境中,每天由程序员手动svn up来更新测试环境中的代码,比较繁琐。
今天在svn服务器中使用了钩子脚本,开发人员每次ci操作都会自动调用该脚本实现测试环境中的svn up,因为公司的svn服务器与测试环境为同一台服务器,所以比较好操作
svn项目下面有hooks目录,里面存放的是全部的钩子脚本的模板
post-commit.tmpl 为客户端commit提交后触发
vi post-commit
#!/bin/sh
WEB=/home/www/yefmanage
export LANG=en_US.UTF-8
svn update $WEB --username test --password testchmod 777 post-commit
测试一下,看脚本是否有权限问题
./post-commit
正常的话,就ok了!以后每次客户端操作,自动运行该脚本
转换服务器用.net开发,win7平台
网站采用apache 的 .htpasswd http认证 采用密码保护用户上传的doc等文档源文件。
fp服务器自动从web中依次取得用户上传的doc文档,并且转换后回调web上传接口,实现文档的在线转换
下面的代码是下载web上的源文档用于在线转换
try
{
String url = "http://localhost:82/api/T1yAdWXgdGXXb1upjX.jpg";
String fileName = url.Substring(url.LastIndexOf("/") + 1);
String refer = url.Substring(0, url.LastIndexOf("/") + 1);
System.Net.HttpWebRequest req = System.Net.HttpWebRequest.Create(url) as System.Net.HttpWebRequest;
req.AllowAutoRedirect = true;
req.Referer = refer;
/*发送http认证*/
req.Credentials = new NetworkCredential("xzy", "xzy");
req.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13";
System.Net.HttpWebResponse res = req.GetResponse() as System.Net.HttpWebResponse;
System.IO.Stream stream = res.GetResponseStream();
byte[] buffer = new byte[32 * 1024];
int bytesProcessed = 0;
System.IO.FileStream fs = System.IO.File.Create("tmp/down/" + fileName);
int bytesRead;
do
{
bytesRead = stream.Read(buffer, 0, buffer.Length);
fs.Write(buffer, 0, bytesRead);
bytesProcessed += bytesRead;
}
while (bytesRead > 0);
fs.Flush();
fs.Close();
res.Close();
}
catch(Exception err)
{
MessageBox.Show(err.Message);
}常州这边的公司用的框架是09年写的,二年了,所以有了重写的冲动!
新版框架采用php5的autoload类自动加载机制,使应用开发时无需require相应的文件,非常爽
/**
*
* php5自动加载类功能函数
* @param string $class_name
*/
function loader($class_name){
$expandCfg=cfg('expand');
if(!empty($expandCfg) && in_array($class_name,array_keys($expandCfg))){
$classFile=$expandCfg[$class_name];
}else{
$classArr = preg_split("/(?=[A-Z])/", $class_name);
$classSysArr=array('dao','module','base','core','parent');
$classArrLast=strtolower($classArr[count($classArr)-1]);
if(in_array($classArrLast, $classSysArr)){
if('base'==$classArrLast || 'core'==$classArrLast){
$classFile=CORE_PATH.strtolower($classArr[0]).'.'.$classArrLast.'.class.php';
}elseif('parent'==$classArrLast){
$classFile=SITE_PATH.$classArrLast.'/'.strtolower($classArr[0]).'.'.$classArrLast.'.class.php';
}else{
$classFile=INCLUDE_PATH.$classArrLast.'/'.strtolower($classArr[0]).'/'.strtolower($classArr[0]).'.'.strtolower($classArr[1]).'.'.strtolower($classArr[2]).'.class.php';
}
//debug($classFile);
}
unset($classArr,$classArrLast);
}
if(isset($classFile) && file_exists($classFile)){
include($classFile);
}
}
spl_autoload_register('loader');另框架在上线后,自动把运行时的错误信息存log文件
register_shutdown_function('error_handler');
/**
*
* 判断当前页是否来自ajax提交
*/
function is_ajax()
{
if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && trim($_SERVER['HTTP_X_REQUESTED_WITH']) == 'XMLHttpRequest'){
return true;
}else{
return false;
}
}
function error_handler() {
if(isset($run_count) && $run_count === 1)
return false;
static $run_count = 1;
// 获取错误信息
$error_array = error_get_last();
// 对notice级的错误进行清除
if($error_array['type'] == {
$error_array = array();
}
if(empty($error_array) === false) {
$url = htmlspecialchars($_SERVER['REQUEST_URI']); // 当前请求访问url地址,
$date = date('Y-m-d H:i:s',time()); // 当前时间
$error = implode(' | ',$error_array); // 将错误代码全部转化为数据.
file_put_contents(PATH.'/log/error'.date('Y_m_d').'.txt',"$date|$url,$error; \r\n",FILE_APPEND); // 写入日志文件中. 保护一行一条, 并且循环增加开启.
}
}