总有一些美好,期待着我们去发现
RSS 图标 Email 图标 首页图标
  • PHP实现类似tail命令读取最后n行的方法

    发表于 2010年01月1日 黄良懿 没有评论

    需要分析日志时tail命令可是常需要用到的,可惜php内并没有提供类似的方法,所以自己实现了一个。 调用方式为tail($filename, $rows),每次默认读取1024字节作为缓冲,返回字符串数组,文件尾的行靠前(这里的行为和tail有所区别,如果需要以原序返回的请自行调用array_reverse)。 代码如下:

    /**
     * 读取文件最后若干行的数据
     *
     * @param string $filename
     * 文件名
     * @param string $rows
     * 行数
     * @param string $size
     * 内存缓冲区大小,默认为1024字节
     * @param string $ending
     * 行尾分隔符,默认为\n
     * @return array
     * 读取成功则返回字符串数组,文件尾的字符串靠前,读取失败则返回false
     */
    function tail($filename, $rows, $size = 1024, $ending = "\n") {
    	$ret = false;
    	if ($rows > 0 && $fp = fopen($filename, 'rb')) {
    		$pos = filesize($filename);
    		$ret = array();
    		flock($fp, LOCK_SH); 
    
    		$data = '';
    		$found = 0;
    		while ($found < $rows) {
    			$pos = $pos - $size;
    			if ($pos < 0) {
    				$size = 1024 + $pos;
    				$pos = 0;
    			}
    			fseek($fp, $pos, SEEK_SET);
    			$data = fread($fp, $size) . $data;
    			$tmp = explode($ending, $data);
    			$count = count($tmp);
    			for ($i = 1; $i < $count; $i++) {
    				$ret[] = $tmp[$count - $i];
    				$found++;
    				if ($found >= $rows) {
    					break;
    				}
    			}
    			$data = $tmp[0];
    			if ($pos <= 0) {
    				break;
    			}
    		}
    		flock($fp, LOCK_UN);
    		fclose($fp);
    	}
    	return $ret;
    }
    

    相关日志:


  • 记录一些常用的Linux命令序列

    发表于 2009年09月20日 黄良懿 没有评论

    刚好最近写些shell script,翻出些平时日常用到的一些Linux命令组合使用方式,许多方法都可以略微修改后发挥其他作用。做个合集一起放在这里做下资料留存:

    查看本机所有的tcp连接状况:
    netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

    查看当前机器上正在监听的端口号及进程名:
    netstat -npl|awk '($1=="tcp"){print $4"\t"$7}'|sed 's/[0-9\.]*://g'

    列出当前用户的所有进程详细信息:
    ps aux|grep $(whoami)

    查看自己最近20次登陆系统的时间和登出时间:
    last|grep $(whoami)|tail -20

    强行关闭Tomcat:
    ps aux|grep tomcat|grep -v grep|awk '{print $2}'|xargs kill -9

    不关闭Nginx重读配置文件:
    ps -ef | grep 'nginx: master process' | grep -v 'grep' | awk -F ' ' '{print $2}'|xargs kill -HUP

    关闭内存占用过多的php fastcgi进程,这里的$5和$6分别是虚拟内存和物理内存:
    ps aux|grep php-cgi|awk '(($5>150000||$6>60000) && $8=="S"){print $2}'|xargs kill -9

    相关日志:


  • Web应用生命周期中可能涉及的各类产品

    发表于 2009年08月30日 黄良懿 没有评论

    从事互联网开发多年,接触的各类技术、产品着实不少,最近打算做个完整的Web项目生命周期设计,收集资料之余留下此帖,仅供索引。 后面计划每一两周左右拿其中一个分类来做个小专题,收集和整理一下自己对这些产品的了解。 

    1. Web Server

      • Apache
        世界上应用最广泛,功能最强大的Web Server,当你不知道你需要一个什么样的Web Server的时候,选择它,绝对不会让你失望。
        参考文章:《Apache 2.2 中文手册》
      • Lighttpd
        轻量级Web Server,异步IO,更快的FastCGI处理,需要更高的吞吐量时,是一个非常好的选择。
      • Nginx
        同样是一个轻量级Web Server,同时也可以作为前端的反向代理来实现简单的Web负载均衡。用来配合FastCGI也是一个非常好的选择,在高并发下表现极其出色。 尽管其版本号尚是0.x.y,实际上却已经非常稳定。 文档相对比较匮乏,不太适合新手应用。 :
        参考文章:《Nginx 中文wiki》 ,《Nginx 0.7.x + PHP 5.2.8(FastCGI)搭建胜过Apache十倍的Web服务器(第4版)[原创] 》
      • IIS
        微软官方的Web Server,运行ASP / .Net的不二选择。 IIS7支持Web farm部署(类似Java的War),针对PHP做了大幅度的优化(更好的支持FastCGI),现在还不太体现出来的另外一个大的提升就是更加开放的架构设计允许开发者在更多的位置拦截处理默认的操作,包括对.html进行统一验证,Url rewrite,重写目录索引机制等。
    2. 阅读全文 »

    相关日志:


  • 解决IE6下css背景重复读取的问题

    发表于 2009年08月13日 黄良懿 没有评论

    最近碰到个问题,放狗查了得知IE6用css指定背景的时候有一个问题,默认不缓存背景图片,需要加一段Javascript来让它别闹腾:

    document.execCommand('BackgroundImageCache', false, true);
    

    不过样式表的问题需要放到js中解决还要让整个网站都装入这个js有时候是蛮讨厌的,最好还是能放在css中,毕竟这祸害根源还是css问题,而且一般都会有个全局css被全站引用,这样加起来方便。 So,我是这样做的:

    body {
        zoom: expression(function(ele){
    		if ((i = navigator.userAgent.indexOf("MSIE")) >= 0) {
    			if (parseInt(navigator.userAgent.substr(i + 4)) == 6) {
    				document.execCommand('BackgroundImageCache', false, true);
    				ele.style.zoom = '1';
    			}
    		}
        }(this));
    }
    

    这个方法的好处是只会执行一次,放在其它DOM对象上很可能会被执行n多次,太过影响效率。 附上JavaScript解决方案的全部代码:

    <!--[if IE 6]>
    <script type="text/javascript">
    try { document.execCommand('BackgroundImageCache', false, true); } catch(e) {}
    </script>
    <![endif]-->
    

    相关日志:

    • 没有相关的日志

  • OpenCMS 7.5的apache+tomcat安装指南

    发表于 2009年07月30日 黄良懿 没有评论
    网上OpenCMS的安装文章并不难找,不过Apache+Tomcat组合的少了些。这里提供的方案是两者组合,且去除了两层opencms目录的其中一层。即原目录为/opencms/opencms/,现为/opencms。 同时,webdav目录也将变为/webdav。
    注意:本文假设服务器上Apache前端开放80端口且具备反向代理模块(mod_jk亦可),Tomcat Server对内网开启8080端口。
    1. 创建一个opencms的mysql数据库,为其创建用户并赋予其对该库的CURD等常规权限(该业务需要删除权限)以及建表、删表权限。
    2. 创建CMS的Web目录,修改其所有者,下文用{CMSROOT}替代此目录。
    3. 新建虚拟主机,在虚拟主机的Host标签中需要添加proxyPort="80"并开启unpackWARS和autoDeploy,例如:
      <Host name="www.hly1980.cn"  appBase="{CMSROOT}"
      unpackWARs="true" autoDeploy="true" xmlValidation="false" 
      xmlNamespaceAware="false" proxyPort="80">
      

      阅读全文 »

    相关日志:

    • 没有相关的日志