月份:2011年5月

新开发的FlashPaper转换服务器

工作方式:

网站接收用户上传的doc exl pdf txt 等源文档,存放在一个需要http auth认证的目录下,防止网站用户web方式读取

然后把要转换的文档存mysql中,供fpserver转换

fpserver采用线下转换方式,比如当一台fpserver转换速度较慢时,可以在另一台pc或是服务器上再运行一套程序,只需要设定不同的标识号即可!

不知道这算不算是分布式计算,嘿嘿,每台计算机上运行一套服务器程序,从web服务器获取要转换的文档并下载下来,转换,转换成功后上传。完善的机制保证下载失败或是转换失败再者上传失败等异常问题出现后的问题解决!

fpserver无需放置机房,通过http上传,只需网速ok就行!


利用svn的钩子脚本实现测试服务器代码的即时更新

在使用svn钩子脚本之前,各个开发人员的开发环境中的代码采用svn进行管理,在测试环境中,每天由程序员手动svn up来更新测试环境中的代码,比较繁琐。

今天在svn服务器中使用了钩子脚本,开发人员每次ci操作都会自动调用该脚本实现测试环境中的svn up,因为公司的svn服务器与测试环境为同一台服务器,所以比较好操作

svn项目下面有hooks目录,里面存放的是全部的钩子脚本的模板

post-commit.tmpl 为客户端commit提交后触发

vi post-commit

[codesyntax lang=”bash”]

#!/bin/sh
WEB=/home/www/yefmanage
export LANG=en_US.UTF-8
svn update $WEB --username test --password test

[/codesyntax]

chmod 777 post-commit

测试一下,看脚本是否有权限问题

./post-commit

正常的话,就ok了!以后每次客户端操作,自动运行该脚本


目前正在开发一个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]