作者归档:℃冻番茄

目前正在开发一个c#的flashpaper在线转换服务器

转换服务器用.net开发,win7平台

网站采用apache 的 .htpasswd http认证 采用密码保护用户上传的doc等文档源文件。

fp服务器自动从web中依次取得用户上传的doc文档,并且转换后回调web上传接口,实现文档的在线转换

下面的代码是下载web上的源文档用于在线转换

[codesyntax lang=”csharp”]

 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);
            }

[/codesyntax]

php5使用autoload实现类的自动加载

常州这边的公司用的框架是09年写的,二年了,所以有了重写的冲动!

新版框架采用php5的autoload类自动加载机制,使应用开发时无需require相应的文件,非常爽

[codesyntax lang=”php”]

/**
 *
 * 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');

[/codesyntax]

另框架在上线后,自动把运行时的错误信息存log文件

[codesyntax lang=”php”]

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'] == 8) {
        $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);  // 写入日志文件中. 保护一行一条, 并且循环增加开启.
    }
}

[/codesyntax]

使用Varnish代替Squid做网站缓存加速器的详细解决方案[转]

我曾经写过一篇文章──《初步试用Squid的替代产品──Varnish Cache网站加速器》,但当时仅仅是用着玩,没做深入研究。

今天写的这篇关于Varnish的文章,已经是一篇可以完全替代Squid做网站缓存加速器的详细解决方案了。网上关于Varnish的资料很少,中文资料更是微乎其微,希望本文能够吸引更多的人研究、使用Varnish。

在我看来,使用Varnish代替Squid的理由有三点:
1、Varnish采用了“Visual Page Cache”技术,在内存的利用上,Varnish比Squid具有优势,它避免了Squid频繁在内存、磁盘中交换文件,性能要比Squid高。
2、Varnish的稳定性还不错,我管理的一台图片服务器运行Varnish已经有一个月,没有发生过故障,而进行相同工作的Squid服务器就倒过几次。
3、通过Varnish管理端口,可以使用正则表达式快速、批量地清除部分缓存,这一点是Squid不能具备的。

点击在新窗口中浏览此图片


下面来安装Varnish网站缓存加速器(Linux系统):
1、创建www用户和组,以及Varnish缓存文件存放目录(/var/vcache):

/usr/sbin/groupadd www -g 48
/usr/sbin/useradd -u 48 -g www www
mkdir -p /var/vcache
chmod +w /var/vcache
chown -R www:www /var/vcache

2、创建Varnish日志目录(/var/logs/):

mkdir -p /var/logs
chmod +w /var/logs
chown -R www:www /var/logs

3、编译安装varnish:

wget http://blog.s135.com/soft/linux/varnish/varnish-1.1.2.tar.gz
tar zxvf varnish-1.1.2.tar.gz
cd varnish-1.1.2
./configure –prefix=/usr/local/varnish
make && make install

4、创建Varnish配置文件:

vi /usr/local/varnish/vcl.conf

输入以下内容:

引用
backend myblogserver {
set backend.host = “192.168.0.5”;
set backend.port = “80”;

acl purge {
“localhost”;
“127.0.0.1”;
“192.168.1.0”/24;
}

sub vcl_recv {
if (req.request == “PURGE”) {
if (!client.ip ~ purge) {
error 405 “Not allowed.”;
}
lookup;
}

if (req.http.host ~ “^blog.s135.com”) {
set req.backend = myblogserver;
if (req.request != “GET” && req.request != “HEAD”) {
pipe;
}
else {
lookup;
}
}
else {
error 404 “Zhang Yan Cache Server”;
lookup;
}
}

sub vcl_hit {
if (req.request == “PURGE”) {
set obj.ttl = 0s;
error 200 “Purged.”;
}
}

sub vcl_miss {
if (req.request == “PURGE”) {
error 404 “Not in cache.”;
}
}

sub vcl_fetch {
if (req.request == “GET” && req.url ~ “\.(txt|js)$”) {
set obj.ttl = 3600s;
}
else {
set obj.ttl = 30d;
}
}

这里,我对这段配置文件解释一下:
(1)、Varnish通过反向代理请求后端IP为192.168.0.5,端口为80的web服务器;
(2)、Varnish允许localhost、127.0.0.1、192.168.0.***三个来源IP通过PURGE方法清除缓存;
(3)、Varnish对域名为blog.s135.com的请求进行处理,非blog.s135.com域名的请求则返回“Zhang Yan Cache Server”;
(4)、Varnish对HTTP协议中的GET、HEAD请求进行缓存,对POST请求透过,让其直接访问后端Web服务器。之所以这样配置,是因为POST请求一般是发送数据给服务器的,需要服务器接收、处理,所以不缓存;
(5)、Varnish对以.txt和.js结尾的URL缓存时间设置1小时,对其他的URL缓存时间设置为30天。

5、启动Varnish

ulimit -SHn 51200
/usr/local/varnish/sbin/varnishd -n /var/vcache -f /usr/local/varnish/vcl.conf -a 0.0.0.0:80 -s file,/var/vcache/varnish_cache.data,1G -g www -u www -w 30000,51200,10 -T 127.0.0.1:3500 -p client_http11=on

6、启动varnishncsa用来将Varnish访问日志写入日志文件:

/usr/local/varnish/bin/varnishncsa -n /var/vcache -w /var/logs/varnish.log &

7、配置开机自动启动Varnish

vi /etc/rc.local

在末尾增加以下内容:

引用
ulimit -SHn 51200
/usr/local/varnish/sbin/varnishd -n /var/vcache -f /usr/local/varnish/vcl.conf -a 0.0.0.0:80 -s file,/var/vcache/varnish_cache.data,1G -g www -u www -w 30000,51200,10 -T 127.0.0.1:3500 -p client_http11=on
/usr/local/varnish/bin/varnishncsa -n /var/vcache -w /var/logs/youvideo.log &

8、优化Linux内核参数

vi /etc/sysctl.conf

在末尾增加以下内容:

引用
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 5000    65000

再看看如何管理Varnish:
1、查看Varnish服务器连接数与命中率:

/usr/local/varnish/bin/varnishstat

点击在新窗口中浏览此图片

2、通过Varnish管理端口进行管理:
用help看看可以使用哪些Varnish命令:

/usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 help
引用
Available commands:
ping [timestamp]
status
start
stop
stats
vcl.load
vcl.inline
vcl.use
vcl.discard
vcl.list
vcl.show
param.show [-l] []
param.set
help [command]
url.purge
dump.pool

3、通过Varnish管理端口,使用正则表达式批量清除缓存:
(1)、例:清除类似http://blog.s135.com/a/zhangyan.html的URL地址):

/usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge /a/

(2)、例:清除类似http://blog.s135.com/tech的URL地址:

/usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge w*$

(3)、例:清除所有缓存:

/usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge *$

4、一个清除Squid缓存的PHP函数(清除Varnish缓存同样可以使用该函数,无需作任何修改,十分方便):

  1. <?php
  2. function purge($ip, $url)
  3. {
  4. $errstr = ”;
  5. $errno = ”;
  6. $fp = fsockopen ($ip, 80, $errno, $errstr, 2);
  7. if (!$fp)
  8. {
  9. return false;
  10. }
  11. else
  12. {
  13. $out = “PURGE $url HTTP/1.1\r\n”;
  14. $out .= “Host:blog.s135.com\r\n”;
  15. $out .= “Connection: close\r\n\r\n”;
  16. fputs ($fp, $out);
  17. $out = fgets($fp , 4096);
  18. fclose ($fp);
  19. return true;
  20. }
  21. }
  22. purge(“192.168.0.4”, “/index.php”);
  23. ?>

附1:Varnish官方网站:http://www.varnish-cache.org/

附2:2007年12月10日,我写了一个每天0点运行,按天切割Varnish日志,生成一个压缩文件,同时删除上个月旧日志的脚本(/var/logs/cutlog.sh):
/var/logs/cutlog.sh文件内容如下:

引用
#!/bin/sh
# This file run at 00:00
date=$(date -d “yesterday” +”%Y-%m-%d”)
pkill -9 varnishncsa
mv /var/logs/youvideo.log /var/logs/${date}.log
/usr/local/varnish/bin/varnishncsa -n /var/vcache -w /var/logs/youvideo.log &
mkdir -p /var/logs/youvideo/
gzip -c /var/logs/${date}.log > /var/logs/youvideo/${date}.log.gz
rm -f /var/logs/${date}.log
rm -f /var/logs/youvideo/$(date -d “-1 month” +”%Y-%m*”).log.gz

设置在每天00:00定时执行:

/usr/bin/crontab -e

或者

vi /var/spool/cron/root

输入以下内容:

引用
0 0 * * * /bin/sh /var/logs/cutlog.sh

jquery使用JSONP做跨域时,IE6的问题

今天一直在调一个bug,使用jquery的jsonp做跨域时,在ie6下面,每次点击按钮,$.getJSON提交都返回不到值。

后来用Fiddler分析后才发现$.getJSON提交后,http请求被中断了。

找了很久的问题,后来发现是因为按钮放置在<form>标签里面引起的,后把submit按钮放置在form标题外面,问题解决!

分析应该是form中断了$.getJSON发出的http请求,即使action=”javascript:void(0);” 也一样被中断

记录一下,方便以后的同行们碰到同样的问题““

web版黄金白银T+D实时报价系统

http://td.phpd.cn/

采集程序托管在新浪的云计算平台,memcache缓存化处理,每5秒自动从民生银行采一次数据!

另重写了一下js,显示黄金白银的价格信息及卖买价成交量,数据源已经ok了,正在开发android手机端

开放json格式接口

http://xzytd.sinaapp.com/index.php

29号回南昌过年了,拍了些照片做纪念

来上海三个多月了,一直在嘉定就没怎么出过门,前二天去买好了回南昌的车票,运气还算不错,竟然买到了动车票。5个多小时就可以到南昌了。今天是回家过年的最后一个周末,下周这个时候就要准备回家了,再加上今天天气还不错,在租的房子附近转了转,拍了一些照片。

从民生银行拿到了比较实时的黄金T+D数据

最近开始着手练习android开发,第一个练手作用是手机端的显示黄金白银报价,因为自己闲时玩玩t+d,但市面上还没有相应的手机应用,所以决定自己做个用用。

今天分析民生银行的数据,发现还是容易得到的,然后用php封装了一下,从民生银行拿到数据,并且做上memcache缓存,生成json数据输出。这样就可以做为android手机端的数据源了!

经过分析,现在从民生银行里拿到了还算比较实时的黄金t+d和白银t+d的报价信息。价格信息非常的全,买卖共10个报价并且交易手数等等。目前已经封装成了接口形式

数据源 http://phpd.cn/td.php 支持JSONP格式,跨域直接调用

html显示页面 http://phpd.cn/td.html 演示只显示白银t+d

希望有共同爱好的朋友一起讨论讨论。

今天在mac ox上把android开发环境配置好了

android sdk官方站被墙了,还好找到了一个估计是appspot搭的代理站

http://androidappdocs-staging.appspot.com/sdk/index.html

eclipse还是比较好下载的,安装及配置的方法与在windows上相同!

第一个练手项目,准备开发一个android2.1下的用于显示黄金、白银、美指等数据的小APP。数据源初步打算用php从和讯或cngold等比较及时的站点采集得到,然后封装成接口供app调用!

2011年的第一天,祝大家元旦快乐!

辞旧迎新的时刻,祝愿大家在2011年身体健康、工作顺心、数钱数到手抽筋!!!!

自从来上海加入我友网后,工作上还算顺利的,像什么加班啊、福利啊什么的神马都是浮云,就希望他妈的发些年终奖另多调几天的休,好好过完这个年。

另就近网web版已进入开发尾期,服务接口都已开发完毕,现在开始抽时间好好学习android开发了,手机端的 LBS 应用还是有非常大的市场前景的,真是另人期待啊。

博客更新了主题,启用了反垃圾评论插件

主题用的是Lightword最新版,修改了一下css,让它显示中文更好,默认字体改为微软雅黑。

另博客里的垃圾评论太多了,以前一直不愿整理,后来才知道wp自带了一个非常棒的反垃圾评论插件Akismet,只是没启用而以,今天也把它打开了,500多个评论99%拉到了垃圾评论里面,确实不错!

之前wp的自动升功能一直不好使,同样也是今天才发现wp的文件所有者是root,用ftp的方式根本改不了wp的文件,chown了一下,就ok了.

另诚招独立博客友情链接!