jimmy's profileJDlogPhotosBlogLists Tools Help
    November 27

    实用的Linux命令技巧(升级相关)

    实用的Linux命令技巧(升级相关)

    jimmy | 21 十一月, 2006 15:53

    获取RPM包的地址:

    http://www.rpmfind.net

    http://rpm.pbone.net/

    rpm -Uvh xxxxxxx.rpm

    经常会遇到提示需要别的包,一般的是xxxxxx-devel.rpm。可以一块儿升级:

    rpm -Uvh xxxxxx.rpm xxxxxx-devel.rpm

    AS3起,支持APT模式,可以省很多找包的力气。

    先安装APT,例如:apt-0.5.15lorg3.1-4.rh9.rf.i386.rpm

    建议,AS4安装AS4附带的APT。

    常用命令有:

    apt-get update 更新资料库

    apt-get upgrade 升级

    apt-get check 检查依赖性

    apt-get install 安装

    apt-cache search 查找

    比如,需要imagemagick的一个工具:

    apt-cache search composite

    可以看到相关的提示信息。

    用 -f 可以强制安装,apt会自动将相关的依赖都安装上,不用自己费力一个一个装了。

    apt-get -f install composite

    apt是根据配置文件指明的地址获取资源的

    vi /etc/apt/sources.list

    一个参考的配置:

    rpm http://afs.caspur.it/ afs/italia/project/linux/cern/slc302/i386/apt os updates extras
    rpm http://redhat.uni-klu.ac.at redhat/dag/el3/i386 dag
    rpm-src http://redhat.uni-klu.ac.at redhat/dag/el3/i386 dag
    rpm http://apt.sw.be redhat/el3/en/i386 dag
    rpm-src http://apt.sw.be redhat/el3/en/i386 dag

    也可以在公司内部架一个服务,管理一组机器时就更方便了。

    rpm http://192.168.1.201 pub/os/Linux/RedHat/enterprise/i386/4AS os updates itc

    #rpm-src http://server pub/os/LinuxedHat/enterprise/i386/4AS os updates
    #rpm http://ftp1.no.sohu.com pub/os/Linux/RedHat/enterprise/i386/4AS os updates itc extras rhdn rhaps

    有的时候可能会需要GPGkey,可以用下述命令导入:

    #rpm --import TheKey_youDownload

    ~~呵呵~~




    欢迎转贴,请注明来处。【本帖地址】: http://jimmy.club.sohu.com/blog/post/1/107

    实用的Linux命令技巧(查看系统)

    实用的Linux命令技巧(查看系统)

    jimmy | 21 十一月, 2006 10:12

    (某些系统可能需要安装sysstat包)

    查看网络流量

    ark -n DEV 2 2 后面两个是取样次数和间隔时间

    如果用于snmp,可以这样写:

    ark -n DEV 1 | awk '/Average.*eth1/ {print $5,$6}'

    硬盘IO查看

    iostat

    内存情况

    free

    vmstat

    CPU情况

    mpstat

    硬盘空间

    df -h

    su -sh

    查找并删除某目录下过期文件

    find /opt/cache -type f -mmin +86400 -exec /bin/ls -lart "{}" ";" -exec rm -f "{}" ";"


    SAR参数说明:

    sar [参数选项]

    参数说明:

    -A 显示所有历史数据,通过读取/var/log/sar 目录下的所有文件,并把它们分门别类的显示出来;
    -b 通过设备的I/O中断读取设置的吞吐率;
    -B 报告内存或虚拟内存交换统计;
    -c 报告每秒创建的进程数;
    -d 报告物理块设备(存储设备)的写入、读取之类的信息,如果直观一点,可以和p参数共同使用,-dp
    -f 从一个二进制的数据文件中读取内容,比如 sar -f filename
    -i interval 指定数据收集的时间,时间单位是秒;
    -n 分析网络设备状态的统计,后面可以接的参数有 DEV、EDEV、NFS、NFSD、SOCK等。比如-n DEV
    -o 把统计信息写入一个文件,比如 -o filename ;
    -P 报告每个处理器应用统计,用于多处理器机器,并且启用SMP内核才有效;
    -p 显示友好设备名字,以方便查看,也可以和-d 和-n 参数结合使用,比如 -dp 或-np
    -r 内存和交换区占用统计;
    -R
    -t 这个选项对从文件读取数据有用,如果没有这个参数,会以本地时间为标准 读出;
    -u 报告CPU利用率的参数;
    -v 报告inode, 文件或其它内核表的资源占用信息;
    -w 报告系统交换活动的信息; 每少交换数据的个数;
    -W 报告系统交换活动吞吐信息;
    -x 用于监视进程的,在其后要指定进程的PID值;
    -X 用于监视进程的,但指定的应该是一个子进程ID;

    ~~呵呵~~



    欢迎转贴,请注明来处。【本帖地址】: http://jimmy.club.sohu.com/blog/post/1/106

    Squid工作模式及实例

    Squid工作模式及实例

    jimmy | 14 十一月, 2006 16:40

    《补充:发现一个较好的文章:Squid 中文权威指南

    Squid可以工作在两种模式:

    A,加速模式

    B,代理模式

    这里重点考虑在网页加速方面的应用。Squid的访问速度比Apache快很多,及时静态内容用Squid进行一次处理也会提高很多效率。

    Squid的主要配置及缺省值:

    #Default:
    #使用的端口号
    # http_port 3128
    #定义不Cache的内容
    # acl QUERY urlpath_regex cgi-bin ?
    # no_cache deny QUERY
    #内存使用限制
    # cache_mem 8 MB
    #swap使用限制
    # cache_swap_low 90
    # cache_swap_high 95
    #最大缓冲文件大小
    # maximum_object_size 4096 KB
    #最小缓冲文件大小
    # minimum_object_size 0 KB
    #内存缓冲文件大小
    # maximum_object_size_in_memory 8 KB
    #换入换出规则
    # lru : Squid's original list based LRU policy 最近使用
    # heap GDSF : Greedy-Dual Size Frequency 频繁,小文件优先
    # heap LFUDA: Least Frequently Used with Dynamic Aging 字节点击优化
    # heap LRU : LRU policy implemented using a heap
    # cache_replacement_policy lru
    # memory_replacement_policy lru
    #缓冲存储目录
    #参数:类型,目录,大小(Mbytes), 第一级目录数,第二级目录数
    # cache_dir ufs /opt/itc/squid/cache 2048 16 256
    #日志
    # cache_access_log /opt/itc/squid/logs/access.log
    # cache_log /opt/itc/squid/logs/cache.log
    # cache_store_log /opt/itc/squid/logs/store.log
    #定义操作
    # acl aclname acltype string1 ...
    #访问许可
    #http_access deny all
    #刷新规则
    # TAG: refresh_pattern
    # usage: refresh_pattern [-i] regex min percent max [options]
    # options: override-expire
    # override-lastmod
    # reload-into-ims
    # ignore-reload
    #refresh_pattern . 86400 100% 172800 override-expire override-lastmod ignore-reload
    #网络控制许可
    # TAG: httpd_accel_host
    # TAG: httpd_accel_port
    # httpd_accel_port 80
    #单一数据源
    # httpd_accel_single_host off
    #代理模式
    # httpd_accel_with_proxy off
    #头信息控制失效
    # httpd_accel_uses_host_header off
    #控制密码保护
    # Usage: cachemgr_passwd password action action ...
    #平均大小
    # store_avg_object_size 13 KB


    典型的单网站加速基本配置:

    http_port 80
    cache_mem 3000 MB

    tcp_recv_bufsize 4096 bytes
    maximum_object_size_in_memory 1024 KB
    maximum_object_size 2048 KB
    cache_replacement_policy heap GDSF
    memory_replacement_policy heap GDSF

    禁止硬盘缓冲:

    cache_dir null /tmp

    访问控制:

    acl all src 0.0.0.0/0.0.0.0
    http_access allow all
    httpd_accel_host 10.10.82.84
    httpd_accel_port 80
    httpd_accel_with_proxy off
    httpd_accel_single_host on
    httpd_accel_uses_host_header on

    (注释: http_accel_host 就是被加速的网站地址。如果是同一台机器,可以将apache绑定到8088或其它端口,然后设置为:
    http_accel_host 127.0.0.1
    http_accel_port 8088

    参数:

    half_closed_clients off
    cache_swap_high 100%
    cache_swap_low 99%
    visible_hostname 10332server
    connect_timeout 15 seconds
    read_timeout 15 seconds
    request_timeout 15 seconds
    cache_access_log /opt/itc/squid/logs/access.log
    cache_access_log none
    cache_log /opt/itc/squid/logs/cache.log
    client_persistent_connections off
    server_persistent_connections off
    client_db off
    cache_store_log none

    对于需要同时加速多个网站,编译时禁止internal_dns,用Host文件来控制被加速网站的真实地址。(其实还有一个方法是用的Proxy模式,对需要加速的网站进行代理缓冲,但是会存在安全风险,配置会更复杂)。

    典型配置段:

    httpd_accel_host virtual
    httpd_accel_port 80
    httpd_accel_with_proxy off
    httpd_accel_single_host off
    httpd_accel_uses_host_header on
    hosts_file /etc/hosts

    (注释:对比上面可以看到,主要变化是: virtual, single_host off)

    顺便再提几个可能会有兴趣的点:

    1,Squid集群。即,一组Squid,之间互相通讯,分担同样的任务。目前来说基本没有意义。将需缓冲内容更好的分布在多个squid上面会更好。对被加速网站而言,前面架个Squid就是了,集群配置实在是鸡肋。

    2,Squid文件的更新。之前曾经写过Purge的用法的。这里再提一下:
    acl Purge method PURGE
    http_access allow all Purge

    3,Squid的snmp控制。这个还算有些意义,但是除了特别专业的应用,一般也用不到。

    ~~呵呵~~



    欢迎转贴,请注明来处。【本帖地址】: http://jimmy.club.sohu.com/blog/post/1/105

    PHP Cli模式下的注意事项

    PHP Cli模式下的注意事项

    jimmy | 10 十一月, 2006 11:44

    cli模式与cgi模式最大的不同,是没有多余信息(当然,对Web模式就不是多余了):

    [@sohu logs]# /usr/local/php5/bin/php analyze.php
    X-Powered-By: PHP/5.1.1
    Content-type: text/html

    ............................................................................................................................................................................................................................................................................................
    [@sohu logs]# /usr/local/bin/php analyze.php
    .................................................................................................................................................................

    另外,在传入参数的处理上也会略有不同。

    查看当前使用的模式:

    [@sohu logs]# php -v
    PHP 5.1.1 (cli) (built: Dec 8 2005 12:26:25)
    Copyright (c) 1997-2005 The PHP Group
    Zend Engine v2.1.0, Copyright (c) 1998-2005 Zend Technologies

    说明用的是cli模式。

    常见的问题是: 在命令行下可以正常运行的,为什么放到crontab中就不行了呢?

    一般原因是没有加路径。比如:

    #php mytest.php

    可以正常运行,放到crontab中要写成:

    1 * * * * ( cd /YOURPATH; /PHP_BIN_PATH/php mytest.php)

    加了路径,为什么执行结果不一样呢?

    可能是,PHP_BIN_PATH用的不对。PHP默认编译的时候,cgi/cli模式是都编译的,放置到不同的路径下。

    [@sohu logs]# /usr/local/php5/bin/php -v
    PHP 5.1.1 (cgi) (built: Dec 7 2005 16:53:13)
    Copyright (c) 1997-2005 The PHP Group
    Zend Engine v2.1.0, Copyright (c) 1998-2005 Zend Technologies
    [@sohu logs]# /usr/local/bin/php -v
    PHP 5.1.1 (cli) (built: Dec 8 2005 12:26:25)
    Copyright (c) 1997-2005 The PHP Group
    Zend Engine v2.1.0, Copyright (c) 1998-2005 Zend Technologies

    经常用whereis,命令行下也尽量用全路径。养成这些好习惯,可以减少很多“诡异事件”。

    ~~呵呵~~




    欢迎转贴,请注明来处。【本帖地址】: http://jimmy.club.sohu.com/blog/post/1/104

    最终走向哪里——PHP程序员之路4

    最终走向哪里——PHP程序员之路4

    jimmy | 19 十月, 2006 18:21

    随着技术水平的提高,项目经验的积累,也会逐渐赢得别人的尊重,个人待遇水平也会相映提高,提职的机会可能也会到来。当面对这样机会的时候,是我们再次重新审视自己,并调整个人发展定位的时候。更高的职位,领导更大的团队,一定是想要的么?

    每个人所追求的东西,是不完全相同的。期待有好的待遇,绝大部分人在这点上是一致的。那么,到底往什么方向发展才能实现自己的追求呢?我的理解,排除掉偶然因素,只要能选择更适合自己的发展方向,能够体现出自己的价值,是一定可以获得回报的。

    有的人,更喜欢把技术钻研的更深,更透。他需要的可能不是去领导一个团队,而是有一个空间,有一个平台。很多技术牛人是这样的。单枪匹马,研究出很多高级的技术,从而创造出价值。

    更多的人,逐步走向管理,或者侧重需求分析,或者侧重系统设计,或者侧重协调沟通,有一个共性是编码的时间逐渐减少,投入技术细节研究的时间减少。

    还有一些人,会更平衡的发展,注重资源的积累,为创业做准备。

    后两类,是我们大多数的现实情况,我就这两类发展,尤其是后者,谈一谈我的看法。

    首先,是技术水平是不是已经到了足够的高度?通常认为技术已经足够用的,遇到问题的时候才会发现还要补课的。技术是学无止境的。不管管理技巧、沟通技巧或其它对你显得多重要,也不要把技术完全的放下。要给自己留出时间,不断的学习和更新知识。

    其次,你现在所处的环境,是不是真的能够学到你需要学的东西。环境和平台是非常重要的,从别人身上学习,从实际项目中学习,比自己闷头摸索会更有效。一方面,前人的经验可以节省大量摸索的时间;另一方面,设计了很复杂的技术,其缺陷在小平台上可能不会暴露出来,从而无法得到真正的经验。从这个角度讲,做一个2、3个人技术团队的负责人,不如到大的平台上从基础做起,把自己的技术真正充实起来。

    最后,你是否为你要做出的选择,已经做好了充分的准备。不论是做管理,还是去创业,只有技术能力是远远不够的。比如,说几个点:

    1,团队。你是在一个优秀的团队中么?优秀的团队,取得成绩获得成功得可能才会更大。你选择团队,团队也会选择你。如果,你为团队成功并不能增加更多保证的话,那么选择你的这个团队,为你带来成功的保证也不会太多。

    似乎说得太拗口了,容易令人费解。直白的讲,就是不要对运气成分抱太多希望,一切要靠自己。当你做出选择的时候,先掂量一下自己。

    2,人品。或者说,是价值观,和因之而产生的行为。你愿意有怎样的付出?能够承受怎样的代价?一个成功的团队,一定是具有良好文化的团队,这就要求成员摒弃与文化不符的个性,符合团队价值。你是这样一个团队的贡献者还是破坏者呢?一个典型的例子是:团队要在一起度过艰苦的难关。如果你自己都不具备奉献精神,如何要求别人呢?每个人都不去奉献,那么只会被困难征服而不是征服困难。

    3,领导力。这个比较虚,比如个人魅力。但是,我认为有一项非常重要的,就是“给予”。不是说把自己的工资分给大家,或者是别人的工作自己来做,而是给对方真正需要的东西。小处而言,比如发现某个人工作不能完成了,牺牲自己的业余时间去帮助一下;关心其身体健康及其家人;给与技术上的指导和帮助,一起克服技术难题等等。从大处讲,创造良好的氛围,准确判断,带领团队获得成功,给予其事业的荣誉感和成就感;从切身经验出发,去发现他存在的弱点,给予认知的指导,对其个人发展提供有效的帮助。你真正的帮助了别人,获得认可和感激,领导力就会得以体现。从这点上,领导力的培养并不一定要在领导的岗位上。即使你是普通的一员,一样是可以的。

    还有一种领导力,我称之为“辅助领导力”,即:你能够通过自己的行为和努力,增强你的上级的领导力,扩大团队的凝聚力。这种能力,无论是中层还是普通员工,都是可以培养的。比如,能够体会领导安排和行为的目的,积极带头引导大家向目的靠拢;再比如,能够冷静分析,发现领导忽视的问题,并给予提醒。俗话说,一个好汉三个帮,这种辅助领导力,对于团队是非常有益的。对自身而言,不断的去想问题,也会逐渐增强对管理技巧和管理艺术的认识,从而最终转变为自身的领导力。

    希望以上能够给需要的人一些参考和借鉴。祝大家成功!

    ~~呵呵~~




    欢迎转贴,请注明来处。【本帖地址】: http://jimmy.club.sohu.com/blog/post/1/103

    跨越程序的界限——PHP程序员之路3

    跨越程序的界限——PHP程序员之路3

    jimmy | 17 十月, 2006 16:59

    很多PHPer都有这样一种言论“PHP学三个月足够了”。

    或许有人能用三个月就能把PHP手册背的溜熟,问什么都难不倒;或者,这句话的意思只是说学三个月能够到干活的水平,可以找到一份工作。看怎么理解了。

    如果赞同我前文《由熟练走向精通》中的观点,PHP不是独立的技术,还要掌握很多其它的技能。不单如此,即使把PHP、JS、HTML、MySQL…等等的使用技巧都应用的很熟了,还是有很多需要去学习的。

    由熟练到精通,由优秀到卓越,是每一个程序员应该去追求的。要成为一个卓越的程序员,要能够跳出程序技巧层面,从更高的层面去考虑问题。

    设计系统框架,能够满足扩展性与扩充性

    考虑系统性能,解决存储问题

    深刻理解需求,在最优、次优的方案中做出权衡判断

    指定详细规划,分步分批实现整体项目

    在这里意义上,只是知道PHP能做什么、不能做什么还不够,还要知道如何去做PHP不能做的事情。也就是说,你还需要去了解C/C++,了解Java,了解.NET。很多PHP不能做的事情,不是不能,其实是实现代价太大。规划适当的体系结构,选择最有性价比的实现方案,比追求单一语言的唯美更重要。当一个系统足够庞大,将部件设计为相对独立,降低部件间的语言相关度,整体系统才有长久的生命力。

    另一方面,语言也是有很多共通性的。很多证明有效的技术,在其它语言上也会有实现。在针对特定需求的设计上,很多时候不同语言最终的实现方案都有相似之处。

    编程不是为了炫耀技巧,而是为了实现需求。当设计一个项目或者一个系统的时候,就像是设计一个建筑,哪里用钢、哪里用混凝、哪里设电梯、哪里铺下水…… 每个环节设计不当都会有严重的后果,而所有这些问题一定是交织混杂的。充分掌握编程技巧,可以帮助在解决这些问题时有更多的自由。但是,只有编程技巧,是不足以解决全部问题的。

    并不是每一个程序员都可以成长成为分析员或者设计师,但是每一个有进取精神的人都不应该只满足于编程技巧而止步不前。

    ~~呵呵~~




    欢迎转贴,请注明来处。【本帖地址】: http://jimmy.club.sohu.com/blog/post/1/102

    由熟练走向精通——PHP程序员之路2

    由熟练走向精通——PHP程序员之路2

    jimmy | 16 十月, 2006 15:58

    当选定成为PHP程序员后,每个人都希望能够尽快的成长。有很多探讨更快更好学习方法的帖子,都很诚恳的进行交流,并且总结出很多有共性的方法:

    1,熟读PHP手册。首先要了解PHP的函数,大概知道PHP都能做什么,然后多看里面的例子。

    2,一定要多动手,多尝试。已经用While实现过的,下次可以用Foreach来做。不要贪懒Copy&Paste。CP是走向精通的大敌!

    3,深刻理解Http协议。看似简单,但是我确实见过2年多的程序员还在问为什么setcookie后$_COOLIE里面的值为什么不变。

    4,多看,多思考。现在的开源PHP代码非常多,其中很多都是非常优秀的。别人的代码不一定是最好的,不要简单套用;也不要轻易认为别人的实现很笨,因为可能里面有你没有预见到的障碍。只有了解障碍在那里、知道都有多少种方案、明白最终选择是如何权衡的,这些知识才真正变成你自己的。

    5,对新技术采取克制的态度。技术发展太快,常常是一个很好的技术还未来得及推广开,就已经变成过时。不可否认,新技术都有着诱人的光环,需要了解,但是不要盲从。永远跟在新技术浪尖上的,往往不是那些把项目做出来的人。当用传统方式设计出的模型与某个新技术在理念上不谋而合时,你距离精通就更近了一步。

    只把PHP语言运用很精通,还是不够的。PHP永远不是一项独立的技术,Apache、MySQL、Linux、HTML、XML是如影相随的。

    Apache和MySQL的优化,是很容易学习的。记得在实践中不断的去检验。一个重要提示,还是要思考,不要盲信。我看到很多人把Mysql的配置数值搞得比巨模式还大,认为这样就是优化的。优化的含义,是与当前的配置和应用情况相匹配,而不是简单的把配置数值弄大。当调整某个数值的时候,你是否真的明白为什么默认数值是16而不是你要设置的256呢?

    Linux系统也是很容易学,同时很重要的。有很多工作,可以交给系统去做。系统命令是很多代程序员修订过来的,效率和稳定性都是值得信任的。另外,项目紧急的时候,线上调试往往可以极大提高工作效率。当系统遇到意外的瓶颈时,也需要靠熟练的技术去找到原因。

    相对的,页面技术和数据库设计,是相对较为艰难的。CSS,HTML,JS,Ajax,学习难度常常比掌握PHP还要高。而数据库的设计,更是很难,因为没有绝对正确的答案,就像跳高比赛,只有你失败了,才知道错误在那里。我的建议,就是多向有经验的人请教和学习。

    ~~呵呵~~




    欢迎转贴,请注明来处。【本帖地址】: http://jimmy.club.sohu.com/blog/post/1/101

    你想做一个PHPer么?——PHP程序员之路1

    你想做一个PHPer么?——PHP程序员之路1

    jimmy | 13 十月, 2006 14:08

    最适合以下人员阅读:

    1,在未来2~3年内有将PHP作为主要工作的愿望

    2,个人职业尚未定型

    3,有长远志向,愿意付出辛苦努力和劳动

    当选择PHP的时候,有没有问问自己,为什么要选择它?很多人是因为PHP简单,容易学习容易上手。确实,这是PHP一个很大的优势。那么,经过一段较长时间的学习和应用,掌握并且深入了解了这种语言之后,还会继续坚持使用下去么?我们面对的选择实在太多了。当有了更多项目经验,对其它语言也有了更多了解的时候,会对当初选择PHP而感到后悔么?

    这些问题不会困扰我,因为我喜欢PHP。

    有太多关于语言的争论了,可以从里面了解很多语言的变化和进步,还是不错的,但是如果整天反反复复的非要弄出个谁比谁好的结果来,就挺无聊的。每种语言都有自己存在的必要,也有其成长的空间,只要看一看身边还有那么多的战友,踏下心来做自己的事情就是了。最重要的问题是:你是不是喜欢它?

    “Hi,你能告诉我12345×12345=?么?”

    DBer: select 12345*12345;

    Perler:#!/usr/bin/perl nprint 12345*12345

    PHPer:echo 12345*12345;

    这不仅仅是一个程序员的笑话,它背后潜台词是:你喜欢并且坚持的东西,会改变你的思维方式甚至生活方式。我的机器里面就有很多PHP写的小脚本,来辅助完成一些工作。一个典型的例子,我喜欢看Dvdrip的片子,于是写了一个脚本,配合一个reg文件,只要简单点右键选择“合并字幕”就可以将中英文字幕合并成对照的,我经常会用这个功能。在5年前,我机器里面还有很多Perl、Bash、Bat的脚本,现在基本只剩下PHP了。

    其实每种语言都有其精妙的地方。比如,对Dos命令你了解多少?“把这个目录下包括所有子目录的文件都遍历,文件大小超过10k的删除”看似很复杂的任务,但真的可以用一行Dos命令来实现。看一下for /? ,就会知道Dos也很精彩的。但是看着别人在讨论Dos命令的时候,我脑子里不自觉闪现出的是PHP的解决方案。

    正是因为喜欢,才会纵容它吞噬自己大把的时间,才会仍义无反顾的为它压榨自己每一分精力,才会为每一次取得的进展而欢欣鼓舞。喜欢,是动力的源泉。

    可能有很多人还是为了能够有一份工作而选择PHP的。其实……我觉得还是应该有更自由的选择。现在的社会进步的很快,六零年为了吃饱饭、八零年丢了铁饭碗这些历史,已经不属于我们这一代人,而且从发展上可以预见今后的生活状况和社会福利保障会更好。每个人只要能够为社会贡献出个人价值,就会获得回报的。

    所以,我建议每个要成为程序员的朋友,仔细考虑一下,是不是真的喜欢做一个程序员,喜欢PHP,并且愿意为之付出自己的努力。

    ~~呵呵~~




    欢迎转贴,请注明来处。【本帖地址】: http://jimmy.club.sohu.com/blog/post/1/100

    Squid文件手动刷新

    Squid文件手动刷新

    jimmy | 30 九月, 2006 16:50

    Squid加速是大访问量下的一个常用加速技术。对于动态产品,需要有更新接口才能保证用户体验。

    Squid中需调整配置,打开控制权限。

    acl manage src THE_IP/THE_MASK
    acl Purge method PURGE
    http_access allow manage Purge

    默认状态下,PURGE是Deny的。

    重启后,可以在Telnet下测试一下:

    telnet my_squid 80

    PURGE http://video.club.sohu.com/200609/1159196510nagrw.gif HTTP/1.0 Accept: */*


    接下来,写一个服务,用于刷新:

    /**
     * Need php with --enable-socket
     * Param:
     * $ip $port $out
     * return $in
     */function socket_service($ip, $port='80', $out=""){
            if(trim($ip)=="")return "Error: without dest host!";
            if($out=='') $out="GET / HTTP/1.1rnHost: $iprnrn";        // Create a new socket
            $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);        // An example list of IP addresses owned by the computer
            $sourceips['internal']    = '192.168.103.53';
            $sourceips['external']          = '61.135.151.40';        // Bind the source address
            socket_bind($sock, $sourceips['internal']);        // Connect to destination address
            socket_connect($sock, $ip, $port);
    trace($out);
            // Write
            socket_write($sock, $out);        // Read
            $return=socket_read($sock,100000);
            // Close
            socket_close($sock);        // Return
            return $return;
    }

    在更新内容的PHP程序中,调用这个函数,$url是显示内容的页面地址:

    [php code]

    $squid_dv=array("10.10.82.83","10.10.82.87");
    $request="PURGE $url HTTP/1.0rnAccept: */*rnrn";;
    foreach($squid_dv as $key => $ip){
    $result=socket_service($ip,80,$request);
    trace($result);
    }

    在这里例子里面,是两台Squid服务器,我分别调用了一下。如果Squid服务器很多,可能给服务器造成较大负担,就不合适了。这种Squid群,可以配置成不同的层次。有机会下次再写。

    ~~呵呵~~



    欢迎转贴,请注明来处。【本帖地址】: http://jimmy.club.sohu.com/blog/post/1/99

    实用的Linux命令技巧(备份, NFS)

    实用的Linux命令技巧(备份, NFS)

    jimmy | 27 九月, 2006 18:05

    备份。经常遇到本地机空间已经不够打包的情况

    tar -czf - html | ssh -l root 192.168.0.2 "cd /opt; cat > 133.17_html.tar.gz"

    如果需要在目标机上展开:

    tar -czf - html | ssh -l root 192.168.0.2 "cd /opt; tar -xzf -"

    NFS。

    Server端: vi /etc/exports

    /opt/video/ 10.10.82.85(rw,async,anonuid=99,anongid=99) 10.10.82.86(rw,async,anonuid=99,anongid=99)

    [共享的目录] [主机名1或IP1(参数1,参数2)] [主机名2或IP2(参数3,参数4)]
    参数:
    ro 只读访问
    rw 读写访问
    sync 所有数据在请求时写入共享
    async NFS在写入数据前可以相应请求
    secure NFS通过1024以下的安全TCP/IP端口发送
    insecure NFS通过1024以上的端口发送
    wdelay 如果多个用户要写入NFS目录,则归组写入(默认)
    no_wdelay 如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。
    hide 在NFS共享目录中不共享其子目录
    no_hide 共享NFS目录的子目录
    subtree_check 如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
    no_subtree_check 和上面相对,不检查父目录权限
    all_squash 共享文件的UID和GID映射匿名用户anonymous,适合公用目录。
    no_all_squash 保留共享文件的UID和GID(默认)
    root_squash root用户的所有请求映射成如anonymous用户一样的权限(默认)
    no_root_squas root用户具有根目录的完全管理访问权限
    anonuid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的UID
    anongid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的GID

    重启服务:

    /etc/rc.d/init.d/portmap start (在REDHAT中PORTMAP是默认启动的)
    /etc/rc.d/init.d/nfs start 启动NFS服务

    快速配置重加载:
    exportfs -rv

    查看加载情况:
    showmount -e localhost

    客户端:

    mount -t nfs -o rw 10.140.133.9:/export/home/sunky /mnt/nfs 其实参数都可以省略:

    mount 10.10.82.84:/opt/video/ /mnt/nfs_82.84/


    远程备份:

    1,建立信任关系。

    cd ~/.ssh/

    ssh-keygen -t rsa1 然后一路回车下去,

    vi identity.pub 复制公钥内容

    ssh 192.168.xxx.xxx 连入目标机

    vi ~/.ssh/authorized_keys 将复制的公钥内容粘贴进去

    (注:如果目标机支持SSH2,可以用:

    ssh-keygen -t dsa

    vi id_dsa.pub 复制公钥

    ssh 192.168.xxx.xxx

    vi ~/.ssh/authorized_key2 <-- 注意: 是key2,与RSA1文件不同!)

    用如下命令打包远程文件:

    /usr/bin/ssh 192.168.xxx.xxx "tar -cz /usr/local/apache/htdocs" > /opt/backup/mybak.tar.gz

    会有一个路径的警告信息,不用管它。



    欢迎转贴,请注明来处。【本帖地址】: http://jimmy.club.sohu.com/blog/post/1/98

    参考: 常用文件格式Mime表示

    参考: 常用文件格式Mime表示

    jimmy | 23 九月, 2006 14:21

    实际系统可能与此不同,仅作参考

    ".pdf" => "application/pdf",
    ".sig" => "application/pgp-signature",
    ".spl" => "application/futuresplash",
    ".class" => "application/octet-stream",
    ".ps" => "application/postscript",
    ".torrent" => "application/x-bittorrent",
    ".dvi" => "application/x-dvi",
    ".gz" => "application/x-gzip",
    ".pac" => "application/x-ns-proxy-autoconfig",
    ".swf" => "application/x-shockwave-flash",
    ".tar.gz" => "application/x-tgz",
    ".tgz" => "application/x-tgz",
    ".tar" => "application/x-tar",
    ".zip" => "application/zip",
    ".mp3" => "audio/mpeg",
    ".m3u" => "audio/x-mpegurl",
    ".wma" => "audio/x-ms-wma",
    ".wax" => "audio/x-ms-wax",
    ".ogg" => "audio/x-wav",
    ".wav" => "audio/x-wav",
    ".gif" => "image/gif",
    ".jpg" => "image/jpeg",
    ".jpeg" => "image/jpeg",
    ".png" => "image/png",
    ".xbm" => "image/x-xbitmap",
    ".xpm" => "image/x-xpixmap",
    ".xwd" => "image/x-xwindowdump",
    ".css" => "text/css",
    ".html" => "text/html",
    ".htm" => "text/html",
    ".js" => "text/javascript",
    ".asc" => "text/plain",
    ".c" => "text/plain",
    ".conf" => "text/plain",
    ".text" => "text/plain",
    ".txt" => "text/plain",
    ".dtd" => "text/xml",
    ".xml" => "text/xml",
    ".mpeg" => "video/mpeg",
    ".mpg" => "video/mpeg",
    ".mov" => "video/quicktime",
    ".qt" => "video/quicktime",
    ".avi" => "video/x-msvideo",
    ".asf" => "video/x-ms-asf",
    ".asx" => "video/x-ms-asf",
    ".wmv" => "video/x-ms-wmv",
    ".bz2" => "application/x-bzip",
    ".tbz" => "application/x-bzip-compressed-tar",
    ".tar.bz2" => "application/x-bzip-compressed-tar"

    注意: apache设置的Mime可能与此不同。可以手工修改Apache的Mime文件。


    参考

    <VirtualHost *>
    ServerAdmin somebody@somewhere.com
    DocumentRoot /opt/show
    ServerName xxx.com
    ServerAlias *.xxx.com

    php_admin_value open_basedir /opt/show

    ErrorLog /dev/null

    <IfModule mod_dir.c>
    DirectoryIndex supergirl.php index.php
    </IfModule>

    AddType application/x-httpd-php .php

    Alias /upfiles/ "/opt/show/upfiles/"
    <Directory "/opt/show/upfiles">
    Options FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
    <FilesMatch ".()">
    Order Deny,Allow
    Deny from all
    </FilesMatch>
    <FilesMatch ".(gif|GIF|jpg|JPG|css|CSS|txt|TXT|htm|HTM|html|HTML|php|PHP|ppt|PPT|zip|ZIP|rar|RAR|exe|EXE)">
    Order Allow,Deny
    Allow from all
    </FilesMatch>
    </Directory>

    Alias /readonly/ "/opt/show/readonly/"
    <Directory "/opt/show/readonly">
    Options FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
    <FilesMatch ".()">
    Order Deny,Allow
    Deny from all
    </FilesMatch>
    <FilesMatch ".(gif|GIF|jpg|JPG|css|CSS|txt|TXT|htm|HTM|html|HTML|php|PHP|ppt|PPT|zip|ZIP|rar|RAR|exe|EXE)">
    Order Allow,Deny
    Allow from all
    </FilesMatch>
    </Directory>

    </VirtualHost>
    ### Expires control
    ExpiresActive On
    ExpiresByType text/html A120
    ExpiresByType image/gif A604800
    ExpiresByType image/jpeg A604800
    ExpiresDefault A120

    ~~呵呵~~



    欢迎转贴,请注明来处。【本帖地址】: http://jimmy.club.sohu.com/blog/post/1/97

    减少硬盘碎片,让系统运行更快速(原创的哟)

    减少硬盘碎片,让系统运行更快速(原创的哟)

    jimmy | 22 九月, 2006 10:28

    大多数程序都非常依赖C盘,不管你程序安装到什么位置,都会生成大量碎片到C盘,导致C盘凌乱运行效率降低。尤其是笔记本更会如此。

    我的一些经验跟大家分享。

    1,建议一个专用的交换分区。

    用硬盘分区工具,PQmagic或者其它,分出一个10G的分区。当然,如果能在安装系统的时候就做好也一样。分配盘符,比如我的:T盘

    2,将系统的临时目录都转移到T盘。

    建立 T:IE_cache 目录。在IE的工具-》选项-》Internet临时文件中,先清除所有缓冲,然后移动文件夹到 T:IE_cache

    建立 T:Temp目录。桌面,我的电脑点右键属性,高级-》环境变量,将用户的TEMP、TMP,系统的TEMP、TMP变量值,都修改成T:Temp

    3,系统属性-》高级-》性能选项-》高级-》虚拟内存,

    将T盘设置1G交换内存,取消C盘的交换内容。重启后生效。(注意:以后还要改回到C盘,因为C盘速度快)

    4,清理C盘垃圾箱。将能够搬走的文件,都先转移到其它的地方。比如,D盘,U盘。然后,运行 开始-》所有程序-》附件-》系统程序-》磁盘碎片整理程序,将C盘进行整理。

    (BTW:如果用正式版的Diskeeper效果会更好些)

    5,按照3的步骤,将交换内存设置回C盘,注意:最小1024M,最大1024M。取消T盘的交换文件。

    6,如果你经常下载东西,将下载常用的目录也设置到T盘去。

    OK,至此,基本上系统算是比较干净的。然后,是高级应用,针对使用的软件进行。

    1,AcdSee。

    建立T:Acdsee_cache。运行Acdsee,将其Database目录设置到此目录,然后删除原设置目录里面的内容。

    2,Hypersnap。

    类似的,将临时抓取目录,指向T盘的某个目录。

    3,UltraEdit。

    不要小看文本编辑器。我的bak目录里面曾经积累了4千多个文件。

    4,Opera & Firefox

    这两个比较讨厌,没有提供修改其缓冲的地方。

    跟踪一下,发现Opera的缓冲目录在 c:program filesoperaprofilexxxxxcache4 下面。

    Firefox在 c:documents and settingsxxxxlocal settingsapplication dataMozllaFirefox 下面。

    下载命令行工具 junction.exe (网站忘了,Google一下吧。实在找不到就找我要好了)。

    以Firefox为例。

    md t:firefox_cache

    del Firefox /F /Q

    junction -s Firefox t:firefox_cache

    Junction的作用,是做一个符号链接,指向实际的目录。如果熟悉Linux下 Ln -s 命令的就会对这个很熟悉了。

    类似的,将Opera的Cache目录也可以放到T盘。

    OK。运行一段时间看看,是不是C盘的碎片是不是没有太大变化?

    当然,如果不是,那就要看一下你用的哪个软件在频繁产生小碎片,然后将这些小碎片的目录放到T盘去。

    ~~呵呵~~




    欢迎转贴,请注明来处。【本帖地址】: http://jimmy.club.sohu.com/blog/post/1/96

    使用PHP5容易忽视的地方-(2)

    使用PHP5容易忽视的地方-(2)

    jimmy | 20 九月, 2006 16:22

    错误控制机制

    PHP4更习惯的是判断返回值,然后进行错误处理。

    PHP5应转向try{}catch($e){}机制。

    典型示例:

    try {
     
    $dom = new DOMDocument($version);
     
    $ab = new DOMElement($element);
     
    $ab = $dom->appendChild($ab);
     
    } catch (Exception $e) {
     
    error_log('Error in file ' . $e->getFile( ) . ' on line ' . 
     
    $e->getLine( ) . ".n" . 'Error message: "' . $e->getMessage( ) . 
     
    '" and error code: ' . $e->getCode( ) . '.');
     
    }
     

    特别需要指出的是,当一个错误在函数中发生没有被捕捉,会被返到调用函数一级的捕捉代码中。

    更进一步的,可以在函数中进行错误判断,然后抛出异常,由上一级来统一进行异常处理。

    注意,在使用try机制时,debug_backtrace 和 debug_print_backtrace 可能无效,应避免使用。


    深入理解流(stream)的概念

    用stream_get_wappers()可以获取当前可操作流类型。

    对文件操作,file_get_contents 和 file_put_contents 可以节省很多代码工作。

    Filter在5中得到加强,例子:

    $html = 'I am <b>bold</b>. I am <i>italic</i>.';
    
    // Stripping HTML tags on data sent to php://output
    file_put_contents(
        'php://filter/write=string.strip_tags/resource=php://output', $html);
    
    输出结果为:
    I am bold. I am italic.
    其它容易被遗漏的:
    1,Reflection::export 方法,可以监控类中的细节
    2,对tidy的支持(好玩,实用度并不高)
    3,允许为引用型参数设定缺省值:function updateAddress(&$address = 'NULL')
    4,PHP.ini的error_reporting 新增 E_STRICT 值
    5,CLI(命令行)得到增强,可以逐行执行代码。$argi $argn表示行号和内容
    $ php -R 'print "$argnn" ;' < example.txt
    6,register_argc_argv 参数不可屏蔽$argv $argc参数
    ~~呵呵~~


    欢迎转贴,请注明来处。【本帖地址】: http://jimmy.club.sohu.com/blog/post/1/94

    使用PHP5容易忽视的地方-(1)

    使用PHP5容易忽视的地方-(1)

    jimmy | 19 九月, 2006 20:37

    当需要将一个实例当作参数进行传递,或者进行复制的时候,需要使用 clone

    $test = new myclass();

    $demo=clone $test;

    当调试和跟踪时,可以使用:

    get_class()

    val_dump()

    val_export()

    instanceof

    慎用register_shutdown_function( )。程序先执行析构函数,然后才调用收尾函数。


    静态函数和常量的使用方法:

    class t{const pi=10;static function show(){echo self::pi;}t::show();[/php]类中ç??缺ç??å?½æ?°ï¼?__construct; __destruct; __get; __set; __call; __clone; __toString; å??æ?¶åº?注æ??ï¼?PHP5 ä¸?æ?¯æ??å¤?ç»§æ?¿ã??</p><p /><p><strong>æ?´ç?µæ´»ç??循ç?¯æ?§å?¶æ?ºå?¶ï¼?Iteratorï¼?</strong><table cellspacing="0" cellpadding="4" rules="all" width="100%" border="1"><thead><tr><th class="thead"><p class="docText">Method</p></th><th class="thead"><p class="docText">Description</p></th><th class="thead"><p class="docText">Returns</p></th></tr></thead><tbody><tr><td class="docTableCell"><p class="docText"><tt>rewind( )</tt></p></td><td class="docTableCell"><p class="docText">Resets iterator list to its start</p></td><td class="docTableCell"><p class="docText">Void (nothing)</p></td></tr><tr><td class="docTableCell"><p class="docText"><tt>valid( )</tt></p></td><td class="docTableCell"><p class="docText">Says if there are additional items left in the list</p></td><td class="docTableCell"><p class="docText"><tt>true</tt> if additional items; <tt>false</tt> otherwise</p></td></tr><tr><td class="docTableCell"><p class="docText"><tt>next( )</tt></p></td><td class="docTableCell"><p class="docText">Moves iterator to the next item in the list</p></td><td class="docTableCell"><p class="docText">Void (nothing)</p></td></tr><tr><td class="docTableCell"><p class="docText"><tt>key( )</tt></p></td><td class="docTableCell"><p class="docText">Returns the key of the current item</p></td><td class="docTableCell"><p class="docText">Mixed</p></td></tr><tr><td class="docTableCell"><p class="docText"><tt>current( )</tt></p></td><td class="docTableCell"><p class="docText">Returns the current item</p></td><td class="docTableCell"><p class="docText">Mixed</p></td></tr></tbody></table>ä¾?å­?ï¼?[code php]</p><pre>$it = new MyIterator; // MyIterator is an class that implements Iterator
     
    for ($it->rewind( ); $it->valid( ); $it->next( )) {
     
        $key = $it->key( );
     
        $value = $it->current( );
     
        // code inside the foreach starts here:
     
        print "$key: $valuen";
     
    }
     
    unset($it);</pre><pre>

    可用于循环处理的对象:

    Name

    Type

    Relationship

    Description

    ArrayObject

    Class

    Implements IteratorAggregate interface

    Converts arrays and objects into iterators

    ArrayIterator

    Class

    Implements Iterator interface

    Used by ArrayObject; cannot be instantiated directly

    CachingIterator

    Class

    Implements Iterator interface

    Provides "look ahead by one" capability using hasNext( )

    CachingRecursiveIterator

    Class

    Extends CachingIterator class; implements RecursiveIterator interface

    Adds caching support to recursive iterators

    DirectoryIterator

    Class

    Implements Iterator interface

    An iterator for directory files

    FilterIterator

    Abstract class

    Implements Iterator interface

    Allows filtering of other iterators using accept( ) method

    Iterator

    Interface

    Defines Iterator interface

    Implements an iterator

    IteratorAggregate

    Interface

    Defines IteratorAggregate interface

    Allows classes to control iteration by returning iterator from getIterator( ) method

    LimitIterator

    Class

    Implements Iterator interface

    Emulates database LIMIT clause

    ParentIterator

    Class

    Extends FilterIterator class; implements RecursiveIterator interface

    Filters out leaf items, so only parents (items with children) are processed

    RecursiveDirectoryIterator

    Class

    Implements RecursiveIterator interface

    A recursive iterator for directory files; goes through all subdirectories

    RecursiveIterator

    Interface

    Extends Iterator interface

    Implements a recursive iterator

    RecursiveIteratorIterator

    Class

    Implements Iterator interface

    An iterator for classes that implement RecursiveIterator interface

    SeekableIterator

    Interface

    Extends Iterator interface

    Adds ability to seek( ) within an iterator; used by LimitIterator class

    SimpleXMLIterator

    Class

    Implements Iterator interface

    An iterator for XML files using SimpleXML functions; only iterates over XML text nodes

    SQLite和MySQLi允许执行多语句的SQL

    </pre><pre>$db = mysqli_connect('db.example.org');
     
     
     
    $query = >>>_SQL_
     
    DROP TABLE IF EXISTS users;
     
    CREATE TABLE users(username VARCHAR(50) UNIQUE,
     
                       password VARCHAR(50));
     
    INSERT INTO users VALUES('rasmus', 'z.8cMpdFbNAPw');
     
    INSERT INTO users VALUES('zeev',   'asd34.23NNDeq');
     
    SELECT username FROM users;
     
    _SQL_;
     
     
     
    foreach (new MySQLiQueryIterator($db, $query) as $result) {
     
            if ($result) {
     
                    while ($row = mysqli_fetch_row($result)) {
     
                        print "$row[0]n";
     
                    }
     
            }
     
    }
     



    欢迎转贴,请注明来处。【本帖地址】: http://jimmy.club.sohu.com/blog/post/1/92