Category: Rust
November 17, 2025
理解 tokio 中的 Task
"\u003ch2 id=\"什么是-task\"\u003e什么是 Task\u003c/h2\u003e\n\u003cp\u003e在 tokio 里, task 是一种轻量级、非阻塞的执行单元,它类似于操作系统线程,但对它的调度不是由操作系统来完成的,而是 tokio runtime 来完成的。这种通用的模式,还有一个名称就是 \u003ca href=\"https://en.wikipedia.org/wiki/Green_threads\"\u003egreen threads\u003c/a\u003e。它很类似于 \u003ca href=\"https://tour.golang.org/concurrency/1\"\u003eGo’s goroutines\u003c/a\u003e, \u003ca href=\"https://kotlinlang.org/docs/reference/coroutines-overview.html\"\u003eKotlin’s coroutines\u003c/a\u003e, or \u003ca href=\"http://erlang.org/doc/getting_started/conc_prog.html#processes\"\u003eErlang’s processes\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e它有三个主要特点,分别是 \u003ccode\u003e轻量级\u003c/code\u003e、\u003ccode\u003e协作式调度\u003c/code\u003e 和 \u003ccode\u003e非阻塞\u003c/code\u003e。\u003c/p\u003e\n\u003ch3 id=\"轻量级\"\u003e轻量级\u003c/h3\u003e\n\u003cp\u003e与Golang里的 goroutine一样,相比操作系统线程而言,它的创建速度非常的快,且很小。对它的调用完成是由用户态代码来完成的。不像操作系统线程那样,每一次调度都需要上下文的切换,因此在用户态切换任务的成本也是极其的低。同样对于它的运行与销毁也是低成本的。\u003c/p\u003e\n\u003ch3 id=\"协作式调度\"\u003e协作式调度\u003c/h3\u003e\n\u003cp\u003e多数操作系统实现的是\u003ccode\u003e抢占式多任务处理\u003c/code\u003e,对于多任务调度一般是由调度器(如操作系统调度器)来负责的,它会根据任务的执行时长,动态的抢占并暂停它,然后执行其它任务,最终实现每个任务都在同步执行的样子。\u003c/p\u003e\n\u003cp\u003e但 tokio 属于 \u003ccode\u003e协作式调度\u003c/code\u003e 机制, …\u003c/p\u003e"
August 14, 2025
Rust 里 thread::park() 与 thread::yield_now() 的区别
"\u003cp\u003e在看 tokio 调度源码时,会有一些操作线程park的函数,而在rust标准库里也同样有类似的方法,那就是 \u003ca href=\"https://doc.rust-lang.org/std/thread/fn.park.html\"\u003ethread::park()\u003c/a\u003e ,同时还有一个咋一看效果类似的函数 \u003ca href=\"https://doc.rust-lang.org/std/thread/fn.yield_now.html\"\u003ethread::yield_new()\u003c/a\u003e, 两个函数都有实现 **\u003ccode\u003e类似\u003c/code\u003e**暂停执行代码的效果,那它们到底又何区别呢?\u003c/p\u003e\n\u003cp\u003e希望通过这篇文章可以让大家搞明白它们两者的区别和使用场景。\u003c/p\u003e\n\u003cp\u003e我们先看一下 \u003ccode\u003ethread::park() \u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"threadpark\"\u003ethread:park()\u003c/h2\u003e\n\u003cp\u003e对于 park 函数的作用主要是实现当前线程的阻塞,并出让CPU,这时OS调度器会将其它线程调度到CPU,继续执行其它任务。但是一旦调用这个函数后,后续线程将一直处于阻塞状态,也就是说此线程将无法获取CPU处理任务,直到调用 unpark() 函数,才恢复正常。\u003c/p\u003e\n\u003cp\u003e从线程状态角度来看,它的转换\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003erunning ---\u0026gt; [thread::park()] ---\u0026gt; blocked (等待唤醒)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eblocked ---\u0026gt; [thread::unpark()]---\u0026gt; runnable ---\u0026gt; running (被unpark唤醒后)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e总结\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e …\u003c/li\u003e\u003c/ul\u003e"
July 10, 2025
从Vec的 swap_remove 方法中学到的性能优化
"\u003cp\u003e今天在看 tokio 源码时,发现一个 \u003ca href=\"https://github.com/tokio-rs/tokio/blob/master/tokio/src/runtime/scheduler/multi_thread/idle.rs#L129-L145\"\u003eunpark_worker_by_id\u003c/a\u003e 函数里调用了标准库Vec 的 \u003ca href=\"https://github.com/rust-lang/rust/blob/master/library/alloc/src/vec/mod.rs#L2014-L2036\"\u003eswap_remove\u003c/a\u003e方法,\u003ccode\u003eswap_remove\u003c/code\u003e 实现如下\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-rust\" data-lang=\"rust\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#66d9ef\"\u003epub\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efn\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eswap_remove\u003c/span\u003e(\u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\"color:#66d9ef\"\u003emut\u003c/span\u003e self, index: \u003cspan style=\"color:#66d9ef\"\u003eusize\u003c/span\u003e) -\u0026gt; \u003cspan style=\"color:#a6e22e\"\u003eT\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#75715e\"\u003e#[cold]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#75715e\"\u003e#[cfg_attr(not(panic = \u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;immediate-abort\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e), inline(never))]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#75715e\"\u003e#[optimize(size)]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#66d9ef\"\u003efn\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eassert_failed\u003c/span\u003e(index: \u003cspan style=\"color:#66d9ef\"\u003eusize\u003c/span\u003e, len: \u003cspan style=\"color:#66d9ef\"\u003eusize\u003c/span\u003e) -\u0026gt; \u003cspan style=\"color:#f92672\"\u003e!\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#a6e22e\"\u003epanic!\u003c/span\u003e(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;swap_remove index (is \u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e{index}\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e) should be \u0026lt; len (is \u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e{len}\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e)\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#66d9ef\"\u003elet\u003c/span\u003e len \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e self.len();\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e index \u003cspan style=\"color:#f92672\"\u003e\u0026gt;=\u003c/span\u003e len { …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
Category: Mysql
November 10, 2025
为什么MySQL里必须要有主键
"\u003cp\u003e有一道面试题,是问“为什么在 MySQL 表里一定要有一个主键”。注意这里提到的主键包括用户自定义的主键ID或MySQL默认隐含添加的主键ID。\u003c/p\u003e\n\u003cp\u003e对于主键的设置,在日常开发中已经深深的刻在我们的大脑里,基本形成了肌肉记忆,于是在设置表结构时,对每个表必须手动设置一个主键,一般推荐使用自增的INT类型,且有时间还需要无业务逻辑。但如果突然遇到这个问题,一时还真不知道应该如何系统的回答。\u003c/p\u003e\n\u003cp\u003e下面我将根据自己的理解来分析一下,虽然可能并不完整,但应该可以成为一个及格的答案了。\n这里主要指的是InnoDB存储引擎,回答它可能需要从表引擎本身上下手。\u003c/p\u003e\n\u003ch2 id=\"存储结构\"\u003e存储结构\u003c/h2\u003e\n\u003cp\u003e首先我们知道在MySQL里的,InnoDB 是一个以“聚簇索引”组织数据进行存储,它是将主键与表数据存储在一起的。主键也是一种特殊的unique key,这个主键不可能重复(这句是废话)。一个主键就代表一条记录,也就是说,如果我们想找到一条记录,则必须根据主键才能找到对应的记录。如果没有这个唯一键,将无法对应多条记录,更不可能多条记录对应一个主键,或多个主键对应一条记录。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2025/2319606-20220321160518273-1135088721.png\" alt=\"img\"\u003e\u003c/p\u003e\n\u003cp\u003e如图所示,蓝色字段是主键,绿色字段data就是记录数据,两者是一块 …\u003c/p\u003e"
July 21, 2020
MySQL DBA利器innodb_ruby
"\u003ch2 id=\"innodb_ruby简介\"\u003einnodb_ruby简介\u003c/h2\u003e\n\u003cp\u003einnodb_ruby是一款用ruby写的用来分析 innodb 物理文件的专业DBA工具,可以通过这款工具来窥探innodb内部的一些结构。\n注意不要在生产环境中使用此工具,以避对线上服务造成影响。官方网址 \u003ca href=\"https://rubygems.org/gems/innodb_ruby\"\u003ehttps://rubygems.org/gems/innodb_ruby\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e注意如果(Linux)平台安装中遇到错误一般情况是由于缺少依赖库造成的,可以先安装 sudo apt-get install libxslt1-dev libxml2-dev 相关库。\u003c/p\u003e\n\u003ch2 id=\"命令语法\"\u003e命令语法\u003c/h2\u003e\n\u003cp\u003e在执行以下命令时,建议切换到MySQL 的 datadir 目录里。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esxf@ubuntu:~$ innodb_space --help\n\nUsage: innodb_space \u0026lt;options\u0026gt; \u0026lt;mode\u0026gt;\ninnodb_space \u0026lt;选项\u0026gt; \u0026lt;模式\u0026gt;\n命令主要分 options 和 mode 两大部分。\n\nInvocation examples:\n\n innodb_space -s ibdata1 [-T tname [-I …\u003c/code\u003e\u003c/pre\u003e"
January 4, 2020
MySQL中的 InnoDB Buffer Pool
"\u003ch2 id=\"一innodb-buffer-pool简介\"\u003e一、InnoDB Buffer Pool简介\u003c/h2\u003e\n\u003cp\u003eBuffer Pool是InnoDB引擎内存中的一块区域,主要用来缓存表和索引数据使用。我们知道从内存读取数据要比磁盘读取效率要高的多,这也正是buffer pool发挥的主要作用。一般配置值都比较大,在专用数据库服务器上,大小为物理内存的80%左右。\u003c/p\u003e\n\u003ch2 id=\"二buffer-pool-lru-算法\"\u003e二、Buffer Pool LRU 算法\u003c/h2\u003e\n\u003cp\u003eBuffer Pool 链表使用\u003cstrong\u003e优化改良后LRU\u003c/strong\u003e(最近最少使用)算法进行管理。\u003c/p\u003e\n\u003cp\u003e整个LRU链表可分为两个子链表,一个是New Sublist,也称为Young列表或新生代,另一个是Old Sublist ,称为Old 列表或老生代。每个子链表都有一个Head和Tail,中间部分是存储Page数据的地方。\u003c/p\u003e\n\u003cp\u003e当新的Page放入 Buffer Pool 缓存池的时候,会交其Page插入就是两个子链表的交界处,称为midpoint,同时就会有旧的Page被淘汰,整个操作过程都需要对链接进行维护。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eYoung 链表区存放的数据是经常访问的数据;\nOld 链表区存放是即将被淘汰的数据;\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e一个新数据先被插入到midpoint 位置,根据LRU算法访问频率高 …\u003c/p\u003e"
October 25, 2019
MySQL8.0中的跳跃范围扫描优化Skip Scan Range Access Method介绍
"\u003cp\u003e在MySQL8.0以前,索引使用规则有一项是索引左前缀,假如说有一个索引idx_abc(a,b,c),能用到索引的情况只有查询条件为a、ab、abc、ac这四种,对于只有字段b的where条件是无法用到这个idx_abcf索引的。这里再强调一下,这里的顺序并不是在where中字段出现的顺序,where b=2 and 1=1 也是可以利用到索引的,只是用到了(a,b)这两个字段\u003c/p\u003e\n\u003cp\u003e针对这一点, 从MySQL 8.0.13开始引入了一种新的优化方案,叫做 \u003cstrong\u003eSkip Scan Range\u003c/strong\u003e,翻译过来的话是\u003cstrong\u003e跳跃范围扫描\u003c/strong\u003e。如何理解这个概念呢?我们可以拿官方的SQL示例具体讲一下()\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eCREATE TABLE t1 (f1 INT NOT NULL, f2 INT NOT NULL, PRIMARY KEY(f1, f2));\nINSERT INTO t1 VALUES\n (1,1), (1,2), (1,3), (1,4), (1,5),\n (2,1), (2,2), (2,3), (2,4), (2,5);\nINSERT INTO t1 SELECT f1, f2 + 5 FROM t1; …\u003c/code\u003e\u003c/pre\u003e"
August 13, 2019
一文理解MySQL中的page页
"\u003cp\u003e在介绍InnoDB中的页的时候,很有必要先让大家了解一下InnoDB中的存储结构\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/innodb_engine_struct.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e从InnoDB存储引擎的逻辑结构看,所有数据都被逻辑地存放在一个空间内,称为表空间(tablespace),而表空间由段(sengment)、区(extent)、页(page)组成。 在一些文档中extend又称块(block)。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、表空间(table space)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e表空间(Tablespace)是一个逻辑容器,表空间存储的对象是段,在一个表空间中可以有一个或多个段,但是一个段只能属于一个表空间。数据库由一个或多个表空间组成,表空间从管理上可以划分为系统表空间、用户表空间、撤销表空间、临时表空间等。\u003c/p\u003e\n\u003cp\u003e在 InnoDB 中存在两种表空间的类型:共享表空间和独立表空间。如果是共享表空间就意味着多张表共用一个表空间。如果是独立表空间,就意味着每张表有一个独立的表空间,也就是数据和索引信息都会保存在自己的表空间中。独立的表空间可以在不同的数据库之间进行迁移。可通过命令\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emysql \u0026gt; show variables like \u0026#39;innodb_file_per_table\u0026#39;;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e查看当前系统启用 …\u003c/p\u003e"
June 26, 2019
MySQL8.0中的几项新特性(整理)
"\u003cp\u003e\u003ca href=\"https://mp.weixin.qq.com/s/DHnGZroN36aC46Erzq6TWg\"\u003e新特新解读 | MySQL 8.0 对 count(*)的优化\u003c/a\u003e \u003ca href=\"https://mp.weixin.qq.com/s/ViGU5i5XlFjDTath_dh6pg\"\u003e新特性解读 | MySQL 8.0 正则替换\u003c/a\u003e \u003ca href=\"https://mp.weixin.qq.com/s/EOJ_jIhW07ifiYbpXs0lcQ\"\u003e新特性解读 | MySQL 8.0 资源组\u003c/a\u003e \u003ca href=\"https://mp.weixin.qq.com/s/4oUIW5_vWzWYAx_oMTwHOw\"\u003e新特性解读 | MySQL 8.0 Temptable 引擎介绍\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://mp.weixin.qq.com/s/Ocl2FTQ847Pwxtjp8N7L6w\"\u003e新特性解读 | MySQL 8.0 窗口函数详解\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://mp.weixin.qq.com/s/f-Za9y-6VsAs5VukyftqRA\"\u003e新特性解读 | MySQL 8.0 json到表的转换\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://mp.weixin.qq.com/s/ZJ9slZVAc5k1BYsX0id2Mg\"\u003e新特性解读 | MySQL 8.0.16 在组复制中启用成员自动重新加入\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://mp.weixin.qq.com/s/0NsfuTAVxCMRBz-NMQxA3Q\"\u003e新特性解读 | MySQL 8.0 直方图\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://mp.weixin.qq.com/s/aCe3UYnEnqGSE90bEFxxMg\"\u003e新特性解读 | MySQL 8.0 索引特性1-函数索引\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://mp.weixin.qq.com/s/J7LfZjhJak_rQ_Ft2sFmVQ\"\u003e新特性解读 | MySQL 8.0 索引特性2-索引跳跃扫描\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://mp.weixin.qq.com/s/_zTybsp6NQa_gbhGmCySvA\"\u003e新特性解读 | MySQL 8.0 索引特性3 -倒序索引\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://mp.weixin.qq.com/s/mdpZz9-Em1tQupK6ajYJJg\"\u003e新特性解读 | MySQL 8.0 索引特性4-不可见索引\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://mp.weixin.qq.com/s/GOw9Vb9iRV1r1IpvkTyHwQ\"\u003e新特性解读 | MySQL 8.0.16 组复制通讯协议的设置\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://mp.weixin.qq.com/s/U40BPB3N9jBx3NIKUhQXxA\"\u003e新特性解读 | MySQL 8.0.16 组复制新功能:消息碎片化\u003c/a\u003e\u003c/p\u003e"
June 20, 2019
一文读懂 MySQL 的隔离级别和锁的关系
"\u003cp\u003eMySQL 中的隔离四种隔离级别与锁的关系一直挺模糊的,看了好多文章感觉着都不是很好理解,今天在“\u003ca href=\"https://mp.weixin.qq.com/s/DhMy6fsdlFj3dGqRE_0JMg\"\u003e爱可生开源社区\u003c/a\u003e”看到一篇文章,感觉着挺容易理解的。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ccode\u003eREAD UNCOMMITTED 未提交读,可以读取未提交的数据。\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eREAD COMMITTED 已提交读,对于锁定读(select with for update 或者 for share)、update 和 delete 语句, InnoDB 仅锁定索引记录,而不锁定它们之间的间隙,因此允许在锁定的记录旁边自由插入新记录。\u003c/code\u003e Gap locking 仅用于外键约束检查和重复键检查。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eREPEATABLE READ 可重复读,事务中的一致性读取读取的是事务第一次读取所建立的快照。\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eSERIALIZABLE 序列化\u003c/code\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e文中主要对 RR 和 RC 两种常用的隔离级别做了不同情况的说明,对于 \u003ccode\u003eSERIALIZABLE 序列化\u003c/code\u003e 和 READ UNCOMMITTED 未提交读,由于很好理解所以未在文中体现。**对于 RR 和 RC 主要区别是 RR 存在 Gap Lock间隙锁,而RC则 …\u003c/p\u003e"
April 9, 2019
MySQL5.7中Undo回收收缩相关参数
"\u003cp\u003e在MySQL5.7以前,ibdata1文件会逐渐增大( \u003ca href=\"https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_ibdata_file\"\u003eibdata1文件包含哪些信息?\u003c/a\u003e),非常占用系统空间,特别是一些云数据来说,磁盘非常的贵,想要回收空间,只能进行一次导出和导入操作,来重新生成undo 表空间,从MySQL5.7开始,有了在线回收undo表空间的功能,主要由以下几个参数设置。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003einnodb_undo_directory = .\u003c/strong\u003e\n为undo文件存储路径。如果没有指定默认值(NULL),则undo表空间则存放到mysql的data目录里(datadir选项)。配置此项可以用undo从ibdata文件里分离出来。单独存储。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003einnodb_undo_logs = 128\u003c/strong\u003e\n(默认值 128)undo rollback segment 回滚段个数,为 innodb_rollback_segments 参数选项的别名,最大值为128,其中32个为使用临时表空间 ibtmp1 保留,1个为系统表空间使用,剩余的95个为 undo tablespaces 使用。\n当 innodb_rollback_segments\u0026lt;=32的时候,系统将自动分配1个rollback …\u003c/p\u003e"
February 21, 2019
理解MySQL中的MDL锁
"\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://cloud.tencent.com/developer/article/1006514\"\u003ehttps://cloud.tencent.com/developer/article/1006514\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://yq.aliyun.com/articles/27667\"\u003ehttps://yq.aliyun.com/articles/27667\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e"
December 24, 2018
MySQL中group_concat函数详解
"\u003cp\u003e**函数语法:\n**\u003c/p\u003e\n\u003cp\u003e**group_concat( [DISTINCT] 要连接的字段 [Order BY ****排序字段 **\u003cstrong\u003eASC/DESC] [Separator ‘分隔符’] )\u003c/strong\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cstrong\u003e下面举例说明:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eselect * from goods;\u003c/p\u003e\n\u003cp\u003e+——+——+\n| id| price|\n+——+——+\n|1 | 10|\n|1 | 20|\n|1 | 20|\n|2 | 20|\n|3 | 200 |\n|3 | 500 |\n+——+——+\n6 rows in set (0.00 sec)\u003c/p\u003e\n\u003chr\u003e\n\u003col\u003e\n\u003cli\u003e以id分组,把price字段的值在同一行打印出来,逗号分隔(默认)\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eselect id, group_concat(price) from goods group by id;\u003c/p\u003e\n\u003cp\u003e+——+——————–+\n| id| group_concat(price) |\n+——+——————–+\n|1 | 10,20,20|\n|2 | 20 |\n|3 | 200,500|\n+——+——————–+\n3 rows in set (0.00 sec)\u003c/p\u003e"
December 22, 2018
MySQL中order by 排序必知
"\u003cp\u003e在开发过程时,我们经常会遇到 order by 排序操作,那么你知道什么时候MySQL才会进行排序操作,什么时候不需要时间排序操作?,下面我们就从一个很小的例子中了解一下排序场景。\u003c/p\u003e\n\u003cp\u003e表结构如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eCREATE TABLE t (\n id int(11) unsigned NOT NULL AUTO_INCREMENT,\n city varchar(16) NOT NULL,\n name varchar(16) NOT NULL,\n age int(11) NOT NULL,\n addr varchar(128) DEFAULT NULL,\n PRIMARY KEY (id),\n KEY city (city) USING BTREE\n ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这里只有一个索引city,我们执行一条SQL语句:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eSELECT city, name FROM t WHERE city=\u0026#39;杭州\u0026#39; ORDER BY name LIMIT 1000;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e通过Explain命令查看执行情况\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/explain-1024x119.jpg\" alt=\"\"\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e …\u003c/p\u003e"
October 6, 2018
MySQL中的半同步复制
"\u003cp\u003eMySQL当前存在的三种复制模式有:异步模式、半同步模式和组复制模式。注意:MySQL复制模式没有“同步复制”这一项的,文章中只是为了读者方便理解半同步复制的概念才介绍了同步复制概念 \u003ca href=\"https://dev.mysql.com/doc/refman/8.0/en/replication-semisync.html\"\u003ehttps://dev.mysql.com/doc/refman/8.0/en/replication-semisync.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e从MySQL5.5开始,MySQL以插件的形式支持半同步复制。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1. 异步复制(Asynchronous replication)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eMySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。\u003c/p\u003e\n\u003cp\u003e异步复制是MySQL最早的也是当前使用最多的复制模式,异步复制提供了一种简单的主-从复制方法,包含一个主库(master)和备库(一个,或者多个) 之间,主库执行并提交了事务,在这之后(因此才称之为异步),这些事务才在从库上重新执行一遍(基于statement)或者变更数据内容( …\u003c/p\u003e"
September 18, 2018
MySQL中对MVCC的理解总结
"\u003ch1 id=\"一mvcc简介\"\u003e一、MVCC简介\u003c/h1\u003e\n\u003cp\u003eMVCC (Multiversion Concurrency Control),即多版本并发控制技术。InnoDB数据库的事务隔离级别就是通过UNDO和MVCC来实现的(ACID特性),旧数据存储在UNDO中,再通过DB_ROLL_PTR 回溯查找历史版本。\u003c/p\u003e\n\u003ch1 id=\"二mvcc原理\"\u003e二、MVCC原理\u003c/h1\u003e\n\u003cp\u003e1、通过DB_ROLL_PT 回溯查找数据历史版本2、通过read view判断行记录是否可见\u003c/p\u003e\n\u003cp\u003e理解这一块之前,我们必须先了解一下row的内部存储格式\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/image-20230904183143992.png\" alt=\"image-20230904183143992\"\u003e\u003c/p\u003e\n\u003cp\u003e字段\b说明:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eDB_ROW_ID:\u003cstrong\u003e长度6个字节。此值由\u003c/strong\u003eInnoDB自动生成\u003c/strong\u003e,聚集索引时使用。如果用户未显式指定表主键时,\u001b表优先使用\u003cstrong\u003e第一个非null的唯一索引\u003c/strong\u003e作为主键.否则使用DB_ROW_ID的值作为主键ID,聚集索引会使用此值。如果指定了表主键的话,则聚集索引使用指定的值。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDB_TRX_ID:\u003cstrong\u003e6个字节的事务ID。标记了最后\u003c/strong\u003e更新\u003c/strong\u003e此记录的事务ID,每开起一个新事务,其值自动+1\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDB_ROLL_PTR:\u003cstrong\u003e7字节的回滚指针。指向当前记录项的\u003c/strong\u003eundo log\u003c/strong\u003e记录,找之前版本的数据需通过此指针。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eMySQL中的MVCC原理\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://blog.haohtml.com/wp-content/uploads/2018/09/mysql_mvcc_3.24.44.png\"\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/mysql_mvcc_3.24.44.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e首次 \u003ccode\u003einsert\u003c/code\u003e\u003c/strong\u003e …\u003c/p\u003e"
September 12, 2018
MySQL之ICP、MRR、BKA、BNL
"\u003ch1 id=\"index-condition-pushdownicp\"\u003eIndex Condition Pushdown(ICP)\u003c/h1\u003e\n\u003cp\u003eIndex Condition Pushdown (ICP)是mysql使用索引从表中检索行数据的一种优化方式。\u003c/p\u003e\n\u003ch3 id=\"icp原理\"\u003eICP原理\u003c/h3\u003e\n\u003cp\u003e禁用ICP,存储引擎会通过遍历索引定位基表中的行,然后返回给MySQL Server层,再去为这些数据行进行WHERE后的条件的过滤。\u003c/p\u003e\n\u003cp\u003e开启ICP,如果部分WHERE条件能使用索引中的字段,MySQL Server 会把这部分下推到存储引擎层,存储引擎通过索引过滤,把满足的行从表中读取出。ICP能减少引擎层访问基表的次数和MySQL Server 访问存储引擎的次数。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eICP的目标是减少从基表中全纪录读取操作的数量,从而降低IO操作\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e对于InnoDB表,ICP只适用于辅助索引。\u003c/p\u003e\n\u003ch3 id=\"icp标识\"\u003eICP标识\u003c/h3\u003e\n\u003cp\u003e当使用ICP优化时,执行计划的Extra列显示 \u003cstrong\u003eUsing index condition\u003c/strong\u003e提示\u003c/p\u003e\n\u003ch3 id=\"相关参数\"\u003e相关参数\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eoptimizer_switch=\u0026#34;index_condition_pushdown=on”;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e可以通过 SET optimizer_switch = …\u003c/p\u003e"
September 1, 2018
以B tree和B+ tree的区别来分析mysql索引实现
"\u003cp\u003e\u003ca href=\"https://www.jianshu.com/p/0371c9569736\"\u003ehttps://www.jianshu.com/p/0371c9569736\u003c/a\u003e\u003c/p\u003e"
August 20, 2018
MySQL中的innodb_file_format 配置项解读
"\u003ch2 id=\"一innodb_file_format参数\"\u003e一:innodb_file_format参数\u003c/h2\u003e\n\u003cp\u003e在 innodb 1.0.6版本之前,innodb文件格式\u003ccode\u003einnodb_file_format\u003c/code\u003e只有 Antelope(Antelope 文件格式支持Redundant,Compact两种格式来存放行记录,Redundant是为了兼容之前版本而保留的。在mysql 5.1版本中,默认设置为Compact,用户可以通过 \u003ccode\u003eshow table status like 'table_name'\u003c/code\u003e来查看表使用的行格式row_format)\u003c/p\u003e\n\u003cp\u003e从innodb 1.0.6开始引入了新的文件格式 Barracuda 在原来的基础上(Antelope)新增了Dynamic和Compressed两种行格式。\u003c/p\u003e\n\u003ch2 id=\"二innodb_file_format如何使用\"\u003e二:innodb_file_format如何使用\u003c/h2\u003e\n\u003cp\u003e 一般, \u003ccode\u003einnodb_file_format\u003c/code\u003e 在配置文件中指定;\u003ccode\u003erow_format\u003c/code\u003e则在创建数据表时指定:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eCREATE TABLE test2 (column1 INT PRIMARY KEY)\nENGINE=InnoDB ROW_FORMAT=Compressed KEY_BLOCK_SIZE=4;\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"三innodb_file_format--barracuda\"\u003e …\u003c/h2\u003e"
August 16, 2018
DBA必知的MySQL优化原理(推荐)
"\u003cp\u003e推荐阅读: \u003ca href=\"https://www.cnblogs.com/zishengY/p/6892345.html\"\u003ehttps://www.cnblogs.com/zishengY/p/6892345.html\u003c/a\u003e\u003c/p\u003e"
August 16, 2018
MySQL 5.6新特性MRR
"\u003ch2 id=\"一什么是mrr\"\u003e**一、什么是MRR **\u003c/h2\u003e\n\u003cp\u003eMMR全称是Multi-Range Read,是MYSQL5.6优化器的一个新特性,在MariaDB5.5也有这个特性。优化的功能在使用二级索引做范围扫描的过程中减少磁盘随机IO和减少主键索引的访问次数。\u003cstrong\u003e是优化器将随机 IO 转化为顺序 IO 以降低查询过程中 IO 开销的一种手段。\u003c/strong\u003e(参考: \u003ca href=\"https://blog.csdn.net/caomiao2006/article/details/52205177\"\u003ehttps://blog.csdn.net/caomiao2006/article/details/52205177\u003c/a\u003e)\u003c/p\u003e\n\u003ch2 id=\"二mrr和没有mrr的区别\"\u003e**二、MRR和没有MRR的区别 **\u003c/h2\u003e\n\u003cp\u003e给出一个简单的例子,在innodb表执行下面的查询:\u003c/p\u003e\n\u003cp\u003eSELECT non_key_column FROM tbl WHERE key_column=x\u003c/p\u003e\n\u003cp\u003e在没有MRR的情况下,它是这样得到结果的:\u003c/p\u003e\n\u003cp\u003e1. select key_column, pk_column from tb where key_column=x order by key_column —\u0026gt;\n假设这个结果集是t\u003c/p\u003e\n\u003cp\u003e2. for each row in t ;\nselect non_key_column from tb where …\u003c/p\u003e"
August 4, 2018
MySQL中select中的for update 的用法
"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e注意: FOR UPDATE 只能用在事务区块(BEGIN/COMMIT)中才有效。\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e有时候我们会看到一些select语句后面紧跟一句for update,表示手动加锁的意思,这里我们就介绍一下对for update的理解。相对另一种手动加锁方法lock in share mode 的区别见: \u003ca href=\"https://blog.csdn.net/liangzhonglin/article/details/65438777\"\u003ehttps://blog.csdn.net/liangzhonglin/article/details/65438777\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003efor update:IX锁(意向排它锁),即在符合条件的rows上都加了排它锁,其他session也就无法在这些记录上添加任何的S锁或X锁。如果不存在一致性非锁定读的话,那么其他session是无法读取和修改这些记录的,但是innodb有非锁定读(快照读并不需要加锁),for update之后并不会阻塞其他session的快照读取操作,除了select …lock in share mode和select … for update这种显示加锁的查询操作。\u003c/p\u003e\n\u003cp\u003elock in share mode:是IS锁(意向共享锁),即在符合条件的rows上都加了共享锁,这样的话,其 …\u003c/p\u003e"
August 4, 2018
mysql explain 中key_len的计算方法
"\u003cp\u003e建议先阅读这篇文章: \u003ca href=\"http://hidba.org/?p=404\"\u003ehttp://hidba.org/?p=404\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e下面我们只对其中提到的做一个验证。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e(1).索引字段的附加信息:可以分为变长和定长数据类型讨论,当索引字段为定长数据类型,比如\u003cstrong\u003echar\u003c/strong\u003e,\u003cstrong\u003eint\u003c/strong\u003e,\u003cstrong\u003edatetime\u003c/strong\u003e,需要有是否为空的标记,这个标记需要占用1个字节;对于变长数据类型,比如:varchar,除了是否为空的标记外,还需要有长度信息,需要占用2个字节;\u003c/p\u003e\n\u003cp\u003e(备注:当字段定义为非空的时候,是否为空的标记将不占用字节)\u003c/p\u003e\n\u003cp\u003e(2).同时还需要考虑表所使用的字符集,不同的字符集,gbk编码的为一个字符2个字节,utf8编码的一个字符3个字节, utf8mb4 编码则是4个字节;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e每种MySQL数据类型的定义参考:\u003c/p\u003e\n\u003cp\u003e下面我们以定长数据类型准,变长数据类型请自行测试。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、数据索引类型允许为null的情况:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e表结构:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eCREATE TABLE `tb` (\n`id` int(10) unsigned NOT NULL AUTO_INCREMENT,\n`sid` smallint(5) DEFAULT NULL,\n`gid` smallint(5) DEFAULT NULL, …\u003c/code\u003e\u003c/pre\u003e"
July 30, 2018
MYSQL之ICP、MRR、BKA
"\u003ch1 id=\"index-condition-pushdownicp\"\u003eIndex Condition Pushdown(ICP)\u003c/h1\u003e\n\u003cp\u003eIndex Condition Pushdown (ICP)是mysql使用索引从表中检索行数据的一种优化方式。\u003c/p\u003e\n\u003ch3 id=\"icp原理\"\u003eICP原理\u003c/h3\u003e\n\u003cp\u003e禁用ICP,存储引擎会通过遍历索引定位基表中的行,然后返回给MySQL Server层,再去为这些数据行进行WHERE后的条件的过滤。\u003c/p\u003e\n\u003cp\u003e开启ICP,如果部分WHERE条件能使用索引中的字段,MySQL Server 会把这部分下推到存储引擎层,存储引擎通过索引过滤,把满足的行从表中读取出。ICP能减少引擎层访问基表的次数和MySQL Server 访问存储引擎的次数。\u003c/p\u003e\n\u003cp\u003eICP的目标是减少从基表中全纪录读取操作的数量,从而降低IO操作\u003c/p\u003e\n\u003cp\u003e对于InnoDB表,ICP只适用于辅助索引。\u003c/p\u003e\n\u003ch3 id=\"icp标识\"\u003eICP标识\u003c/h3\u003e\n\u003cp\u003e当使用ICP优化时,执行计划的Extra列显示Using indexcondition提示\u003c/p\u003e\n\u003ch3 id=\"相关参数\"\u003e相关参数\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eoptimizer_switch=\u0026#34;index_condition_pushdown=on”;\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"适用场景\"\u003e适用场景\u003c/h3\u003e\n\u003cp\u003e#辅助索引INDEX (\u003ccode\u003ezipcode\u003c/code\u003e, \u003ccode\u003elastname\u003c/code\u003e, \u003ccode\u003efirstname\u003c/code\u003e).\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eSELECT * …\u003c/code\u003e\u003c/pre\u003e"
July 10, 2018
PHP连接mysql8.0出错“SQLSTATE[HY000] [2054] The server requested authentication method unknown to”的解决办法
"\u003cp\u003e错误信息\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSQLSTATE[HY000] [2054] The server requested authentication method unknown to…\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这个错可能是mysql默认使用 \u003ccode\u003ecaching_sha2_password\u003c/code\u003e 作为默认的身份验证插件,而不再是 \u003ccode\u003emysql_native_password\u003c/code\u003e,但是客户端暂时不支持这个插件导致的。 \u003ca href=\"https://dev.mysql.com/doc/refman/8.0/en/caching-sha2-pluggable-authentication.html\"\u003e官方文档说明\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn MySQL 8.0, caching_sha2_password is the default authentication plugin rather than mysql_native_password. For information about the implications of this change for server operation and compatibility of the server with clients and connectors, see caching_sha2_password as the Preferred Authentication Plugin.\u003c/p\u003e\n\u003cp\u003e …\u003c/p\u003e\u003c/blockquote\u003e"
July 6, 2018
MySQL中的查询开销查看方法
"\u003cp\u003eMySQL使用基于 \u003cstrong\u003e成本的优化器\u003c/strong\u003e,它尝试预测一个查询使用某种执行计划时的成本,并选择其中成本最小的一个。在MySQL可以通过查询当前会话的 \u003ccode\u003elast_query_cost\u003c/code\u003e 的值来得到其计算当前查询的成本。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-sql\" data-lang=\"sql\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emysql\u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eselect\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e*\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efrom\u003c/span\u003e t_message \u003cspan style=\"color:#66d9ef\"\u003elimit\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e10\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e...\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e省略结果集\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emysql\u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eshow\u003c/span\u003e status \u003cspan style=\"color:#66d9ef\"\u003elike\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;last_query_cost\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e-----------------+-------------+\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e|\u003c/span\u003e Variable_name \u003cspan style=\"color:#f92672\"\u003e|\u003c/span\u003e Value \u003cspan style=\"color:#f92672\"\u003e|\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e-----------------+-------------+\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e|\u003c/span\u003e Last_query_cost\u003cspan style=\"color:#f92672\"\u003e|\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e6391\u003c/span\u003e.\u003cspan style=\"color:#ae81ff\"\u003e799000\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e|\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e-----------------+-------------+\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e示例中的结果表示优化器认为大概需要做6391个数据页的随机查找才能完成上面的查询。这个结果是根据一些列的统计信息计算得来的,这些统计信息包括: \u003cstrong\u003e每张表或者索引的页面个数\u003c/strong\u003e、 \u003cstrong\u003e索引的基数\u003c/strong\u003e、 \u003cstrong\u003e索引\u003c/strong\u003e 和 \u003cstrong\u003e数据行的长度\u003c/strong\u003e、 \u003cstrong\u003e索引的分布\u003c/strong\u003e 情况等等。\u003c/p\u003e\n\u003cp\u003e有非常多 …\u003c/p\u003e"
June 12, 2018
了解MySQL中的字符集
"\u003cp\u003e\u003ca href=\"https://dev.mysql.com/doc/refman/5.7/en/charset.html\"\u003ehttps://dev.mysql.com/doc/refman/5.7/en/charset.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e平时我们只说了字符集这个概念,另外还有对应的“\u003cstrong\u003e字符序\u003c/strong\u003e”。一个字符集(如utf8)对应多个字符序(utf8_general_ci、utf8_german2_ci等),每个\u003cstrong\u003e字符集\u003c/strong\u003e都有一个默认“\u003cstrong\u003e字符序\u003c/strong\u003e”。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e什么是字符集、字符序?简单的来说:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e字符集(character set):定义了字符以及字符的存储编码。\u003c/li\u003e\n\u003cli\u003e字符序(collation):定义了字符的比较规则。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e可以通过命令查看字符集、字符序信息:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eSHOW CHARACTER SET;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e在我们开发中,一般要保持服务器端的字符集与客户端的字符集保持一致,不然容易出现乱码的情况。\u003c/p\u003e\n\u003cp\u003eMySQL提供了不同级别的设置,包括\u003cstrong\u003eserver\u003c/strong\u003e级、\u003cstrong\u003edatabase\u003c/strong\u003e级、\u003cstrong\u003etable\u003c/strong\u003e级、\u003cstrong\u003ecolumn\u003c/strong\u003e级,可以提供非常精准的设置。\u003c/p\u003e\n\u003cp\u003e参考文章: \u003ca href=\"https://www.cnblogs.com/chyingp/p/mysql-character-set-collation.html\"\u003ehttps://www.cnblogs.com/chyingp/p/mysql-character-set-collation.html\u003c/a\u003e\u003c/p\u003e"
June 7, 2018
MySQL中的sql_mode模式
"\u003cp\u003e官方文档: \u003ca href=\"https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sql-mode-setting\"\u003ehttps://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sql-mode-setting\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、模式分类\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在MySQL8.0中主要包括以下几种模式\u003c/p\u003e\n\u003ctable\u003e\n \u003cthead\u003e\n \u003ctr\u003e\n \u003cth\u003e\u003cstrong\u003eONLY_FULL_GROUP_BY\u003c/strong\u003e\u003c/th\u003e\n \u003cth\u003e对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么将认为这个SQL是不合法的,因为列不在GROUP BY从句中\u003c/th\u003e\n \u003c/tr\u003e\n \u003c/thead\u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\u003e\u003cstrong\u003eSTRICT_TRANS_TABLES\u003c/strong\u003e\u003c/td\u003e\n \u003ctd\u003e在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做任何限制\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\u003e\u003cstrong\u003eNO_ZERO_IN_DATE\u003c/strong\u003e\u003c/td\u003e\n \u003ctd\u003e在严格模式,不接受月或日部分为0的日期。如果使用IGNORE选项,我们为类似的日期插入’0000-00-00’。在非严格模式,可以接受该日期,但会生成警告。\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\u003e\u003cstrong\u003eNO_ZERO_DATE …\u003c/strong\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e"
June 7, 2018
了解MySQL中的驱动表
"\u003cp\u003e\u003cstrong\u003e一、为什么要用小表驱动大表\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1、驱动表的定义\u003c/p\u003e\n\u003cp\u003e当进行多表连接查询时, [驱动表] 的定义为:\u003c/p\u003e\n\u003cp\u003e1)指定了联接条件时,满足查询条件的记录行数少的表为[驱动表]\u003c/p\u003e\n\u003cp\u003e2)未指定联接条件时,行数少的表为[驱动表](重要)\u003c/p\u003e\n\u003cp\u003e忠告:如果你搞不清楚该让谁做驱动表、谁 join 谁,请让 MySQL 运行时自行判断\u003c/p\u003e\n\u003cp\u003e既然“未指定联接条件时,行数少的表为[驱动表]”了,而且你也对自己写出的复杂的 Nested Loop Join 不太有把握(如下面的实例所示),就别指定谁 left/right join 谁了,请交给 MySQL优化器 运行时决定吧。\u003c/p\u003e\n\u003cp\u003e2、mysql关联查询的概念:\u003c/p\u003e\n\u003cp\u003eMySQL 表关联的算法是 \u003ca href=\"http://lizhen3708693.iteye.com/blog/1631406\"\u003eNest Loop Join(嵌套循环)\u003c/a\u003e,是通过驱动表的结果集作为循环基础数据,然后一条一条地通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。\u003c/p\u003e\n\u003cp\u003e例: user表10000条数据,class表20条数据\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSELECT * FROM user u LEFT JOIN class c u.userid=c.userid\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这样则需要用user表循环10000次才能查询出来,而如果 …\u003c/p\u003e"
March 29, 2018
MySQL InnoDB锁机制之Gap Lock、Next-Key Lock、Record Lock解析
"\u003cp\u003eInnoDB是一个支持行锁的存储引擎,锁的类型有:共享锁(S)、排他锁(X)、意向共享(IS)、意向排他(IX)。为了提供更好的并发,InnoDB提供了非锁定读:不需要等待访问行上的锁释放,读取行的一个快照。该方法是通过InnoDB的一个特性:MVCC来实现的。\u003c/p\u003e\n\u003ch1 id=\"innodb有三种行锁的算法\"\u003e\u003cstrong\u003eInnoDB有三种行锁的算法\u003c/strong\u003e\u003c/h1\u003e\n\u003cp\u003e1,Record Lock:单个行记录上的锁。\u003c/p\u003e\n\u003cp\u003e2,Gap Lock:间隙锁,锁定一个范围,但不包括记录本身。GAP锁的目的,是为了防止同一事务的两次当前读,出现幻读的情况。\u003c/p\u003e\n\u003cp\u003e3,Next-Key Lock:1+2,锁定一个范围,并且锁定记录本身。对于行的查询,都是采用该方法,主要目的是解决幻读的问题。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e锁的是索引,并不是记录。\u003c/strong\u003e\n记录锁(Record Lock): 单个索引行记录上的锁\n间隙锁(Gap Lock):一般是针对非唯一索引而言的.\n后码锁(Next-Key Lock):记录锁和间隙锁的结合,对于InnoDB中,更新\u003cstrong\u003e非唯一索引\u003c/strong\u003e对应的记录,会加上Next-Key Lock。在RR下如果where未使用索引会使用全表扫描,这个时候会有Next-Key Lock。如果更新记录为空,就不能加记 …\u003c/p\u003e"
March 29, 2018
聚簇索引概念(Myisam与Innodb索引的区别)转推荐
"\u003cp\u003emyisam的主索引和次索引都指向物理行,下面来进行讲解\u003c/p\u003e\n\u003cp\u003einnodb的主键下存储该行的数据,此索引指向对主键的引用\u003c/p\u003e\n\u003cp\u003emyisam的索引存储图如下,可以看出,无论是id还是cat_id,\u003cstrong\u003e下面都存储有存储物理地址的值。通过主键索引或者次索引来查询数据的时候,都是先查找到\u001b数据地址,然后再到物理位置上去寻找数据\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/myisam-index-struct.png\" alt=\"\"\u003e][1]\u003c/p\u003e\n\u003cp\u003einnodb的索引存储图如下,我们会发现,\u003cstrong\u003e主键索引下面直接存储有数据,而次索引下,存储的是主键的id(不同于MyISAM,存储的是内容数据的物理地址)\u003c/strong\u003e。通过主键查找数据的时候,就会很快查找到数据,但是通过次索引查找数据的时候,需要先查找到对应的主键id,然后才能查找到对应的数据。\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/innodb-index-struct.png\" alt=\"\"\u003e][2]\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e总结:\u003c/strong\u003e\nInnoDB的主索引文件上 直接存放该行数据,称为聚簇索引,次索引指向对\u003cstrong\u003e主键的引用\u003c/strong\u003e.\nMyisam中, 主索引和次索引,都指向物理行(\u003cstrong\u003e磁盘位置\u003c/strong\u003e).\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e注意:对InnoDB来说,\u003c/strong\u003e\n1: 主键索引 既存储索引值,又在叶子中存储行的数据\n2: 如果没有主键, 则会Unique key做主键\n3: 如果没有unique,则系统生成一个内部的rowid做主键.\n4: \u003cstrong\u003e像innodb …\u003c/strong\u003e\u003c/p\u003e"
July 11, 2017
几个定时备份mysql的shell脚本
"\u003cp\u003e\u003ca href=\"http://www.cnblogs.com/freespider/p/5425172.html\"\u003ehttp://www.cnblogs.com/freespider/p/5425172.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://88250.b3log.org/backup-mysql-shell\"\u003ehttp://88250.b3log.org/backup-mysql-shell\u003c/a\u003e\u003c/p\u003e"
February 7, 2017
理解B+树算法和Innodb索引
"\u003cp\u003e\u003ca href=\"http://www.ruzuojun.com/topic/420.html\"\u003ehttp://www.ruzuojun.com/topic/420.html\u003c/a\u003e\u003c/p\u003e"
February 7, 2017
查看InnoDB的磁盘空间利用率
"\u003cp\u003e这周阿里集团DBA内部分享时,支付宝的黄忠同学提了一个问题,关于InnoDB索引page 的利用率。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e\u003cstrong\u003epage********利用率\u003c/strong\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e主要是指btee里面每个page的使用被使用的空间大小。我们知道InnoDB默认一个page大小是16k。但实际使用情况不会总用满\u003c/p\u003e\n\u003cp\u003e我们定义为所有page的总使用字节除以总字节数。\u003c/p\u003e\n\u003cp\u003e在理论分析之前,我们要先弄个工具,查一下。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e\u003cstrong\u003e实例统计\u003c/strong\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e写了一个简单的工具,读ibd文件上的每个page,算出每个page的实际使用字节,可以得到利用率。\u003c/p\u003e\n\u003cp\u003e我们找了线上一个库来模拟。表中有1个自增主键和3个非聚簇索引。不影响结论地简化为如下:\u003c/p\u003e\n\u003cp\u003eCREATE TABLE \u003ccode\u003ectu_factor_risk_99_03\u003c/code\u003e (\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eseq_id\u003c/code\u003e bigint(20) unsigned NOT NULL AUTO_INCREMENT,\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ea\u003c/code\u003e varchar(32) DEFAULT NULL,\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eb\u003c/code\u003e varchar(32) DEFAULT NULL,\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ec\u003c/code\u003e varchar(32) DEFAULT NULL,\u003c/p\u003e\n\u003cp\u003eKEY a (a),\u003c/p\u003e\n\u003cp\u003eKEY bc (b,c),\u003c/p\u003e\n\u003cp\u003eKEY cb (c,b),\u003c/p\u003e\n\u003cp\u003e) …\u003c/p\u003e"
February 7, 2017
关于InnoDB的索引大小
"\u003cp\u003e\u003ca href=\"http://dinglin.iteye.com/blog/1682188\"\u003ehttp://dinglin.iteye.com/blog/1682188\u003c/a\u003e\u003c/p\u003e"
February 7, 2017
关于InnoDB表的page利用率和optimize table
"\u003cp\u003e上一篇我们介绍了ibd_used这个工具,我们用来量化看表数据文件的page使用率。这里用来说明optimize table这个命令的问题和优化。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e\u003cstrong\u003e实例准备\u003c/strong\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e建一个这样的表\u003c/p\u003e\n\u003cp\u003eCREATE TABLE \u003ccode\u003etb\u003c/code\u003e (\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eseq_id\u003c/code\u003e bigint(20) unsigned NOT NULL AUTO_INCREMENT,\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ea\u003c/code\u003e varchar(32) DEFAULT NULL,\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eb\u003c/code\u003e varchar(32) DEFAULT NULL,\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ec\u003c/code\u003e varchar(32) DEFAULT NULL,\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ed\u003c/code\u003e char(255) DEFAULT NULL,\u003c/p\u003e\n\u003cp\u003ePrimary key (seq_id),\u003c/p\u003e\n\u003cp\u003eKEY a (a),\u003c/p\u003e\n\u003cp\u003eKEY bc (b,c),\u003c/p\u003e\n\u003cp\u003eKEY cb (c,b)\u003c/p\u003e\n\u003cp\u003e) ENGINE=InnoDB DEFAULT CHARSET=utf8;\u003c/p\u003e\n\u003cp\u003e执行语句为“insert into tb(a,b,c) values(randstr, randstr, randstr);” randstr是客户端程序生成的长度30字节的随机字符串。30个线程并发,每个线程插入1w条记录。\u003c/p\u003e\n\u003cp\u003e等待更新完成后(包括purge完成,从系统 …\u003c/p\u003e"
February 7, 2017
关于 InnoDB 索引长度限制的 tips
"\u003cp\u003e有同学问到InnoDB的索引长度问题,简单说几个tips。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e关于3072\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e大家经常碰到InnoDB单列索引长度不能超过767bytes,实际上联合索引还有一个限制是3072。\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/19130103_qFJc.jpg\" alt=\"\"\u003e][1]\u003c/p\u003e\n\u003cp\u003e可以看到,由于每个字段占用255*3, 因此这个索引的大小是3825(255*3*5)\u0026gt;3072,报错。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e为什么3072\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e我们知道InnoDB一个page的默认大小是16k。由于是Btree组织,要求叶子节点上一个page至少要包含两条记录(否则就退化链表了)。\u003c/p\u003e\n\u003cp\u003e所以一个记录最多不能超过8k。\n又由于InnoDB的聚簇索引结构,一个二级索引要包含主键索引,因此每个单个索引不能超过4k (极端情况,pk和某个二级索引都达到这个限制)。\n由于需要预留和辅助空间,扣掉后不能超过3500,取个“整数”就是(1024*3)。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e单列索引限制\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e上面有提到单列索引限制767,起因是256×3-1。这个3是字符最大占用空间(utf8)。但是在5.6以后,开始支持4个字节的uutf8。255×4\u0026gt;767, 于是增加了一个参数叫做 innodb_large_prefix。\u003c/p\u003e\n\u003cp\u003e这个参数默认值是OFF。当改为ON时, …\u003c/p\u003e"
February 6, 2017
由浅入深理解InnoDB的索引实现系列
"\u003ch2 id=\"activity-name.rich_media_title\"\u003e\u003ca href=\"http://mp.weixin.qq.com/s/osxa_3lFfL_H934dVm6Ttg\"\u003e由浅入深理解InnoDB的索引实现(1)\u003c/a\u003e\u003c/h2\u003e\n\u003ch2 id=\"activity-name.rich_media_title\"\u003e\u003ca href=\"https://mp.weixin.qq.com/s/FcizTIjPZ40jFJPqTsit8A\"\u003e由浅入深理解InnoDB的索引实现(2)\u003c/a\u003e\u003c/h2\u003e"
February 6, 2017
MySQL数据库InnoDB存储引擎Log漫游系列
"\u003ch2 id=\"activity-name.rich_media_title\"\u003e\u003ca href=\"https://mp.weixin.qq.com/s/FSxy3Dlxvl3q416zZfBuuQ\"\u003eMySQL数据库InnoDB存储引擎Log漫游(1)\u003c/a\u003e\u003c/h2\u003e\n\u003ch2 id=\"activity-name.rich_media_title\"\u003e\u003ca href=\"https://mp.weixin.qq.com/s/R8G5mqX57XobXFDVFSsNdw\"\u003eMySQL数据库InnoDB存储引擎Log漫游(2)\u003c/a\u003e\u003c/h2\u003e\n\u003ch2 id=\"activity-name.rich_media_title\"\u003e\u003ca href=\"http://mp.weixin.qq.com/s/OyC3QfIW2N-_I8SS-HS0Gw\"\u003eMySQL数据库InnoDB存储引擎Log漫游(3)\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e以上转自 \u003cem\u003e宋利兵\u003c/em\u003e 老师的公众号“\u003cstrong\u003eMySQL代码研究\u003c/strong\u003e”\u003c/p\u003e"
January 30, 2017
传统复制与 GTID复制的切换知识点
"\u003cp\u003e在5.6以后,可以通过命令动态修改.\u003c/p\u003e\n\u003cp\u003e注意有些命令是需要主从都要执行,有些命令是只在slave执行。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003egtid_mode 的几种状态值说明:\u003c/strong\u003e\nOFF: 不产生 GTID, 基于 binlog+position,也不能接受GTID的日志。默认值\nOFF_PERMISSIVE: 不生产 GTID,但作为slave可以识别GTID事务也可以识别非GTID事务\nON_PERMISSIVE: 产生GTID,slave可以处理GTID事务和非GTID事务\nON: 产生GTID事务,slave只接受GTID事务\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e实验一:将传统复制切换到GTID复制\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e启用GTID:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eset @@global.enforce_gtid_consitency=warn;\nset @@global.enforce_gtid_consistency=on;\nset @@global.gtid_mode=OFF_PERMISSIVE; #不产生gtid,但可以处理gtid\nset @@global.gtid_mode=ON_PERMISSIVE; #产生gtid,也可以处理gtid\nshow status like …\u003c/code\u003e\u003c/pre\u003e"
January 28, 2017
MySQL 5.7中的半同步复制
"\u003cp\u003e在5.7下半同步是以插件的形式出现的,所以在启用半同步前要先安装半同步插件 semisync_master.so\u003c/p\u003e\n\u003cp\u003eOn the master:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eINSTALL PLUGIN rpl_remi_sync_master SONAME \u0026#39;semisync_master.so\u0026#39;;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOn slave slave:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eINSTALL PLUGIN rpl_semi_sync_slave SONAME \u0026#39;semisync_slave.so\u0026#39;;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e在my.cnf里配置,要写在mysqld段\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emaster:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[mysqld]\nrepl_semi_sync_master_enable=1\nrepl_semi_sync_master_timeout=1000 #1 second\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eslave:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[mysqld]\nrepl_semi_sync_slave_enable=1\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e卸载插件:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003euninstall plugin rpl_semi_sync_master; # master\nuninstall plugin rpl_semi_sync_slave; # slave\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e在主上设 …\u003c/p\u003e"
January 28, 2017
MySQL5.7下多源复制知识要点(原创)
"\u003cp\u003e架构为两主一从,两主为同一台服务器的多实例,安装方法请参考上篇文章 \u003ca href=\"http://blog.haohtml.com/archives/17300\"\u003ehttp://blog.haohtml.com/archives/17300\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e主master1 IP: 192.168.1.116 PORT: 3306\n主master2 IP: 192.168.1.116 PORT: 3307\n从slave IP: 192.168.1.200 PORT: 3306\u003c/p\u003e\n\u003cp\u003e两主为全新安装。如果以前安装过的话,可以将原来的数据库删除掉,再执行 \u003ccode\u003ereset master\u003c/code\u003e 即可。(否则需要将两个主的想着库表使用 mysqldump到从中) \u003ccode\u003emy.cnf \u003c/code\u003e配置\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[master1 3306] \n[client]\nport=3306\nsocket=/data/mysql/mysql3306/tmp/mysql.sock\n\n[mysqld]\nbasedir=/data/mysql/mysql3306\ndatadir=/data/mysql/mysql3306/datadir\n#socket=/var/lib/mysql/mysql.sock …\u003c/code\u003e\u003c/pre\u003e"
January 22, 2017
xtrabackup 详解
"\u003cp\u003e\u003ca href=\"http://www.cnblogs.com/gomysql/p/3650645.html\"\u003ehttp://www.cnblogs.com/gomysql/p/3650645.html\u003c/a\u003e\u003c/p\u003e"
January 20, 2017
Innodb中Page结构
"\u003col\u003e\n\u003cli\u003e一个存放记录(row)的page,由page header、page trailer、page body组成。如下图:\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2017/01/page_struct.png\"\u003e2\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2017/01/page_struct.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/page_struct.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003epage的完整结构\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2017/01/page_full_struct.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/page_full_struct.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003epage的结构详情参看如下:\u003c/p\u003e\n\u003cp\u003efrom: \u003ca href=\"http://forge.mysql.com/wiki/MySQL_Internals_InnoDB#InnoDB_Page_Structure\"\u003ehttp://forge.mysql.com/wiki/MySQL_Internals_InnoDB#InnoDB_Page_Structure\u003c/a\u003e High-Altitude Picture\u003c/p\u003e\n\u003cp\u003eThe chart below shows the three parts of a physical record.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eName****Size\u003c/strong\u003e\nField Start Offsets\u003c/p\u003e\n\u003cp\u003e(F\u003cem\u003e1) or (F\u003c/em\u003e2) bytes\u003c/p\u003e\n\u003cp\u003eExtra Bytes\u003c/p\u003e\n\u003cp\u003e6 bytes\u003c/p\u003e\n\u003cp\u003eField Contents\u003c/p\u003e\n\u003cp\u003edepends on content\u003c/p\u003e\n\u003cp\u003eLegend: The letter ‘F’ stands for ‘Number Of Fields’.\u003c/p\u003e\n\u003cp\u003eThe meaning of the parts is as follows:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eThe FIELD START OFFSETS is a list of numbers …\u003c/li\u003e\u003c/ul\u003e"
January 19, 2017
聚簇索引(clustered index )和非聚簇索引(secondary index)的区别
"\u003cp\u003e这两个名字虽然都叫做索引,但这并不是一种单独的索引类型,而是一种数据存储方式。对于聚簇索引存储来说,行数据和主键B+树存储在一起,辅助键B+树只存储辅助键和主键,主键和非主键B+树几乎是两种类型的树。对于非聚簇索引存储来说,主键B+树在叶子节点存储指向真正数据行的指针,而非主键。\u003c/p\u003e\n\u003cp\u003eInnoDB使用的是聚簇索引,将主键组织到一棵B+树中,而行数据就储存在叶子节点上,若使用”where id = 14″这样的条件查找主键,则按照B+树的检索算法即可查找到对应的叶节点,之后获得行数据。若对Name列进行条件搜索,则需要两个步骤:第一步在辅助索引B+树中检索Name,到达其叶子节点获取对应的主键。第二步使用主键在主索引B+树种再执行一次B+树检索操作,最终到达叶子节点即可获取整行数据。\u003c/p\u003e\n\u003cp\u003eMyISM使用的是非聚簇索引,非聚簇索引的两棵B+树看上去没什么不同,节点的结构完全一致只是存储的内容不同而已,主键索引B+树的节点存储了主键,辅助键索引B+树存储了辅助键。表数据存储在独立的地方,这两颗B+树的叶子节点都使用一个地址指向真正的表数据,对于表数据来说,这两个键没有任何差别。由于索引树是独立的,通 …\u003c/p\u003e"
January 12, 2017
innodb_rollback_on_timeout参数对锁的影响
"\u003cp\u003e\u003ca href=\"http://fireflyclub.org/?/article/37\"\u003ehttp://fireflyclub.org/?/article/37\u003c/a\u003e\u003c/p\u003e"
January 12, 2017
mysql 事务提交过程-两阶段提交
"\u003cp\u003e\u003ca href=\"http://www.cnblogs.com/yuyue2014/p/4738007.html\"\u003ehttp://www.cnblogs.com/yuyue2014/p/4738007.html\u003c/a\u003e\u003c/p\u003e"
January 12, 2017
如何查询mysql事务未提交
"\u003cp\u003e\u003cstrong\u003e注意这篇文章并非死锁的,而是锁等待\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e到information_schema库下面,查看下面这个表:\u003c/p\u003e\n\u003cp\u003einnodb_trx ## 当前运行的所有事务\u003c/p\u003e\n\u003cp\u003einnodb_locks ## 当前出现的锁\u003c/p\u003e\n\u003cp\u003einnodb_lock_waits ## 锁等待的对应关系\u003c/p\u003e\n\u003cp\u003e如果遇到死锁了,怎么解决呢?找到原始的锁ID,然后KILL掉一直持有的那个线程就可以了, 但是众多线程,可怎么找到引起死锁的线程ID呢? MySQL 发展到现在,已经非常强大了,这个问题很好解决。 直接从数据字典连查找。\u003c/p\u003e\n\u003cp\u003e我们来演示下。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e线程A,我们用来锁定某些记录,假设这个线程一直没提交,或者忘掉提交了。 那么就一直存在,但是数据里面显示的只是SLEEP状态。\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003emysql\u0026gt; set @@autocommit=0;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eQuery OK, 0 rows affected (0.00 sec)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003emysql\u0026gt; use test;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eReading table information for completion oftableandcolumn names\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eYou can turn …\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e"
January 9, 2017
mysql中的handler_read_%
"\u003col\u003e\n\u003cli\u003e\n\u003cp\u003emysql\u0026gt; show status like ‘handler_read_%’;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e+———————–+——-+\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e| Variable_name | Value |\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e+———————–+——-+\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e| Handler_read_first | 1 |\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e| Handler_read_key | 1 |\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e| Handler_read_last | 0 |\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e| Handler_read_next | 0 |\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e| Handler_read_prev | 0 |\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e| Handler_read_rnd | 0 |\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e| Handler_read_rnd_next | 21 |\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e+———————–+——-+\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e7 rows in set (0.01 sec)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e如上所示,mysql中关于read的计数器,有7个。他们的数值对于系统的状况的了解,对于系统的调优都十分重要。我们应该理解他们的含义。本文是自己的一些理解。\n首先7个计数器,我们应该分为两部分:\n1)对索引读的计数器:前面的5个都是对索引读情况的计数器, …\u003c/p\u003e"
January 3, 2017
B+ TREE 结构
"\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/btree.jpg\" alt=\"img\"\u003e\u003c/p\u003e\n\u003cp\u003e其中key 是索引, \u003ccode\u003ed1\u003c/code\u003e、\u003ccode\u003ed2\u003c/code\u003e是索引对应的值,包含更多的信息。\u003c/p\u003e"
December 6, 2016
[Err] 1055 – Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column ‘information_schema.PROFILING.SEQ’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by的解决办法
"\u003cp\u003e线上用的MySQL版本为5.7.11,线下用的5.6版本,发现将程序上线后,有些地方报这个错误\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[Err] 1055 – Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column ‘information_schema.PROFILING.SEQ’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003eONLY_FULL_GROUP_BY:\u003c/strong\u003e\n对于GROUP BY聚合操作,若select中的列没有在group by中出现,那么这句SQL是不合法的。\u003c/p\u003e\n\u003cp\u003e解决办法下my.cnf中添加以下几行\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[mysqld] …\u003c/code\u003e\u003c/pre\u003e"
December 3, 2016
Linux下安装MySQL多实例
"\u003cp\u003e\u003cstrong\u003e环境说明:\u003c/strong\u003e\nCentos 6.6 64位\nmysql 使用最新版本5.7.16版本\u003c/p\u003e\n\u003cp\u003e这里安装两个MySQL实例,分别使用3306/3307端口号\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e目录结构:\u003c/strong\u003e\n/data/mysql/mysql3306\n/data/mysql/mysql3306/data\n/data/mysql/mysql3307/log\n/data/mysql/mysql3306/tmp\u003c/p\u003e\n\u003cp\u003e执行命令:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emkdir -p /data/mysql/mysql3306/{data,tmp,log}\nmkdir -p /data/mysql/mysql3307/{data,tmp,log}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e为了方便我们先配置mysql3306实例,配置成功后,再复制一份到3307即可。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003etar zxvf mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz\ncp -rf mysql-5.7.16-linux-glibc2.5-x86_64/* /data/mysql/mysql3306/\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e权限修改\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003echown -R mysql:mysql /data/mysql/mysql3306\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e配置my.cnf\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecd …\u003c/code\u003e\u003c/pre\u003e"
November 30, 2016
Percona XtraBackup备份mysql数据库 技术手册
"\u003cp\u003e\u003ca href=\"https://www.percona.com/doc/percona-xtrabackup/2.4/index.html\"\u003ehttps://www.percona.com/doc/percona-xtrabackup/2.4/index.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e下载地址: \u003ca href=\"https://www.percona.com/downloads/XtraBackup/LATEST/\"\u003ehttps://www.percona.com/downloads/XtraBackup/LATEST/\u003c/a\u003e\n一、安装两个必需库\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo yum -y install libdv perl-DBD-MySQL\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e如果libev库在yum源找不到的话,需要在rpmfind.net网站下载自行安装。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ewget ftp://rpmfind.net/linux/dag/redhat/el6/en/x86_64/dag/RPMS/libev-4.15-1.el6.rf.x86_64.rpm\nrpm libev-4.15-1.el6.rf.x86_64.rpm\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e二、安装percona-xtrabackup\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ewget …\u003c/code\u003e\u003c/pre\u003e"
November 25, 2016
MySQL高可用架构几种方案
"\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2016/11/mysql_ha.jpeg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2016/11/mysql_ha.jpeg\" alt=\"mysql_ha\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eMySQL高可用架构之MHA \u003ca href=\"http://www.cnblogs.com/gomysql/p/3675429.html\"\u003ehttp://www.cnblogs.com/gomysql/p/3675429.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e基于PXC的MySQL高可用架构探索 \u003ca href=\"http://www.infoq.com/cn/presentations/mysql-high-availability-architecture-exploration-based-on-pxc\"\u003ehttp://www.infoq.com/cn/presentations/mysql-high-availability-architecture-exploration-based-on-pxc\u003c/a\u003e\u003c/p\u003e"
November 24, 2016
MySQL的InnoDB引擎强烈建议使用自增主键的原因
"\u003cp\u003e1)InnoDB使用聚集索引,数据记录本身被存于主索引的叶子节点上,这就要求同一个叶子节点内的各条数据记录按主键顺序存放,因此每当一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子,则开辟一个新的页(节点)。\u003c/p\u003e\n\u003cp\u003e如果表使用自增主键,那么每次插入新的记录时,记录就会顺序添加到当前索引节点后续位置,当一页写满,就会自动开辟一个新的页。这样就就会形成一个紧凑的索引结构,近似顺序填满,由于每次插入时也不需要移动所有数据,因此效率很高,也不会增加很多额外的开销维护索引。\u003c/p\u003e\n\u003cp\u003e如果使用非自增主键,由于每次插入主键的值近乎于随机,因此每次新纪录都要被插到现有索引页的中间某个位置,此时MySQL不得不为了将新纪录插到合适位置而移动数据,甚至目标页面可能已经被写到磁盘而从缓存中清除,这增加了很多额外开销,同时频繁的移动,分页造成了大量的碎片,得到不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建并优化填充页面。\u003c/p\u003e\n\u003cp\u003e2)由于MySQL从磁盘读取数据时一块一块来读取的,同时,根据局部性原理,MySQL引擎会选择预读一部分和你当前读数据所在内存相邻的数据块,这个 …\u003c/p\u003e"
November 23, 2016
[MySQL优化案例]系列 — slave延迟很大优化方法
"\u003cp\u003e\u003ca href=\"http://imysql.cn/2015/04/12/mysql-optimization-case-howto-resolve-slave-delay.shtml\"\u003ehttp://imysql.cn/2015/04/12/mysql-optimization-case-howto-resolve-slave-delay.shtml\u003c/a\u003e\u003c/p\u003e"
November 22, 2016
MySQL数据库的高可用性分析
"\u003cp\u003e\u003ca href=\"https://www.qcloud.com/community/article/203\"\u003ehttps://www.qcloud.com/community/article/203\u003c/a\u003e\u003c/p\u003e"
November 21, 2016
mysql中数据类型与占用空间大小的关系
"\u003cp\u003e1、 如一个表有10个int类型的字段,那么每行数据大小为\u003c/p\u003e\n\u003cp\u003e4(每个int类型占用4字节byte) * 10 = 40Bytes\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/mysql_int_datatype.png\" alt=\"mysql_int_datatype\"\u003e][1]\u003c/p\u003e\n\u003cp\u003e2、 如一个表有10个varchar(20)的字段,编码为utf8,那每行占用大小为\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e3(每个汉字占用3字节) * 20 * 10 = 600Bytes\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e如果是英文字符的话,则为\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e1(1个字符占用1个字节) * 20 * 10 = 200Bytes\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/mysql_varchar_datatype.png\" alt=\"mysql_varchar_datatype\"\u003e][2]\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e则以上两种情况 ,每行的数据均\u0026lt;8K (1024byte * 8) ,符合以下规则( 1024byte = 1KB)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/mysql.png\" alt=\"mysql\"\u003e]\u003c/p\u003e"
November 21, 2016
mysql压力测试工具spcc-mysql
"\u003cp\u003e\u003ca href=\"http://imysql.cn/2014/10/10/tpcc-mysql-full-user-manual.shtml\"\u003ehttp://imysql.cn/2014/10/10/tpcc-mysql-full-user-manual.shtml\u003c/a\u003e \u003ca href=\"http://imysql.com/tag/%E5%8E%8B%E6%B5%8B\"\u003ehttp://imysql.com/tag/压测\u003c/a\u003e\u003c/p\u003e"
October 8, 2016
一张图让你彻底理解聚簇索引与普通索引的区别[经典]
"\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/mysq_index.png\" alt=\"mysq_index\"\u003e][1]\u003c/p\u003e\n\u003cp\u003e下面分析下索引和锁的关系。\n1)delete from msg where id=2;\u003c/p\u003e\n\u003cp\u003e由于id是主键,因此直接锁住整行记录即可。\n\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/2f67547e0caa0d1ea9bc7cb53966eedf70d49db3.png\" alt=\"\"\u003e 图5\n2)delete from msg where token=’ cvs’;\u003c/p\u003e\n\u003cp\u003e由于token是二级索引,因此首先锁住二级索引(两行),接着会锁住相应主键所对应的记录;\n\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/e0ac34fd99404ccdee4ab1ec4889f47754ffcd82.png\" alt=\"\"\u003e 图6\n3)delete from msg where message=订单号是多少’;\u003c/p\u003e\n\u003cp\u003emessage没有索引,所以走的是全表扫描过滤。这时表上的各个记录都将添加上X锁。\n\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/aa9a94c735ec35cfe92cd5eca1015893aad8de58.png\" alt=\"\"\u003e 图7\u003c/p\u003e\n\u003cp\u003e强烈推荐阅读: …\u003c/p\u003e"
October 7, 2016
mysql配置变量介绍
"\u003cp\u003e\u003cstrong\u003ekey_buffer_size\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e设置这个变量给键缓冲区(或者说键缓存)分配指定大小的空间。但是操作系统只有在实际用到这些空间的时候才会进行分配。例如,将键缓冲区大小设置为1GB,并不意味着服务器就会真正地给它分配1GB空间。\u003c/p\u003e\n\u003cp\u003e对一个已有的缓存设置非零值将会冲洗缓存,从技术上来说,这是一个在线操作,但是它会阻止所有访问该缓存的动作,直到缓存冲洗完成。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003etable_cache_size\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e设置这个变量是不会立即生效,要等到下一个线程打开表的时候才会生效。当它生效的时候,MYSQL会检查变量的值。如果值大于缓存中表的数量,线程就可以把新打开的表插入到缓存中。如果值小于缓存中表的数量,MySQL就会从缓存中删除掉没有使用的表。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ethread_cache_size\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e设置这个变量不会立即生效,生效被延时到了下一次线程关闭的时候。在那时,MySQL检查缓存中是否有空间存储线程。如果是,它会把线程缓存起来,供另外一个连接使用。如果不是,它会直接结束掉线程。在这种情况下,缓存中线程的数量,以及线程缓存使用的内存数量不会立即就下降。只有当新连接为了使用线程把它从缓存中移走的时候才会看到下降。(MySQL只有 …\u003c/p\u003e"
October 6, 2016
MySQL实战系列:大字段如何优化
"\u003cp\u003e\u003ca href=\"https://yq.aliyun.com/articles/59256\"\u003ehttps://yq.aliyun.com/articles/59256\u003c/a\u003e\u003c/p\u003e"
May 10, 2016
mysql 数据表读锁机制详解
"\u003cp\u003e为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制。\n**一、概述\n** MySQL有三种锁的级别:页级、表级、行级。\nMyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁;InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。\nMySQL这3种锁的特性可大致归纳如下:\n表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。\n行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。\n页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。\u003c/p\u003e\n\u003cp\u003e从上述特点可见,很难笼统地说哪种锁更好,只能就具体应用的特点来说哪种锁更合适!仅从锁的角度来说:表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用;而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并 …\u003c/p\u003e"
January 19, 2016
MySQL索引之聚集索引
"\u003ch2 id=\"导读\"\u003e导读\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e在MySQL里,聚集索引和非聚集索引分别是什么意思,有什么区别?\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e在MySQL中,InnoDB引擎表是(聚集)索引组织表(clustered index organize table),而MyISAM引擎表则是堆组织表(heap organize table)。\u003c/p\u003e\n\u003cp\u003e也有人把聚集索引称为聚簇索引。\u003c/p\u003e\n\u003cp\u003e当然了,聚集索引的概念不是MySQL里特有的,其他数据库系统也同样有。\u003c/p\u003e\n\u003cp\u003e简言之,\u003cstrong\u003e聚集索引是一种索引组织形式,索引的键值逻辑顺序决定了表数据行的物理存储顺序\u003c/strong\u003e,而非聚集索引则就是普通索引了,仅仅只是对数据列创建相应的索引,不影响整个表的物理存储顺序。\u003c/p\u003e\n\u003cp\u003e我们先来看看两种存储形式的不同之处:\u003c/p\u003e\n\u003cp\u003e简单说,IOT表里数据物理存储顺序和主键索引的顺序一致,所以\u003cstrong\u003e如果新增数据是离散的,会导致数据块趋于离散\u003c/strong\u003e,而不是趋于顺序。而HOT表数据写入的顺序是按写入时间顺序存储的。\nIOT表相比HOT表的\u003cstrong\u003e优势\u003c/strong\u003e是:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e范围查询效率更高;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e数据频繁更新(聚集索引本身不更新)时,更不容易产生碎片;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e特别适合有一小部分热点数据频繁读写的场景;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e通过主键访问数据时快速可达;\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIOT表的\u003cstrong\u003e不足\u003c/strong\u003e则有:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e数据变化如果 …\u003c/li\u003e\u003c/ul\u003e"
January 19, 2016
你真的了解SQL的索引吗?
"\u003cp\u003e其实对于非专业的数据库操作人员来讲,例如软件开发人员,在很大程度上都搞不清楚数据库索引的一些基本知识,有些是知其一不知其二,或者是知其然不知其所以然。造成这种情况的主要原因我觉的是行业原因,有很多公司都有自己的DBA团队,他们会帮助你优化SQL,开发人员即使不懂优化问题也不大,所以开发人员对这方面也就不会下太多功夫去了解SQL优化,但如果公司没有这样的DBA呢,就只能靠程序员自己了。 最近突然想起前一阵和一朋友的聊天,当时他问我的问题是一个非常普通的问题:说说SQL聚集索引和非聚集索引的区别。\u003c/p\u003e\n\u003cp\u003e大家可能认为这个问题难度不大,认为太熟悉了,也许不会感兴趣,但你真能说清楚吗?其实要想说明白这两者的差别也不是三两句就说的清的,那天我也是觉的这问题太泛了,就随便说了其中的两个区别:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个,这个跟没问题没差别,一般人都知道。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续,这个大家也都知道。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e上面的两点从大的方面讲都是讲的通的,后面我们继续探讨,举一个实际点的例子,一个学生表student,里面是学生 …\u003c/p\u003e"
January 19, 2016
MySQL聚簇索引&聚集索引&索引组织表myisam
"\u003cp\u003eMySQL聚簇索引\u0026amp;聚集索引\u0026amp;索引组织表\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html\"\u003ehttp://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html\u003c/a\u003e\u003c/p\u003e\n\u003ch1 id=\"聚簇索引和聚集索引clustered-index\"\u003e聚簇索引和聚集索引(Clustered Index)\u003c/h1\u003e\n\u003cp\u003e说起索引,不能不说B+树。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e引用: \u003ca href=\"http://blog.codinglabs.org/articles/theory-of-mysql-index.html\"\u003ehttp://blog.codinglabs.org/articles/theory-of-mysql-index.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eMySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。\u003c/p\u003e\n\u003cp\u003e我们知道,数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。\u003cem\u003e\u003cstrong\u003e最基本的查询算法当然是顺序查找(linear search)\u003c/strong\u003e\u003c/em\u003e,这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优秀的查找算法,例如\u003cstrong\u003e二分查找(binary search),\u003c/strong\u003e\u003cem\u003e\u003cstrong\u003e二叉树查找(binary tree search)\u003c/strong\u003e\u003cem\u003e等。如果稍微分析一下会发现,每种查找算法都只能应用于特定的数据结 …\u003c/em\u003e\u003c/em\u003e\u003c/p\u003e\u003c/blockquote\u003e"
August 10, 2015
Mysql Innodb的两种表空间方式
"\u003cp\u003e要说表空间,Mysql的表空间管理远远说不上完善。换句话说,事实上Mysql根本没有真正意义上的表空间管理。Mysql的Innodb包含两种表空间文件模式,默认的共享表空间和每个表分离的独立表空间。只要在my.cnf里面增加innodb_file_per_table=1就可以从共享表空间切换到独立表空间。当然对于已经存在的表,则需要执行alter table MY_TABLE engine=innodb命令迁移数据。\u003c/p\u003e\n\u003ch1 id=\"共享表空间方式\"\u003e\u003cstrong\u003e共享表空间方式\u003c/strong\u003e\u003c/h1\u003e\n\u003cp\u003e由于是默认的方式,就暂且理解为Mysql官方推荐的方式。相对而言所有的数据都在一个(或几个)文件中,比较利于管理,而且在操作的时候只需要open这一个(或几个)文件即可,相对来说代价很低。\u003c/p\u003e\n\u003cp\u003e但问题是在数据达到以G为单位来计算的时候优劣逆转。一个大小惊人的文件很不利于管理,而且对于一个如此巨大的文件来说,读写它需要耗费的资源一样巨大。更加令人费解的是,MySQL竟然将索引和数据保存于同一个文件中,索引和数据之间尚存在资源争用,不利于性能的提升。你当然可以通过innodb_data_file_path的配置规划多个表空间文件,但MySQL的逻辑是“用满后增 …\u003c/p\u003e"
August 10, 2015
[MySQL优化案例]系列 — 索引、提交频率对InnoDB表写入速度的影响
"\u003cp\u003e本次,我们通过对比,明明白白的知道索引、提交频率对InnoDB表写入速度的影响,了解有哪些需要注意的。\u003c/p\u003e\n\u003cp\u003e先直接说几个结论吧:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e1、关于索引对写入速度的影响:\na、如果有自增列做主键,相对完全没索引的情况,写入速度约提升 3.11%;\nb、如果有自增列做主键,并且二级索引,相对完全没索引的情况,写入速度约降低 27.37%;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e因此,\u003cstrong\u003eInnoDB表最好总是有一个自增列做主键\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e2、关于提交频率对写入速度的影响(以表中只有自增列做主键的场景,一次写入数据30万行数据为例):\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ea、等待全部数据写入完成后,最后再执行commit提交的效率最高;\nb、每10万行提交一次,相对一次性提交,约慢了1.17%;\nc、每1万行提交一次,相对一次性提交,约慢了3.01%;\nd、每1千行提交一次,相对一次性提交,约慢了23.38%;\ne、每100行提交一次,相对一次性提交,约慢了24.44%;\nf、每10行提交一次,相对一次性提交,约慢了92.78%;\ng、每行提交一次,相对一次性提交,约慢了546.78%,也就是慢了5倍;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e因此,\u003cstrong\u003e最好是等待所有事务结束后再批量提交,而不是每执行完一个SQL就提交一次\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e曾经 …\u003c/p\u003e"
August 10, 2015
[MySQL FAQ]系列 — 什么情况下会用到临时表
"\u003cp\u003e\u003cstrong\u003eMySQL在以下几种情况会创建临时表:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e1、UNION查询;\n2、用到TEMPTABLE算法或者是UNION查询中的视图;\n3、ORDER BY和GROUP BY的子句不一样时;\n4、表连接中,ORDER BY的列不是驱动表中的;\n5、DISTINCT查询并且加上ORDER BY时;\n6、SQL中用到SQL_SMALL_RESULT选项时;\n7、FROM中的子查询;\n8、子查询或者semi-join时创建的表;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEXPLAIN 查看执行计划结果的 Extra 列中,如果包含 ** \u003ca href=\"http://imysql.com/2015/06/14/mysql-faq-what-important-information-in-explain.shtml\"\u003eUsing Temporary\u003c/a\u003e** 就表示会用到临时表。\u003c/p\u003e\n\u003cp\u003e当然了,如果临时表中需要存储的数据量超过了上限( \u003ca href=\"https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_tmp_table_size\"\u003etmp-table-size\u003c/a\u003e 或 \u003ca href=\"https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_max_heap_table_size\"\u003emax-heap-table-size\u003c/a\u003e 中取其大者),这时候就需要生成基于磁盘的临时表了。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e在以下几种情况下,会创建磁盘临时表:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e1、数据表中包含BLOB/TEXT列;\n2、在 GROUP BY 或者 DSTINCT 的列中有超过 512字符 的字符类型列(或者超过 512字节的 二进制类型列,在5.6.15之前只管是否超过512字节);\n3、 …\u003c/code\u003e\u003c/pre\u003e"
August 10, 2015
[MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键
"\u003cp\u003e我们先了解下InnoDB引擎表的一些关键特征:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eInnoDB引擎表是基于B+树的索引组织表(IOT);\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e每个表都需要有一个聚集索引(clustered index);\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e所有的行记录都存储在B+树的叶子节点(leaf pages of the tree);\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e基于聚集索引的增、删、改、查的效率相对是最高的;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择其作为聚集索引;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e如果也没有这样的唯一索引,则InnoDB会选择内置6字节长的ROWID作为隐含的聚集索引(ROWID随着行记录的写入而主键递增,这个ROWID不像ORACLE的ROWID那样可引用,是隐含的)。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e综上总结,如果InnoDB表的数据写入顺序能和B+树索引的叶子节点顺序一致的话,这时候存取效率是最高的,也就是下面这几种情况的存取效率最高:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e使用自增列(INT/BIGINT类型)做主键,这时候写入顺序是自增的,和B+数叶子节点分裂顺序一致;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e该表不指定自增列做主键,同时也没有可 …\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e"
July 18, 2015
mysql中kill掉所有锁表的进程
"\u003cp\u003e很多时候由于异常或程序错误会导致个别进程占用大量系统资源,需要结束这些进程,通常可以使用以下命令Kill进程:\u003c/p\u003e\n\u003cp\u003emysql中kill掉所有锁表的进程\u003c/p\u003e\n\u003cp\u003e3点钟刚睡下, 4点多, 同事打电话告诉我用户数据库挂掉了. 我起床看一下进程列表.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emysql\u0026gt;show process list;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e出来哗啦啦好几屏幕的, 没有一千也有几百条, 查询语句把表锁住了, 赶紧找出第一个Locked的thread_id, 在mysql的shell里面执行.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emysql\u0026gt;kill thread_id;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ekill掉第一个锁表的进程, 依然没有改善. 既然不改善, 咱们就想办法将所有锁表的进程kill掉吧, 简单的脚本如下.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#!/bin/bash\nmysql -u root -e \u0026#34;show processlist\u0026#34; | grep -i \u0026#34;Locked\u0026#34; \u0026gt;\u0026gt; locked_log.txt for line in `cat locked_log.txt | awk \u0026#39;{print $1}\u0026#39;`\ndo\necho \u0026#34;kill …\u003c/code\u003e\u003c/pre\u003e"
July 18, 2015
检查mysql数据库是否存在坏表
"\u003cp\u003eshell脚本检测和检查mysql数据库是否存在坏表\u003c/p\u003e\n\u003cp\u003e此脚本的主要用途是检测mysql服务器上所有的数据库或者单独数据库中的坏表,适用于RHEL/Centos系列\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2015/07/check_mysql.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/check_mysql.png\" alt=\"check_mysql\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#!/bin/bash\n#此脚本的主要用途是检测mysql服务器上所有的db或者单独db中的坏表\n#变量说明 pass mysql账户口令 name mysql账号名称 data_path mysql目录路径 directory_list 目录列表 file_list文件列表 db_name 数据库名称 repair_count单库中待修复的表总数\n#变量说明 repair_count_all所有库中待修复的表总数 mysql_version mysql版本 _file_name 数据表名称\n\necho -e \u0026#34;此脚本的主要用途是检测mysql服务器上所有的数据库或者单独数据库中的坏表\\n\\n\u0026#34;\npass=123456\nname=root\n\nread -p \u0026#34;输入mysql存储路径: \u0026#34; choose\ndata_path=$choose\nunset choose\n\nread -p …\u003c/code\u003e\u003c/pre\u003e"
July 28, 2014
mysql中数据类型的长度解释
"\u003ch2 id=\"112-数值类型\"\u003e11.2. 数值类型\u003c/h2\u003e\n\u003cp\u003eMySQL支持所有标准SQL数值数据类型。这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。\u003c/p\u003e\n\u003cp\u003eBIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。\u003c/p\u003e\n\u003cp\u003e作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。\u003c/p\u003e\n\u003ctable\u003e\n \u003cthead\u003e\n \u003ctr\u003e\n \u003cth\u003e\u003cstrong\u003e类型\u003c/strong\u003e\u003c/th\u003e\n \u003cth\u003e\u003cstrong\u003e字节\u003c/strong\u003e\u003c/th\u003e\n \u003cth\u003e\u003cstrong\u003e最小值\u003c/strong\u003e\u003c/th\u003e\n \u003cth\u003e\u003cstrong\u003e最大值\u003c/strong\u003e\u003c/th\u003e\n \u003c/tr\u003e\n \u003c/thead\u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\u003e\u003c/td\u003e\n \u003ctd\u003e\u003c/td\u003e\n \u003ctd\u003e\u003cstrong\u003e(带符号的/无符号的)\u003c/strong\u003e\u003c/td\u003e\n \u003ctd\u003e\u003cstrong\u003e(带符号的/无符号的)\u003c/strong\u003e\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\u003eTINYINT\u003c/td\u003e\n \u003ctd\u003e1\u003c/td\u003e\n \u003ctd\u003e-128\u003c/td\u003e\n \u003ctd\u003e127 …\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e"
August 20, 2013
mysql中的表锁的优化
"\u003ch2 id=\"一获取锁等待情况\"\u003e一、获取锁等待情况\u003c/h2\u003e\n\u003cp\u003e可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定争夺:\nmysql\u0026gt; show status like ‘Table%’;\n+—————————-+———-+\n| Variable_name | Value |\n+—————————-+———-+\n| Table_locks_immediate | 105 |\n| Table_locks_waited | 3 |\n+—————————-+———-+\n2 rows in set (0.00 sec)\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eTable_locks_immediate\u003c/strong\u003e 表示立即释放MySQL表锁数,\n\u003cstrong\u003eTable_locks_waited\u003c/strong\u003e 表示需要等待的MySQL表锁数\u003c/p\u003e\n\u003cp\u003e如果Table_locks_waited的值比较高,则说明存在着较严重的表级锁争用情况。这时,需要我们对应用做进一步的检查,来确定问题所在。\u003c/p\u003e\n\u003cp\u003e可以通过检查Innodb_row_lock状态变量来分析系统上的行锁的争夺情况:\nmysql\u0026gt; show status …\u003c/p\u003e"
July 10, 2013
mysql中innodb表的count优化
"\u003cp\u003e作/译者:叶金荣(imysql#imysql.com\u0026gt;),来源: \u003ca href=\"http://imysql.com/\"\u003ehttp://imysql.com\u003c/a\u003e,欢迎转载。\u003c/p\u003e\n\u003cp\u003e起因:在innodb表上做count(*)统计实在是太慢了,因此想办法看能不能再快点。\u003c/p\u003e\n\u003cp\u003e现象:先来看几个测试案例,如下\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、 sbtest 表上的测试\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eshow create table sbtest\\G\n*************************** 1. row ***************************\nTable: sbtest\nCreate Table: CREATE TABLE `sbtest` (\n`aid` bigint(20) unsigned NOT NULL auto_increment,\n`id` int(10) unsigned NOT NULL default \u0026#39;0\u0026#39;,\n`k` int(10) unsigned NOT NULL default \u0026#39;0\u0026#39;,\n`c` char(120) NOT NULL default \u0026#39;\u0026#39;,\n`pad` char(60) NOT NULL …\u003c/code\u003e\u003c/pre\u003e"
December 16, 2012
mysql中alter语句中change和modify的区别
"\u003cp\u003e以下摘自mysql5手册\u003c/p\u003e\n\u003cp\u003e您可以使用CHANGE _old_col_name__column_definition_子句对列进行重命名。重命名时,需给定旧的和新的列名称和列当前的类型。例如:要把一个INTEGER列的名称从a变更到b,您需要如下操作:\u003c/p\u003e\n\u003cp\u003e· mysql\u0026gt; \u003cstrong\u003eALTER TABLE t1 CHANGE a b INTEGER;\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e如果您想要更改列的类型而不是名称, CHANGE语法仍然要求旧的和新的列名称,即使旧的和新的列名称是一样的。例如:\u003c/p\u003e\n\u003cp\u003emysql\u0026gt; \u003cstrong\u003eALTER TABLE t1 CHANGE b b BIGINT NOT NULL;\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e您也可以使用MODIFY来改变列的类型,此时不需要重命名:\u003c/p\u003e\n\u003cp\u003emysql\u0026gt; \u003cstrong\u003eALTER TABLE t1 MODIFY b BIGINT NOT NULL;\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003emysql alter 语句用法,添加、修改、删除字段等\u003c/p\u003e\n\u003cp\u003e//主键549830479\u003c/p\u003e\n\u003cp\u003ealter table tabelname add new_field_id int(5) unsigned default 0 not null …\u003c/p\u003e"
November 24, 2012
mysql中的主从复制slave-skip-errors参数使用方法
"\u003cp\u003e在主从复制中,难免会遇到一些sql语句错误的问题。这个时候我们需要手动来重新设置中继日志的起始点了,有些麻烦。今天在看“2012华东架构师大会”视频的时候,发现淘宝丁奇的ppt里有这个参数,看名字就知道是让从库跳过一些错误了。以前没有注意过这个参数,这里了解一下这个参数的用法。\u003c/p\u003e\n\u003cp\u003e—————————————-\u003c/p\u003e\n\u003cp\u003e环境说明:\u003c/p\u003e\n\u003cp\u003emysql\u0026gt;show slave stsatus\\G;\u003c/p\u003e\n\u003cp\u003e报错信息如下:\u003c/p\u003e\n\u003cp\u003e……\u003c/p\u003e\n\u003cp\u003eLast_Errno: 1062\u003c/p\u003e\n\u003cp\u003eLast_Error: Error ‘Duplicate entry ‘1’ for key ‘PRIMARY” on query…….\u003c/p\u003e\n\u003cp\u003e……\u003c/p\u003e\n\u003cp\u003e1062的错误是指一些主键重复的错误,在my.cnf用slave-skip-erros 可以跳过去。这样就避免了由于sql出错导致的从复制失效。\u003c/p\u003e\n\u003cp\u003e—————————————-\u003c/p\u003e\n\u003cp\u003eError_code: 1032; handler error HA_ERR_KEY_NOT_FOUND;\u003c/p\u003e\n\u003cp\u003e造成1032错误的根本原因是主从数据库数据不一致,导致同步操作在从库上无法执行.解决办法同上\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e在slave的my.cnf …\u003c/code\u003e\u003c/pre\u003e"
November 21, 2012
理解MySQL数据库覆盖索引
"\u003cp\u003e话说有这么一个表:\u003c/p\u003e\n\u003cp\u003eCREATE TABLE \u003ccode\u003euser_group\u003c/code\u003e (\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eid\u003c/code\u003e int(11) NOT NULL auto_increment,\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003euid\u003c/code\u003e int(11) NOT NULL,\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003egroup_id\u003c/code\u003e int(11) NOT NULL,\u003c/p\u003e\n\u003cp\u003ePRIMARY KEY (\u003ccode\u003eid\u003c/code\u003e),\u003c/p\u003e\n\u003cp\u003eKEY \u003ccode\u003euid\u003c/code\u003e (\u003ccode\u003euid\u003c/code\u003e),\u003c/p\u003e\n\u003cp\u003eKEY \u003ccode\u003egroup_id\u003c/code\u003e (\u003ccode\u003egroup_id\u003c/code\u003e),\u003c/p\u003e\n\u003cp\u003e) ENGINE=InnoDB AUTO_INCREMENT=750366 DEFAULT CHARSET=utf8\u003c/p\u003e\n\u003cp\u003e看AUTO_INCREMENT就知道数据并不多,75万条。然后是一条简单的查询:\u003c/p\u003e\n\u003cp\u003e SELECT SQL_NO_CACHE uid FROM user_group WHERE group_id = 245;\u003c/p\u003e\n\u003cp\u003e很简单对不对?怪异的地方在于:\u003c/p\u003e\n\u003cp\u003e如果换成MyISAM做存储引擎的时候,查询耗时只需要0.01s,用InnoDB却会是0.15s左右。\u003c/p\u003e\n\u003cp\u003e如果只是就这么点差距其实不是什么大不了的事,但是真实的业务需求比这个复杂,造成的差距也很大:MyISAM只需要0.12s,InnoDB则需要2.2s.,最终定位到问题症结是在这 …\u003c/p\u003e"
October 19, 2012
有效的MySQL备份与恢复
"\u003cp\u003e【TechTarget中国原创】如果您接手了一个 \u003ca href=\"http://www.searchdatabase.com.cn/showcontent_66381.htm\"\u003eMySQL\u003c/a\u003e 生产系统,但不确定它是否运行了MySQL备份策略,这时需要做哪些保障措施呢?在实施备份策略之前,一定要明确数据规模和存储引擎使用等先决条件。这会对系统在备份过程中的可用性产生直接影响。\u003c/p\u003e\n\u003cp\u003e在本文中,我们将介绍用于确定最小备份功能所需要的方法,其中包括:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e确定数据库规模\u003c/li\u003e\n\u003cli\u003e确定存储引擎使用率\u003c/li\u003e\n\u003cli\u003e锁定和停机时间影响\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eMySQL备份方法\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e备份MySQL环境的策略有很多,这些策略与MySQL拓扑的服务器数量相关,有许多开源和商业工具可以执行备份操作。\u003c/p\u003e\n\u003cp\u003e假设目前您有一个单服务器环境,希望创建一个统一备份,那么您现在可以在所有MySQL环境中采用两种备份方法。第一种方法是停止MySQL实例,然后对整个文件系统执行冷备份。这样会让系统在特定时间段变成不可用状态,而且您必须确保复制了所有信息,其中包括MySQL数据、事务与二进制日志文件(如果有的话)和MySQL的当前配置。\u003c/p\u003e\n\u003cp\u003e第二种方法是使用MySQL标准安装所包含的客户端工具。使用mysqldump命令,可以在不停止MySQL实例的前提下创建一个统一的MySQL备份。然而,在运 …\u003c/p\u003e"
October 8, 2012
mysql explain 中key_len的计算
"\u003cp\u003e今天丁原问我mysql执行计划中的key_len是怎么计算得到的,当时还没有注意,在高性能的那本书讲到过这个值的计算,但是自己看执行计划的时候一直都没有太在意这个值,更不用说深讨这个值的计算了:\u003c/p\u003e\n\u003cp\u003eken_len表示索引使用的字节数,根据这个值,就可以判断索引使用情况,特别是在组合索引的时候,判断所有的索引字段都被查询用到。\u003c/p\u003e\n\u003cp\u003e在查看官方文档的时候,也没有发现详细的key_len的计算介绍,后来做了一些测试,在咨询了丁奇关于变长数据类型的值计算的时候,突然想到innodb 行的格式,在这里的计算中有点类似,总结一下需要考虑到以下一些情况:(1).索引字段的附加信息:可以分为\u003cstrong\u003e变长\u003c/strong\u003e和\u003cstrong\u003e定长\u003c/strong\u003e数据类型讨论\n当索引字段为定长数据类型,比如char,int,datetime,需要有是否为空的标记,这个标记需要占用\u003cstrong\u003e1\u003c/strong\u003e个字节;\n对于变长数据类型,比如:varchar,除了是否为空的标记外,还需要有长度信息,需要占用\u003cstrong\u003e2\u003c/strong\u003e个字节;\u003c/p\u003e\n\u003cp\u003e(备注:当字段定义为非空的时候,是否为空的标记将不占用字节)\u003c/p\u003e\n\u003cp\u003e(2).同时还需要考虑表所使用的字符集,不同的字符集,gbk编码的为一个字符2个字节,utf8编码的一个字符3个字节;\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e先 …\u003c/strong\u003e\u003c/p\u003e"
September 29, 2012
MySQL数据库性能优化之表结构优化
"\u003cp\u003e由于MySQL数据库是基于行(Row)存储的数据库,而数据库操作 IO 的时候是以 page(block)的方式,也就是说,如果我们每条记录所占用的空间量减小,就会使每个page中可存放的数据行数增大,那么每次 IO 可访问的行数也就增多了。反过来说,处理相同行数的数据,需要访问的 page 就会减少,也就是 IO 操作次数降低,直接提升性能。此外,由于我们的内存是有限的,增加每个page中存放的数据行数,就等于增加每个内存块的缓存数据量,同时还会提升内存换中数据命中的几率,也就是缓存命中率。\u003c/p\u003e\n\u003cp\u003e** 数据类型选择**\u003c/p\u003e\n\u003cp\u003e数据库操作中最为耗时的操作就是 IO 处理,大部分数据库操作 90% 以上的时间都花在了 IO 读写上面。所以尽可能减少 IO 读写量,可以在很大程度上提高数据库操作的性能。\u003c/p\u003e\n\u003cp\u003e我们无法改变数据库中需要存储的数据,但是我们可以在这些数据的存储方式方面花一些心思。下面的这些关于字段类型的优化建议主要适用于记录条数较多,数据量较大的场景,因为精细化的数据类型设置可能带来维护成本的提高,过度优化也可能会带来其他的问题:\u003c/p\u003e\n\u003cp\u003e1、数字类型:非万不得已不要使用DOUBLE,不仅仅只是存 …\u003c/p\u003e"
September 17, 2012
MySQL索引背后的数据结构及算法原理
"\u003cp\u003e\u003cstrong\u003e摘要\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论。\u003c/p\u003e\n\u003cp\u003e文章主要内容分为三个部分。\u003c/p\u003e\n\u003cp\u003e第一部分主要从数据结构及算法理论层面讨论MySQL数据库索引的数理基础。\u003c/p\u003e\n\u003cp\u003e第二部分结合MySQL数据库中MyISAM和InnoDB数据存储引擎中索引的架构实现讨论\u003cstrong\u003e聚集索引\u003c/strong\u003e、\u003cstrong\u003e非聚集索引\u003c/strong\u003e及\u003cstrong\u003e覆盖索引\u003c/strong\u003e等话题。\u003c/p\u003e\n\u003cp\u003e第三部分根据上面的理论基础,讨论MySQL中高性能使用索引的策略。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e数据结构及算法基础\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e索引的本质\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eMySQL官方对索引的定义为:**索引(Index)是帮助MySQL高效获取数据的数据结构。**提取句子主干,就可以得到索引的本质:索引是数据结构。\u003c/p\u003e\n\u003cp\u003e我们知道,数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。 …\u003c/p\u003e"
July 30, 2012
MySQL开发规范[转]
"\u003ch1 id=\"mysql开发规范\"\u003eMySQL开发规范\u003c/h1\u003e\n\u003cp\u003e说明,此规范为内部制定的一个给开发人员如何使用MySQL的规范,由Team共同讨论制定,还在不断的完善中,有一些建议或者规定不一定十分合理,后续可能会修改。另外,MySQL版本不断进化,也会导致有一些条款失效,请大家根据自身的情况谨慎参考。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、\u003c/strong\u003e \u003cstrong\u003e表设计\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e库名、表名、字段名必须使用小写字母,“_”分割。 \u003ca href=\"#MySQL-1-1\"\u003e【FAQ】\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e库名、表名、字段名必须不超过12个字符。 \u003ca href=\"#MySQL-1-2\"\u003e【FAQ】\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e库名、表名、字段名见名知意,建议使用名词而不是动词。 \u003ca href=\"#MySQL-1-3\"\u003e【FAQ】\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e建议使用InnoDB存储引擎。 \u003ca href=\"#MySQL-1-4\"\u003e【FAQ】\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e存储精确浮点数必须使用DECIMAL替代FLOAT和DOUBLE。 \u003ca href=\"#MySQL-1-5\"\u003e【FAQ】\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e建议使用UNSIGNED存储非负数值。 \u003ca href=\"#MySQL-1-6\"\u003e【FAQ】\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e建议使用INT UNSIGNED存储IPV4。 \u003ca href=\"#MySQL-1-7\"\u003e【FAQ】\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e整形定义中不添加长度,比如使用INT,而不是INT(4)。 \u003ca href=\"#MySQL-1-8\"\u003e【FAQ】\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e使用短数据类型,比如取值范围为0-80时,使用TINYINT UNSIGNED。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e不建议使用ENUM类型,使用TINYINT来代替。 \u003ca href=\"#MySQL-1-10\"\u003e【FAQ】\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e尽可能不使用TEXT、BLOB类型。 …\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e"
July 22, 2012
使用pt-stalk诊断MySQL问题
"\u003cp\u003e在MySQL服务器出现短暂(5~30秒)的性能波动的时候,一般的性能监控工具都很难抓住故障现场,也就很难收集对应较细粒度的诊断信息。另外,如果这种波动出现的频率很低,例如几天才一次,我们也很难人为的抓住现场,收集数据。这正是pt-stalk所解决的问题。\u003c/p\u003e\n\u003cp\u003ept-stalk是 \u003ca href=\"http://www.percona.com/software/percona-toolkit/\"\u003ePercona-Toolkit\u003c/a\u003e 的一部分(其前身是\u003ca href=\"http://code.google.com/p/aspersa/\"\u003eAspersa\u003c/a\u003e的一部分)。安装Percona-Toolkit后,可以通过man pt-stalk了解如何使用该工具,本文的介绍是man pt-stalk的一个子集,强烈建议直接阅读man pt-stalk。额外的,本文将提供pt-stalk示例命令可供参考。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1. 使用pt-stalk\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ept-stalk –collect-tcpdump –function status \\\u003c/p\u003e\n\u003cp\u003e–variable Threads_connected –threshold 2500 \\\u003c/p\u003e\n\u003cp\u003e–daemonize — –user=root –password=YOURPASSWORD\u003c/p\u003e\n\u003cp\u003e上面的命令表示,让pt-stalk后台运行(–daemonize),并监视SHOW GLOBAL STATUS …\u003c/p\u003e"
May 25, 2012
MySQL数据库的IO操作
"\u003cp\u003e\u003cstrong\u003e导读:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e 淘宝丁奇分享的PPT:MySQL数据库的IO操作,详细分享了四块的内容,并且告诉大家如何调整MySQL数据库IO操作相关的参数,给出了详细的选择策略,现替其整理成文章分享与此。\u003c/p\u003e\n\u003cp\u003ePPT内容提纲:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.MySQL的文件及简介\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2.数据访问流程\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3.文件访问模式\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e4.影响io行为的一些参数和选择策略\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.MySQL的文件及简介\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.mysqlops.com/wp-content/uploads/2012/05/mysqlops-io-1.png\"\u003e\u003cimg src=\"http://www.mysqlops.com/wp-content/uploads/2012/05/mysqlops-io-1.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2.数据访问流程\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e一个简单的查询 select * from t where id\u0026gt;=( select id from t where k1=100 limit 100000,1) limit 2;\u003c/p\u003e\n\u003cp\u003e表结构:\u003c/p\u003e\n\u003cp\u003eCREATE TABLE \u003ccode\u003et\u003c/code\u003e (\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eid\u003c/code\u003e int(11) NOT NULL,\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ek1\u003c/code\u003e int(11) DEFAULT NULL,\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003edata\u003c/code\u003e char(100) DEFAULT NULL,\u003c/p\u003e\n\u003cp\u003ePRIMARY KEY (\u003ccode\u003eid\u003c/code\u003e),\u003c/p\u003e\n\u003cp\u003eKEY \u003ccode\u003ek1\u003c/code\u003e (\u003ccode\u003ek1\u003c/code\u003e)\u003c/p\u003e\n\u003cp\u003e) ENGINE=InnoDB DEFAULT CHARSET=gbk;\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3.数据访问流程\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.mysqlops.com/wp-content/uploads/2012/05/mysqlops-io-2.png\"\u003e\u003cimg src=\"http://www.mysqlops.com/wp-content/uploads/2012/05/mysqlops-io-2.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e4.数据访问流程\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e一个简单的更新 insert into t values(1, …\u003c/p\u003e"
May 8, 2012
优化MySQL语句的十个建议
"\u003cp\u003e(译者注:作者借这个题目反讽另一篇同名的文章)\u003c/p\u003e\n\u003cp\u003eJaslabs的Justin Silverton列出了\u003ca href=\"http://www.whenpenguinsattack.com/2007/04/09/10-tips-for-optimizing-mysql-queries/?2b4ffb70\"\u003e十条有关优化MySQL查询的语句\u003c/a\u003e,我不得不对此发表言论,因为这个清单非常非常糟糕。另外一个\u003ca href=\"http://immike.net/blog/2007/04/09/how-not-to-optimize-a-mysql-query/\"\u003eMike\u003c/a\u003e也同样意识到了。所以在这个博客中,我要做两件事情,第一,指出为什么这个清单很糟糕,第二,列出我的清单,希望我的比较好些。继续看吧,无畏的读者们!\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e为什么那个清单很糟糕\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.他的力气没使对地方\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e我们要遵循的一个准则就是如果你要优化代码时,应该先找出瓶颈在哪。然而Silverton先生的力气没有用对地方。我认为60%的优化是基于清楚理解SQL和数据库基础的。你需要知道join和子查询的区别,列索引,以及如何将数据规范化等等。另外的35%的优化是需要清楚数据库选择时的性能表现,例如COUNT(*)可能很快也可能很慢,要看你选用什么数据库引擎。还有一些其他要考虑的因素,例如数据库在什么时候不用缓存,什么时候存在硬盘上而不存在内存中,什么时候数据库创建临时表等等。剩下的5%就很少会有人碰到了,但Silverton先生恰好在这上面花了大量的时间。我从来就没用过SQL_SAMLL_RESULT。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2.很 …\u003c/strong\u003e\u003c/p\u003e"
May 8, 2012
Mysql中出现的"MySQL Got error 139 from storage engine"的原因
"\u003cp\u003e今天再从excel里导入数据到Mysql中的时候,发现一个表里的数据总是导入失败.后来经过查找是用的INNODB表引擎的问题.而换成MYISAM表引擎的话,则不存在此问题.并试图先导入成Myisam表,然后手动修改表引擎为INNODB.结果提示"MySQL Got error 139 from storage engine"错误.经google一番发现.是由于INNODB单条记录有8K的限制,而导入的excel表里字段不到20个.内容特别的多的.\u003c/p\u003e\n\u003cp\u003e官方解释如下:\u003c/p\u003e\n\u003cp\u003eSolution:\u003c/p\u003e\n\u003cp\u003e1.divide your table into small ones. If one table contain more than 10 text colums, and the data contain is a little bit long. this error will be thrown out.\u003c/p\u003e\n\u003cp\u003e2.modify InnoDB to MyISAM.Problem description:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eDescription:\nSince upgrading MySQL from version …\u003c/code\u003e\u003c/pre\u003e"
November 24, 2011
由浅入深理解索引的实现
"\u003cp\u003e\u003cstrong\u003e00 – 背景知识\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e– B-Tree \u0026amp; B+Tree\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://en.wikipedia.org/wiki/B%2B_tree\" title=\"B+Tree\"\u003ehttp://en.wikipedia.org/wiki/B%2B_tree\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://en.wikipedia.org/wiki/B-tree\" title=\"B-Tree\"\u003ehttp://en.wikipedia.org/wiki/B-tree\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e– 折半查找(Binary Search)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://en.wikipedia.org/wiki/Binary_search_algorithm\" title=\"Binary Search\"\u003ehttp://en.wikipedia.org/wiki/Binary_search_algorithm\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e– 数据库的性能问题\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eA. 磁盘IO性能非常低,严重的影响数据库系统的性能。\u003c/p\u003e\n\u003cp\u003eB. 磁盘顺序读写比随机读写的性能高很多。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e– 数据的基本存储结构\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eA. 磁盘空间被划分为许多大小相同的块(Block)或者页(Page).\u003c/p\u003e\n\u003cp\u003eB. 一个表的这些数据块以链表的方式串联在一起。\u003c/p\u003e\n\u003cp\u003eC. 数据是以行(Row)为单位一行一行的存放在磁盘上的块中,如图所示.\u003c/p\u003e\n\u003cp\u003eD. 在访问数据时,一次从磁盘中读出或者写入至少一个完整的Block。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.mysqlops.com/wp-content/uploads/2011/11/fig12.jpg\"\u003e\u003cimg src=\"http://www.mysqlops.com/wp-content/uploads/2011/11/fig12.jpg\" alt=\"\"\u003e\u003c/a\u003e\n Fig. 1\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e01 – 数据基本操作的实现\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e基本操作包括:INSERT、UPDATE、DELETE、SELECT。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e– SELECT\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eA. 定位数据\u003c/p\u003e\n\u003cp\u003eB. 读出数据所在的块,对数据 …\u003c/p\u003e"
November 22, 2011
浅谈伪分布式数据库架构
"\u003cp\u003e\u003cstrong\u003e浅谈伪分布式数据库架构\u003c/strong\u003e\u003c/p\u003e\n\u003chr\u003e"
November 21, 2011
图解”How MySQL Replication Works”
"\u003cp\u003e示意图:\n\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/11/mysql-replication-master-slave.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/11/mysql-replication-master-slave.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e在使用MySQL的应用中,如果你的MySQL Server压力逐渐增大,在应用层优化已经到了一定瓶颈时,那么你应该首先考虑 \u003ca href=\"http://dev.mysql.com/doc/refman/5.0/en/replication.html\"\u003eMySQL_Replication\u003c/a\u003e。本文将利用图示的方式简单的描述出MySQL Replication是如何工作的。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e如何同步\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e主库将所有的更新操作,写入二进制日志。\u003c/li\u003e\n\u003cli\u003e从库运行”IO线程”(Slave IO Thread)读取主库的二进制日志。\u003c/li\u003e\n\u003cli\u003e从库运行”SQL线程”(Slave SQL Thread)执行IO线程(Slave IO Thread)读取的日志中的SQL,从而保持和主库的一致。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003e如何分配请求\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e目前,这部分需要在应用层实现。\u003c/li\u003e\n\u003cli\u003e执行更新SQL(UPDATE,INSERT,DELETE)时,请求主库。\u003c/li\u003e\n\u003cli\u003e执行查询SQL(SELECT)时,请求从库。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e所以,当你的应用(Application)SELECT请求所占的比率越大,那么Relication就会越有效。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e相关教程:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eMySQL传输二进制日志原理:\u003c/p\u003e"
November 21, 2011
MySQL传输二进制日志原理
"\u003cp\u003e摘自:\u003c/p\u003e\n\u003cp\u003eMySQL Replication可以很方便的用来做应用的读扩展,也可以帮MySQL实现一定程度的HA方案。MySQL通过\u003ca href=\"http://www.orczhou.com/index.php/2009/04/how-mysql-replication-works/\"\u003e向备库传送二进制日志来实现Replication\u003c/a\u003e,本文将通过二进制日志相关源代码的主要接口来解释:“\u003cstrong\u003eMySQL如何传输二进制日志,是主库推,还是备库拉?MySQL日志传输的实时性如何?\u003c/strong\u003e”。\u003c/p\u003e\n\u003cp\u003e在MySQL Replication结构中,备库端初次通过\u003ca href=\"http://dev.mysql.com/doc/refman/5.1/en/change-master-to.html\"\u003eCHANGE MASTER TO\u003c/a\u003e完成Replication配置,再使用start slave命令开始复制。更细致的,备库通过IO Thread向主库发起读取binlog的请求(COM_BINLOG_DUMP命令),主库收到COM_BINLOG_DUMP请求后,使用单独线程(dump thread)不断向备库IO Thread发送Binlog。示意图:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/11/how_mysql_send_binary_log.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/how_mysql_send_binary_log.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e在主库端一旦有新的日志产生后,立刻会发送一次广播,dump线程在收到广播后,则会读取二进制日志并通过网络向备库传输日志,所以这是一个主库向备库不断推送的过程;\u003c/p\u003e\n\u003cp\u003e新日志在产生后,只需一次广播和网络就会立刻(\u0026lt;1ms)向发送到备库,如果主备之间网络较好的话(例 …\u003c/p\u003e"
October 26, 2011
MySQL 数据库性能优化之缓存参数优化[转载]
"\u003cp\u003e在平时被问及最多的问题就是关于 MySQL 数据库性能优化方面的问题,所以最近打算写一个MySQL数据库性能优化方面的系列文章,希望对初中级 MySQL DBA 以及其他对 MySQL 性能优化感兴趣的朋友们有所帮助。\u003c/p\u003e\n\u003cp\u003e这是本系列的第一篇文章:MySQL 数据库性能优化之缓存参数优化\u003c/p\u003e\n\u003cp\u003e数据库属于 IO 密集型的应用程序,其主要职责就是数据的管理及存储工作。而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在毫秒级别,二者相差3个数量级。所以,要优化数据库,首先第一步需要优化的就是 IO,尽可能将磁盘IO转化为内存IO。\u003cstrong\u003e\u003cem\u003e本文先从 MySQL 数据库IO相关参数(缓存参数)的角度来看看可以通过哪些参数进行IO优化\u003c/em\u003e\u003c/strong\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003equery_cache_size/query_cache_type (global)\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eQuery cache 作用于整个 MySQL Instance,主要用来缓存 MySQL 中的 ResultSet,也就是一条SQL语句执行的结果集,所以仅仅只能针对select语句。当我们打开了 Query Cache 功能,MySQL在接受到一 …\u003c/p\u003e"
October 13, 2011
mysql主从复制中出现"Relay log read failure…”错误信息的解决办法[教程]
"\u003cp\u003e今天我的服务器突然停止复制了。因为对这块不是很熟悉,就上网学习了一下,发现了一篇好文章。不敢独享,\u003c/p\u003e\n\u003cp\u003e和大家来分享一下。\u003c/p\u003e\n\u003cp\u003e众所周知MySQL5.1的Replication是比较烂的。MySQL的每一个版本更新关于同步方面每次都是可以看到一大堆。但MySQL 5.1性能是比较突出的。所以经不住诱惑使用MySQL 5.1。所以也要经常遇到一些Bug。如:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emysql\u0026gt; show slave status\\G\n\n*************************** 1. row ***************************\n Slave_IO_State: Waiting for master to send event\n Master_Host: 192.168.10.118\n Master_User: repl_wu\n Master_Port: 3306\n Connect_Retry: 30 …\u003c/code\u003e\u003c/pre\u003e"
September 29, 2011
MySQL技术内幕:InnoDB存储-3.6 InnoDB存储引擎文件
"\u003cp\u003e官方教程: \u003ca href=\"http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html#innodb\"\u003ehttp://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html#innodb\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e3.6 InnoDB存储引擎文件\u003c/p\u003e\n\u003cp\u003e之前介绍的文件都是MySQL数据库本身的文件,和存储引擎无关。除了这些文件外,每个表存储引擎还有其自己独有的文件。这一节将具体介绍和InnoDB存储引擎密切相关的文件,这些文件包括重做日志文件、表空间文件。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3.6.1 表空间文件\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eInnoDB存储引擎在存储设计上模仿了Oracle,将存储的数据按表空间进行存放。默认配置下,会有一个初始化大小为10MB、名为ibdata1的文件。该文件就是默认的表空间文件(tablespace file)。你可以通过参数innodb_data_file_path对其进行设置。格式如下:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003einnodb_data_file_path=datafile_spec1[;datafile_spec2]…\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e你也可以用多个文件组成一个表空间,同时制定文件的属性,如:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[mysqld]\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003einnodb_data_file_path = …\u003c/p\u003e"
September 26, 2011
show slave status\G中的Read_Master_Log_Pos和Relay_Log_Pos的(大小)关系
"\u003cp\u003eJust to clarify, there are three sets of file/position coordinates in SHOW SLAVE STATUS:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eThe position, ON THE MASTER, from which the I/O thread is reading: Master_Log_File/Read_Master_Log_Pos. —–相对于主库,从库读取主库的二进制日志的位置,是IO线程\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe position, IN THE RELAY LOGS, at which the SQL thread is executing: Relay_Log_File/Relay_Log_Pos —-相对于从库,是从库的sql线程执行到的位置\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe position, ON THE MASTER, at which the SQL thread is executing: Relay_Master_Log_File/Exec_Master_Log_Pos —-相对于主库,是从库的sql线程执行到的位置\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eNumbers 2) …\u003c/p\u003e"
September 26, 2011
如何在windows下用bat脚本定时备份mysql
"\u003cp\u003e作/译者:叶金荣(Email: \u003cimg src=\"http://imysql.cn/files/pictures/email.gif\" alt=\"\"\u003e),来源:\u003ca href=\"http://imysql.cn/\"\u003ehttp://imysql.cn\u003c/a\u003e,转载请注明作/译者和出处,并且不能用于商业用途,违者必究。\u003c/p\u003e\n\u003cp\u003e并不是所有MySQL都运行在Linux下,windows下也需要做例行备份,下面是用bat脚本做自动化备份的例子,大家可以参考下。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003erem\nrem C:\\Program Files\\WinRAR 需要放到 path 下,才能调用rar cli工具\nrem\nrem 跳转到工作目录下\nf:\ncd f:\\DBBAK\nrem 设置变量:备份文件名\nSET BAK_FILE=MY_DBBAK_%date:~0,-4%.sql\nrem 设置变量:日志文件名\nSET LOG_FILE=MY_DBBAK.log\nrem 记录日志\necho \u0026#34;%date%\u0026#34; \u0026gt;\u0026gt; %LOG_FILE%\nrem 开始做备份\nmysqldump --default-character-set=utf8 -hlocalhost -uroot -R --triggers --single-transaction -B mydb \u0026gt; %BAK_FILE%\nrem …\u003c/code\u003e\u003c/pre\u003e"
September 26, 2011
mysql主从复制原理
"\u003cp\u003e\u003cstrong\u003eReplication 线程\u003c/strong\u003e\nMysql的 Replication 是一个异步的复制过程,从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysql instance(我们称之 Slave)。在 Master 与 Slave 之间的实现整个复制过程主要由三个线程来完成,其中两个线程(Sql线程和IO线程)在 Slave 端,另外一个线程(IO线程)在 Master 端。\u003c/p\u003e\n\u003cp\u003e要实现 MySQL 的 Replication ,首先必须打开 Master 端的Binary Log(mysql-bin.xxxxxx)功能,否则无法实现。因为整个复制过程实际上就是Slave从Master端获取该日志然后再在自己身上完全 顺序的执行日志中所记录的各种操作。打开 MySQL 的 Binary Log 可以通过在启动 MySQL Server 的过程中使用 “—log-bin” 参数选项,或者在 my.cnf 配置文件中的 mysqld 参数组([mysqld]标识后的参数部分)增加 “log-bin” 参数项。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eMySQL 复制的基本过程如下:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eSlave 上面的IO线 …\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e"
September 6, 2011
杀死mysql指定的进程
"\u003cp\u003e在执行查询的时候,有时候用show processlist命令查看有过多的进程,造成mysql假死的状态,这个时候可以将一些僵死的进程杀掉.恢复正常状态\n找到语句的 thread id\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emysqladmin -uroot -proot kill xxxxx\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e如果是系统里的mysql进程的话,可以参考:\u003c/p\u003e"
September 4, 2011
常用MYSQL安全设置加固
"\u003cp\u003e1.修改root用户口令,删除空口令\n2.删除默认数据库和数据库用户\n3.改变默认mysql管理员帐号\n4.关于密码的管理\n5.使用独立用户运行msyql\n6.禁止远程连接数据库\n7.限制连接用户的数量\n8.用户目录权限限制\n9.命令历史记录保护\n10.禁止MySQL对本地文件存取\n11.MySQL服务器权限控制\n12.使用chroot方式来控制MySQL的运行目录\n13.关闭对无关的Web程序访问的支持\n14.数据库备份策略\n15. Mysqld安全相关启动选项\n16.information_schema 安全\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.修改root用户口令,删除空口令\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e缺省安装的MySQL的root用户是空密码的,为了安全起见,必须修改为强密码,所谓的强密码,至少8位,由字母、数字和符号组成的不规律密码。使用MySQL自带的命令mysaladmin修改root密码,同时也可以登陆数据库,修改数据库mysql下的user表的字段内容,修改方法如下所示:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# /usr/local/mysql/bin/mysqladmin -u root password “upassword” //使 …\u003c/p\u003e\u003c/blockquote\u003e"
September 2, 2011
Facebook是怎么做MySQL备份的?
"\u003cp\u003eFacebook的用户每天创造大量的数据,为了确保数据可靠的存储,我们每天进行数据备份.我们通过将原来的逻辑备份改成定制化的物理备份,显著地提升了备份的速度(不增加体积的情况下).\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e从mysqldump到Xtrabackup\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e我们使用mysqldump来进行每日的数据库备份,mysqldump对数据进行逻辑备份,就像应用访问数据库那样,mysqldump以SQL语句的方式从数据库中读取一张张表,将表结构和数据转保存到文本文件.mysqldump最大的问题是速度太慢(对于我们的一些大的数据库,通常要花24小时,甚至更久),并且以SQL语句的方式读取数据可能造成磁盘的随机读,这就会造成主机的load增大,影响性能.对于时间太长,我们可以跑多个实例来并发的做备份,这能缩短备份的时间,但是会造成更多的load,更影响主机的性能.\u003c/p\u003e\n\u003cp\u003e另外一个可行的备份方式是进行物理备份(我们称之为二进制备份,binary backup),通过操作系统层面,读取数据库磁盘文件,而非通过SQL语句.这样的话在备份的过程中,数据不能像SQL读取的时候保持事务上一致的.只有当备份的数据文件在数据库里复原了,他们才又一致 …\u003c/p\u003e"
August 3, 2011
新浪微博、腾讯微博:mysql数据库主表设计猜想
"\u003cp\u003e用户信息表(t_user_info)\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e字段名称\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e字节数\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e类型\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e描述\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eUser_id\u003c/p\u003e\n\u003cp\u003e4\u003c/p\u003e\n\u003cp\u003euint32\u003c/p\u003e\n\u003cp\u003e用户编号(主键)\u003c/p\u003e\n\u003cp\u003eUser_name\u003c/p\u003e\n\u003cp\u003e20\u003c/p\u003e\n\u003cp\u003eChar[20]\u003c/p\u003e\n\u003cp\u003e名称\u003c/p\u003e\n\u003cp\u003eMsg_count\u003c/p\u003e\n\u003cp\u003e4\u003c/p\u003e\n\u003cp\u003euint32\u003c/p\u003e\n\u003cp\u003e发布消息数量,可以作为t_msg_info水平切分新表的auto_increment\u003c/p\u003e\n\u003cp\u003eFans_count\u003c/p\u003e\n\u003cp\u003e4\u003c/p\u003e\n\u003cp\u003euint32\u003c/p\u003e\n\u003cp\u003e粉丝数量\u003c/p\u003e\n\u003cp\u003eFollow_count\u003c/p\u003e\n\u003cp\u003e4\u003c/p\u003e\n\u003cp\u003eUint32\u003c/p\u003e\n\u003cp\u003e关注对象数量\u003c/p\u003e\n\u003cp\u003e备注:以User_id取模分表\u003c/p\u003e\n\u003cp\u003e用户之间关系表(t_user_relation),必须有关注与被关注的关系\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e字段名称\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e字节数\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e类型\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e描述\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eUser_id\u003c/p\u003e\n\u003cp\u003e4\u003c/p\u003e\n\u003cp\u003euint32\u003c/p\u003e\n\u003cp\u003e用户编号(联合主键)\u003c/p\u003e\n\u003cp\u003eFollow_id\u003c/p\u003e\n\u003cp\u003e4\u003c/p\u003e\n\u003cp\u003euint32\u003c/p\u003e\n\u003cp\u003e被关注者编号(联合主键)\u003c/p\u003e\n\u003cp\u003eType\u003c/p\u003e\n\u003cp\u003e1\u003c/p\u003e\n\u003cp\u003eUint8\u003c/p\u003e\n\u003cp\u003e关系类型(0,粉丝;1,关注)\u003c/p\u003e\n\u003cp\u003e备注:关系是单向的,以User_id取模分表\u003c/p\u003e\n\u003cp\u003e用户消息索引表(t_uer_msg_index)\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e字段名称\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e字节数\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e类型\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e描述\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eUser_id\u003c/p\u003e\n\u003cp\u003e4\u003c/p\u003e\n\u003cp\u003euint32\u003c/p\u003e\n\u003cp\u003e用户编号(联合主键)\u003c/p\u003e\n\u003cp\u003eAuthor_id\u003c/p\u003e\n\u003cp\u003e4\u003c/p\u003e\n\u003cp\u003euint32\u003c/p\u003e\n\u003cp\u003e消息发布者编号(可能是被关注者,也可能是自己)(联合主键) …\u003c/p\u003e"
July 14, 2011
很有用的mysqladmin命令
"\u003cblockquote\u003e\n\u003cp\u003e[root@localhost ~]$ uname -r\n2.6.9-22.ELsmp\u003c/p\u003e\n\u003cp\u003e[root@localhost ~]$ /usr/local/mysql/bin/mysqladmin version -uroot -p\nEnter password:\n/usr/local/mysql/bin/mysqladmin Ver 8.42 Distrib 5.1.22-rc, for redhat-linux-gnu on x86_64\nCopyright (C) 2000-2006 MySQL AB\nThis software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license\u003c/p\u003e\n\u003cp\u003eServer version 5.1.22-rc-log\nProtocol version 10\nConnection Localhost …\u003c/p\u003e\u003c/blockquote\u003e"
July 5, 2011
关于Mysql的Qcache优化
"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e生产环境下建议关闭此功能,因绝大部分场景下此选项会产生效率低下问题。\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003equery_cache_size = 64M\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e指定MySQL查询缓冲区的大小。可以通过在MySQL控制台执行以下命令观察:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# \u0026gt; SHOW VARIABLES LIKE ‘%query_cache%’;\n# \u0026gt; SHOW STATUS LIKE ‘Qcache%’;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e# 如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况;\n如果Qcache_hits的值非常大,则表明查询缓冲使用非常频繁,如果该值较小反而会影响效率,那么可以考虑不用查询缓冲;\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eQcache_free_blocks\u003c/strong\u003e,如果该值非常大,则表明缓冲区中碎片很多。\u003c/p\u003e\n\u003cp\u003e“Qcache_free_blocks”:Query Cache 中目前还有多少剩余的blocks。如果该值显示较大,则说明Query Cache 中的内存碎片较多了,可能需要寻找合适的机会进行整理。\n● “Qcache_free_memory”:Query Cache 中目前剩余的内存大小。通过这个参数我们可以较为准确的观察出当前系统中的Query …\u003c/p\u003e"
June 27, 2011
mysql memcached UDF安装使用[教程]
"\u003cp\u003e在Centos5.6下通过验证!\u003c/p\u003e\n\u003cp\u003e官方网站:\u003c/p\u003e\n\u003cp\u003e很早之前,就看到了通过mysql UDF 更新memcached ,原来也研究过一段时间,只是没有来得及写个文档,导致后来工作中,经常要google,搜索其安装,使用的方法,刹时麻烦,今天总结一下:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1:mysql memcached UD介绍\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003emysql memcached UDF 其实就是通过libmemcached来使用memcache的一系列函数,通过这些函数,你能 对memcache进行get, set, cas, append, prepend, delete, increment, decrement objects操作,如果我们通过mysql trigger来使用这些函数,那么就能通过mysql更好的,更自动的管理memcache!下载地址:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2:安装方法:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1)安装memcache和memcached\u003c/p\u003e\n\u003cp\u003e参考:\u003c/p\u003e\n\u003cp\u003e2)安装libmemcached()\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e$ wget \u003ca href=\"http://download.tangent.org/libmemcached-0.31.tar.gz\"\u003ehttp://download.tangent.org/libmemcached-0.31.tar.gz\u003c/a\u003e\n$ tar -xzvf …\u003c/p\u003e\u003c/blockquote\u003e"
May 23, 2011
mysql删除大表更快的drop table办法
"\u003cp\u003e曾经发文介绍过,DROP table XXX ,特别是碰到大表时,\u003c/p\u003e\n\u003cp\u003e在DROP TABLE 过程中,所有操作都会被HANG住。\n这是因为INNODB会维护一个全局独占锁(在table cache上面),直到DROP TABLE完成才释放。\n在我们常用的ext3,ext4,ntfs文件系统,要删除一个大文件(几十G,甚至几百G)还是需要点时间的。\n下面我们介绍一个快速DROP table 的方法; 不管多大的表,INNODB 都可以很快返回,表删除完成;\n实现:巧用LINK(硬链接)\u003c/p\u003e\n\u003cp\u003e实测:\u003c/p\u003e\n\u003cp\u003e: test 21:38:00\u0026gt; show table status like ‘tt’ \\G\n*\u003cstrong\u003e*\u003c/strong\u003e*\u003cstrong\u003e*\u003c/strong\u003e*\u003cstrong\u003e*\u003c/strong\u003e*\u003cstrong\u003e*\u003c/strong\u003e*\\\u003cem\u003e* 1. row ***\u003cstrong\u003e*\u003c/strong\u003e*\u003cstrong\u003e*\u003c/strong\u003e*\u003cstrong\u003e*\u003c/strong\u003e*\u003cstrong\u003e*\u003c/strong\u003e\u003c/em\u003e\nName: tt\nEngine: InnoDB\nVersion: 10\nRow_format: Compact\nRows: 151789128\nAvg_row_length: 72\nData_length: 11011096576\nMax_data_length: 0\nIndex_length: 5206179840\nData_free: …\u003c/p\u003e"
May 13, 2011
infobright与mysql常规引擎使用对比
"\u003cp\u003e测试背景介绍 :两台机器AB,A机器使用常规引擎innodb,B使用infobright,测试数据量10亿,平均分散到两台机器,基于各种因素,A的数据分成了24个表,即每小时一个。\u003c/p\u003e\n\u003cp\u003e1.infobright和myisampack的压缩性能对比:\u003c/p\u003e\n\u003cp\u003e数据加载完成后首先alter table XXX engine=myisam使用mysqlchk进行压缩,压缩后每天有45G左右的数据,infobright存储要7~8G,压缩性能差异近80%\u003c/p\u003e\n\u003cp\u003e2.infrobright和myisam查询效率对比:\u003c/p\u003e\n\u003cp\u003e两台机器上面执行相同的sql语句:select count(1),type from table_name group by type;\u003c/p\u003e\n\u003cp\u003eA(innodb)运行情况:\u003cimg src=\"http://60.29.242.49/wp-content/uploads/2010/03/image00103-29-10-45-541.jpg\" alt=\"image001(03-29-10-45-54)\"\u003e\u003c/p\u003e\n\u003cp\u003eB(infobright)运行情况:\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://60.29.242.49/wp-content/uploads/2010/03/image00203-29-10-45-54.jpg\" alt=\"image002(03-29-10-45-54)\"\u003e\u003c/p\u003e\n\u003cp\u003e由于innodb存储时需要改成myisam引擎并进行压缩,所以耗费了cpu不少资源,除此之外,mysql本身运行的资源消耗基本无区别。\u003c/p\u003e\n\u003cp\u003e在执行时间上,infobright耗时(3 min 31.37 sec) ,myisam耗时(1 min 45.38 sec),但由于A是散成了24个表,所以耗 …\u003c/p\u003e"
May 13, 2011
MySQL数据仓库解决方案 Infobright
"\u003cp\u003eInfobright是开源的\u003ca href=\"http://www.oschina.net/p/mysql\"\u003eMySQL\u003c/a\u003e数据仓库解决方案,引入了列存储方案,高强度的数据压缩,优化的统计计算(类似sum/avg/group by之类),下面是Infobright的架构图:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/05/03055857_9B9X.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/05/03055857_9B9X.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e安装方法请参考:\u003c/p\u003e\n\u003cp\u003e相关应用案例:\u003c/p\u003e\n\u003cp\u003e相关文章:\u003c/p\u003e"
March 3, 2011
删除MySQL二进制日志的3种方法
"\u003cp\u003e\u003cstrong\u003e1.RESET MASTER\u003c/strong\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e****可以删除列于索引文件中的所有二进制日志,把二进制日志索引文件重新设置为空,并创建一个新的二进制日志文件\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2.PURGE MASTER LOGS\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e语法\nPURGE {MASTER | BINARY} LOGS TO ‘\u003cem\u003elog_name\u003c/em\u003e‘\nPURGE {MASTER | BINARY} LOGS BEFORE ‘\u003cem\u003edate\u003c/em\u003e‘\n用于删除列于在指定的日志或日期之前的日志索引中的所有二进制日志。这些日志也会从记录在日志索引文件中的清单中被删除,这样被给定的日志成为第一个。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e(1).用reset master命令删除所有日志,新日志重新从000001开始编号\u003c/p\u003e\n\u003cp\u003e(2).用purge master logs to ‘mysq-bin.*\u003cstrong\u003e*\u003c/strong\u003e’ 命令可以删除指定编号前的所有日志\u003c/p\u003e\n\u003cp\u003e(3).用purge master logs to before ‘YYYY-MM-DD HH24:MI:SS’命令可以删除’YYYY-MM-DD HH24:MI:SS’之前的产生的所有日志\u003c/p\u003e\n\u003cp\u003e(4).可以在my.cnf中指定–expire_logs_days=#,此参数设置了binlog日志 …\u003c/p\u003e\u003c/blockquote\u003e"
February 14, 2011
SQL 的 MASTER到MASTER的主主循环同步
"\u003cp\u003e注意在进行配置前,请确保相应的3306端口可以端口: \u003ca href=\"http://blog.haohtml.com/archives/7726\"\u003ehttp://blog.haohtml.com/archives/7726\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e刚刚抽空做了一下MYSQL 的主主同步。\n把步骤写下来,至于会出现的什么问题,以后随时更新。这里我同步的数据库是TEST\n\u003cstrong\u003e1、环境描述。\u003c/strong\u003e\n主机:192.168.0.231(A)\n主机:192.168.0.232(B)\nMYSQL 版本为5.1.21\n\u003cstrong\u003e2、授权用户。\u003c/strong\u003e\nA:\nmysql\u0026gt; grant replication slave,file on *.* to ‘repl1’@’192.168.0.232’ identified by ‘123456’;\nQuery OK, 0 rows affected (0.00 sec)\u003c/p\u003e\n\u003cp\u003emysql\u0026gt; flush privileges;\nQuery OK, 0 rows affected (0.00 sec)\nB:\nmysql\u0026gt; grant replication slave,file on *.* to ‘repl2’@’192.168.0.231’ identified by ‘123456’; …\u003c/p\u003e"
February 10, 2011
Mysql 下 Myisam表delete 后 数据恢复问题
"\u003cp\u003e今日在修改过去的一个程序时, 不小时设置了错误的删除条件,导致几十万条数据丢失, 同时数据库没有打开日志和备份, 请教大侠,有什么方法可以恢复数据.\u003c/p\u003e\n\u003cp\u003e我已经将对应的三个表文件. MYD,MYI,frm备份出来, 查看了一下文件大小, 好象数据并未丢失, 估计只是设置了删除状态. 使用uedit32打开MYD文件,还可以辨识出数据的确还在. 我想应该是做了标记,将这些数据设置为删除状态,数据并未真正删除掉, 不知道现在可有现成的工具可以通过该数据文件将数据恢复. 如果没有的话, 可能就只能研究一下myisam表的结构,自己尝试恢复了!\u003c/p\u003e\n\u003cp\u003e希望各位大侠救我!\u003c/p\u003e\n\u003cp\u003e简单说一下吧:\u003c/p\u003e\n\u003cp\u003emysql中的myisam表在正常情况下执行delete 指定删除的记录实际上只是在索引文件中做了删除标记,同时也将数据文件中对记录的头几个字节改写, 但这几个字节具体的与入内容不清楚.(见下方)\u003c/p\u003e\n\u003cp\u003e通过我研究数据文件, 发现了几种数据类型保存的格式.\u003c/p\u003e\n\u003cp\u003evarchar: 在该类型数据开始的位置有一个字节来指出后面多少个字节是该字段的内容, 但是有一个例外就是如果后面的内容与varchar字段指定的长度完全相等时,就没有开头 …\u003c/p\u003e"
January 6, 2011
MYSQL主从失败,报错 Got fatal error 1236 后恢复过程
"\u003cp\u003e环境:\nMysql: 5.1.37 dual master(节点为A,B)\nOS: centos5.3 x64\u003c/p\u003e\n\u003cp\u003e由于我今天突然将重新启动从服务,导致MYSQL一边的复制失败,如下:\u003c/p\u003e\n\u003cp\u003e从服务器节点A启动slave就报下面的错误:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e090910 22:47:18 [ERROR] Error reading packet from server: Client requested master to start replication from impossible position ( server_errno=1236)\n090910 22:47:18 [ERROR] Got fatal error 1236: ‘Client requested master to start replication from impossible position’ from master when reading data from binary log\n090910 22:47:18 [Note] Slave I/O thread exiting, read up to log …\u003c/p\u003e\u003c/blockquote\u003e"
December 13, 2010
show slave status 参数详解
"\u003cp\u003e有关mysql主从复制原理请参考: \u003ca href=\"http://blog.haohtml.com/archives/11507\"\u003ehttp://blog.haohtml.com/archives/11507\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSlave_IO_State:\u003c/strong\u003e 等待 master 发生事件\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eMaster_Host:\u003c/strong\u003e 当前的主服务器主机\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eMaster_User:\u003c/strong\u003e 被用于连接主服务器的当前用户\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eMaster_Port:\u003c/strong\u003e 当前的主服务器接口\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConnect_Retry:\u003c/strong\u003e master-connect-retry选项的当前值\u003c/p\u003e\n\u003cp\u003eMaster_Log_File:SLAVE中的I/O线程当前正在读取的主服务器二进制日志文件的名称\u003c/p\u003e\n\u003cp\u003eRead_Master_Log_Pos:在当前的主服务器二进制日志中,SLAVE中的I/O线程已经读取的位置\u003c/p\u003e\n\u003cp\u003eRelay_Log_File:SQL线程当前正在读取和执行的中继日志文件的名称\u003c/p\u003e\n\u003cp\u003eRelay_Log_Pos:在当前的中继日志中,SQL线程已读取和执行的位置\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eRelay_Master_Log_File:由SQL线程执行的包含多数近期事件的主服务器二进制日志文件的名称\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSlave_IO_Running:I/O …\u003c/strong\u003e\u003c/p\u003e"
December 1, 2010
BTree,B-Tree,B+Tree,B*Tree都是什么
"\u003ch1 id=\"b树\"\u003eB树\u003c/h1\u003e\n\u003cp\u003e即二叉搜索树:\u003c/p\u003e\n\u003cp\u003e1.所有非叶子结点至多拥有两个儿子(Left和Right);\u003c/p\u003e\n\u003cp\u003e2.所有结点存储一个关键字;\u003c/p\u003e\n\u003cp\u003e3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;\u003c/p\u003e\n\u003cp\u003e如:\u003cimg src=\"http://www.haohtml.com/uploads/allimg/101201/092542M15-0.jpg\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003eB树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键 字大,就进入右儿子;如果左儿子或右儿子的指针为空,则报告找不到相应的关键字;\u003c/p\u003e\n\u003cp\u003e如果B树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么B树的搜索性能逼近二分查找;但它比连续内存空间的二分查找的优点是,改变B树 结构(插入与删除结点)不需要移动大段的内存数据,甚至通常是常数开销;\u003c/p\u003e\n\u003cp\u003e如:\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://www.haohtml.com/uploads/allimg/101201/0925421M8-1.jpg\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e但B树在经过多次插入与删除后,有可能导致不同的结构\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://www.haohtml.com/uploads/allimg/101201/092542L35-2.jpg\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e右边也是一个B树,但它的搜索性能已经是线性的了;同样的关键字集合有可能导致不同的树结构索引;所以,使用B树还要考虑尽可能让B树保持左图的结 构,和避免右图的结构,也就是所谓的“平衡”问题;\u003c/p\u003e\n\u003cp\u003e实际使用的B树都是在原B树的基础上加上平衡算法,即“平衡二叉树”;如何保持B树结点分布均匀的平衡算法是平衡二叉树的关 …\u003c/p\u003e"
September 30, 2010
MySQL性能优化详解
"\u003cp\u003eMySQL数据库性能优化是本文的主要核心,将从数据库的优化设计,到具体的操作。好的优化能使服务器性能提升较大的空间,希望本文对大家有所帮助。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1. MySQL性能优化简介\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在Web应用程序体系架构中,数据持久层(通常是一个关系数据库)是关键的核心部分,它对系统的性能有非常重要的影响。MySQL是目前使用最多的开源数据库,但是MySQL数据库的默认设置性能非常的差,仅仅是一个玩具数据库。因此在产品中使用MySQL数据库必须进行必要的优化。\u003c/p\u003e\n\u003cp\u003e优化是一个复杂的任务,本文描述MySQL相关的数据库设计和查询优化,服务器端优化,存储引擎优化。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2. 数据库设计和查询优化\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在MySQL性能优化中,首先要考虑的就是Database Schema设计,这一点是非常重要的。一个糟糕的Schema设计即使在性能调优的MySQL Server上运行,也会表现出很差的性能;和Schema相似,查询语句的设计也会影响MySQL的性能,应该避免写出低效的SQL查询。这一节将详细讨论这两方面的优化。\u003c/p\u003e\n\u003cp\u003e2.1 Schema Design\u003c/p\u003e\n\u003cp\u003eSchema的优化取决于将要运行什么样的query,不同的query会有不同 …\u003c/p\u003e"
August 19, 2010
mysql各种HA方案
"\u003cp\u003emysql的单点一直是一个让人很烦恼的事情,特别是master的单点。\u003c/p\u003e\n\u003cp\u003e现在外面的解决方案主要如下: 双master方案,heartbert(HA)+rhcs(分布式文件系统),heartbert(HA)+DRBD.\u003c/p\u003e\n\u003cp\u003e双master存在的问题是master有2个IP,这样意为着前端需要指向2个的masterIP,同时bin-log也是双向同步的,会不会比单向同步的量更多呢?\u003c/p\u003e\n\u003cp\u003e第二种方案是挺不错的,但是必须要分布式文件系统,要是实在不行就可以用NFS来代替,但是这样存在的问题就是数据文件是单点,所以必须使用分布式文件系统。\u003c/p\u003e\n\u003cp\u003e第三种是关键是DRBD,这个是在网络层做RAID1,在A机器上收到数据后DRBD会写到本地硬盘上,同时通过网络传输到另外一台机器上。这样保证了2台机器的一致。特别是DRBD传输的时候有多种协议可以选择,但是一般看到网上大家都是使用协议C(C表示收到远程主机的写入确认后,视为写入完成)\nDRBD的架构如下:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/08/drbd.png\"\u003e\u003cimg src=\"http://blogx.haohtml.com/wp-content/uploads/2010/08/drbd.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e今天在high scalability有个文档专门比较各种mysql HA的方案。基本上大家可以根据这个比较来做自己合适的的MySQL HA了\n\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/08/different-ha.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/different-ha.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e"
August 11, 2010
可扩展性设计之数据切分
"\u003cp\u003e可能很多读者朋友在网上或者杂志上面都已经多次见到关于数据切分的相关文章了, 只不过在有些文章中称之为数据的 Sharding 。其实不管是称之为数据的 Sharding 还是数据的切分,其概念都是一样的。简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果。 数据的切分同时还可以提高系统的总体可用性,因为单台设备 Crash 之后,只有总体数据的某部分不可用,而不是所有的数据。\u003c/p\u003e\n\u003cp\u003e数据的切分( Sharding )根据其切分规则的类型,可以分为两种切分模式。\n\u003cstrong\u003e垂直(纵向)切分:\u003c/strong\u003e 一种是按照不同的表(或者 Schema )来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直(纵向)切分;\n\u003cstrong\u003e水平(横向)切分:\u003c/strong\u003e 另外一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分。\u003c/p\u003e\n\u003cp\u003e垂直切分的最大特点就是规则简单,实施也更为方便,尤其适合各业务之间的耦合度非常低,相互影响很小,业务逻辑非常清晰的系统。在这种系统中,可以很容易做到将不同业务模块所 …\u003c/p\u003e"
August 1, 2010
MySQL模式 : Strict Mode
"\u003cp\u003e\u003cstrong\u003eI. Strict Mode阐述\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e根据 mysql5.0以上版本 strict mode (STRICT_TRANS_TABLES) 的限制:\u003c/p\u003e\n\u003cp\u003e1).不支持对not null字段插入null值\u003c/p\u003e\n\u003cp\u003e2).不支持对自增长字段插入”值,可插入null值\u003c/p\u003e\n\u003cp\u003e3).不支持 text 字段有默认值\u003c/p\u003e\n\u003cp\u003e看下面代码:(第一个字段为自增字段)\u003c/p\u003e\n\u003cp\u003e$query=”insert into demo values(”,’$firstname’,’$lastname’,’$sex’)”;\u003c/p\u003e\n\u003cp\u003e上边代码只在非strict模式有效。\u003c/p\u003e\n\u003cp\u003e$query=”insert into demo values(NULL,’$firstname’,’$lastname’,’$sex’)”;\u003c/p\u003e\n\u003cp\u003e上边代码只在strict模式有效。把空值”换成了NULL.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eII.让数据库支持Strict Mode\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1.对数据库结构进行以下改进来支持strict mode:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e给所有not null字段都设置非null默认值,字符串默认值为 ”,数值默认值为 0,日期默认值为 ‘0000-00-00 00:00:00’\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e去掉text字段的默认值\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e规范化改进: …\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e"
July 23, 2010
MySQL内存使用-线程独享
"\u003cp\u003e对于任何一个数据库管理系统来说,内存的分配使用绝对可以算的上是其核心之一了,所以很多希望更为深入了解某数据库管理系统的人,都会希望一窥究竟,我也不例外。\u003c/p\u003e\n\u003cp\u003e从内存的使用方式MySQL 数据库的内存使用主要分为以下两类\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e线程独享内存\u003c/li\u003e\n\u003cli\u003e全局共享内存\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e今天这篇文章暂时先分析 MySQL 中主要的 “线程独享内存” 的。\u003c/p\u003e\n\u003cp\u003e在 MySQL 中,线程独享内存主要用于各客户端连接线程存储各种操作的独享数据,如线程栈信息,分组排序操作,数据读写缓冲,结果集暂存等等,而且大多数可以通过相关参数来控制内存的使用量。\u003c/p\u003e\n\u003cp\u003e**线程栈信息使用内存(thread_stack):**主要用来存放每一个线程自身的标识信息,如线程id,线程运行时基本信息等等,我们可以通过 thread_stack 参数来设置为每一个线程栈分配多大的内存。\u003c/p\u003e\n\u003cp\u003e**排序使用内存(sort_buffer_size):**MySQL 用此内存区域进行排序操作(filesort),完成客户端的排序请求。当我们设置的排序区缓存大小无法满足排序实际所需内存的时候,MySQL 会将数据写入磁盘文件来完成排序。由于磁盘和内存的读写性能完全不在一个数量级, …\u003c/p\u003e"
July 21, 2010
mysql从服务器出现的错误:Slave_SQL_Running: No(主-从)
"\u003cp\u003emysql服务器为主-从配置时,发现从MySQL Slave未和主机同步,查看Slave状态:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003emysql\u0026gt; show slave statusG\nSlave_IO_Running: Yes\nSlave_SQL_Running: No\nLast_Errno: 1062\n….\nSeconds_Behind_Master:NULL\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e原因:\u003c/strong\u003e\n1.程序可能在slave上进行了写操作\n2.也可能是slave机器重起后,事务回滚造成的.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e解决办法I:\u003c/strong\u003e\n1.首先停掉Slave服务:\u003cstrong\u003eslave stop\u003c/strong\u003e\n到主服务器上查看主机状态:\n记录File和Position对应的值。\n3.到slave服务器上执行手动同步:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003emysql\u0026gt; show master status;\n+——————+———–+————–+——————+\n| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |\n+——————+———–+————–+——————+\n| mysql-bin.000020 | 135617781 | | | …\u003c/p\u003e\u003c/blockquote\u003e"
July 20, 2010
mysqlbinlog:处理mysql binlog二进制日志文件的实用工具
"\u003cp\u003e服务器生成的二进制日志文件写成二进制格式。要想检查这些文本格式的文件,应使用mysqlbinlog实用工具。\n应这样调用mysqlbinlog:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eshell\u0026gt; mysqlbinlog [options] log-files…\n例如,要想显示二进制日志binlog.000003的内容,使用下面的命令:\u003c/p\u003e\n\u003cp\u003eshell\u0026gt; mysqlbinlog binlog.0000003\n输出包括在binlog.000003中包含的所有语句,以及其它信息例如每个语句花费的时间、客户发出的线程ID、发出线程时的时间戳等等。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e通常情况,可以使用mysqlbinlog直接读取二进制日志文件并将它们用于本地MySQL服务器。也可以使用–read-from-remote-server选项从远程服务器读取二进制日志。\u003c/p\u003e\n\u003cp\u003e当读取远程二进制日志时,可以通过连接参数选项来指示如何连接服务器,但它们经常被忽略掉,除非你还指定了–read-from-remote-server选项。这些选项是–host、–password、–port、–protocol、–socket和–user。\u003c/p\u003e\n\u003cp\u003e还可以使用mysqlbinlog来 …\u003c/p\u003e"
July 13, 2010
发现瓶颈 – Profiling(程序剖析) -MySQL Profiling
"\u003cp\u003e\u003cstrong\u003eMySQL程序剖析 (Profiling)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e我们将要详细的讲到MySQL的剖析(Profiling),因为它很少依赖于你的应用。应用和服务器 级别的剖析有的时候都是有必要的。虽然应用级别的剖析可以给你整个应用性能的总揽。,但是对MySQL的剖析提供了信息是服务器级别所提供不了的。比如, 对PHP代码进行剖析不会显示MySQL有多少行语句执行了。\u003c/p\u003e\n\u003cp\u003e与应用剖析一样,目标是找出MySQL哪部分消耗过多的时间。我们不会剖析MySQL源码的,虽然有的 时候定制化MySQL安装很有用,但是这是另一本书的主题了。所替代的是,我们将教你一些可以技术来获取和分析不同种类的MySQL执行语句的信息。\u003c/p\u003e\n\u003cp\u003e你可以用在任意的颗粒级别以满足你的需求:你可能对整个服务器进行剖析或者单独检查一个语句或者一组语 句。下列信息你可以一点点的收集:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eMySQL经常访问的那些数据\u003c/li\u003e\n\u003cli\u003eMySQL经常执行语句的类型\u003c/li\u003e\n\u003cli\u003eMySQL线程大部分时间的状态\u003c/li\u003e\n\u003cli\u003eMySQL经常执行语句的子系统\u003c/li\u003e\n\u003cli\u003eMySQL执行语句所访问的数据类型\u003c/li\u003e\n\u003cli\u003e不同活动的类型,比如扫描索引。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e我们先从范围最广的剖析开始,那就是服务器剖析,将教你更多细节。 …\u003c/p\u003e"
July 13, 2010
查看mysql索引使用情况
"\u003cp\u003e查看索引使用情况\u003c/p\u003e\n\u003cp\u003e如果索引正在工作, Handler_read_key 的值将很高,这个值代表了一个行被索引值读的次数,很低的值表明增加索引得到的性能改善不高,因为索引并不经常使用。\u003c/p\u003e\n\u003cp\u003eHandler_read_rnd_next 的值高则意味着查询运行低效,并且应该建立索引补救。这个值的含义是在数据文件中读下一行的请求数。如果你正进行大量的表扫描,该值较高。通常说明表索引不正确或写入的查询没有利用索引。\u003c/p\u003e\n\u003cp\u003e语法:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003emysql\u0026gt; show status like ‘Handler_read%’;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e有关更多MySQL之Handler_read_*介绍参考:\u003c/p\u003e"
July 13, 2010
mysql中使用source命令恢复sql备份文件时出现的问题
"\u003cp\u003e当使用mysql做数据库还原的时候,由于有些数据很大,总是失败并决 MySQL server has gone away之类的信息,并自动重新连接数据库且自动继续执行恢复操作,此时没有办法重新指定字符集,容易出现乱码,导致数据库恢复失败,只需要修改max_allowed_packet 参数的值即可.\u003c/p\u003e\n\u003cp\u003emysql根据配置文件会限制server接受的数据包大小。\u003c/p\u003e\n\u003cp\u003e有时候大的插入和更新会被max_allowed_packet 参数限制掉,导致失败。\u003c/p\u003e\n\u003ch2 id=\"1-方法1\"\u003e1) 方法1\u003c/h2\u003e\n\u003cp\u003e可以编辑my.cnf来修改(windows下my.ini),在[mysqld]段或者mysql的server配置段进行修改。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emax_allowed_packet = 20M\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e如果找不到my.cnf可以通过\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emysql --help | grep my.cnf\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e去寻找my.cnf文件。\u003c/p\u003e\n\u003ch2 id=\"2-方法2\"\u003e2) 方法2\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e(很妥协,很纠结的办法)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e进入mysql server\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emysql -h 主机 -u 账号 -p密码\nset global max_allowed_packet = 2*1024*1024*10\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e然后关闭掉这此mysql server链 …\u003c/p\u003e"
July 9, 2010
show profiles 详解
"\u003cp\u003e\u003ca href=\"https://dev.mysql.com/doc/refman/5.7/en/show-profile.html\"\u003ehttps://dev.mysql.com/doc/refman/5.7/en/show-profile.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e此功能将在新版本中被移除,性能分析使用新方法来代替。(官方提供了此命令的使用方法, 对于 show profile for query ID / show profile \u003cstrong\u003eCPU\u003c/strong\u003e for query ID 结果中每项的说明信息请参考: \u003ca href=\"https://www.cnblogs.com/itcomputer/articles/5056127.html\"\u003ehttps://www.cnblogs.com/itcomputer/articles/5056127.html\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eNote\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThese statements are deprecated and will be removed in a future MySQL release. Use the Performance Schema instead; see \u003ca href=\"https://dev.mysql.com/doc/refman/5.7/en/performance-schema.html\" title=\"Chapter 25 MySQL Performance Schema\"\u003eChapter 25, \u003cem\u003eMySQL Performance Schema\u003c/em\u003e\u003c/a\u003e.\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e对于新版本我们也可以直接查询 \u003ccode\u003eINFORMATION_SCHEMA\u003c/code\u003e \u003ca href=\"https://dev.mysql.com/doc/refman/8.0/en/profiling-table.html\" title=\"25.20 The INFORMATION_SCHEMA PROFILING Table\"\u003e\u003ccode\u003ePROFILING\u003c/code\u003e\u003c/a\u003e . See \u003ca href=\"https://dev.mysql.com/doc/refman/8.0/en/profiling-table.html\" title=\"25.20 The INFORMATION_SCHEMA PROFILING Table\"\u003eSection 25.20, “The INFORMATION_SCHEMA PROFILING …\u003c/a\u003e\u003c/p\u003e"
July 7, 2010
freebsd下启动、停止 MySQL命令
"\u003cp\u003e\u003cstrong\u003e启动、停止 MySQL\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e要启动 MySQL 的方法:(以本文将 MySQL 安装在 /usr/local/mysql 为例)\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# /usr/local/mysql/share/mysql.server start\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e如果安装目录使用的是默认的话,请使用\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e /usr/local/etc/rc.d/mysql-server start|stop|restart\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e注意在第一次执行前,须将 mysql.server 设成可执行(chmod 744 mysql.server),另外可将这行指令加在 /etc/rc.d/rc.local 档中,让 MySQL 在开机时自动启动。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e要停止 MySQL 的方法:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# /usr/local/mysql/bin/mysqladmin shutdown\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e如果你为 MySQL Administrator root 帐号(非作业系统的 root)设了密码,要停止 MySQL 则必须像下列这样做,MySQL 会询问你 root 的密码後才会执行 shutdown 的工作:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# /usr/local/mysql/bin/mysqladmin -u root …\u003c/p\u003e\u003c/blockquote\u003e"
July 6, 2010
MySQL压力测试工具 mysqlslap 使用简介
"\u003cp\u003eMySQL从5.1.4版开始带有一个压力测试工具 \u003cstrong\u003emysqlslap\u003c/strong\u003e,通过模拟多个并发客户端访问 mysql来执行测试,使用起来非常的简单。通过mysqlslap –help可以获得可用的选项,这里列一些主要的参数,更详细的说明参考 \u003ca href=\"http://dev.mysql.com/doc/refman/5.1/en/mysqlslap.html\"\u003e官方手册\u003c/a\u003e。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e–auto-generate-sql, -a\u003c/p\u003e\n\u003cp\u003e自动生成测试表和数据\u003c/p\u003e\n\u003cp\u003e–auto-generate-sql-load-type=type\u003c/p\u003e\n\u003cp\u003e测试语句的类型。取值包括:read,key,write,update和mixed(默认)。\u003c/p\u003e\n\u003cp\u003e–number-char-cols=N, -x N\u003c/p\u003e\n\u003cp\u003e自动生成的测试表中包含多少个字符类型的列,默认1\u003c/p\u003e\n\u003cp\u003e–number-int-cols=N, -y N\u003c/p\u003e\n\u003cp\u003e自动生成的测试表中包含多少个数字类型的列,默认1\u003c/p\u003e\n\u003cp\u003e–number-of-queries=N\u003c/p\u003e\n\u003cp\u003e总的测试查询次数(并发客户数×每客户查询次数)\u003c/p\u003e\n\u003cp\u003e–query=name,-q\u003c/p\u003e\n\u003cp\u003e使用自定义脚本执行测试,例如可以调用自定义的一个存储过程或者sql语句来执行测试。\u003c/p\u003e\n\u003cp\u003e–create-schema\u003c/p\u003e\n\u003cp\u003e测试的schema,MySQL中schema也就是database\u003c/p\u003e\n\u003cp\u003e–commint=N …\u003c/p\u003e\u003c/blockquote\u003e"
July 2, 2010
mysql中的max_connect_errors
"\u003cp\u003e连接mysql server出来这个信息\u003c/p\u003e\n\u003cp\u003e引用\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003emessage from server: “Host ‘HP-2B6E9EC1747B’ is blocked because of many connection errors; unblock with ‘mysqladmin flush-hosts\u0026rsquo;”\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e连接次数失败过多,并超过max_connect_erros的值后,服务器会直接拒绝来源机器的所有连接,只要把mysql server默认 max_connect_errors = 10\n把这个值设置大点就好了,记得一定要执行mysqladmin flush-hosts命令来解锁,原来的主机才可以恢复正常连接的.\u003c/p\u003e"
July 2, 2010
MySQL之Handler_read_*
"\u003cp\u003e在MySQL里,我们一般使用 \u003ca href=\"http://dev.mysql.com/doc/refman/5.0/en/show-status.html\"\u003eSHOW STATUS\u003c/a\u003e 查询服务器状态,语法一般来说如下:\u003c/p\u003e\n\u003cp\u003eSHOW [GLOBAL | SESSION] STATUS [LIKE ‘pattern’ | WHERE expr]\u003c/p\u003e\n\u003cp\u003e执行命令后会看到很多内容,其中有一部分是Handler_read_*,它们显示了数据库处理SELECT查询语句的状态,对于调试SQL语句有很大意 义,可惜实际很多人并不理解它们的实际意义,本文简单介绍一下:\u003c/p\u003e\n\u003cp\u003e为了让介绍更易懂,先建立一个测试用的表:\u003c/p\u003e\n\u003cp\u003eCREATE TABLE IF NOT EXISTS \u003ccode\u003efoo\u003c/code\u003e (\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eid\u003c/code\u003e int(10) unsigned NOT NULL auto_increment,\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ecol1\u003c/code\u003e varchar(10) NOT NULL,\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ecol2\u003c/code\u003e text NOT NULL,\u003c/p\u003e\n\u003cp\u003ePRIMARY KEY (\u003ccode\u003eid\u003c/code\u003e),\u003c/p\u003e\n\u003cp\u003eKEY \u003ccode\u003ecol1\u003c/code\u003e (\u003ccode\u003ecol1\u003c/code\u003e)\u003c/p\u003e\n\u003cp\u003e);\u003c/p\u003e\n\u003cp\u003eINSERT INTO `foo` (`id`, `col1`, `col2`) VALUES\n(1, ‘a’, ‘a’),\n(2, ‘b’, ‘b’),\n(3, ‘c’, ‘c’),\n(4, ‘d’, ‘d’), …\u003c/p\u003e"
July 2, 2010
根据status信息对MySQL服务器进行优化[精典]
"\u003cp\u003e对于SQL查询语句对于服务器系统资源的使用情况见:发现瓶颈 – Profiling(程序剖析) -MySQL Profiling\u003c/p\u003e\n\u003cp\u003e网上有很多的文章教怎么配置MySQL服务器,但考虑到服务器硬件配置的不同,具体应用的差别,那些文章的做法只能作为初步设置参考,我们需要根据自己的 情况进行配置优化,好的做法是MySQL服务器稳定运行了一段时间后运行,根据服务器的”状态”进行优化。\u003c/p\u003e\n\u003cp\u003emysql\u0026gt; show global status;\u003c/p\u003e\n\u003cp\u003e可以列出MySQL服务器运行各种状态值,另外,查询MySQL服务器配置信息语句:\u003c/p\u003e\n\u003cp\u003emysql\u0026gt; show variables;\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、慢查询\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003emysql\u0026gt; show variables like ‘%slow%’;\n+——————+——-+\n| Variable_name | Value |\n+——————+——-+\n| log_slow_queries | ON |\n| slow_launch_time | 2 |\n+——————+——-+\u003c/p\u003e\n\u003cp\u003emysql\u0026gt; show global status like …\u003c/p\u003e"
July 2, 2010
mysql优化的重要参数 key_buffer_size table_cache 分享
"\u003cp\u003eMySQL服务器端的参数有很多,但是对于大多数初学者来说,众多的参数往往使得我们不知所措,但是哪些参数是需要我们调整的,哪些对服务器的性能影响最大呢?对于使用Myisam存储引擎来说,主要有key_buffer_size和table_cache两个参数。对于InnoDB引擎来说主要还是以innodb_开始的参数,也很好辨认。\n查看MySQL参数,可以使用\u003cstrong\u003eshow variables\u003c/strong\u003e和\u003cstrong\u003eshow status\u003c/strong\u003e命令查看,前者查看服务器静态参数,即在数据库启动后不会动态更改的值,比如缓冲区、字符集等。后者查看服务器的动态运行状态信息,即数据库运行期间动态变化的信息,比如锁,当前连接数等。\u003c/p\u003e\n\u003cp\u003ekey_buffer_size这个参数是用来设置索引块(index blocks)缓存的大小,它被所有线程共享,严格说是它决定了数据库索引处理的速度,尤其是索引读的速度。那我们怎么才能知道key_buffer_size的设置是否合理呢,一般可以检查状态值Key_read_requests和Key_reads,比例key_reads / key_read_requests 应该尽可能的低,比 …\u003c/p\u003e"
July 1, 2010
MYSQL慢查询日志分析
"\u003cp\u003eMysql5.5慢查询开启有些改变,在my.cnf的 [mysqld] section 添加以下几行即可.注意一定要在[mysqld]块,否则不起作用.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003elong_query_time = 0.001\nslow-query-log = ON\nslow_query_log_file = /usr/local/mysql/data/slow.log\nlog-queries-not-using-indexes = on\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e===================================================\u003c/p\u003e\n\u003cp\u003emysql有一个功能就是可以log下来运行的比较慢的sql语句,默认是没有这个log的,为了开启这个功能,要修改my.cnf或者在mysql启动的时候加入一些参数。\n如果在my.cnf里面修改,需增加如下几行\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003elong_query_time = 10\nslow_query_log = /var/log/slow.log\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003elong_query_time 是指执行超过多久的sql会被log下来,这里是10秒。\nslow_query_log 设置把日志写在那里,为空的时 …\u003c/p\u003e"
June 27, 2010
MySQL 备份(推荐方法)
"\u003cp\u003e一般来说,你有两种可供选择的备份MySQL的方式—-mysqldump 或者mysqlhotcopy。\u003c/p\u003e\n\u003cp\u003emysqldump可以备份各种类型的数据表,但是mysqlhotcopy \u003ca href=\"http://dev.mysql.com/doc/refman/5.0/en/backup.html\"\u003e只适合\u003c/a\u003e 备份MyISAM和ISAM的数据表。所以使用mysqlhotcopy之前,你必须确认你的数据表是不 是有其他的存储引擎(storage engines)的。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eHow To:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003emysqldump -u root -p*** DBNAME | gzip -f\u0026gt;/backup/dbname.’date +%w’.dump.gz\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003emysqlhotcopy DBNAME -u root -p *** /backup\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e**两者速度:**因为 mysqlhotcopy会直接拷贝存储数据的文件,所以其速度是依赖于磁盘操作的速度,较之mysqldump要快些。下面是两种方式备份同一个数据的 时候的时间消耗比较:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003emysqldump 耗时22分39秒(gzip 压缩后文件大小为747M.)\u003c/li\u003e\n\u003cli\u003emysqlhotcopy 耗时6分07秒(tar gzip打包压缩后文件大小为1014M.)\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e参考: …\u003c/p\u003e"
June 27, 2010
图解”How MySQL Replication Works”
"\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/06/3455232156_dc09e11b22_o.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/3455232156_dc09e11b22_o.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.flickr.com/photos/26825745@N06/3455232156/\" title=\"replication by orczhou, on Flickr\"\u003ereplication by orczhou, on Flickr\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e在使用MySQL的应用中,如果你的MySQL Server压力逐渐增大,在应用层优化已经到了一定瓶颈时,那么你应该首先考虑 \u003ca href=\"http://dev.mysql.com/doc/refman/5.0/en/replication.html\"\u003eMySQL Replication\u003c/a\u003e。本文将利用图示的方式简单的描述出MySQL Replication是如何工作的。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e如何同步\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e主库将所有的更新操作,写入二进制日志。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e从库运行”IO线程”(Slave IO Thread)读取主库的二进制日志。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e从库运行”SQL线程”(Slave SQL Thread)执行IO线程(Slave IO Thread)读取的日志中的SQL,从而保持和主库的一致。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003e如何分配请求\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e目前,这部分需要在应用层实现。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e执行更新SQL(UPDATE,INSERT,DELETE)时,请求主库。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e执行查询SQL(SELECT)时,请求从库。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e所以,当你的应用(Application)SELECT请求所占的比率越大,那么Relication就会越有效。\u003c/p\u003e"
June 27, 2010
关于MySQL explain 中的ID(推荐)
"\u003cp\u003e\u003cstrong\u003eExplain ID详解\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e含义:select查询的序列号,是一组数字,表示的是查询中执行select子句或者是操作表的顺序。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eid的情况有三种,分别是:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eid相同表示加载表的顺序是从上到下。\u003c/li\u003e\n\u003cli\u003eid不同id值越大,优先级越高,越先被执行。\u003c/li\u003e\n\u003cli\u003eid有相同,也有不同,同时存在。id相同的可以认为是一组,从上往下顺序执行;在所有的组中,id的值越大,优先级越高,越先执行。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e再看一个查询计划的例子:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://blog.haohtml.com/wp-content/uploads/2010/06/mysql_explain.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/mysql_explain.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e执行顺序依次为 4 -\u0026gt; 3 -\u0026gt; 2 \u0026gt; 1 \u0026gt; NULL\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e第一行:id列为1,表示第一个select,select_type列的primary表示该查询为外层查询,table列被标记为,表示查询结果来自一个衍生表,其中3代表该查询衍生自第三个select查询,即id为3的select。[select d1.name……]\u003c/p\u003e\n\u003cp\u003e第二行:id为3,表示该查询的执行次序为2(4→3),是整个查询中第三个select的一部分。因查询包含在from中,所以为derived。[select id,name from t1 where other_column=”]\u003c/p\u003e\n\u003cp\u003e第三 …\u003c/p\u003e"
June 26, 2010
mysqldump意外终止的原因以及解决方法
"\u003cp\u003emysqldump是非常重要的MySQL备份工具。然而在长年累月的使用过程中,TAOBAO多次出现了因mysqldump意外终止而导致备份 失败的情况。\n以下是我们经常遇到的问题:\u003c/p\u003e\n\u003cp\u003e1、Lost connection to MySQL server at ‘reading initial communication packet’:\n这个主要是因为DNS不稳定导致的。如果做了网络隔离,MySQL处于一个相对安全的网络环境,那么开启skip-name-resolve选项将会最大 程度避免这个问题。\u003c/p\u003e\n\u003cp\u003e2、Lost connection to MySQL server at ‘reading authorization packet’:\n从MySQL获取一个可用的连接是多次握手的结果。在多次握手的过程中,网络波动会导致握手失败。增加connect_timeout可以解决这个问题; 然而增加connect_timeout并不能防止网络故障的发生,反而会引起MySQL线程占用。最好的解决办法是让mysqldump重新发起连接请 求。\u003c/p\u003e\n\u003cp\u003e3、Lost connection to MySQL …\u003c/p\u003e"
June 26, 2010
MySQL Timeout解析
"\u003cp\u003e\u003cstrong\u003e“And God said, Let there be network: and there was timeout”\u003c/strong\u003e\n在使用MySQL的过程中,你是否遇到了众多让人百思不得其解的Timeout?\n那么这些Timeout之后,到底是代码问题,还是不为人知的匠心独具?\n本期Out-man,讲述咱们MySQL DBA自己的Timeout。\u003c/p\u003e\n\u003cp\u003e先看一下比较常见的Timeout参数和相关解释:\n\u003cstrong\u003econnect_timeout\u003c/strong\u003e\nThe number of seconds that the mysqld server waits for a connect packet before responding with Bad handshake.\n\u003cstrong\u003einteractive_timeout\u003c/strong\u003e\nThe number of seconds the server waits for activity on an interactive connection before closing it.\n\u003cstrong\u003ewait_timeout\u003c/strong\u003e\nThe number of seconds the server waits for …\u003c/p\u003e"
June 26, 2010
分布式之后的变化
"\u003cp\u003e在经历了2009年的分布式启步之后,经过改造的数据库系统性能得到极大的提升,但这个变化仍然不构成今天这篇文章的主题,我想要说的是另外一方面的变 化,这个变化在某种程度上影响着当前DBA的角色变化问题。\u003c/p\u003e\n\u003cp\u003e在分布式数据库时代,开发DBA的开发支持工作相比于以前,会有更多的系统思考问题的机会,会结合应用来设计量身定做的分布式数据库系统,如果一个DBA 对业务有着深刻的理解,深刻理解数据库原理,既具有整体性的架构思维,又有一些关键细节把握能力的时候,设计一套分布式系统是水到渠成的事。对于开发支持 的一些工作,比如SQL审核,表结构变更,数据订正,历史迁移,如果没有工具的支持,那做起来还是比较吃力的。这些方面,我们还有许多的道路要走,怎么样 改变目前的现状。\u003c/p\u003e\n\u003cp\u003e在分布式数据库时代,系统DBA的运维要求难度在某方面有所降低,整个应用因为在容错性方面做了比较多的努力,比如down掉一个数据库时,对于整个应用 系统的健康运行影响较小,运维的压力相对减少。相比于集中式的数据库环境下的运维,在另外一个层面运维难度又有所增加,第一,运维的机器数量呈几何指数的 增长,由于大量采用低端机器,集群中某个机器出问题的 …\u003c/p\u003e"
June 26, 2010
如何选择合适的MySQL存储引擎
"\u003cp\u003e本文将讲述MySQL中多种存储引擎的特点,希望可以给你在选择 MySQL存储引擎时带来帮助。\u003c/p\u003e\n\u003cp\u003eMySQL有多种存储引擎:\u003c/p\u003e\n\u003cp\u003eMyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、 ARCHIVE、CSV、BLACKHOLE。\u003c/p\u003e\n\u003cp\u003eMySQL支持数个存储引擎作为对不同表的类型的处理器。MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎:\u003c/p\u003e\n\u003cp\u003e◆ MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。MyISAM在所有MySQL配置里被支持,它是默认的存储引擎,除非你配置 MySQL默认使用另外一个引擎。\u003c/p\u003e\n\u003cp\u003e◆ MEMORY存储引擎提供“内存中”表。MERGE存储引擎允许集合将被处理同样的MyISAM表作为一个单独的表。就像MyISAM一样,MEMORY 和MERGE存储引擎处理非事务表,这两个引擎也都被默认包含在MySQL中。\u003c/p\u003e\n\u003cp\u003e注释:MEMORY存储引擎正式地被确定为HEAP引擎。\u003c/p\u003e\n\u003cp\u003e◆ InnoDB和BDB存储引擎提供事务安全表。BDB被包含在为支持它的操作系统发布的MySQL-Max二进制分 …\u003c/p\u003e"
June 26, 2010
MySQL Cluster的常见问题
"\u003cp\u003eMySQL Cluster是MySQL适合于分布式计算环境的高实用、高冗余版本。它采用了NDB Cluster存储引擎,允许在1个Cluster中运行多个MySQL服务器。\u003c/p\u003e\n\u003cp\u003eMySQL Cluster是一种技术,该技术允许在无共享的系统中部署“内存中”数据库的Cluster。通过无共享体系结构,系统能够使用廉价的硬件,而且对软硬 件无特殊要求。此外,由于每个组件有自己的内存和磁盘,不存在单点故障。\u003c/p\u003e\n\u003cp\u003e总结了些移植到MySQL Cluster要注意的常见问题。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e关于连接\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eMySQL集群适合用于高速带宽的环境中,采用TCP/IP方式 连接。它的性能跟主机间的连接速率有直接关系。集群中的最小速率要求是常规的100Mb以太网或者等同的网络。我们建议可能的话就采用G级网络。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e关于内存\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eMySQL集群可以运行在任何启用NDB的平台上。显然,CPU 越快,内存越大,对集群性能提升越明显,64位的CPU也可能比32位的处理器更快。每个作为数据节点的机器都必须有足够的内存来保存共享数据库。\u003c/p\u003e\n\u003cp\u003e在MySQL 5.0中,集群只能基于内存。意思是所有表的数据(包括索引)都保存在内存中。如果你的数据有1GB那么大, …\u003c/p\u003e"
June 25, 2010
MySQL 集群在Server1与Server2上如何安装MySQL
"\u003cp\u003e我们今天主要向大家介绍的是MySQL 集群,其中包括对MySQL 集群的概念介绍,以及如何在Server1与Server2上正确对MySQL进行安装 ,还有对安装与配置管理节点服务器(Server3)的正确操作 ,配置集群服务器并启动MySQL 。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、介绍\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e这篇文档旨在介绍如何安装配置基于2台服务器的MySQL集群。并且实现任意一台服务器出现问题或宕机时MySQL依然能够继续运行。\u003c/p\u003e\n\u003cp\u003e注意!\u003c/p\u003e\n\u003cp\u003e虽然这是基于2台服务器的MySQL集群,但也必须有额外的第三台服务器作为管理节点,但这台服务器可以在集群启动完成后关闭。同时需要注意的是并 不推荐在集群启动完成后关闭作为管理节点的服务器。尽管理论上可以建立基于只有2台服务器的MySQL集群,但是这样的架构,一旦一台服务器宕机之后集群 就无法继续正常工作了,这样也就失去了集群的意义了。出于这个原因,就需要有第三台服务器作为管理节点运行。\u003c/p\u003e\n\u003cp\u003e另外,可能很多朋友都没有3台服务器的实际环境,可以考虑在VMWare或其他虚拟机中进行实验。\u003c/p\u003e\n\u003cp\u003e下面假设这3台服务的情况:\u003c/p\u003e\n\u003cp\u003eServer1: MySQL1.vmtest.net 192.168.0.1 …\u003c/p\u003e"
June 25, 2010
Mysql 集群简介和配置
"\u003cp\u003e1. 先了解一下你是否应该用 mysql 集群。\u003c/p\u003e\n\u003cp\u003e减少数据中心结点压力和大数据量处理,采用把 mysql 分布,一个或多个 application 对应一个 mysql 数据库。把几个 mysql 数据库公用的数据做出共享数据,例如购物车,用户对象等等,存在数据结点里面。 其他不共享的数据还维持在各自分布的 mysql 数据库本身中。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/06/cluster-components-1.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/06/cluster-components-1.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e2. 集群 Mysql 中名称概念 .( 如上图 )\u003c/p\u003e\n\u003cp\u003e1 ) Sql 结点( SQL node– 上图对应为 mysqld ) : 分布式数据库。包括自身数据和查询中心结点数据 .\u003c/p\u003e\n\u003cp\u003e2 )数据结点 (Data node — ndbd): 集群共享数据 ( 内存中 ).\u003c/p\u003e\n\u003cp\u003e3 )管理服务器 (Management Server – ndb_mgmd): 集群管理 SQL node,Data node.\u003c/p\u003e\n\u003cp\u003e3 .配置\u003c/p\u003e\n\u003cp\u003emysql-max 版本,当然现在 mysql 集群系统 windonws 平台上面不被支持 .\u003c/p\u003e\n\u003cp\u003e安装 mysql 就不多说了,网上一打堆,简明扼要。\u003c/p\u003e\n\u003cp\u003eA:192.168.1.251 – Data node 和 Management …\u003c/p\u003e"
June 25, 2010
MySQL Cluster集群配置方案
"\u003cp\u003e在为某证券公司设计其OA架构时,初期客户是30万用户在线;然而在项目实施中,客户又提出50万用户同时在线的需求,而且都有写的需求;这样初始的设计 master-master-slave,读写分离满足不了客户的要求,所以我们打算采用Mysql Cluster方案;MySQL Cluster 是MySQL适合于分布式计算环境的高实用、高冗余版本。它采用了NDB Cluster 存储引擎,允许在1个Cluster中运行多个MySQL服务器。在MyQL 5.0及以上的二进制版本中、以及与最新的Linux版本兼容的RPM中提供了该存储引擎。\u003c/p\u003e\n\u003cp\u003e一、MySQL Cluster概述\u003c/p\u003e\n\u003cp\u003eMySQL Cluster 是一种技术,该技术允许在无共享的系统中部署“内存中”数据库的 Cluster 。通过无共享体系结构,系统能够使用廉价的硬件,而且对软硬件无特殊要求。此外,由于每个组件有自己的内存和磁盘,不存在单点故障。\u003c/p\u003e\n\u003cp\u003eMySQL Cluster 由一组计算机构成,每台计算机上均运行着多种进程,包括MySQL服务器,NDB Cluster 的数据节点,管理服务器,以及(可能)专门的数据访问程序。\u003c/p\u003e\n\u003cp\u003e所有的这些节点 …\u003c/p\u003e"
June 25, 2010
MySQL如何修改表格的字符集,如何修改某个字段的字符集
"\u003cp\u003e如果用户想改变表的默认字符集和所有的字符列的字符集到一个新的字符集,使用下面的语句:\nALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;\u003c/p\u003e\n\u003cp\u003e警告:\n上述操作是在字符集中转换列值。如果 用户在字符集(如 gb2312)中有一个列,但存储的值使用的是其它的一些不兼容的字符集(如 utf8),那么该操作将不会得到用户期望的结果。在这种情况下,用户必须对每一列做如下操作:\u003c/p\u003e\n\u003cp\u003eALTER TABLE t1 CHANGE c1 c1 BLOB;\nALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8;\u003c/p\u003e\n\u003cp\u003e这样做的原因是:从 BLOB 列转换或转换到 BLOB 列没有转换发生。\u003c/p\u003e\n\u003cp\u003e如果用户指定以二进制进行 CONVERT TO CHARACTER SET,则 CHAR、VARCHAR 和 TEXT 列将转换为它们对应的二进制字符串类型(BINARY,VARBINARY,BLOB)。这意味着这些列将不再有字符集,随后的 CONVERT TO 操作也将不会作用到它们上。\u003c/p\u003e\n\u003cp\u003e如果仅仅改变一个表的缺省字 …\u003c/p\u003e"
June 25, 2010
Mysql InnoDB和MyISAM的区别
"\u003cp\u003eInnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等 高级处 理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已 经外部键等高级数据库功能。\u003c/p\u003e\n\u003cp\u003eMyIASM是IASM表的新版本,有如下扩展:\u003c/p\u003e\n\u003cp\u003e1、二进制层次的可移植性。\u003c/p\u003e\n\u003cp\u003e2、NULL列索引。\u003c/p\u003e\n\u003cp\u003e3、对变长行比ISAM表有更少的碎片。\u003c/p\u003e\n\u003cp\u003e4、支持大文件。\u003c/p\u003e\n\u003cp\u003e5、更好的索引压缩。\u003c/p\u003e\n\u003cp\u003e6、更好的键码统计分布。\u003c/p\u003e\n\u003cp\u003e7、更好和更快的auto_increment处理。\u003c/p\u003e\n\u003cp\u003eInnoDB 是 MySQL 上第一个提供外键约束的引擎,除了提供事务处理外,InnoDB 还支持行锁,提供和 Oracle 一样的一致性的不加锁读取,能增加并发读的用户数量并提高性能,不会增加锁的数量。\u003c/p\u003e\n\u003cp\u003eInnoDB 的设计目标是处理大容量数据时最大化性能,它的 CPU 利用率是其他所有基于磁盘的关系数据库引擎中最有效率的。\u003c/p\u003e\n\u003cp\u003eInnoDB 是一套放在 MySQL 后台的完整数据库系统,InnoDB 有它自己的缓冲池, …\u003c/p\u003e"
June 24, 2010
UPDATE 时主键冲突引发的思考
"\u003cp\u003e假设有一个表,结构如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emysql\u0026gt; CREATE TABLE `a` (\n `id` int(10) unsigned NOT NULL AUTO_INCREMENT,\n `id2` int(10) unsigned NOT NULL DEFAULT \u0026#39;0\u0026#39;,\n PRIMARY KEY (`id`)\n) ENGINE=MyISAM;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e该表中只有6条记录,如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emysql\u0026gt; select * from a;\n+----+---------+\n| id | city_id |\n+----+---------+\n| 2 | 2 |\n| 3 | 3 |\n| 5 | 5 |\n| 4 | 4 |\n| 6 | 6 |\n| 7 | 7 |\n+----+---------+\n注意上面id的显示顺序,由于没有指定排序字段,myisam表引擎是随机显示记录列表的。\n现在想要把id字段分别-1,执行以下语句,得到报错:\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emysql\u0026gt; update a set id=id-1; …\u003c/code\u003e\u003c/pre\u003e"
May 28, 2010
MySQL数据库备份及恢复命令及常用应用举例
"\u003cp\u003e\u003cstrong\u003e– 备份\u003c/strong\u003e\nmysqldump –force –quick –skip-opt –create-options –add-drop-table –extended-insert –host=”localhost” –user=”root” –password=”密码” “数据库名称” \u0026gt; C:/2010-01-26.sql\n**\n– 还原**\nmysql –host=”localhost” –user=”root” –password=”密码” “数据库名称” \u0026lt; C:/2010-01-26.sql\u003c/p\u003e\n\u003cp\u003e本文总结了MySQL数据库备份及恢复常用命令mysqldump,source的用法。\n还原一个数据库:mysql -h localhost -u root -p123456 www\u003c/p\u003e\n\u003cp\u003e备份一个数据库:mysqldump -h localhost -u root -p123456 www \u0026gt; d:\\www2008-2-26.sql\u003c/p\u003e\n\u003cp\u003e//以下是在程序中进行测试\u003c/p\u003e\n\u003cp\u003e//$command = “mysqldump –opt -h $dbhost -u $dbuser -p …\u003c/p\u003e"
May 26, 2010
mysql中查看表结构命令
"\u003cp\u003emysql查 看表结构命令,如下:\u003c/p\u003e\n\u003cp\u003edesc 表名;\u003c/p\u003e\n\u003cp\u003eshow columns from 表名;\u003c/p\u003e\n\u003cp\u003edescribe 表名;\u003c/p\u003e\n\u003cp\u003eshow create table 表名;\u003c/p\u003e\n\u003cp\u003euse information_schema\u003c/p\u003e\n\u003cp\u003eselect * from columns where table_name=’表名’;\u003c/p\u003e\n\u003cp\u003e顺便记下:\u003c/p\u003e\n\u003cp\u003eshow databases;\u003c/p\u003e\n\u003cp\u003euse 数据库名;\u003c/p\u003e\n\u003cp\u003eshow tables;\u003c/p\u003e\n\u003cp\u003e原有一unique索引AK_PAS_Name(PAC_Name)在表 tb_webparamcounter中,\u003c/p\u003e\n\u003cp\u003e执行以下sql修改索引\u003c/p\u003e\n\u003cp\u003ealter table tb_webparamcounter drop index AK_PAS_Name;\u003c/p\u003e\n\u003cp\u003ealter table tb_webparamcounter add UNIQUE AK_PAS_Name(PC_ID,PAC_Name);\u003c/p\u003e\n\u003cp\u003e若发现索引的逻辑不对,还需要再加一个字段进去,执行\u003c/p\u003e\n\u003cp\u003ealter table tb_webparamcounter drop index AK_PAS_Name;\u003c/p\u003e\n\u003cp\u003ealter table …\u003c/p\u003e"
April 29, 2010
update 语句:从一个表中更新另一个表的字段
"\u003cp\u003eupdate table_all a set a.phoneNo=b.phoneNo from table_new b where a.name =b.name\u003c/p\u003e\n\u003cp\u003eupdate table_all set table_all.phoneNo = (select table_new.phoneNo from table_new where table_all.name = table_new.name)\u003c/p\u003e"
April 25, 2010
mysql查询中in和多个or的区别
"\u003cp\u003e\u003cstrong\u003e比较IN()里面的数据\u003c/strong\u003e\n许多数据库服务器都只把IN()看作多个OR的同义词,因为它们在逻辑上是相等的。MYSQL不是这样的,它会对IN()里面的数据进行排序,然后用二分法查找个是否在列表中,这个算法的效率是O(Logn),而等同的OR子句的查找效率是O(n)。在列表很大的时候,OR子句就会变得慢得多。\u003c/p\u003e\n\u003cp\u003e这里的语句和Oracle数据库里是一样的。\u003c/p\u003e"
April 21, 2010
mysql集群强制从主服务器阻塞更新直到从服务器同步?
"\u003cp\u003e\u003cstrong\u003eQ\u003c/strong\u003e:我怎样强制主服务器阻塞更新直到从服务器同步?\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eA\u003c/strong\u003e:使用下面的步骤:\u003c/p\u003e\n\u003cp\u003e1.在主服务器上,执行这些语句:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emysql\u0026gt; FLUSH TABLES WITH READ LOCK;\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emysql\u0026gt; SHOW MASTER STATUS;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e记录SHOW语句的输出的日志名和偏移量。这些是复制坐标。2.在从服务器上,发出下面的语句,其中Master_POS_WAIT()函 数的参量是前面步骤中的得到的复制坐标值:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emysql\u0026gt; SELECT MASTER_POS_WAIT(\u0026#39;log_name\u0026#39;, log_offset);\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSELECT语句阻塞直到从服务器达到指定的日志文件和偏移量。此时,从服务器与主服务器同步,语句返回。\u003c/p\u003e\n\u003cp\u003e3.在主服务器上,发出下面的语句允许主服务器重新开始处理更新:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emysql\u0026gt; UNLOCK TABLES;\n\n来源:http://dev.mysql.com/doc/refman/5.1/zh/replication.html#replication-faq\n\u003c/code\u003e\u003c/pre\u003e"
April 21, 2010
mysql集群从服务器复制传递和状态文件(master.info和relay_log.info)
"\u003ch3 id=\"634复制传递和状态文件\"\u003e6.3.4. 复制传递和状态文件\u003c/h3\u003e\n\u003cp\u003e默认情况,中继日志使用_host_name-relay-bin.nnnnnn_形 式的文件名,其中_host_name_是从服务器主机名,\u003cem\u003ennnnnn_是 序列号。用连续序列号来创建连续中继日志文件,从000001开始。从服务器跟踪索引文件中目前正 使用的中继日志。 默认中继日志索引文件名为_host_name-relay-bin.index\u003c/em\u003e。 默认情况,在从服务器的数据目录中创建这些文件。可以用–relay-log和–relay-log-index服 务器选项覆盖 默认文件名。参见\u003ca href=\"http://dev.mysql.com/doc/refman/5.1/zh/replication.html#replication-options\" title=\"6.8. Replication Startup Options\"\u003e6.8节,“复制启动选项”\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e中继日志与二进制日志的格式相同,并且可以用\u003cstrong\u003emysqlbinlog\u003c/strong\u003e读取。SQL线 程执行完中继日志中的所有事件并且不再需要之后,立即自动删除它。没有直接的删除中继日志的机制,因为SQL线程可以负责完 成。然而,FLUSH LOGS可以循环中继日志,当SQL线程删除日志时会有影响。\u003c/p\u003e\n\u003cp\u003e在下面的条件下创建新的中继日志:\u003c/p\u003e\n\u003cp\u003e·每次I/O线程启动时创建一个新的中继日志。\u003c/p\u003e\n\u003cp\u003e·当日志被刷新时;例如,用FLUSH LOGS或\u003cstrong\u003emysqladmin …\u003c/strong\u003e\u003c/p\u003e"
April 20, 2010
Impossible WHERE noticed after reading const tables
"\u003cp\u003e用EXPLAIN看MySQL的执行计划时经常会看到Impossible WHERE noticed after reading const tables这句话,意思是说MySQL通过读取“const tables”,发现这个查询是不可能有结果输出的。比如对下面的表和数据:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e create table t (a int primary key, b int) engine = innodb;\n insert into t values(1, 1);\n insert into t values(3, 1);\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e执 行“EXPLAIN select * from t where a = 2”时就会输出“Impossible WHERE noticed after reading const tables”。\u003c/p\u003e\n\u003cp\u003e不明白所谓的“const tables”是什么意思,对MySQL在查询优化时竟然可以发现一个查询不可能输出结果更是感觉不可思议。按数据库中“传统”的做法,查询优化时只会访问模式定义和统计信息,而据我所知,数据库中使用的各种统计信息如EquiDepth、MaxDiff柱状图,MCV,属性的最 …\u003c/p\u003e"
April 14, 2010
SET 和 SHOW语法(三)
"\u003cp\u003e译者:叶金荣(Email:\u003cimg src=\"http://imysql.cn/files/pictures/email.gif\" alt=\"\"\u003e),来源:MySQL手册版 本 5.0.20,转载请注明译者和出处,并且不能用于商业用途,违者必究。\u003c/p\u003e\n\u003ch4 id=\"145316\"\u003e\u003ca href=\"javascript:void(0);\"\u003e14.5.3.16 \u003ccode\u003eSHOW PROCESSLIST\u003c/code\u003e 语法\u003c/a\u003e\u003c/h4\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eSHOW [FULL] PROCESSLIST\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003eSHOW PROCESSLIST\u003c/code\u003e 显示了有哪些线程在运行。也可以执行 \u003ccode\u003emysqladmin processlist\u003c/code\u003e 命令来得到这些信息。如果有 \u003ccode\u003eSUPER\u003c/code\u003e 权限,则可以看到全部的线程,否则,只能看到自己发起的线程(这是指,当前对应的MySQL帐户运行的线程)。详情请看“\u003ca href=\"javascript:void(0);\"\u003e14.5.4.3 \u003ccode\u003eKILL\u003c/code\u003e Syntax\u003c/a\u003e”。如果没有使用 关键字 \u003ccode\u003eFULL\u003c/code\u003e,则只能看到每个查询的前100个字符。\u003c/p\u003e\n\u003cp\u003e从MySQL 4.0.12起,结果中还会以的 \u003ccode\u003ehost_name:client_port\u003c/code\u003e 格式来显示通过TCP/IP方式连接过来的客户端的主机名,这就可以知道每个客户端都正在做什么。\u003c/p\u003e\n\u003cp\u003e这个语句在出现“too many connections”错误时想看看都正在执行什么查询非常有用。MySQL为拥有 \u003ccode\u003eSUPER\u003c/code\u003e 权限的账户保留了一个额外的连接,这就保证让管理员总是可以连上检查系 …\u003c/p\u003e"
April 13, 2010
mysql中的表分区
"\u003cp\u003e表分区为海量数据的存储提供了一种更有效率的储存方式,可通过分区将表的数据分开存储在不同的磁盘上,提高数据检索和操作的效率。\u003c/p\u003e\n\u003cp\u003e在SQL Server中进行表分区操作,包括三个步骤:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e创建分区函数\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCREATE PARTITION FUNCTION \u003ca href=\"datetime\"\u003eFN_Partition\u003c/a\u003e AS RANGE LEFT FOR VALUES (N’2008-01-01T23:59:59′, N’2009-01-01T23:59:59′, N’2010-01-01T23:59:59′)\u003c/p\u003e\n\u003cp\u003e此分区函数采用时间进行分区,共有4个分区,边界值为括号里的时间值\u003c/p\u003e\n\u003cp\u003e第一个分区为: 时间 第二个分区为: N’2008-01-01T23:59:59′\u0026lt; 时间 第三个分区为: N’2009-01-01T23:59:59′\u0026lt; 时间 第四个分区为: 时间\u0026gt;N’2010-01-01T23:59:59′\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e创建分区方案\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCREATE PARTITION SCHEME [SE_Partition] AS PARTITION [FN_Partition] TO ([xmsddgroup1], …\u003c/p\u003e"
April 12, 2010
mysql 中的触发器语法简介
"\u003cp\u003e\u003cstrong\u003e1. 语法:命名规则\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eCREATE TRIGGER \u0026lt;触发器名称\u0026gt; \u0026lt;–\n{ BEFORE | AFTER }\n{ INSERT | UPDATE | DELETE }\nON \u0026lt;表名称\u0026gt;\nFOR EACH ROW\n\u0026lt;触发器SQL语句\u0026gt;\u003c/p\u003e\n\u003cp\u003e触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.\u003c/p\u003e\n\u003cp\u003e这里我有个习惯:就是用表的名字+’_’+触发器类型的缩写.因此如果是表t26,触发器是在事件UPDATE(参考下面的点(2)和(3))之前 (BEFORE)的,那么它的名字就是t26_bu。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2. 语法:触发时间\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eCREATE TRIGGER \u0026lt;触发器名称\u0026gt;\n{ BEFORE | AFTER } \u0026lt;–\n{ INSERT | UPDATE | DELETE }\nON \u0026lt;表名称\u0026gt;\nFOR EACH ROW\n\u0026lt;触发的SQL语句\u0026gt;\u003c/p\u003e\n\u003cp\u003e触发器有执行的时间设置:可以设置为事件发生前或后 BEFORE | AFTER 。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3. 语法:事件\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eCREATE TRIGGER \u0026lt;触发器名 …\u003c/p\u003e"
April 12, 2010
mysql中的存储过程-语法
"\u003cp\u003e\u003cstrong\u003e简介:\u003c/strong\u003e 一个存储过程包括名字,参数列表,以及可以包括很多SQL语句的SQL语句集。\u003c/p\u003e\n\u003cp\u003e一个存储过程包括名字,参数列表,以及可以包括很多SQL语句的SQL语句集。\u003c/p\u003e\n\u003cp\u003e创建存储 过程:\u003c/p\u003e\n\u003cp\u003e语法:\u003c/p\u003e\n\u003cp\u003eCREATE PROCEDURE p()\u003c/p\u003e\n\u003cp\u003eBEGIN\u003c/p\u003e\n\u003cp\u003e/\u003cem\u003e此存储过程的正文\u003c/em\u003e/\u003c/p\u003e\n\u003cp\u003eEND\u003c/p\u003e\n\u003cp\u003eCREATE PROCEDURE productpricing()\u003c/p\u003e\n\u003cp\u003eBEGIN\u003c/p\u003e\n\u003cp\u003eSELECT Avg(pro_price) AS priceaverage\u003c/p\u003e\n\u003cp\u003eFROMproducts;\u003c/p\u003e\n\u003cp\u003eEND;\u003c/p\u003e\n\u003ch1 id=\"beginend之间是存储过程的主体定义\"\u003ebegin…end之间是存储过程的主体定义\u003c/h1\u003e\n\u003ch1 id=\"mysql的分界符是分号\"\u003emysql的分界符是分号(;)\u003c/h1\u003e\n\u003cp\u003e调用存储 过程的方法是:\u003c/p\u003e\n\u003ch1 id=\"call加上过程名以及一个括号\"\u003eCALL加上过程名以及一个括号\u003c/h1\u003e\n\u003ch1 id=\"例-如调用上面定义的存储过程\"\u003e例 如调用上面定义的存储过程\u003c/h1\u003e\n\u003cp\u003eCALL productpricing();\u003c/p\u003e\n\u003ch1 id=\"哪-怕是不用传递参数存储过程名字后面的括号也是必须的\"\u003e哪 怕是不用传递参数,存储过程名字后面的括号“()”也是必须的\u003c/h1\u003e\n\u003cp\u003e删除存储 过程的方法是:\u003c/p\u003e\n\u003cp\u003eDROP PROCUDURE productpricing;\u003c/p\u003e\n\u003cp\u003e创建带参 数的存储过程:\u003c/p\u003e\n\u003cp\u003eCREATE PROCUDURE productpricing(\u003c/p\u003e\n\u003cp\u003eOUT p1 DECIMAL(8,2),\u003c/p\u003e\n\u003cp\u003eOUT ph DECIMAL(8,2), …\u003c/p\u003e"
April 7, 2010
btree索引和hash索引的区别
"\u003cp\u003e在mysql中,大多数索引(如 PRIMARY KEY,UNIQUE,INDEX和FULLTEXT)都是在BTREE中存储,但使用memory引擎可以选择BTREE索引或者HASH索引,两种不同类型的索引各自有其不同的使用范围。\u003c/p\u003e\n\u003cp\u003eHash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。\u003c/p\u003e\n\u003cp\u003e可能很多人又有疑问了,既然 Hash 索引的效率要比 B-Tree 高很多,为什么大家不都用 Hash 索引而还要使用 B-Tree 索引呢?任何事物都是有两面性的,Hash 索引也一样,虽然 Hash 索引效率高,但是 Hash 索引本身由于其特殊性也带来了很多限制和弊端,主要有以下这些。\u003c/p\u003e\n\u003cp\u003e(1)Hash 索引仅仅能满足”=”,”IN”和”\u0026lt;=\u0026gt;”查询,不能使用范围查询。\u003c/p\u003e\n\u003cp\u003e由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的 Hash …\u003c/p\u003e"
April 4, 2010
mysql中使用InnoDB还是MyISAM ?
"\u003cp\u003e自己经常使用sqlserver,不怎么使用mysql.所以也对mysql不咋米了解。这里转两个帖子关于mysql中的InnoDB和MyIsAM的介绍,个人觉得还是不错的。\u003c/p\u003e\n\u003cp\u003e转载自 \u003ca href=\"http://database.51cto.com/\"\u003ehttp://database.51cto.com\u003c/a\u003e 2009-05-19 09:58 邵宗文 IT168\u003c/p\u003e\n\u003cp\u003e链接:http://database.51cto.com/art/200905/122382.htm\u003c/p\u003e\n\u003ch3 id=\"浅谈mysql存储引擎选择-innodb还是myisam\"\u003e浅谈MySQL存储引擎选择 InnoDB还是MyISAM\u003c/h3\u003e\n\u003cp\u003eMyISAM 是MySQL中默认的存储引擎,一般来说不是有太多人关心这个东西。决定使用什么样的存储引擎是一个很tricky的事情,但是还是值我们去研究一下,这 里的文章只考虑 MyISAM 和InnoDB这两个,因为这两个是最常见的。\u003c/p\u003e\n\u003cp\u003e下面先让我们回答一些问题:\u003c/p\u003e\n\u003cp\u003e◆你的数据库有外键吗?\u003c/p\u003e\n\u003cp\u003e◆你需要事务支持吗?\u003c/p\u003e\n\u003cp\u003e◆你需要全文索引吗?\u003c/p\u003e\n\u003cp\u003e◆你经常使用 什么样的查询模式?\u003c/p\u003e\n\u003cp\u003e◆你的数据有多大?\u003c/p\u003e\n\u003cp\u003e思考上面这些问题可以让你找到合适的方向,但那并不是绝对的。如果你需要事务处理或是外键,那么InnoDB 可能是比较好的方式。如果你需要全文索引, …\u003c/p\u003e"
April 2, 2010
Unix下重置mysqlroot密码
"\u003cp\u003e\u003cstrong\u003emysql忘记root 密码如何处理?\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e如果 MySQL 正在运行,首先结束mysql进程: killall mysqld\u003c/p\u003e\n\u003cp\u003e启动 MySQL (非正常方式起动):/usr/local/mysql/bin/mysqld_safe –-skip-grant-tables \u0026amp;\u003c/p\u003e\n\u003cp\u003e这样就可以不需要密码进入 MySQL :/usr/local/mysql/bin/mysql -u root -p (要求输入密码时直接回车即可)\u003c/p\u003e\n\u003cp\u003emysql\u0026gt; update user mysql.set password=password(”新密码”) where user=”root”;\u003c/p\u003e\n\u003cp\u003emysql\u0026gt; flush privileges;\u003c/p\u003e\n\u003cp\u003emysql\u0026gt; quit;\u003c/p\u003e\n\u003cp\u003e重新结束进程:killall mysqld\u003c/p\u003e\n\u003cp\u003e用正常方式启动 MySQL :/usr/local/mysql/bin/mysqld_safe -user=mysql \u0026amp;\u003c/p\u003e"
April 1, 2010
MySQL数据库服务器在Flickr、Fotolog、 Wkipedia、Facebook等国际知名网站中的使用数量
"\u003cp\u003e2008年4月18日,在Alexa安排的一次“ \u003ca href=\"http://venublog.com/2008/04/16/notes-from-scaling-mysql-up-or-out/\"\u003eScaling MySQL — Up or Out?\u003c/a\u003e”的小组辩论中,MySQL、Sun、 Flickr、Fotolog、Wkipedia、Facebook、YouTube等国际知名网站的DBA们,对其网站MySQL数据库服务器、Web 服务器、缓存服务器的数量,MySQL版本,编程语言类型,操作系统类型等问题进行了回答。 \u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/04/mysql_number.gif\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/04/mysql_number.gif\" alt=\"mysql_number\"\u003e\u003c/a\u003e\u003c/p\u003e"
April 1, 2010
MySQL Memcache_engine的安装与使用[原创]
"\u003cp\u003e[文章作者:张宴 本文版本:v1.1 最后修改:2008.09.09 转载请注明原文链接: \u003ca href=\"http://blog.s135.com/post/357/\"\u003ehttp://blog.s135.com/post/357/\u003c/a\u003e]\u003c/p\u003e\n\u003cp\u003e鉴于国内外还没有人撰写如何安装Memcache_engine的文章,于是,我根据自己的编译安装步骤,写下此文。\u003c/p\u003e\n\u003cp\u003eMemcache_engine是一个MySQL 5.1数据库的存储引擎,它能够让用户通过标准的SQL语句(SELECT/UPDATE/INSERTE/DELETE)访问Memcached(还支 持新浪的 \u003ca href=\"http://www.memcachedb.org/\"\u003eMemcachedb\u003c/a\u003e、 \u003ca href=\"http://code.google.com/p/dbcached\"\u003edbcached\u003c/a\u003e)中 存放的数据。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e限制:\u003c/strong\u003e\n1、Memcache表必须有主键。\n2、只能使用主 键去查询,即只能使用SELECT … FROM … WHERE id = … 方式去查询。\n3、不支持自增ID。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e安装与使用:\u003c/strong\u003e\n1、编译安装memcache_engine的步骤:\u003c/p\u003e\n\u003cp\u003ecd /tmp\u003c/p\u003e\n\u003cp\u003ewget …\u003c/p\u003e"
March 26, 2010
启用Xdebug使用WinCacheGrind分析脚本执行时间
"\u003cp\u003e使用Xdebug调试和优化PHP程序系列教程之WinCacheGrind,教你如何利用Xdebug 配合WinCacheGrind工具来检测PHP代码的效率以及分析PHP代码。\u003c/p\u003e\n\u003cp\u003e另外还有一个结果分析展示工具webgrind。可参考: \u003ca href=\"http://blog.sina.com.cn/s/blog_635833b3010127q5.html\"\u003ehttp://blog.sina.com.cn/s/blog_635833b3010127q5.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e有时候代码没有明显的编写错误,没有显示任何错误信息(如 error、warning、notice等),但是这不表明代码就是正确无误的。有时候可能某段代码执行时间过长,占用内存过多以致于影响整个系统的效 率,我们没有办法直接看出来是哪部份代码出了问题。这时候我们希望把代码的每个阶段的运行情况都监控起来,写到日志文件中去,运行一段时间后再进行分析, 找到问题所在。\u003c/p\u003e\n\u003cp\u003e回忆一下,之前我们编辑php.ini文件\n加入\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e[Xdebug]\u0026lt;br /\u0026gt; xdebug.profiler_enable=on\u0026lt;br /\u0026gt; xdebug.trace_output_dir=\u0026quot;I:\\Projects\\xdebug\u0026quot;\u0026lt;br …\u003c/code\u003e\u003c/p\u003e"
March 26, 2010
mysql显示SQL语句执行时间
"\u003cp\u003e查看 MySQL 語法 詳細執行時間 與 CPU/記憶體使用量: MySQL Query Profiler\u003c/p\u003e\n\u003cp\u003eMySQL 的 SQL 語法調整主要都是使用 \u003ca href=\"http://dev.mysql.com/doc/refman/5.0/en/explain.html\" title=\"MySQL :: MySQL 5.0 Reference Manual :: 12.3.2 EXPLAIN Syntax\"\u003eEXPLAIN\u003c/a\u003e , 但是這個並沒辦法知道詳細的 Ram(Memory)/CPU 等使用量.\u003c/p\u003e\n\u003cp\u003e於 MySQL 5.0.37 以上開始支援 MySQL Query Profiler, 可以查詢到此 SQL 會執行多少時間, 並看出 CPU/Memory 使用量, 執行過程中 System lock, Table lock 花多少時間等等.\u003c/p\u003e\n\u003cp\u003eMySQL Query Profile 詳細介紹可見: \u003ca href=\"http://dev.mysql.com/tech-resources/articles/using-new-query-profiler.html\" title=\"Using the New MySQL Query Profiler\"\u003eUsing the New MySQL Query Profiler\u003c/a\u003e (2007.04.05 發表)\u003c/p\u003e\n\u003cp\u003e效能分析主要分下述三種(轉載自上篇):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eBottleneck analysis – focuses on answering the questions: What is my database server waiting on; what is a user connection waiting on; what is a piece of …\u003c/li\u003e\u003c/ul\u003e"
March 16, 2010
用show table satus查看数据库表的相关信息
"\u003cp\u003e显然,我之前那个数据库备份程序太菜鸟了。还用select count(*) 来判断数据库的记录集数,其实完全不用那么麻烦。有一个简单的MML语句今天被我无意间发 现,”SHOW TABLE STATUS FROM `dbname`”,执行后会生成一个记录集。\u003c/p\u003e\n\u003cp\u003e记录集包含下列字段:\u003c/p\u003e\n\u003cp\u003eName: \u003cstrong\u003enewdb\u003c/strong\u003e (表名)\nEngine: \u003cstrong\u003eMyISAM\u003c/strong\u003e (表引擎)\nVersion: \u003cstrong\u003e10\u003c/strong\u003e (版本)\nRow_format: \u003cstrong\u003eDynamic\u003c/strong\u003e (行格式)\u003c/p\u003e\n\u003cp\u003eRows: \u003cstrong\u003e56496\u003c/strong\u003e (表内总行数)\n对于其它存储引擎,比如InnoDB,本值是一个大约的数,与实际值相差可达40到50%。 在这些情况下,使用SELECT COUNT(*)来获得准确的数目。对于在INFORMATION_SCHEMA数 据库中的表,Rows值为NULL\u003c/p\u003e\n\u003cp\u003eAvg_row_length: \u003cstrong\u003e4749\u003c/strong\u003e (平均每行大小,这里是4.7K)\nData_length: \u003cstrong\u003e268352680\u003c/strong\u003e (该表总大小,单位字节)\nMax_data_length: \u003cstrong\u003e281474976710655\u003c/strong\u003e (该表可存储上限,这个值所有表都一样,换算出来是256TB,应该用不 …\u003c/p\u003e"
January 24, 2010
mysql中使用 MYSQLBINLOG 来恢复数据
"\u003cp\u003e今天在家里做了一下试验,终于搞明白了以前做复制的时候没有搞明白的问题。原来BINLOG就是一个记录SQL语句的过程,和普通的LOG一样。不过只是她是二进制存储,普通的是十进制存储罢了。\n1、配置文件里要写的东西:\n[mysqld]\nlog-bin=yueliangdao_binglog(名字可以改成自己的,如果不改名字的话,默认是以主机名字命名)重新启动MSYQL服务。\u003c/p\u003e\n\u003cp\u003e二进制文件里面的东西显示的就是执行所有语句的详细记录,当然一些语句不被记录在内,要了解详细的,见手册页。2、查看自己的BINLOG的名字是什么。\nshow binlog events;\u003c/p\u003e\n\u003ch3 id=\"query-result1-records\"\u003equery result(1 records)\u003c/h3\u003e\n\u003cp\u003eLog_name\u003c/p\u003e\n\u003cp\u003ePos\u003c/p\u003e\n\u003cp\u003eEvent_type\u003c/p\u003e\n\u003cp\u003eServer_id\u003c/p\u003e\n\u003cp\u003eEnd_log_pos\u003c/p\u003e\n\u003cp\u003eInfo\u003c/p\u003e\n\u003cp\u003eyueliangdao_binglog.000001\u003c/p\u003e\n\u003cp\u003e4\u003c/p\u003e\n\u003cp\u003eFormat_desc\u003c/p\u003e\n\u003cp\u003e1\u003c/p\u003e\n\u003cp\u003e106\u003c/p\u003e\n\u003cp\u003eServer ver: 5.1.22-rc-community-log, Binlog ver: 4\u003c/p\u003e\n\u003cp\u003e3、我做了几次操作后,她就记录了下来。\u003c/p\u003e\n\u003cp\u003e又一次 show binlog events 的结果。 …\u003c/p\u003e"
January 24, 2010
mysql优化数据库对象
"\u003cp\u003e\u003cstrong\u003e12.1优化表的数据类型\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e表需要使用何种数据类型,是需要根据应用来判断的。虽然应用设计的时候需要考虑字段的长度留有一定的冗余,但是不推荐让很多字段都留有大量的冗余,这样即浪费存储也浪费内存。\u003c/p\u003e\n\u003cp\u003e我们可以使用PROCEDUREANALYSE()对当前已有应用的表类型的判断,该函数可以对数据表中的列的数据类型提出优化建议,可以根据应用的实际情况酌情考虑是否实施优化。\u003c/p\u003e\n\u003cp\u003e语法:\u003c/p\u003e\n\u003cp\u003eSELECT * FROM tbl_name PROCEDURE ANALYSE();SELECT * FROM tbl_name PROCEDURE ANALYSE(16,256);\u003c/p\u003e\n\u003cp\u003e输出的每一列信息都会对数据表中的列的数据类型提出优化建议。第二个例子告诉PROCEDUREANALYSE()不要为那些包含的值多于16个或者256字节的ENUM类型提出建议。如果没有这样的限制,输出信息可能很长;ENUM定义通常很难阅读。\u003c/p\u003e\n\u003cp\u003e在对字段类型进行优化时,可以根据统计信息并结合应用的实际情况对其进行优化。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e12.2通过拆分,提高表的访问效率这里我们所说的拆分,主要是针对Myisam类型的表,拆分的方法可以分成两种情况:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1. 纵 …\u003c/strong\u003e\u003c/p\u003e"
January 24, 2010
mysql的默认查询优先还是更新(insert、update、delete)优先关系
"\u003cp\u003eMySQL还允许改变语句调度的优先级,它可以使来自多个客户端的查询更好地协作,这样单个客户端就不会由于锁定而等待很长时间。改变优先级还可以确保特定类型的查询被处理得更快。\u003c/p\u003e\n\u003cp\u003e我们首先应该确定应用的类型,判断应用是以查询为主还是以更新为主的,是确保查询效率还是确保更新的效率,决定是查询优先还是更新优先。\u003c/p\u003e\n\u003cp\u003e下面我们提到的改变调度策略的方法主要是针对Myisam存储引擎的,对于Innodb存储引擎,语句的执行是由获得行锁的顺序决定的。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eMySQL的默认的调度策略可用总结如下:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e写入操作优先于读取操作。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e对某张数据表的写入操作某一时刻只能发生一次,写入请求按照它们到达的次序来处理。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e对某张数据表的多个读取操作可以同时地进行。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eMySQL提供了几个语句调节符,允许你修改它的调度策略:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eLOW_PRIORITY关键字应用于DELETE、INSERT、LOADDATA、REPLACE和UPDATE。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHIGH_PRIORITY关键字应用于SELECT和INSERT语句。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDELAYED关键字应用于INSERT和REPLACE语句。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e如果写入操作是一 …\u003c/p\u003e"
January 24, 2010
用mysql中的join来优化查询
"\u003cp\u003eMysql4.1开始支持SQL的子查询。这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的SQL操作,同时也可以避免事务或者表锁死,并且写起来也很容易。但是,有些情况下,子查询可以被更有效率的连接(JOIN).. 替代。\u003c/p\u003e\n\u003cp\u003e假设我们要将所有没有订单记录的用户取出来,可以用下面这个查询完成:\u003c/p\u003e\n\u003cp\u003eSELECT * FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo)\u003c/p\u003e\n\u003cp\u003e如果使用连接(JOIN)..来完成这个查询工作,速度将会快很多。尤其是当salesinfo 表中对CustomerID建有索引的话,性能将会更好,查询如下:\u003c/p\u003e\n\u003cp\u003eSELECT * FROM customerinfo\nLEFT JOIN salesinfo ON customerinfo.CustomerID=salesinfo.CustomerID\nWHERE salesinfo.CustomerID IS NULL\u003c/p\u003e\n\u003cp\u003e连 …\u003c/p\u003e"
January 24, 2010
在mysql中对order by的字段进行优化
"\u003cp\u003e在某些情况中,MySQL可以使用一个索引来满足ORDER BY子句,而不需要额外的排序。where条件和order by使用相同的索引,并且order by的顺序和索引顺序相同, 并且order by的字段都是升序或者都是降序。\u003c/p\u003e\n\u003cp\u003e例如:下列sql可以使用索引。\u003c/p\u003e\n\u003cp\u003eSELECT * FROM t1 ORDER BY key_part1,key_part2,…;\u003c/p\u003e\n\u003cp\u003eSELECT * FROM t1 WHERE key_part1=1 ORDER BY key_part1 DESC,key_part2 DESC;\u003c/p\u003e\n\u003cp\u003eSELECT * FROM t1 ORDER BY key_part1 DESC,key_part2 DESC;\u003c/p\u003e\n\u003cp\u003e**但是以下情况不使用索引: **\u003c/p\u003e\n\u003cp\u003eSELECT * FROM t1 ORDER BY key_part1 DESC,key_part2 ASC;\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e–orderby的字段混合ASC和DESC\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e**\n**\u003c/p\u003e\n\u003cp\u003eSELECT * FROM t1 WHERE key2=constant ORDER BY key1;\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e–用于查询行的关键字与ORDERBY中所使用的不相同\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e**\n** …\u003c/p\u003e"
January 24, 2010
mysql优化一般步聚(教程)
"\u003cp\u003e\u003cstrong\u003e1.1优化SQL的一般步骤\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e11.1.1\u003c/strong\u003e \u003cstrong\u003e通过show status和应用特点了解各种SQL的执行频率\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e通过SHOW STATUS可以提供服务器状态信息,也可以使用mysqladminextended- status命令获得。SHOW STATUS可以根据需要显示session级别的统计结果和global 级别的统计结果。\u003c/p\u003e\n\u003cp\u003e以下几个参数对Myisam和Innodb存储引擎都计数:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eCom_select 执行select操作的次数,一次查询只累加1;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCom_insert执行insert操作的次数,对于批量插入的insert操作,只累加一次;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCom_update执行update操作的次数;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCom_delete 执行delete操作的次数;\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e以下几个参数是针对Innodb存储引擎计数的,累加的算法也略有不同:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eInnodb_rows_read select查询返回的行数;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eInnodb_rows_inserted执行Insert操作插入的行数;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eInnodb_rows_updated执行update操作更新的行数; …\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e"
January 24, 2010
mysql数据库开发需要注意的问题
"\u003cp\u003e\u003cstrong\u003e10.1数据库名、表名大小写问题\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在MySQL中,数据库对应数据目录中的目录。数据库中的每个表至少对应数据库目录中的一个文件(也可能是多个,取决于存储引擎)。因此,所使用操作系统的大小写敏感性决定了数据库名和表名的大小写敏感性。这说明在大多数Unix中数据库名和表名对大小写敏感,而在Windows中对大小写不敏感。一个显著的例外情况是MacOSX,它基于Unix但使用默认文件系统类型(HFS+),对大小写不敏感。然而,MacOSX也支持UFS卷,该卷对大小写敏感,就像Unix一样。\u003c/p\u003e\n\u003cp\u003e注释:尽管在某些平台中数据库名和表名对大小写不敏感,不应在同一查询中使用不同的大小写来引用给定的数据库或表。下面的查询不会工作,因为它同时引用了表my_tables和as\nMY_tables:mysql\u0026gt;SELECT* FROMmy_tableWHERE MY_TABLE.col=1;列、索引、存储子程序和触发器名在任何平台上对大小写不敏感,列的别名也不敏感。\u003c/p\u003e\n\u003cp\u003e默认情况,表别名在Unix中对大小写敏感,但在Windows或MacOSX中对大小写不敏感。\u003c/p\u003e\n\u003cp\u003e下面的查询在Unix中不会工作,因为它同时引用了 …\u003c/p\u003e"
January 22, 2010
mysql字符集的设置
"\u003cp\u003emysql 的字符集和校对规则有 4 个级别的默认设置:\u003cstrong\u003e服务器级、数据库级、表级\u003c/strong\u003e 和 \u003cstrong\u003e字段级\u003c/strong\u003e。分别在不同的地方设置,作用也不相同。服务器字符集和校对,在 mysql 服务启动的时候确定。\u003c/p\u003e\n\u003cp\u003e可以在 \u003cstrong\u003emy.cnf\u003c/strong\u003e 中设置:\n[mysqld]\n\u003cstrong\u003edefault-character-set=utf8\u003c/strong\u003e\n或者在启动选项中指定:\n\u003cstrong\u003emysqld –default-character-set=utf8\u003c/strong\u003e\n或者在编译的时候指定:\n./configure –with-charset=utf8\n如果没有特别的指定服务器字符集,默认使用 latin1 作为服务器字符集。上面三种 设置的方式都只指定了字符集,没有指定校对规则,这样是使用该字符集默认的校对规则, 如果要使用该字符集的非默认校对规则,则需要在指定字符集的同时指定校对规则。\n可以用 show variables like ‘character_set_server’; 命令查询当前服务器的字符集和校对规则。\u003c/p\u003e"
January 21, 2010
查看mysql中表的创建日期
"\u003cp\u003eshow table status\u003c/p\u003e\n\u003cp\u003e通过show table status where name =’表名’; 可以查看指定表的信息\u003c/p\u003e"
January 8, 2010
MySQL优化篇-查询优化
"\u003cp\u003e可以参考一下官方文档中的解释。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://dev.mysql.com/doc/refman/5.1/zh/optimization.html\"\u003ehttp://dev.mysql.com/doc/refman/5.1/zh/optimization.html\u003c/a\u003e\u003c/p\u003e\n\u003col start=\"7\"\u003e\n\u003cli\u003e优化\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e7.1. 优化概述\u003c/p\u003e\n\u003cp\u003e7.1.1. MySQL设计局限与折衷\u003c/p\u003e\n\u003cp\u003e7.1.2. 为可移植性设计应用程序\u003c/p\u003e\n\u003cp\u003e7.1.3. 我们已将MySQL用在何处?\u003c/p\u003e\n\u003cp\u003e7.1.4. MySQL基准套件\u003c/p\u003e\n\u003cp\u003e7.1.5. 使用自己的基准\u003c/p\u003e\n\u003cp\u003e7.2. 优化SELECT语句和其它查询\u003c/p\u003e\n\u003cp\u003e7.2.1. EXPLAIN语法(获取SELECT相关信息)\u003c/p\u003e\n\u003cp\u003e7.2.2. 估计查询性能\u003c/p\u003e\n\u003cp\u003e7.2.3. SELECT查询的速度\u003c/p\u003e\n\u003cp\u003e7.2.4. MySQL怎样优化WHERE子句\u003c/p\u003e\n\u003cp\u003e7.2.5. 范围优化\u003c/p\u003e\n\u003cp\u003e7.2.6. 索引合并优化\u003c/p\u003e\n\u003cp\u003e7.2.7. MySQL如何优化IS NULL\u003c/p\u003e\n\u003cp\u003e7.2.8. MySQL如何优化DISTINCT\u003c/p\u003e\n\u003cp\u003e7.2.9. MySQL如何优化LEFT JOIN和RIGHT JOIN\u003c/p\u003e\n\u003cp\u003e7.2.10. MySQL如何优化嵌套Join\u003c/p\u003e\n\u003cp\u003e7.2.11. MySQL如何简化外部联合\u003c/p\u003e\n\u003cp\u003e7.2.12. MySQL如何优化ORDER BY\u003c/p\u003e\n\u003cp\u003e7.2.13. MySQL如何优化GROUP BY …\u003c/p\u003e"
January 6, 2010
MySQL远程访问时非常慢的解决办法
"\u003cp\u003e法一:\u003c/p\u003e\n\u003cp\u003e先是上网找了一下资料,说是MYSQL会反查DNS,比较烦人的,2楼写上网上搜索到的资料(有弊端),先说一下我的处理办法\u003c/p\u003e\n\u003cp\u003e今天有两个网站(A站和B站),程序一样,分别放在两台服务器,数据库放在A站,B站程序的数据库连接,指向A站IP\u003c/p\u003e\n\u003cp\u003e但是访问B站的时候,速度奇慢,这两台服务器还都在同一机房,应该属于局域网,查到资料说是MYSQL对DNS进行反查,这样也好办,我只有这一个站需要远程访问MYSQL,设置一下HOSTS文件,不让A站(数据库服务器端)反查DNS就行了\u003c/p\u003e\n\u003cp\u003e修改c:\\windows\\system32\\drivers\\etc\\hosts文件\u003c/p\u003e\n\u003cp\u003e添加\u003c/p\u003e\n\u003cp\u003eB站IP B站域名\u003c/p\u003e\n\u003cp\u003e这样就避免A站(数据库服务器端)不再反查DNS,刷新页面,快了N倍,呵呵,如果按2楼的方法修改,是一劳永逸的,适合有很多站需要远程访问,比如卖空间的,但是有弊端,就是以后就不能再使用主机名连接MYSQL了,具体介绍看2楼\u003c/p\u003e\n\u003cp\u003e=========================================\u003c/p\u003e\n\u003cp\u003e法二:\u003c/p\u003e\n\u003cp\u003e服务器放在局域网内进行测试时,数据库的访问速度还是很快。但当服务器放到外网后,数据库的访问速度就变 …\u003c/p\u003e"
January 6, 2010
MySQL数据库中的REPAIR TABLE语法介绍
"\u003cp\u003eREPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE\n[pre] tbl_name[,tbl_name] … [QUICK] [EXTENDED] [USE_FRM]\u003c/p\u003e\n\u003cp\u003eREPAIR TABLE用于修复被破坏的表。默认情况下,REPAIR TABLE与 myisamchk –recovertbl_name具有相同的效果。REPAIR TABLE对MyISAM和ARCHIVE表起作用。 通 常,您基本上不必运行此语句。但是,如果灾难发生,REPAIR TABLE很有可能从MyISAM表中找回所有数据。如果您的表经常被破坏,您应该尽力 找到原因,以避免使用REPAIR TALBE。请参见A.4.2节,“如果MySQL依然崩溃,应作些什么”。同时也见15.1.4节,“MyISAM 表方面的问题”。\n本语句会返回一个含有以下列的表:\n\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/20094147086.jpg\" alt=\"20094147086\"\u003e\u003c/p\u003e\n\u003cp\u003e对 于每个被修复的表,REPAIR TABLE语句会产生多行的信息。上一行含有一个Msg_type状态值。Msg_test通常应为OK。如果您没有得 到OK,您应该尝试使用myisamchk –safe-recover修复表,因 …\u003c/p\u003e"
January 6, 2010
mysql高级管理命令
"\u003cp\u003e检查表: CHECKTABLE`tablename1`[,`tablename2`]\u003c/p\u003e\n\u003cp\u003e优化表: OPTIMIZE TABLE `tablename1` [, `tablename2`]\u003c/p\u003e\n\u003cp\u003e修复表: REPAIR TABLE `tablename1` [, `tablename2`]\u003c/p\u003e\n\u003cp\u003e分析表: ANALYZE TABLE `tablename1` [, `tablename2`]\u003c/p\u003e"
January 6, 2010
MySQL基本命令总结
"\u003cp\u003e测试环境:mysql 5.0.45\n【注:可以在mysql中通过mysql\u0026gt; SELECT VERSION();来查看数据库版本】\u003c/p\u003e\n\u003cp\u003e一、连接MYSQL。\u003c/p\u003e\n\u003cp\u003e格式: mysql -h主机地址 -u用户名 -p用户密码\u003c/p\u003e\n\u003cp\u003e1、连接到本机上的MYSQL。\u003c/p\u003e\n\u003cp\u003e首先打开DOS窗口,然后进入目录mysql\\bin,再键入命令mysql -u root -p,回车后提示你输密码.注意用户名前可以有空格也可以没有空格,但是密码前必须没有空格,否则让你重新输入密码.\u003c/p\u003e\n\u003cp\u003e如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是: mysql\u0026gt;\u003c/p\u003e\n\u003cp\u003e2、连接到远程主机上的MYSQL。假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123。则键入以下命令:\u003c/p\u003e\n\u003cp\u003emysql -h110.110.110.110 -u root -p 123;(注:u与root之间可以不用加空格,其它也一样)\u003c/p\u003e\n\u003cp\u003e3、退出MYSQL命令: exit (回车)\u003c/p\u003e\n\u003cp\u003e二、修改密码。\u003c/p\u003e\n\u003cp\u003e格式:mysqladmin -u用户名 -p旧密码 password 新密 …\u003c/p\u003e"
December 28, 2009
MYSQL开启错误日志的方法
"\u003cp\u003emysql有以下几种日志:\n错误日志: -log-err\n查询日志: -log\n慢查询日志: -log-slow-queries\n更新日志: -log-update\n二进制日志: -log-bin\u003c/p\u003e\n\u003cp\u003e在mysql的安装目录下,打开my.ini,在后面加上上面的参数,保存后重启mysql服务就行了。\n例如:\n#Enter a name for the binary log. Otherwise a default name will be used.\n\u003cstrong\u003e#log-bin=\u003c/strong\u003e\n#Enter a name for the query log file. Otherwise a default name will be used.\n\u003cstrong\u003e#log=\u003c/strong\u003e\n#Enter a name for the error log file. Otherwise a default name will be used. …\u003c/p\u003e"
December 28, 2009
修改mysql数据库编码
"\u003cp\u003e修改my.ini文件\u003c/p\u003e\n\u003cp\u003e加上\u003c/p\u003e\n\u003cp\u003edefault-character-set=gb2312\u003c/p\u003e\n\u003cp\u003e设定数据库字符集\u003c/p\u003e\n\u003cp\u003ealter database da_name default character set ‘charset’\u003c/p\u003e\n\u003cp\u003e1)设置数据库编码 /etc/my.cnf\n[mysqld]\ndefault-character-set=gbk\n…\n[client]\ndefault-character-set=gbk\n---------------------------------------\n2)按字符集导出\n$mysqldump -u root -p dbname –default-character-set=gbk \u0026gt; a.sql;\n3)查看SQL文件的编码\n[root@localhost gethtml]# file a.sql\na.sql: UTF-8 Unicode …\n[root@localhost gethtml]# iconv -f utf-8 -t gbk a.sql \u0026gt; a2.sql\n[root@localhost gethtml]# file a2.sql …\u003c/p\u003e"
December 11, 2009
mysql中的分区概念
"\u003cp\u003e\u003cstrong\u003e目录\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://dev.mysql.com/doc/refman/5.1/zh/partitioning.html#partitioning-overview\"\u003e18.1. MySQL中的分区概述\u003c/a\u003e\u003ca href=\"http://dev.mysql.com/doc/refman/5.1/zh/partitioning.html#partitioning-types\"\u003e18.2. 分区类型\u003c/a\u003e\u003ca href=\"http://dev.mysql.com/doc/refman/5.1/zh/partitioning.html#partitioning-range\"\u003e18.2.1. RANGE分区\u003c/a\u003e\u003ca href=\"http://dev.mysql.com/doc/refman/5.1/zh/partitioning.html#partitioning-list\"\u003e18.2.2. LIST分区\u003c/a\u003e\u003ca href=\"http://dev.mysql.com/doc/refman/5.1/zh/partitioning.html#partitioning-hash\"\u003e18.2.3. HASH分区\u003c/a\u003e\u003ca href=\"http://dev.mysql.com/doc/refman/5.1/zh/partitioning.html#partitioning-key\"\u003e18.2.4. KEY分区\u003c/a\u003e\u003ca href=\"http://dev.mysql.com/doc/refman/5.1/zh/partitioning.html#partitioning-subpartitions\"\u003e18.2.5. 子分区\u003c/a\u003e\u003ca href=\"http://dev.mysql.com/doc/refman/5.1/zh/partitioning.html#partitioning-handling-nulls\"\u003e18.2.6. MySQL分区处理NULL值的方式\u003c/a\u003e\u003ca href=\"http://dev.mysql.com/doc/refman/5.1/zh/partitioning.html#partitioning-management\"\u003e18.3. 分区管理\u003c/a\u003e\u003ca href=\"http://dev.mysql.com/doc/refman/5.1/zh/partitioning.html#partitioning-management-range-list\"\u003e18.3.1. RANGE和LIST分区的管理\u003c/a\u003e\u003ca href=\"http://dev.mysql.com/doc/refman/5.1/zh/partitioning.html#partitioning-management-hash-key\"\u003e18.3.2. HASH和KEY分区的管理\u003c/a\u003e\u003ca href=\"http://dev.mysql.com/doc/refman/5.1/zh/partitioning.html#partitioning-maintenance\"\u003e18.3.3. 分区维护\u003c/a\u003e\u003ca href=\"http://dev.mysql.com/doc/refman/5.1/zh/partitioning.html#partitioning-info\"\u003e18.3.4. 获取关于分区的信息\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e本章讨论MySQL 5.1.中实现的分区。关于分区和分区概念的介绍可以在\u003ca href=\"http://dev.mysql.com/doc/refman/5.1/zh/partitioning.html#partitioning-overview\" title=\"18.1. Overview of Partitioning in MySQL\"\u003e18.1节,“MySQL中的分区概述”\u003c/a\u003e中找到。MySQL 5.1 支持哪几种类型的分区,在\u003ca href=\"http://dev.mysql.com/doc/refman/5.1/zh/partitioning.html#partitioning-types\" title=\"18.2. Partition Types\"\u003e18.2节,“分区类型”\u003c/a\u003e 中讨论。关于子分区在\u003ca href=\"http://dev.mysql.com/doc/refman/5.1/zh/partitioning.html#partitioning-subpartitions\" title=\"18.2.5. Subpartitioning\"\u003e18.2.5节,“子分区”\u003c/a\u003e 中讨论。现有分区表中分区的增加、删除和修改的方法在\u003ca href=\"http://dev.mysql.com/doc/refman/5.1/zh/partitioning.html#partitioning-management\" title=\"18.3. Partition Management\"\u003e18.3节,“分区管理”\u003c/a\u003e 中介绍。 和分区表一同使用的表维护命令在\u003ca href=\"http://dev.mysql.com/doc/refman/5.1/zh/partitioning.html#partitioning-maintenance\" title=\"18.3.3. Maintenance of Partitions\"\u003e18.3.3节,“分区维护”\u003c/a\u003e 中介绍。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e请注意\u003c/strong\u003e:MySQL 5.1中的分区实现仍然很新(pre-alpha品质),此时还不是可生产的(not production-ready)。 同样,许多也适用于本章:在这里描述的一些功能还没有实际上 …\u003c/p\u003e"
December 11, 2009
升级 MySQL
"\u003cp\u003e\u003cstrong\u003e1、概述\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e通常,从一个发布版本升级到另一个版本时,我们建议按照顺序来升级版本。例如,想要升级 MySQL 3.23 时,先升级到 MySQL 4.0,而不是直接升级到 MySQL 4.1 或 MySQL 5.0。\u003c/p\u003e\n\u003cp\u003e以下是在升级 MySQL 时需要注意的事项:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e仔细阅读一下升级的目标版本的新特性和改变的特性,以及2个版本之间的不同特性\u003c/li\u003e\n\u003cli\u003e升级前一定要备份所有的数据\u003c/li\u003e\n\u003cli\u003e如果是在Windows平台上升级MySQL,请阅读附录 “\u003ca href=\"http://imysql.cn/node/74#upgrade_on_ms\"\u003e在Windows平台上升级MySQL\u003c/a\u003e“\u003c/li\u003e\n\u003cli\u003e有些不同版本间的升级可能会涉及对授权表的修改,请尤其注意这个问题,详情请阅读附录 “\u003ca href=\"http://imysql.cn/node/74#upgrade_grants_table\"\u003e升级授权表\u003c/a\u003e“\u003c/li\u003e\n\u003cli\u003e如果正在运行着同步,请阅读附录 “\u003ca href=\"http://imysql.cn/node/74#upgrade_replication\"\u003e升级同步\u003c/a\u003e“\u003c/li\u003e\n\u003cli\u003e如果之前运行着MySQL-Max发布版本,想要升级到非MySQL-Max发布版本时,就需要从 mysqld_safe 去掉启动 mysqld-max 服务器的参数\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e在同一个发布系列版本的MySQL间,可以随意拷贝格式文件和数据文件。如果在MySQL运行过程中改变了字符集,就需要对每个MyISAM表执行 “ \u003cstrong\u003emyisamchk -r -q –set-character-set= …\u003c/strong\u003e\u003c/p\u003e"
November 5, 2009
MySQL 同步常见问题
"\u003ch1 id=\"6-mysql-同步\"\u003e\u003ca href=\"javascript:void(0);\"\u003e6 MySQL 同步\u003c/a\u003e\u003c/h1\u003e\n\u003cp\u003e同步功能在MySQL 3.23.15就开始引进了,它可以把一个MySQL服务器上的数据复制到另一个服务器上去。本章描述了MySQL的各种复制特性。介绍了同步的概念,如何设置同步服务器,以及可用服务器的参照。还提供了一系列的常见问题及其答案,疑难解答。\u003c/p\u003e\n\u003cp\u003e“\u003ca href=\"javascript:void(0);\"\u003e14.6 Replication Statements\u003c/a\u003e“中介绍了同步相关的SQL语句语法。\u003c/p\u003e\n\u003cp\u003e我们建议经常访问”\u003ca href=\"javascript:void(0);\"\u003ehttp://www.mysql.com\u003c/a\u003e“经常阅读本章的最新内容。同步功能一直在改进,我们经常把这部分的手册更新到当前的最新内容。\u003c/p\u003e\n\u003ch2 id=\"61-同步介绍\"\u003e\u003ca href=\"javascript:void(0);\"\u003e6.1 同步介绍\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMySQL 3.23.15及更高的版本支持单向同步。一个服务器作为master(主服务器),一个或者多个服务器作为slave(从服务器)。master服务器 把更新的内容写到二进制日志(binary log或binlog)中,并且维护了一个索引文件来记录日志循环的情况。这些日志中的更新部分会被发送到slave服务器。一个slave连接到 master之后,它通知master最后一次成功增量更新的日志位置。slave会找出所有从那个时刻开始的更新操作,然后阻塞并 …\u003c/p\u003e"
November 2, 2009
(精典教程)在MySql上实现Replication(Master 与 Slave 数据同步)
"\u003cp\u003eMaster: 192.168.1.200\nslave: 192.168.1.201\u003c/p\u003e\n\u003cp\u003e1: 首先确定Master和Slave的数据库版本,Master数据库的版本不能高于Slave数据的版本。\u003c/p\u003e\n\u003cp\u003e这里我是使用MySql 5.0.27 作为Master数据库,MySql 6.0.3(alpha)作为Slave进行测试。\u003c/p\u003e\n\u003cp\u003e2:首先在Master数据库的配置文件my.ini (windows)里添加log-bin 和 server-id 两项\u003c/p\u003e\n\u003cp\u003eeg: [mysqld]\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eserver-id = 1 //服务器编号\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003elog-bin = mysql-bin //使用的二进制日志文件名\nbinlog-do-db=test = maindb //同步的数据库(不记录二进制日志)\u003c/strong\u003e\n\u003cstrong\u003ebinlog-ignore-db=bbs\u003c/strong\u003e \u003cstrong\u003e//不允许同步的数据库(不记录二进制日志)\u003c/strong\u003e\n\u003cstrong\u003ebinlog-ignore-db=ceshi //不允许同步的数据库库(不记录二进制日志)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在Slave数据库的配置文件my.ini里添加server-id 项\u003c/p\u003e\n\u003cp\u003eeg:[mysqld]\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eserver-id = 2\n** …\u003c/strong\u003e\u003c/p\u003e"
October 15, 2009
mysql中查询后记录集的排序问题
"\u003cp\u003e在mysql上一般的查询要么是按一个字段的升序,要么按降序进行排序,如果实现根据条件里值的左右顺序来显示记录呢,如 where id in (3,1,5,2)此类的,查询出来的记录从上到下也是(3,1,5,2)这类的顺序了,可以用以下语句来实现:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eSELECT * FROM documents WHERE id IN (3,5,7) ORDER BY FIELD(id,3,5,7)\n\u003c/code\u003e\u003c/pre\u003e"
August 28, 2009
mysql中显示当前使用的数据库名称
"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emysql\u0026gt; select database();\n+------------+\n| database() |\n+------------+\n| csdn |\n+------------+\n1 row in set (0.00 sec)\n\nmysql\u0026gt; SELECT * FROM information_schema.SCHEMATA where schema_name=\u0026#39;csdn\u0026#39;;\n+--------------+-------------+----------------------------+------------------------+----------+\n| CATALOG_NAME | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH | …\u003c/code\u003e\u003c/pre\u003e"
August 24, 2009
MySQL中UNION和UNION ALL的区别
"\u003cp\u003e在数据库中,UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eMySQL中的UNION\u003c/strong\u003e\nUNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ccode\u003eselect * from gc_dfys union select * from ls_jg_dfys\u003c/code\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eMySQL中的UNION ALL\u003c/strong\u003e\n而UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。\n从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL,如下:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ccode\u003eselect * from gc_dfys union all select * from …\u003c/code\u003e\u003c/p\u003e\u003c/blockquote\u003e"
June 27, 2009
解决Default storage engine (InnoDB) is not available导致mysql无法启动的
"\u003cp\u003e一次为了修改mysql的root用户密码,就启用了本机启动模式,可再次启用mysql时,却揭示:Default storage engine (InnoDB) is not available ,mysql无法启动,后搜索网络,得知应该是配置文件有错,这里提示:“060827 1:12:22 [ERROR] Default storage engine (InnoDB) is not available”\n打开my.ini或my.cnf文件,找到default-storage-engine这一行,把它改成default-storage-engine=MyISAM。\u003c/p\u003e"
June 26, 2009
MySQL特异功能之:Impossible WHERE noticed after reading const tables
"\u003cp\u003e用EXPLAIN看MySQL的执行计划时经常会看到Impossible WHERE noticed after reading const tables这句话,意思是说MySQL通过读取“const tables”,发现这个查询是不可能有结果输出的。比如对下面的表和数据:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e create table t (a int primary key, b int) engine = innodb;\n insert into t values(1, 1);\n insert into t values(3, 1);\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e执行“EXPLAIN select * from t where a = 2”时就会输出“Impossible WHERE noticed after reading const tables”。\u003c/p\u003e\n\u003cp\u003e不 明白所谓的“const tables”是什么意思,对MySQL在查询优化时竟然可以发现一个查询不可能输出结果更是感觉不可思议。按数据库中“传统”的做法,查询优化时只会访 问模式定义和统计信息,而据我所知,数据库中使用的各种统计信息如EquiDepth、MaxDiff柱状图,MCV, …\u003c/p\u003e"
June 23, 2009
mysqlbinlog:用于处理二进制日志文件的实用工具
"\u003ch2 id=\"服务器生成的二进制日志文件写成二进制格式要想检查这些文本格式的文件应使用mysqlbinlog实用工具\"\u003e服务器生成的二进制日志文件写成二进制格式。要想检查这些文本格式的文件,应使用mysqlbinlog实用工具。\u003c/h2\u003e\n\u003cp\u003e应这样调用mysqlbinlog:shell\u0026gt; \u003cstrong\u003emysqlbinlog [options] \u003cem\u003elog-files\u003c/em\u003e…\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e例如,要想显示二进制日志binlog.000003的内容,使用下面的命令:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eshell\u0026gt; mysqlbinlog binlog.0000003\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e输出包括在binlog.000003中包含的所有语句,以及其它信息例如每个语句花费的时间、客户发出的线程ID、发出线程时的时间戳等等。\u003c/p\u003e\n\u003cp\u003e通常情况,可以使用\u003cstrong\u003emysqlbinlog\u003c/strong\u003e直接读取二进制日志文件并将它们用于本地MySQL服务器。也可以使用–read-from-remote-server选项从远程服务器读取二进制日志。\u003c/p\u003e\n\u003cp\u003e当读取远程二进制日志时,可以通过连接参数选项来指示如何连接服务器,但它们经常被忽略掉,除非你还指定了–read-from-remote-server选项。这些选项是–host、–password、–port、–protocol、–socket和–user。\u003c/p\u003e\n\u003cp\u003e还可以使用\u003cstrong\u003emysqlbinlog\u003c/strong\u003e来读取 …\u003c/p\u003e"
June 23, 2009
MYSQL慢速(SLOW LOG)脚本分析
"\u003cp\u003emysql有一个功能就是可以log下来运行的比较慢的sql语句,默认是没有这个log的,为了开启这个功能,\n要修改my.cnf或者在mysql启动的时候加入一些参数。如果在my.cnf(Windows为my.ini文件)里面修改,需增加如下几行\u003c/p\u003e\n\u003cp\u003e`long_query_time = 1\u003c/p\u003e\n\u003cp\u003elog-slow-queries = /var/youpath/slow.log\u003c/p\u003e\n\u003cp\u003elog-queries-not-using-indexes`\u003c/p\u003e\n\u003cp\u003elong_query_time 是指执行超过多久的sql会被log下来,这里是1秒。\nlog-slow-queries 设置把日志写在那里,可以为空,系统会给一个缺省的文件host_name-slow.log,\nlog-queries-not-using-indexes 就是字面意思,log下来没有使用索引的query。\u003c/p\u003e\n\u003cp\u003emysql有以下几种日志:\n\u003cstrong\u003e错误日志: -log-err\n查询日志: -log\n慢查询日志: -log-slow-queries\n更新日志: -log-update\n二进制日志: -log-bin\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e把上述参数打开,运 …\u003c/p\u003e"
June 19, 2009
详细讲解MySQL数据库双机热备的配置方法
"\u003cp\u003eMySQL数据库双机热备的配置方法:\u003c/p\u003e\n\u003cp\u003e◆1.MySQL数据库没有增量备份的机制,当数据量太大的时候备份是一个很大的问题。还好MySQL数据库提供了一种主从备份的机制,其实就是把主数据库的所有的数据同时写到备份数据库中。实现MySQL数据库的热备份。\u003c/p\u003e\n\u003cp\u003e◆2.要想实现双机的热备首先要了解主从数据库服务器的版本的需求。要实现热备MySQL的版本都要高于3.2,还有一个基本的原则就是作为从数据库的数据库版本可以高于主服务器数据库的版本,但是不可以低于主服务器的数据库版本。\u003c/p\u003e\n\u003cp\u003e◆3.设置主数据库服务器:\u003c/p\u003e\n\u003cp\u003e·a.首先查看主服务器的版本是否是支持热备的版本。然后查看my.cnf(类 unix)或者my.ini(windows)中mysqld配置块的配置有没有log-bin(记录数据库更改日志),因为MySQL的复制机制是基于 日志的复制机制,所以主服务器一定要支持更改日志才行。然后设置要写入日志的数据库或者不要写入日志的数据库。这样只有您感兴趣的数据库的更改才写入到数 据库的日志中。\u003c/p\u003e\n\u003cp\u003eserver-id=1 //数据库的id这个应该默认是1就不用改动\u003c/p\u003e\n\u003cp\u003elog-bin=log_name //日志文件的名 …\u003c/p\u003e"
June 18, 2009
Changed limits: max_open_files: 2048 max_connections: 1024 table_cache: 507
"\u003cp\u003eChanged limits: max_open_files: 2048 max_connections: 1024 table_cache: 507\u003c/p\u003e\n\u003cp\u003e这个问题怎么解决啊!\u003c/p\u003e\n\u003cp\u003e在windows下安装Mysql系统日志出现 max_open_files: 2048 max_connections: 510 table_cache: 764 类似错误是因为 \u003cstrong\u003emax_connections\u003c/strong\u003e 最大连接数和\u003cstrong\u003emax_open_files\u003c/strong\u003e、\u003cstrong\u003etable_cache\u003c/strong\u003e 不匹配。适当的降低max_connections 或调整其他两个数值\n解决办法在 mysql bin \u0026gt; 中输入\nmysql-nt –table_cache=764\nmysql-nt –innodb_open_files=2048 即可!!\u003c/p\u003e\n\u003cp\u003etable_cache和max_connections 在my.ini 里可调\u003c/p\u003e\n\u003cp\u003eChanged limits:\nmax_open_files: 2048\nmax_connections: 1024\ntable_cache: 507\u003c/p\u003e\n\u003cp\u003emax_connections=1024 …\u003c/p\u003e"
June 18, 2009
MySql Query Cache 查询缓存介绍(1)
"\u003cp\u003eMySql Query Cache 和 Oracle Query Cache 是不同的, Oracle Query Cache 是缓存执行计划的,而MySql Query Cache 不缓存执行计划而是整个结果集。缓存整个结果集的好处不言而喻,但由于缓存的是结果集因此Query必须是完全一样的,这样带来的后果就是平均 Hit Rate 命中率一般不会太高。 Query Cache 对于一些小型应用程序或者数据表的数据量不大的情况下效果是最为明显的。\u003c/p\u003e\n\u003cp\u003e作为一个新的特性,MySql Query Cache 有什么特典和局限呢? 咱一个一个来说:\u003c/p\u003e\n\u003cp\u003e1、Cache 机制对应用程序是透明的。在应用程序中只是改变查询语句的语义,也能得到缓存中的查询结果集。如果你没有使用 query_cache_wlock_invalidate=ON 来提示MySql 锁表将要进行写操作,那么此时的查询即使表在锁Lock状态下或者预备更新的状态下,仍然可以从缓存中获得结果集;\u003c/p\u003e\n\u003cp\u003e2、只缓存整个查询结果集,即对子查询,内联视图和部分UNION的查询是不缓存的;\u003c/p\u003e\n\u003cp\u003e3、缓存机制工作在Packet 级别,第二项的只缓存 …\u003c/p\u003e"
June 18, 2009
MySQL 性能优化(show processlist中出现大量未认证的连接 建立连接缓慢 unauthenticated user)
"\u003cp\u003e症状:\nMySQL重启后,发现连接非常慢,建立连接后做普通操作还是非常快的,通过Show processlist发现大量unauthenticated user连接\u003c/p\u003e\n\u003cp\u003e解决办法:\nMySQL启动参数增加一个skip-name-resolve,即不启用DNS反响解析\u003c/p\u003e\n\u003cp\u003e解决过程(推荐学习 :))\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e同一局域网不同机器上连接MySQL服务器,观察响应速度;(非常慢)\u003c/li\u003e\n\u003cli\u003e连接建立后做一些简单的操作(非常快 和上面不符,说明不是服务器压力导致的)\u003c/li\u003e\n\u003cli\u003e通过tcpdump查看连接的时候详细的响应过程(能看到连接的时候和服务器的多次通讯及所耗费的时间)\u003c/li\u003e\n\u003cli\u003e发现正常响应很快,用户名、密码发送完后很长一段时间服务器才给响应\u003c/li\u003e\n\u003cli\u003e在服务器上进行同样的连接连接操作,试着分别用IP和机器名去连接看响应速度(看是不是IP解析的时候耗费时间了)\u003c/li\u003e\n\u003cli\u003e修改/etc/hosts文件,加入服务器、客户端的IP对应(没有作用 :()\u003c/li\u003e\n\u003cli\u003e增加启动参数skip-name-resolve速度立即加快了(问题解决)\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e原因:\nMySQL的认证实际上是user+host的形式(也就是说user可以相同),所以MySQL在处理新连接时会试着去解析客户端 …\u003c/p\u003e"
June 16, 2009
Mysql 常见错误集锦!
"\u003cp\u003e今天因为mysql服务没打开,mysql不能使用,以前从没出现这种服务没开启的问题。因为以前服务一直都是开的。\u003c/p\u003e\n\u003cp\u003e一开始以为是权限问题,因为错误提示里有‘localhost’权限的字样,于是狂改,还是一直有问题,网上的类似问题也都试了,都无效。\u003c/p\u003e\n\u003cp\u003e于是决定卸了,重装,但在千钧一发之际,经一哥们指点,发现是服务没开。我晕死……………………………………….\u003c/p\u003e\n\u003cp\u003e看来我的Windows操作也太薄弱了。\u003c/p\u003e\n\u003cp\u003e这不,搞了一天mysql的错误,于是总结如下:\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003e\u003cstrong\u003e\u003cstrong\u003e\u003cstrong\u003e\u003cstrong\u003e\u003cstrong\u003e\u003cstrong\u003e\u003cstrong\u003e\u003cstrong\u003e\u003cstrong\u003e\u003cstrong\u003e\u003cstrong\u003e\u003cstrong\u003eMysql 常见错误集锦\u003c/strong\u003e\u003c/strong\u003e\u003c/strong\u003e\u003c/strong\u003e\u003c/strong\u003e\u003c/strong\u003e\u003c/strong\u003e\u003c/strong\u003e\u003c/strong\u003e\u003c/strong\u003e\u003c/strong\u003e\u003c/strong\u003e\u003c/strong\u003e\u003c/em\u003e******\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1. Host ’…’ is blocked错误\u003c/strong\u003e\n如果你得到象这样的一个错误:\nHost ’hostname’ is blocked because of many connection errors.\nUnblock with ’mysqladmin flush-hosts’\u003c/p\u003e\n\u003cp\u003e这意味着,mysqld已经得到了大量(max_connect_errors)的主机’hostname’的在中途被中断了的连接请求。在max_connect_errors次失败请求后,mysqld认定出错了(象来字一个黑客的攻击),并且阻止该站 …\u003c/p\u003e"
June 16, 2009
MySQL内存管理、优化、查询缓存区
"\u003cp\u003e\u003cstrong\u003ebulk_insert_buffer_size = n\u003c/strong\u003e\n为一次插入多条新记录的INSERT命令分配的缓存区长度(默认设置是8M)。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ekey_buffer_size = n\u003c/strong\u003e\n用来存放索引区块的RMA值(默认设置是8M)。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ejoin_buffer_size = n\u003c/strong\u003e\n在参加JOIN操作的数据列没有索引时为JOIN操作分配的缓存区长度(默认设置是128K)。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emax_heap_table_size = n\u003c/strong\u003e\nHEAP数据表的最大长度(默认设置是16M); 超过这个长度的HEAP数据表将被存入一个临时文件而不是驻留在内存里。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emax_connections = n\u003c/strong\u003e\nMySQL服务器同时处理的数据库连接的最大数量(默认设置是100)。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003equery_cache_limit = n\u003c/strong\u003e\n允许临时存放在查询缓存区里的查询结果的最大长度(默认设置是1M)。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003equery_cache_size = n\u003c/strong\u003e\n查询缓存区的最大长度(默认设置是0,不开辟查询缓存区)。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003equery_cache_type = 0/1/2\u003c/strong\u003e\n查询缓存区的工作模式:0, 禁用查询缓存区; 1,启用查询缓存区(默认设置); 2,”按需分配”模式,只响 …\u003c/p\u003e"
June 16, 2009
根据status信息对MySQL服务器进行优化
"\u003cp\u003e网上有很多的文章教怎么配置MySQL服务器,但考虑到服务器硬件配置的不同,具体应用的差别,那些文章的做法只能作为初步设置参考,我们需要根据自己的情况进行配置优化,好的做法是MySQL服务器稳定运行了一段时间后运行,根据服务器的”状态”进行优化。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003emysql\u0026gt; show global status;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e可以列出MySQL服务器运行各种状态值,另外,查询MySQL服务器配置信息语句:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003emysql\u0026gt; show variables;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e一、慢查询\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emysql\u0026gt; show variables like \u0026#39;%slow%\u0026#39;;\n+------------------+-------+\n| Variable_name | Value |\n+------------------+-------+\n| log_slow_queries | ON |\n| slow_launch_time | 2 |\n+------------------+-------+\n\nmysql\u0026gt; show global status like …\u003c/code\u003e\u003c/pre\u003e"
May 27, 2009
"\u003cp\u003e字符串,恐怕应该算是MYSQL里面最复杂的类型了吧?几乎目前所有的问题,都是出在与字符有关的数据列上,大致有几种\n1、字符串的查询(以下如果不特指,都是指中文),搜索一个中文的时候,不管是模糊还是精确,往往结果都会有与搜索内容不一致的数据在里面\n2、编码,现在大家都知道MYSQL连接上后,先执行一下mysql_query(‘set names GBK’,$conn)这类的语句,从MYSQL4.0升级到4.1及以上版本的朋友在这上面吃的苦不少了。网上关于这类的提问也是最多的\n3、索引、效率,varchar是MYSQL所特有的字段,而且长度可变,char则是固定长度的字符串。\n在MYSQL所支持的几个字符串格式里面,char和varchar是用的最多的,char是定长字段,,也就是说,不管字符串的实际长度有多少,CHAR(10)将永远占用10个字节。字符串如果前端有空格,那么在存储的时候会自动被数据库去掉,相当于先执行trim($string),再进行存储,如果不满10个字节,将会采用空格填满,读取数据时,MYSQL会自动将这些空格去掉。看到这里,恐怕它的缺点之一就明显的暴露了,CHAR不 …\u003c/p\u003e"
May 26, 2009
mysql中自动修改数据表的设计(默许的数据列修改)
"\u003cp\u003e9.9.6 自动修改数据表的设计(默许的数据列修改)\u003c/p\u003e\n\u003cp\u003e在创建(create table)或修改(alter table)一个数据表的时候,MYSQL会在特定条件下对这个数据表的设计方案自动做出一些修改,其理由或者是那么做可以让数据表的效率更高,或者是设计思路MYSQL无法实现.\n这里要特别提醒那些从期货数据库系统迁移过来的读者注意:MYSQL在对数据表设计方案自动做出勤率修改时不会给出任何提示,所以一事实上要用SHOW CREATE TABLE命令去检查一下最终的数据表设计方案是不是所想像的样子。在下面的例子里。MYSQL自做主张地把一个CHAR(2)数据列改成了一个VARCHAR(20)数据列,还给那两个数据列加上了defautl null属性.\n\u003cstrong\u003eCREATE TABLE test1(col1 VARCHAR(20), col2 CHAR(20))\u003c/strong\u003e\nshow create table test1\n\u003cstrong\u003ecreate table test1(\ncol1 varchar(20) default null,\ncol2 varchar(20) default null\n)engine=MYISAM …\u003c/strong\u003e\u003c/p\u003e"
May 20, 2009
如何记录mysql慢查询sql日志
"\u003cp\u003e修改my.cnf的mysqld部分:\nlong_query_time = 1 //定义慢查询的时间1表示1秒\n–log-slow-queries[=file_name] //记录慢查询到日志文件\n–log-queries-not-using-indexes //将没使用索引的sql记录到日志文件\n实例:\n[mysqld]\nlong_query_time = 1\nlog-slow-queries = /usr/local/mysql5.0.40/var/slow_query.log\nlog-queries-not-using-indexes = true\u003c/p\u003e\n\u003cp\u003e“too many connections”找不到问题所在,后来发现打开mysql的慢查询会有很大的帮助就搞了一个.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e打开MySQL慢查询\u003c/strong\u003e\nMySQL慢查询记录日志对于跟踪PHP+MySQL体系下的MySQL负载调优问题很有用处,比如安装了很多Discuz!插件的用户,这样可以大概排查出那些插件有代码问题。其实启用MySQL的慢查询日志很简单,只需要在MySQL的配置文件里添 …\u003c/p\u003e"
May 20, 2009
mysql优化-缓存篇
"\u003cp\u003e在整体的系统运行过程中,数据库服务器 MySQL 的压力是最大的,不仅占用很多的内存和 cpu 资源,而且占用着大部分的磁盘 io 资源,连 PHP 的官方都在声称,说 PHP 脚本 80% 的时间都在等待 MySQL 查询返回的结果。由此可见,提高系统的负载能力,降低 MySQL 的资源消耗迫在眉睫。\n**1、页面缓存功能:\n** 页面缓存功能降低MySQL的资源消耗的(系统本身就已经考虑,采用生成HTML页面,大大降低了数据库的压力)。\n\u003cstrong\u003e2、mysql服务器的优化\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e2.1、修改全站搜索\n修改my.ini(my.cnf) ,在 [mysqld] 后面加入一行“ft_min_word_len=1”,然后重启Mysql,再登录网站后台(模块管理-\u0026gt;全站搜索)重建全文索引。\n2.2、记录慢查询sql语句,修改my.ini(my.cnf),添加如下代码:\u003c/p\u003e\n\u003cp\u003e#log-slow-queries\nlong_query_time = 1 #是指执行超过多久的 sql 会被 log 下来\nlog-slow-queries = E:/wamp/logs/slow.log #设置把日志写在那里,可以 …\u003c/p\u003e"
May 16, 2009
使用MySQL Proxy和MySQL Replication实现读写分离
"\u003cp\u003e\u003ca href=\"http://www.ningoo.net/html/2007/mysql_replication_configuration.html\"\u003eMySQL Replication\u003c/a\u003e 可以将master的数据复制分布到多个slave上,然后可以利用slave来分担master的读压力。那么对于前台应用来说,就要考虑如何将读的压力分布到多个slave上。如果每个应用都需要来实现读写分离的算法,一则成本太高,二来如果slave增加更多的机器,应用就要随之修改。明显的,如果在应用和数据库间加一个专门用于实现读写分离的中间层,则整个系统的架构拥有更好的扩展性。\u003c/p\u003e\n\u003cp\u003eMySQL Proxy就是这么一个中间层代理,简单的说,MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用 \u003ca href=\"http://www.lua.org/\"\u003elua脚本\u003c/a\u003e,可以实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。对于应用来说,MySQL Proxy是完全透明的,应用则只需要连接到MySQL Proxy的监听端口即可。当然,这样proxy机器可能成为单点失效,但完全可以使用多个proxy机器做为冗余,在应用服务器的连接池配置中配置到多个proxy的连接参数即可。\u003c/p\u003e\n\u003cp\u003e安装教程请参考: \u003ca href=\"http://blog.haohtml.com/archives/9465\"\u003ehttp://blog.haohtml.com/archives/9465\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2009/05/lim98ihh.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/lim98ihh.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://forge.mysql.com/wiki/MySQL_Proxy\"\u003eMySQL …\u003c/a\u003e\u003c/p\u003e"
May 16, 2009
MySQL Proxy工作机制浅析
"\u003cp\u003eMySQL Proxy处于客户端应用程序和MySQL服务器之间,通过截断、改变并转发客户端和后端数据库之间的通信来实现其功能,这和\u003cstrong\u003eWinGate\u003c/strong\u003e之类的网络代理服务器的基本思想是一样的。代理服务器是和TCP/IP协议打交道,而要理解MySQL Proxy的工作机制,同样要清楚MySQL客户端和服务器之间的通信协议,\u003cstrong\u003eMySQL Protocol\u003c/strong\u003e包括认证和查询两个基本过程:\u003c/p\u003e\n\u003cp\u003e认证过程包括:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e客户端向服务器发起连接请求\u003c/li\u003e\n\u003cli\u003e服务器向客户端发送握手信息\u003c/li\u003e\n\u003cli\u003e客户端向服务器发送认证请求\u003c/li\u003e\n\u003cli\u003e服务器向客户端发送认证结果\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e如果认证通过,则进入查询过程:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e客户端向服务器发起查询请求\u003c/li\u003e\n\u003cli\u003e服务器向客户端返回查询结果\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e当然,这只是一个粗略的描述,每个过程中发送的包都是有固定格式的,想详细了解MySQL Protocol的同学,可以去 \u003ca href=\"http://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol\"\u003e这里\u003c/a\u003e 看看。MySQL Proxy要做的,就是介入协议的各个过程。首先MySQL Proxy以服务器的身份接受客户端请求,根据配置对这些请求进行分析处理,然后以客户端的身份转发给相应的后端数据库服务器,再接受服务器的信息,返回给客户端。所以MySQL Proxy需要同时实现客户端和服务 …\u003c/p\u003e"
May 16, 2009
MySQL DBA 管理 常用 命令
"\u003cp\u003e虽然自己不是DBA,但是作为一个程序员,多多少少,应该了解一些数据库方面的东西,并不能只关心程序,不考虑数据库,看到一篇文章,就先转过来,也许以后自己哪天会用到。\u003c/p\u003e\n\u003cp\u003e查看mysql的某个选项\nshow variables like ‘%VAR_NAME%’;\u003c/p\u003e\n\u003cp\u003eselect @@VAR_NAME;\u003c/p\u003e\n\u003cp\u003e 在Linux下管理MySQL数据库的时候总有一些很紧急的情况,发现数据库突然变得压力很大了,那么作为一个DBA,也许需要一些常用的手段或者说命令去分析问题出现在哪里,然后解决:\u003c/p\u003e\n\u003cp\u003e数据库突然产生压力时查看正在查询的SQL:(如果这里内容太多表示并发执行的SQL过多,或许数据库堵塞了,会越来越慢,正常情况下这里应该很少有东西的,也就是连接都在Sleep状态)\n/usr/local/mysql/bin/mysql -uroot -ppassword databaseName -e “show full processlist” | grep -v Sleep\u003c/p\u003e\n\u003cp\u003e正在运行的SQL太多了,看不过来,那需要排序了,看持续执行时间最长的那些SQL:\n/usr/local/mysql/bin/mysql …\u003c/p\u003e"
May 10, 2009
通过分区(Partition)提升MySQL性能
"\u003cp\u003e\u003cstrong\u003e什么是数据库分区?\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e 数据库分区是一种物理数据库设计技术,DBA和数据库建模人员对其相当熟悉。虽然分区技术可以实现很多效果,但其主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间。\n分区主要有两种形式://这里一定要注意行和列的概念(row是行,column是列)\u003c/p\u003e\n\u003cp\u003e 1. 水平分区(Horizontal Partitioning)这种形式分区是对表的行进行分区,通过这样的方式不同分组里面的物理列分割的数据集得以组合,从而进行个体分割(单分区)或集体分割(1个或多个分区)。所有在表中定义的列在每个数据集中都能找到,所以表的特性依然得以保持。\n 举个简单例子:一个包含十年发票记录的表可以被分区为十个不同的分区,每个分区包含的是其中一年的记录。(朋奕注:这里具体使用的分区方式我们后面再说,可以先说一点,一定要通过某个属性列来分割,譬如这里使用的列就是年份)\n 2. 垂直分区(Vertical Partitioning) 这种分区方式一般来说是通过对表的垂直划分来减少目标表的宽度,使某些特定的列 被划分到特定的分区,每个分区都包含了其中的列所对应的行。\n 举个简单例 …\u003c/p\u003e"
March 30, 2009
Got error 134 from storage engine
"\u003cp\u003e今天将原网站数据导入新系统的时候,发现用户表是空的,程序前几天很正常的,并没有做任何修改,于是将程序的高度模式打开,发现得到错误提示:”Got error 134 from storage engine”,进到mysql里执行select * from tbl_member limit 100,我没有发现错误的,不过将语句若修改为select * from tbl_member limit 100,10时,又出现了这个错误提示信息,怀疑是mysql表损坏,由于备份的时候,mysql处于运行使用状态,并没有停止服务的,所以才产生了这个错误的\u003c/p\u003e\n\u003cp\u003e于是用 \u003cstrong\u003erepair table tablename\u003c/strong\u003e 命令修复了次用户表,再次执行上述命令,ok,显示执行成功\u003c/p\u003e"
March 28, 2009
[教程]FreeBSD下nginx+fast-cgi+mysql+zend的实现(php-fpm和spawn-fcgi)
"\u003cp\u003e另一篇文章是用php-fpm方式安装的,用的人也比较的多,推荐使用,这里介绍的是用fastcgi方式安装的.\u003c/p\u003e\n\u003cp\u003e首先在安装所有软件之前新系统ports,然后 再进行下面的工作\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1)安装mysql\u003c/strong\u003e**#cd /usr/ports/databases/mysql51-server**\u003c/p\u003e\n\u003cp\u003e**#make WITH_CHARSET=gbk WITH_XCHARSET=all ** \u003cstrong\u003e\u003cstrong\u003eWITH_PROC_SCOPE_PTH=yes SKIP_DNS_CHECK=yes BUILD_OPTIMIZED=yes\u003c/strong\u003e install clean\u003c/strong\u003e //(utf8我选择了这个,情况自己定)\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e#cp /usr/local/share/mysql/my-medium.cnf /etc/my.cnf\n#rehash\u003c/strong\u003e\n!!!—–WITH_CHARSET=utf8(我选择了这个,情况自己定,可以使用gbk)\n\u003cstrong\u003e# mysql_install_db\u003c/strong\u003e ##初始化mysql,如果在命令行后面添加上 –user=mysql 的话,会失败,不清楚什么原因\u003c/p\u003e\n\u003cp\u003e#\u003cstrong\u003echown -R mysql:mysql /var/db/mysql\u003c/strong\u003e ##目录权 …\u003c/p\u003e"
March 27, 2009
MySQL EXPLAIN句法
"\u003cp\u003eExplain虽然是大家常用的分析mysql优化的办法,但对于系统级别内容的消耗资源信息就无能为力了.这时需要用到Mysql中的Profiling(程序剖析) 功能.参考:\u003c/p\u003e\n\u003cp\u003eEXPLAIN tbl_name or EXPLAIN SELECT select_options\u003c/p\u003e\n\u003cp\u003eEXPLAIN tbl_name是DESC[RIBE] tbl_name或SHOW COLUMNS FROM tbl_name的一个同义词。\u003c/p\u003e\n\u003cp\u003e当你在一条SELECT语句前放上关键词EXPLAIN,MySQL解释它将如何处理SELECT,提供有关表如何联结和以什么次序联结的信息。\u003c/p\u003e\n\u003cp\u003e借助于EXPLAIN,你可以知道\n1)你什么时候必须为表加入索引以得到一个使用索引找到记录的更快的SELECT。\n2)你也能知道优化器是否以一个最佳次序联结表。为了强制优化器对一个SELECT语句使用一个特定联结次序,增加一个STRAIGHT_JOIN子句。\u003c/p\u003e\n\u003cp\u003e对于非简单的联结,EXPLAIN为用于SELECT语句中的每个表返回一行信息。表以他们将被读入的顺序被列出。\nMySQL用一边扫描多次联结的方式解决所有联结,这意味着MySQL 1)从第 …\u003c/p\u003e"
December 25, 2008
mysql limit查询优化
"\u003cp\u003eMYSQL的优化是非常重要的。其他最常用也最需要优化的就是limit。mysql的limit给分页带来了极大的方便,但数据量一大的时候,limit的性能就急剧下降。\u003c/p\u003e\n\u003cp\u003e同样是取10条数据\u003c/p\u003e\n\u003cp\u003eselect * from yanxue8_visit limit 10000,10 和\u003c/p\u003e\n\u003cp\u003eselect * from yanxue8_visit limit 0,10\u003c/p\u003e\n\u003cp\u003e就不是一个数量级别的。\u003c/p\u003e\n\u003cp\u003e网上也很多关于limit的五条优化准则,都是翻译自mysql手册,虽然正确但不实用。今天发现一篇文章写了些关于limit优化的,很不错。\u003c/p\u003e\n\u003cp\u003e文中不是直接使用limit,而是首先获取到offset的id然后直接使用limit size来获取数据。根据他的数据,明显要好于直接使用limit。这里我具体使用数据分两种情况进行测试。(测试环境win2033+p4双核 (3GHZ) +4G内存 mysql 5.0.19)\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1、offset比较小的时候。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eselect * from yanxue8_visit limit 10,10\u003c/p\u003e\n\u003cp\u003e多次运行,时间保持在0.0004-0.0005之间\u003c/p\u003e\n\u003cp\u003eSelect * From …\u003c/p\u003e"
November 16, 2008
mysql数据库大小的限制
"\u003cp\u003e使用PHP实现的程序.花了一个下午去完成…\u003c/p\u003e\n\u003cp\u003e只是做出来让大家参考一下…献丑了….\u003c/p\u003e\n\u003cp\u003e程序思路:\u003c/p\u003e\n\u003cp\u003e一\\与MYSQL数据库结合.先在MYSQL数据库另起一个库.记录数据库的库名,对应的用户名,限制的大小.等…..\u003c/p\u003e\n\u003cp\u003e二\\系统检测数据库大小,然后对比记录着的资料.对比是否超过流量.如果超过流量就使用MYSQL的ROOT权.限制用户对该数据库的权限…(删除UPDATE\\INST..等)\u003c/p\u003e\n\u003cp\u003e三\\如果达到80%.就向管理员\\用户各发送一个EMAIL通知..\u003c/p\u003e\n\u003cp\u003e四\\前台程序控制数据库资料的整理…\u003c/p\u003e\n\u003cp\u003e系统分二个部份.\u003c/p\u003e\n\u003cp\u003e第一部份.是系统定时检测数据库大小,再根据检测结果与数据库资料.判断数据库是否超大….该部份操作需要有MYSQL高权限用户去完成(建议ROOT).用该文件需要定时运行.,但该文件可以放在网站访问不到的保密地方…\u003c/p\u003e\n\u003cp\u003e所有文件.打包下载.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.xingkong.biz/mysql_limit.zip\"\u003ehttp://www.xingkong.biz/mysql_limit.zip\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCODE:\u003c/strong\u003e[Copy to clipboard] //设置部分\u003c/p\u003e\n\u003cp\u003e$id=mysql_connect(‘localhost’,’user’,’password’); //最好是使 …\u003c/p\u003e"
November 12, 2008
mysql复制表和表结构
"\u003cp\u003e一、CREATE TABLE 方法\u003c/p\u003e\n\u003cp\u003e整表复制 # create table 新表 select * from 旧表;\u003c/p\u003e\n\u003cp\u003e结构复制 # create table 新表 select * from 旧表 where 1\u0026lt;\u0026gt;1;\u003c/p\u003e\n\u003cp\u003e二、INSERT INTO 方法\u003c/p\u003e\n\u003cp\u003e得到建表语句 # show create table 旧表;\u003c/p\u003e\n\u003cp\u003e新建表\u003c/p\u003e\n\u003cp\u003e复制数据到新表 # insert into 新表 select * from 旧表;\u003c/p\u003e"
October 15, 2008
Mysql基础优化第一讲
"\u003cp\u003e\u003cstrong\u003eMysql基础优化第一讲\u003c/strong\u003e 讲师:陈书艺\u003c/p\u003e\n\u003cp\u003e参数的调整可以通过修改 /etc/my.cnf 文件并重启 MySQL 实现。这是一个比较谨慎的工作,上面的结果也仅仅是我的一些看法,你可以根据你自己主机的硬件情况(特别是内存大小)进一步修改。\u003c/p\u003e\n\u003cp\u003e同时在线访问量继续增大 对于1G内存的服务器明显感觉到吃力严重时甚至每天都会死机 或者时不时的服务器卡一下 这个问题曾经困扰了我半个多月MySQL使用是很具伸缩性的算法,因此你通常能用很少的内存运行或给MySQL更多的被存以得到更好的性能。\u003c/p\u003e\n\u003cp\u003e安装好mysql后,配制文件应该在/usr/local/mysql/share/mysql目录中,配制文件有几个,有my-huge.cnf my-medium.cnf my-large.cnf my-small.cnf,不同的流量的网站和不同配制的服务器环境,当然需要有不同的配制文件了。\u003c/p\u003e\n\u003cp\u003e一般的情况下,my-medium.cnf这个配制文件就能满足我们的大多需要;一般我们会把配置文件拷贝到/etc/my.cnf 只需要修改这个配置文件就可以了,使用mysqladmin variables …\u003c/p\u003e"
March 4, 2008
MySQL索引分析和优化:
"\u003cp\u003e本文主要讲述了如何加速动态网站的\u003ca href=\"http://www.phpchina.com/viewnews_11670.html\"\u003eMySQL\u003c/a\u003e索引分析和优化。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、什么是索引?\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。\u003c/p\u003e\n\u003cp\u003e假设我们创建了一个名为people的表:\u003c/p\u003e\n\u003cp\u003eCreate TABLE people ( peopleid SMALLINT NOT NULL,\u003c/p\u003e\n\u003cp\u003ename CHAR(50) NOT NULL );\u003c/p\u003e\n\u003cp\u003e然后,我们完全随机把1000个不同name值插入到people表。在数据文件中name列没有任何明确的次序。如果我们创建了name列的索引,MySQL将在索引中排序name列,对于索引中的每一项,MySQL在内部为它保存一个数据文件中实际记录所在位置的“指针”。因此,如果我们要查找name等于“Mike”记录 …\u003c/p\u003e"
Category: Tokio
August 14, 2025
Rust 里 thread::park() 与 thread::yield_now() 的区别
"\u003cp\u003e在看 tokio 调度源码时,会有一些操作线程park的函数,而在rust标准库里也同样有类似的方法,那就是 \u003ca href=\"https://doc.rust-lang.org/std/thread/fn.park.html\"\u003ethread::park()\u003c/a\u003e ,同时还有一个咋一看效果类似的函数 \u003ca href=\"https://doc.rust-lang.org/std/thread/fn.yield_now.html\"\u003ethread::yield_new()\u003c/a\u003e, 两个函数都有实现 **\u003ccode\u003e类似\u003c/code\u003e**暂停执行代码的效果,那它们到底又何区别呢?\u003c/p\u003e\n\u003cp\u003e希望通过这篇文章可以让大家搞明白它们两者的区别和使用场景。\u003c/p\u003e\n\u003cp\u003e我们先看一下 \u003ccode\u003ethread::park() \u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"threadpark\"\u003ethread:park()\u003c/h2\u003e\n\u003cp\u003e对于 park 函数的作用主要是实现当前线程的阻塞,并出让CPU,这时OS调度器会将其它线程调度到CPU,继续执行其它任务。但是一旦调用这个函数后,后续线程将一直处于阻塞状态,也就是说此线程将无法获取CPU处理任务,直到调用 unpark() 函数,才恢复正常。\u003c/p\u003e\n\u003cp\u003e从线程状态角度来看,它的转换\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003erunning ---\u0026gt; [thread::park()] ---\u0026gt; blocked (等待唤醒)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eblocked ---\u0026gt; [thread::unpark()]---\u0026gt; runnable ---\u0026gt; running (被unpark唤醒后)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e总结\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e …\u003c/li\u003e\u003c/ul\u003e"
Category: 程序开发
August 14, 2025
Rust 里 thread::park() 与 thread::yield_now() 的区别
"\u003cp\u003e在看 tokio 调度源码时,会有一些操作线程park的函数,而在rust标准库里也同样有类似的方法,那就是 \u003ca href=\"https://doc.rust-lang.org/std/thread/fn.park.html\"\u003ethread::park()\u003c/a\u003e ,同时还有一个咋一看效果类似的函数 \u003ca href=\"https://doc.rust-lang.org/std/thread/fn.yield_now.html\"\u003ethread::yield_new()\u003c/a\u003e, 两个函数都有实现 **\u003ccode\u003e类似\u003c/code\u003e**暂停执行代码的效果,那它们到底又何区别呢?\u003c/p\u003e\n\u003cp\u003e希望通过这篇文章可以让大家搞明白它们两者的区别和使用场景。\u003c/p\u003e\n\u003cp\u003e我们先看一下 \u003ccode\u003ethread::park() \u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"threadpark\"\u003ethread:park()\u003c/h2\u003e\n\u003cp\u003e对于 park 函数的作用主要是实现当前线程的阻塞,并出让CPU,这时OS调度器会将其它线程调度到CPU,继续执行其它任务。但是一旦调用这个函数后,后续线程将一直处于阻塞状态,也就是说此线程将无法获取CPU处理任务,直到调用 unpark() 函数,才恢复正常。\u003c/p\u003e\n\u003cp\u003e从线程状态角度来看,它的转换\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003erunning ---\u0026gt; [thread::park()] ---\u0026gt; blocked (等待唤醒)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eblocked ---\u0026gt; [thread::unpark()]---\u0026gt; runnable ---\u0026gt; running (被unpark唤醒后)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e总结\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e …\u003c/li\u003e\u003c/ul\u003e"
July 10, 2025
从Vec的 swap_remove 方法中学到的性能优化
"\u003cp\u003e今天在看 tokio 源码时,发现一个 \u003ca href=\"https://github.com/tokio-rs/tokio/blob/master/tokio/src/runtime/scheduler/multi_thread/idle.rs#L129-L145\"\u003eunpark_worker_by_id\u003c/a\u003e 函数里调用了标准库Vec 的 \u003ca href=\"https://github.com/rust-lang/rust/blob/master/library/alloc/src/vec/mod.rs#L2014-L2036\"\u003eswap_remove\u003c/a\u003e方法,\u003ccode\u003eswap_remove\u003c/code\u003e 实现如下\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-rust\" data-lang=\"rust\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#66d9ef\"\u003epub\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efn\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eswap_remove\u003c/span\u003e(\u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\"color:#66d9ef\"\u003emut\u003c/span\u003e self, index: \u003cspan style=\"color:#66d9ef\"\u003eusize\u003c/span\u003e) -\u0026gt; \u003cspan style=\"color:#a6e22e\"\u003eT\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#75715e\"\u003e#[cold]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#75715e\"\u003e#[cfg_attr(not(panic = \u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;immediate-abort\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e), inline(never))]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#75715e\"\u003e#[optimize(size)]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#66d9ef\"\u003efn\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eassert_failed\u003c/span\u003e(index: \u003cspan style=\"color:#66d9ef\"\u003eusize\u003c/span\u003e, len: \u003cspan style=\"color:#66d9ef\"\u003eusize\u003c/span\u003e) -\u0026gt; \u003cspan style=\"color:#f92672\"\u003e!\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#a6e22e\"\u003epanic!\u003c/span\u003e(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;swap_remove index (is \u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e{index}\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e) should be \u0026lt; len (is \u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e{len}\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e)\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#66d9ef\"\u003elet\u003c/span\u003e len \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e self.len();\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e index \u003cspan style=\"color:#f92672\"\u003e\u0026gt;=\u003c/span\u003e len { …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
June 10, 2025
理解 Solana 中的 Slot、Block、Epoch、Entry、Shred 和 PoH
"\u003cp\u003e对于刚刚接触Solana的开发者来讲,会经常遇到 Slot Block Epochs Entry 和 Shred等一些概念术语,但很验证记住它们的意思和作用。\u003c/p\u003e\n\u003cp\u003e本篇将通过 Solana 的交易原理,让大家轻记信它们并了解它们之间的联系,并加深对Solana交易的理解。由于能力有限,文章中难免有误,大家可以在评论区留言,共同学习进步!\u003c/p\u003e\n\u003cp\u003e好了,下面让我们开始彻底搞明白这些术语及它们在Solana交易中的作用吧!\u003c/p\u003e\n\u003cp\u003e在开始之前我们先看一下在Soalna链中一笔交易是如何进行的。\u003c/p\u003e\n\u003ch2 id=\"交易流程\"\u003e交易流程\u003c/h2\u003e\n\u003cp\u003e\u003cimg src=\"https://www.helius.dev/_next/image?url=%2Fapi%2Fmedia%2Ffile%2Fturbine-in-solana-transaction-lifecycle.webp\u0026amp;w=3840\u0026amp;q=90\" alt=\"Visualization of where Turbine lies in the lifecycle of a Solana transaction\"\u003e\u003c/p\u003e\n\u003ch3 id=\"交易流程-1\"\u003e\u003cstrong\u003e交易流程\u003c/strong\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e用户客户端发起一笔交易,并使用钱包私钥进行签名\u003c/li\u003e\n\u003cli\u003e通过rpc协议将交易发送到用户指定的 Solana RPC 节点。这里RPC节点在区块链网络中存在多个,起到了负载均衡的作用\u003c/li\u003e\n\u003cli\u003eRPC节点验证交易合法性,如进行一系列的检查 ,一般指签名验证/账户检查(账户是否存在,读取权限合法)/账户余额是否足够支付手续费等,最后进行交易模拟执行,就是我们经常说的模拟交易阶段(这一步可以手动配置 \u003ccode\u003e--skip-preflight\u003c/code\u003e 或 \u003ccode\u003ekipPreflight: true\u003c/code\u003e 跳过)。如果这一步失败,则整个交易直接失败, …\u003c/li\u003e\u003c/ol\u003e"
May 17, 2025
零拷贝bytemuck与 borsh
"\u003cp\u003e在上一篇博文《\u003ca href=\"https://blog.haohtml.com/posts/serde-vs-bincode-vs-borsh-in-the-rust/\"\u003e深入理解 Serde、Bincode 与 Borsh 的关系与区别\u003c/a\u003e》介绍了常用的几种解析二进制数据的方法,主要有 bincode 与 borsh, 并提到过在区块链领域里一般推荐使用 borsh 解析数据。但随着合约的开发使用borsh的地方越来越多,会经常遇到提示超出 4K Stack 大小的错误。这是因为在solana里,虚拟机 sbf 限制了一个合约最大允许使用的statck大小上限为 4k。尽管我们使用完一个大变量通过一些方法,如变量作用域、通过Box将内存移动到heap、或手动drop立即释放内存。但仍有些场景是没有采用这种办法的,这时应该如何办呢?\u003c/p\u003e\n\u003cp\u003e如果经常看一些优秀的开源项目的话,会发现有一个 \u003ccode\u003ebytemuck\u003c/code\u003e 的crate,它是一个 \u003ccode\u003ezerocopy\u003c/code\u003e 库,可以避免内存复制带来的开销,加速解析数据速度,这里给出一个测试代码\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-rust\" data-lang=\"rust\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003euse\u003c/span\u003e borsh::{BorshDeserialize, BorshSerialize};\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003euse\u003c/span\u003e bytemuck::{Pod, Zeroable};\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003euse\u003c/span\u003e solana_program::pubkey::Pubkey;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003euse …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
April 22, 2025
深入理解 Serde、Bincode 与 Borsh 的关系与区别
"\u003cp\u003e在Rust开发中,无论是构建网络服务、存储数据还是开发区块链程序,**序列化(Serialization)和反序列化(Deserialization)**都是不可或缺的操作。序列化是将内存中的数据结构(struct)转换成字节序列或者其他格式(JSON, vec\u003cu8\u003e),以便存储或传输;反序列化则是将字节序列还原成原来的数据结构。\u003c/p\u003e\n\u003cp\u003eRust 生态中常用的序列化工具包括 \u003cstrong\u003eSerde\u003c/strong\u003e、\u003cstrong\u003eBincode\u003c/strong\u003e 和 \u003cstrong\u003eBorsh\u003c/strong\u003e。初学者在阅读文档或实际开发中可能会发现它们名字都很熟悉,但它们的定位、使用方式和特点却不完全相同。\u003c/p\u003e\n\u003cp\u003e本文将系统梳理三者的关系、差异和使用场景。\u003c/p\u003e\n\u003ch2 id=\"serde\"\u003eSerde\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eSerde(Serialization / Deserialization)\u003c/strong\u003e 是 Rust官方生态最流行的序列化框架。它提供了一种 \u003cstrong\u003e抽象接口\u003c/strong\u003e,让你可以将 Rust 类型序列化为多种格式,而不关心底层具体实现。\u003c/p\u003e\n\u003ch3 id=\"特点\"\u003e特点\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e通用性强\u003c/strong\u003e:支持 JSON、YAML、TOML、Bincode 等多种格式。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e灵活\u003c/strong\u003e:可以自定义序列化逻辑。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e宏支持\u003c/strong\u003e:通过 \u003ccode\u003e#[derive(Serialize, Deserialize)]\u003c/code\u003e 自动生成序列化代码。 …\u003c/li\u003e\u003c/ul\u003e"
March 28, 2025
solana中MEV监听交易的几种方法
"\u003ch1 id=\"策略分类\"\u003e策略分类\u003c/h1\u003e\n\u003cp\u003e在 Solana 上 \u003cstrong\u003eMEV(最大可提取价值)\u003c/strong\u003e 的几种策略主要有:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e套利(Arbitrage)\u003c/li\u003e\n\u003cli\u003e清算(Liquidation)\u003c/li\u003e\n\u003cli\u003e抢跑(Front-Running)\u003c/li\u003e\n\u003cli\u003e三明治攻击(Sandwich Attack)\u003c/li\u003e\n\u003cli\u003e后置插队(Back-Running)\u003c/li\u003e\n\u003cli\u003eJito MEV 竞标\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"套利arbitrage\"\u003e套利(Arbitrage)\u003c/h2\u003e\n\u003cp\u003e价格差异猎手 想象你是一个精明的商人,在不同的市场上发现同一件商品价格不同。比如,在A市场一个苹果卖1元,在B市场卖1.2元。你会怎么做?立即在A市场买入,然后在B市场卖出,赚取0.2元的差价。\u003c/p\u003e\n\u003cp\u003e在加密世界中,这就是套利。交易员快速在不同交易所或流动性池之间捕捉加密货币价格差异,瞬间完成买卖,赚取微小但稳定的利润。\u003c/p\u003e\n\u003ch2 id=\"清算liquidation\"\u003e清算(Liquidation)\u003c/h2\u003e\n\u003cp\u003e充当风险管理者角色。想象银行放贷时,借款人需要提供抵押物品,如果抵押物品价值下跌到无法覆盖贷款,银行会立即收回资产。\u003c/p\u003e\n\u003cp\u003e在加密借贷平台,当用户的抵押品价值跌破安全线,MEV机器人(\u003cstrong\u003e清算人Liquidator)\u003c/strong\u003e 通常可以以折扣价买入资产。这是因为在借贷平台(如 \u003cstrong\u003eSolend\u003c/strong\u003e、\u003cstrong\u003eMango Markets\u003c/strong\u003e)中,如果用户的抵押资产价值不足以覆盖 …\u003c/p\u003e"
March 27, 2025
SPL-Token CLI 使用入门教程
"\u003cp\u003e本篇文章将对官方教程的基本上进行整理和完善,同时对一些官方未提到的一些知识点和实践进行一些介绍,方便一些刚入门solana开发的同学能够对solana开发有更完整的了解。\u003c/p\u003e\n\u003cp\u003e本篇文章使用 \u003ccode\u003espl-token\u003c/code\u003e 命令行进行演示操作,分别介绍 Mint Account 和 token Account 的创建、转账、关闭账户并回收租金SOL等操作。\u003c/p\u003e\n\u003cp\u003e这里假如用户本机已经安装好solana命令行,并通过 \u003ccode\u003esolana-test-validator\u003c/code\u003e 命令在本地启动开发集群。\u003c/p\u003e\n\u003ch1 id=\"环境准备\"\u003e环境准备\u003c/h1\u003e\n\u003col\u003e\n\u003cli\u003e打开一个终端,在本地创建一个新集群\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e(\u003c/span\u003ebase\u003cspan style=\"color:#f92672\"\u003e)\u003c/span\u003e ➜ ~ solana-test-validator --ledger test-ledger -r\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLedger location: test-ledger\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLog: test-ledger/validator.log\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e⠠ Initializing... …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
February 25, 2025
Solana中的 Native Programs
"\u003cp\u003e在Solana中有一些少量的内置原生程序,它们的程序ID格式一般为 \u003ccode\u003exxx11111111111111111111111111111111\u003c/code\u003e。它们与第三方自定义程序不同,原生程序是 \u003cstrong\u003evalidator node\u003c/strong\u003e 运行所必须的一部分。同时它们也是集群升级的一部分,这些升级可能包括新功能的添加、BUG修复,又或者是性能的优化提升。这些内置原生程序极少的发生变化,目前提供的所有内置原生程序可以在 \u003ca href=\"https://docs.anza.xyz/runtime/programs\"\u003ehttps://docs.anza.xyz/runtime/programs\u003c/a\u003e 找到。\u003c/p\u003e\n\u003cp\u003e其中有两个非常重要的程序很值得我们关注,因为我们在开发中,需要经常用到他们。\u003c/p\u003e\n\u003ch1 id=\"system-program\"\u003eSystem Program\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e作用:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e创建新帐户\u003c/li\u003e\n\u003cli\u003e分配帐户数据\u003c/li\u003e\n\u003cli\u003e将帐户分配给所属的程序,即指定账户与程序的对应关系\u003c/li\u003e\n\u003cli\u003e转账最小 lamports 给账户(租金),防止账户被系统回收\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eProgram id: \u003ccode\u003e11111111111111111111111111111111\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eInstructions: \u003ca href=\"https://docs.rs/solana-program/2.2.0/solana_program/system_instruction/enum.SystemInstruction.html\"\u003eSystemInstruction\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1 id=\"bpf-loader\"\u003eBPF Loader\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e作用:\n\u003cul\u003e\n\u003cli\u003e部署所有自定义程序, …\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e"
February 15, 2025
Solana中 PDA、ATA 与 普通Account 的区别与关系
"\u003ch1 id=\"普通账户地址\"\u003e普通账户地址\u003c/h1\u003e\n\u003cp\u003e对于账户地址的创建是由一个密钥对来生成的,但在Solana中账户地址与以太坊中的账户地址还是有一些区别的。\u003c/p\u003e\n\u003ch2 id=\"以太坊账户地址\"\u003e以太坊账户地址\u003c/h2\u003e\n\u003cp\u003e以太坊账户地址的生成过程:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e通过私钥生成公钥\u003c/li\u003e\n\u003cli\u003e对公钥进行 Keccak-256 哈希\u003c/li\u003e\n\u003cli\u003e取哈希值的最后 160 位(20 字节)作为地址\u003c/li\u003e\n\u003cli\u003e将地址以 \u003ccode\u003e0x\u003c/code\u003e 开头,并根据需要选择是否使用 EIP-55 格式\u003c/li\u003e\n\u003c/ol\u003e\n\u003cblockquote\u003e\n\u003cp\u003e地址中通常是小写字母,但也有大写字母的变种,称为 \u003cstrong\u003eEIP-55\u003c/strong\u003e 格式。在 EIP-55 中,某些字符会根据哈希值的大小写进行区分,从而增加地址的错误检查能力。\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"solana-账户地址\"\u003eSolana 账户地址\u003c/h2\u003e\n\u003cp\u003eSolana账户地址的生成过程:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e通过私钥生成公钥,一般通过调用 Keypair.generate() 生成\u003c/li\u003e\n\u003cli\u003e公钥直接映射为账户的地址,长度为 32 字节\u003c/li\u003e\n\u003cli\u003e为了使用方便,一般对其进行 Base58 编码,将公钥转换为地址字符串\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e代码:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-typescript\" data-lang=\"typescript\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003econst\u003c/span\u003e { \u003cspan style=\"color:#a6e22e\"\u003eKeypair\u003c/span\u003e } \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003erequire\u003c/span\u003e(\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;@solana/web3.js\u0026#39;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e// 生成一个新的密钥对\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e\u003c/span\u003e\u003cspan style=\"color:#66d9ef\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003ekeypair\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eKeypair\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003egenerate\u003c/span\u003e();\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e// 获取公 …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
January 10, 2025
Solana中如何实现转账
"\u003cp\u003e在 Solana 中转账有两种方式。\u003c/p\u003e\n\u003ch1 id=\"修改结构体字段\"\u003e修改结构体字段\u003c/h1\u003e\n\u003cp\u003e一种是在不调用(\u003ccode\u003einvoking\u003c/code\u003e )系统程序( \u003ccode\u003eSystem Program\u003c/code\u003e )的情况下,将 \u003ccode\u003elamports\u003c/code\u003e 从一个账户转移到另一个账户。它的实现是直接通过修改结构体的 \u003ccode\u003elamports\u003c/code\u003e 字段值来实现的。\u003c/p\u003e\n\u003cp\u003e这种方法可以实现将 lamports 从任何由您的程序\u003cstrong\u003e拥有\u003c/strong\u003e的账户转移到任何账户。\u003ca href=\"https://solana.com/zh/developers/cookbook/programs/transfer-sol\"\u003e文档\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-rust\" data-lang=\"rust\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003e/// Transfers lamports from one account (must be program owned)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003e/// to another account. The recipient can by any account\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003e\u003c/span\u003e\u003cspan style=\"color:#66d9ef\"\u003efn\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003etransfer_service_fee_lamports\u003c/span\u003e(\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e from_account: \u003cspan style=\"color:#66d9ef\"\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003eAccountInfo\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e to_account: \u003cspan style=\"color:#66d9ef\"\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003eAccountInfo\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e amount_of_lamports: \u003cspan style=\"color:#66d9ef\"\u003eu64\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e) -\u0026gt; \u003cspan style=\"color:#a6e22e\"\u003eProgramResult\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#75715e\"\u003e// Does the from account have enough …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
December 22, 2024
Solana中账户类型 Account、AccountInfo与 SystemAccount 的区别
"\u003cp\u003e在Solana中 Account 的角色很重要,它就像Linux中\u003ccode\u003e一切皆文件\u003c/code\u003e的概念一样,无处不在。了解它也是开发Solana的基础,本节主要介绍我们最经常使用的 \u003ccode\u003eAccount\u003c/code\u003e 、\u003ccode\u003eAccountInfo\u003c/code\u003e 和 \u003ccode\u003eSystemAccount\u003c/code\u003e 这三种账户类型的区别与使用场景。\u003c/p\u003e\n\u003cp\u003e当然除此之外还有一些账户类型也很重要,如 \u003ccode\u003eUncheckedAccount\u003c/code\u003e、\u003ccode\u003eSigner\u003c/code\u003e、\u003ccode\u003eTokenAccount\u003c/code\u003e、\u003ccode\u003eMint\u003c/code\u003e、\u003ccode\u003eCpiAccount\u003c/code\u003e、\u003ccode\u003eLoader\u003c/code\u003e、\u003ccode\u003eProgram\u003c/code\u003e、\u003ccode\u003eAssociatedToken\u003c/code\u003e 等,我们这里就不再一一讲解,有兴趣的话可以参考官方相关文档。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e由于多数情况下都是使用anchor框架开发Solana合约,因此本文主要是根据 anchor-lang 文档里介绍账户来讲解\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch1 id=\"账户类型\"\u003e账户类型\u003c/h1\u003e\n\u003cp\u003e以下我们分别对这三种账户类型做一些简单的介绍。\u003c/p\u003e\n\u003ch2 id=\"accountinfo\"\u003eAccountInfo\u003c/h2\u003e\n\u003cp\u003e在 Solana 中 \u003ccode\u003eAccountInfo\u003c/code\u003e 是最基础的账户类型。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com/uploads/2025/accountinfo.svg\" alt=\"AccountInfo\"\u003e\u003c/p\u003e\n\u003cp\u003e其它几种账户类型都是对它的封装,它的\u003ca href=\"https://docs.rs/anchor-lang/0.30.1/anchor_lang/prelude/struct.AccountInfo.html\"\u003e定义\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-rust\" data-lang=\"rust\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#[repr(C)]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003epub\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estruct\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eAccountInfo\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e\u0026#39;a\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#66d9ef\"\u003epub\u003c/span\u003e key: …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
December 6, 2024
什么是Layer2网络
"\u003cp\u003e我们平时提到的比特币、以太坊、Solana,它们都属于Layer 1网络,而Layer 2(L2) 网络是指基于Layer1网络之上构建的一层网络,它很类似于Layer 1 网络,也是一个独立的区块链。但它的主要目的并不是为了代替 Layer 1 ,而是为了通过扩展 Layer 1 层网络从而解决一些在 Layer 1 网络中存在的一些问题,它同时继承了 Layer 1 网络的安全性和去中心化性。\u003c/p\u003e\n\u003ch1 id=\"以太坊存在的问题\"\u003e以太坊存在的问题\u003c/h1\u003e\n\u003cp\u003e这里以以太坊为例,在 L1 网络上随着交易量越来越大,交易频率也越来越频繁,导致Gas(网络交易费)越来越高,一笔交易可能在网络繁忙的时候高达十几美元,导致一些交易可能需要花费好久才可以真正成交到区块网络。\u003c/p\u003e\n\u003cp\u003e这两个问题大大提高了用户使用门槛,那有没有好的解决办法呢?\u003c/p\u003e\n\u003ch1 id=\"解决方案\"\u003e解决方案\u003c/h1\u003e\n\u003cp\u003e区块链的三个核心特性是 \u003ccode\u003e去中心化\u003c/code\u003e、\u003ccode\u003e安全性\u003c/code\u003e和\u003ccode\u003e可扩展性\u003c/code\u003e,一般简单的区块链架构只能实现其中两个特性(这一点很类似于分布式中的CAP理论)。想要一个安全且去中心化的区块链的话,只能牺牲可扩展性,而这也正是第二层网络发挥作用的地方。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e以太坊生态系统坚定认为,第 2 层扩展是解决可扩展性三难问题的唯一途径,同时保 …\u003c/strong\u003e\u003c/p\u003e"
December 4, 2024
Solana中如何解析指令
"\u003cp\u003e开发过Solodity的同学都知道在合约开发中,不同指令对应的不同前端Endpoint(API接口),这种开发模式特别的清晰且易维护。那在开发Solana合约时没有有对应的方法呢?\u003c/p\u003e\n\u003ch1 id=\"solana开发方式\"\u003eSolana开发方式\u003c/h1\u003e\n\u003cp\u003e开发 Solana 合约,一般分 Native 和 Anchor 框架开发。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eNative\u003c/code\u003e 主要是开发者通过SDK 手动实现所有业务逻辑。 这种模式一般对开发者要求比较高,除了需要了解相关概念外,最重要的还需要知道对应的SDK实现,如PDA账户的创建。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eAnchor框架\u003c/code\u003e 推荐使用,只需要一些宏即可以实现一些逻辑,不需要用户关心底层实现。这种开发方式对于指令的处理基本与Solidity中一致,开发者只要搞明白了基本用法就可以了。\u003c/p\u003e\n\u003cp\u003e下面主要讲一下在 Native 这种方式下,如何实现指令或附加数据的解析。\u003c/p\u003e\n\u003cp\u003e如果你对 \u003ccode\u003e指令\u003c/code\u003e这个概念不太理解的话,可以将其视为路由。其类于似在mvc开发中控制器路由,如 \u003ccode\u003e/user/info\u003c/code\u003e、 \u003ccode\u003e/user/base\u003c/code\u003e、\u003ccode\u003e/user/changepwd\u003c/code\u003e 之类。\u003c/p\u003e\n\u003ch1 id=\"示例介绍\"\u003e示例介绍\u003c/h1\u003e\n\u003cp\u003e我们先看一个在 \u003ca href=\"https://beta.solpg.io\"\u003ehttps://beta.solpg.io\u003c/a\u003e 网站上创建的一个 Native …\u003c/p\u003e"
December 3, 2024
解决编译solana程序 rustc版本号过低的问题
"\u003cp\u003e本方主要介绍在编译solana程序时,提示 rustc 版本号过低无法编译通过的问题。\u003c/p\u003e\n\u003ch1 id=\"问题描述\"\u003e问题描述\u003c/h1\u003e\n\u003cp\u003e在参考官方教程 \u003ca href=\"https://github.com/solana-developers/program-examples/tree/main/basics/favorites/native\"\u003ehttps://github.com/solana-developers/program-examples/tree/main/basics/favorites/native\u003c/a\u003e 在本地执行命令\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e➜ native git:\u003cspan style=\"color:#f92672\"\u003e(\u003c/span\u003emain\u003cspan style=\"color:#f92672\"\u003e)\u003c/span\u003e ✗ cargo build-sbf --manifest-path\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e./program/Cargo.toml --sbf-out-dir\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e./program/target/so\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e报错\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e➜ native git:\u003cspan style=\"color:#f92672\"\u003e(\u003c/span\u003emain\u003cspan style=\"color:#f92672\"\u003e)\u003c/span\u003e ✗ cargo build-sbf --manifest-path\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e./program/Cargo.toml --sbf-out-dir\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e./program/target/so\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eerror: package \u003cspan style=\"color:#e6db74\"\u003e`\u003c/span\u003esolana-program v2.1.7\u003cspan style=\"color:#e6db74\"\u003e`\u003c/span\u003e cannot be built because it requires rustc 1.79.0 or newer, \u003cspan style=\"color:#66d9ef\"\u003ewhile\u003c/span\u003e the currently active …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
December 2, 2024
在Solana中为什么Token Account没有owner属性
"\u003cp\u003e在上一篇\u003ca href=\"https://blog.haohtml.com/posts/understanding-the-difference-between-ata-accounts-and-token-accounts-in-solana/\"\u003e《了解 Solana 中ATA账户与普通账户的关系》\u003c/a\u003e中,我们介绍了在Solana中,ATA账户与Token Account 的区别,其中在浏览器记录查看 user2 用户详细的时候,发现它与前两个账户有所区别,它没有 Owner 属性,这在正常情况下是不应该出现的,所以,我们来分析一下,为什么Token Account没有 \u003ccode\u003eOwner\u003c/code\u003e 属性?\u003c/p\u003e\n\u003cp\u003e在 Soalna中,默认情况下所有的新账户都属于 \u003ca href=\"https://solana.com/docs/core/accounts#system-program\"\u003eSystem Program\u003c/a\u003e,也只有系统程序拥有的账户才可以作为交易费用支付者(也就是账户里必须的原生币sol)。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com/uploads/2025/system-account.svg\" alt=\"系统账户\"\u003e\u003c/p\u003e\n\u003cp\u003e因此示例中正常的 Token Account\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com/uploads/2025/image-20250107144557450.png\" alt=\"Token Accoun\"\u003e\u003c/p\u003e\n\u003cp\u003e异常账号\n\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com/uploads/2025/image-20250107145307758.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e出现我这种情况主要有两种情况:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e交易还在处理中,尚未完成,这种情况下一般只需要等待一会就会正常。\u003c/li\u003e\n\u003cli\u003e账户未被初始化,需要初始化后才恢复正常。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e常见的初始化方法:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e空投原生币\u003c/li\u003e\n\u003cli\u003e转账原生币\u003c/li\u003e\n\u003cli\u003e通过 SystemProgram.createAccount 创建账号·\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e在上篇文章里,我们为了演示转账记录,对 payer 和 user1 用户都进行了空投,在空投时将自动对账户进行初始化操作, …\u003c/p\u003e"
December 1, 2024
了解 Solana 中ATA账户与普通账户的关系
"\u003cp\u003e本文主要通过示例让大家理解在 Solana 中 \u003ccode\u003eATA\u003c/code\u003e 账户与普通账户的关系。\u003c/p\u003e\n\u003ch1 id=\"目的\"\u003e目的\u003c/h1\u003e\n\u003cp\u003e主篇内容目的是为了让开发者加深对 solana 中 Account 这一概念的理解,同时搞清楚 \u003ccode\u003e关联代币账户(ATA) \u003c/code\u003e 在 Solana 开发中的使用场景和用法,以及在多个账户之间的交易和手续费扣除情况。\u003c/p\u003e\n\u003cp\u003e本篇实现源码会在 \u003ca href=\"https://github.com/cfanbo/solana-repos/tree/main/tokenaccount-and-ata\"\u003egithub.com/cfanbo/solana-repos/\u003c/a\u003e 中找到。\u003c/p\u003e\n\u003cp\u003e这里用到的一些api 函数可以在以下地址找到:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://solana-labs.github.io/solana-web3.js/index.html\"\u003e@solana/web3.js\u003c/a\u003e 用户实现通过 Solana JSON RPC API 与 Solana 网络上的帐户和程序进行交互。\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://solana-labs.github.io/solana-program-library/token/js/index.html\"\u003e@solana/spl-token\u003c/a\u003e 用于实现与 SPL Token 和 Token-2022 程序交互。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e本文通过脚本实现 SPL Token 标准功能,并不需要调用已创建好的智能合约,因此不需要 programId.\u003c/p\u003e\n\u003ch1 id=\"设置网络环境\"\u003e设置网络环境\u003c/h1\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e➜ my-solana-program git:\u003cspan style=\"color:#f92672\"\u003e(\u003c/span\u003emaster\u003cspan style=\"color:#f92672\"\u003e)\u003c/span\u003e ✗ solana config get\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eConfig File: …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
August 10, 2024
Rust学习教程清单
"\u003cp\u003e今年又一次重新学习RUST这门编程语言,并从零开发了一个kv存储系统 \u003ca href=\"https://github.com/cfanbo/minkv\"\u003eminKV\u003c/a\u003e,慢慢的越来越有感觉了。\u003c/p\u003e\n\u003cp\u003e本篇主要将日常学习中收集的一些入门教程进行一下汇总,希望对于一些想学习这门开发语言的同学有所帮助。\u003c/p\u003e\n\u003cp\u003e下面教程按照推荐顺序,由浅到深依次列出。以下内容将不定期的更新,请自行收藏。 如果您有更多好的教程的话,也可以在评论区列出,大家相互学习。\u003c/p\u003e\n\u003ch1 id=\"入门教程\"\u003e入门教程\u003c/h1\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://doc.rust-lang.org/book/\"\u003eRust 程序设计语言 https://doc.rust-lang.org/book/\u003c/a\u003e / (\u003ca href=\"https://kaisery.github.io/trpl-zh-cn/\"\u003e中文版\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003e官方教程,强烈推荐,同时还有非官方翻译的中文版。遗憾的是这个教程有许多概念介绍的都有点不清不楚,只能通过下方的一些资料自行补习。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://play.rust-lang.org/\"\u003ehttps://play.rust-lang.org/\u003c/a\u003e 在线 RUST 程序 Playground,类似golang的 Playground,非常的方便\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://cheats.rs/#data-layout\"\u003eRust Language Cheat Sheet\u003c/a\u003e 看完官方的教程后,紧接着就看这篇,先了解一些内存布局,后面再看其它教程就更容易理解了\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://doc.rust-lang.org/cargo/index.html#the-cargo-book\"\u003eThe Cargo Book\u003c/a\u003e Cargo 是RUST 中的包管理工具, …\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e"
August 10, 2024
在rust中实现自定义错误
"\u003cp\u003e\u003ca href=\"https://blog.haohtml.com/posts/error-hanlding-unwrap-and-expect-in-rust/#google_vignette\"\u003e上一篇\u003c/a\u003e 我们介绍了一些错误处理的最基本的用法,主要是指对 \u003ccode\u003epanic!\u003c/code\u003e 、\u003ccode\u003eunwrap\u003c/code\u003e、\u003ccode\u003eexpect\u003c/code\u003e 和 \u003ccode\u003e?\u003c/code\u003e 这些宏或函数的介绍。但这仅仅是一些最基本的处理方法,对于自定义错误这一块并没有做任何介绍。\u003c/p\u003e\n\u003cp\u003e实际开发中可能默认的错误类型,并无法满足我们的业务需求,这时一般需要通过定义自己的错误类型来实现。在rust中错误类型是通过 \u003ccode\u003eenum\u003c/code\u003e 枚举定义的,对此官方文档也做了一些简介,本文主要介绍一些业务开发过程中对错误的处理方案,当然主要是一些最基本的用法。\u003c/p\u003e\n\u003ch1 id=\"自定义-error\"\u003e自定义 Error\u003c/h1\u003e\n\u003cp\u003e在 Rust 中,自定义错误类型是一种常见的类型,特别是当你需要提供比标准错误类型更具体的错误信息时。Rust 中的错误处理是通过 \u003ccode\u003eResult\u003c/code\u003e 和 \u003ccode\u003eError\u003c/code\u003e trait 来实现的。以下是如何实现一个自定义错误的示例:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e定义一个错误枚举类型。\u003c/li\u003e\n\u003cli\u003e实现 \u003ccode\u003estd::fmt::Display\u003c/code\u003e 为自定义错误提供用户友好的错误信息。\u003c/li\u003e\n\u003cli\u003e实现 \u003ccode\u003estd::error::Error\u003c/code\u003e trait,这通常是通过派生 \u003ccode\u003eError\u003c/code\u003e trait 来完成的。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e下面是一个简单的示例:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-rust\" data-lang=\"rust\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003euse\u003c/span\u003e std::fmt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003euse …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
July 27, 2024
一款管理 .gitignore 的CLI工具- gitig
"\u003cp\u003e\u003ccode\u003egitig\u003c/code\u003e 是一款基于 \u003ca href=\"https://github.com/github/gitgnore\"\u003ehttps://github.com/github/gitgnore\u003c/a\u003e 仓库开发的\u003ccode\u003e.gitignore\u003c/code\u003e 客户端CLI 管理工具,也是每个开发者必不可少的提高工作效率的必具工具。\u003c/p\u003e\n\u003cp\u003e它基于官方仓库 \u003ca href=\"https://github.com/github/gitgnore\"\u003ehttps://github.com/github/gitgnore\u003c/a\u003e 丰富的 \u003ccode\u003e.gitignore\u003c/code\u003e 数据源,帮助开发者快速实现添加各类开发项目的git版本控制忽略文件清单。\u003c/p\u003e\n\u003ch1 id=\"开发背景\"\u003e开发背景\u003c/h1\u003e\n\u003cp\u003e工作中,经常需要开发各类项目,如基于 vscode 编写 rust 项目,这时为了方便进行Git管理控制,有些项目文件可能并不需要提交到git仓库,需要将一些文件写入 \u003ccode\u003e.gitignore\u003c/code\u003e 文件进行忽略。\u003c/p\u003e\n\u003cp\u003e如果手动编辑 \u003ccode\u003e.gitignore\u003c/code\u003e文件可能有些麻烦,另外也能会有一些文件项被遗忘或写错,这时如果有一些工具可以将行业能用的忽略配置项一键写入 \u003ccode\u003e.gitignore\u003c/code\u003e 文件似乎是一个不错的主意。\u003c/p\u003e\n\u003cp\u003e其中著名的 \u003ca href=\"https://github.com/github/gitignore\"\u003ehttps://github.com/github/gitignore\u003c/a\u003e 就是一个专门收集各类开发语句或IDE 需要忽略的 \u003ccode\u003e.gitignore\u003c/code\u003e 推荐配置的仓库,目前star …\u003c/p\u003e"
July 15, 2024
Rust 中常见的几种错误处理方法
"\u003cp\u003eRust 中错误可分为两大类:\u003cstrong\u003e可恢复的\u003c/strong\u003e(\u003cem\u003erecoverable\u003c/em\u003e)和 \u003cstrong\u003e不可恢复的\u003c/strong\u003e(\u003cem\u003eunrecoverable\u003c/em\u003e)错误。\u003c/p\u003e\n\u003cp\u003e对于一个可恢复的错误,比如文件未找到或权限不足的错误,我们很可能只想向用户报告问题,让用户来决定后续操作。\u003c/p\u003e\n\u003cp\u003e不可恢复的错误总是 bug 出现的征兆,比如试图访问一个超过数组末端的位置,因此我们要立即停止程序,主要通过 \u003ccode\u003epanic!\u003c/code\u003e 实现。\u003c/p\u003e\n\u003ch1 id=\"panic\"\u003epanic!\u003c/h1\u003e\n\u003cp\u003e\u003ccode\u003epanic!\u003c/code\u003e属于不可恢复错误类型,一旦发生程序将立即退出。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-rust\" data-lang=\"rust\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003efn\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003emain\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#a6e22e\"\u003epanic!\u003c/span\u003e(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;crash and burn\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里由用户调用 \u003ccode\u003epanic!\u003c/code\u003e 宏来实现程序的中止,同时自定义错误信息。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e➜ cargo run\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e Compiling hello-world v0.1.0 \u003cspan style=\"color:#f92672\"\u003e(\u003c/span\u003e/Users/sxf/workspace/rust/hello-world\u003cspan style=\"color:#f92672\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e Finished \u003cspan style=\"color:#e6db74\"\u003e`\u003c/span\u003edev\u003cspan style=\"color:#e6db74\"\u003e`\u003c/span\u003e profile \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eunoptimized + debuginfo\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e target\u003cspan style=\"color:#f92672\"\u003e(\u003c/span\u003es\u003cspan style=\"color:#f92672\"\u003e)\u003c/span\u003e in 0.68s\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e Running \u003cspan style=\"color:#e6db74\"\u003e`\u003c/span\u003etarget/debug/hello-world\u003cspan style=\"color:#e6db74\"\u003e` …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
July 10, 2024
在Rust中如何调用一个模块或方法
"\u003cp\u003e在 Rust 中有 \u003ccode\u003e包\u003c/code\u003e、\u003ccode\u003ecrate\u003c/code\u003e、\u003ccode\u003e模块\u003c/code\u003e 概念,本文我们介绍一下它们之间的关系和调用方法。\u003c/p\u003e\n\u003ch1 id=\"包-和-crate\"\u003e包 和 Crate\u003c/h1\u003e\n\u003cp\u003e在Rust中,\u003cem\u003e包\u003c/em\u003e(\u003cem\u003epackage\u003c/em\u003e)是提供一系列功能的一个或者多个 crate。一个包会包含一个 \u003ccode\u003eCargo.toml\u003c/code\u003e 文件,阐述如何去构建这些 crate。\u003c/p\u003e\n\u003cp\u003e我们先看一下通过 \u003ccode\u003ecargo new\u003c/code\u003e 创建一个 \u003ccode\u003emy_project\u003c/code\u003e 包。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e➜ cargo new my_project \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e Creating binary \u003cspan style=\"color:#f92672\"\u003e(\u003c/span\u003eapplication\u003cspan style=\"color:#f92672\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e`\u003c/span\u003emy_project\u003cspan style=\"color:#e6db74\"\u003e`\u003c/span\u003e package\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enote: see more \u003cspan style=\"color:#e6db74\"\u003e`\u003c/span\u003eCargo.toml\u003cspan style=\"color:#e6db74\"\u003e`\u003c/span\u003e keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e➜ rust tree my_project \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emy_project\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e├── Cargo.toml\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e└── src\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e └── main.rs\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ae81ff\"\u003e2\u003c/span\u003e directories, \u003cspan style=\"color:#ae81ff\"\u003e2\u003c/span\u003e files\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e它将创建一个 \u003ccode\u003eCargo.toml\u003c/code\u003e文件,内容:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[ …\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
June 25, 2024
Rust中将一个结构体拆分成多个文件
"\u003cp\u003e官方文档将\u003ca href=\"https://kaisery.github.io/trpl-zh-cn/ch07-05-separating-modules-into-different-files.html\"\u003e一个模块拆分成多个文件\u003c/a\u003e时,介绍的是将原来多个模块写在同一个文件中,拆分成了每个模块一个文件。不过还有一种情况没有提到,如果一个模块中的某个 struct 实现代码过多时,仍写在同一个模块文件的话,维护成本就显的比较高了,这时我们可能还需要对这个 struct 的实现按某种粒度拆分成多个文件来实现。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e✗ tree\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e├── main.rs\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e├── model\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e│ ├── article.rs // 文章相关\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e│ └── user.rs // 用户相关\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e└── model.rs\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里是按官方教程拆分后的样子\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003earticle.rs\u003c/code\u003e 是文件模块相关实现 -\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003euser.rs\u003c/code\u003e 是与用户相关的实现\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emodel.rs\u003c/code\u003e 公开模块\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ccode\u003emodel.rs \u003c/code\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-rust\" data-lang=\"rust\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e// src/model.rs\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003epub\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003emod\u003c/span\u003e article;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003epub\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003emod\u003c/span\u003e user;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003epub\u003c/code\u003e 关键字表示该模块是公开的,可以被其他模块访问。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003emod article\u003c/code\u003e 声明了一个名为 \u003ccode\u003earticle\u003c/code\u003e 的模块,并且 Rust 编译器会在同文件名的目录下( \u003ccode\u003esrc/model/\u003c/code\u003e )找到一个名为 \u003ccode\u003earticle.rs …\u003c/code\u003e\u003c/p\u003e"
May 13, 2024
记录一次排查vpn无法通讯的过程
"\u003cp\u003e今天收到一个项目重构的需求,项目源码使用私有 gitlab 托管平台,但由于考虑安全原因,必须通过vpn软件才可以访问。公司用的vpn客户端是 \u003ca href=\"https://github.com/pritunl/pritunl-client-electron\"\u003ePritunl\u003c/a\u003e, 看了一下项目主页 \u003ca href=\"https://github.com/pritunl/pritunl-client-electron\"\u003ehttps://github.com/pritunl/pritunl-client-electron\u003c/a\u003e,发现它是一个 OpenVPN 客户端,是基于Golang+Electron 框架开发的一个跨平台的客户端。\u003c/p\u003e\n\u003cp\u003e以前主要接触的是 \u003ca href=\"https://github.com/WireGuard/wireguard-go\"\u003ewireGuard\u003c/a\u003e 和 \u003ca href=\"https://github.com/OpenVPN/openvpn\"\u003eopenvpn\u003c/a\u003e 这两个项目,这个客户端还是第一次听说。不过后面发现使用这个客户端会经常出现DNS无法解析的情况,不清楚具体是什么原因引起的,因此不推荐这个客户端。另外从性能方面考虑openvpn也不是推荐方案,推荐优先考虑 wireGuard 这个项目,它的客户端也是跨平台的,而且性能要比openvpn好太多,代码也少很好,无论维护和开发成本都要低的多。个人有很长一段时间一直用wireGuard作为内网穿透方案,不过此方案需要一个公网IP地址,所以后期换成了更节约成本的解决方案,当然这是另一个话题了,不是本文要介绍的内容。\u003c/p\u003e\n\u003ch1 id=\"遇到问题\"\u003e遇到问题\u003c/h1\u003e\n\u003cp\u003e当在macOS上安装好客户 …\u003c/p\u003e"
May 12, 2024
git 操作中那些常常被忽略的用法
"\u003ch1 id=\"git-merge-与-git-rebase--的区别\"\u003egit merge 与 git rebase 的区别\u003c/h1\u003e\n\u003cp\u003e对于两者的区别,网上已经有很多文章做了介绍,不过有些初学者没有亲自实验过,多数也是作为八股文死记硬背而已。本文为了让大家彻底搞懂两者的区别,所以搞了一个实验环境并模拟了一些真实环境的操作。\u003c/p\u003e\n\u003cp\u003e实验环境主要用到两个分支,其中 main 分支做了主要分支,而 dev 作为开发功能分支。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e在生产环境中需要选择合适的分支,这里只是实验环境,所以分支名不是本文关注的重点。\u003c/p\u003e\u003c/blockquote\u003e\n\u003ctable\u003e\n \u003cthead\u003e\n \u003ctr\u003e\n \u003cth\u003emain\u003c/th\u003e\n \u003cth\u003edev\u003c/th\u003e\n \u003cth\u003e说明\u003c/th\u003e\n \u003c/tr\u003e\n \u003c/thead\u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\u003emkdir git-demo \u0026amp;\u0026amp; cd git-demo \u0026amp;\u0026amp; git init\u003c/td\u003e\n \u003ctd\u003e\u003c/td\u003e\n \u003ctd\u003e\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\u003etouch 1.txt \u0026amp;\u0026amp; git add . \u0026amp;\u0026amp; git commit -m \u0026lsquo;add 1.txt\u0026rsquo; …\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e"
April 29, 2024
kubernetes 网络中DNS解析原理
"\u003cp\u003e当我们通过域名(例如 \u003ca href=\"https://www.example.com\"\u003ewww.example.com\u003c/a\u003e)访问一个网站时,第一步就是通过DNS服务器找到目的服务器IP地址(例如 93.184.215.14),接着再将请求数据包发送到这个 IP 服务器。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2024/04/watermark%2Ctype_ZmFuZ3poZW5naGVpdGk%2Cshadow_10%2Ctext_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwNzcyMQ%3D%3D%2Csize_16%2Ccolor_FFFFFF%2Ct_70.jpeg\" alt=\"img\"\u003e\u003c/p\u003e\n\u003cp\u003e而要想通过 DNS 服务器进行域名,必须得先知道 DNS 服务器地址才行,而这一般是通过读取配置文件实现,在 \u003ccode\u003e*nux\u003c/code\u003e 操作系统中,DNS 服务器一般配置在 \u003ccode\u003e/etc/resolv.conf\u003c/code\u003e文件,如\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ini\" data-lang=\"ini\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003esearch default.svc.cluster.local svc.cluster.local cluster.local\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003enameserver 10.96.0.10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003eoptions ndots:5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e用户可以通过 nameserver 指定多个 DNS 服务器,依次对域名进行解析,如果解析成功,则解析操作立即中止,如果解析不到的话,则将回退到公网 DNS 服务器进行解析,这个公网 DNS 服务器一般是由网络运营商来定的,用户不需要关心。如果公网 DNS 仍解析失败的话,则直接响应域名无法解析,此时用户将无法正常访问域名。\u003c/p\u003e\n\u003ch1 id=\"什么是-fqdn\"\u003e什么是 FQDN\u003c/h1\u003e\n\u003cp\u003e在介绍域名解析前, …\u003c/p\u003e"
April 22, 2024
Kubernetes集群扩缩容方案
"\u003cp\u003e动态扩缩容主要包括两个层级的动态扩缩容。一个层级是应用本身级别的扩缩容,如HPA、VPA。当应用负载过高时,可以通过HPA多部署几个Pods副本;或者通过VPA对当前Pod硬件资源进行扩容,以此来减少应用负载。\u003c/p\u003e\n\u003cp\u003e另一层是对集群自身的扩容,如 worker 节点的扩容。如部署Pods应用时,如果出现无可用节点资源可用时,则通过 Cluster Autoscaler 加入一些新的节点,并在新节点上重建Pods。\u003c/p\u003e\n\u003cp\u003e本文主要看一下应用这个层级的扩缩容方案。\u003c/p\u003e\n\u003ch1 id=\"水平扩展hpa--垂直扩展vpa\"\u003e水平扩展HPA \u0026amp;\u0026amp; 垂直扩展VPA\u003c/h1\u003e\n\u003ch2 id=\"hpa\"\u003eHPA\u003c/h2\u003e\n\u003cp\u003e在 Kubernetes 中,\u003ca href=\"https://kubernetes.io/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale/\"\u003eHPA\u003c/a\u003e(HorizontalPodAutoscaler)也称为水平扩缩容,它将根据当前应用程序工作负载,自动更新工作负载资源 (例如 \u003ca href=\"https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/\"\u003eDeployment\u003c/a\u003e 或者 \u003ca href=\"https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/statefulset/\"\u003eStatefulSet\u003c/a\u003e)以满足当前需求。简单讲的话,就是如果集群检测到当前应用程序的n个Pod负载如果比较高的话,就再创建几个Pod副本,以减少当前负载,也就是我们平时说的水平扩容。相反如果应用程序Pod负载比较低的话,则将Pod副本数量进行减少,节省服务器资源,这个就是水平缩容。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2024/04/image-20240424145020517.png\" alt=\"image-20240424145020517\"\u003e\u003c/p\u003e\n\u003cp\u003e它的工 …\u003c/p\u003e"
April 10, 2024
kubernetes中overlay网络与underlay网络的区别
"\u003cp\u003eKubernetes 中的 overlay 网络和 underlay 网络是两个不同的网络层面。\u003c/p\u003e\n\u003ch1 id=\"underlay-网络\"\u003eUnderlay 网络\u003c/h1\u003e\n\u003cp\u003e在 Kubernetes 网络架构中,Underlay 网络是指承载 Kubernetes 网络流量的物理网络或底层网络。这个网络通常由物理交换机、路由器和其他网络硬件组成,它们之间通过各种路由协议(例如 OSPF、BGP 等)连接在一起组成的传统网络。\u003c/p\u003e\n\u003cp\u003eUnderlay 网络负责为 Kubernetes 节点提供基本的网络连接,它为上层的 overlay 网络提供支持。\u003c/p\u003e\n\u003cp\u003e总之,Kubernetes 的网络流量,例如 Pod 到 Pod、Pod 到 Service 等都将在这个 Underlay 网络上进行传输。\u003c/p\u003e\n\u003ch1 id=\"overlay-网络\"\u003eOverlay 网络\u003c/h1\u003e\n\u003cp\u003e对于 \u003ccode\u003eOverlay\u003c/code\u003e 网络也被称为 \u003ccode\u003e覆盖网络\u003c/code\u003e,想必只要接触过一点 kubernetes 网络知识的同学都不陌生,它主用来解决 \u003cstrong\u003e不同节点\u003c/strong\u003e 中 \u003cstrong\u003ePod\u003c/strong\u003e 之间通讯的一种网络解决方案。\n\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2024/04/image_1chvp7s4g15n0134iv1tvag1mkd8g.png\" alt=\"Overlay\"\u003e\u003c/p\u003e\n\u003cp\u003e在上图可以看到 \u003ccode\u003eOverlay\u003c/code\u003e 网络是构建在 \u003ccode\u003eunderlay\u003c/code\u003e 网络之上的一层虚拟网络,它通过封装数据包(如VXLAN)通过物理网络进行传输,到达目标网络 …\u003c/p\u003e"
March 19, 2024
如何实现访问k8s集群服务之原理
"\u003cp\u003e当我们想将 k8s 集群里的服务向外暴露时,一般是将 k8s service 指定 \u003ccode\u003eLoadBalancer\u003c/code\u003e类型。目前大多数云厂商会绑定云平台的负载均衡器,并为其分配一个固定的公网 IP 从而向外提供服务。而对于我们自建的 kubernetes 裸机集群则只能选择类似 MetalLB 这类解决方案,这种情况下如何让用户可以通过这个 IP 访问到自建 k8s 的服务呢,本文来分析一下其实现原理。\u003c/p\u003e\n\u003cp\u003e本文的环境安装了 MetallB,它指定分配 IP Pool 为内网 IP 地址,实验环境为 \u003ca href=\"https://blog.haohtml.com/posts/install-kubernetes-in-raspberry-pi/\"\u003ehttps://blog.haohtml.com/posts/install-kubernetes-in-raspberry-pi/\u003c/a\u003e。\u003c/p\u003e\n\u003ch1 id=\"将外部请求流入集群节点\"\u003e将外部请求流入集群节点\u003c/h1\u003e\n\u003cp\u003e当我们需要访问一台机器时,无论是使用 IP 地址还是域名,最终都需要将其解析为 IP 地址。而要真正建立连接并传输数据,我们必须获取目标 IP 地址对应的 MAC 地址,这是由于 TCP/IP 协议分层机制决定的。\u003c/p\u003e\n\u003cp\u003e在 TCP/IP 协议栈的链路层,数据是通过封装成数据帧的方式在局域网内传输的。数据帧中包含了目标 MAC 地址,用于标识应该将数据 …\u003c/p\u003e"
February 2, 2024
Raspberry Pi 安装Kubernetes
"\u003cp\u003e这里是 arm64 架构,\u003cstrong\u003e树莓派 4B\u003c/strong\u003e, 四核八 G 内存 配置,系统为 Ubuntu 22.04.1 LTS\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ uname -a\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLinux ubuntu 5.15.0-1049-raspi \u003cspan style=\"color:#75715e\"\u003e#52-Ubuntu SMP PREEMPT Thu Mar 14 08:39:42 UTC 2024 aarch64 aarch64 aarch64 GNU/Linux\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ cat /etc/issue\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUbuntu 22.04.1 LTS \u003cspan style=\"color:#ae81ff\"\u003e\\n\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e\\l\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"环境检查\"\u003e环境检查\u003c/h2\u003e\n\u003cp\u003e由于 k8s 会使用 8080 和 6443 这两个端口,因此要保证端口可用,然后禁用 swap。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo swapoff -a\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e最后对安装环境初始化,参考 \u003ca href=\"https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/\"\u003ehttps://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"安装-docker\"\u003e安装 Docker\u003c/h2\u003e\n\u003cp\u003e参考 \u003ca href=\"https://docs.docker.com/engine/install/ubuntu/\"\u003ehttps://docs.docker.com/engine/install/ubuntu/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e安装成功后,修改 \u003ccode\u003ecgroupdriver\u003c/code\u003e 为 \u003ccode\u003esystemd\u003c/code\u003e, …\u003c/p\u003e"
January 12, 2024
使用kubectl create service 命令无法为pod创建service问题
"\u003cp\u003e在做一个试验时,无意中发现使用 \u003ccode\u003ekubectl create service\u003c/code\u003e 命令无法为一个通过 \u003ccode\u003edeployment\u003c/code\u003e 创建出来的pod创建对应的 \u003ccode\u003eservice\u003c/code\u003e, 感觉有点奇怪,经过分析才明白怎么回事,这里将过程记录一下。\u003c/p\u003e\n\u003cp\u003e这里需要说明一下,本文操作全部是通过 \u003ccode\u003ekubectl create\u003c/code\u003e 命令来完成的,并没有使用 \u003ccode\u003ekubectl apply -f pod.yaml\u003c/code\u003e 这种方式。\u003c/p\u003e\n\u003cp\u003e这里先创建一个实验命名空间 \u003ccode\u003elab\u003c/code\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ kubectl create ns lab\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e首先创建一个\u003ccode\u003edeployment\u003c/code\u003e 对象\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ kubectl create deployment test --image\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003enginx:1.23-alpine --replicas\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e2\u003c/span\u003e --port\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e80\u003c/span\u003e -n lab\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e确认创建成功\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ kubectl get deploy,pod -n lab\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eNAME READY UP-TO-DATE AVAILABLE AGE\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeployment.apps/test 2/2 \u003cspan style=\"color:#ae81ff\"\u003e2\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e2 …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
December 2, 2023
pod sandbox 创建netns源码分析
"\u003cp\u003e在上一篇《\u003ca href=\"https://blog.haohtml.com/archives/33163/\"\u003e创建Pod源码解析\u003c/a\u003e》文中,我们大概介绍了Pod的整体创建过程。其中有一步很重要,就是在创建三类容器之前必须先创建一个 \u003ccode\u003e sandbox\u003c/code\u003e (\u003ca href=\"https://github.com/kubernetes/kubernetes/blob/v1.27.3/pkg/kubelet/kuberuntime/kuberuntime_manager.go#L1079\"\u003e源码\u003c/a\u003e),本篇就来分析一下sandbox这一块的 \u003ccode\u003enetns\u003c/code\u003e 实现过程。\u003c/p\u003e\n\u003cp\u003e对 \u003ccode\u003esandbox\u003c/code\u003e 的创建由 \u003ccode\u003ekubelet\u003c/code\u003e 组件通过调用 \u003ca href=\"https://kubernetes.io/zh-cn/docs/concepts/architecture/cri/\"\u003eCRI\u003c/a\u003e 容器运行时服务来实现的,对于容器运行的实现目前市面上有多个,如 \u003ca href=\"https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/#docker\"\u003eDocker Engine\u003c/a\u003e(不推荐)、 \u003ca href=\"https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/#containerd\"\u003econtainerd\u003c/a\u003e、\u003ca href=\"https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/#cri-o\"\u003eCRI-O\u003c/a\u003e 等,由于目前生产环境中选择 containerd 的占大多数,所以这里我们以 \u003ccode\u003econtainerd\u003c/code\u003e 为例来看一下其实现过程。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/containerd/containerd/blob/32bf805e5703bc91387d047fa76625e915ac2b80/pkg/cri/server/sandbox_run.go\"\u003ehttps://github.com/containerd/containerd/blob/32bf805e5703bc91387d047fa76625e915ac2b80/pkg/cri/server/sandbox_run.go\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e对 sandbox 的创建是由 cri 服务调用 \u003ccode\u003eRunPodSandbox()\u003c/code\u003e方法来实现的。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e// RunPodSandbox creates and starts a pod-level sandbox. …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
November 28, 2023
Rust中与闭包相关的三个trait
"\u003cp\u003e在 Rust 中,闭包就是一种能捕获 \u003ccode\u003e上下文环境变量\u003c/code\u003e 的函数。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-rust\" data-lang=\"rust\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003elet\u003c/span\u003e range \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e0\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e..\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e10\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003elet\u003c/span\u003e get_range_count \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e||\u003c/span\u003e range.count(); \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e代码里的这个 \u003ccode\u003eget_range_count\u003c/code\u003e 就是闭包,range 是被这个闭包捕获的环境变量。\u003c/p\u003e\n\u003cp\u003e虽然说它是一种函数,但是不通过 \u003ccode\u003efn\u003c/code\u003e 进行定义。\u003cstrong\u003e在 Rust 中,并不把这个闭包的类型处理成 fn 这种函数指针类型,而是有单独的类型定义。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e切记这里是将闭包处理成是 \u003ccode\u003e单独的类型定义\u003c/code\u003e,这一点区别与其它开发语言。\u003c/p\u003e\n\u003cp\u003e至于按哪一种类型来处理,这个没有办法得知,因为只有在Rust编译器在编译的时候才可以确定其类型,并且在确定类型时,还需要根据这个闭包捕获上下文环境变量时的行为来确定。\u003c/p\u003e\n\u003ch1 id=\"闭包trait分类\"\u003e闭包trait分类\u003c/h1\u003e\n\u003cp\u003e根据闭包行为划分为三类trait( 主因是受到所有权影响):\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003eFnOnce\u003c/code\u003e 适用于只能被调用一次的闭包,\u003ccode\u003e所有闭包\u003c/code\u003e都至少实现了这个 trait,因为所有闭包都必须能够被调用。一个会将捕获的值移出闭包体的闭包只实现 \u003ccode\u003eFnOnce\u003c/code\u003e trait,这是因为它只能被调用一次。其获取了上下文环境变量的所有权。\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eFnMut\u003c/code\u003e 适用 …\u003c/li\u003e\u003c/ol\u003e"
November 16, 2023
Rust中的迭代器iter
"\u003cp\u003e迭代器模式允许你对一个序列的项进行某些处理。\u003cstrong\u003e迭代器\u003c/strong\u003e(\u003cem\u003eiterator\u003c/em\u003e)负责遍历序列中的每一项和决定序列何时结束的逻辑。当使用迭代器时,我们无需重新实现这些逻辑。\u003c/p\u003e\n\u003cp\u003e在 Rust 中,迭代器是 \u003cstrong\u003e惰性的\u003c/strong\u003e(\u003cem\u003elazy\u003c/em\u003e),这意味着在调用方法使用迭代器之前它都不会有效果。例如,示例中的代码通过调用定义于 \u003ccode\u003eVec\u003c/code\u003e 上的 \u003ccode\u003eiter\u003c/code\u003e 方法在一个 vector \u003ccode\u003ev1\u003c/code\u003e 上创建了一个迭代器。这段代码本身没有任何用处:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-rust\" data-lang=\"rust\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003elet\u003c/span\u003e v1 \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003evec!\u003c/span\u003e[\u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#ae81ff\"\u003e2\u003c/span\u003e, \u003cspan style=\"color:#ae81ff\"\u003e3\u003c/span\u003e];\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003elet\u003c/span\u003e v1_iter \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e v1.iter();\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e迭代器被储存在 \u003ccode\u003ev1_iter\u003c/code\u003e 变量中。一旦创建迭代器之后,可以选择用多种方式利用它。\u003c/p\u003e\n\u003ch1 id=\"迭代器分类\"\u003e迭代器分类\u003c/h1\u003e\n\u003cp\u003eRust 中迭代器根据 \u003ccode\u003e所有权\u003c/code\u003e 可分为 \u003ccode\u003eiter()\u003c/code\u003e、\u003ccode\u003eiter_mut()\u003c/code\u003e、\u003ccode\u003einto_iter()\u003c/code\u003e 三种迭代器,使用场景:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e获取集合元素不可变引用的迭代器,对应方法为 \u003ccode\u003eiter()\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e获取集合元素可变引用的迭代器,对应方法为 \u003ccode\u003eiter_mut()\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e获取集合元素所有权的迭代器,对应方法为 \u003ccode\u003einto_iter()\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e也就是说当你在 Rust 中看到调用了 \u003ccode\u003eiter()\u003c/code\u003e 方法,则表示这里使用了不可 …\u003c/p\u003e"
November 7, 2023
Rust 中的 Result 与 Option
"\u003cp\u003e在 Rust 中有两个常用的 \u003ccode\u003eenum\u003c/code\u003e 枚举类型,分别为 \u003ccode\u003eResult\u003c/code\u003e 和 \u003ccode\u003eOption\u003c/code\u003e,本节介绍它们两者各自的使用场景和用法。\u003c/p\u003e\n\u003cp\u003e这里我们先给出结论\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e结果 \u003ccode\u003eResult\u003c/code\u003e 表示 \u003ccode\u003e成功\u003c/code\u003e 或 \u003ccode\u003e失败\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e选项 \u003ccode\u003eOption\u003c/code\u003e 表示 \u003ccode\u003e有\u003c/code\u003e 或者 \u003ccode\u003e无\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e当从本地读取一个文件时,这时候可能读取成功,也有可能由于文件不存在或权限不足导致读取时候,这种场景一般就需要使用 \u003ccode\u003eResult\u003c/code\u003e;而当从一组数据集中查询指定元素是否存在时,这时有可能存在,也有可能不存在(用None 表示),这时情况就应该选择Option。\u003c/p\u003e\n\u003cp\u003e由此看到,这两个枚举类型的区别理解起来还是挺简单的,下面我们单独对每一种类型做一下详细的介绍。\u003c/p\u003e\n\u003ch1 id=\"结果-result\"\u003e结果 Result\u003c/h1\u003e\n\u003cp\u003e定义\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-rust\" data-lang=\"rust\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eenum\u003c/span\u003e Result\u003cspan style=\"color:#f92672\"\u003e\u0026lt;\u003c/span\u003eT, E\u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e Ok(T),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e Err(E),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003eResult\u0026lt;T, E\u0026gt;\u003c/code\u003e 类型拥有两个取值:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eOk(value)\u003c/code\u003e 表示操作成功,并包装操作返回的 \u003ccode\u003evalue\u003c/code\u003e(\u003ccode\u003evalue\u003c/code\u003e 拥有 \u003ccode\u003eT\u003c/code\u003e 泛类型)。\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eErr(why)\u003c/code\u003e,表示操作失败,并包装 \u003ccode\u003ewhy\u003c/code\u003e,它(但愿)能够解释失败的原因(\u003ccode\u003ewhy\u003c/code\u003e 拥有 \u003ccode\u003eE\u003c/code\u003e 类型)。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e举个例子,这里打开 …\u003c/p\u003e"
October 2, 2023
kubectr 一款快速查看Pod容器的kubectl插件
"\u003cp\u003e以前工作中经常需要查看Pod里容器相关信息,特别是容器镜像信息,以前一直是通过 \u003ccode\u003ekubectl describe\u003c/code\u003e命令查看的\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ kubectl describe my-pod\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e但由于输出的内容特别多,查看容器关键信息特别麻烦。印象最深的莫过于在部署 \u003ccode\u003eistio\u003c/code\u003e时,由于国内网络环境不稳定,经常性的遇到镜像下载失败的情况,当时极其的头疼。\u003c/p\u003e\n\u003cp\u003e于是最近花了一点时间,开发了一款快速查看 Pod 容器信息的插件 \u003ca href=\"https://github.com/cfanbo/kubectr\"\u003ekubectr\u003c/a\u003e 。\u003c/p\u003e\n\u003ch1 id=\"安装\"\u003e安装\u003c/h1\u003e\n\u003cp\u003e安装方法主要有三种\u003c/p\u003e\n\u003ch2 id=\"krew-安装推荐\"\u003ekrew 安装(推荐)\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ kubectl krew install ctr\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cblockquote\u003e\n\u003cp\u003e目前已提交到 \u003ca href=\"https://github.com/kubernetes-sigs/krew\"\u003ekrew\u003c/a\u003e ,但由于官方审核速度较慢,此安装方法不敢保证可用\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"二进制安装\"\u003e二进制安装\u003c/h2\u003e\n\u003cp\u003e从 \u003ca href=\"https://github.com/cfanbo/kubectr/releases\"\u003ehttps://github.com/cfanbo/kubectr/releases\u003c/a\u003e 下载对应的平台版本,并解压到对应的 PATH 环境变量目录即可。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ tar zxvf kubectr_linux_amd64.tar.gz\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ sudo mv kubectr /usr/local/bin/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ kubectr -h\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"源码安装\"\u003e源码安装\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ git clone …\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
September 22, 2023
envoy中 lua filter 与 wasm filter使用教程
"\u003cp\u003e在 Envoy 中当我们需要对 \u003ca href=\"https://www.envoyproxy.io/docs/envoy/latest/api-v3/extensions/filters/network/http_connection_manager/v3/http_connection_manager.proto#envoy-v3-api-msg-extensions-filters-network-http-connection-manager-v3-httpconnectionmanager\"\u003ehttp_connection_manager\u003c/a\u003e 中的请求进行修改时,如添加或删除一个请求header,一般通过 \u003ccode\u003eHTTP Filter\u003c/code\u003e 过滤器来实现。\u003c/p\u003e\n\u003cp\u003e而在Envoy 包含的几十个Filter中,通常会选择 \u003ccode\u003eLua Filter \u003c/code\u003e(\u003ca href=\"https://www.envoyproxy.io/docs/envoy/latest/api-v3/extensions/filters/http/lua/v3/lua.proto#extensions-filters-http-lua-v3-lua\"\u003eextensions.filters.http.lua.v3.Lua\u003c/a\u003e) 或 \u003ccode\u003eWasm Filter\u003c/code\u003e (\u003ca href=\"https://www.envoyproxy.io/docs/envoy/latest/api-v3/extensions/filters/http/wasm/v3/wasm.proto#extensions-filters-http-wasm-v3-wasm\"\u003eextensions.filters.http.wasm.v3.Wasm\u003c/a\u003e)这两类过滤器。\u003c/p\u003e\n\u003ch1 id=\"lua-filter-与-wasm-filter\"\u003eLua Filter 与 Wasm Filter\u003c/h1\u003e\n\u003cp\u003e下表是 \u003ccode\u003eLua Filter\u003c/code\u003e 与 \u003ccode\u003eHTTP Filter\u003c/code\u003e 的对比\u003c/p\u003e\n\u003ctable\u003e\n \u003cthead\u003e\n \u003ctr\u003e\n \u003cth\u003e\u003c/th\u003e\n \u003cth\u003eLua Filter\u003c/th\u003e\n \u003cth\u003eWasm Filter\u003c/th\u003e\n \u003c/tr\u003e\n \u003c/thead\u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\u003e编程语言\u003c/td\u003e\n \u003ctd\u003eLua,解释型脚本语言\u003c/td\u003e\n \u003ctd\u003eWebAssembly,编译型语言\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\u003e运行环境\u003c/td\u003e\n \u003ctd\u003eEnvoy 内置的 Lua …\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e"
September 17, 2023
WebAssembly开发入门教程
"\u003ch1 id=\"wasm简介\"\u003ewasm简介\u003c/h1\u003e\n\u003cp\u003eWebAssembly(Wasm)是一种通用字节码技术,它可以将其他编程语言(如 Go、Rust、C/C++ 等)的程序代码编译为可在浏览器或服务端环境直接执行的字节码程序。\u003c/p\u003e\n\u003ch1 id=\"使用场景\"\u003e使用场景\u003c/h1\u003e\n\u003cp\u003e主要有两个使用场景,分别为 浏览器 和 服务端。\u003c/p\u003e\n\u003ch2 id=\"浏览器\"\u003e浏览器\u003c/h2\u003e\n\u003cp\u003ewasm最早的出现是为了解决浏览器端的性能问题,让web应用可以达到与本地原生应用类似的性能。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2023/09/640.png\" alt=\"Image\"\u003e\u003c/p\u003e\n\u003cp\u003e对于浏览器chrome 采用了v8 javascript引擎,其内置了一个 Wasm Runtime,因此可以实现对 wasm 的支持,这也正是浏览器可以运动wasm的原因。\u003c/p\u003e\n\u003ch2 id=\"服务端\"\u003e服务端\u003c/h2\u003e\n\u003cp\u003e2019 年 3 月,Mozilla 推出了 WebAssembly 系统接口(Wasi),以标准化 WebAssembly 应用程序与系统资源之间的交互抽象,例如文件系统访问、内存管理和网络连接,该接口类似于 POSIX 等标准 API。\u003cstrong\u003eWasi 规范的出现极大地扩展了 WebAssembly 的应用场景,使得 Wasm 不仅限于在浏览器中运行,而且可以在服务器端得到应用\u003c/strong\u003e。同时,平台开发者可以针对特定的操作系统和运行环境提供 Wasi 接口的不同实现,允 …\u003c/p\u003e"
September 5, 2023
istio 中 sidecar 注入实现原理
"\u003cp\u003e在 istio 中为了对流量进行有效的管理,一般通过\u003ccode\u003e注入\u003c/code\u003e的方式将代理 \u003ccode\u003eistio-proxy\u003c/code\u003e 与应用程序一起位于同一个Pod,然后通过 \u003ccode\u003eistio-init \u003c/code\u003e initContainer修改 iptables 实现 \u003ccode\u003eingress\u003c/code\u003e 或 \u003ccode\u003eegress\u003c/code\u003e,那么在 istio 中这个注入是如何实现的呢,本节对其实现原理进行一些分析。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://istio.io/latest/docs/concepts/security/arch-sec.svg\" alt=\"https://istio.io/latest/docs/concepts/security/arch-sec.svg\"\u003e\u003c/p\u003e\n\u003ch1 id=\"实现原理\"\u003e实现原理\u003c/h1\u003e\n\u003cp\u003e在上一节\u003ca href=\"https://blog.haohtml.com/archives/34883/\"\u003e《apiserver 中的webhook开发教程》\u003c/a\u003e 我们介绍过\u003ccode\u003eadmission controller\u003c/code\u003e 基本实现原理,由此得知当创建一个资源对象的时候,可以通过定义 \u003ccode\u003eValidatingWebhookConfiguration\u003c/code\u003e 或 \u003ccode\u003eMutatingWebhookConfiguration\u003c/code\u003e 实现在创建的进程中对这些 webhook 进行调用。而 \u003ccode\u003eMutatingWebhookConfiguration\u003c/code\u003e 则可以对请求的资源进行修改。在istio中的 \u003ccode\u003einjection\u003c/code\u003e 正是基于此原理实现的。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2023/08/6ca5dd6b207691069de1cf4df59cc6ad.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003ch1 id=\"webhook配置\"\u003ewebhook配置\u003c/h1\u003e\n\u003cp\u003e当我们在k8s集群中安装 istio 后,会创建一些资源,如 \u003ccode\u003edeployment\u003c/code\u003e、\u003ccode\u003eservice\u003c/code\u003e、\u003ccode\u003ecrd\u003c/code\u003e 等\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ istioctl …\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
August 31, 2023
terraform 中的 provider
"\u003cp\u003e本文主要对 \u003ca href=\"https://www.terraform.io/\"\u003eterraform\u003c/a\u003e 中的 \u003ccode\u003eProviders\u003c/code\u003e 进行介绍,让刚刚接触 \u003ccode\u003eterraform\u003c/code\u003e 的用户对其有一个大概的了解,以下内容翻译自:https://developer.hashicorp.com/terraform/language/providers\u003c/p\u003e\n\u003ch1 id=\"什么是-providers\"\u003e什么是 Providers\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e实践:\u003c/strong\u003e Try the \u003ca href=\"https://developer.hashicorp.com/terraform/tutorials/configuration-language/provider-use?utm_source=WEBSITE\u0026amp;utm_medium=WEB_IO\u0026amp;utm_offer=ARTICLE_PAGE\u0026amp;utm_content=DOCS\"\u003ePerform CRUD Operations with Providers\u003c/a\u003e tutorial.\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eTerraform 依赖于称为提供商的插件来与\u003ccode\u003e云提供商\u003c/code\u003e、\u003ccode\u003eSaaS 提供商\u003c/code\u003e和 \u003ccode\u003e其他 API\u003c/code\u003e 进行交互。 Terraform 配置必须声明它们需要哪些 \u003ccode\u003eproviders\u003c/code\u003e,以便 \u003ccode\u003eTerraform\u003c/code\u003e 可以 \u003cstrong\u003e安装\u003c/strong\u003e 和 \u003cstrong\u003e使用\u003c/strong\u003e 它们。此外,某些提供商在使用之前需要进行配置(例如 \u003ccode\u003e端点 URL\u003c/code\u003e 或 \u003ccode\u003e云区域\u003c/code\u003e)。\u003c/p\u003e\n\u003ch1 id=\"providers-能做什么\"\u003eProviders 能做什么\u003c/h1\u003e\n\u003cp\u003e每一个 Providers 都会有一组 Terraform 可以管理的 \u003ca href=\"https://developer.hashicorp.com/terraform/language/resources\"\u003eresource types\u003c/a\u003e 和或 \u003ca href=\"https://developer.hashicorp.com/terraform/language/data-sources\"\u003edata sources\u003c/a\u003e。如我们经常使用的 \u003ca href=\"https://registry.terraform.io/providers/kreuzwerker/docker/latest/docs\"\u003edocker provider\u003c/a\u003e, 它提供了一些 \u003ccode\u003eResources\u003c/code\u003e 和 \u003ccode\u003eData sources\u003c/code\u003e,使用 …\u003c/p\u003e"
August 19, 2023
k8s 中 CRD controller 开发教程
"\u003cp\u003e本文主要介绍 \u003ccode\u003ecrd controller\u003c/code\u003e 的基本开发过程,让每一个刚接触k8s开发的同学都可以轻松开发自己的控制器。\u003c/p\u003e\n\u003ch1 id=\"kubebuilder-简介\"\u003ekubebuilder 简介\u003c/h1\u003e\n\u003cp\u003e\u003ccode\u003ekubebuilder\u003c/code\u003e 是一个帮助开发者快速开发 \u003ccode\u003ekubernetes API\u003c/code\u003e 的脚手架命令行工具,其依赖 \u003ccode\u003econtroller-tools\u003c/code\u003e 和 \u003ccode\u003econtroller-runtime\u003c/code\u003e 两个库。其中 \u003ccode\u003econtroller-runtime\u003c/code\u003e 简化 \u003ccode\u003ekubernetes controller\u003c/code\u003e 的开发,并且对 \u003ccode\u003ekubernetes\u003c/code\u003e 的几个常用库进行了二次封装, 以简化开发工程。而 \u003ccode\u003econtroller-tool\u003c/code\u003e 主要功能是代码生成。\u003c/p\u003e\n\u003cp\u003e下图是使用 \u003ccode\u003ekubebuilder\u003c/code\u003e 的工作流程图:\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2023/08/76264fc22f097ec97349461e383ed996.webp\" alt=\"format%2Cpng\"\u003e\u003c/p\u003e\n\u003ch1 id=\"安装-kubebuilder\"\u003e安装 kubebuilder\u003c/h1\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# download kubebuilder and install locally.\n➜ curl -L -o kubebuilder \u0026#34;https://go.kubebuilder.io/dl/latest/$(go env GOOS)/$(go env GOARCH)\u0026#34;\n➜ chmod +x kubebuilder …\u003c/code\u003e\u003c/pre\u003e"
August 3, 2023
apiserver 中的webhook开发教程
"\u003cp\u003ek8s: v1.27.3\u003c/p\u003e\n\u003ch2 id=\"what-are-they.wp-block-heading\"\u003e什么是准入控制插件?\u003ca href=\"https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/admission-controllers/#what-are-they\"\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e准入控制器\u003c/strong\u003e 是一段代码,它会在请求通过\u003cstrong\u003e认证\u003c/strong\u003e和\u003cstrong\u003e鉴权\u003c/strong\u003e之后、对象被持久化之前拦截到达 API 服务器的请求。\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2023/08/6ca5dd6b207691069de1cf4df59cc6ad.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e准入控制器可以执行 \u003cstrong\u003e变更(Mutating)\u003c/strong\u003e 和或 \u003cstrong\u003e验证(Validating)\u003c/strong\u003e 操作。 变更(mutating)控制器可以根据被其接受的请求更改相关对象;验证(validating)控制器则不行。\u003c/p\u003e\n\u003cp\u003e准入控制器限制创建、删除、修改对象的请求。 准入控制器也可以阻止自定义动作,例如通过 API 服务器代理连接到 Pod 的请求。 准入控制器\u003cstrong\u003e不会\u003c/strong\u003e (也不能)阻止读取(\u003cstrong\u003eget\u003c/strong\u003e、\u003cstrong\u003ewatch\u003c/strong\u003e 或 \u003cstrong\u003elist\u003c/strong\u003e)对象的请求。\u003c/p\u003e\n\u003cp\u003e某些控制器既是变更准入控制器又是验证准入控制器。如果两个阶段之一的任何一个控制器拒绝了某请求,则整个请求将立即被拒绝,并向最终用户返回错误。\u003c/p\u003e\n\u003cp\u003eKubernetes 1.27 中的准入控制器由下面的\u003ca href=\"https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/admission-controllers/#what-does-each-admission-controller-do\"\u003e列表\u003c/a\u003e组成, 并编译进 \u003ccode\u003ekube-apiserver\u003c/code\u003e 可执行文件,并且只能由集群管理员配置。 在该列表中,有两个特殊的控制器:\u003ccode\u003eMutatingAdmissionWebhook\u003c/code\u003e 和 \u003ccode\u003eValidatingAdmissionWebhook\u003c/code\u003e。 它们 …\u003c/p\u003e"
August 1, 2023
k8s之kube-controller-manager 源码分析
"\u003cp\u003eKubernetes 控制器管理器(\u003ccode\u003ekube-controller-manager\u003c/code\u003e)是一个守护进程,内嵌随 Kubernetes 一起发布的核心控制回路。 在机器人和自动化的应用中,控制回路是一个永不休止的循环,用于调节系统状态。 在 Kubernetes 中,每个控制器是一个控制回路,通过 API 服务器监视集群的共享状态, 并尝试进行更改以将当前状态转为期望状态。 目前,Kubernetes 自带的控制器例子包括副本控制器、节点控制器、命名空间控制器和服务账号控制器等。\u003c/p\u003e\n\u003cp\u003e本文不对 \u003ccode\u003ekube-controller-manager\u003c/code\u003e 管理的每个控制器的执行原理做介绍,只是从全局观看一下kube-controller-manager 启动每个控制器的整体实现过程。\u003c/p\u003e\n\u003cp\u003ek8s: v1.27.3\u003c/p\u003e\n\u003cp\u003e文件: \u003ca href=\"https://github.com/kubernetes/kubernetes/blob/v1.27.3/cmd/kube-controller-manager/app/controllermanager.go\"\u003ecmd/kube-controller-manager/app/controllermanager.go\u003c/a\u003e\u003c/p\u003e\n\u003ch1 id=\"控制器选项初始化\"\u003e控制器选项初始化\u003c/h1\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e// cmd/kube-controller-manager/app/controllermanager.go#L104\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003efunc …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
July 31, 2023
k8s调度器插件开发教程
"\u003cp\u003e上一篇 \u003ca href=\"https://blog.haohtml.com/archives/33138\"\u003e《k8s调度器 kube-scheduler 源码解析》\u003c/a\u003e 大概介绍一调度器的内容,提到扩展点的插件这个概念,下面我们看看如何开发一个自定义调度器。\u003c/p\u003e\n\u003cp\u003e本文源码托管在 \u003ca href=\"https://github.com/cfanbo/sample-scheduler\"\u003ehttps://github.com/cfanbo/sample-scheduler\u003c/a\u003e。\u003c/p\u003e\n\u003ch1 id=\"插件机制\"\u003e插件机制\u003c/h1\u003e\n\u003cp\u003e在Kubernetes调度器中,共有两种插件机制,分别为 \u003ccode\u003ein-tree\u003c/code\u003e 和 \u003ccode\u003eout-of-tree\u003c/code\u003e。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eIn-tree插件(内建插件):这些插件是作为Kubernetes核心组件的一部分直接编译和交付的。它们与Kubernetes的源代码一起维护,并与Kubernetes版本保持同步。这些插件以静态库形式打包到kube-scheduler二进制文件中,因此在使用时不需要单独安装和配置。一些常见的in-tree插件包括默认的调度算法、Packed Scheduling等。\u003c/li\u003e\n\u003cli\u003eOut-of-tree插件(外部插件):这些插件是作为独立项目开发和维护的,它们与Kubernetes核心代码分开,并且可以单独部署和更新。本质上,out-of-tree插件是基于Kubernetes的调度器扩展点进行开发的。这些插件以独立的二进制文件 …\u003c/li\u003e\u003c/ol\u003e"
July 28, 2023
k8s调试之 kube-apiserver 组件
"\u003cp\u003e上一节\u003ca href=\"https://blog.haohtml.com/archives/34402\"\u003e《GoLand+dlv进行远程调试》\u003c/a\u003e我们介绍了如何使用 \u003ccode\u003eGoLand\u003c/code\u003e 进行远程调试,本节我们就以 \u003ccode\u003ekube-apiserver\u003c/code\u003e 为例演示一下调试方法。\u003c/p\u003e\n\u003ch1 id=\"服务器环境\"\u003e服务器环境\u003c/h1\u003e\n\u003cp\u003e作为开发调试服务器,需要安装以下环境\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e安装 \u003ccode\u003eGolang\u003c/code\u003e 环境,国内最好设置 \u003ccode\u003eGOPROXY\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e安装 \u003ccode\u003edlv\u003c/code\u003e 调试工具\u003c/li\u003e\n\u003cli\u003e安装 \u003ccode\u003eDocker\u003c/code\u003e 环境, 同时安装 \u003ccode\u003econtainerd\u003c/code\u003e 服务(对应官方教程中的 \u003ccode\u003econtainerd.io\u003c/code\u003e 安装包)并设置代理\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch1 id=\"同步代码本地\"\u003e同步代码(本地)\u003c/h1\u003e\n\u003cp\u003e以下为我们本机环境设置。\u003c/p\u003e\n\u003cp\u003e本机下载 \u003ca href=\"https://github.com/kubernetes/kubernetes\"\u003ekubernetes\u003c/a\u003e 仓库\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit clone --filter\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003eblob:none https://github.com/kubernetes/kubernetes.git\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cblockquote\u003e\n\u003cp\u003e这里指定 –filter=bold:none 可以实现最小化下载\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这里 k8s 项目目录为 \u003ccode\u003e/Users/sxf/workspace/kubernetes\u003c/code\u003e, 对应远程服务器目录为 \u003ccode\u003e/home/sxf/workspace/kubernetes\u003c/code\u003e,如图所示\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2023/07/d2b5ca33bd970f64a6301fa75ae2eb22-6.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e映射关系配置\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2023/07/d2b5ca33bd970f64a6301fa75ae2eb22-7.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e同时选择自动上传 \u003ccode\u003eAutomatic upload (Always)\u003c/code\u003e 菜单,这 …\u003c/p\u003e"
July 27, 2023
Goland+dlv远程调试
"\u003cp\u003e环境\u003c/p\u003e\n\u003cp\u003e远程服务器(Linux):192.168.245.137\u003c/p\u003e\n\u003cp\u003e本地(macOS):GoLand\u003c/p\u003e\n\u003ch1 id=\"目的\"\u003e目的\u003c/h1\u003e\n\u003cp\u003e远程调试就是使用使用本地 IDE 来调试远程服务器上的服务。本地打断点,调用远程服务的接口。本地就会停在断点。\u003c/p\u003e\n\u003cp\u003e为什么需要远程调试呢?主要有以下几点原因:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e运行环境:有时候本机不具备调试环境,如开发的程序依赖太多组件,而这些组件在当前机器并不被支持\u003c/li\u003e\n\u003cli\u003e性能:一般远程服务器的配置都比较高,编译速度也比较快。而开发机器的配置相对要低一些,每次修改程序都要重新编译,非常的消耗时间。\u003c/li\u003e\n\u003cli\u003e硬盘空间:编译时产生大量的中间临时文件,多达10个G左右,如果本机硬盘空间不足的话,则根本就没有办法进行本地调试\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e我这里用的系统是macOS,硬盘只有128G大小,硬盘空间非常的紧张,vmware虚拟机占用了30个G, 在虚拟机里编译时发现期间产生的临时文件达到6个G,硬盘空间已经不远远不够,所以选择使用远程调试这种方式。\u003c/p\u003e\n\u003cp\u003e这些调试方式对于k8s 开发者来讲应该比较常见,如 \u003ca href=\"https://blog.haohtml.com/archives/34454\"\u003e调试 \u003ccode\u003ekube-apiserver\u003c/code\u003e 组件\u003c/a\u003e。\u003c/p\u003e\n\u003ch1 id=\"安装-dlv远程\"\u003e安装 dlv(远程)\u003c/h1\u003e\n\u003cp\u003e首先我们在远程服务器安装 \u003ca href=\"https://go.dev\"\u003eGolang\u003c/a\u003e 环境 和 \u003ca href=\"https://github.com/go-delve/delve\"\u003edlv\u003c/a\u003e 命令。 …\u003c/p\u003e"
July 18, 2023
kubelet 源码之 Plugin注册机制
"\u003cp\u003e上一篇\u003ca href=\"https://blog.haohtml.com/archives/33188\"\u003e《Kubelet 服务引导流程》\u003c/a\u003e我们讲了kubelet的大概引导流程, 本节我们看一下 \u003ccode\u003ePlugins\u003c/code\u003e 这一块的实现源码。\u003c/p\u003e\n\u003cp\u003eversion: v1.27.3\u003c/p\u003e\n\u003ch1 id=\"插件模块入口\"\u003e插件模块入口\u003c/h1\u003e\n\u003cp\u003e入口文件 \u003ccode\u003e/pkg/kubelet/kubelet.go\u003c/code\u003e中的 \u003ccode\u003eNewMainKubelet()\u003c/code\u003e 函数,\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003efunc\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eNewMainKubelet\u003c/span\u003e(\u003cspan style=\"color:#a6e22e\"\u003ekubeCfg\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003ekubeletconfiginternal\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eKubeletConfiguration\u003c/span\u003e,\u003cspan style=\"color:#f92672\"\u003e...\u003c/span\u003e) (\u003cspan style=\"color:#f92672\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003eKubelet\u003c/span\u003e, \u003cspan style=\"color:#66d9ef\"\u003eerror\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#75715e\"\u003e// 插件管理器 /pkg/kubelet/kubelet.go#L811-L814\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#a6e22e\"\u003eklet\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003epluginManager\u003c/span\u003e = \u003cspan style=\"color:#a6e22e\"\u003epluginmanager\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eNewPluginManager\u003c/span\u003e(\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#a6e22e\"\u003eklet\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003egetPluginsRegistrationDir\u003c/span\u003e(), \u003cspan style=\"color:#75715e\"\u003e/* sockDir */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#a6e22e\"\u003ekubeDeps\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eRecorder\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e )\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里第一个参数 \u003ccode\u003eklet.getPluginsRegistrationDir() …\u003c/code\u003e\u003c/p\u003e"
July 7, 2023
kube-proxy 源码解析
"\u003cp\u003ek8s版本:v1.17.3\u003c/p\u003e\n\u003ch1 id=\"组件简介\"\u003e组件简介\u003c/h1\u003e\n\u003cp\u003ekube-proxy是Kubernetes中的一个核心组件之一,它提供了一个网络代理和负载均衡服务,用于将用户请求路由到集群中的正确服务。\u003c/p\u003e\n\u003cp\u003ekube-proxy的主要功能包括以下几个方面:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e服务代理:kube-proxy会监听Kubernetes API服务器上的服务和端口,并将请求转发到相应的后端Pod。它通过在节点上创建iptables规则或使用IPVS(IP Virtual Server)进行负载均衡,以保证请求的正确路由。\u003c/li\u003e\n\u003cli\u003e负载均衡:当多个Pod实例对外提供相同的服务时,kube-proxy可以根据负载均衡算法将请求分发到这些实例之间,以达到负载均衡的目的。它可以基于轮询、随机、源IP哈希等算法进行负载均衡。\u003c/li\u003e\n\u003cli\u003e故障转移:如果某个Pod实例不可用,kube-proxy会检测到并将其自动从负载均衡轮询中移除,从而保证用户请求不会被转发到不可用的实例上。\u003c/li\u003e\n\u003cli\u003e会话保持(Session Affinity):kube-proxy可以通过设置会话粘性(Session Affinity)来将同一客户端的请求转发到同一Pod实例,从而保持会话状态的一致性。\u003c/li\u003e\n\u003cli\u003e …\u003c/li\u003e\u003c/ol\u003e"
June 21, 2023
Kubelet 服务引导流程
"\u003cp\u003e版本:v1.17.3\u003c/p\u003e\n\u003cp\u003e入口文件: \u003ca href=\"https://github.com/kubernetes/kubernetes/blob/v1.27.3/cmd/kubelet/kubelet.go\"\u003e/cmd/kubelet/kubelet.go\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e本文主要是为了通过阅读kubelet启动流程源码,实现对整个kubelet 组件及其服务有所了解,因此许多相关组件服务的运行机制并没有详细介绍,如果有时间的话,可以针对每个组件服务进行详细介绍。\u003c/p\u003e\n\u003cp\u003e在k8s中 \u003ccode\u003ekubelet\u003c/code\u003e 是一个极其重要的组件之一,也是 Kubernetes 里面第二个不可被替代的组件(第一个不可被替代的组件当然是 \u003ccode\u003ekube-apiserver\u003c/code\u003e)。也就是说,无论如何,都不太建议你对 kubelet 的代码进行大量的改动。保持 kubelet 跟上游基本一致的重要性,就跟保持 kube-apiserver 跟上游一致是一个道理。\u003c/p\u003e\n\u003cp\u003ekubelet 本身,也是按照“控制器”模式来工作的。它实际的工作原理,可以用如下所示的一幅示意图来表示清楚。\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2023/07/d2b5ca33bd970f64a6301fa75ae2eb22-2.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e可以看到,kubelet 的工作核心,就是一个控制循环,即:SyncLoop(图中的大圆圈)。而驱动这个控制循环运行的事件,包括四种:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePod 更新事件;\u003c/li\u003e\n\u003cli\u003ePod 生命周期变化;\u003c/li\u003e\n\u003cli\u003ekubelet 本身设置的执行周期;\u003c/li\u003e\n\u003cli\u003e定时的清理事件。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e所以,跟其他控 …\u003c/p\u003e"
June 11, 2023
创建Pod源码解析
"\u003cp\u003e在上一篇\u003ca href=\"https://blog.haohtml.com/archives/33188\"\u003e《Kubelet 服务引导流程》\u003c/a\u003e中我们介绍了 \u003ccode\u003ekubelet\u003c/code\u003e 服务启动的大致流程,其中提到过对 Pod 的管理,这一节将详细介绍一下对Pod的相关操作,如创建、修改、删除等操作。建议先了解一下上节介绍的内容。\u003c/p\u003e\n\u003cp\u003e在 \u003ccode\u003ekubelet\u003c/code\u003e 启动的时候,会通过三种 pod source 方式来获取 pod 信息:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003efile: 这种方式只要针对 staticPod 来处理,定时观察配置文件是否发生变更情况来写入 pod\u003c/li\u003e\n\u003cli\u003ehttp方式: 就是通过一个http请求一个 URL 地址,用来获取 \u003ccode\u003esimple Pod\u003c/code\u003e 信息\u003c/li\u003e\n\u003cli\u003eclientSet: 这种方式直接与 APIServer 通讯,对 pod 进行watch\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e上面这三种 \u003ccode\u003epod source\u003c/code\u003e ,一旦有pod 的变更信息,将直接写入一个 \u003ccode\u003ekubetypes.PodUpdate\u003c/code\u003e 这个 \u003ccode\u003echannel\u003c/code\u003e(参考: \u003ca href=\"https://github.com/kubernetes/kubernetes/blob/v1.27.3/pkg/kubelet/kubelet.go#L278-L313\"\u003ehttps://github.com/kubernetes/kubernetes/blob/v1.27.3/pkg/kubelet/kubelet.go#L278-L313\u003c/a\u003e),然后由下面我们要讲的内容进行读取消费。\u003c/p\u003e\n\u003cp\u003e对于pod 的操作除了这 …\u003c/p\u003e"
June 11, 2023
k8s调度器 kube-scheduler 源码解析
"\u003cp\u003e版本号:v1.27.2\u003c/p\u003e\n\u003cp\u003eKubernetes 调度程序作为一个进程与其他主组件(例如 API 服务器)一起运行。它与 API 服务器的接口是监视具有空 \u003ccode\u003ePodSpec.NodeName\u003c/code\u003e 的 Pod,并且对于每个 Pod,它都会发布一个 \u003ccode\u003eBinding\u003c/code\u003e,指示应将 Pod 调度到哪里。\u003c/p\u003e\n\u003ch1 id=\"调度过程\"\u003e调度过程\u003c/h1\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e +-------+\n +---------------+ node 1|\n | +-------+\n |\n +----\u0026gt; | Apply pred. filters\n | |\n | | +-------+\n | +----+----------\u0026gt;+node 2 |\n | | +--+----+\n | watch | |\n | | | …\u003c/code\u003e\u003c/pre\u003e"
April 25, 2023
istio之pilot-agent 源码分析
"\u003cp\u003e源码版本:istio-v1.11.3\u003c/p\u003e\n\u003cp\u003e为了方便理解,本文会介绍到 \u003ccode\u003evm\u003c/code\u003e 和 \u003ccode\u003e容器\u003c/code\u003e 两种部署形式的情况,一般会在讲解时提到,因此需要注意当前的部署方式,不过他们的架构是完全一样的。\u003c/p\u003e\n\u003ch1 id=\"架构\"\u003e架构\u003c/h1\u003e\n\u003cp\u003e\u003ccode\u003epilot\u003c/code\u003e 共分两个主要模块,一个是 \u003ccode\u003epilot-agent\u003c/code\u003e 用来提供 pod 中的服务发现 \u003ccode\u003e客户端\u003c/code\u003e,另一个是 \u003ccode\u003epolot-discovery\u003c/code\u003e 提供服务发现 \u003ccode\u003e服务端\u003c/code\u003e。\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2023/04/d2b5ca33bd970f64a6301fa75ae2eb22-4.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e其中 \u003ccode\u003eenvoy\u003c/code\u003e 和 \u003ccode\u003eIstio Agent\u003c/code\u003e 就是我们上面所讲的 \u003ccode\u003epilot-agent\u003c/code\u003e 模块,其为 \u003ccode\u003e数据面\u003c/code\u003e 组件,而 \u003ccode\u003eIstiod\u003c/code\u003e 则为 \u003ccode\u003e控制面\u003c/code\u003e,模块对应源码见\u003c/p\u003e\n\u003ch1 id=\"pilot-agent\"\u003epilot-agent\u003c/h1\u003e\n\u003cp\u003e对于 \u003ccode\u003epolot-agent\u003c/code\u003e 它运行在每个pod中 ,并以 \u003ccode\u003esidecar\u003c/code\u003e 方式与应用容器运行在同一个pod。如果你使用的是 \u003ccode\u003evm\u003c/code\u003e 的话,则可以在当前主机通过 \u003ccode\u003epstree\u003c/code\u003e 命令看到进程视图\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# pstree -pu 24530\nsu(24530)───pilot-agent(24611,istio-proxy)─┬─envoy(24619)─┬─{envoy}(24620) …\u003c/code\u003e\u003c/pre\u003e"
February 15, 2023
kubernetes 之 client-go 之 informer 工作原理源码解析
"\u003cp\u003e本文主要介绍有关 \u003ccode\u003eclient go\u003c/code\u003e 架构实现原理,在整个client-go架构中有一个很重要的组件就是 \u003ccode\u003einformer\u003c/code\u003e,本节我们重点对其进行一些介绍。\u003c/p\u003e\n\u003ch1 id=\"informer-机制\"\u003eInformer 机制\u003c/h1\u003e\n\u003cp\u003e采用 k8s HTTP API 可以查询集群中所有的资源对象并 Watch 其变化,但大量的 HTTP 调用会对 API Server 造成较大的负荷,而且网络调用可能存在较大的延迟。除此之外,开发者还需要在程序中处理资源的缓存,HTTP 链接出问题后的重连等。为了解决这些问题并简化 Controller 的开发工作,K8s 在 client go 中提供了一个 \u003ccode\u003einformer\u003c/code\u003e 客户端库,可以视其为一个组件。\u003c/p\u003e\n\u003cp\u003e在 Kubernetes 中,\u003ccode\u003eInformer\u003c/code\u003e 可以用于监视 Kubernetes API 服务器中的资源并将它们的当前状态缓存到本地(\u003ccode\u003eindex -\u0026gt; store)\u003c/code\u003e ,这样就避免了客户端不断地向 API 服务器发送请求,直接从本地即可。\u003c/p\u003e\n\u003cp\u003e相比直接采用 HTTP Watch,使用 Kubernetes Informer 有以下优势:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e减少 API 服务器的负载:通过在本地缓存资源信 …\u003c/li\u003e\u003c/ul\u003e"
January 16, 2023
Golang 中网络请求使用指定网卡
"\u003cp\u003e当用户发起一个网络请求时,流量会通过默认的网卡接口流出与流入,但有时需要将流量通过指定的网卡进行流出流入,这时我们可能需要进行一些额外的开发工作,对其实现主要用到了 \u003ccode\u003eDialer.Control\u003c/code\u003e 配置项。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003etype Dialer struct {\n\n // If Control is not nil, it is called after creating the network\n // connection but before actually dialing.\n //\n // Network and address parameters passed to Control method are not\n // necessarily the ones passed to Dial. For example, passing \u0026#34;tcp\u0026#34; to Dial\n // will cause the Control function to be called with \u0026#34;tcp4\u0026#34; or \u0026#34;tcp6\u0026#34;. …\u003c/code\u003e\u003c/pre\u003e"
October 30, 2022
Linux下两种 DNAT 用法的差异
"\u003cp\u003e前段时间使用 \u003ccode\u003eiptables\u003c/code\u003e 的 \u003ccode\u003eDNAT\u003c/code\u003e 实现一个业务需求的时候,遇到了一些问题这里将其整个过程记录下来。\u003c/p\u003e\n\u003ch2 id=\"需求\"\u003e需求\u003c/h2\u003e\n\u003cp\u003e这里假设开发机地址为 \u003ccode\u003e192.168.3.80\u003c/code\u003e,要实现的需求是当用户在开发机访问一个IP地址 \u003ccode\u003e192.168.3.196\u003c/code\u003e时,将请求转发到另一台机器 \u003ccode\u003e192.168.3.58\u003c/code\u003e,很明显直接使用 \u003ccode\u003eDNAT\u003c/code\u003e 来实现即可。\u003c/p\u003e\n\u003ch2 id=\"问题现象\"\u003e问题现象\u003c/h2\u003e\n\u003cp\u003eiptables 命令如下\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo iptables -t nat -F\nsudo iptables -t nat -A PREROUTING -d 192.168.3.196 -p tcp --dport 8080 -j DNAT --to-destination 192.168.3.58:8080\nsudo iptables -t nat -A POSTROUTING -d 192.168.3.58 -p tcp --dport 8080 -j SNAT --to-source 192.168.3.196:8080\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这时在开发机器访问\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecurl http://192.168.3.196:8080\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e发现提示错误\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecurl: (7) Failed …\u003c/code\u003e\u003c/pre\u003e"
June 10, 2022
https 是如何建立连接的
"\u003ch2 id=\"一什么是httpstlsssl\"\u003e\u003cstrong\u003e一、什么是HTTPS、TLS、SSL\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003eHTTPS,也称作HTTP over TLS。TLS的前身是SSL,TLS 1.0通常被标示为SSL 3.1,TLS 1.1为SSL 3.2,TLS 1.2为SSL 3.3。下图描述了在TCP/IP协议栈中TLS(各子协议)和HTTP的关系。\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2022/06/7584c4e760a0c0191e913baf0a49fc9b.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003ch2 id=\"二http和https协议的区别\"\u003e\u003cstrong\u003e二、HTTP和HTTPS协议的区别\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003e1、HTTPS协议需要到证书颁发机构(Certificate Authority,简称CA)申请证书,一般免费证书很少,需要交费。\u003c/p\u003e\n\u003cp\u003e2、HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的SSL加密传输协议。\u003c/p\u003e\n\u003cp\u003e3、HTTP和HTTPS使用的是完全不同的连接方式,使用的端口也不一样,前者是80,后者是443。\u003c/p\u003e\n\u003cp\u003e4、HTTP的连接很简单,是无状态的。\u003c/p\u003e\n\u003cp\u003e5、HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比HTTP协议安全。\u003c/p\u003e\n\u003cp\u003e从上面可看出,HTTPS和HTTP协议相比提供了\u003c/p\u003e\n\u003cp\u003e· 数据完整性:内容传输经过完整性校验\u003c/p\u003e\n\u003cp\u003e· 数据隐私性:内容经过对称加密,每个连接生成一个唯一的加密密钥\u003c/p\u003e\n\u003cp\u003e· 身份认证:第三方无法伪造服务端(客户端)身份\u003c/p\u003e\n\u003cp\u003e其 …\u003c/p\u003e"
June 10, 2022
实现 Linux 终端录屏转gif动画
"\u003cp\u003e在一些开源其中,有些文档使用git动画来介绍的话效果会好很多,所以这里把在Linux终端下如何生成git动画效果整理出来,供大家参考。\u003cimg src=\"https://s3.eu-central-1.amazonaws.com/sickill/github/asciicast2gif/demo-2.gif\" alt=\"\"\u003e\u003c/p\u003e\n\u003ch2 id=\"安装录屏软件-asciinema\"\u003e安装录屏软件 asciinema\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eMac\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e brew install asciinema\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eUbuntu\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e sudo apt-add-repository ppa:zanchey/asciinema\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eDebian\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e sudo apt-get install asciinema\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003ePip安装\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e sudo pip3 install asciinema\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e目前此软件不支持 Windows。更多安装教程参考:\u003c/p\u003e\n\u003ch2 id=\"用法介绍\"\u003e用法介绍\u003c/h2\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e ❯ asciinema -h\n usage: asciinema [-h] [--version] {rec,play,cat,upload,auth} ...\n \n Record and share your terminal sessions, the right way.\n \n positional arguments:\n {rec,play,cat,upload,auth}\n rec …\u003c/code\u003e\u003c/pre\u003e"
May 24, 2022
Linux 中的 Tun/Tap 介绍
"\u003ch1 id=\"tuntap-设备\"\u003eTUN/TAP 设备\u003c/h1\u003e\n\u003cp\u003e在计算机中TUN与TAP是操作系统内核中的虚拟网络设备。不同于硬件设备这些虚拟的网络设备全部用软件实现,但提供了与硬件设备完全相同的功能。\u003c/p\u003e\n\u003cp\u003e我们先了解一下物理设备的工作原理\n\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2022/07/57e54aad529225723698841910e61c46.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e所有主机物理网卡收到的数据包时,会先将其交给内核的 Network Stack 处理,然后通过 Socket API 通知给用户态的用户程序。\u003c/p\u003e\n\u003cp\u003eLinux 中 \u003ccode\u003eTun/Tap\u003c/code\u003e 驱动程序为应用程序提供了两种交互方式:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e虚拟网络接口和字符设备 \u003ccode\u003e/dev/net/tun\u003c/code\u003e。写入字符设备 \u003ccode\u003e/dev/net/tun\u003c/code\u003e 的数据会发送到虚拟网络接口中;\u003c/li\u003e\n\u003cli\u003e发送到虚拟网络接口中的数据也会出现在该字符设备上;\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e我们再看下 tun 设备的工作原理\n\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2022/07/ece6896a211da4167687ea55edc4f2c9.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e用户态应用往字符设备 \u003ccode\u003e/dev/tunX\u003c/code\u003e 写数据时,写入的数据都会出现在TUN虚拟设备上,当内核发送一个包给 TUN 虚拟设备时,通过读这个字符设备 \u003ccode\u003e/dev/tunX\u003c/code\u003e 同样可以拿到包的内容。\u003c/p\u003e\n\u003cp\u003e用户态应用程序写数据到 \u003ccode\u003etun/tap\u003c/code\u003e 设备后进入内核态,内核态通过TCP协议复制到用户态,最后数据再次复制到内核态并通过物理网卡转发出去,期间共经历了三次用户态与内核态的复制 …\u003c/p\u003e"
March 31, 2022
用 Goalng 开发 OPA 策略
"\u003cp\u003e\u003ccode\u003eOpen Policy Agent\u003c/code\u003e 简称\u003ccode\u003eOPA\u003c/code\u003e是一个开源的通用策略引擎,可在整个堆栈中实现统一的、上下文感知的策略实施。OPA 已经成为了云原生计算基金会 ( \u003ca href=\"https://www.cncf.io/\"\u003eCNCF\u003c/a\u003e) 领域的毕业项目,已经在 \u003ca href=\"https://www.openpolicyagent.org/docs/kubernetes-admission-control.html\"\u003eKubernetes\u003c/a\u003e / \u003ca href=\"https://istio.io\"\u003eIstio\u003c/a\u003e 等多个知名项目里使用 。\u003c/p\u003e\n\u003cp\u003eOPA的核心思想就是策略即代码。\u003c/p\u003e\n\u003cp\u003e它使用\u003ccode\u003eRego\u003c/code\u003e语言开发,Rego 的灵感来自 \u003ca href=\"https://en.wikipedia.org/wiki/Datalog\"\u003eDatalog\u003c/a\u003e,它是一种易于理解、已有数十年的历史的查询语言。Rego 扩展了 Datalog 以支持 JSON 等文档模型。对于它的详细介绍请参考官方文档 ,这里不再介绍,本方主要介绍如何使用Golang 来开发一个opa策略。\u003c/p\u003e\n\u003ch1 id=\"概述\"\u003e概述\u003c/h1\u003e\n\u003cp\u003eOPA 将 \u003ccode\u003e策略决策\u003c/code\u003e 与 \u003ccode\u003e策略执行\u003c/code\u003e 分离,当您的软件需要做出策略决策时,它会查询 OPA 并提供结构化数据(例如 JSON)作为输入。 OPA 接受任意结构化数据作为输入。\u003cimg src=\"https://d33wubrfki0l68.cloudfront.net/b394f524e15a67457b85fdfeed02ff3f2764eb9e/6ac2b/docs/latest/images/opa-service.svg\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e对于它的输入一般称为 \u003ccode\u003einput\u003c/code\u003e, 可以为任意类型,输出也一样可以为任意类型,即可以输出布尔值 \u003ccode\u003etrue\u003c/code\u003e 或 \u003ccode\u003efalse\u003c/code\u003e,也可以输出一个 \u003ccode\u003eJSON\u003c/code\u003e 字符串对象。\u003c/p\u003e\n\u003ch1 id=\"示例\"\u003e示例\u003c/h1\u003e\n\u003cp\u003e我们先从官方提供的一个 playground 开始,它是一个官方提供的在线执行 …\u003c/p\u003e"
February 25, 2022
一文看懂Golang 定时器源码
"\u003cp\u003e计时器分 Timer 和 Ticker 两种,它们底层基本是一样的,两差的区别请参考 , 这里我们的介绍对象是 Timer 。\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2022/03/fcabf1624c9030edb67ec1e8bf7ad4d9.png\" alt=\"\"\u003egolang timer\u003c/p\u003e\n\u003ch1 id=\"计时器结构体.wp-block-heading\"\u003e计时器结构体\u003c/h1\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e // NewTimer creates a new Timer that will send\n // the current time on its channel after at least duration d.\n func NewTimer(d Duration) *Timer {\n c := make(chan Time, 1)\n t := \u0026amp;Timer{\n C: c,\n r: runtimeTimer{\n when: when(d),\n f: sendTime,\n arg: c,\n },\n }\n startTimer(\u0026amp;t.r)\n return t\n }\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e通过调用 \u003ccode\u003eNewTimer()\u003c/code\u003e 函数创建一个 \u003ccode\u003eTimer\u003c/code\u003e,首先创建一个长度 …\u003c/p\u003e"
November 25, 2021
Golang常见编译参数
"\u003cp\u003e在执行 go build 命令的时候,经常需要添加一些参数,或许是为了调试,也或许是为了生成最终部署二进制文件。\u003c/p\u003e\n\u003cp\u003e在编译特定包时需要传递参数,格式应遵守“包名=参数列表”,如\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ego build -gcflags -gcflags=\u0026#39;log=-N -l\u0026#39; main.go\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"-gcflags\"\u003e-gcflags\u003c/h2\u003e\n\u003cp\u003ego build 可以用 \u003cem\u003e-gcflags\u003c/em\u003e 给_go_编译器传入参数,也就是传给 go tool compile 的参数,因此可以用 go tool compile –help 查看所有可用的参数。\u003c/p\u003e\n\u003cp\u003e其中 -m 可以检查代码的编译优化情况,包括逃逸情况和函数是否内联。\u003c/p\u003e\n\u003ch2 id=\"-ldflags\"\u003e-ldflags\u003c/h2\u003e\n\u003cp\u003ego build用 -ldflags 给go链接器传入参数,实际是给go tool link的参数,可以用go tool link –help查看可用的参数。\u003c/p\u003e\n\u003cp\u003e常用-X来指定版本号等编译时才决定的参数值。例如代码中定义var buildVer string,然后在编译时用go build -ldflags “-X main.buildVer=1.0” … 来赋值。注意-X只能给string类型变量赋值。\u003c/p\u003e"
November 25, 2021
Golang中的 CGO_ENABLED 环境变量
"\u003cp\u003eGolang中的编译参数\u003c/p\u003e\n\u003cp\u003e开发中经常使用 \u003ccode\u003ego build\u003c/code\u003e 命令来编译我们的程序源码,然后将生成二进制文件直接部署,极其方便。\u003c/p\u003e\n\u003cp\u003e对于 \u003ccode\u003ego build\u003c/code\u003e 有一些参数,对于针对程序源码进行一些编译优化,下面我们对经常使用的一些参数来介绍一下。\u003c/p\u003e\n\u003ch1 id=\"环境变量\"\u003e环境变量\u003c/h1\u003e\n\u003cp\u003e环境变量需要在go命令前面设置,如果多个变量的话,中间需要用“空格”分隔。下面我们介绍一个非常常见到的一些环境变量\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ CGO_ENABLED=1 GOARCH=amd64 GOOS=linux go build -o myserver main.go\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e除了这里给出的这几个变量外,还有一些其它变量,如 GODEBUG、GOFLAGS、GOPROXY 等,所有支持环境变量都可以在 里找到,有兴趣的话可以看看他们的作用。\u003c/p\u003e\n\u003cp\u003e这里重点介绍一下 \u003ccode\u003eCGO_ENABLED\u003c/code\u003e 环境变量对我们程序的影响。 \u003ccode\u003eCGO_ENABLED\u003c/code\u003e是用来控制golang 编译期间是否支持调用 cgo 命令的开关,其值为1或0,默认情况下值为1,可以用 \u003ccode\u003ego env\u003c/code\u003e 查看默认值。\u003c/p\u003e\n\u003cp\u003e如果你的程序里调用了cgo 命令,此参数必须设置为1,否则将编译时出错。这里直接用文档 中的一个例 …\u003c/p\u003e"
November 23, 2021
理解 firewalld/ufw 与iptables、netfilter 的关系
"\u003cp\u003eiptables 作为 Linux/Unix 下一款优秀的防火墙软件,在安全方面发挥着极其重要的作用,作为系统管理员来讲一点也不陌生。不过对于一些新手来说,复杂性是一个门槛,Linux厂商为了解决这个问题,于是推出了新的管理工具,如 Centos 下的 Firewalld 和 Ubuntu 下的ufw, 他们对新手十分友好,只需要几个很简单的命令即可实现想要的功能,再不也必为记不住iptables中的四表五键而烦恼了。\n那么,是不是有了 firewalld 和 ufw就不需要iptables了呢?并不是的。\u003c/p\u003e\n\u003cp\u003e首先我们要清楚firewalld、ufw 与iptables的关系,可以理解为两者只是对iptables其进行了一层封装,它们在用户交互方面做了非常多的改进,使其对用户更加友好,不需要再记住原来那么多命令了。\u003c/p\u003e\n\u003cp\u003e而目前对于一些系统管理员来讲,大概率还是会直接使用 iptables,主要原因是灵活性,当然也有一定的历史原因。对比前面两个管理工具,他们也存在一定的问题,如只能对单条规则进行管理,详细参考相关文档。\u003c/p\u003e\n\u003cp\u003e另外对于 firewalld 还有图形界面。 …\u003c/p\u003e"
August 16, 2021
k8s安装负载均衡器:Metallb
"\u003cp\u003e在使用kubenetes的过程中,如何将服务开放到集群外部访问是一个重要的问题。当使用云平台(阿里云、腾讯云、AWS等)的容器服务时,我们可以通过配置 service 为 \u003cstrong\u003eLoadBalancer\u003c/strong\u003e 模式来绑定云平台的负载均衡器,从而实现外网的访问。但是,如果对于自建的 kubernetes裸机集群,这个问题则要麻烦的多。\u003c/p\u003e\n\u003cp\u003e祼机集群不支持负载均衡的方式,可用的不外乎NodePort、HostNetwork、ExternalIPs等方式来实现外部访问。但这些方式并不完美,他们或多或少都存在的一些缺点,这使得裸机集群成为Kubernetes生态系统中的二等公民。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/metallb/metallb\"\u003eMetalLB\u003c/a\u003e 旨在通过提供与标准网络设备集成的Network LB实施来解决这个痛点,从而使裸机群集上的外部服务也尽可能“正常运行”,减少运维上的管理成本。它是一种纯软件的解决方案,参考 \u003ca href=\"https://kubernetes.github.io/ingress-nginx/deploy/baremetal/\"\u003ehttps://kubernetes.github.io/ingress-nginx/deploy/baremetal/\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e从 v0.13.0 版本开始,官方对解决方案进行了部分调整,操作步骤简洁一些,建议使用最新版本, …\u003c/p\u003e"
May 23, 2021
Golang中的runtime.LockOSThread 和 runtime.UnlockOSThread
"\u003cp\u003e在runtime中有 \u003ccode\u003e[runtime.LockOSThread](https://github.com/golang/go/blob/go1.16.3/src/runtime/proc.go#L4248-L4278)\u003c/code\u003e 和 \u003ccode\u003e[runtime.UnlockOSThread](https://github.com/golang/go/blob/go1.16.3/src/runtime/proc.go#L4302-L4323)\u003c/code\u003e 两个函数,这两个函数有什么作用呢?我们看一下标准库中对它们的解释。\u003c/p\u003e\n\u003ch2 id=\"runtimelockosthread\"\u003eruntime.LockOSThread\u003c/h2\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e// LockOSThread wires the calling goroutine to its current operating system thread.\n// The calling goroutine will always execute in that thread,\n// and no other goroutine will execute in it,\n// until the calling goroutine has made …\u003c/code\u003e\u003c/pre\u003e"
May 21, 2021
认识无锁队列
"\u003cp\u003e\u003ccode\u003e无锁队列\u003c/code\u003e是 \u003ccode\u003elock-free\u003c/code\u003e 中最基本的数据结构,一般应用在需要一款高性能队列的场景下。\u003c/p\u003e\n\u003cp\u003e对于多线程用户来说,无锁队列的入队和出队操作是线程安全的,不用再加锁控制\u003c/p\u003e\n\u003ch1 id=\"什么是无锁队列\"\u003e什么是无锁队列\u003c/h1\u003e\n\u003cp\u003e队列每个开发者都知道,那么什么又是无锁队列呢?字面理解起来就是一个无锁状态的队列,\u003ccode\u003e多个线程(消费者)\u003c/code\u003e同时操作数据的时候不需要加锁,因为加/解锁都是一个很消耗资源的动作。\u003c/p\u003e\n\u003ch1 id=\"实现原理\"\u003e实现原理\u003c/h1\u003e\n\u003cp\u003e我们先看一下无锁队列的底层实现数据结构。\u003c/p\u003e\n\u003ch2 id=\"数据结构\"\u003e数据结构\u003c/h2\u003e\n\u003cp\u003e无锁队列底层的数据结构实现方式主要有两种:\u003ccode\u003e数组\u003c/code\u003e 和 \u003ccode\u003e链接\u003c/code\u003e。\u003c/p\u003e\n\u003ch3 id=\"数组\"\u003e数组\u003c/h3\u003e\n\u003cp\u003e在首次初始化时,需要申请\u003ccode\u003e一块连接\u003c/code\u003e的\u003ccode\u003e大\u003c/code\u003e的内存。读写数据直接从数据的指定位置操作即可,时间复杂度为O(1)。\u003c/p\u003e\n\u003cp\u003e缺点:数组长度有限,一旦数组索引位置写满,则无法继续写入,即队列有上限。\u003c/p\u003e\n\u003ch3 id=\"链表\"\u003e链表\u003c/h3\u003e\n\u003cp\u003e不用像数组一样,刚开始就申请一块连接的大的内存空间。只有在每次写时数据的时候,申请这个数据节点大小的内存即可,这样就可以实现无限的写入,没有长度限制问题。\u003c/p\u003e\n\u003cp\u003e缺点:每次写数据都要申请内存,在写的场景,最差的情况是多少个数据就申请多少次内存,而每次申请都是一个消耗资源的动作。\u003c/p\u003e\n\u003cp\u003e可以看到无锁底层的实现的不同各有优势。多数据情况下,我们都采 …\u003c/p\u003e"
May 10, 2021
Runtime: goroutine的暂停和恢复源码剖析
"\u003cp\u003e上一节《 \u003ca href=\"https://blog.haohtml.com/archives/27003\"\u003eGC 对根对象扫描实现的源码分析\u003c/a\u003e》中,我们提到过在GC的时候,在对一些goroutine 栈进行扫描时,会在其扫描前触发 G 的暂停(\u003ccode\u003e[suspendG](https://github.com/golang/go/blob/go1.16.2/src/runtime/preempt.go#L76-L254)\u003c/code\u003e)和恢复(\u003ccode\u003e[resumeG](https://github.com/golang/go/blob/go1.16.2/src/runtime/preempt.go#L256-L280)\u003c/code\u003e)。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e// markroot scans the i\u0026#39;th root.\n//\n// Preemption must be disabled (because this uses a gcWork).\n//\n// nowritebarrier is only advisory here.\n//\n//go:nowritebarrier\nfunc markroot(gcw *gcWork, i uint32) {\n\tbaseFlushCache := uint32(fixedRootCount) …\u003c/code\u003e\u003c/pre\u003e"
May 7, 2021
goroutine栈的申请与释放
"\u003cp\u003e对于提高对 stack 的使用效率,避免重复从heap中分配与释放,对其使用了 \u003ccode\u003epool\u003c/code\u003e 的概念,\u003ccode\u003eruntime\u003c/code\u003e 里为共提供了两个pool, 分别为 \u003ccode\u003estackpool\u003c/code\u003e ,另一个为 \u003ccode\u003estackLarge\u003c/code\u003e。\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2022/05/b33bde90901d27dd591e65c12e007fa2.png\" alt=\"\"\u003estack pool\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003estackpool\u003c/code\u003e: 16b~32k 对应通用的大小的stack。获取时通过调用 \u003ccode\u003estackpoolalloc()\u003c/code\u003e, 释放时调用 \u003ccode\u003estackpoolfree()\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003estackLarge\u003c/code\u003e:对应 \u0026gt; 32K 的 stack\u003c/p\u003e\n\u003cp\u003e在程序全局调度器 \u003ca href=\"https://github.com/golang/go/blob/go1.16.3/src/runtime/proc.go#L634\"\u003e初始化\u003c/a\u003e 时会通过调用 \u003ccode\u003estackinit()\u003c/code\u003e 实现对 \u003ccode\u003estack\u003c/code\u003e 初始化。\u003c/p\u003e\n\u003cp\u003e当我们执行一个 \u003ccode\u003ego func()\u003c/code\u003e 语句的时候,\u003ccode\u003eruntime\u003c/code\u003e 会通过调用 \u003ccode\u003enewproc()\u003c/code\u003e 函数来创建G。而内部真正创建G的函数为 \u003ccode\u003e[newproc1()](https://github.com/golang/go/blob/go1.16.3/src/runtime/proc.go#L3990-L4098)\u003c/code\u003e,在没有G可以复用的情况下,会通过 \u003ccode\u003enewg = malg(_StackMin)\u003c/code\u003e 语句创建一个\u003cstrong\u003e包含stack\u003c/strong\u003e的G。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e// Allocate a …\u003c/code\u003e\u003c/pre\u003e"
May 7, 2021
Golang的GPM 模型在网络编程中存在的问题
"\u003ch2 id=\"现状\"\u003e现状\u003c/h2\u003e\n\u003cp\u003e目前在网络编程中,golang采用的是一种 \u003ccode\u003egoroutine-per-connection\u003c/code\u003e 的模式,即为每一个连接都分配一个goroutine,一个连接就是一个goroutine,多个连接之间没有关系。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport (\n\t\u0026#34;fmt\u0026#34;\n\t\u0026#34;io/ioutil\u0026#34;\n\t\u0026#34;net\u0026#34;\n\t\u0026#34;time\u0026#34;\n)\n\n//模拟server端\nfunc main() {\n\ttcpServer, _ := net.ResolveTCPAddr(\u0026#34;tcp4\u0026#34;, \u0026#34;:8080\u0026#34;)\n\tlistener, _ := net.ListenTCP(\u0026#34;tcp\u0026#34;, tcpServer)\n\n\tfor {\n\t\t//当有新客户端请求时拿到与客户端的连接\n\t\tconn, err := listener.Accept()\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t\tcontinue\n\t\t}\n\n\t\t// …\u003c/code\u003e\u003c/pre\u003e"
May 1, 2021
Linux 内核select、poll 和 eventpoll 的实现
"\u003cp\u003eLinux 内核仓库 \u003ca href=\"https://github.com/torvalds/linux\"\u003ehttps://github.com/torvalds/linux\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eLinux 内核文档: \u003ca href=\"https://www.kernel.org/doc/html/latest/index.html\"\u003ehttps://www.kernel.org/doc/html/latest/index.html\u003c/a\u003e( \u003ca href=\"https://www.kernel.org/doc/html/latest/translations/zh_CN/index.html\"\u003e中文\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003e开发工具参考: \u003ca href=\"https://www.kernel.org/doc/html/latest/dev-tools/index.html\"\u003ehttps://www.kernel.org/doc/html/latest/dev-tools/index.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e也可以使用 VSCode + 插件C/C++ GNU Global\u003c/p\u003e\n\u003cp\u003e通过前面三个博客可以得知 \u003ca href=\"https://blog.csdn.net/weixin_38537730/article/details/104097648\"\u003e\u003cstrong\u003eselect\u003c/strong\u003e\u003c/a\u003e,** \u003ca href=\"https://blog.csdn.net/weixin_38537730/article/details/104099183\"\u003epoll\u003c/a\u003e\u003cstrong\u003e,\u003c/strong\u003e \u003ca href=\"https://blog.csdn.net/weixin_38537730/article/details/104093556\"\u003eeventpoll\u003c/a\u003e** 的详细实现,现在来总结对比下它们之间的不同:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eselect 流程图\u003c/strong\u003e\n\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2021/05/cf1f47a3a2058cac1ffe1376a5825bb8.jpg\" alt=\"93c50bd46eded3432584b819b8c1e7cd\"\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003epoll 流程图\u003c/strong\u003e\n\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2021/05/05795514077440f88ef0622e88fc6eb1.jpg\" alt=\"118c7aba5835cf06e006a1834dbe9f40\"\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eeventpoll 流程图\u003c/strong\u003e\n\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2021/05/f859094931597fe7298edb417c48c96b.png\" alt=\"2a937b08de0c8ed6c32b45ae19399a01\"\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e优缺点总结\u003c/strong\u003e\n\u0026lt;1\u0026gt; \u003cstrong\u003e监控文件最大数不同\u003c/strong\u003e:select和poll都是以数组形式传入药监控的文件句柄,而这个数组是有大小限制的1024个左右(不是很清楚).而epoll则是每add一个文件句柄会new一个新epi出来,挂载在ep的红黑树中,监控的文件个数没有明确限制(可能会受限于系统最大打开文件句柄数)从这点上看,epoll是优于select和poll. …\u003c/li\u003e\u003c/ol\u003e"
April 30, 2021
缓存池 bytebufferpool 库实现原理
"\u003cp\u003e上一节 \u003ca href=\"https://blog.haohtml.com/archives/24697\"\u003e《Runtime: Golang 之 sync.Pool 源码分析》\u003c/a\u003e 我们介绍了sync.Pool 的源码分析,本节介绍一个 \u003ca href=\"https://github.com/valyala/fasthttp\"\u003e\u003ccode\u003efasthttp\u003c/code\u003e\u003c/a\u003e 中引用的一缓存池库 \u003ccode\u003e[bytebufferpool](https://github.com/valyala/bytebufferpool)\u003c/code\u003e,这两个库是同一个开发者。对于这个缓存池库与同类型的几个库的对比,可以参考 \u003ca href=\"https://omgnull.github.io/go-benchmark/buffer/\"\u003ehttps://omgnull.github.io/go-benchmark/buffer/\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e建议大家了解一下\u003ccode\u003e[fasthttp](https://github.com/valyala/fasthttp)\u003c/code\u003e 这个库,性能要比直接使用内置的 \u003ccode\u003enet/http\u003c/code\u003e 高出很多,其主要原因是大量的用到了缓存池 \u003ccode\u003esync.Pool\u003c/code\u003e 进行性能提升。\u003c/p\u003e\n\u003ch2 id=\"用法\"\u003e用法\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e// https://github.com/valyala/bytebufferpool/blob/18533face0/bytebuffer_example_test.go\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003epackage\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003ebytebufferpool_test\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e (\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;fmt\u0026#34; …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
April 26, 2021
docker如何利用cgroup对容器资源进行限制
"\u003cp\u003e在容器里有两个非常重要的概念,一个是 \u003ccode\u003enamespace\u003c/code\u003e 用来实现对容器里所有进程进行隔离;另一个就是 \u003ccode\u003ecgroup\u003c/code\u003e,用来对容器进程内使用资源进行限制。那 \u003ccode\u003ecgroup\u003c/code\u003e 又是如何实现对资源进行限制的呢,今天我们来了解一下它的实现原理。\u003c/p\u003e\n\u003ch2 id=\"什么是cgroup\"\u003e什么是cgroup\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003ecgroup\u003c/code\u003e 是 \u003ccode\u003eControl Groups\u003c/code\u003e 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离 进程组 所使用的物理资源(如 cpu、memory、磁盘IO等等) 的机制,被 \u003ccode\u003eLXC\u003c/code\u003e、\u003ccode\u003edocker\u003c/code\u003e 等很多项目用于实现进程资源控制。cgroup 是将任意进程进行分组化管理的 Linux 内核功能。\n\u003ccode\u003ecgroup\u003c/code\u003e 本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理功能是通过这个功能来实现的。 一定要切记,这里的限制单元为 \u003ccode\u003e进程组\u003c/code\u003e,而不是进程。\u003c/p\u003e\n\u003ch2 id=\"子系统\"\u003e子系统\u003c/h2\u003e\n\u003cp\u003e上面提到的具体的资源管理功能统称为 cgroup \u003ccode\u003e子系统\u003c/code\u003e,所有子系统列表可以通过 \u003ccode\u003ecat /proc/cgroups\u003c/code\u003e 命令查看,主要有以下几大子系统:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# cat /proc/cgroups\n#subsys_name\thierarchy …\u003c/code\u003e\u003c/pre\u003e"
April 12, 2021
Golang 内存组件之mspan、mcache、mcentral 和 mheap 数据结构
"\u003cp\u003eGolang中的内存组件关系如下图所示\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2021/04/5a666325bb7cfea6f5182e0ee7c528cf.jpg\" alt=\"components of memory allocation\"\u003egolang 内存分配组件\u003c/p\u003e\n\u003cp\u003e在学习golang 内存时,经常会涉及几个重要的数据结构,如果不熟悉它们的情况下,理解起来就显得格外的吃力,所以本篇主要对相关的几个内存组件做下数据结构的介绍。\u003c/p\u003e\n\u003cp\u003e在 Golang 中,\u003ccode\u003emcache\u003c/code\u003e、\u003ccode\u003emspan\u003c/code\u003e、\u003ccode\u003emcentral\u003c/code\u003e 和 \u003ccode\u003emheap\u003c/code\u003e 是内存管理的四大组件,\u003ccode\u003emcache\u003c/code\u003e 管理线程在本地缓存的 \u003ccode\u003emspan\u003c/code\u003e,而 \u003ccode\u003emcentral\u003c/code\u003e 管理着全局的 \u003ccode\u003emspan\u003c/code\u003e 为所有 \u003ccode\u003emcache\u003c/code\u003e 提供所有线程。\u003c/p\u003e\n\u003cp\u003e根据分配对象的大小,内部会使用不同的内存分配机制,详细参考函数 \u003ca href=\"https://github.com/golang/go/blob/go1.16.2/src/runtime/malloc.go#L902-L1171\"\u003emallocgo()\u003c/a\u003e ,所于内存分配与回收,参考文件介绍 \u003ca href=\"https://github.com/golang/go/blob/go1.16.2/src/runtime/malloc.go#L5\"\u003emalloc.go\u003c/a\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e\u0026lt;16KB\u003c/code\u003e 会使用微小对象内存分配器从 \u003ccode\u003eP\u003c/code\u003e 中的 \u003ccode\u003emcache\u003c/code\u003e 分配,主要使用 \u003ccode\u003emcache.tinyXXX\u003c/code\u003e 这类的字段\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e16-32KB\u003c/code\u003e 从 \u003ccode\u003eP\u003c/code\u003e 中的 \u003ccode\u003emcache\u003c/code\u003e 中分配\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e\u0026gt;32KB\u003c/code\u003e 直接从 \u003ccode\u003emheap\u003c/code\u003e 中分配\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e对于golang中的内存申请流程,大家应该都非常熟悉了,这里不再进行详细描述。\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2021/04/1bb7fe2168b7ac2e24afadf698dc6ee6.png\" alt=\"\"\u003eGolang 内存组件关系\u003c/p\u003e\n\u003ch1 id=\"mcache\"\u003emcache\u003c/h1\u003e\n\u003cp\u003e在GPM关系中,会在每个 \u003ccode\u003eP …\u003c/code\u003e\u003c/p\u003e"
April 9, 2021
GC 对根对象扫描实现的源码分析
"\u003ch1 id=\"工作池gcwork\"\u003e工作池gcWork\u003c/h1\u003e\n\u003cp\u003e工作缓存池(\u003ccode\u003ework pool\u003c/code\u003e)实现了生产者和消费者模型,用于指向灰色对象。一个灰色对象在工作队列中被扫描标记,一个黑色对象表示已被标记不在队列中。\u003c/p\u003e\n\u003cp\u003e写屏障、根发现、栈扫描和对象扫描都会生成一个指向灰色对象的指针。扫描消费时会指向这个灰色对象,从而将先其变为黑色,再扫描它们,此时可能会产生一个新的指针指向灰色对象。这个就是三色标记法的基本知识点,应该很好理解。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003egcWork\u003c/code\u003e 是为垃圾回收器提供的一个生产和消费工作接口。\u003c/p\u003e\n\u003cp\u003e它可以用在stack上,如\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e(preemption must be disabled)\ngcw := \u0026amp;getg().m.p.ptr().gcw\n.. call gcw.put() to produce and gcw.tryGet() to consume ..\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e在标记阶段使用gcWork可以防止垃圾收集器转换到标记终止,这一点很重要,因为gcWork可能在本地持有GC工作缓冲区。可以通过禁用抢占(\u003ccode\u003esystemstack\u003c/code\u003e 或 \u003ccode\u003eacquirem\u003c/code\u003e)来实现。\u003c/p\u003e\n\u003cp\u003e数据结构\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003etype gcWork struct {\n\twbuf1, wbuf2 …\u003c/code\u003e\u003c/pre\u003e"
April 7, 2021
Runtime: Golang GC源码分析
"\u003cp\u003e在阅读此文前,需要先了解一下三色标记法以及混合写屏障这些概念。\u003c/p\u003e\n\u003cp\u003e源文件 \u003ccode\u003e[src/runtime/mgc.go](https://github.com/golang/go/blob/go1.16/src/runtime/mgc.go)\u003c/code\u003e 版本 1.16.2。\u003c/p\u003e\n\u003ch1 id=\"基本知识\"\u003e基本知识\u003c/h1\u003e\n\u003cp\u003e在介绍GC之前,我们需要认识有些与GC相关的基本信息,如GC的状态、模式、统计信息等。\u003c/p\u003e\n\u003ch2 id=\"三种状态\"\u003e三种状态\u003c/h2\u003e\n\u003cp\u003e共有三种状态\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003econst (\n\t_GCoff = iota // GC not running; sweeping in background, write barrier disabled\n\t_GCmark // GC marking roots and workbufs: allocate black, write barrier ENABLED\n\t_GCmarktermination // GC mark termination: allocate black, P\u0026#39;s help GC, write barrier ENABLED\n) …\u003c/code\u003e\u003c/pre\u003e"
April 6, 2021
Golang中的切片与GC
"\u003cp\u003e今天再看 \u003ccode\u003etimer\u003c/code\u003e 源码的时候,在函数 \u003ccode\u003e[clearDeletedTimers()](https://github.com/golang/go/blob/go1.16.2/src/runtime/time.go#L904-L992)\u003c/code\u003e 里看到一段对切片的处理代码,实现目的就是对一个切片内容进行缩容。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e// src/runtime/time.go\n\n// The caller must have locked the timers for pp.\nfunc clearDeletedTimers(pp *p) {\n\ttimers := pp.timers\n\t......\n\t// 对无用的切片元素赋值 nil\n\tfor i := to; i \u0026lt; len(timers); i++ {\n\t\ttimers[i] = nil\n\t}\n\n\tatomic.Xadd(\u0026amp;pp.deletedTimers, -cdel)\n\tatomic.Xadd(\u0026amp;pp.numTimers, -cdel)\n\tatomic.Xadd(\u0026amp;pp.adjustTimers, -cearlier) …\u003c/code\u003e\u003c/pre\u003e"
March 29, 2021
Runtime: Golang 定时器实现原理及源码解析
"\u003cp\u003e定时器作为开发经常使用的一种数据类型,是每个开发者需要掌握的,对于一个高级开发很有必要了解它的实现原理,今天我们runtime源码来学习一下它的底层实现。\u003c/p\u003e\n\u003cp\u003e定时器分两种,分别为 Timer 和 Ticker,两者差不多,这里重点以Timer为例。\u003c/p\u003e\n\u003cp\u003e源文件位于 \u003ccode\u003e[src/time/sleep.go](https://github.com/golang/go/blob/go1.16.2/src/time/sleep.go)\u003c/code\u003e 和 \u003ccode\u003e[src/time/tick.go](https://github.com/golang/go/blob/go1.16.2/src/time/tick.go)\u003c/code\u003e 。 go version 1.16.2\u003c/p\u003e\n\u003ch1 id=\"数据结构\"\u003e数据结构\u003c/h1\u003e\n\u003cp\u003e\u003ccode\u003eTimer\u003c/code\u003e 数据结构\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e// src/runtime/sleep.go\n\n// The Timer type represents a single event.\n// When the Timer expires, the current time will be sent on C,\n// unless the Timer was created by …\u003c/code\u003e\u003c/pre\u003e"
March 28, 2021
Golang中的CAS原子操作 和 锁
"\u003cp\u003e在高并发编程中,经常会出现对同一个资源并发访问修改的情况,为了保证最终结果的正确性,一般会使用 \u003ccode\u003e锁\u003c/code\u003e 和 \u003ccode\u003eCAS原子操作\u003c/code\u003e 来实现。\u003c/p\u003e\n\u003cp\u003e如要对一个变量进行计数统计,两种实现方式分别为\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport (\n\t\u0026#34;fmt\u0026#34;\n\t\u0026#34;sync\u0026#34;\n)\n\n// 锁实现方式\nfunc main() {\n\tvar count int64\n\tvar wg sync.WaitGroup\n\tvar mu sync.Mutex\n\n\tfor i := 0; i \u0026lt; 10000; i++ {\n\t\twg.Add(1)\n\t\tgo func(wg *sync.WaitGroup) {\n\t\t\tdefer wg.Done()\n\t\t\tmu.Lock()\n\t\t\tcount = count + 1\n\t\t\tmu.Unlock()\n\t\t}(\u0026amp;wg)\n\t}\n\twg.Wait()\n\n\t// count = 10000\n\tfmt.Println(\u0026#34;count = \u0026#34;, count)\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e与\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport ( …\u003c/code\u003e\u003c/pre\u003e"
March 23, 2021
Golang并发同步原语之-信号量Semaphore
"\u003cp\u003e信号量是并发编程中比较常见的一种同步机制,它会保持资源计数器一直在\u003ccode\u003e0-N\u003c/code\u003e(\u003ccode\u003eN\u003c/code\u003e表示权重值大小,在用户初始化时指定)之间。当用户获取的时候会减少一点,使用完毕后再恢复过来。当遇到请求时资源不够的情况下,将会进入休眠状态以等待其它进程释放资源。\u003c/p\u003e\n\u003cp\u003e在 Golang 官方扩展库中为我们提供了一个基于权重的信号量 \u003ccode\u003e[semaphore](https://github.com/golang/sync/blob/master/semaphore/semaphore.go)\u003c/code\u003e 并发原语。\u003c/p\u003e\n\u003cp\u003e你可以将下面的参数 \u003ccode\u003en\u003c/code\u003e 理解为资源权重总和,表示每次获取时的权重;也可以理解为资源数量,表示每次获取时必须一次性获取的资源数量。为了理解方便,这里直接将其理解为资源数量。\u003c/p\u003e\n\u003ch2 id=\"数据结构\"\u003e数据结构\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003e[semaphoreWeighted](https://github.com/golang/sync/blob/master/semaphore/semaphore.go#L19-L33)\u003c/code\u003e 结构体\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003etype waiter struct {\n\tn int64\n\tready chan\u0026lt;- struct{} // Closed …\u003c/code\u003e\u003c/pre\u003e"
March 22, 2021
学习Golang GC 必知的几个知识点
"\u003cp\u003e对于gc的介绍主要位于 \u003ccode\u003e[src/runtime/mgc.go](https://github.com/golang/go/blob/go1.16.2/src/runtime/mgc.go)\u003c/code\u003e,以下内容是对注释的翻译。\u003c/p\u003e\n\u003ch2 id=\"gc-四个阶段\"\u003eGC 四个阶段\u003c/h2\u003e\n\u003cp\u003e通过源文件注释得知GC共分四个阶段:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eGC 清理终止 (\u003ccode\u003eGC performs sweep termination\u003c/code\u003e)\na. \u003ccode\u003eStop the world\u003c/code\u003e, 每个P 进入GC \u003ccode\u003esafepoint\u003c/code\u003e(安全点),从此刻开始,万物静止。\nb. 清理未被清理的span,如果GC被强制执行时才会出现这些未清理的span\u003c/li\u003e\n\u003cli\u003eGC 标记阶段(\u003ccode\u003eGC performs the mark phase\u003c/code\u003e)\na. 将gc标记从 \u003ccode\u003e_GCoff\u003c/code\u003e 修改为 \u003ccode\u003e_GCmark\u003c/code\u003e,开启写屏障(\u003ccode\u003ewrite barries\u003c/code\u003e)和 协助助手(\u003ccode\u003emutator assists\u003c/code\u003e),将根对象放入队列。 在STW期间,在所有P都启用写屏障之前不会有什么对象被扫描。\nb. \u003ccode\u003eStart the world\u003c/code\u003e(恢复STW)。标记工作线程和协助助手并发的执行。对于任何指针的写操作和指针值,都会被写屏障覆盖,使新分配的对象标记为黑 …\u003c/li\u003e\u003c/ol\u003e"
March 20, 2021
Runtime: Golang 之 sync.Pool 源码分析
"\u003cp\u003ePool 指一组可以单独保存和恢复的 \u003ccode\u003e临时对象\u003c/code\u003e。Pool 中的对象随时都有可能在没有收到任何通知的情况下被GC自动销毁移除。\u003c/p\u003e\n\u003cp\u003e多个goroutine同时操作Pool是\u003ccode\u003e并发安全\u003c/code\u003e的。\u003c/p\u003e\n\u003cp\u003e源文件为 \u003ccode\u003e[src/sync/pool.go](https://github.com/golang/go/blob/master/src/sync/pool.go)\u003c/code\u003e go version: 1.16.2\u003c/p\u003e\n\u003ch1 id=\"为什么使用pool\"\u003e为什么使用Pool\u003c/h1\u003e\n\u003cp\u003e在开发高性能应用时,经常会有一些完全相同的对象需要频繁的创建和销毁,每次创建都需要在堆中分配对象,等使用完毕后,这些对象需要等待GC回收。我们知道在Golang中使用三色标记法进行垃圾回收的,在回收期间会有一个短暂\u003ccode\u003eSTW\u003c/code\u003e(stop the world)的时间段,这样就会导致程序性能下降。\u003c/p\u003e\n\u003cp\u003e那么能否实现类似数据库连接池这种效果,用来避免对象的频繁创建和销毁,达到尽可能的资源复用呢?为了实现这种需求,标准库中有了\u003ccode\u003esync.Pool\u003c/code\u003e 这个数据结构。看名字很知道它是一个池。但是它和我们想象中的数据库连接池还是有些差别的。对于数据库连接池这种资源只要不手动释放就可以一直利用, …\u003c/p\u003e"
March 19, 2021
Runtime: Golang同步原语Mutex源码分析
"\u003cp\u003e在 \u003ccode\u003esync\u003c/code\u003e 包里提供了最基本的同步原语,如互斥锁 \u003ccode\u003eMutex\u003c/code\u003e。除 \u003ccode\u003eOnce\u003c/code\u003e 和 \u003ccode\u003eWaitGroup\u003c/code\u003e 类型外,大部分是由低级库提供的,更高级别的同步最好是通过 \u003ccode\u003echannel\u003c/code\u003e 通讯来实现。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eMutex\u003c/code\u003e 类型的变量默认值是未加锁状态,在第一次使用后,此值将\u003ccode\u003e不得\u003c/code\u003e复制,这点切记!!!\u003c/p\u003e\n\u003cp\u003e本文基于go version: 1.16.2\u003c/p\u003e\n\u003cp\u003eMutex 锁实现了 \u003ccode\u003eLocker\u003c/code\u003e 接口。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e// A Locker represents an object that can be locked and unlocked.\ntype Locker interface {\n\tLock()\n\tUnlock()\n}\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"锁的模式\"\u003e锁的模式\u003c/h2\u003e\n\u003cp\u003e为了互斥公平性,Mutex 分为 \u003ccode\u003e正常模式\u003c/code\u003e 和 \u003ccode\u003e饥饿模式\u003c/code\u003e 两种。\u003c/p\u003e\n\u003ch3 id=\"正常模式\"\u003e正常模式\u003c/h3\u003e\n\u003cp\u003e在正常模式下,等待者 \u003ccode\u003ewaiter\u003c/code\u003e 会进入到一个\u003ccode\u003eFIFO\u003c/code\u003e队列,在获取锁时\u003ccode\u003ewaiter\u003c/code\u003e会按照先进先出的顺序获取。当唤醒一个\u003ccode\u003ewaiter\u003c/code\u003e 时它被并不会立即获取锁,而是要与\u003ccode\u003e新来的goroutine\u003c/code\u003e竞争,这种情况下新来的goroutine比较有优势,主要是因为它已经运行在CPU,可能它的数量还不少,所以\u003ccode\u003ewaiter\u003c/code\u003e大概率下获取不到 …\u003c/p\u003e"
March 5, 2021
Golang什么时候会触发GC
"\u003cp\u003eGolang采用了三色标记法来进行垃圾回收,那么在什么场景下会触发这个GC动作呢?\u003c/p\u003e\n\u003cp\u003e源码主要位于文件 \u003ccode\u003e[src/runtime/mgc.go](https://github.com/golang/go/blob/go1.16/src/runtime/mgc.go)\u003c/code\u003e go version 1.16\u003c/p\u003e\n\u003cp\u003e触发条件从大方面来说,分为 \u003ccode\u003e手动触发\u003c/code\u003e 和 \u003ccode\u003e系统触发\u003c/code\u003e 两种方式。手动触发一般很少用,主要通过开发者调用 \u003ccode\u003eruntime.GC()\u003c/code\u003e 函数来实现,而对于系统自动触发是 \u003ccode\u003e运行时\u003c/code\u003e 根据一些条件自行维护的,这也正是本文要介绍的内容。\u003c/p\u003e\n\u003cp\u003e不管哪种触发方式,底层回收机制是一样的,所以我们先看一下手动触发,看看能否根据它来找GC触发所需的条件。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e// src/runtime/mgc.go\n\n// GC runs a garbage collection and blocks the caller until the\n// garbage collection is complete. It may also block the entire\n// program.\nfunc GC() {\n\tn := …\u003c/code\u003e\u003c/pre\u003e"
March 4, 2021
Golang 基于信号的异步抢占与处理
"\u003cp\u003e在Go1.14版本开始实现了 \u003ccode\u003e基于信号的协程抢占调度\u003c/code\u003e 模式,在此版本以前执行以下代码是永远也无法执行最后一条println语句。\u003c/p\u003e\n\u003cp\u003e本文基于go version 1.16\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport (\n \u0026#34;runtime\u0026#34;\n \u0026#34;time\u0026#34;\n)\n\nfunc main() {\n runtime.GOMAXPROCS(1)\n go func() {\n for {\n }\n }()\n\n time.Sleep(time.Millisecond)\n println(\u0026#34;OK\u0026#34;)\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e原因很简单:在main函数里只有一个CPU,从上到下执行到 \u003ccode\u003etime.Sleep()\u003c/code\u003e 函数的时候,会将 \u003ccode\u003emain goroutine\u003c/code\u003e 放入运行队列,出让了P,开始执行匿名函数,但匿名函数是一个for循环,没有任何 \u003ccode\u003eIO\u003c/code\u003e 语句,也就无法引起对 \u003ccode\u003eG\u003c/code\u003e 的调度,所以当前仅有的一个 \u003ccode\u003eP\u003c/code\u003e 永远被其占用,导致无法打印OK。\u003c/p\u003e\n\u003cp\u003e这个问题在1.14版本开始有所改变,主要是因为引入了\u003ccode\u003e基于信号的抢占模式\u003c/code\u003e。在程序启动 …\u003c/p\u003e"
March 1, 2021
Golang 的调度策略之G的窃取
"\u003cp\u003e我们上篇文章( \u003ca href=\"https://blog.haohtml.com/archives/21411\"\u003eGolang 的底层引导流程/启动顺序\u003c/a\u003e)介绍了一个golang程序的启动流程,在文章的最后对于最重要的一点“\u003ccode\u003e调度\u003c/code\u003e“ (函数 \u003ccode\u003e[schedule()](https://github.com/golang/go/blob/go1.15.6/src/runtime/proc.go#L2607-L2723)\u003c/code\u003e) 并没有展开来讲,今天我们继续从源码来分析一下它的调度机制。\u003c/p\u003e\n\u003cp\u003e在此之前我们要明白golang中的调度主要指的是什么?在 \u003ccode\u003esrc/runtime/proc.go\u003c/code\u003e 文件里有一段注释这样写到\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e// Goroutine scheduler\u003c/p\u003e\n\u003cp\u003e// The scheduler’s job is to distribute ready-to-run goroutines over worker threads.\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这里指如何找一个已准备好运行的 G 关联到PM 让其执行。对于G 的调度可以围绕三个方面来理解:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e时机:什么时候关联(调度)。对于调度时机一般是指有空闲P的时候都会去找G执行\u003c/li\u003e\n\u003cli\u003e对象:选择哪个G进行调度。这是我们本篇要讲的内容\u003c/li\u003e\n\u003cli\u003e机制:如何调度。\u003ccode\u003eexecute()\u003c/code\u003e 函数\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e理解 …\u003c/p\u003e"
February 27, 2021
Runtime: Golang是如何处理系统调用阻塞的?
"\u003cp\u003e我们知道在Golang中,当一个Goroutine由于执行 \u003ccode\u003e系统调用\u003c/code\u003e 而阻塞时,会将M从GPM中分离出去,然后P再找一个G和M重新执行,避免浪费CPU资源,那么在内部又是如何实现的呢?今天我们还是通过学习Runtime源码的形式来看下他的内部实现细节有哪些?\u003c/p\u003e\n\u003cp\u003ego version 1.15.6\u003c/p\u003e\n\u003cp\u003e我们知道一个P有四种运行状态,而当执行系统调用函数阻塞时,会从 \u003ccode\u003e_Prunning\u003c/code\u003e 状态切换到 \u003ccode\u003e_Psyscall\u003c/code\u003e,等系统调用函数执行完毕后再切换回来。\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2021/01/0d20dfce0e3dd6968aebe84535b853c6.png\" alt=\"P的状态切换\"\u003eP的状态切换\u003c/p\u003e\n\u003cp\u003e从上图我们可以看出 \u003ccode\u003eP\u003c/code\u003e 执行系统调用时会执行 \u003ccode\u003e[entersyscall()](https://github.com/golang/go/blob/go1.15.6/src/runtime/proc.go#L3134-L3142)\u003c/code\u003e 函数(另还有一个类似的阻塞函数 \u003ca href=\"https://github.com/golang/go/blob/go1.15.6/src/runtime/proc.go#L3171-L3212\"\u003e\u003ccode\u003eentersyscallblock()\u003c/code\u003e\u003c/a\u003e ,注意两者的区别)。当系统调用执行完毕切换回去会执行 \u003ca href=\"https://github.com/golang/go/blob/go1.15.6/src/runtime/proc.go#L3222-L3305\"\u003e\u003ccode\u003eexitsyscall()\u003c/code\u003e\u003c/a\u003e 函数,下面我们看一下这两个函数的实现。\u003c/p\u003e\n\u003ch1 id=\"进入系统调用\"\u003e进入系统调用\u003c/h1\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e// Standard syscall entry used by the go syscall …\u003c/code\u003e\u003c/pre\u003e"
February 26, 2021
Runtime: 当一个goroutine 运行结束后会发生什么
"\u003cp\u003e上一篇我们介绍了 \u003ca href=\"https://blog.haohtml.com/archives/23168\"\u003e创建一个goroutine 会经历些什么\u003c/a\u003e,今天我们再看下当一个\u003ccode\u003egoroutine\u003c/code\u003e 运行结束的时候,又会发生什么?\u003c/p\u003e\n\u003cp\u003ego version 1.15.6。\u003c/p\u003e\n\u003cp\u003e主要源文件为 \u003ccode\u003e[src/runtime/proc.go](https://github.com/golang/go/blob/go1.15.6/src/runtime/proc.go)\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e当一个\u003ccode\u003egoroutine\u003c/code\u003e 运行结束的时候,默认会执行一个 \u003ccode\u003e[goexit1()](https://github.com/golang/go/blob/go1.15.6/src/runtime/proc.go#L2941-L2950)\u003c/code\u003e 的函数,这是一个只有八行代码的函数,其中最后以通过 \u003ccode\u003e[mcall()](https://github.com/golang/go/blob/go1.15.6/src/runtime/stubs.go#L34)\u003c/code\u003e 调用 \u003ccode\u003e[goexit0](https://github.com/golang/go/blob/go1.15.6/src/runtime/proc.go#L2952-L3011)\u003c/code\u003e 函数结束。因此我们主 …\u003c/p\u003e"
February 17, 2021
Runtime: 创建一个goroutine都经历了什么?
"\u003cp\u003e我们都知道goroutine的在golang中发挥了很大的作用,那么当我们创建一个新的goroutine时,它是怎么一步一步创建的呢?都经历了哪些操作呢?今天我们通过源码来剖析一下创建goroutine都经历了些什么?go version 1.15.6\u003c/p\u003e\n\u003cp\u003e对goroutine最关键的两个函数是 \u003ccode\u003e[newproc()](https://github.com/golang/go/blob/go1.15.6/src/runtime/proc.go#L3535-L3564)\u003c/code\u003e 和 \u003ccode\u003e[newproc1()](https://github.com/golang/go/blob/go1.15.6/src/runtime/proc.go#L3566-L3674)\u003c/code\u003e,而 \u003ccode\u003enewproc1()\u003c/code\u003e 函数是我们最需要关注的。\u003c/p\u003e\n\u003ch2 id=\"函数-newproc\"\u003e函数 newproc()\u003c/h2\u003e\n\u003cp\u003e我们先看一个简单的创建goroutine的例子,找出来创建它的函数。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nfunc start(a, b, c int64) {\n\t_ = a + b + c\n}\n\nfunc main() {\n\tgo start(7, 2, 5)\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e输出结果: …\u003c/p\u003e"
February 15, 2021
Runtime: 理解Golang中接口interface的底层实现
"\u003cp\u003e接口类型是Golang中是一种非常非常常见的\u003ccode\u003e数据类型\u003c/code\u003e,每个开发人员都很有必要知道它到底是如何使用的,如果了解了它的底层实现就对开发就更有帮助了。\u003c/p\u003e\n\u003ch1 id=\"接口的定义\"\u003e接口的定义\u003c/h1\u003e\n\u003cp\u003e在Golang中 \u003ccode\u003einterface\u003c/code\u003e 通常是指实现了一 组抽象方法的集合,它提供了一种无侵入式的方式。当你实现了一个接口中指定的所有方法的时候,那么就实现了这个接口,在Golang中对它的实现并不需要 \u003ccode\u003eimplements\u003c/code\u003e 关键字。\u003c/p\u003e\n\u003cp\u003e有时候我们称这种模型叫做鸭子模型(Duck typing),维基百科对鸭子模型的定义是\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e”If it looks like a duck, swims like a duck, and quacks like a duck, then it probably is a duck.“\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e翻译过来就是 ”如果它看起来像鸭子,像鸭子一样游泳,像鸭子一样嘎嘎叫,那他就可以认为是鸭子“。\u003c/p\u003e\n\u003cp\u003eGo 不同版本之间interface的结构可能不太一样,但整体都差不多,这里使用的Go版本为 1.15.6。\u003c/p\u003e\n\u003ch1 id=\"数据结构\"\u003e数据结构\u003c/h1\u003e\n\u003cp\u003eGo 中 \u003ccode\u003einterface\u003c/code\u003e 在运行时可分 \u003ccode\u003eeface\u003c/code\u003e 和 \u003ccode\u003eiface\u003c/code\u003e 两种数据结构,我们先看一下对它们的 …\u003c/p\u003e"
February 13, 2021
认识Golang中的sysmon监控线程
"\u003cp\u003eGo Runtime 在启动程序的时候,会创建一个独立的 \u003ccode\u003eM\u003c/code\u003e 作为监控线程,称为 \u003ccode\u003esysmon\u003c/code\u003e,它是一个系统级的 \u003ccode\u003edaemon\u003c/code\u003e 线程。这个\u003ccode\u003esysmon\u003c/code\u003e 独立于 GPM 之外,也就是说不需要P就可以运行,因此官方工具 \u003ccode\u003ego tool trace\u003c/code\u003e 是无法追踪分析到此线程( \u003ca href=\"https://github.com/golang/go/blob/go1.15.6/src/runtime/proc.go#L4639-L4760\"\u003e源码\u003c/a\u003e)。\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2021/02/6ad0cfb3df2281110cf60630fcfb0e96.png\" alt=\"\"\u003esysmon\u003c/p\u003e\n\u003cp\u003e在程序执行期间 \u003ccode\u003esysmon\u003c/code\u003e 每隔 \u003ccode\u003e20us~10ms\u003c/code\u003e 轮询执行一次( \u003ca href=\"https://github.com/golang/go/blob/go1.15.6/src/runtime/proc.go#L4652-L4659\"\u003e源码\u003c/a\u003e),监控那些长时间运行的 G 任务, 然后设置其可以被强占的标识符,这样别的 \u003ccode\u003eGoroutine\u003c/code\u003e 就可以抢先进来执行。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e// src/runtime/proc.go\n\n// forcegcperiod is the maximum time in nanoseconds between garbage\n// collections. If we go this long without a garbage collection, one\n// is forced to run.\n//\n// This is a variable for testing purposes. It normally doesn\u0026#39;t …\u003c/code\u003e\u003c/pre\u003e"
February 11, 2021
g0 特殊的goroutine
"\u003cp\u003e在上篇 \u003ca href=\"https://blog.haohtml.com/archives/21010\"\u003e《golang中G、P、M 和 sched 三者的数据结构》\u003c/a\u003e文章中,我们介绍了\u003ccode\u003eG\u003c/code\u003e、\u003ccode\u003eM\u003c/code\u003e 和 \u003ccode\u003eP\u003c/code\u003e 的数据结构,其中M结构体中第一个字段是 \u003ccode\u003eg0\u003c/code\u003e,这个字段也是一个 \u003ccode\u003egoroutine\u003c/code\u003e,但和普通的 \u003ccode\u003egoroutine\u003c/code\u003e 有一些区别,它主要用来实现对 goroutine 进行调度,下面我们将介绍它是如何实现调度goroutine的。\u003c/p\u003e\n\u003cp\u003e另外还有一个 \u003ccode\u003em0\u003c/code\u003e , 它是一个全局变量,与 \u003ccode\u003eg0\u003c/code\u003e 的区别如下\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2021/03/8e229b7806870bf4f17da207665b8a43.jpg\" alt=\"\"\u003eM0 与 g0的区别\u003c/p\u003e\n\u003cp\u003e本文主要翻译自 \u003ca href=\"https://medium.com/a-journey-with-go/go-g0-special-goroutine-8c778c6704d8\"\u003eGo: g0, Special Goroutine\u003c/a\u003e 一文,有兴趣的可以查阅原文,作者有一系列高质量的文章推荐大家都阅读一遍。ℹ️ 本文基于 Go 1.13。\u003c/p\u003e\n\u003cp\u003e我们知道在Golang中所有的\u003ccode\u003egoroutine\u003c/code\u003e的运行都是由\u003ccode\u003e调度器\u003c/code\u003e来负责管理的,go调度器尝试为所有的\u003ccode\u003egoroutine\u003c/code\u003e来分配运行时间,当有\u003ccode\u003egoroutine\u003c/code\u003e被阻塞或终止时,调度器会通过对\u003ccode\u003egoroutine\u003c/code\u003e 进行调度以此来保证所有CPU都处于忙碌状态,避免有CPU空闲状态浪费时间。\u003c/p\u003e\n\u003ch2 id=\"goroutine-切换规则\"\u003egoroutine 切换规则\u003c/h2\u003e\n\u003cp\u003e在此之前我们需要记住一些goroutine切换规则。runtime源码\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e// …\u003c/code\u003e\u003c/pre\u003e"
January 26, 2021
Golang环境变量之GODEBUG
"\u003cp\u003e\u003ccode\u003eGODEBUG\u003c/code\u003e 是 golang中一个控制runtime调度变量的变量,其值为一个用逗号隔开的 name=val对列表,常见有以下几个命名变量。\u003c/p\u003e\n\u003ch2 id=\"allocfreetrace\"\u003eallocfreetrace\u003c/h2\u003e\n\u003cp\u003e设置\u003ccode\u003eallocfreetrace = 1\u003c/code\u003e会导致对每个分配进行概要分析,并在每个对象的分配上打印堆栈跟踪并释放它们。\u003c/p\u003e\n\u003ch2 id=\"clobberfree\"\u003eclobberfree\u003c/h2\u003e\n\u003cp\u003e设置 \u003ccode\u003eclobberfree=1\u003c/code\u003e会使垃圾回收器在释放对象的时候,对象里的内存内容可能是错误的。\u003c/p\u003e\n\u003ch2 id=\"cgocheck\"\u003ecgocheck\u003c/h2\u003e\n\u003cp\u003ecgo相关。\u003c/p\u003e\n\u003cp\u003e设置 \u003ccode\u003ecgocheck=0\u003c/code\u003e 将禁用当包使用cgo非法传递给go指针到非go代码的检查。如果值为1(默认值)会启用检测,但可能会丢失有一些错误。如果设置为2的话,则不会丢失错误。但会使程序变慢。\u003c/p\u003e\n\u003ch2 id=\"efence\"\u003eefence\u003c/h2\u003e\n\u003cp\u003e设置 \u003ccode\u003eefence=1\u003c/code\u003e会使回收器运行在一个模式。每个对象都在一个唯一的页和地址,且永远也不会被回收。\u003c/p\u003e\n\u003ch2 id=\"gccheckmark\"\u003egccheckmark\u003c/h2\u003e\n\u003cp\u003eGC相关。\u003c/p\u003e\n\u003cp\u003e设置 \u003ccode\u003egccheckmark=1\u003c/code\u003e 启用验证垃圾回收器的并发标记,通过在STW时第二个标记阶段来实现,如果在第二阶段的时候,找到一个可达对象,但未找到并发标记,则GC会发生Panic。\u003c/p\u003e\n\u003ch2 id=\"gcpacertrace\"\u003egcpacertrace …\u003c/h2\u003e"
January 26, 2021
Golang中MemStats的介绍
"\u003cp\u003e平时在开发中,有时间需要通过查看内存使用情况来分析程序的性能问题,经常会使用到 MemStats 这个结构体。但平时用到的都是一些最基本的方法,今天我们全面认识一下MemStas。\u003c/p\u003e\n\u003cp\u003e相关文件为 \u003ccode\u003esrc/runtime/mstats.go\u003c/code\u003e ,本文章里主要是与内存统计相关。\u003c/p\u003e\n\u003ch2 id=\"memstats-结构体\"\u003eMemStats 结构体\u003c/h2\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e// MemStats记录有关内存分配器的统计信息\ntype MemStats struct {\n\t// General statistics.\n\tAlloc uint64\n\tTotalAlloc uint64\n\tSys uint64\n\tLookups uint64\n\tMallocs uint64\n\tFrees uint64\n\n\t// Heap memory statistics.\n\tHeapAlloc uint64\n\tHeapSys uint64\n\tHeapIdle uint64\n\tHeapInuse uint64\n\tHeapReleased uint64\n\tHeapObjects uint64\n\n\t// Stack memory statistics.\n\tStackInuse uint64 …\u003c/code\u003e\u003c/pre\u003e"
January 25, 2021
Golang中Stack的管理
"\u003ch1 id=\"栈的演变\"\u003e栈的演变\u003c/h1\u003e\n\u003cp\u003e在 Go1.13之前的版本,Golang 栈管理是使用的\u003ccode\u003e分段栈(Segment Stacks)\u003c/code\u003e机制来实现的,由于sgement stack 存在 \u003ccode\u003e热分裂(hot split\u003c/code\u003e)的问题,后面版本改为采用\u003ccode\u003e连续栈( [Contiguous stacks](https://docs.google.com/document/d/1wAaf1rYoM4S4gtnPh0zOlGzWtrZFQ5suE8qr2sD8uWQ/pub))\u003c/code\u003e机制( \u003ca href=\"https://golang.org/doc/go1.3#stacks\"\u003e说明\u003c/a\u003e)。\u003c/p\u003e\n\u003ch2 id=\"分段栈segment-stack\"\u003e分段栈(Segment Stack)\u003c/h2\u003e\n\u003cp\u003e分段栈是指开始时只有一个stack,当需要更多的 stack 时,就再去申请一个,然后将多个stack 之间用双向链接连接在一起。当使用完成后,再将无用的 \u003ccode\u003estack\u003c/code\u003e 从链接中删除释放内存。\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2021/01/d2b5ca33bd970f64a6301fa75ae2eb22-3.png\" alt=\"\"\u003esegment stack\u003c/p\u003e\n\u003cp\u003e可以看到这样确实实现了stack 按需增长和收缩,在增加新stack时不需要拷贝原来的数据,系统使用率挺高的。但在一定特别的情况下会存在 \u003ccode\u003e热分裂(hot split)\u003c/code\u003e 的问题。\u003c/p\u003e\n\u003cp\u003e当一个 stack 即将用完的时候,任意一个函数都会导致堆栈的扩容,当函数执行完返回后,又要触发堆栈的收缩。如果这个操作 …\u003c/p\u003e"
January 22, 2021
Golang 的底层引导流程/启动顺序
"\u003cp\u003e在Golang中,程序的执行入口为 \u003ccode\u003emain()\u003c/code\u003e 函数,那么底层又是如何工作的呢? 这个问题的答案我们可以在runtime源码找到。对它的解释主要在 \u003ccode\u003e[src/runtime/proc.go](https://github.com/golang/go/blob/go1.15.6/src/runtime/proc.go)\u003c/code\u003e 文件,下面我们看一下它是如何一步一步开始执行的。go version 1.15.6\u003c/p\u003e\n\u003cp\u003e在文件头部有一段对 \u003ccode\u003e[Goroutine scheduler](https://github.com/golang/go/blob/go1.15.6/src/runtime/proc.go#L19)\u003c/code\u003e 的介绍,我们先了解一下。\u003c/p\u003e\n\u003cp\u003e调度器的工作是分发\u003ccode\u003egoroutines\u003c/code\u003e到工作线程让其运行。一句话指明了调度器的存在意义,就是指挥协调GPM干活。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e主要包含三部分\u003c/strong\u003e\n\u003ccode\u003eG\u003c/code\u003e 指的是 goroutine\n\u003ccode\u003eM\u003c/code\u003e 工作线程,也叫\u003ccode\u003emachine\u003c/code\u003e\n\u003ccode\u003eP\u003c/code\u003e 处理器(逻辑CPU),执行 \u003ccode\u003eGo code\u003c/code\u003e 的一种资源。这里的Go code 其实就是 goroutine里的代码。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eM\u003c/code\u003e必须被指派给\u003ccode\u003eP\u003c/code\u003e去执行 \u003ccode\u003eGo code\u003c/code\u003e, 但可以被 …\u003c/p\u003e"
January 21, 2021
golang中G、P、M 和 sched 三者的数据结构
"\u003cp\u003eG、P、M 三者是golang实现高并发能的最为重要的概念,\u003ccode\u003eruntime\u003c/code\u003e 通过 \u003ccode\u003e调度器\u003c/code\u003e 来实现三者的相互调度执行,通过 \u003ccode\u003ep\u003c/code\u003e 将用户态的 \u003ccode\u003eg\u003c/code\u003e 与内核态资源 \u003ccode\u003em\u003c/code\u003e 的动态绑定来执行,以减少以前通过频繁创建内核态线程而产生的一系列的性能问题,充分发挥服务器最大有限资源。\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2021/01/7c68d000148bf601267b43631c795bfd.png\" alt=\"\"\u003eGPM 协作\u003c/p\u003e\n\u003cp\u003e调度器的工作是将一个 G(需要执行的代码)、一个 M(代码执行的地方)和一个 P(代码执行所需要的权限和资源)结合起来。\u003c/p\u003e\n\u003cp\u003e所有的 g、m 和 p 对象都是分配在\u003ccode\u003e堆\u003c/code\u003e上且永不释放的,所以它们的内存使用是很稳定的。得益于此,runtime 可以在调度器实现中避免写屏障。当一个G执行完成后,可以放入pool中被再次使用,避免重复申请资源。\u003c/p\u003e\n\u003cp\u003e本节主要通过阅读runtime源码来认识这三个组件到底长的是什么样子,以此加深对 GPM 的理解。go version go1.15.6\u003c/p\u003e\n\u003cp\u003e理解下文前建议先阅读一下 \u003ccode\u003esrc/runtime/HACKING.md\u003c/code\u003e 文件,中文可阅读 \u003ca href=\"https://www.purewhite.io/2019/11/28/runtime-hacking-translate/\"\u003e这里\u003c/a\u003e,这个文件内容是面向开发者理解\u003ccode\u003eruntime\u003c/code\u003e的很值得看一看。\u003c/p\u003e\n\u003cp\u003e本文若没有指定源码文件路径,则默认为 \u003ccode\u003esrc/runtime/runtime2.go\u003c/code\u003e。\u003c/p\u003e\n\u003ch1 id=\"g\"\u003eG\u003c/h1\u003e\n\u003cp\u003eG …\u003c/p\u003e"
January 18, 2021
Runtime: Golang中channel实现原理源码分析
"\u003cp\u003echannel是golang中特有的一种数据结构,通常与goroutine一起使用,下面我们就介绍一下这种数据结构。\u003c/p\u003e\n\u003ch2 id=\"channel数据结构\"\u003echannel数据结构\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003echannel\u003c/code\u003e 是Golang 中最重要的一个数据结构,源码里对应的结构体是\u003ccode\u003ehchan\u003c/code\u003e,当我们创建一个\u003ccode\u003echannel\u003c/code\u003e 的时候,实际上是创建了一个\u003ccode\u003ehchan\u003c/code\u003e结构体。\u003c/p\u003e\n\u003ch3 id=\"hchan结构体\"\u003ehchan结构体\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e// src/runtime/chan.go\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003etype\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003ehchan\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#a6e22e\"\u003eqcount\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003euint\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e// total data in the queue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#a6e22e\"\u003edataqsiz\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003euint\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e// size of the circular queue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#a6e22e\"\u003ebuf\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eunsafe\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ePointer\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e// points to an array of dataqsiz elements\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#a6e22e\"\u003eelemsize\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003euint16\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#a6e22e\"\u003eclosed\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003euint32\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#a6e22e\"\u003eelemtype\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e_type\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e// element type\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#a6e22e\"\u003esendx\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003euint\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e// send index\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#a6e22e\"\u003erecvx\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003euint\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e// …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
January 11, 2021
Runtime:源码解析Golang 的map实现原理
"\u003cp\u003ego version 1.15.6\u003c/p\u003e\n\u003cp\u003emap作为一种常见的 \u003ccode\u003ekey-value\u003c/code\u003e 数据结构,不同语言的实现原理基本差不多。首先在系统里分配一段连接的内存地址作为数组,然后通过对map键进行\u003ccode\u003ehash算法\u003c/code\u003e(最终将键转换成了一个整型数字)定位到不同的桶bucket(数组的索引位置),然后将值存储到对应的bucket里\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2021/01/7614fd6c619c3d1b07a787a82b19cad0.png\" alt=\"map hash算法\"\u003e\u003c/p\u003e\n\u003cp\u003e理想的情况下是一个\u003ccode\u003ebucket\u003c/code\u003e存储一个值,即数组的形式,时间复杂度为O(1)。\u003c/p\u003e\n\u003cp\u003e如果存在键值碰撞的话,可以通过 \u003ccode\u003e链表法\u003c/code\u003e 或者 \u003ccode\u003e开放寻址法\u003c/code\u003e 来解决。\u003c/p\u003e\n\u003cp\u003e链表法\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2021/01/57c223fe323d13755f7b47d3ad427fe1-1.png\" alt=\"d2b5ca33bd970f64a6301fa75ae2eb22-1\"\u003e\u003c/p\u003e\n\u003cp\u003e开放寻址法\u003c/p\u003e\n\u003cp\u003e对于开放寻址法有多种算法,常见的有线性探测法,线性补偿探测法,随机探测法等,这里不再介绍。\u003c/p\u003e\n\u003ch2 id=\"map基本数据结构\"\u003emap基本数据结构\u003c/h2\u003e\n\u003ch3 id=\"hmap结构体\"\u003ehmap结构体\u003c/h3\u003e\n\u003cp\u003emap的核心数据结构定义在 \u003ccode\u003e/runtime/map.go\u003c/code\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e// A header for a Go map.\ntype hmap struct {\n\t// Note: the format of the hmap is also encoded in cmd/compile/internal/gc/reflect.go.\n\t// Make sure this stays in sync …\u003c/code\u003e\u003c/pre\u003e"
December 26, 2020
Golang并发模式之扇入FAN-IN和扇出FAN-OUT
"\u003cp\u003e在现实世界中,经常有一些工作是属于流水线类型的,它们的每一个步骤都是紧密关联的,第一步先做什么,再做什么,最后做什么。特别是制造业这个行业,基本全是流水线生产车间。在我们开发中也经常遇到这类的业务场景。\u003c/p\u003e\n\u003cp\u003e假如我们有个流水线共分三个步骤,分别是 job1、job2和job3。代码: \u003ca href=\"https://play.golang.org/p/e7ZlP9ofXB3\"\u003ehttps://play.golang.org/p/e7ZlP9ofXB3\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003epackage\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003emain\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e (\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;fmt\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;time\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003efunc\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003ejob1\u003c/span\u003e(\u003cspan style=\"color:#a6e22e\"\u003ecount\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e) \u003cspan style=\"color:#f92672\"\u003e\u0026lt;-\u003c/span\u003e\u003cspan style=\"color:#66d9ef\"\u003echan\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#a6e22e\"\u003eoutCh\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e:=\u003c/span\u003e make(\u003cspan style=\"color:#66d9ef\"\u003echan\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e, \u003cspan style=\"color:#ae81ff\"\u003e2\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#66d9ef\"\u003ego\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efunc\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#66d9ef\"\u003edefer\u003c/span\u003e close(\u003cspan style=\"color:#a6e22e\"\u003eoutCh\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#66d9ef\"\u003efor\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003ei\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e0\u003c/span\u003e; \u003cspan style=\"color:#a6e22e\"\u003ei\u003c/span\u003e \u0026lt; \u003cspan style=\"color:#a6e22e\"\u003ecount\u003c/span\u003e; \u003cspan style=\"color:#a6e22e\"\u003ei\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e++\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\u003cspan style=\"color:#a6e22e\"\u003etime\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eSleep\u003c/span\u003e(\u003cspan style=\"color:#a6e22e\"\u003etime\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eSecond\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\u003cspan style=\"color:#a6e22e\"\u003efmt\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ePrintln\u003c/span\u003e(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;job1 finish:\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\u003cspan style=\"color:#a6e22e\"\u003eoutCh\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026lt;-\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eoutCh\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003efunc\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003ejob2\u003c/span\u003e(\u003cspan style=\"color:#a6e22e\"\u003einCh …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
December 24, 2020
重新认识Golang中的空结构体
"\u003col\u003e\n\u003cli\u003e认识空结构体\u003c/li\u003e\n\u003cli\u003e低层实现原理\u003c/li\u003e\n\u003cli\u003e空结构体之内存对齐\u003c/li\u003e\n\u003cli\u003e应用场景\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e在golang中,如果我们想实现一个set集合的话,一般会使用map来实现,其中将set的值作为map的键,对于map的值一般使用一个空结构体来实现,当然对map值也可以使用一个bool类型或者数字类型等,只要符合一个键值对应关系即可。但我们一般推荐使用struct{}来实现,为什么呢?\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport \u0026#34;fmt\u0026#34;\n\nfunc main() {\n\tm := make(map[int]struct{})\n\tm[1] = struct{}{}\n\tm[2] = struct{}{}\n\n\tif _, ok := m[1]; ok {\n\t\tfmt.Println(\u0026#34;exists\u0026#34;)\n\t}\n\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e上面这段代码是一个很简单的使用map实现的set功能,这里是采用空结构体struct{}来实现。\u003c/p\u003e\n\u003cp\u003e在分析为什么使用struct{}以前,我看先认识一个struct。\u003c/p\u003e\n\u003ch2 id=\"认识空结构体-struct\"\u003e认识空结构体 struct\u003c/h2\u003e\n\u003cp\u003e我们先看一个这段代码\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport ( …\u003c/code\u003e\u003c/pre\u003e"
December 17, 2020
Golang中的内存重排(Memory Reordering)
"\u003ch2 id=\"什么是内存重排\"\u003e什么是内存重排\u003c/h2\u003e\n\u003cp\u003e内存重排指的是内存的读/写指令重排。\u003c/p\u003e\n\u003ch2 id=\"为什么要内存重排\"\u003e为什么要内存重排\u003c/h2\u003e\n\u003cp\u003e为了提升程序执行效率,减少一些IO操作,一些硬件或者编译器会对程序进行一些指令优化,优化后的结果可能会导致程序编码时的顺序与代码编译后的先后顺序不一致。\u003c/p\u003e\n\u003cp\u003e就拿做饭场景来说吧,是先蒸米还是先炒菜,这两者是没有冲突的,编译器在编译时有可能与你要求的顺序不一样。\u003c/p\u003e\n\u003ch2 id=\"编译器重排\"\u003e编译器重排\u003c/h2\u003e\n\u003cp\u003e如下面这段代码\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eX = 0\nfor i in range(100):\n X = 1\n print X\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e要实现打印100次1,很显示在for里面每次都执行X=1语句有些浪费资源,如果将初始变量值修改为1,是不是要快的多。编译器也分析到了这一点,于是在编译时对代码做了以下优化\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eX = 1\nfor i in range(100):\n print X\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e最终输出结果是一样的,两段代码功能也一样。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e但是\u003c/strong\u003e如果此时有另一个线程里执行了一个 X=0 的赋值语句的话(两个线程同时运行),那么输出结果就可能与我们想要的不一样了。\u003c/p\u003e\n\u003cp\u003e优化前情况:第一个线程执行到了第3次print X 后,第二个线程执行了X=0,把X 的值进行了修改,结果就有可能是1110 …\u003c/p\u003e"
November 19, 2020
Golang中的并发原语 Singleflight
"\u003cp\u003e在Golang中有一个并发原语是 \u003ca href=\"https://pkg.go.dev/golang.org/x/sync/singleflight\"\u003eSingleflight\u003c/a\u003e,好像知道的开发者并不多。其中著名的 \u003ca href=\"https://github.com/golang/groupcache\"\u003ehttps://github.com/golang/groupcache\u003c/a\u003e 就用到了这个并发原语。\u003c/p\u003e\n\u003ch2 id=\"golang版本\"\u003eGolang版本\u003c/h2\u003e\n\u003cp\u003ego1.15.5\u003c/p\u003e\n\u003ch2 id=\"相关知识点\"\u003e相关知识点\u003c/h2\u003e\n\u003cp\u003emap、Mutex、channel、\u003c/p\u003e\n\u003ch2 id=\"使用场景\"\u003e使用场景\u003c/h2\u003e\n\u003cp\u003e一般用在对指定资源频繁操作的情况下,如高并发下的“缓存击穿”问题。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e缓存击穿:一个存在的key,在缓存过期的瞬间,同时有大量的请求过来,造成所有请求都去DB读取数据,这些请求都会击穿缓存到DB,造成瞬时DB请求量大、压力瞬间骤增,导致数据库负载过高,影响整个系统正常运行。(缓存击穿不同于 缓存雪崩 和 缓存穿透)\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e怎么理解这个原语呢,简单的讲就是将对同一个资源的多个请求合并为一个请求。\u003c/p\u003e\n\u003cp\u003e举例说明,假如当有10万个请求来获取同一个key的值的时候,正常情况下会执行10万次get操作。而使用singleflight并发语后,只需要首次的地个请求执行一次get操作就可以了,其它请求再过来时,只需要只需要等待即可。待执行结果返回后,再把结果分别返回给等待中的请求,每个请求再返回给客户端,由此看看,在一定的高 …\u003c/p\u003e"
September 27, 2020
Protobuf协议实现原理
"\u003cp\u003e\u003ccode\u003eprotobuf\u003c/code\u003e是Google开源的一款支持跨平台、语言中立的结构化数据描述和高性能序列化协议,此协议完全基于二进制,所以性能要远远高于JSON/XML。由于出色的传输性能因此常见于微服务之间的通讯,其中最为著名的是Google开源的 \u003ca href=\"https://grpc.io/\"\u003egRPC\u003c/a\u003e 框架。\u003c/p\u003e\n\u003cp\u003e那么protobuf是如何实现高性能的,又是如何实现数据的编码和解码的呢?\u003c/p\u003e\n\u003ch2 id=\"protobuf协议原理\"\u003eprotobuf协议原理\u003c/h2\u003e\n\u003cp\u003e基于128bits的数据存储方式(Base 128 Varints)\u003c/p\u003e\n\u003cp\u003eVarint 是一种紧凑的表示数字的方法。它用一个或多个字节来表示一个数字,值越小的数字使用越少的字节数。这能减少用来表示数字的字节数。\u003c/p\u003e\n\u003cp\u003e比如对于 int32 类型的数字,一般需要 4 个 byte 来表示。但是采用 Varint,对于很小的 int32 类型的数字,则可以用 1 个 byte 来表示。当然凡事都有好的也有不好的一面,采用 Varint 表示法,大的数字则需要 5 个 byte 来表示。从统计的角度来说,一般不会所有的消息中的数字都是大数,因此大多数情况下,采用 Varint 后,可以用更少的字节数来表示数字信息\u003c/p\u003e\n\u003cp\u003eVarint 中的每个 byte 的最 …\u003c/p\u003e"
September 19, 2020
Golang开发中中使用GitHub私有仓库
"\u003cp\u003e私有仓库地址为\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003egithub.com/cfanbo/websocket\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"一设置私有环境变量-goprivate\"\u003e一、设置私有环境变量 GOPRIVATE\u003c/h2\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ go env -w GOPRIVATE=github.com/cfanbo/websocket\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e对于为什么需要设置 GOPRIMARY 变量,可以参考 \u003ca href=\"https://gocn.vip/topics/9904\"\u003e这里\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e对于GOPRIVATE值级别分为仓库级别和账号级别。\u003c/p\u003e\n\u003cp\u003e如果只有一个仓库,直接设置为仓库地址即可。如果有多个私有仓库的话,使用”,”分开,都在这个账号下,也可以将值设置为账号级别,这样账号下的所有私有仓库都可以正常访问。如 \u003ca href=\"http://github.com/cfanbo\"\u003ehttp://github.com/cfanbo\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e如果不想每次都重新设置,我们也可以利用通配符,例如:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ go env -w GOPRIVATE=\u0026#34;*.example.com\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这样子设置的话,所有模块路径为 example.com 的子域名(例如:git.example.com)都将不经过 Go module proxy 和 Go checksum database,需要注意的是不包括 example.com 本身。\u003c/p\u003e\n\u003cp\u003e国内用户访问仓库建议设置 GORPOXY …\u003c/p\u003e"
June 6, 2020
利用jenkins+github实现应用的自动部署及回滚
"\u003cp\u003e对于jenkins的介绍这里不再详细写了,此教程只是为了让大家对部署和回滚原理有所了解。\u003c/p\u003e\n\u003ch2 id=\"一创建项目\"\u003e一、创建项目\u003c/h2\u003e\n\u003cp\u003e点击左侧的“New Item”,输入项目名称,如 rollback-demo。\u003c/p\u003e\n\u003cp\u003e选中 ” 丢弃旧的构建(Discard old builds)”项,在“策略(Strategy” 选择”\u003cem\u003eLog Rotation\u003c/em\u003e“, 并输入保留的最大构建个数。\u003c/p\u003e\n\u003ch2 id=\"二常规配置-05a2833329fee18776c5682a1068d288\"\u003e二、常规配置 \u003cimg src=\"https://blogstatic.haohtml.com/uploads/2020/06/16e3bc0afb4cf3f179f02fc598c220cd.png\" alt=\"05a2833329fee18776c5682a1068d288\"\u003e\u003c/h2\u003e\n\u003cp\u003e设置参数,点击”\u003cem\u003eAdd Parameter\u003c/em\u003e“,依次选择 “\u003cem\u003eChoice Parameter\u003c/em\u003e” 和 “\u003cem\u003eString Parameter\u003c/em\u003e“这两,填写如下\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2020/06/3193669cca6c1da1bdde929ec1666ff2.png\" alt=\"ac7d45c20f8b6777ab153ce75439dafb\"\u003e\u003c/p\u003e\n\u003cp\u003e这里的Name 项为参数名称,用户在操作的时候,会在deploy 和 rollback 两个值中选择一项。\u003c/p\u003e\n\u003ch2 id=\"三源码管理\"\u003e三、源码管理\u003c/h2\u003e\n\u003cp\u003e我们这里选择Git.并填写github.com上的项目地址,记得设置认证 Credentials。构建分支直接使用默认的 */master 即可以了。查看代码浏览器选择 githubweb,并填写项目的github地址。\u003c/p\u003e\n\u003ch2 id=\"四构建触发事件\"\u003e四、构建触发事件\u003c/h2\u003e\n\u003cp\u003e选择 “GitHub hook trigger for GITScm polling”,表示使用github webhook来 …\u003c/p\u003e"
May 27, 2020
golang中几种对goroutine的控制方法
"\u003cp\u003e我们先看一段代码\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003efunc listen() {\n\tticker := time.NewTicker(time.Second)\n\tfor {\n\t\tselect {\n\t\tcase \u0026lt;-ticker.C:\n\t\t\tfmt.Println(time.Now())\n\t\t}\n\t}\n}\nfunc main() {\n\tgo listen()\n\ttime.Sleep(time.Second * 5)\n\tfmt.Println(\u0026#34;main exit\u0026#34;)\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e非常简单的一个goroutine用法,想必每个gopher都看过的。\u003c/p\u003e\n\u003cp\u003e不过在实际生产中,我们几乎看不到这种用法的的身影,原因很简单,我们无法实现对goroutine的控制,而一般业务中我们需要根据不同情况对goroutine进行各种操作。\u003c/p\u003e\n\u003cp\u003e要实现对goroutine的控制,一般有以下两种。\u003c/p\u003e\n\u003ch2 id=\"一手动发送goroutine控制信号\"\u003e一、手动发送goroutine控制信号\u003c/h2\u003e\n\u003cp\u003e这里我们发送一个退出goroutine的信号。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e// listen 利用只读chan控制goroutine的退出\nfunc listen(ch \u0026lt;-chan bool) {\n\tticker := …\u003c/code\u003e\u003c/pre\u003e"
May 3, 2020
Golang遍历切片删除元素引起恐慌问题
"\u003cp\u003e删除一个切片的部分元素, 告知切片操作:\u003ca href=\"http://cn.voidcc.com/question/p-mkbvfagj-hy.html\"\u003eGolang遍历切片恐慌时删除元素\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"问题描述\"\u003e问题描述\u003c/h2\u003e\n\u003cp\u003e代码( \u003ca href=\"https://go.dev/play/p/Kyvo7YQuw1m\"\u003e演示代码\u003c/a\u003e):\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport (\n\t\u0026#34;fmt\u0026#34;\n)\n\nfunc main() {\n\tslice := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}\n\tfor i, value := range slice {\n\t\tif value%3 == 0 { // remove 3, 6, 9\n\t\t\tslice = append(slice[:i], slice[i+1:]...)\n\t\t}\n\t}\n\tfmt.Printf(\u0026#34;%v\u0026#34;, slice)\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e运行结果\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epanic: runtime error: slice bounds out of range [8:6]\n\ngoroutine 1 [running]:\nmain.main()\n\t/tmp/sandbox2635969259/prog.go:11 +0x212\n\nProgram exited.\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"解决办法\"\u003e\u003cstrong\u003e解决办法:\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003e以下是网友想到的几种办法\u003c/p\u003e\n\u003cp\u003e1、使用\u003ccode\u003egoto\u003c/code\u003e和标签\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003efunc …\u003c/code\u003e\u003c/pre\u003e"
April 30, 2020
Golang中select用法导致CPU占用100%的问题分析
"\u003cp\u003e上一节( \u003ca href=\"https://blog.haohtml.com/archives/19670\"\u003egolang中有关select的几个知识点\u003c/a\u003e)中介绍了一些对于select{}的一些用法,今天介绍一下有关select在 \u003ccode\u003efor语句\u003c/code\u003e 中由于使用不当引起的CPU占用100% 的案例。\u003c/p\u003e\n\u003cp\u003e先看代码\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport (\n\t\u0026#34;fmt\u0026#34;\n\t\u0026#34;time\u0026#34;\n)\n\nfunc main() {\n\tch := make(chan int, 10)\n\t// 读取chan\n\tgo func() {\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase i := \u0026lt;-ch:\n\t\t\t\t// 只读取15次chan\n\t\t\t\tfmt.Println(i)\n\t\t\tdefault:\n\t\t\t\t// 读取15次chan以后的操作一直在这个空语句无任何IO操作的default条件里死循环,无法出让P,以保证一个GPM关系。\n\t\t\t\t// 而如果无default条件的话,则系统当读取完15次chan后,当前goroutine会发生 chan IO 阻塞, Go调度器根据GPM的调度关系,会将当前执行关系中的G切换出去,再从LRQ队列中取一个新的G,重新组成一 …\u003c/code\u003e\u003c/pre\u003e"
April 21, 2020
基于 GitHub Actions 实现 Golang 项目的自动构建部署
"\u003cp\u003e前几天 GitHub官网宣布 GitHub 的所有核心功能对所有人都免费开放,不得不说自从微软收购了GitHub后,确实带来了一些很大的改变。\u003c/p\u003e\n\u003cp\u003e以前有些项目考虑到协作关系的原因,虽然放在github上面,但对于一些项目的持续构建和部署一般是通过自行抢建Travis CI、jenkins等系统来实现。虽然去年推出了Actions用来代替它类三方系统,但感觉着还是不方便,必须有些核心功能无法使用,此消息的发布很有可能将这种格局打破。\u003c/p\u003e\n\u003cp\u003e本篇教程将介绍使用github的系列产品来实现项目的发布,构建,测试和部署,当然这仅仅是一个非常小的示例,有些地方后期可能会有更好的瞿恩方案。\u003c/p\u003e\n\u003cp\u003eGitHub Actions 是一款持续集成工具,包括clone代码,代码构建,程序测试和项目发布等一系列操作。更多内容参考:\u003c/p\u003e\n\u003cp\u003e如果你对CI/CD不了解的话,建议先找些文档看看。\u003c/p\u003e\n\u003cp\u003e项目源文件见\u003c/p\u003e\n\u003ch2 id=\"github-actions-术语\"\u003eGitHub Actions 术语\u003c/h2\u003e\n\u003cp\u003eGitHub Actions 相关的术语。\u003c/p\u003e\n\u003cp\u003e(1)workflow (工作流程):持续集成一次运行的过程,就是一个 workflow。\u003c/p\u003e\n\u003cp\u003e(2)job (任务):一个 workflow 由一个或 …\u003c/p\u003e"
March 27, 2020
Golang中的限速器 time/rate
"\u003cp\u003e在高并发的系统中,限流已作为必不可少的功能,而常见的限流算法有:计数器、滑动窗口、令牌桶、漏斗(漏桶)。其中滑动窗口算法、令牌桶和漏斗算法应用最为广泛。\u003c/p\u003e\n\u003ch2 id=\"常见限流算法\"\u003e常见限流算法\u003c/h2\u003e\n\u003cp\u003e这里不再对 \u003ccode\u003e计数器算法\u003c/code\u003e 和 \u003ccode\u003e滑动窗口\u003c/code\u003e 算法一一介绍,有兴趣的同学可以参考其它相关文章。\u003c/p\u003e\n\u003ch3 id=\"漏斗算法\"\u003e漏斗算法\u003c/h3\u003e\n\u003cp\u003e漏斗算法很容易理解,它就像有一个漏斗容器一样,漏斗上面一直往容器里倒水(请求),漏斗下方以\u003cstrong\u003e固定速率\u003c/strong\u003e一直流出(消费)。如果漏斗容器满的情况下,再倒入的水就会溢出,此时表示新的请求将被丢弃。可以看到这种算法在应对大的突发流量时,会造成部分请求弃用丢失。\u003c/p\u003e\n\u003cp\u003e可以看出漏斗算法能强行限制数据的传输速率。\u003cimg src=\"https://blog.haohtml.com/wp-content/uploads/2020/03/rate-limit.png\" alt=\"\"\u003e漏斗算法\u003c/p\u003e\n\u003ch3 id=\"令牌桶算法\"\u003e令牌桶算法\u003c/h3\u003e\n\u003cp\u003e从某种意义上来说,令牌算法是对漏斗算法的一种改进。对于很多应用场景来说,除了要求能够限制数据的平均传输速率外,还要求允许某种程度的突发情况。这时候漏桶算法可能就不合适了,令牌桶算法更为适合。\u003c/p\u003e\n\u003cp\u003e令牌桶算法是指一个固定大小的桶,可以存放的令牌的最大个数也是固定的。此算法以一种\u003cstrong\u003e固定速率\u003c/strong\u003e不断的往桶中存放令牌,而每次请求调用前必须先从桶中获取令牌才可以。否则进行拒绝或等待,直到获取到有效令牌为止。如果桶内的令牌数量已达到桶的最 …\u003c/p\u003e"
March 19, 2020
Golang中的两个定时器 ticker 和 timer
"\u003cp\u003eGolang中time包有两个定时器,分别为 \u003ccode\u003eticker\u003c/code\u003e 和 \u003ccode\u003etimer\u003c/code\u003e。两者都可以实现定时功能,但各自都有自己的使用场景。\u003c/p\u003e\n\u003ch2 id=\"ticker定时器\"\u003eTicker定时器\u003c/h2\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport (\n\t\u0026#34;fmt\u0026#34;\n\t\u0026#34;time\u0026#34;\n)\n\nfunc main() {\n // Ticker 包含一个通道字段C,每隔时间段 d 就向该通道发送当时系统时间。\n // 它会调整时间间隔或者丢弃 tick 信息以适应反应慢的接收者。\n // 如果d \u0026lt;= 0会触发panic。关闭该 Ticker 可以释放相关资源。\n\n\tticker1 := time.NewTicker(5 * time.Second)\n\t// 一定要调用Stop(),回收资源\n\tdefer ticker1.Stop()\n\tgo func(t *time.Ticker) {\n\t\tfor {\n\t\t\t// 每5秒中从chan t.C 中读取一次\n\t\t\t\u0026lt;-t.C\n\t\t\tfmt.Println(\u0026#34;Ticker:\u0026#34;, …\u003c/code\u003e\u003c/pre\u003e"
March 4, 2020
认识虚拟内存
"\u003ch2 id=\"什么是虚拟内存\"\u003e什么是虚拟内存\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://baike.baidu.com/item/%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98/101812\"\u003e虚拟内存\u003c/a\u003e是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。目前,大多数操作系统都使用了虚拟内存,如Windows家族的“虚拟内存”;Linux的“交换空间”等。\u003c/p\u003e\n\u003ch2 id=\"为什么需要虚拟内存\"\u003e为什么需要虚拟内存\u003c/h2\u003e\n\u003cp\u003e我们知道程序执行指令的时候,程序计数器是顺序地一条一条指令执行下去,这一条条指令就需要连续地存储在一起,所以就需要这块内存是连续的。物理内存是有限的,如果多个程序同时运行的话,访问同一个物理地址的话,就有可能内存地址冲突,怎么办呢?\u003c/p\u003e\n\u003cp\u003e这时就需要虚拟内存发挥的作用了,程序里有指令和各种内存地址,系统从物理内存申请一段地址,与这个程序指令里用到的内存地址建立映射关系,这样实际程序指令执行的时候,会通过虚拟内存地址,找到对应的物理内存地址执行。对于任何一个程序来说,它看到的都是同样的内存地址。我们只需要维护一个虚拟内存到物理内存的映射表即可。\u003c/p\u003e\n\u003cp\u003e这种从物理内存申请一段地址建立映射的方法,我们称其为\u003cstrong\u003e内存分段\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e看似解决了上面的问题,但这里又引起了新的问 …\u003c/p\u003e"
January 18, 2020
Golang中的变量逃逸问题 变量去哪了?
"\u003cp\u003e参考阅读 \u003ca href=\"https://mp.weixin.qq.com/s/ashgWyb-w4fT47xX60yNFA\"\u003ehttps://mp.weixin.qq.com/s/ashgWyb-w4fT47xX60yNFA\u003c/a\u003e\u003c/p\u003e"
January 18, 2020
Golang中关于defer语句理解的一道题
"\u003ch2 id=\"示例\"\u003e示例\u003c/h2\u003e\n\u003cp\u003e我们先看一下源代码\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport \u0026#34;fmt\u0026#34;\n\nfunc f(n int) (r int) {\n\tdefer func() {\n\t\tr += n\n\t\trecover()\n\t}()\n\n\tvar fc func()\n\tdefer fc()\n\tfc = func() {\n\t\tr += 2\n\t}\n\n\treturn n + 1\n}\n\nfunc main() {\n\tfmt.Println(f(3))\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e大家感觉着打印的值是多少呢?5、9还是7?执行完以后发现是7。好像与多数理解的有些出入,为什么是7,而不是9呢。下面我们来分析一下。\u003c/p\u003e\n\u003ch2 id=\"问题分析\"\u003e问题分析\u003c/h2\u003e\n\u003cp\u003e对于defer执行的顺序是FIFO这一点都很清楚,我们只需要看搞懂f()函数的执行顺序就行了。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e执行顺序为:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e注册第1个defer 函数, 这里为匿名函数,函数体为 “func() { r += n recover() }()”,内部对应一个函数指针。这里延时函数所有相关的操作一步完成。\u003c/li\u003e\n\u003cli\u003e注册第2个defer函数,函数名为fc(),无函数体, 函数指针为\u003cstrong\u003enil\u003c/strong\u003e(也有可能指针不会空,但指针指向的内容非函数体 …\u003c/li\u003e\u003c/ol\u003e"
January 15, 2020
开发者必知redis知识点
"\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e剖析Redis常用数据类型对应的数据结构 \u003ca href=\"https://time.geekbang.org/column/article/79159\"\u003ehttps://time.geekbang.org/column/article/79159\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eredis中的COW(Copy-On-Write) \u003ca href=\"https://www.jianshu.com/p/b2fb2ee5e3a0\"\u003ehttps://www.jianshu.com/p/b2fb2ee5e3a0\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eredis常用有哪些数据类型及每种数据类型的使用场景有哪些 \u003ca href=\"https://www.cnblogs.com/tqlin/p/10478459.html\"\u003ehttps://www.cnblogs.com/tqlin/p/10478459.html\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e如果存储一个JSON数据时,选择hash还是string 存储数据? \u003ca href=\"https://segmentfault.com/a/1190000019552836\"\u003ehttps://segmentfault.com/a/1190000019552836\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eredis与memcache的区别 \u003ca href=\"https://www.cnblogs.com/JavaBlackHole/p/7726195.html\"\u003ehttps://www.cnblogs.com/JavaBlackHole/p/7726195.html\u003c/a\u003e \u003ca href=\"https://blog.csdn.net/qq_34126805/article/details/81748107\"\u003ehttps://blog.csdn.net/qq_34126805/article/details/81748107\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eredis支持多CPU吗?如何发挥多cpu? …\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e"
January 14, 2020
golang中有关select的几个知识点
"\u003cp\u003egolang中的select语句格式如下\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eselect {\n case \u0026lt;-ch1:\n // 如果从 ch1 信道成功接收数据,则执行该分支代码\n case ch2 \u0026lt;- 1:\n // 如果成功向 ch2 信道成功发送数据,则执行该分支代码\n default:\n // 如果上面都没有成功,则进入 default 分支处理流程\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e可以看到select的语法结构有点类似于switch,但又有些不同。\u003c/p\u003e\n\u003cp\u003eselect里的case后面并不带判断条件,而是一个信道的操作,不同于switch里的case,对于从其它语言转过来的开发者来说有些需要特别注意的地方。\u003c/p\u003e\n\u003cp\u003egolang 的 select 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作每个case语句里必须是一个IO操作,确切的说,应该是一个面向channel的IO操作。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e注:Go 语言的 \u003ccode\u003eselect\u003c/code\u003e 语句借鉴自 Unix 的 \u003ccode\u003eselect()\u003c/code\u003e 函数,在 Unix 中,可以通过调用 \u003ccode\u003eselect()\u003c/code\u003e 函数来监控一系列的文件句柄, …\u003c/p\u003e\u003c/blockquote\u003e"
January 11, 2020
golang性能调优工具
"\u003cp\u003e\u003ca href=\"https://cloud.tencent.com/developer/article/1478198\"\u003eGODEBUG\u003c/a\u003e, 输出结果以gc 开头的表示进行了gc垃圾回收操作,后面的数字表示gc 的次数\u003cimg src=\"https://blog.haohtml.com/wp-content/uploads/2020/01/golang_gc.jpg\" alt=\"\"\u003e \u003ca href=\"https://www.jianshu.com/p/ba9f07a346d5\"\u003epprof\u003c/a\u003e\u003c/p\u003e"
January 11, 2020
golang中的sync.Pool对象缓存
"\u003ch2 id=\"参考文章\"\u003e参考文章\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://juejin.im/post/5b7678f451882533110e8948\"\u003eGolang 的 协程调度机制 与 GOMAXPROCS 性能调优\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.cnblogs.com/sunsky303/p/9706210.html\"\u003e深入Golang之sync.Pool详解\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.jianshu.com/p/494cda4db297\"\u003egolang sync.Pool 分析\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://juejin.im/post/5d006254e51d45776031afe3\"\u003e[译] Go: 理解 Sync.Pool 的设计\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e视频 \u003ca href=\"https://time.geekbang.org/course/detail/160-87731\"\u003esync.pool对象缓存\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"知识点\"\u003e知识点\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ePool只是一个缓存,一个缓存,一个缓存。由于生命周期受GC的影响,一定不要用于数据库连接池这类的应用场景,它只是一个缓存。\u003c/li\u003e\n\u003cli\u003egolang1.13版本对 \u003ca href=\"https://golang.org/pkg/sync/#Pool\"\u003ePool\u003c/a\u003e 进行了优化,结构体添加了两个字段 victim 和 victimSize。\u003c/li\u003e\n\u003cli\u003e适应于通过复用,降低复杂对象的创建和GC代价的场景\u003c/li\u003e\n\u003cli\u003e因为init()的时候会注册一个PoolCleanup函数,他会在gc时清除掉sync.Pool中的所有的缓存的对象。所以每个sync.Pool的生命周期为两次GC中间时段才有效,可以手动进行gc操作 \u003cstrong\u003eruntime.GC()\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e由于要保证协程安全,所以会有锁的开销\u003c/li\u003e\n\u003cli\u003e每个Pool都有一个私有池(协程安全)和共享池(\u003cstrong\u003e协程不安全\u003c/strong\u003e),其中私有池只有存放一个值。\u003c/li\u003e\n\u003c/ul\u003e\n\u003col\u003e\n\u003cli\u003e每次Get()时会先从当前P的私有池private中获取( \u003ca href=\"https://studygolang.com/articles/11825\"\u003e类似MPG模型中的G\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e如果获 …\u003c/li\u003e\u003c/ol\u003e"
January 11, 2020
golang 的编程模式之“功能选项”
"\u003cp\u003e最近在用go重构iot中的一个服务时,发现库 \u003ca href=\"https://github.com/apache/rocketmq-client-go/releases/tag/v2.0.0-rc1\"\u003erocketmq-client-go@v2.0.0-rc1\u003c/a\u003e 在初始化消费客户端实现时,实现的极其优雅,代码见 \u003ca href=\"https://github.com/apache/rocketmq-client-go/blob/v2.0.0-rc1/examples/consumer/simple/main.go#L32\"\u003ehttps://github.com/apache/rocketmq-client-go/blob/v2.0.0-rc1/examples/consumer/simple/main.go#L32\u003c/a\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ec, _ := rocketmq.NewPushConsumer(\n consumer.WithGroupName(\u0026#34;testGroup\u0026#34;),\n consumer.WithNameServer([]string{\u0026#34;127.0.0.1:9876\u0026#34;}),\n)\nerr := c.Subscribe(\u0026#34;test\u0026#34;, consumer.MessageSelector{}, func(ctx context.Context,\n msgs ...*primitive.MessageExt) (consumer.ConsumeResult, error) {\n for i := …\u003c/code\u003e\u003c/pre\u003e"
December 31, 2019
使用Dockerfile 多阶段构建Golang 应用
"\u003cp\u003edocker在开发和运维中使用的场景越来越多,作为开发人员非常有必要了解一些docker的基本知识,而离我们工作中最近的也就是对应用的docker部署编排了,小到一个dockerfile, docker-compse文件的编写,大到k8s的管理。这里我们以 golang应用为例讲解一些Dockerfile的基本用法,在ci/cd中经常用到这些知识。\u003c/p\u003e\n\u003ch1 id=\"前提\"\u003e前提\u003c/h1\u003e\n\u003cp\u003e\u003cstrong\u003e项目清单:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003edrwxr-xr-x 9 sxf staff 288 12 31 16:13 .\ndrwx------@ 17 sxf staff 544 12 31 14:59 ..\n-rw-r--r-- 1 sxf staff 14 12 31 16:09 .dockerignore\ndrwxr-xr-x 14 sxf staff 448 12 31 16:21 .git\n-rw-r--r-- 1 sxf staff 467 12 31 16:08 Dockerfile\n-rw-r--r-- 1 sxf staff 11 12 31 15:01 README.md …\u003c/code\u003e\u003c/pre\u003e"
November 8, 2019
Golang中的goroutine泄漏问题
"\u003cp\u003egoroutine作为Go中开发语言中的一大利器,在高并发中发挥着无法忽略的作用。但东西虽好,真正做到用好还是有一些要注意的地方,特别是对于刚刚接触这门开发语言的新手来说,稍有不慎,就极有可能导致goroutine 泄漏。\u003c/p\u003e\n\u003ch2 id=\"什么是goroutine-leak\"\u003e什么是goroutine Leak\u003c/h2\u003e\n\u003cp\u003egoroutine leak 的意思是go协程泄漏,那么什么又是协程泄漏呢?我们知道每次使用go关键字开启一个gorountine任务,经过一段时间的运行,最终是会结束,从而进行系统资源的释放回收。而如果由于操作不当导致一些goroutine一直处于阻塞状态或者永远运行中,永远也不会结束,这就必定会一直占用系统资源。最球的情况下是随着系统运行,一直在创建此类goroutine,那么最终结果就是程序崩溃或者系统崩溃。这种情况我们一般称为goroutine leak。\u003c/p\u003e\n\u003ch2 id=\"出现的问题\"\u003e出现的问题\u003c/h2\u003e\n\u003cp\u003e先看一段代码:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport (\n \u0026#34;fmt\u0026#34;\n \u0026#34;math/rand\u0026#34;\n \u0026#34;runtime\u0026#34;\n \u0026#34;time\u0026#34;\n)\n\nfunc query() …\u003c/code\u003e\u003c/pre\u003e"
August 12, 2019
一列说明数组与Hash效率的区别到底多大
"\u003cp\u003e在数组中添加 10000 个元素,然后分别对这 10000 个元素进行检索,最后统计检索的时间。\u003c/p\u003e\n\u003cp\u003e数组Array\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eimport time\n# 插入数据,数组\nresult = []\nfor i in range(10000):\n result.append(i)\n# 检索数据\ntime_start=time.time()\nfor i in range(10000):\n temp = result.index(i)\ntime_end=time.time()\nprint(\u0026#39;检索时间\u0026#39;, time_end-time_start)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e运行结果:\u003c/p\u003e\n\u003cp\u003e检索时间为 \u003cstrong\u003e1.2436728477478027\u003c/strong\u003e 秒。\u003c/p\u003e\n\u003cp\u003eHash哈希\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eimport time\n# 插入数据\nresult = {}\nfor i in range(1000000):\n result[i] = i\n# 检索数据\ntime_start=time.time()\nfor i in range(10000):\n temp = result[i]\ntime_end=time.time() …\u003c/code\u003e\u003c/pre\u003e"
July 11, 2019
golang内存对齐(进阶必看)
"\u003cp\u003e先看一个结构体\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e// 写法一\ntype T1 struct {\n\ta int8\n\tb int64\n\tc int16\n}\n\n// 写法二\ntype T2 struct {\n\ta int8\n\tc int16\n\tb int64\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e对于这两个结构体,都有a、b、c三个定义完全一样的字段,只是在定义结构体的时候字段顺序不一样而已,那么两种写法有什么影响吗?\u003c/p\u003e\n\u003cp\u003e对于新手来说,感觉着没有什么区别的,只是一个书写顺序不同而已,但对于go编译器来说,则有着很大的区别,特别是在不同架构上(32位/64位)的编译器,在一定程度上对内存的使用大小和执行效率有着一定的不同。这里的主要知识点就是golang语言中的内存对齐概念(alignment guarantee),\u003c/p\u003e\n\u003ch2 id=\"类型的尺寸和结构体字节填充structure-padding\"\u003e类型的尺寸和结构体字节填充(structure padding)\u003c/h2\u003e\n\u003cp\u003eGo白皮书只对以下种类的类型的尺寸进行了\u003ca href=\"https://golang.google.cn/ref/spec#Size_and_alignment_guarantees\"\u003e明确规定\u003c/a\u003e。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e类型种类 尺寸(字节数)\n------ ------\nbyte, uint8, int8 1\nuint16, int16 2 …\u003c/code\u003e\u003c/pre\u003e"
March 23, 2019
goroutine和线程区别
"\u003cp\u003e从调度上看,goroutine的调度开销远远小于线程调度开销。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOS的线程由OS内核调度,每隔几毫秒,一个硬件时钟中断发到CPU,CPU调用一个调度器内核函数\u003c/strong\u003e。这个函数暂停当前正在运行的线程,把他的寄存器信息保存到内存中(暂时保存线程状态),查看线程列表并决定接下来运行哪一个线程,再从内存中恢复线程的注册表信息,最后继续执行选中的线程。这种线程切换需要一个完整的上下文切换:即保存一个线程的状态到内存,再恢复另外一个线程的状态,最后更新调度器的数据结构。某种意义上,这种操作还是很慢的。\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/go_scheduler.png\" alt=\"\"\u003eOS 线程调度器\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eGo运行的时候包涵一个自己的调度器\u003c/strong\u003e,这个调度器使用一个称为一个M:N调度技术,m个goroutine到n个os线程(可以用GOMAXPROCS来控制n的数量),\u003cstrong\u003eGo的调度器不是由硬件时钟来定期触发的,而是由特定的go语言结构来触发的\u003c/strong\u003e,他不需要切换到内核语境,所以调度一个goroutine比调度一个线程的成本低很多。\u003c/p\u003e\n\u003cp\u003e从栈空间上,goroutine的栈空间更加动态灵活。\u003c/p\u003e\n\u003cp\u003e每个OS的线程都有一个固定大小的栈内存,通常是2MB,栈内存用于保存在其他函数调用期间哪些正在执行或者临时暂停的函数的局部 …\u003c/p\u003e"
November 29, 2018
mac下安装python web框架django
"\u003cp\u003e\u003cstrong\u003e前提\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e由于mac自带的python2.7(路径 /usr/bin/python)\n后来手动又安装了python3.7(/usr/local/bin/python3)\u003c/p\u003e\n\u003cp\u003e两个版本共存。为了方便,直接在.zshrc文件里做了别名映射\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ealias python=\u0026#34;/usr/local/bin/python3.7\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e所以直接使用命令python实际上用的是3.7版本。\u003c/p\u003e\n\u003cp\u003e按照官方教程 \u003ca href=\"https://docs.djangoproject.com/zh-hans/2.1/intro/install/\"\u003ehttps://docs.djangoproject.com/zh-hans/2.1/intro/install/\u003c/a\u003e 安装django。发现在使用命令 pip install django 安装后发现检测不到django,很奇怪,后来发现了问题所在。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e➜ ~ python\nPython 3.7.1 (default, Nov 6 2018, 18:46:03)\n[Clang 10.0.0 (clang-1000.11.45.5)] on darwin\nType \u0026#34;help\u0026#34;, \u0026#34;copyright\u0026#34;, \u0026#34;credits\u0026#34; or …\u003c/code\u003e\u003c/pre\u003e"
November 27, 2018
Python中的装饰器decorator
"\u003cp\u003ePython中装饰器有些类似于java中的面向切片编程AOP的概念,就是对一些请求方法进行一些拦截,然后加入一些其实的逻辑。可以参与 \u003ca href=\"https://blog.csdn.net/caimouse/article/details/78078189\"\u003ehttps://blog.csdn.net/caimouse/article/details/78078189\u003c/a\u003e 这篇举的例子,很好理解。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://wiki.jikexueyuan.com/project/the-python-study-notes-second-edition/decorator.html\"\u003ehttp://wiki.jikexueyuan.com/project/the-python-study-notes-second-edition/decorator.html\u003c/a\u003e\u003c/p\u003e"
October 20, 2018
Golang中struct结构体的的值方法和指针方法
"\u003cp\u003e推荐:\u003ca href=\"https://mp.weixin.qq.com/s/msXzSfrDAHNPFjMtJ_i0cw\"\u003eGo的方法集详解(360云计算)\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e平时我们在写struct的时候,经常会用到一些方法,有些方法是我们熟悉的普通方法,在golang中我们称之为值方法,而另一种则是指针方法。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003etype Person struct {\n Firstname string\n Lastname string\n Age uint8\n}\n// 值方法\nfunc (p Person) show() {\n fmt.Println(p.Firstname)\n}\n// 指针方法\nfunc (p *Person) show2() {\n fmt.Println(p.Firstname)\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e可以看到所谓的值方法与指针方法在编写的时候,只是有无*****号的区别,这个*就是指针的意思。\u003c/p\u003e\n\u003cp\u003e那么用法又有何不同呢?\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e// 值方法\nfunc (p Person) setFirstName(name string) {\n p.Firstname = name\n}\n// 指针方法\nfunc (p *Person) setFirstName2(name string) { …\u003c/code\u003e\u003c/pre\u003e"
October 19, 2018
Golang中的unsafe.Sizeof()简述
"\u003cp\u003e测试环境:\n系统 win7 64位\ngo version: go1.10 windows/amd64\u003c/p\u003e\n\u003cp\u003e我们先看一下代码的输出\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport \u0026#34;unsafe\u0026#34;\n\nfunc main() {\n\t// string\n\tstr1 := \u0026#34;abc\u0026#34;\n\tprintln(\u0026#34;string1:\u0026#34;, unsafe.Sizeof(str1)) // 16\n\tstr2 := \u0026#34;abcdef\u0026#34;\n\tprintln(\u0026#34;string2:\u0026#34;, unsafe.Sizeof(str2)) // 16\n\n\t// 数组\n\tarr1 := [...]int{1, 2, 3, 4}\n\tprintln(\u0026#34;array1:\u0026#34;, unsafe.Sizeof(arr1)) // 32 = 8 * 4\n\n\tarr2 := [...]int{1, 2, 3, 4, 5}\n\tprintln(\u0026#34;array2:\u0026#34;, unsafe.Sizeof(arr2)) // 40 = 8 * 5\n\n\t// slice 好多人 …\u003c/code\u003e\u003c/pre\u003e"
October 19, 2018
数据结构与算法
"\u003cp\u003e平时开发中,一般很少用到手动来写算法的情况,但实际上我们一直在接触一些数据结构与算法,如JAVA中的ArrayList 就用到了数据结构与算法,从名字可以看到了用到了Array这种数组结构和链表结构。下面根据目前学习的情况做一个总结。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e数据结构\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e我们常见的数组结构一般有:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eArray数组、\u003c/li\u003e\n\u003cli\u003eStack栈、\u003c/li\u003e\n\u003cli\u003eHeap堆、\u003c/li\u003e\n\u003cli\u003eQueue队列\u003c/li\u003e\n\u003cli\u003eHash 哈希类型\u003c/li\u003e\n\u003cli\u003eLinkedList 链表,其中又分为单向链表、双向链表、还有最少用的环形链表\u003c/li\u003e\n\u003cli\u003eTree 这个Tree分的太多了,如B-Tree、 B+Tree(mysql使用)、Binary Search Tree二叉搜索树 、AVL高度平衡树、Red Black Tree红黑树 等\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/data-struct.png\" alt=\"数据结构\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.bigocheatsheet.com/\"\u003ehttp://www.bigocheatsheet.com/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e算法\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e一般开发中用到的基本上排序算法居多,而算法大体上又分为比较排序和非比较排序。我们常用的比较排序算法有(参考: \u003ca href=\"http://www.cnblogs.com/eniac12/p/5329396.html\"\u003ehttp://www.cnblogs.com/eniac12/p/5329396.html\u003c/a\u003e):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e快速排序 (Quick Sort)\u003c/li\u003e\n\u003cli\u003e冒泡排序 (Bubble Sort) …\u003c/li\u003e\u003c/ul\u003e"
October 17, 2018
常见排序算法总结与实现(冒泡、插入、选择、希尔、堆排序、归并、快排)
"\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/alsf/p/6606287.html\"\u003ehttps://www.cnblogs.com/alsf/p/6606287.html\u003c/a\u003e\n\u003ca href=\"https://blog.csdn.net/wang_hufeng/article/details/80774761\"\u003ehttps://blog.csdn.net/wang_hufeng/article/details/80774761\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e推荐”极客时间”的两个算法专栏,其中有个专栏是视频形式的,两个专栏讲的都是特别的通俗易懂的。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://time.geekbang.org/column/126\"\u003ehttps://time.geekbang.org/column/126\u003c/a\u003e \u003ca href=\"https://time.geekbang.org/course/intro/130\"\u003ehttps://time.geekbang.org/course/intro/130\u003c/a\u003e\u003c/p\u003e"
October 13, 2018
Heap And Stack 堆与栈的区别
"\u003cp\u003e\u003cstrong\u003e堆与栈的区别\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e推荐: \u003ca href=\"https://www.programmerinterview.com/index.php/data-structures/difference-between-stack-and-heap/\"\u003ehttps://www.programmerinterview.com/index.php/data-structures/difference-between-stack-and-heap/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e栈是上下顺序存储的,且“先进后出LIFO”规则,只能删除顶部的元素,而堆是没有特定的顺序的存储,您可以删除任意元素。堆分配需要维护分配的内存和未分配的内存的完整记录,以及一些开销维护以减少碎片,找到足够大以适应请求大小的连续内存段,等等。内存可以随时释放,留出自由空间。有时,内存分配器将执行维护任务,比如通过将分配的内存到处移动来对内存进行碎片整理,或者在运行时进行垃圾收集——当内存不再处于作用域中时对其进行标识并释放它。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e栈用在线程中,程序执行时由线程创建有限数量的栈空间,当线程结束的时候会自动回收,属于系统级。\n堆一般是由应用程序在启动时创建,由应用程序回收,属于应用级。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe stack is attached to a thread, so when the thread exits the stack is reclaimed. The heap is …\u003c/p\u003e\u003c/blockquote\u003e"
October 9, 2018
Golang中的调度器
"\u003cp\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/go-mpg-1.jpg\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003egolang实现的协程调度器,其实就是在维护一个G、P、M三者间关系的队列。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e介绍(Introduction)\u003c/strong\u003e\n———————\nGo 1.1最大的特色之一就是这个新的调度器,由Dmitry Vyukov贡献。新调度器让并行的Go程序获得了一个动态的性能增长,针对它我不能再做点更好的工作了,我觉得我还是为它写点什么吧。\u003c/p\u003e\n\u003cp\u003e这篇博客里面大多数东西都已经被包含在了[原始设计文档]( \u003ca href=\"https://docs.google.com/document/d/1TTj4T2JO42uD5ID9e89oa0sLKhJYD0Y_kqxDv3I3XMw\"\u003ehttps://docs.google.com/document/d/1TTj4T2JO42uD5ID9e89oa0sLKhJYD0Y_kqxDv3I3XMw\u003c/a\u003e)中了,这个文档的内容相当广泛,但是过于技术化了。\u003c/p\u003e\n\u003cp\u003e关于新调度器,你所需要知道的都在那个设计文档中,但是我这篇博客有图片,所以更加清晰易懂。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e带调度器的Go runtime需要什么?(What does the Go runtime need with a scheduler?)\u003c/strong\u003e\n——————————————————————————-\n但是在我们开始看新调度器之前,我们需要理解为什么需要调度器。为什么既然操作系统能为我们调度线程了,我们又创造了一个\u003cstrong\u003e用户空间调 …\u003c/strong\u003e\u003c/p\u003e"
September 24, 2018
Git中的git reset的三种参数的区别
"\u003cp\u003e我们平时在使用git的时候,经常会遇到需要撤销上次操作的需求,这时候需要用到git reset的这个命令,他的使用就是 “git-reset – Reset current HEAD to the specified state”, 注意这里主要操作的就是这个 \u003cstrong\u003eHEAD\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e为了方便我们先了解一下 Git 的工作流程\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/git_flow.jpg\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e相信大家对这个图已经很熟悉了,其中index也叫stage暂存区或者暂存索引区。git reset 共有三个互斥参数分别为”–soft”、”–mixed(默认参数)” 和 “–hard”,每种参数表示一种恢复模式,下面我们将分别看一下这git reset 三个参数的用法区别。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e前提条件\u003c/strong\u003e\n我们仓库中的Git 提交顺序为 “A(a.txt) -\u0026gt; B(b.txt) -\u0026gt; C(c.txt)“,当前分支为master。\n当前 HEAD 指向C,即 a47072e9f97eac4ac02c0abac82b26a9719663fc (HEAD -\u0026gt; master),我们以恢复到B(aad0c91e7b1d3577)点为准。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003etest1 git:(master) …\u003c/code\u003e\u003c/pre\u003e"
September 4, 2018
IO多路复用机制详解(转)
"\u003cp\u003e服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种:\u003c/p\u003e\n\u003cp\u003e(1)\u003cstrong\u003e同步阻塞IO\u003c/strong\u003e(Blocking IO):即传统的IO模型。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/image-20230904182909126.png\" alt=\"image-20230904182909126\"\u003e\u003c/p\u003e\n\u003cp\u003e(2)\u003cstrong\u003e同步非阻塞IO\u003c/strong\u003e(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的NIO并非Java的NIO(New IO)库。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/image-20230904182842534.png\" alt=\"image-20230904182842534\"\u003e\u003c/p\u003e\n\u003cp\u003e(3)\u003cstrong\u003eIO多路复用\u003c/strong\u003e(IO Multiplexing):即经典的 \u003ca href=\"https://blog.csdn.net/linxcool/article/details/7771952\"\u003e反应器Reactor设计模式\u003c/a\u003e,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型。高性能并发服务程序使用IO多路复用模型+多线程任务处理的架构。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/image-20230904182800068.png\" alt=\"image-20230904182800068\"\u003e\u003c/p\u003e\n\u003cp\u003e(4)\u003cstrong\u003e异步IO\u003c/strong\u003e(Asynchronous IO):即经典的 \u003ca href=\"https://blog.csdn.net/xiongping_/article/details/45152333\"\u003eProactor设计模式\u003c/a\u003e,也称为异步非阻塞IO。不经常用。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/image-20230904182813616.png\" alt=\"image-20230904182813616\"\u003e\u003c/p\u003e\n\u003cp\u003e高性能I/O设计模式Reactor和Proactor: \u003ca href=\"https://blog.csdn.net/xiongping_/article/details/45152333\"\u003ehttps://blog.csdn.net/xiongping_/article/details/45152333\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/aspirant/p/9166944.html\"\u003eselect、poll、epoll之间的区别(搜狗面试)\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e转自: …\u003c/p\u003e"
August 31, 2018
Go的内存模型
"\u003cp\u003e\u003ca href=\"https://segmentfault.com/a/1190000008230146\"\u003ehttps://segmentfault.com/a/1190000008230146\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e原文: \u003ca href=\"https://golang.org/ref/mem\"\u003ehttps://golang.org/ref/mem\u003c/a\u003e\u003c/p\u003e"
August 30, 2018
如何优雅地关闭Go channel
"\u003cp\u003e\u003ca href=\"https://www.jianshu.com/p/d24dfbb33781\"\u003ehttps://www.jianshu.com/p/d24dfbb33781\u003c/a\u003e\u003c/p\u003e"
August 30, 2018
理解Go语言的nil
"\u003cp\u003e\u003ca href=\"https://www.jianshu.com/p/dd80f6be7969\"\u003ehttps://www.jianshu.com/p/dd80f6be7969\u003c/a\u003e\u003c/p\u003e"
August 28, 2018
[译]Go里面的unsafe包详解
"\u003cp\u003eunsafe包位置: \u003ccode\u003esrc/unsafe/unsafe.go\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e指针类型:\u003c/strong\u003e\n***类型:**普通指针,用于传递对象地址,不能进行指针运算。\n**unsafe.Pointer:**通用指针,用于转换不同类型的指针,不能进行指针运算。\n**uintptr:**用于指针运算,GC 不把 uintptr 当指针,uintptr 无法持有对象。uintptr 类型的目标会被 GC 回收。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eunsafe.Pointer 可以和 普通指针 进行相互转换。\nunsafe.Pointer 可以和 uintptr 进行相互转换。\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e也就是说 unsafe.Pointer 是桥梁,可以让任意类型的指针实现相互转换,也可以将任意类型的指针转换为 uintptr 进行指针运算。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一般使用流程:\u003c/strong\u003e\n第一步:将结构体 -\u0026gt; 通用指针unsafe.Pointer(struct) -\u0026gt; uintptr(通用指针)获取内存段的起始位置start_pos,并记录下来,第二步使用。\n第二步:使用start_pos + unsafe.Offsetof(s.b) -\u0026gt; 将地址转为能用指 …\u003c/p\u003e"
August 28, 2018
golang中slice切片理解总结
"\u003cp\u003e首先我们对切片有一个大概的理解,先看一下slice的内部结构,共分三部分,一个是指向底层数组的时候,一个是长度len,另一个就是slice的容量cap了。如cap不足以放在新值的时候,会产生新的内存地址申请。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/image-20230904182516517.png\" alt=\"image-20230904182516517\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/image-20230904182527333.png\" alt=\"image-20230904182527333\"\u003e\u003c/p\u003e\n\u003cp\u003e先看代码\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport \u0026#34;fmt\u0026#34;\n\nfunc main() {\n\n // 创建一个切片,长度为9,容量为10\n fmt.Println(\u0026#34;----- 1.测试切片变量append的影响(未申请新的内存空间)-----\u0026#34;)\n a := make([]int, 9,10)\n fmt.Printf( \u0026#34;%p len=%d cap=%d %vn\u0026#34; , a, len(a), cap(a), a)\n\n // 切片进行append操作,由于原来len(a)长度为9,而cap(a)容量为10,未达到扩展内存的要求,此时新创建的切片变量还指向原来的底层数组,只是数组的后面添加一个新值\n // 此时一共两个切片变量,一个是a,另一个是s4。但共指向的一个内存地址\n s4 := …\u003c/code\u003e\u003c/pre\u003e"
July 2, 2018
Go中复制文件的3种方式
"\u003cp\u003e\u003ca href=\"https://opensource.com/article/18/6/copying-files-go\"\u003ehttps://opensource.com/article/18/6/copying-files-go\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e更多: \u003ca href=\"https://opensource.com/tags/go\"\u003ehttps://opensource.com/tags/go\u003c/a\u003e\u003c/p\u003e"
June 14, 2018
时间复杂度:O(1)、O(n)、O(n²)、O(nlogn)等
"\u003cp\u003e\u003ca href=\"https://blog.csdn.net/qq_27093465/article/details/70690749\"\u003ehttps://blog.csdn.net/qq_27093465/article/details/70690749\u003c/a\u003e\u003c/p\u003e"
June 11, 2018
Linux下对进程通信管理的信号机制概述
"\u003cp\u003e今天看到了篇使用golang实现的系统无感重启的文章, \u003ca href=\"https://gravitational.com/blog/golang-ssh-bastion-graceful-restarts/\"\u003ehttps://gravitational.com/blog/golang-ssh-bastion-graceful-restarts/\u003c/a\u003e,一般用来平滑处理一些系统服务,避免先停止再启用导致的服务不可用的情况。其中用到了信号机制,这里找了一些文章主要有来介绍这方面的文章,以便加深理解。 \u003ca href=\"https://blog.csdn.net/junyucsdn/article/details/50519248\"\u003ehttps://blog.csdn.net/junyucsdn/article/details/50519248\u003c/a\u003e \u003ca href=\"https://blog.csdn.net/tiany524/article/details/17048069\"\u003ehttps://blog.csdn.net/tiany524/article/details/17048069\u003c/a\u003e \u003ca href=\"https://my.oschina.net/chenliang165/blog/125825\"\u003ehttps://my.oschina.net/chenliang165/blog/125825\u003c/a\u003e\u003c/p\u003e"
March 8, 2018
Go中slice作为参数传递的一些“坑”
"\u003cp\u003e看明白了这篇文章,下面的例子基本也就明白了\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport \u0026#34;fmt\u0026#34;\n\nfunc main() {\n\ta := []int{1,2,3}\n\tabc(a)\n\tfmt.Println(a)\n}\nfunc abc(a []int) {\n\ta[0] = 2 //修改后还是原来的a\n\ta = append(a, 4) // 此a非原a,使用append导致了重新分配内存地址(存储空间不足,系统自动分配一块新的足够大的内存地址,此时a的物理内存地址已经发行了变化,并将原来a的值copy一份到新的内存地址,所以这里修改的只是新内存地址的值,原来内存地址的值并没有改变),试着删除这行运行一次再看结果\n\tfmt.Println(a)\n\n\ta[0] = 7 // 新a,因为上面执行了append\n\tfmt.Println(a)\n\n\tfmt.Printf(\u0026#34;\\n===\\n\u0026#34;)\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e解释:\n[\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/golang_slice_append.png\" alt=\"\"\u003e][1]\u003c/p\u003e"
March 3, 2018
golang中string rune byte 三者的关系
"\u003cp\u003e\u003ccode\u003eGo\u003c/code\u003e 语言中 \u003ccode\u003ebyte\u003c/code\u003e 和 \u003ccode\u003erune\u003c/code\u003e 实质上就是 \u003ccode\u003euint8\u003c/code\u003e 和 \u003ccode\u003eint32\u003c/code\u003e 类型。 \u003ccode\u003ebyte\u003c/code\u003e 用来强调数据是 \u003ccode\u003eraw data\u003c/code\u003e,而不是数字;而 \u003ccode\u003erune\u003c/code\u003e 用来表示 \u003ccode\u003eUnicode\u003c/code\u003e 的 \u003ccode\u003ecode point\u003c/code\u003e。参考 \u003ca href=\"https://golang.org/ref/spec#Numeric_types\"\u003e规范.\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e在Golang中 string 底层是用byte字节数组存储的,并且是不可以修改的。\u003c/p\u003e\n\u003ch1 class=\"postTitle.wp-block-heading\" id=\"go语言中的byte和rune区别对比\"\u003eGo语言中的byte和rune区别、对比\u003c/h1\u003e\n\u003cp\u003e例如\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003es:=\u0026#34;Go编程\u0026#34;\nfmt.Println(len(s)) //输出结果应该是8因为中文字符是用3个字节存的(2+3*2=8)。\nfmt.Printf(\u0026#34;%d\u0026#34;, len(string(rune(\u0026#39;编\u0026#39;)))) //经测试一个汉字确实占用3个字节,所以结果是3\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e如果想要获得字符个数的话,需要先转换为rune切片再使用内置的len函数\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003efmt.Println(len([]rune(s))) // 结果就是4了。\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e所以用string存储unicode的话,如果有中文,按下标是访问不到的,因为你只能得到一个byte。 要想访问中文的话,还是要用rune切片,这样就能按下表访问。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e总结:\u003c/strong\u003e\n\u003ccode\u003erune …\u003c/code\u003e\u003c/p\u003e"
February 21, 2018
解决mac下brew link python3出错brew Error: Permission denied @ dir_s_mkdir – /usr/local/Frameworks
"\u003cp\u003emac上默认的python版本为2.7.10版本,需要升级到python3 版本,通过brew升级\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$brew install python3\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e提示错误\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e$ brew install python3 Warning: python3 3.6.3is already installed, it‘s just not linked. You can use \u003ccode\u003ebrew link python3\u003c/code\u003e to link this version. $ brew link python3 Linking /usr/local/Cellar/python3/3.6.3… Error: Permission denied @ dir_s_mkdir\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e发现\u003ccode\u003e/usr/local/\u003c/code\u003e下没有路径\u003ccode\u003e/usr/local/Frameworks\u003c/code\u003e\n需要新建该路径,并修改权限\u003c/p\u003e\n\u003cp\u003e解决:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ sudo mkdir /usr/local/Frameworks\n$ sudo chown $(whoami):admin /usr/local/Frameworks\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e成功:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ brew link python3\nLinking …\u003c/code\u003e\u003c/pre\u003e"
January 26, 2018
利用“码云gitee”的钩子实现git仓库自动更新
"\u003cp\u003e使用git时,传统发布方式是手动将新代码 上传到远程仓库,然后在登录服务器执行git pull命令拉取最新的代码,这种操作如果频繁更新的话,我们可以利用git的钩子来实现自动 部署 功能。\u003c/p\u003e\n\u003cp\u003e前提:\nlinux\nphp (gitpull.php)\nnginx 运行用户为 www\u003c/p\u003e\n\u003cp\u003e注意网站 gitpull.php 文件权限问题,还有是否有shell_exec 命令的执行权限\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、先创建自动部署用户的密钥\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo - www\nssh-keygen -t rsa -C \u0026#34;syadmin@gmail.com\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e二、将用户www生成的公钥添加到码云后台\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecat ~/.ssh/id_rsa.pub\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e三、将码云域名gitee.com 添加到授权白名单\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003essh-keyscan -t rsa gitee.com \u0026gt;\u0026gt; ~/.ssh/known_hosts\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e或者以www用户执行一次gitpull命令\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo - www\ncd /data/wwwroot/www\ngit pull\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e根据提示,输入 yes 即可。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e四、在码云的部署钩子里进行url设置\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eurl …\u003c/p\u003e"
October 17, 2017
php的Pdo扩展实现类似mysql_ping的方法
"\u003cp\u003e在php里Pdo是没有mysql_ping和mysqli_ping函数的,可以使用以下方法来代替它\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eclass NPDO {\n private $pdo;\n private $params;\n\n public function __construct() {\n $this-\u0026gt;params = func_get_args();\n $this-\u0026gt;init();\n }\n\n public function __call($name, array $args) {\n return call_user_func_array(array($this-\u0026gt;pdo, $name), $args);\n }\n\n // The ping() will try to reconnect once if connection lost.\n public function ping() {\n try {\n $this-\u0026gt;pdo-\u0026gt;query(\u0026#39;SELECT …\u003c/code\u003e\u003c/pre\u003e"
June 23, 2017
swoole模块及使用场景
"\u003cp\u003e一、多任务及多进程: 用来大量采集数据时使用,再利用多进程提高效率\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.csdn.net/koastal/article/details/52871316\"\u003ehttp://blog.csdn.net/koastal/article/details/52871316\u003c/a\u003e \u003ca href=\"http://www.tuicool.com/articles/ZFNFvqm\"\u003ehttp://www.tuicool.com/articles/ZFNFvqm\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e二、定时任务\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/LinkedDestiny/swoole-doc/blob/master/src/03/swoole_timer_server.php\"\u003ehttps://github.com/LinkedDestiny/swoole-doc/blob/master/src/03/swoole_timer_server.php\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eswoole新版本已经废除掉了 timer 指令,请使用 swoole_timer_tick 代替。参考:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://wiki.swoole.com/wiki/page/480.html\"\u003ehttps://wiki.swoole.com/wiki/page/480.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e或\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://wiki.swoole.com/wiki/page/414.html\"\u003ehttps://wiki.swoole.com/wiki/page/414.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e三、执行异步任务(耗时任务处理)\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://wiki.swoole.com/wiki/page/162.html\"\u003ehttps://wiki.swoole.com/wiki/page/162.html\u003c/a\u003e \u003ca href=\"https://wiki.swoole.com/wiki/page/481.html\"\u003ehttps://wiki.swoole.com/wiki/page/481.html …\u003c/a\u003e\u003c/p\u003e"
March 29, 2017
git无法pull仓库refusing to merge unrelated histories的解决办法
"\u003cp\u003e在本地有一个很久的项目,需要上传到远程git仓库中,先在远程创建了一个仓库,在本地配置好后,发现上传的时候,提示先git pull 一下,但git pull的时候提示这个错误,主要是因为目前两个git仓库信息不一致问题,我们要将两个项目合并在一起,需要添加一个 –allow-unrelated-histories 参数即可。\u003c/p\u003e\n\u003cp\u003e先进入cli命令行模式,执行\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003egit pull origin master --allow-unrelated-histories\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e然后再执行git pull origin master 即可。\u003c/p\u003e\n\u003cp\u003e参考: \u003ca href=\"http://stackoverflow.com/questions/37937984/git-refusing-to-merge-unrelated-histories\"\u003ehttp://stackoverflow.com/questions/37937984/git-refusing-to-merge-unrelated-histories\u003c/a\u003e\u003c/p\u003e"
November 25, 2016
Laravel中的异常处理
"\u003cp\u003eEloquent try/catch on duplicate key Exception and delete?\u003c/p\u003e\n\u003cp\u003eI’ve a form for a new vendor where the controller listens for its POST.\nFrom there on I’m creating a new endor and the equivalential login for this vendor.\u003c/p\u003e\n\u003cp\u003eController :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$vendor = Vendor::create( $request-\u0026gt;all() );\n$login = Vendor::createLogin($vendor-\u0026gt;vendor_id);\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ethe \u003cem\u003ecreateLogin\u003c/em\u003e function :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epublic static function createLogin($lid){\n $name = self::find($lid)-\u0026gt;vendor_name;\n $name = explode(\u0026#39; \u0026#39;, $name); …\u003c/code\u003e\u003c/pre\u003e"
November 18, 2016
Laravel框架数据库CURD操作、连贯操作使用方法
"\u003cp\u003eLaravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、Selects\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e检索表中的所有行\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$users = DB::table(\u0026#39;users\u0026#39;)-\u0026gt;get();\nforeach ($users as $user)\n{\nvar_dump($user-\u0026gt;name);\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e从表检索单个行\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$user = DB::table(\u0026#39;users\u0026#39;)-\u0026gt;where(\u0026#39;name\u0026#39;, \u0026#39;John\u0026#39;)-\u0026gt;first();\nvar_dump($user-\u0026gt;name);\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e检索单个列的行\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$name = DB::table(\u0026#39;users\u0026#39;)-\u0026gt;where(\u0026#39;name\u0026#39;, \u0026#39;John\u0026#39;)-\u0026gt;pluck(\u0026#39;name\u0026#39;);\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e检索一个列值列表\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$roles = …\u003c/code\u003e\u003c/pre\u003e"
November 13, 2016
PHP中的max_input_vars指令
"\u003cp\u003e今天接到客服部工作人员反馈的一个问题,客户使用产品系统是允许用户添加产品属性的,而每个属性是由多个表单域组成 ,这样当每添加一个属性就等于添加了n个表单域,这个客户添加的非常的多,发现在提交保存的时候总是失败,提示其中一个表单元素的索引值不存在,经测试是发现服务端接收的一些表单域丢失了一部分。起初分析的是服务器接收的数据超出了php设置的max_post_size(其实当时已经设置了8M,足够使用了),修改了测试发现此问题仍然存在。后来将用户原来的一些添加的表单元素进行删除,再重新添加同样数据库表单域可以成功,但一旦超出一定数量的表单域就会发生丢失的情况,这个时候首先怀疑的是apache是否有类似限制接收隐藏域的指令,找了没有找到,紧接着在php中批到一个max_input_vars这个指令,意思就是说php中允许接收的最大表单域数据,到目前为止基本上是确定这个原因引起的了,奖其修改为2000,重启Apache,发现一切正常。\u003c/p\u003e\n\u003cp\u003e总结:提起php中的max_input_vars 估计很少人知道这个这个指令,因为他的使用场景实在是太少了,在php.ini中这个指令的定义是指服务端最大可以接 …\u003c/p\u003e"
November 9, 2016
使用supervisord监控php脚本
"\u003cp\u003e官网: \u003ca href=\"http://www.supervisord.org\"\u003ehttp://www.supervisord.org\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e一、安装supervisord\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$brew install supervisord\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e在mac下安装要比linux下安装方便的多。\u003c/p\u003e\n\u003cp\u003e二、配置\u003c/p\u003e\n\u003cp\u003e修改/usr/local/etc/supervisord.ini文件,取消以下几行注释\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[inet_http_server] ; inet (TCP) server disabled by default\nport=127.0.0.1:9001 ; (ip_address:port specifier, *:port for all iface)\nusername=user ; (default is no username (open server))\npassword=123 ; (default is no password (open server))\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这样就可以通过浏览器对进行管理了。\u003c/p\u003e\n\u003cp\u003e三、添加一个新应用\u003c/p\u003e\n\u003cp\u003e创建一个a.php文件,内容如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ewhile(true){\necho \u0026#39;a\u0026#39; . time() . \u0026#34;\\r\\n\u0026#34;;\nsleep(1);\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e …\u003c/p\u003e"
November 1, 2016
按位与、或、异或等运算方法
"\u003cp\u003e\u003cstrong\u003e常见位运算\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e异或^:相同为0,不同为1。如:0^0=0; 0^1=1; 1^0=1; 1^1=0\n按位与\u0026amp;: 都为1则为1,否则为0。如:1\u0026amp;1=1; 1\u0026amp;0=0; 0\u0026amp;1=0; 0\u0026amp;0=0\n按位或|:有1则为1,否则为0。如:1|1=1; 1|0=1; 0|1=1; 0|0=0\n按位非(按位取反)~:取反操作。如:1-\u0026gt;0; 0-\u0026gt;1\u003c/p\u003e\n\u003cp\u003e——–\u003c/p\u003e\n\u003ch3\u003e\u003c/h3\u003e\n\u003ch3 id=\"按位与运算符参加运算的两个数据按二进制位进行与运算运算规则000-010-100-111即两位同时为1结果才为1否则为0例如35-即-0000-0011--0000-0101--0000-0001-因此35的值得1另负数按补码形式参加按位与运算与运算的特殊用途1清零如果想将一个单元清零即使其全部二进制位为0只要与一个各位都为零的数值相与结果为零2取一个数中指定位方法找一个数对应x要取的位该数的对应位为1其余位为零此数与x进行与运算可以得到x中的指定位例设x10101110-取x的低4位用-x--0000-1111--0000-1110即可得到-还可用来取x的246位\"\u003e**按位与运算符(\u0026amp;)**参加运算的两个数据,按二进制位进行“与”运算。运算规则:0\u0026amp;0=0; 0\u0026amp;1=0; 1\u0026amp;0=0; 1\u0026amp;1=1;即:两位同时为“1”,结果才为“1”,否则为0例如:3\u0026amp;5 即 0000 0011 \u0026amp; 0000 0101 = 0000 0001 因此,3\u0026amp;5的值得1。另,负数按补码形式参加按位与运算。“与运算”的特殊用途:(1)清零。如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。(2)取一个数中指定位方法:找一个数,对应X要取的位,该数的对应位为1,其余位 …\u003c/h3\u003e"
October 31, 2016
解决git clone时报错:The requested URL returned error: 401 Unauthorized while accessing的问题
"\u003cp\u003e版本问题,最直接的解决办法就是重新编辑安装git吧:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e下载:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ewget -O git.zip https://github.com/git/git/archive/master.zip\n\u003c/code\u003e\u003c/pre\u003e\u003col start=\"2\"\u003e\n\u003cli\u003e解压:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eunzip git.zip\n\u003c/code\u003e\u003c/pre\u003e\u003col start=\"3\"\u003e\n\u003cli\u003e进入git目录:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecd git-master\n\u003c/code\u003e\u003c/pre\u003e\u003col start=\"4\"\u003e\n\u003cli\u003e编译安装:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eautoconf\n./configure --prefix=/usr/local\nmake \u0026amp;\u0026amp; make install\n\u003c/code\u003e\u003c/pre\u003e\u003col start=\"5\"\u003e\n\u003cli\u003e最后别忘了删掉旧的git,并把新版本的git建立软链接到/usr/bin/git\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003erm /usr/bin/git\nln -s /usr/local/bin/git /usr/bin/git\n\u003c/code\u003e\u003c/pre\u003e"
October 25, 2016
git提示“Pull is not possible because you have unmerged files.”的解决办法(转)
"\u003cp\u003e在git pull的过程中,如果有冲突,那么除了冲突的文件之外,其它的文件都会做为staged区的文件保存起来。\u003c/p\u003e\n\u003cp\u003e重现:\u003c/p\u003e\n\u003cp\u003e$ git pull\u003c/p\u003e\n\u003cp\u003eA Applications/Commerce/BookingAnalysis.java\nA Applications/Commerce/ClickSummaryFormatter.java\nM Applications/CommerceForecasting/forecast/Forecast.java\nA Applications/CommerceForecasting/forecast/ForecastCurveProviderCategory.java\nM Applications/CommerceForecasting/forecast/ForecastProvider.java\nM Applications/CommerceForecasting/forecast/InputPropertyItem.java\n……\u003c/p\u003e\n\u003cp\u003eA …\u003c/p\u003e"
September 11, 2016
Visual Studio Code之常备快捷键
"\u003cp\u003e推荐:\u003ca href=\"http://www.cnblogs.com/summit7ca/p/5225494.html\"\u003eVisual Studio Code 添加设置代码段(snippet)\u003c/a\u003e{#cb_post_title_url.postTitle2}\u003c/p\u003e\n\u003cp\u003e官方快捷键大全: \u003ca href=\"https://code.visualstudio.com/docs/customization/keybindings\"\u003ehttps://code.visualstudio.com/docs/customization/keybindings\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eVisual Studio Code是个牛逼的编辑器,启动非常快,完全可以用来代替其他文本文件编辑工具。又可以用来做开发,支持各种语言,相比其他IDE,轻量级完全可配置还集成Git感觉非常的适合前端开发。 所以我仔细研究了一下文档未来可能会作为主力工具使用。\u003c/p\u003e\n\u003ch1 id=\"主命令框_Command_Palette\"\u003e主命令框\u003c/h1\u003e\n\u003cp\u003e最重要的功能就是\u003ccode\u003eF1\u003c/code\u003e或\u003ccode\u003eCtrl+Shift+P\u003c/code\u003e打开的命令面板了,在这个命令框里可以执行VSCode的任何一条命令,甚至关闭这个编辑器。\n按一下\u003ccode\u003eBackspace\u003c/code\u003e会进入到\u003ccode\u003eCtrl+P\u003c/code\u003e模式里\n在\u003ccode\u003eCtrl+P\u003c/code\u003e下输入\u003ccode\u003e\u0026gt;\u003c/code\u003e又可以回到\u003ccode\u003eCtrl+Shift+P\u003c/code\u003e模式。\n在\u003ccode\u003eCtrl+P\u003c/code\u003e窗口下还可以\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e直接输入文件名,跳转到文件\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e?\u003c/code\u003e 列出当前可执行的动作\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e!\u003c/code\u003e 显示Errors或Warnings,也可以`Ctrl+Shift+M\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e:\u003c/code\u003e 跳转到行数,也可以\u003ccode\u003eCtrl+G\u003c/code\u003e …\u003c/li\u003e\u003c/ul\u003e"
August 13, 2016
windows下备份mysql数据库dos脚本
"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e@echo off \u0026amp; setlocal ENABLEEXTENSIONS\n:: ---------- 配置项 ----------\n:: 备份放置的路径,加\nset BACKUP_PATH=D:\\Backup\n:: 要备份的数据库名称,多个用空格分隔\nset DATABASES=1688 abc ceshi\n:: MySQL 用户名\nset USERNAME=root\n:: MySQL 密码\nset PASSWORD=root\n:: MySQL Bin 目录,加\n:: 如果可以直接使用 dump(安装时添加 MySQL Bin 目录到了环境变量),此处留空即可\nset MYSQL=D:\\Progra~1\\phpStudy\\MySQL\\bin\\\n:: WinRAR 自带命令行工具的可执行文件路径,长文件名注意用 Dos 长文件名书写方式\nset WINRAR=D:\\Progra~1\\WinRAR\\Rar.exe\n:: ---------- 以下请勿修改 ----------\nset YEAR=%date:~0,4%\nset MONTH=%date:~5,2%\nset …\u003c/code\u003e\u003c/pre\u003e"
May 28, 2016
利用tcpdump抓取MySQL执行的SQL
"\u003cp\u003e\u003ca href=\"http://ourmysql.com/archives/1358\"\u003ehttp://ourmysql.com/archives/1358\u003c/a\u003e\n编写脚本文件dumpsql.sh,内容如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#!/bin/bash\n#this script used montor mysql network traffic.echo sql\ntcpdump -i eth0 -s 0 -l -w - dst port 3306 | strings | perl -e \u0026#39;\nwhile(\u0026lt;\u0026gt;) { chomp; next if /^[^ ]+[ ]*$/;\n if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER|CALL)/i)\n {\n if (defined $q) { print \u0026#34;$q\\n\u0026#34;; }\n $q=$_;\n } else {\n $_ =~ s/^[ \\t]+//; $q.=\u0026#34; $_\u0026#34;;\n }\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e运行并抓去sql的执行。\u003c/p\u003e\n\u003cp\u003e抓取后在当前目录出现out.log文件,执 …\u003c/p\u003e"
May 21, 2016
理解OAuth 2.0
"\u003ch2 id=\"客户端的授权模式\"\u003e客户端的授权模式\u003c/h2\u003e\n\u003cp\u003e客户端必须得到用户的授权(authorization grant),才能获得令牌(access token)。OAuth 2.0定义了四种授权方式。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e授权码模式(authorization code)最完整、流程最严密的授权模式,如GitHub、微信等网站第三方登录方式\u003c/li\u003e\n\u003cli\u003e简化模式(implicit)\u003c/li\u003e\n\u003cli\u003e密码模式(resource owner password credentials)如目前手机APP中使用此模式\u003c/li\u003e\n\u003cli\u003e客户端模式(client credentials)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href=\"http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html\"\u003ehttp://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html\u003c/a\u003e\u003c/p\u003e"
May 16, 2016
Git 工具 – submodule 子模块
"\u003cp\u003e\u003ca href=\"https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E5%AD%90%E6%A8%A1%E5%9D%97\"\u003ehttps://git-scm.com/book/zh/v2/Git 工具-子模块\u003c/a\u003e\u003c/p\u003e"
April 18, 2016
Mac上使用Brew 进行PHP多版本管理
"\u003cp\u003e\u003ca href=\"http://yansu.org/2014/09/26/use-old-version-of-brew-php.html\"\u003ehttp://yansu.org/2014/09/26/use-old-version-of-brew-php.html\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"section\"\u003e版本切换方式\u003c/h2\u003e\n\u003cp\u003e通过brew安装的php可以通过 \u003ccode\u003ebrew link\u003c/code\u003e 和 \u003ccode\u003ebrew unlink\u003c/code\u003e 来切换不同版本。\u003c/p\u003e\n\u003cp\u003e例如\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ebrew list\nbrew unlink php56\nbrew link php55\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e大版本可以用 \u003ccode\u003ebrew list\u003c/code\u003e 来查,如果是小版本的话只能去 \u003ccode\u003e/usr/local/Cellar/php55\u003c/code\u003e 看了。这个时候使用 \u003ccode\u003ephp-version\u003c/code\u003e 可以更方便一点。\u003c/p\u003e\n\u003cp\u003e我测试的此方法不行,只能使用php-verson 进行切换。\u003c/p\u003e\n\u003ch2 id=\"php-version\"\u003e安装 \u003ccode\u003ephp-version\u003c/code\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/wilmoore/php-version\"\u003ephp-version\u003c/a\u003e 是一个帮助管理从brew安装的php版本切换的工具。\u003c/p\u003e\n\u003cp\u003e安装非常简单\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ebrew install php-version\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e然后执行\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026lt;span class=\u0026#34;nb\u0026#34;\u0026gt;source\u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;k\u0026#34;\u0026gt;$(\u0026lt;/span\u0026gt;brew --prefix …\u003c/code\u003e\u003c/pre\u003e"
April 13, 2016
JWT介绍
"\u003cp\u003e\u003cstrong\u003eJWT是什么\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eJWT全称是JSON Web Tokens,是RFC 7519标准,用于安全校验两方可信性的安全措施。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eJWT解决了哪些问题?\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eJWT本身设计是用于解决Session机制不能够很好的在SPA/API类型(restful)应用中处理身份认证问题。通常API的调用是无状态(stateless)的,使用Session等形式会有上下文要求。如当用户登录完成后,可以通过下发JWT的形式进行无状态的API调用。在此之前通常是使用的方式包括不限于如Basic Auth、Oauth2或Token形式进行。\u003c/p\u003e\n\u003cp\u003eJWT相比是额外添加了签名校验方式,本质上来说对抗如暴力碰撞等形式有一些作用。但是由于本身长度的限制,存储的信息量有限。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eJWT处理方式\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eJWT内容主要分为三段,分别对应头部信息,存储数据和签名信息三部分,中间使用『.』符号连接,三段信息均进行Base64编码。\u003c/p\u003e\n\u003cp\u003e具体实现方式可参考如下伪代码实现:\u003c/p\u003e\n\u003cp\u003eencodeBase64(header) + ‘.’ + encodeBase64(payload) + ‘.’ + Sign(key + encodeBase64(header) + …\u003c/p\u003e"
April 3, 2016
[翻译]理解 GO 语言的内存使用
"\u003cp\u003e许多人在刚开始接触 Go 语言时,经常会有的疑惑就是“为什么一个 Hello world 会占用如此之多的内存?”。 \u003ca href=\"https://deferpanic.com/blog/understanding-golang-memory-usage/\" title=\"Understanding Go Lang Memory Usage\"\u003eUnderstanding Go Lang Memory Usage\u003c/a\u003e 很好的解释了这个问题。不过“简介”就是“简介”,更加深入的内容恐怕要读者自己去探索了。另外,文章写到最后,作者飘了,估计引起了一些公愤,于是又自己给自己补刀,左一刀,右一刀……\u003c/p\u003e\n\u003cp\u003e————翻译分隔线————\u003c/p\u003e\n\u003ch1 id=\"理解-go-语言的内存使用\"\u003e理解 Go 语言的内存使用\u003c/h1\u003e\n\u003cp\u003e\u003cem\u003e2014年12月22日,星期一\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e温馨提示\u003c/strong\u003e:这仅是关于 Go 语言内存的简介,俗话说不入虎穴、焉得虎子,读者可以进行更加深入的探索。\u003c/p\u003e\n\u003cp\u003e大多数 Go 开发者都会尝试像这样简单的 hello world 程序:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport (\n\u0026#34;fmt\u0026#34;\n\u0026#34;time\u0026#34;\n)\n\nfunc main() {\nfmt.Println(\u0026#34;hi\u0026#34;)\n\ntime.Sleep(30 * time.Second)\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e然后他们就完全崩溃了。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2016/04/high_mem-300x38.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2016/04/high_mem-300x38.png\" alt=\"high_mem-300x38\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e这个笔记本也只有 16 G 内存!\u003c/p\u003e\n\u003ch2 id=\"虚拟内存-vs-常驻内存\"\u003e虚拟内存 vs 常驻内存\u003c/h2\u003e\n\u003cp\u003eGo 管理内存的方式可能与你以 …\u003c/p\u003e"
March 25, 2016
Profiling Go Programs
"\u003cp\u003e转自: \u003ca href=\"http://blog.golang.org/profiling-go-programs\"\u003ehttp://blog.golang.org/profiling-go-programs\u003c/a\u003e (需翻墙)\u003c/p\u003e\n\u003ch1 id=\"the-go-blog\"\u003e\u003ca href=\"http://blog.golang.org/\"\u003eThe Go Blog\u003c/a\u003e\u003c/h1\u003e\n\u003ch3 class=\"title\" id=\"profiling-go-programs\"\u003e\u003ca href=\"http://blog.golang.org/profiling-go-programs\"\u003eProfiling Go Programs\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e24 June 2011\u003c/p\u003e\n\u003cp\u003eAt Scala Days 2011, Robert Hundt presented a paper titled \u003ca href=\"http://research.google.com/pubs/pub37122.html\"\u003eLoop Recognition in C++/Java/Go/Scala.\u003c/a\u003e The paper implemented a specific loop finding algorithm, such as you might use in a flow analysis pass of a compiler, in C++, Go, Java, Scala, and then used those programs to draw conclusions about typical performance concerns in these languages. The Go program presented in that paper runs quite …\u003c/p\u003e"
March 24, 2016
golang中并发实例
"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport (\n\t\u0026#34;fmt\u0026#34;\n\t//\u0026#34;runtime\u0026#34;\n\t\u0026#34;os\u0026#34;\n\t\u0026#34;runtime/pprof\u0026#34; // 引用pprof package\n\t\u0026#34;time\u0026#34;\n)\n\nfunc main() {\n\tf, _ := os.Create(\u0026#34;profile_file\u0026#34;)\n\tpprof.StartCPUProfile(f) // 开始cpu profile,结果写到文件f中\n\tdefer pprof.StopCPUProfile() // 结束profile\n\n\tstartTime := time.Now().Second()\n\t//runtime.GOMAXPROCS(runtime.NumCPU())\n\n\t// 注意这里的缓存大小\n\tch := make(chan int, 100)\n\tquit := make(chan bool)\n\n\t// 注意这里把读取chan操作放在了写入chan之前了(为了安全建议对chan的goroutines读取放在前面,写入放在后 …\u003c/code\u003e\u003c/pre\u003e"
March 24, 2016
在Golang中使用json
"\u003cblockquote\u003e\n\u003cp\u003e由于要开发一个小型的web应用,而web应用大部分都会使用json作为数据传输的格式,所以有了这篇文章。\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch4 id=\"包引用\"\u003e包引用\u003c/h4\u003e\n\u003cp\u003eimport (\n\u0026ldquo;encoding/json\u0026rdquo;\n\u0026ldquo;github.com/bitly/go-simplejson\u0026rdquo; // for json get\n)\u003c/p\u003e\n\u003ch4 id=\"用于存放数据的结构体\"\u003e用于存放数据的结构体\u003c/h4\u003e\n\u003cp\u003etype MyData struct {\nName string \u003ccode\u003ejson:\u0026quot;item\u0026quot;\u003c/code\u003e\nOther float32 \u003ccode\u003ejson:\u0026quot;amount\u0026quot;\u003c/code\u003e\n}\u003c/p\u003e\n\u003cp\u003e这里需要注意的就是后面单引号中的内容。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ejson:\u0026quot;item\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e这个的作用,就是Name字段在从结构体实例编码到JSON数据格式的时候,使用item作为名字。算是一种重命名的方式吧。\u003c/p\u003e\n\u003ch4 id=\"编码json\"\u003e编码JSON\u003c/h4\u003e\n\u003cp\u003evar detail MyData\u003c/p\u003e\n\u003cp\u003edetail.Name = \u0026ldquo;1\u0026rdquo;\ndetail.Other = \u0026ldquo;2\u0026rdquo;\u003c/p\u003e\n\u003cp\u003ebody, err := json.Marshal(detail)\nif err != nil …\u003c/p\u003e"
March 24, 2016
golang的json操作
"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport (\n \u0026#34;encoding/json\u0026#34;\n \u0026#34;fmt\u0026#34;\n \u0026#34;os\u0026#34;\n)\n\ntype ConfigStruct struct {\n Host string `json:\u0026#34;host\u0026#34;`\n Port int `json:\u0026#34;port\u0026#34;`\n AnalyticsFile string `json:\u0026#34;analytics_file\u0026#34;`\n StaticFileVersion int `json:\u0026#34;static_file_version\u0026#34;`\n StaticDir string `json:\u0026#34;static_dir\u0026#34;`\n TemplatesDir string `json:\u0026#34;templates_dir\u0026#34;`\n SerTcpSocketHost …\u003c/code\u003e\u003c/pre\u003e"
March 23, 2016
golang中的md5的用法
"\u003cp\u003e代码\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport (\n\t\u0026#34;crypto/md5\u0026#34;\n\t\u0026#34;encoding/hex\u0026#34;\n\t\u0026#34;fmt\u0026#34;\n)\n\nfunc main() {\n\t// md5 加密的第一种方法\n\tsrcData := []byte(\u0026#34;iyannik0215\u0026#34;)\n\tcipherText1 := md5.Sum(srcData)\n\tfmt.Printf(\u0026#34;md5 encrypto is \u0026#34;iyannik0215\u0026#34;: %x n\u0026#34;, cipherText1)\n\n\t// md5 加密的第二种方法\n\thash := md5.New()\n\thash.Write(srcData)\n\tcipherText2 := hash.Sum(nil)\n\thexText := make([]byte, 32)\n\thex.Encode(hexText, cipherText2)\n\tfmt.Println(\u0026#34;md5 encrypto is \u0026#34;iyannik0215\u0026#34;:\u0026#34;, …\u003c/code\u003e\u003c/pre\u003e"
March 21, 2016
如何优雅的在 koa 中处理错误
"\u003cp\u003e\u003ca href=\"http://taobaofed.org/blog/2016/03/18/error-handling-in-koa/\"\u003ehttp://taobaofed.org/blog/2016/03/18/error-handling-in-koa/\u003c/a\u003e\u003c/p\u003e"
March 21, 2016
koa中生成器函数generator执行顺序详解
"\u003cp\u003e\u003cstrong\u003eES6的generator\u003c/strong\u003e \u003ca href=\"http://book.apebook.org/minghe/koa-action/co/start.html\"\u003ehttp://book.apebook.org/minghe/koa-action/co/start.html\u003c/a\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\nfunction* gen() {\n var a = yield \u0026#39;start\u0026#39;;\n console.log(a);\n var b = yield \u0026#39;end\u0026#39;;\n console.log(b);\n return \u0026#39;over\u0026#39;;\n}\nvar it = gen();\nconsole.log(it.next()); // {value: \u0026#39;start\u0026#39;, done: false}\nconsole.log(it.next(22)); // 22 {value: \u0026#39;end\u0026#39;, done: false}\nconsole.log(it.next(333)); // 333 {value: \u0026#39;over\u0026#39;, done: true}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e带有 \u003ccode\u003e*\u003c/code\u003e 的函数声明表示是一个 generator 函数,当执行 \u003ccode\u003egen()\u003c/code\u003e 时,函数体内的代码并没有执行, …\u003c/p\u003e"
March 12, 2016
node出现“dyld: bad external relocation length”的解决办法
"\u003cp\u003emac下有时候在执行 npm的过程中,我们强制中止了操作或者一些命令出现问题会提示“dyld: bad external relocation length”这个错误,这个时候只要将未下载完的文件删除即可,我这里使用 n 4.4.3下载的时候,网络出现异常,提示这个错误,只要删除 /usr/local/n/versions/node/4.4.3 这个目录即可。\u003c/p\u003e\n\u003cp\u003e如果还是不行的话,可以试着执行一下\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ebrew doctor\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e命令,根据提示操作就可以了。\u003c/p\u003e\n\u003cp\u003e我遇到的情况是使用node版本控制n安装新版本号的时候,好像安装包下载的不完整,但提示安装成功了,在最后提示这个错误。试了好多方法卸载重装也不行,最后根据 brew doctor 的提示,执行了\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ebrew link --overwrite node\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e彻底解决了。\u003c/p\u003e"
March 12, 2016
nodejs中package.json文件说明
"\u003cp\u003e推荐: \u003ca href=\"http://jingpin.jikexueyuan.com/article/34254.html\"\u003ehttp://jingpin.jikexueyuan.com/article/34254.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003epackage.json 中包含各种所需模块以及项目的配置信息(名称、版本、许可证等)meta 信息。\u003c/p\u003e\n\u003cp\u003epackage.json文件可以通过npm init 来创建\u003c/p\u003e\n\u003ch4 id=\"包含可配置项\"\u003e包含可配置项\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003ename 名称\u003c/li\u003e\n\u003cli\u003e应用描述 description\u003c/li\u003e\n\u003cli\u003e版本号 version\u003c/li\u003e\n\u003cli\u003e应用的配置项 config\u003c/li\u003e\n\u003cli\u003e作者 author\u003c/li\u003e\n\u003cli\u003e资源仓库地址 respository\u003c/li\u003e\n\u003cli\u003e授权方式 licenses\u003c/li\u003e\n\u003cli\u003e目录 directories\u003c/li\u003e\n\u003cli\u003e应用入口文件 main\u003c/li\u003e\n\u003cli\u003e命令行文件 bin\u003c/li\u003e\n\u003cli\u003e项目应用运行依赖模块 dependencies\u003c/li\u003e\n\u003cli\u003e项目应用开发环境依赖 devDependencies\u003c/li\u003e\n\u003cli\u003e运行引擎 engines\u003c/li\u003e\n\u003cli\u003e脚本 script\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e简单模式\u003c/p\u003e\n\u003cp\u003e==========================\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e{\n\n name: \u0026#34;myApp\u0026#34;,\n\n version :\u0026#34;0.0.1\u0026#34;\n\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e完整模式\u003c/p\u003e\n\u003cp\u003e===========================\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e{\n\n \u0026#34;name\u0026#34;: …\u003c/code\u003e\u003c/pre\u003e"
March 12, 2016
PHP底层工作原理
"\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2016/03/51de416caaddc.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2016/03/51de416caaddc.png\" alt=\"51de416caaddc\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e从图上可以看出,php从下到上是一个4层体系\u003c/p\u003e\n\u003cp\u003e①Zend引擎\u003c/p\u003e\n\u003cp\u003eZend整体用纯c实现,是php的内核部分,它将php代码翻译(词法、语法解析等一系列编译过程)为可执行opcode的处理并实现相应的处理方法、 实现了基本的数据结构(如hashtable、oo)、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕zend 实现。\u003c/p\u003e\n\u003cp\u003e②Extensions\u003c/p\u003e\n\u003cp\u003e围绕着zend引擎,extensions通过组件式的方式提供各种基础服务,我们常见的各种内置函数(如array系列)、标准库等都是通过 extension来实现,用户也可以根据需要实现自己的extension以达到功能扩展、性能优化等目的(如贴吧正在使用的php中间层、富文本解析 就是extension的典型应用)。\u003c/p\u003e\n\u003cp\u003e③Sapi\u003c/p\u003e\n\u003cp\u003eSapi全称是Server Application Programming Interface,也就是服务端应用编程接口,sapi通过一系列钩子函数,使得php可以和外围交互数据,这是php非常优雅和成功的一个设计,通过 sapi成功的将php本身和上层应用解耦隔离,php可以不 …\u003c/p\u003e"
March 10, 2016
NPM 命令介绍(转)
"\u003cp\u003eNPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e允许用户从NPM服务器下载别人编写的第三方包到本地使用。\u003c/li\u003e\n\u003cli\u003e允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。\u003c/li\u003e\n\u003cli\u003e允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e由于新版的nodejs已经集成了npm,所以之前npm也一并安装好了。同样可以通过输入 **“npm -v” **来测试是否成功安装。命令如下,出现版本提示表示安装成功:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ npm -v\n2.3.\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e如果你安装的是旧版本的 npm,可以很容易得通过 npm 命令来升级,命令如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ sudo npm install npm -g\n/usr/local/bin/npm -\u0026gt; /usr/local/lib/node_modules/npm/bin/npm-cli.js\nnpm@2.14.2 /usr/local/lib/node_modules/npm\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e如果是 Window 系统使用以下命令即可:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003enpm install npm -g\n\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"使用-npm-命令安装模块\"\u003e使用 npm 命令安装模块\u003c/h2\u003e\n\u003cp\u003enpm …\u003c/p\u003e"
March 10, 2016
nodejs学习资料
"\u003cp\u003e修改npm包管理器的registry( \u003ca href=\"http://registry.npmjs.org/\"\u003eregistry.npmjs.org\u003c/a\u003e)为淘宝镜像( \u003ca href=\"http://npm.taobao.org\"\u003enpm.taobao.org\u003c/a\u003e),参考nam config -h 相关命令\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003enpm config set registry “https://registry.npm.taobao.org“\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ca href=\"http://npm.taobao.org\"\u003ehttp://npm.taobao.org\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e七天学会NodeJS \u003ca href=\"http://nqdeng.github.io/7-days-nodejs/\"\u003ehttp://nqdeng.github.io/7-days-nodejs/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eNode.js Style Guide \u003ca href=\"https://github.com/dead-horse/node-style-guide\"\u003ehttps://github.com/dead-horse/node-style-guide\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e深入Node.js的模块机制 \u003ca href=\"http://www.infoq.com/cn/articles/nodejs-module-mechanism/\"\u003ehttp://www.infoq.com/cn/articles/nodejs-module-mechanism/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e学习ES6生成器(Generator) \u003ca href=\"http://www.toobug.net/article/learning_es6_generator.html\"\u003ehttp://www.toobug.net/article/learning_es6_generator.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003erequire() 源码解读 \u003ca href=\"http://www.ruanyifeng.com/blog/2015/05/require.html\"\u003ehttp://www.ruanyifeng.com/blog/2015/05/require.html …\u003c/a\u003e\u003c/p\u003e"
March 10, 2016
nodejs中exports与module.exports的区别
"\u003cp\u003e对于两者的理解只要记住一句话:“\u003cstrong\u003eexports就是module.exports****的引用\u003c/strong\u003e”即可。\u003c/p\u003e\n\u003cp\u003e推荐易理解的文档: \u003ca href=\"http://cnodejs.org/topic/5231a630101e574521e45ef8\"\u003ehttp://cnodejs.org/topic/5231a630101e574521e45ef8\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e原文:\u003c/p\u003e\n\u003cp\u003e你肯定非常熟悉nodejs模块中的\u003cstrong\u003eexports\u003c/strong\u003e对象,你可以用它创建你的模块。例如:(假设这是rocker.js文件)\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eexports.name = function() {\n console.log(\u0026#39;My name is Lemmy Kilmister\u0026#39;);\n};\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e在另一个文件中你这样引用\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003evar rocker = require(\u0026#39;./rocker.js\u0026#39;);\nrocker.name(); // \u0026#39;My name is Lemmy Kilmister\u0026#39;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e那到底\u003cstrong\u003eModule.exports\u003c/strong\u003e是什么呢?它是否合法呢?\u003c/p\u003e\n\u003cp\u003e其实,\u003cstrong\u003e\u003ccode\u003eModule.exports\u003c/code\u003e\u003cstrong\u003e才是真正的接口,\u003cstrong\u003eexports\u003c/strong\u003e只不过是它的一个辅助工具。 最终返回给调用的是\u003c/strong\u003e\u003ccode\u003eModule.exports\u003c/code\u003e\u003cstrong\u003e而不是\u003c/strong\u003eexports。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e所有的\u003cstrong\u003eexports\u003c/strong\u003e收集到的属 …\u003c/p\u003e"
March 7, 2016
Node.js框架比较: Express vs. Koa vs. Hapi
"\u003cp\u003e\u003ca href=\"http://www.nodejs.net/a/20141223/191626.html\"\u003ehttp://www.nodejs.net/a/20141223/191626.html\u003c/a\u003e \u003ca href=\"http://www.zhihu.com/question/25388201\"\u003ehttp://www.zhihu.com/question/25388201\u003c/a\u003e \u003ca href=\"https://cnodejs.org/topic/56936889c2289f51658f0926\"\u003ehttps://cnodejs.org/topic/56936889c2289f51658f0926\u003c/a\u003e\u003c/p\u003e"
February 23, 2016
Git-svn命令对比表,svn用户必看
"\u003cp\u003e提供给从svn转git的开发人员参考\u003c/p\u003e\n\u003cp\u003eGit与Subversion的命令对比表\u003c/p\u003e\n\u003ctable\u003e\n \u003cthead\u003e\n \u003ctr\u003e\n \u003cth style=\"text-align: left\"\u003e\u003cstrong\u003e操作\u003c/strong\u003e\u003c/th\u003e\n \u003cth style=\"text-align: left\"\u003e\u003cstrong\u003eGIT\u003c/strong\u003e\u003c/th\u003e\n \u003cth style=\"text-align: left\"\u003e\u003cstrong\u003eSUBVERSION\u003c/strong\u003e\u003c/th\u003e\n \u003c/tr\u003e\n \u003c/thead\u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"text-align: left\"\u003e复制数据仓库\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003egit clone\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003esvn checkout\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd style=\"text-align: left\"\u003e提交\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003egit commit\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003esvn commit\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd style=\"text-align: left\"\u003e查看提交的详细记录\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003egit show\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003esvn cat\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd style=\"text-align: left\"\u003e确认状态\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003egit status\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003esvn status\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd style=\"text-align: left\"\u003e确认差异\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003egit diff\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003esvn diff\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd style=\"text-align: left\"\u003e确认记录\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003egit …\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e"
February 15, 2016
深入解析php中的foreach问题
"\u003cp\u003e篇文章是对php中的foreach问题进行了详细的分析介绍,需要的朋友参考下\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e前言:\u003c/strong\u003e php4中引入了foreach结构,这是一种遍历数组的简单方式。相比传统的for循环,foreach能够更加便捷的获取键值对。在php5之前,foreach仅能用于数组;php5之后,利用foreach还能遍历对象(详见:遍历对象)。本文中仅讨论遍历数组的情况。foreach虽然简单,不过它可能会出现一些意外的行为,特别是代码涉及引用的情况下。\u003c/p\u003e\n\u003cp\u003e下面列举了几种case,有助于我们进一步认清foreach的本质。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e问题1:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$arr = array(1,2,3);\nforeach($arr as $k =\u0026gt; \u0026amp;$v) {\n$v = $v * 2;\n}\n// now $arr is array(2, 4, 6)\nforeach($arr as $k =\u0026gt; $v) {\necho \u0026#34;$k\u0026#34;, \u0026#34; =\u0026gt; \u0026#34;, \u0026#34;$v\u0026#34;;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e先从简单的开始,如果我们尝试运行上述代码,就会发现最后输出为0=\u0026gt;2 1=\u0026gt;4 2=\u0026gt;4 。 …\u003c/p\u003e"
December 22, 2015
使用 Git Hook 实现网站的自动部署
"\u003cp\u003e自动化能解放人类的双手,而且更重要的是,因为按照规定的流程来走,也减少了很多误操作的产生。不知道大家平时都是怎么样更新自己生产环境的代码的,FTP 覆盖旧文件、服务器定时任务去 build 最新的源码,还是有更高级的做法?\u003c/p\u003e\n\u003cp\u003e目前我在使用 Git Hook 来部署自己的项目。Git Hook 是 Git 提供的一个钩子,能被特定的事件触发后调用。其实,更通俗的讲,当你设置了 Git Hook 后,只要你的远程仓库收到一次 push 之后,Git Hook 就能帮你执行一次 bash 脚本。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eGit的挂钩(Hook)主要包含:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eapplypatch-msg\u003c/li\u003e\n\u003cli\u003epost-update\u003c/li\u003e\n\u003cli\u003epre-rebase\u003c/li\u003e\n\u003cli\u003ecommit-msg\u003c/li\u003e\n\u003cli\u003epre-applypatch\u003c/li\u003e\n\u003cli\u003eupdate\u003c/li\u003e\n\u003cli\u003epost-commit\u003c/li\u003e\n\u003cli\u003epre-commit\u003c/li\u003e\n\u003cli\u003epost-receive\u003c/li\u003e\n\u003cli\u003eprepare-commit-msg\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e这里我们只需要使用 post-receive 这个 Hook:在接收 post(push)请求之后执行。\u003c/p\u003e\n\u003cp\u003e下面是我使用 Git Hook 进行简单的自动化部署,可能还有更高级的做法,大家自己去挖掘。\u003c/p\u003e\n\u003cp\u003e服务器上需要配 …\u003c/p\u003e"
December 22, 2015
Git中的hooks钩子
"\u003cp\u003eGit可以定制一些钩子,这些钩子可以在特定的情况下被执行,分为Client端的钩子和Server端的钩子。\nClient 端钩子被operation触发,比如commit,merge等Server 端钩子被网络动作触发,比如pushed commits。\u003c/p\u003e\n\u003cp\u003e那么钩子是放在哪的呢?\u003c/p\u003e\n\u003cp\u003e在.git/hooks/文件夹下。当你init一个仓库的时候,下边会有一些钩子的例子,以.sample结尾。\u003c/p\u003e\n\u003cp\u003e那么钩子什么时候被执行,Git预定义了触发时机:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eClientSide hooks:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1 pre-commit,当执行commit动作时先执行此hook,可以用此hook做一些检查,比如代码风格检查,或者先跑测试。\u003c/p\u003e\n\u003cp\u003e2 prepare-commit-msg, 当commit时需要输入message前会触发此hook,可以用此hook来定制自己的default message信息。\u003c/p\u003e\n\u003cp\u003e3 commit-msg,当用户输入commit的message后被触发,可以用此hook校验message的信息,比如是否符合规定,有没有cr等。\u003c/p\u003e\n\u003cp\u003e4 post-commit, 当commit完成后被触发,可以用此hook发 …\u003c/p\u003e"
December 13, 2015
brew tap介绍
"\u003cp\u003e官方介绍: \u003ca href=\"https://github.com/Homebrew/homebrew/wiki/brew-tap\"\u003ehttps://github.com/Homebrew/homebrew/wiki/brew-tap\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003ebrew 有个默认的仓库,brew tap 你可以看成是第三方的仓库。\n这个相信很多人都已经用到过了,安装他人扩展的 brew 服务。由于 brew 和包含的包源都是通过 github 来管理,人为的维护管理,除了自己的源还允许别人的源添加进来。类似与 Ubuntu 的 ppa。好处在于只有我安装规定的方式把包丢到 github 上面就可以用了!\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ brew tap \u0026lt;gihhub_user/repo\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这个命令并没有包含任何的帮助说明,其实它只接受上面的这个参数。\u003c/p\u003e\n\u003cp\u003e举例说明一下,Mac OS 比较歧视 PHP ,所以每次系统更新都会把常用的开发包(Ruby、Python 等)也顺带着更新到最新版本。(吐槽:Java 都已经被抛弃不再默认安装了),而 brew 居然也不包含 PHP 的包,那怎么办呢?\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ brew tap josegonzalez/php\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e命令完成之后,执行(当前最新是 php 5.5 版本,请根据需要替换)\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ brew install …\u003c/code\u003e\u003c/pre\u003e"
December 9, 2015
mac下安装PHP提示configure: error: Cannot find OpenSSL’s 的解决办法
"\u003cp\u003e在mac 10.11.2 下安装PHP7的时候,在./configure的时候,提示\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003echecking for strftime… (cached) yes\nchecking whether to enable LIBXML support… yes\nchecking libxml2 install dir… /usr\nchecking for xml2-config path… /usr/bin/xml2-config\nchecking whether libxml build works… yes\nchecking for OpenSSL support… yes\nchecking for Kerberos support… no\nchecking whether to use system default cipher list instead of hardcoded value… no\nchecking for RAND_egd… no\nchecking for pkg-config… no\nconfigure: error: Cannot find OpenSSL’s\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e错 …\u003c/p\u003e"
December 9, 2015
常用 Git 命令清单(推荐)
"\u003cp\u003e作者: \u003ca href=\"http://www.ruanyifeng.com\"\u003e阮一峰\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e日期: \u003ca href=\"http://www.ruanyifeng.com/blog/2015/12/\"\u003e2015年12月 9日\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e我每天使用 Git ,但是很多命令记不住。\u003c/p\u003e\n\u003cp\u003e一般来说,日常使用只要记住下图6个命令,就可以了。但是熟练使用,恐怕要记住60~100个命令。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://www.ruanyifeng.com/blogimg/asset/2015/bg2015120901.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWorkspace:工作区\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIndex / Stage:暂存区\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRepository:仓库区(或本地仓库)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRemote:远程仓库\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"一新建代码库\"\u003e一、新建代码库\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# 在当前目录新建一个Git代码库\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ git init\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# 新建一个目录,将其初始化为Git代码库\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ git init \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eproject-name\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# 下载一个项目和它的整个代码历史\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ git clone \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eurl\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"二配置\"\u003e二、配置\u003c/h2\u003e\n\u003cp\u003eGit的设置文件为\u003ccode\u003e.gitconfig\u003c/code\u003e,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# 显示当前的Git配置\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ git config --list\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# 编辑Git配置文件\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ git config -e \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003e--global\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# 设置提交代码时的用户信息\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ git config \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003e--global …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/blockquote\u003e"
December 5, 2015
win7下wamp安装PHP7,提示错误模块名称: php7ts.dll的解决办法
"\u003cp\u003e2015年12月3号,PHP7正式发布,目前一直在用PHP5.5版本的,PHP7的性能提高非常大,于是想在本机做一些测试,顺便为后期程序升级PHP7版本做准备。\u003c/p\u003e\n\u003cp\u003e目前开发环境为WIN7 64位。当前软件情况为64位 \u003ca href=\"http://www.wampserver.com/#wampserver-64-bits-php-5-5\"\u003eWampServer2.5\u003c/a\u003e(php5.5.12/apache2.4.9/mysql5.6.17),目前WAMP已经是多PHP版本同时存在,可以很方便的切换到各个PHP版本。\u003c/p\u003e\n\u003cp\u003e按照以前的方法( \u003ca href=\"http://blog.haohtml.com/archives/16180\"\u003ehttp://blog.haohtml.com/archives/16180\u003c/a\u003e),直接从官方下载 \u003ca href=\"http://windows.php.net/download#php-7.0\"\u003ePHP7.0.0\u003c/a\u003e,解压放在 D:/wamp/bin/php/ 这个目录里,并设置phpForApache.ini文件(复制PHP.ini),停止WAMP所有服务并退出,然后再重启WAMP。此时在WAMP的PHP的版本选择里应该会出现PHP7.0.0这个版本选择,我们选择此版本,wamp重启。到此所有步骤已经完成。\u003c/p\u003e\n\u003cp\u003e由于我们需要用到一些PHP的扩展,如GD2,MYSQL,发现启用扩展后,WAMP重启失败,通过WIN7的系统日志发现以下信息:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e错误应用程序名称: httpd.exe,版本: …\u003c/p\u003e\u003c/blockquote\u003e"
December 4, 2015
wamp下配置支持多版本php
"\u003cp\u003e\u003cstrong\u003e\u003ca href=\"http://www.wampserver.com/en\"\u003eWAMPServer\u003c/a\u003e\u003c/strong\u003e 可以让开发者在Windows系统下快速搭建WAMP环境,它支持多版本的Apache、MySQL、PHP之间的相互切换,互不影响,对于PHPer开发者来讲极为方便快速。\u003c/p\u003e\n\u003cp\u003e以下是在WAMPServer下同时支持PHP5.3、PHP5.4、PHP5.5、PHP5.6的步骤:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1、安装WAMPServer\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e根据自己的操作系统选择相应的WAMP版本,我这里选择WAMPSERVER-32 BITS \u0026amp; PHP 5.5-2.5,双击安装,选择安装目录即可,超级简单。\u003c/p\u003e\n\u003cp\u003e根据我安装的版本,这里已经默认安装了PHP5.5.12,如下图,可以发现多了两个特别文件: \u003cstrong\u003ephpForApache.ini\u003c/strong\u003e、 \u003cstrong\u003ewampserver.conf\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2015/12/wamp_1.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2015/12/wamp_1.png\" alt=\"wamp_1\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2、下载PHP二进制包\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ePHP目前提供PHP5.3、PHP5.4、PHP5.5、PHP5.6版本,因为我安装的是WAMPSERVER-32 BITS,所以对应的PHP版本只能是32位,到 \u003cstrong\u003e\u003ca href=\"http://windows.php.net/download/\"\u003eWindows PHP\u003c/a\u003e\u003c/strong\u003e 下载TS版本( \u003cstrong\u003eThread-Safe-VC9-X86\u003c/strong\u003e)对应的PHP二进制 \u003cstrong\u003eZIP\u003c/strong\u003e 包,并解压缩二进制包到WAMP安装目录, …\u003c/p\u003e"
December 2, 2015
React开发中的常见问题
"\u003cp\u003e当你在写react的时候报了类似于这样子的错:\u003cstrong\u003eEach child in an array or iterator should have a unique “key” prop.Check the render method of \u003ccode\u003exxxx\u003c/code\u003e. See \u003ca href=\"https://fb.me/react-warning-keys\"\u003ehttps://fb.me/react-warning-keys\u003c/a\u003e for more information.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e原因是这样子的:\u003cstrong\u003eReact can’t know that your array is static, so you get the warning. The most practical thing to do here is to write something like.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e解决办法只要在循环的每个子项添加一个key就行了,代码如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003evar names = [\u0026#39;Alice\u0026#39;, \u0026#39;Emily\u0026#39;, \u0026#39;Kate\u0026#39;];\n\nReactDOM.render(\n \u0026lt;div\u0026gt;\n {\n names.map(function (name, …\u003c/code\u003e\u003c/pre\u003e"
November 30, 2015
webpack使用教程
"\u003cp\u003e官方中文:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.css88.com/doc/webpack/concepts\"\u003ehttp://www.css88.com/doc/webpack/concepts/\u003c/a\u003e \u003ca href=\"https://webpack.js.org/guides/getting-started/\"\u003ehttps://www.webpackjs.com/guides/getting-started\u003c/a\u003e\n中文: \u003ca href=\"https://doc.webpack-china.org/guides/getting-started\"\u003ehttps://doc.webpack-china.org/guides/getting-started\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e经典入门(推荐): \u003ca href=\"https://github.com/ruanyf/webpack-demos\"\u003ehttps://github.com/ruanyf/webpack-demos\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e官方入门教程: \u003ca href=\"https://webpack.js.org/guides/getting-started/\"\u003ehttps://webpack.js.org/guides/getting-started/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eReact+Babal+WebPack: \u003ca href=\"https://github.com/ruanyf/react-babel-webpack-boilerplate\"\u003ehttps://github.com/ruanyf/react-babel-webpack-boilerplate\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eGitbook 英文原版: \u003ca href=\"http://christianalfoni.github.io/react-webpack-cookbook/\"\u003ehttp://christianalfoni.github.io/react-webpack-cookbook/\u003c/a\u003e\n中文版: \u003ca href=\"https://fakefish.github.io/react-webpack-cookbook/\"\u003ehttps://fakefish.github.io/react-webpack-cookbook/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e如何使用webpack …\u003c/strong\u003e\u003c/p\u003e"
November 5, 2015
基于SourceTree 下的 Git Flow 模型
"\u003cp\u003egitflow 开发流程参考: \u003ca href=\"http://blog.haohtml.com/archives/15317\"\u003ehttp://blog.haohtml.com/archives/15317\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/git_flow.png\" alt=\"git_flow\"\u003e][1]\n\u003cstrong\u003e基于SourceTree 下的 Git Flow 模型\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003esourceTree 是一个开源的git 图形管理工具,可下载mac版本,windows版本\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGit Flow 是一套使用Git进行源代码管理时的一套行为规范和简化部分Git操作的工具。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003e基本的操作流程\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e先用sourceTree 创建本地git 项目,xxxProject,\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e在项目里面先提交一次 commit 一下,默认提交在了 master分支;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e然后在 sourceTree工具 右上角,点击 GitFlow,开启git Flow 规范模型的开发\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e[\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/git-flow_1.png\" alt=\"git-flow_1\"\u003e][2]\u003c/p\u003e\n\u003cp\u003e如上图,在开启gitFlow 之后;\u003c/p\u003e\n\u003cp\u003e生产环境分支使用:master\u003c/p\u003e\n\u003cp\u003e开发分支使用:develop\u003c/p\u003e\n\u003cp\u003e当需要新增加功能,发布版本时,创建补丁修复bug时,分别有对应的 feature,release,hotfix前缀这样的分支\u003c/p\u003e\n\u003cp\u003e这样在项目的开发过程之中,管理项目分支就变得非常的规范了;\u003c/p\u003e\n\u003cp\u003e4:开启之后,我们的项目就回到 …\u003c/p\u003e"
November 4, 2015
Git忽略文件权限
"\u003cp\u003e默认git会记录文件的权限信息,如果文件的权限信息被修改,那么git也作为一个差异保存。但是我们有时候是不需要这方面的差异的(例如在Windows下使用Cygwin),这时需要关闭文件权限的检查。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/20230904181521.png\" alt=\"img\"\u003e\u003c/p\u003e\n\u003cp\u003egit中可以加入忽略文件权限的配置,具体如下:\u003c/p\u003e\n\u003cp\u003e$ git config core.filemode false\n$ git config \u0026ndash;list\u003c/p\u003e\n\u003cp\u003e也可以使用以下命令查看是否生效。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecat .git/config\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/20230904181513.png\" alt=\"img\"\u003e\u003c/p\u003e\n\u003cp\u003e还有一个小问题,在设置这个属性之前权限就混乱的话,是无法自动修复的。这时候,如果仅仅是权限混乱的话,直接\u003ccode\u003egit reset --hard\u003c/code\u003e恢复吧,git会将项目完全恢复到最近一次提交,包括权限。 \u003c/p\u003e"
November 1, 2015
git diff命令详解
"\u003cp\u003ediff里面a表示前面那个变量,b表示第二个变量\u003c/p\u003e\n\u003cp\u003eHEAD commit版本\nIndex staged版本\u003c/p\u003e\n\u003cp\u003ea、查看尚未暂存的文件更新了哪些部分,不加参数直接输入\ngit diff\n此命令比较的是工作目录(Working tree)和暂存区域快照(index)之间的差异\n也就是修改之后还没有暂存起来的变化内容。\u003c/p\u003e\n\u003cp\u003eb、查看已经暂存起来的文件(staged)和上次提交时的快照之间(HEAD)的差异\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003egit diff –cached\ngit diff –staged\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e显示的是下一次commit时会提交到HEAD的内容(不带-a情况下)\u003c/p\u003e\n\u003cp\u003ec、显示工作版本(Working tree)和HEAD的差别\ngit diff HEAD\u003c/p\u003e\n\u003cp\u003ed、直接将两个分支上最新的提交做diff\ngit diff topic master 或 git diff topic..master\u003c/p\u003e\n\u003cp\u003ee、输出自topic和master分别开发以来,master分支上的changed。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003egit diff topic…master\nChanges that occurred on the master branch …\u003c/code\u003e\u003c/pre\u003e"
October 26, 2015
使用brew cask来安装Mac应用
"\u003ch2 id=\"简介\"\u003e简介\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/phinze/homebrew-cask\"\u003e\u003ccode\u003ebrew cask\u003c/code\u003e\u003c/a\u003e 是一个用命令行管理 Mac 下应用的工具,它是基于 \u003ca href=\"http://brew.sh/\"\u003e\u003ccode\u003ehomebrew\u003c/code\u003e\u003c/a\u003e 的一个增强工具。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ehomebrew\u003c/code\u003e 可以管理 Mac 下的命令行工具,例如 \u003ccode\u003eimagemagick\u003c/code\u003e, \u003ccode\u003enodejs\u003c/code\u003e,如下所示:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ebrew cask install qq\nbrew cask install google-chrome\nbrew cask install evernote\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e而使用上 \u003ccode\u003ebrew cask\u003c/code\u003e 之后,你还可以用它来管理 Mac 下的 Gui 程序,例如 \u003ccode\u003eqq\u003c/code\u003e, \u003ccode\u003echrome\u003c/code\u003e, \u003ccode\u003eevernote\u003c/code\u003e 等,如下所示:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ebrew cask install qq\nbrew cask install google-chrome\nbrew cask install evernote\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"安装\"\u003e安装\u003c/h2\u003e\n\u003ch3 id=\"安装-homebrew\"\u003e安装 homebrew\u003c/h3\u003e\n\u003cp\u003e用以下一行命令即可安装 homebrew\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eruby -e \u0026#34;$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e之后执行 \u003ccode\u003ebrew doctor\u003c/code\u003e 命令可以看看 \u003ccode\u003ehomebrew\u003c/code\u003e 的 …\u003c/p\u003e"
October 19, 2015
写好 Git Commit 信息的 7 个建议
"\u003cp\u003e这里推荐: \u003ca href=\"http://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html\"\u003ehttp://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html\u003c/a\u003e\n\u003cstrong\u003e介绍: 为什么好的提交信息如此重要\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e当你随意浏览任一 git 仓库的日志,你很可能会发现其中的提交信息或多或少有点乱。举个例子,瞧一瞧我早先提交到 Spring 上的这些宝贝:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e$ git log –oneline -5 –author cbeams –before “Fri Mar 26 2009”\u003c/p\u003e\n\u003cp\u003ee5f4b49 Re-adding ConfigurationPostProcessorTests after its brief removal in r814. @Ignore-ing the testCglibClassesAreLoadedJustInTimeForEnhancement() method as it turns out this was one of the culprits in the recent build breakage. The classloader hacking causes subtle …\u003c/p\u003e\u003c/blockquote\u003e"
September 19, 2015
Xcode7 使用NSURLSession发送HTTP请求出错
"\u003cp\u003e控制台打印:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eApplication Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app’s Info.plist file.\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e在iOS9 中,苹果将原http协议改成了https协议,使用 TLS1.2 SSL加密请求数据。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e解决方法:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在info.plist中添加\nNSAppTransportSecurityNSAllowsArbitraryLoads\n\u003ctrue/\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2015/09/20150629175005991.png\"\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/20150629175005991.png\" alt=\"20150629175005991\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e官方文档:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://developer.apple.com/library/prerelease/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS9.html#//apple_ref/doc/uid/TP40016198-DontLinkElementID_13\"\u003ehttps://developer.apple.com/library/prerelease/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS9.html#//apple_ref/doc/uid/TP40016198-DontLinkElementID_13\u003c/a\u003e\u003c/p\u003e"
September 19, 2015
xcode7下安装Alamofire第三方网络基础库
"\u003cp\u003e1.安装类库管理工具\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://code4app.com/article/cocoapods-install-usage\"\u003eCocoaPods安装和使用教程\u003c/a\u003e \u003ca href=\"https://github.com/Carthage/Carthage\"\u003e去中心化的依赖管理器Carthage\u003c/a\u003e (这里没有使用这个库)\u003c/p\u003e\n\u003cp\u003e2.安装Alamofire\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/Alamofire/Alamofire\"\u003ehttps://github.com/Alamofire/Alamofire\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e以下为在使用Cocopods管理Alamofire类库的前后项目结构图,项目名称为CocoaPodsDemo\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2015/09/cocoapods_1.png\"\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/cocoapods_1.png\" alt=\"cocoapods_1\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2015/09/cocoapods_2.png\"\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/cocoapods_2.png\" alt=\"cocoapods_2\"\u003e\u003c/a\u003e\u003c/p\u003e"
September 10, 2015
git中 gitignore 文件的正确用法
"\u003cp\u003e使用 git 做代码管理工具时,设置 gitignore 是必不可少的流程,一些系统或者 IDE 会在目录下生成与项目不相关的文件,而这些文件我们不期望被提交到仓库之中。理解 gitignore 的 pattern 规则十分重要。\u003c/p\u003e\n\u003ch3 id=\"Pattern_规则\"\u003e\u003cstrong\u003ePattern 规则\u003c/strong\u003e\u003c/h3\u003e\n\u003cp\u003e关于 Pattern 规则,可以查看 git 的相关文档: \u003ca href=\"http://git-scm.com/docs/gitignore\"\u003ehttp://git-scm.com/docs/gitignore\u003c/a\u003e,大致有以下几点:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e空行不匹配任何内容,所以可以作为块分隔符;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e#\u003c/code\u003e 开头表示注释,如果相匹配 \u003ccode\u003e#\u003c/code\u003e,可以在前面加一个反斜杠,即 \u003ccode\u003e\\#\u003c/code\u003e;\u003c/li\u003e\n\u003cli\u003e除非加了反斜杠,否则一连串的空格会被忽略;\u003c/li\u003e\n\u003cli\u003e如果在匹配的内容前面加上 \u003ccode\u003e!\u003c/code\u003e,则这些匹配过的部分将被移出,如果要匹配以 \u003ccode\u003e!\u003c/code\u003e 开头的内容,需要加上反斜杠,如 \u003ccode\u003e\\!important.txt\u003c/code\u003e;\u003c/li\u003e\n\u003cli\u003e如果一个匹配 pattern 后面有一个斜杠,如 \u003ccode\u003efoo/\u003c/code\u003e,则默认会匹配所有(包含父子文件夹)中的 foo 文件夹内容,并且它不会匹配单个的文件;\u003c/li\u003e\n\u003cli\u003e如果一个匹配 pattern 不包含斜杠,如 \u003ccode\u003efoo\u003c/code\u003e,Git 会将其作为一个 shell 的查找命令匹配内容。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e需要注意的\u003ccode\u003e**\u003c/code\u003e: …\u003c/p\u003e"
July 24, 2015
安装apache+php(fastcgi)
"\u003cp\u003e最近有下二次开发的程序,由于源程序使用了zend压缩,提示需要安装 Zend Guard Loader 扩展。而安装zend guard 7后,发现在phpinfo()里检测不到,后来才发现原来zend guard只能使用nfs非安全线程的php,没有办法,重新下载NFS版本的php版本。以下为安装要点:\u003c/p\u003e\n\u003cp\u003e我用的是WampServer集成环境,于是就想到了把 Apache 换成 FastCGI 模式来跑 PHP5.3 nts 版,这样就可以使用Zend Guard Loader 扩展了。\u003c/p\u003e\n\u003cp\u003e1、下载 \u003ca href=\"http://windows.php.net/downloads/releases/php-5.3.28-nts-Win32-VC9-x86.zip\"\u003ePHP5.3.28\u003c/a\u003e ,解压到 F:/php5.3.28nts ,配置好 php.ini,也顺便把 Zend Guard Loader 扩展配置好。\u003c/p\u003e\n\u003cp\u003e2、下载 \u003ca href=\"http://archive.apache.org/dist/httpd/binaries/win32/\"\u003emod_fcgid-2.3.6-win32-x86.zip\u003c/a\u003e 或 \u003ca href=\"http://www.apachelounge.com/download/\"\u003ehttp://www.apachelounge.com/download/\u003c/a\u003e 解压 manual、modules 目录中的文件到 f:\\wamp\\bin\\apache\\apache2.2.22 对应目录里去。\u003c/p\u003e\n\u003cp\u003e3、打开 Apache …\u003c/p\u003e"
June 17, 2015
git commit 与 git commit -a 的区别
"\u003cp\u003e软件版本:\n操作系统:ubuntu10.04\n内核版本:Linux version 2.6.32-36-generic\ngit 版本:git version 1.7.0.4\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e目录:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e文件状态\u003c/li\u003e\n\u003cli\u003e提交\n2.1 git commit 与 git commit -a\n2.2 添加提交信息\u003c/li\u003e\n\u003cli\u003e修改/取消\u003c/li\u003e\n\u003cli\u003e参考资料\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003e1. 文件状态\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e一般仓库中的文件可能存在于这三种状态:\u003c/p\u003e\n\u003cp\u003e1)Untracked files → 文件未被跟踪;\n2)Changes to be committed → 文件已暂存,这是下次提交的内容;\n3) Changes bu not updated → 文件被修改,但并没有添加到暂存区。如果 commit 时没有带 -a 选项,这个状态下的文件不会被提交。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$git status\n# On branch master\n# Changes to be committed:\n# (use \u0026#34;git reset HEAD \u0026lt;file\u0026gt;...\u0026#34; to unstage)\n#\n# new file: file2\n#\n# Changed but …\u003c/code\u003e\u003c/pre\u003e"
June 15, 2015
golang中chan实例
"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport \u0026#34;fmt\u0026#34;\n\nfunc main() {\n data := make(chan int) // 数据交换队列\n exit := make(chan bool) // 退出通知\n\ngo func() {\n for d := range data { // 从队列迭代接收数据,直到 close 。\n fmt.Println(d)\n }\n\n fmt.Println(\u0026#34;recv over.\u0026#34;)\n exit \u0026lt;- true // 发出退出通知。\n}()\n\ndata \u0026lt;- 1 // 发送数据。\ndata \u0026lt;- 2\ndata \u0026lt;- 3\n\nclose(data) // 关闭队列。\n\nfmt.Println(\u0026#34;send over.\u0026#34;)\n\n\u0026lt;-exit // 等待退出通知。\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e输出结果:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e1\n2\n3\nsend over.\nrecv over.\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e而如果将上面与 exit chan有关的三行删除掉,则结果为:\u003c/p\u003e"
June 13, 2015
golang中chan的理解与使用教程
"\u003cp\u003e对于 chan 介绍见: \u003ca href=\"https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.7.md\"\u003ehttps://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.7.md\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e这里我们主要通过实例来介绍对chan的理解及用法.\u003c/p\u003e\n\u003ch1 id=\"无buffer的channels\"\u003e无Buffer的Channels\u003c/h1\u003e\n\u003cp\u003e实例1:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003efunc main() {\nci := make(chan int)\n\nci \u0026lt;- 4\n\nvalue := \u0026lt;-ci\nfmt.Println(value)\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e执行结果错误为:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003efatal error: all goroutines are asleep - deadlock!\ngoroutine 1 [chan send]:\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e从上面“fatal error: all goroutines are asleep - deadlock!” 这句我们可以看出是groutings 阻塞了,这里为写阻塞,从“goroutine 1 [chan send]”可以看出来。\u003c/p\u003e\n\u003cp\u003e这一点文档里已经说明阻塞的原因了:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e默认情况下,channel接收和发送数据都是阻塞的,除非另一端已经准备好,这样就使 …\u003c/p\u003e\u003c/blockquote\u003e"
June 13, 2015
Dev with Vagrant and Docker
"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e为了在团队里搭建统一的本地开发环境,最近花了点时间用了下vagrant和docker,在此做个记录, 这也算一个DevOps的实践。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"vagrant介绍\"\u003eVagrant介绍\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"http://vagrantup.com/\"\u003eVagrant\u003c/a\u003e 是一款用来构建虚拟开发环境的工具,非常适合 php/python/ruby/java 这类语言开发 web 应用,“代码在我机子上运行没有问题”这种说辞将成为历史。\u003c/p\u003e\n\u003cp\u003e我们可以通过 Vagrant 封装一个 Linux 的开发环境,分发给团队成员。成员可以在自己喜欢的桌面系统(Mac/Windows/Linux)上开发程序,代码却能统一在封装好的环境里运行,非常霸气。\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e以上介绍直接抄自\u003ca href=\"http://blog.segmentfault.com/fenbox/1190000000264347\"\u003e网络\u003c/a\u003e,我觉得介绍的很到位。\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e「注意点:」\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003evagrant up命令执行后,如果看到下面的错误信息,则需要安装另外一个工具:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[default] The guest additions on this VM do not match the installed version of\nVirtualBox! In most cases this is fine, but in rare cases it can\nprevent …\u003c/p\u003e\u003c/blockquote\u003e"
June 9, 2015
golang中flag包的用法
"\u003cp\u003egolang中flag包主要用来CLI下,获取命令参数,示例如下mysql.go:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport (\n\u0026#34;flag\u0026#34;\n\u0026#34;fmt\u0026#34;\n)\n\nfunc main() {\n host := flag.String(\u0026#34;h\u0026#34;, \u0026#34;localhost\u0026#34;, \u0026#34;请指定一个主机\u0026#34;)\n user := flag.String(\u0026#34;u\u0026#34;, \u0026#34;root\u0026#34;, \u0026#34;请指定数据库用户\u0026#34;)\n port := flag.Int(\u0026#34;P\u0026#34;, 3306, \u0026#34;Port number to use for commection or 0 for default to, in port 3306\u0026#34;)\n\n //var name string\n //flag.StringVar(\u0026amp;name, \u0026#34;u\u0026#34;, \u0026#34;root\u0026#34;, \u0026#34;请指定用户名\u0026#34;)\n\n flag.Parse() // …\u003c/code\u003e\u003c/pre\u003e"
May 1, 2015
ios8中action segue
"\u003cp\u003eos8 action segue 有几种方法,一般选择哪一个,每种方法都有什么用,在什么环境下使用?\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2015/05/57_400607_5f360e47ff35d47.jpg\"\u003e\u003cimg src=\"http://blogx.haohtml.com/wp-content/uploads/2015/05/57_400607_5f360e47ff35d47.jpg\" alt=\"57_400607_5f360e47ff35d47\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eApple的解释在这里: \u003ca href=\"https://developer.apple.com/library/ios/recipes/xcode_help-IB_storyboard/chapters/StoryboardSegue.html\"\u003ehttps://developer.apple.com/library/ios/recipes/xcode_help-IB_storyboard/chapters/StoryboardSegue.html\u003c/a\u003e\n我的翻译:\n\u003cstrong\u003eShow\u003c/strong\u003e: 在master或detail区域展现内容(典型的如iPad的设置界面,左侧是master,右侧是detail),究竟是在哪个区要取决于屏幕上的内容,如果不分master/detail,就单纯的把新的内容push到当前view controller stack的顶部\n\u003cstrong\u003eShow Detail\u003c/strong\u003e: 大致同Show,在detail区域展现内容,如果不分master/detail,新的内容取代当前view controller stack的顶部\n\u003cstrong\u003ePresent Modally\u003c/strong\u003e:模态展示内容\n\u003cstrong\u003ePresent as Popover\u003c/strong\u003e:在当前的view上出现一个小窗口来展示内容,无处不在的“选中文字后出现 复制/翻译 按钮就是这个\n\u003cstrong\u003eCustom\u003c/strong\u003e:自定义 …\u003c/p\u003e"
April 8, 2015
golang中的sync.WaitGroup
"\u003cp\u003eGolang的sync的包有一个并发原语WaitGroup,在日常开发中比较的有用。\u003c/p\u003e\n\u003cp\u003eWaitGroup的用途:它能够一直等到所有的goroutine执行完成,在其期间会会阻塞主线程的执行,直到所有的goroutine执行完成。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e这里要注意一下,在其中的多个goroutine 的执行结果是没有顺序的,调度器不能保证多个 goroutine 执行次序,且进程退出时不会等待它们结束。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eWaitGroup总共有三个方法:\u003ccode\u003eAdd(delta int),\u003c/code\u003e \u003ccode\u003eDone()\u003c/code\u003e 和 \u003ccode\u003eWait()\u003c/code\u003e。简单的说一下这三个方法的作用。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAdd: 添加或者减少等待goroutine的数量\u003c/p\u003e\n\u003cp\u003eDone: 相当于Add(-1)\u003c/p\u003e\n\u003cp\u003eWait: 执行阻塞,直到所有的WaitGroup数量变成0\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e举个例子\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport (\n \u0026#34;fmt\u0026#34;\n \u0026#34;sync\u0026#34;\n \u0026#34;time\u0026#34;\n)\n\nfunc main() {\n var wg sync.WaitGroup\n\n for i := 0; i \u0026lt; 5; i++ { …\u003c/code\u003e\u003c/pre\u003e"
April 8, 2015
Golang语言的GOPATH与工作目录详解
"\u003cp\u003e这篇文章主要介绍了Go语言的GOPATH与工作目录详解,本文详细讲解了GOPATH设置、应用目录结构、编译应用等内容,需要的朋友可以参考下\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eGOPATH设置\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ego 命令依赖一个重要的环境变量:$GOPATH\u003c/p\u003e\n\u003cp\u003e(注:这个不是Go安装目录( \u003cstrong\u003eGOROOT\u003c/strong\u003e)。下面以笔者的工作目录为说明,请替换自己机器上的工作目录。)\u003c/p\u003e\n\u003cp\u003e在类似 Unix 环境大概这样设置:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eexport GOPATH=/home/apple/mygo\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e为了方便,应该把新建以上文件夹,并且把以上一行加入到 .bashrc 或者 .zshrc 或者自己的 sh 的配置文件中。\u003c/p\u003e\n\u003cp\u003eWindows 设置如下,新建一个环境变量名称叫做GOPATH:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eGOPATH=c:mygo\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eGOPATH允许多个目录,当有多个目录时,请注意分隔符,多个目录的时候Windows是分号,Linux系统是冒号,当有多个GOPATH时,默认会将go get的内容放在第一个目录下\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e以上 $GOPATH 目录约定有三个子目录:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1.src 存放源代码(比如:.go .c .h .s等)\u003c/p\u003e\n\u003cp\u003e2.pkg 编译后生成的文件(比如:.a)\u003c/p\u003e\n\u003cp\u003e3.bin 编译后生成的可执行文件( …\u003c/p\u003e"
March 6, 2015
关于Pull Request的十个建议(转)
"\u003cp\u003ePull Request是Bitbucket、GitHub等源代码托管系统为了方便开发者之间协作而提供的一个功能,它提供了一个用户友好的Web界面来帮助审查人员进行代码审查。开发人员可以通过GitHub发出Pull Requests要求请求他人将程序拉下来进行代码审查。一个好的Pull Request不仅仅只是代码的事情,还牵涉到代码审查者对代码的审查,所以开发者不仅要写出好的代码,还必须迎合审查者的审查工作,才能给使得自己贡献的代码顺利通过审查并合并到master分支。现对丹麦的程序员、软件架构师、独立顾问Mark Seemann在自己博客中发布的一篇题为《关于Pull Request的十个建议》的文章进行一个全面的整理,以供读者阅读和参考。具体内容如下:\u003c/p\u003e\n\u003ch2 id=\"1-进行较小的pull-request\"\u003e\u003cstrong\u003e1. 进行较小的Pull Request\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003e一个小且集中的Pull Request会使得提交的代码更加容易通过审核。据Mark Seemann根据自己的经验透漏,对提交代码进行审查所花费的时间是随着代码大小呈指数增长,而非线性增长;Pull Request多大才合适与Pull Request做了什么相关,最好少于12个文件的改变。如 …\u003c/p\u003e"
September 14, 2014
使用git-flow来帮助管理git代码
"\u003cp\u003e对git不熟悉的我,经常把git提交搞得很乱,导致在master上有许多无用的commit,最终决定好好地看一下git的使用教程,却不小心发现了还有一个git-flow的工具可以帮助我管理好git项目的代码。\u003c/p\u003e\n\u003cp\u003egit-flow在ubuntu上使用比较简单。首先安装,可以通过apt-get来获取。命令如下:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003esudo apt-get install git-flow\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e如果是在windows下,可以参考这篇文章进行安装: \u003ca href=\"http://my.eoe.cn/sunxun/archive/158.html\"\u003ehttp://my.eoe.cn/sunxun/archive/158.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e如果你的git已经装好,则方便多了,下载下面两个地址的文件,并解压出getopt.exe和libintl3.dll放到git的安装目录的bin目录下。 \u003ca href=\"http://sourceforge.net/projects/gnuwin32/files/util-linux/2.14.1/util-linux-ng-2.14.1-bin.zip/download\"\u003ehttp://sourceforge.net/projects/gnuwin32/files/util-linux/2.14.1/util-linux-ng-2.14.1-bin.zip/download …\u003c/a\u003e\u003c/p\u003e"
June 20, 2014
golint—golang代码质量检测
"\u003cp\u003egithub: \u003ca href=\"https://github.com/golang/lint\"\u003ehttps://github.com/golang/lint\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003egolint是类似javascript中的jslint的工具,主要功能就是检测代码中不规范的地方。golint用于检测go代码。\u003c/p\u003e\n\u003ch2 id=\"使用\"\u003e使用\u003c/h2\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ go get github.com/golang/lint\n$ go install github.com/golang/lint\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003egolint 文件名或者目录\u003c/code\u003e\n检测对应的代码。\u003c/p\u003e\n\u003cp\u003egolint会输出一些代码存在的问题:\n比如:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003erecorder.go:55:5: exported var RecordBind should have comment or be unexported\nrecorder.go:158:1: exported function Record_ErrorRecord should have comment or be unexported\nrecorder.go:173:6: don\u0026#39;t use underscores in Go names; type Data_MemStats should be DataMemStats …\u003c/code\u003e\u003c/pre\u003e"
June 19, 2014
Swift中的标准函数
"\u003cp\u003eSwift中共有74个内建函数,但是在Swift官方文档(“ \u003ca href=\"https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/index.html#//apple_ref/doc/uid/TP40014097\"\u003eThe Swift Programming Language\u003c/a\u003e”)中只记录了7中。剩下的67个都没有记录。\u003c/p\u003e\n\u003cp\u003e本文将列举Swift所有的内建函数。本文中提到的所谓的内建函数是指那些在Swift中不需要导入任何模块(如Foundation等)或者引用任何类就可以使用的函数。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eabs(signedNumber)\u003c/strong\u003e: 返回给定的有符号数字的绝对值。很简单,但是没有在文档中记录。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eabs(-1) == 1\u003c/li\u003e\n\u003cli\u003eabs(-42) == 42\u003c/li\u003e\n\u003cli\u003eabs(42) == 42\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003econtains(sequence, element)\u003c/strong\u003e: 如果给定的序列(如数组)包含特定的元素,则返回true。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003evar languages = [“Swift”, “Objective-C”]\u003c/li\u003e\n\u003cli\u003econtains(languages, “Swift”) == true\u003c/li\u003e\n\u003cli\u003econtains(languages, “Java”) == false\u003c/li\u003e\n\u003cli\u003econtains([29, 85, 42, 96, 75], 42) == true\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003edropFirst(sequence)\u003c/strong\u003e: 返 …\u003c/p\u003e"
June 16, 2014
iOS的主要框架介绍(转)
"\u003cp\u003e框架是一个目录,这个目录包含了共享库,访问共享库里代码的头文件,和其它的图片和声音的资源文件。一个共享库定义的方法或函数可以被应用程序调用。\u003c/p\u003e\n\u003cp\u003eIOS提供了很多你可以在应用程序里调用的框架。要使用一个框架,需要将它添加到你的项目中,你的项目才可以使用它。许多应用程序都使用了如Foundation、UIKit、和Core Graphics这些框架。根据你为应用程序选择的模版,相关的框架就已经被自动引入了。如果默认加入的框架不能满足你的应用程序的需求,你也可以加入需要的框架。\u003c/p\u003e\n\u003cp\u003e看看HelloWorld.xcodeproj项目里都包含了哪些框架(注:HelloWorld.xcodeproj是《\u003cem\u003eYour First iOS App\u003c/em\u003e tutorial 》这篇教程里的一个项目)\u003c/p\u003e\n\u003cp\u003e1.在XCode里打开HelloWorld.xcodeproj项目(如果还没有打开)\u003c/p\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003e在project navigator窗口里点击,点击Frameworks目录前面的三角形图标。你会看到:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eUIKit.framework,Foundation.framework, 和CoreGraphics.framework\u003c/p\u003e\n\u003col start=\"3\"\u003e\n\u003cli\u003e点击 …\u003c/li\u003e\u003c/ol\u003e"
June 12, 2014
Swift中的结构体与类的区别(有坑存在)
"\u003ch2 id=\"-\"\u003e结构体和枚举是值类型\u003c/h2\u003e\n\u003cp\u003e在 Swift 中,所有的基本类型:整数(Integer)、浮点数(floating-point)、布尔值(Booleans)、字符串(string)、数组(array)和字典(dictionaries),都是值类型,并且都是以结构体的形式在后台所实现。\u003c/p\u003e\n\u003cp\u003e在 Swift 中,所有的结构体和枚举都是值类型。这意味着它们的实例,以及实例中所包含的任何值类型属性,在代码中传递的时候都会被复制。\u003c/p\u003e\n\u003ch2 id=\"-\"\u003e类是引用类型\u003c/h2\u003e\n\u003cp\u003e与值类型不同,引用类型在被赋予到一个变量,常量或者被传递到一个函数时,操作的并不是其拷贝。因此,引用的是已存在的实例本身而不是其拷贝。\u003c/p\u003e\n\u003ch1 id=\"恒等运算符\"\u003e恒等运算符\u003c/h1\u003e\n\u003cp\u003e因为类是引用类型,有可能有多个常量和变量在后台同时引用某一个类实例。(对于结构体和枚举来说,这并不成立。因为它们作值类型,在被赋予到常量,变量或者传递到函数时,总是会被拷贝。)\u003c/p\u003e\n\u003cp\u003e如果能够判定两个常量或者变量是否引用同一个类实例将会很有帮助。为了达到这个目的,Swift 内建了两个恒等运算符:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e等价于 ( === )\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e不等价于 ( !== )\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e以下是运用这两个运算符检测两个常量或者变量是否引用同一个实例:\u003c/p\u003e\n\u003cp\u003eif …\u003c/p\u003e"
June 12, 2014
Swift中的函数
"\u003cp\u003e对于Swift语言中的函数还是有许多与其它语言不同的地方的。如下:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1. 对于指定函数黑夜参数值的函数,在调用函数的时候,如果需要指定参数值的话,需要以“参数名:值”这种格式调用\u003c/strong\u003e\nfunc join(s1:String, s2: String, joinstr: String = “-“) -\u0026gt; String {\nreturn s1 + joinstr + s2\n}\u003c/p\u003e\n\u003cp\u003elet result = join(“hello”, “world”, joinstr:”===”) //或者直接写前两个值\nprintln(result)\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2. 常量参数和变量参数(Constant and Variable Parameters)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e数参数默认是常量。试图在函数体中更改参数值将会导致编译错误。这意味着你不能错误地更改参数值。\u003c/p\u003e\n\u003cp\u003e但是,有时候,如果函数中有传入参数的变量值副本将是很有用的。你可以通过指定一个或多个参数为变量参数,从而避免自己在函数中定义新的变量。变量参数不是常量,你可以在函数中把它当做新的可修改副本来使用。\u003c/p\u003e\n\u003cp\u003e通过在参数名前加关键字 \u003ccode\u003evar\u003c/code\u003e 来定义变量参数:\u003c/p\u003e\n\u003cp\u003efunc …\u003c/p\u003e"
June 11, 2014
Swift编程语言中的optional(可选)
"\u003ch2 id=\"-\"\u003e可选\u003c/h2\u003e\n\u003cp\u003e使用可选来处理值可能缺失的情况。可选表示:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e有值,等于 x\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e或者\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e没有值\u003c/li\u003e\n\u003c/ul\u003e\n\u003cblockquote\u003e\n\u003cp\u003e注意:C 和 Objective-C 中并没有可选这个概念。最接近的是 Objective-C 中的一个特性,一个方法要不返回一个对象要不返回 \u003ccode\u003enil\u003c/code\u003e, \u003ccode\u003enil\u003c/code\u003e 表示“缺少一个合法的对象”。然而,这只对对象起作用——对于结构体,基本的 C 类型或者枚举类型不起作用。对于这些类型,Objective-C 方法一般会返回一个特殊值(比如 \u003ccode\u003eNSNotFound\u003c/code\u003e)来暗示值缺失。这种方法假设方法的调用者知道并记得对特殊值进行判断。然而,Swift 的可选可以让你暗示任意类型的值缺失,并不需要一个特殊值。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e来看一个例子。Swift 的 \u003ccode\u003eString\u003c/code\u003e 类型有一个叫做 \u003ccode\u003etoInt\u003c/code\u003e 的方法,作用是将一个 \u003ccode\u003eString\u003c/code\u003e 值转换成一个 \u003ccode\u003eInt\u003c/code\u003e 值。然而,并不是所有的字符串都可以转换成一个整数。字符串 \u003ccode\u003e\u0026quot;123\u0026quot;\u003c/code\u003e 可以被转换成数字 \u003ccode\u003e123\u003c/code\u003e,但是字符串 \u003ccode\u003e\u0026quot;hello, world\u0026quot;\u003c/code\u003e 不行。\u003c/p\u003e\n\u003cp\u003e下面的例子使用 \u003ccode\u003etoInt\u003c/code\u003e 方法来尝试将一个 \u003ccode\u003eString\u003c/code\u003e 转换成 \u003ccode\u003eInt\u003c/code\u003e:\u003c/p\u003e\n\u003cp\u003elet …\u003c/p\u003e"
June 10, 2014
Swift中的字典
"\u003cp\u003e//1.创建字典\u003c/p\u003e\n\u003cp\u003evar dict:Dictionary\u0026lt;Int, String\u0026gt; = [:“美国“,1:“中国“, 2:“英国“]\u003c/p\u003e\n\u003cp\u003evar country = [\u003c/p\u003e\n\u003cp\u003e“china”: “中国“,\u003c/p\u003e\n\u003cp\u003e“en”:“英国“,\u003c/p\u003e\n\u003cp\u003e“usa”:“美国“\u003c/p\u003e\n\u003cp\u003e]\u003c/p\u003e\n\u003cp\u003e//创建一个空的字典\u003c/p\u003e\n\u003cp\u003evar emptyDictionary = Dictionary\u0026lt;String, Float\u0026gt;()\u003c/p\u003e\n\u003cp\u003evar emptyDictionary2 = [:]\u003c/p\u003e\n\u003cp\u003efor (key,value) incountry {\u003c/p\u003e\n\u003cp\u003evar result = key + value\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003e//2.获取字典中的所有键名和键值及字典元素个数\u003c/p\u003e\n\u003cp\u003evar keys = Array(country.keys)\u003c/p\u003e\n\u003cp\u003evar values = Array(country.values)\u003c/p\u003e\n\u003cp\u003evar cnum = country.count\u003c/p\u003e\n\u003cp\u003e//3.访问字典\u003c/p\u003e\n\u003cp\u003evar value = dict[]\u003c/p\u003e\n\u003cp\u003evar value2 = country[“china”]\u003c/p\u003e\n\u003cp\u003e//4.修改字典,修改后,字典中的位置会发生改变\u003c/p\u003e\n\u003cp\u003ecountry[“china”] = “中华人民 …\u003c/p\u003e"
June 10, 2014
swift中的数组操作
"\u003cp\u003evar shopCart: String[] = [“苹果“, “桔子“, “荔枝“]\u003c/p\u003e\n\u003cp\u003evar shoppingList = [“catfilsh”, “water”, “tulips”]\u003c/p\u003e\n\u003cp\u003e//创建一个空数组\u003c/p\u003e\n\u003cp\u003evar emptyArray = String\u003ca href=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e//数组遍历\u003c/p\u003e\n\u003cp\u003efor str inshopCart {\u003c/p\u003e\n\u003cp\u003e println(str)\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003e//带索引值的遍历\u003c/p\u003e\n\u003cp\u003efor (index, value) inenumerate(shopCart) {\n println(“(index+1):(value)“)\n}\u003c/p\u003e\n\u003cp\u003e//判断数组是否为空及数组元素个数\u003c/p\u003e\n\u003cp\u003eifshopCart.isEmpty {\u003c/p\u003e\n\u003cp\u003eprintln(“购物车中无任何商品,请购买”)\u003c/p\u003e\n\u003cp\u003e} else {\u003c/p\u003e\n\u003cp\u003eprintln(“您当前购物车中共 (shopCart.count) 有件商品”)\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003eprintln(“=================”)\u003c/p\u003e\n\u003cp\u003e//数组元素添加,{苹果 桔子 荔枝 芒果}\u003c/p\u003e\n\u003cp\u003eshopCart.append(“芒果“)\u003c/p\u003e\n\u003cp\u003efor str inshopCart {\u003c/p\u003e\n\u003cp\u003eprintln(str)\u003c/p\u003e\n\u003cp\u003e} …\u003c/p\u003e"
May 28, 2014
Linux中让crontab以秒为单位执行任务
"\u003cp\u003eLinux下实现秒级定时任务的两种方案(Crontab 每秒运行):\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e第一种方案,当然是写一个后台运行的脚本一直循环,然后每次循环sleep一段时间。\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#!/bin/bash\nwhile true ;do\n\ncommand\n\nsleep XX //间隔秒数\n\ndone\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e或者使用for语句\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#!/bin/bash\n\nfor((i=1;i\u0026lt;=20;i++));do\n/home/somedir/scripts.sh \u0026gt; /dev/null 2\u0026gt;\u0026amp;1\nsleep 3\ndone\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e第二种方案,使用crontab。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e我们都知道crontab的粒度最小是到分钟,但是我们还是可以通过变通的方法做到隔多少秒运行一次。\u003c/p\u003e\n\u003cp\u003e以下方法将每20秒执行一次\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecrontab -e\n* * * * * /bin/date\n* * * * * sleep 20; /bin/date.sh\n* * * * * sleep 40; /bin/date.sh\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e说明:需要将/bin/date.sh更换成你的命令即可\u003c/p\u003e\n\u003cp\u003e这种做法去处理隔几十秒的定时任务还好,要是每1秒运行一次就得添加60条记录。。。如果每秒运 …\u003c/p\u003e"
March 8, 2014
golang中for循环方法的差异
"\u003cp\u003e用for循环遍历字符串时,也有 byte 和 rune 两种方式.第一种试为byte,第二种rune。\u003c/p\u003e\n\u003cp\u003egolang中string rune byte 三者的关系 \u003ca href=\"https://blog.haohtml.com/archives/17646\"\u003ehttps://blog.haohtml.com/archives/17646\u003c/a\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport (\n \u0026#34;fmt\u0026#34;\n)\n\nfunc main() {\n s := \u0026#34;abc汉字\u0026#34;\n\n for i := 0; i \u0026lt; len(s); i++ {\n fmt.Printf(\u0026#34;%c,\u0026#34;, s[i])\n }\n\n fmt.Println()\n\n for _, r := range s {\n fmt.Printf(\u0026#34;%cn\u0026#34;, r)\n }\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e输出结果:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ea,b,c,æ,±,,å,,,\na\nb\nc\n汉\n字\n\u003c/code\u003e\u003c/pre\u003e"
December 23, 2013
git stash和git stash pop的用法
"\u003cp\u003e推荐阅读: \u003ca href=\"http://www.cppblog.com/deercoder/archive/2011/11/13/160007.html\"\u003ehttp://www.cppblog.com/deercoder/archive/2011/11/13/160007.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e原文: \u003ca href=\"http://gitbook.liuhui998.com/4_5.html\"\u003ehttp://gitbook.liuhui998.com/4_5.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、基本操作\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e当你正在做一项复杂的工作时, 发现了一个和当前工作不相关但是又很讨厌的bug. 你这时想先修复bug再做手头的工作, 那么就可以用 git stash 来保存当前的工作状态, 等你修复完bug后,执行’反储藏\u0026rsquo;(unstash)操作就可以回到之前的工作里.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ git stash save \u0026#34;work in progress for foo feature\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e上面这条命令会保存你的本地修改到储藏(stash)中, 然后将你的工作目录和索引里的内容全部重置, 回到你当前所在分支的上次提交时的状态.\u003c/p\u003e\n\u003cp\u003e好了, 你现在就可以开始你的修复工作了.\u003c/p\u003e\n\u003cp\u003e… edit and test …\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ git commit -a -m \u0026#34;blorpl: typofix\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e当你修复完bug后, 你可以用git stash apply来回 …\u003c/p\u003e"
November 22, 2013
redmine与git组合配置
"\u003cp\u003e参考:\u003ca href=\"http://www.redmine.org/projects/redmine/wiki/HowTo_Easily_integrate_a_(SSH_secured)_GIT_repository_into_redmine\"\u003ehttp://www.redmine.org/projects/redmine/wiki/HowTo_Easily_integrate_a_(SSH_secured)_GIT_repository_into_redmine\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e在redmine 的”配置”选项里,填写git仓库位置的时候,一定要在写完整的.git路径,如 \u003cstrong\u003e/data/www/redmine/repos/agent/.git\u003c/strong\u003e ,否则redmine会无法发现git仓库.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://http://blog.haohtml.com/wp-content/uploads/2013/11/redmine-git-repo.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/redmine-git-repo.png\" alt=\"redmine-git-repo\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e相关文章:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.csdn.net/benkaoya/article/details/8762935\"\u003ehttp://blog.csdn.net/benkaoya/article/details/8762935\u003c/a\u003e\u003c/p\u003e"
November 11, 2013
使用 Vagrant 打造跨平台开发环境
"\u003cp\u003e\u003ca href=\"http://vagrantup.com/\"\u003eVagrant\u003c/a\u003e 是一款用来构建虚拟开发环境的工具,非常适合 php/python/ruby/java 这类语言开发 web 应用,“代码在我机子上运行没有问题”这种说辞将成为历史。\u003c/p\u003e\n\u003cp\u003e我们可以通过 Vagrant 封装一个 Linux 的开发环境,分发给团队成员。成员可以在自己喜欢的桌面系统(Mac/Windows/Linux)上开发程序,代码却能统一在封装好的环境里运行,非常霸气。\u003c/p\u003e\n\u003ch2 id=\"安装步骤\"\u003e安装步骤\u003c/h2\u003e\n\u003ch3 id=\"1-安装-virtualbox\"\u003e1. 安装 VirtualBox\u003c/h3\u003e\n\u003cp\u003e虚拟机还是得依靠 VirtualBox 来搭建,免费小巧。\n下载地址: \u003ca href=\"https://www.virtualbox.org/wiki/Downloads\"\u003ehttps://www.virtualbox.org/wiki/Downloads\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e* 虽然 Vagrant 也支持 VMware,不过 VMware 是收费的,对应的 Vagrant 版本也是收费的\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"2-安装-vagrant\"\u003e2. 安装 Vagrant\u003c/h3\u003e\n\u003cp\u003e下载地址: \u003ca href=\"http://downloads.vagrantup.com/\"\u003ehttp://downloads.vagrantup.com/\u003c/a\u003e 根据提示一步步安装。\u003c/p\u003e\n\u003cp\u003e此外,还得下载官方封装好的基础镜像:\nUbuntu precise 32 VirtualBox …\u003c/p\u003e"
November 4, 2013
PHP 多台服务器 session 用Memcached存储Session
"\u003cp\u003e\u003cstrong\u003ephp实现多服务器共享session的方法:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e多服务器共享session的方法:\u003c/p\u003e\n\u003cp\u003e1.通过NFS文件共享的方式,多台WEB服务器共享保存session文件的磁盘\n2.保存在数据库中,这种方式的扩展性很强,可以随意增加WEB而不受影响\n3.可以将session数据保存在memcached中,memcached是基于内存存储数据的,性能很高,用户并发量很大的时候尤其合适,参考PHP实现多服务器session共享之memcache共享\n4.文件方式保存session时,可以采用php的扩展eaccelerator来存储sesion\u003c/p\u003e\n\u003cp\u003ephp中的Session默认是用文件的方式存储的,如果用多台WEB服务器,Session共享可能就会成为一个大的问题,可以用NFS共享的方式来存储,但是对于并发请求更多的站点来说,用NFS也会出现问题,下面就说说用Memcached来保存Session的问题。\u003c/p\u003e\n\u003cp\u003evi memcached_session.php,输入如下的代码\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ip = \u0026#39;192.168.1.111\u0026#39;;\n$port = 11211; …\u003c/code\u003e\u003c/pre\u003e"
October 31, 2013
Golang import使用说明
"\u003cp\u003e我们在写Go代码的时候经常用到import这个命令用来导入包文件,而我们经常看到的方式参考如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\nimport(\n\u0026#34;fmt\u0026#34;\n)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e然后我们代码里面可以通过如下的方式调用\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003efmt.Println(\u0026#34;hello world\u0026#34;)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e上面这个fmt是Go语言的标准库,他其实是去goroot下去加载该模块,当然Go的import还支持如下两种方式来加载自己写的模块:\u003c/p\u003e\n\u003cp\u003e1.相对路径\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eimport “./model” //当前文件同一目录的model目录,但是不建议这种方式来import\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e2.绝对路径\u003c/p\u003e\n\u003cp\u003eimport “shorturl/model” //加载gopath/src/shorturl/model模块\u003c/p\u003e\n\u003cp\u003e上面展示了一些import常用的几种方式,但是还有一些特殊的import,让很多新手很费解,下面我们来一一讲解一下到底是怎么一回事\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.点操作\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e我们有时候会看到如下的方式导入包\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eimport(\n. \u0026#34;fmt\u0026#34;\n)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这个点操作的含义就是这个包导入之后在你调用这个包的函数时,你可以省略前缀的包名,也就是前面你调用 …\u003c/p\u003e"
October 22, 2013
golang实现验证电子信箱和手机格式合法性(正则表达式)
"\u003cp\u003e邮箱验证\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003efunc checkEmail(email string) (b bool) {\n if m, _ := regexp.MatchString(\u0026#34;^([a-zA-Z0-9\\_-])+@([a-zA-Z0-9\\_-])+(.[a-zA-Z0-9_-])+\u0026#34;, email); !m {\n \treturn false\n }\n return true\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e手机验证\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\nimport (\n\u0026#34;regexp\u0026#34;\n)\n\nconst (\n\tregular = \u0026#34;^(13[0-9]|14[57]|15[0-35-9]|18[07-9])\\\\d{8}$\u0026#34;\n)\n\nfunc validate(mobileNum string) bool {\n reg := regexp.MustCompile(regular)\n return reg.MatchString(mobileNum)\n}\n\nfunc main() {\n if validate(\u0026#34;13888888888\u0026#34;) { …\u003c/code\u003e\u003c/pre\u003e"
October 22, 2013
[必读]golang语言报错信息fatal error: all goroutines are asleep – deadlock!
"\u003cp\u003e出错信息\u003cstrong\u003efatal error: all goroutines are asleep – deadlock!\u003c/strong\u003e\n\u003cstrong\u003e出错信息的意思是:\u003c/strong\u003e\n在main goroutine线,期望从管道中获得一个数据,\u003cstrong\u003e而这个数据必须是其他goroutine线放入管道的\u003c/strong\u003e\n但是其他goroutine线都已经执行完了(all goroutines are asleep),那么就永远不会有数据放入管道。\n所以,main goroutine线在等一个永远不会来的数据,那整个程序就永远等下去了。\n这显然是没有结果的,所以这个程序就说“算了吧,不坚持了,我自己自杀掉,报一个错给代码作者,我被deadlock了”\n例子:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nfunc main() {\n c := make(chan bool)\n go func() {\n c \u0026lt;- true\n }()\n \u0026lt;-c //这里从c管道,取到一个true\n \u0026lt;-c //这行导致deadlock,因为这时的c管道,永远都取不到数据(注释掉这行就不报错)\n}\n\u003c/code\u003e\u003c/pre\u003e"
October 22, 2013
golang日志模块测试
"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport (\n \u0026#34;fmt\u0026#34;\n \u0026#34;log\u0026#34;\n \u0026#34;os\u0026#34;\n)\n\nfunc main(){\n logfile,err := os.OpenFile(\u0026#34;d:/workspace/golang/test.log\u0026#34;,os.O\\_RDWR|os.O\\_CREATE|os.O_APPEND,0);\n if err!=nil {\n fmt.Printf(\u0026#34;%s\\r\\n\u0026#34;,err.Error());\n os.Exit(-1);\n }\n defer logfile.Close();\n \n logger := log.New(logfile,\u0026#34;\\r\\n\u0026#34;,log.Ldate|log.Ltime|log.Llongfile);\n logger.Println(\u0026#34;hello\u0026#34;);\n logger.Println(\u0026#34;oh….\u0026#34;);\n logger.Fatal(\u0026#34;test\u0026#34;); …\u003c/code\u003e\u003c/pre\u003e"
October 7, 2013
php框架–php框架的连贯查询实现原理
"\u003cp\u003e如果你是一名使用过多种框架的php程序员,你一定见过这样的查询语句:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$result = $mysqlDb-\u0026gt;limit(’0,10′)-\u0026gt;order(‘id desc’)-\u0026gt;findall();\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e上面的查询语句,连续使用-\u0026gt;操作符进行操作,并最终返回一个查询结果,那么这是如何实现的呢。\u003c/p\u003e\n\u003cp\u003e我们来简单分析一下:\u003c/p\u003e\n\u003cp\u003e-\u0026gt;操作符用来访问对象,上面的语句一共使用了3次-\u0026gt;操作符,而最后一次返回的是查询结果,这说明,前2次-\u0026gt;访问后,返回的应该是一个对象,因为在php中,如果你对一个非对象使用-\u0026gt;操作符是不可能的。这告诉我们,$mysql实例中的limit和order方法都返回一个对其所在类自身的引用即 return $this,了解了这一点,那么我们就可以实现连贯查询了。请看站长写的示例代码:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e/*\n *类功能:实现数据库的连贯查询操作\n */\n class mysql_query{\n var $tbl=’user’;//要操作的表名\n var $limit=”;//存储limit语句的变量\n var $order=”;//存储order …\u003c/code\u003e\u003c/pre\u003e"
October 7, 2013
[翻译]绝妙的 channel
"\u003cp\u003e在编写 golang 程序的过程中,channel 会经常使用。本文对 channel 的使用的确很特别,同时也非常实用。\u003c/p\u003e\n\u003cp\u003e原文在此: \u003ca href=\"http://dave.cheney.net/2013/04/30/curious-channels\" title=\"Curious channels\"\u003ehttp://dave.cheney.net/2013/04/30/curious-channels\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e在编写 golang 程序的过程中,channel 会经常使用。本文对 channel 的使用的确很特别,同时也非常实用。\u003c/p\u003e\n\u003cp\u003e原文在此:http://dave.cheney.net/2013/04/30/curious-channels\u003c/p\u003e\n\u003cp\u003e翻译:\u003ca href=\"http://mikespook.com/2013/05/%E7%BF%BB%E8%AF%91%E7%BB%9D%E5%A6%99%E7%9A%84-channel/#more-1635\"\u003ehttp://mikespook.com/2013/05/%E7%BF%BB%E8%AF%91%E7%BB%9D%E5%A6%99%E7%9A%84-channel/#more-1635\u003c/a\u003e\u003c/p\u003e"
October 4, 2013
VIM编辑器下go语法高亮显示
"\u003ch1 id=\"go-in-vim\"\u003eGo in Vim\u003c/h1\u003e\n\u003cp\u003eThe standard Go distribution includes a Go syntax file for Vim in \u003ccode\u003ego/misc/vim/\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"installation-instructions\"\u003eInstallation Instructions\u003c/h2\u003e\n\u003cp\u003ePlace \u003ccode\u003e$GOROOT/misc/vim/syntax/go.vim\u003c/code\u003e in \u003ccode\u003e~/.vim/syntax/\u003c/code\u003e and put the following in \u003ccode\u003e~/.vim/ftdetect/go.vim\u003c/code\u003e:\u003c/p\u003e\n\u003cp\u003e在go的安装目录里有/misc/vim/syntax 他 /misc/vim/ftdetect 两个目录,将里面的文件复制到~/.vim/相应的目录里即可。\u003c/p\u003e\n\u003cp\u003eau BufRead,BufNewFile *.go set filetype=go\u003c/p\u003e\n\u003ch2 id=\"extras-and-alternative-files\"\u003eExtras and Alternative Files\u003c/h2\u003e\n\u003cp\u003eAn alternative indent file for Vim by Alecs King can be found \u003ca href=\"http://go-lang.cat-v.org/text-editors/vim/go-indent.vim\"\u003ehere\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"autocompletion\"\u003eAutocompletion\u003c/h2\u003e\n\u003cp\u003eThe \u003ca href=\"http://github.com/nsf/gocode\"\u003egocode\u003c/a\u003e daemon by nsf includes a vim script …\u003c/p\u003e"
October 3, 2013
ZeroMQ的模式-Publish-Subscribe[转]
"\u003cp\u003e\u003cstrong\u003ePublish-subscribe Pattern\u003c/strong\u003e:发布订阅模式。\u003c/p\u003e\n\u003cp\u003e现实中,并不是所有请求都期待答复,而不期待答复,自然就没有了状态。所以相对于REQ-REP,PUB-SUB模式容易理解也简单得多。广播听过吧?收音机用过吧?就这个意思。\u003c/p\u003e\n\u003cp\u003e相应地,该模式下的socket也就两种:ZMQ_PUB \u0026amp; ZMQ_SUB。 分别对应电台和收音机。\u003c/p\u003e\n\u003ch1 id=\"toc9\"\u003eZMQ_PUB\u003c/h1\u003e\n\u003cp\u003eZMQ_PUB主要用来让消息发布者用来散发消息的。所有连接上的peer都能收到由它散发的消息。 \u003ca href=\"http://api.zeromq.org/2-1:zmq_recv\"\u003ezmq_recv(3)\u003c/a\u003e 这个API是不能用在这个socket上的,原因显而易见。而zmq_send作用在该socket上时是永远不会阻塞的,如果订阅者异常,发出的消息则会被丢弃。\u003c/p\u003e\n\u003cp\u003eSummary of ZMQ_PUB characteristics\u003c/p\u003e\n\u003cp\u003eCompatible peer sockets\n\u003cem\u003eZMQ_SUB\u003c/em\u003e\nDirection\u003c/p\u003e\n\u003cp\u003eUnidirectional\u003c/p\u003e\n\u003cp\u003eSend/receive pattern\u003c/p\u003e\n\u003cp\u003eSend only\u003c/p\u003e\n\u003cp\u003eIncoming routing strategy\u003c/p\u003e\n\u003cp\u003eN/A\u003c/p\u003e\n\u003cp\u003eOutgoing routing strategy …\u003c/p\u003e"
October 3, 2013
ZeroMQ的模式-综述
"\u003cp\u003e通过对 \u003ca href=\"http://zguide.zeromq.org/page:all\"\u003eGuide\u003c/a\u003e 的阅读,可以发现ZeroMQ对这个世界中消息传输的模式进行了很好的抽象。为了描述模式,0mq定义了不同的socket。 0mq socket是0mq世界的东西,跟传统世界的socket是不一样的。\u003c/p\u003e\n\u003cp\u003e我们知道,传统的socket其实就是访问下面两种(TCP \u0026amp; UDP)对象的\u003cstrong\u003e同步\u003c/strong\u003e的接口:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e面向连接的可靠字节流(SOCK_STREAM)\u003c/li\u003e\n\u003cli\u003e无连接的不可靠的数据报文(SOCK_DGRAM)\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e所以你可以说传统socket传输的是字节流或者独立的报文。\u003c/p\u003e\n\u003cp\u003e而0mq的socket传输的是消息(Message)。它是对\u003cstrong\u003e异步_消息_\u003c/strong\u003e\u003cem\u003e队列\u003c/em\u003e(MQ)的一种抽象。官方的原话是:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eØMQ sockets present an abstraction of an asynchronous \u003cem\u003emessage queue\u003c/em\u003e, with the exact queueing semantics depending on the socket type in use.\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e异步\u003c/strong\u003e的意思在这里指的是物理连接的创建、销毁、重连、传输对于用户来说都是透明的,这些东西都由0mq组织好了。它传输的是独立的**\u003cem\u003e消 …\u003c/em\u003e\u003c/p\u003e"
October 3, 2013
ZeroMQ的模式-Requset-Reply[转]
"\u003cp\u003e我们先来看看第一种模式:\u003cstrong\u003eRequest-Reply Pattern\u003c/strong\u003e。 请求应答模式。\u003c/p\u003e\n\u003cp\u003eRequest-Reply这个名字很直白,口语点说就是\u003cstrong\u003e一问一答\u003c/strong\u003e。可以使同步的遵循请求序的一问一答,也可以是异步的不按请求序的一问一答;其中也可以包含各种不同的路由策略——让谁来回答。zeromq定义的为这个模式服务的socket有:ZMQ_REQ, ZMQ_REP, ZMQ_ROUTER以及ZMQ_DEALER. 用他们进行合理的组合,就可以实现现实世界中各种不同的请求应答模式。\u003c/p\u003e\n\u003cp\u003e分别来看:\u003c/p\u003e\n\u003ch1 id=\"zmq_req\"\u003eZMQ_REQ\u003c/h1\u003e\n\u003cp\u003eZMQ_REQ做的事情就是\u003cstrong\u003e发问\u003c/strong\u003e,然后\u003cstrong\u003e收答\u003c/strong\u003e。发、收必须是严格按序进行。请求时对对端进行Round Robin,遇到异常则阻塞。官方对这个socket的总结如下:\u003c/p\u003e\n\u003cp\u003eSummary of ZMQ_REQ characteristics\u003c/p\u003e\n\u003cp\u003eCompatible peer sockets\n\u003cem\u003eZMQ_REP\u003c/em\u003e\nDirection\u003c/p\u003e\n\u003cp\u003eBidirectional\u003c/p\u003e\n\u003cp\u003eSend/receive pattern\u003c/p\u003e\n\u003cp\u003eSend, Receive, Send, Receive, …\u003c/p\u003e\n\u003cp\u003eOutgoing routing strategy …\u003c/p\u003e"
October 3, 2013
ZeroMQ的模式-Pipeline[转]
"\u003cp\u003e\u003cstrong\u003ePipeline pattern\u003c/strong\u003e 管道模式。\u003c/p\u003e\n\u003cp\u003e这种模式描述的场景是数据被散布到以管道方式组织的各个节点上。管道的每一步都连接一个或多个节点,连接多个节点时数据以RR方式往下流。\u003c/p\u003e\n\u003cp\u003e注意是\u003cstrong\u003e流\u003c/strong\u003e,意味着数据跟发布模式一样是单向的。这个模式对应的socket是ZMQ_PUSH和ZMQ_PULL.\u003c/p\u003e\n\u003ch1 id=\"zmq_push\"\u003eZMQ_PUSH\u003c/h1\u003e\n\u003cp\u003e用来向下游节点发消息。下游多个节点时采取RoundRobin分发,_zmq_recv()_对于这个socket也是无效的。\u003c/p\u003e\n\u003cp\u003e与Pub不同的是,当下游节点达到高水位(HWM)或者根本没有下游节点时,_zmq_send()_就阻塞了,消息并不丢失。\u003c/p\u003e\n\u003cp\u003eSummary of ZMQ_PUSH characteristics\u003c/p\u003e\n\u003cp\u003eCompatible peer sockets\n\u003cem\u003eZMQ_PULL\u003c/em\u003e\nDirection\u003c/p\u003e\n\u003cp\u003eUnidirectional\u003c/p\u003e\n\u003cp\u003eSend/receive pattern\u003c/p\u003e\n\u003cp\u003eSend only\u003c/p\u003e\n\u003cp\u003eIncoming routing strategy\u003c/p\u003e\n\u003cp\u003eN/A\u003c/p\u003e\n\u003cp\u003eOutgoing routing strategy\u003c/p\u003e\n\u003cp\u003eRound-robin\u003c/p\u003e\n\u003cp\u003eZMQ_HWM option action\u003c/p\u003e\n\u003cp\u003eBlock …\u003c/p\u003e"
October 2, 2013
gozmq的安装与使用教程(zeromq分布式消息队列+golang)
"\u003cp\u003e实现功能:用go实现消息队列的写入与读取(打算用在发送邮件服务)\u003c/p\u003e\n\u003cp\u003e环境工具:\nCentos 64X 6.4\nzeromq 3.2.4: \u003ca href=\"http://www.zeromq.org\"\u003ezeromq.org\u003c/a\u003e\ngolang: \u003ca href=\"http://golang.org/\"\u003ehttp://golang.org/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一.安装golang( \u003ca href=\"http://golang.org/doc/install\"\u003ehttp://golang.org/doc/install\u003c/a\u003e)\u003c/strong\u003e\n这一步很简单,只需要从 \u003ca href=\"http://code.google.com/p/go/downloads\"\u003ehttp://code.google.com/p/go/downloads\u003c/a\u003e 下载到服务器,解压到/usr/local/go目录,再设置一下系统变量就可以了.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ewget https://go.googlecode.com/files/go1.1.2.linux-amd64.tar.gz\ntar -C /usr/local -xzf go1.1.2.linux-amd64.tar.gz\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e设置系统变量GOROOT\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eAdd \u003ccode\u003e/usr/local/go/bin\u003c/code\u003e to the \u003ccode\u003ePATH\u003c/code\u003e environment variable. You can do this by adding this line to your \u003ccode\u003e/etc/profile\u003c/code\u003e (for a system-wide …\u003c/p\u003e"
August 23, 2013
Git 常用命令详解(二)
"\u003ch3 id=\"git-community-book-中文版\"\u003e\u003ca href=\"http://gitbook.liuhui998.com/index.html\"\u003eGit Community Book 中文版\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eGit 是一个很强大的分布式版本管理工具,它不但适用于管理大型开源软件的源代码(如: \u003ca href=\"http://git.kernel.org/\"\u003elinux kernel\u003c/a\u003e),管理私人的文档和源代码也有很多优势(如: \u003ca href=\"http://code.google.com/p/wsi-lgame-pro/\"\u003ewsi-lgame-pro\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eGit 的更多介绍,请参考我的上一篇博客: \u003ca href=\"http://blog.csdn.net/sunboy_2050/article/details/7527877\"\u003eGit 版本管理工具\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、 Git 命令初识\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在正式介绍Git命令之前,先介绍一下Git 的基本命令和操作,对Git命令有一个总体的认识\u003c/p\u003e\n\u003cp\u003e示例:从Git 版本库的初始化,通常有两种方式:\u003c/p\u003e\n\u003cp\u003e1)git clone:这是一种较为简单的初始化方式,当你已经有一个远程的Git版本库,只需要在本地克隆一份\u003c/p\u003e\n\u003cp\u003e例如:git clone git://github.com/someone/some_project.git some_project\u003c/p\u003e\n\u003cp\u003e上面的命令就是将’git://github.com/someone/some_project.git’这个URL地址的远程版本库,完全克隆到本地some_project目录下\u003c/p\u003e\n\u003cp\u003e2)git init 和 git remote:这种方式稍微复杂一些,当你本地创建了一个工作目录,你可以进 …\u003c/p\u003e"
August 12, 2013
golang中结构体的初始化方法的不同用法(new方法)
"\u003cp\u003e自定义一个结构体\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003etype Rect struct {\n x, y float64\n width, height float64\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e初始化方法:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003erect1 := new(Rect)\nrect2 := \u0026amp;Rect{}\nrect3 := \u0026amp;Rect{0, 0, 100, 200}\nrect4 := \u0026amp;Rect{width:100, height:200}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e注意这几个变量全部为指向Rect结构的指针(\u003cstrong\u003e指针变量\u003c/strong\u003e),因为使用了new()函数和\u0026amp;操作符。\u003c/p\u003e\n\u003cp\u003e而如果使用方法\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ea := Rect{}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e则表示这个是一个Rect{}\u003cstrong\u003e结构类型\u003c/strong\u003e.两者是不一样的.参考代码:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003efunc main() {\na := Rect{}\na.x = 15\n\nrect1 := \u0026amp;Rect{0, 0, 100, 200}\nrect1.x = 10\n\nfmt.Printf(\u0026#34;%v\\n%T\\n\u0026#34;, a, a)\nfmt.Printf(\u0026#34;%v\\n%T\\n\u0026#34;, rect1, rect1)\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e运行结果为:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e{15 0 0 0}\n main.Rect …\u003c/code\u003e\u003c/pre\u003e"
August 11, 2013
golang中的文档管理
"\u003cp\u003efoo.go\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e// CopyRight 2013 The Go Author. All Right reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE fifle.\n\n/*\nPackage foo implements a set of simple mathematical functions. These comments are for\ndemonstration purpose only. Nothing more.\n\nIf you have any questions,please don’t hesitate to add yourself to\ngolang-uns@googlegroups.com.\n\nyou can alse visit golang.org for full Go documentation.\n*/\n\npackage foo\n\nimport (\n\t\u0026#34;fmt\u0026#34;\n)\n\n// …\u003c/code\u003e\u003c/pre\u003e"
August 11, 2013
golang中的map数据类型操作实例
"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport (\n\t\u0026#34;fmt\u0026#34;\n)\n\ntype stu struct {\n\tName string\n\tAge int\n}\n\nfunc main() {\n\n\t// 声明一个map变量student,键名为string,值为stu\n\tvar student map[string]stu\n\n\t// 给map变量创建值,同时指定最多可以存储5个stu值\n\tstudent = make(map[string]stu, 5)\n\n\t// map元素赋值\n\tstudent[\u0026#34;stu1\u0026#34;] = stu{\u0026#34;zhao\u0026#34;, 25}\n\tstudent[\u0026#34;stu2\u0026#34;] = stu{\u0026#34;zhang\u0026#34;, 28}\n\tstudent[\u0026#34;stu3\u0026#34;] = stu{\u0026#34;sun\u0026#34;, 32}\n\tstudent[\u0026#34;stu4\u0026#34;] = stu{\u0026#34;li\u0026#34;, 40}\n\tstudent[\u0026#34;stu5\u0026#34;] = stu{}\n\n\t//上面方式的简写方法\n\t/* …\u003c/code\u003e\u003c/pre\u003e"
August 9, 2013
go语言单元测试
"\u003cp\u003eGo本身提供了一套轻量级的测试框架.符合规则的测试代码会在运行测试时被自动识别并执行.单元测试源文件的命名规则如平衡点:在需要测试的包下面创建以”_test”结尾的go文件,开如[^.]*_test.go\u003c/p\u003e\n\u003cp\u003eGo单元测试函数分为两在类.\u003cstrong\u003e功能测试函数\u003c/strong\u003e和\u003cstrong\u003e性能测试函数\u003c/strong\u003e,分别以Test和Benchmark为函数名前缀并以*testing.T 和 *testing.B 为单一参数的函数。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003efunc TestAdd1(t *testing.T)\nfunc BenchmarkAdd1(t *testing.T)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e测试工具会根据函数中的实际执行动作得到不同的测试结果。\u003c/p\u003e\n\u003cp\u003e功能测试函数会根据测试代码执行过程中是否发生错误来反馈结果;\n性能测试函数仅仅打印出来测试所花费时间,用来判断程序性能;\u003c/p\u003e\n\u003ch1 id=\"准备\"\u003e准备\u003c/h1\u003e\n\u003cp\u003e新建一个文件,命名为 go_test.go\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage go_test\n\nimport \u0026#34;testing\u0026#34;\n\nfunc Add(a, b int) int {\n return a + b\n}\n\u003c/code\u003e\u003c/pre\u003e\u003ch1 id=\"功能测试\"\u003e功能测试\u003c/h1\u003e\n\u003cp\u003e在go_test.go文件里添加以下代码\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003efunc TestAdd1(t …\u003c/code\u003e\u003c/pre\u003e"
August 7, 2013
安装hg命令
"\u003cp\u003e在使用golang开发的时候,有些时间github.com上面的包需要执行hg命令(hg命令简介).这个时候就需要安装一下才可以.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eLinux下安装Mercurial(hg):\u003c/strong\u003e\u003c/p\u003e\n\u003ch1 id=\"安装mercurial\"\u003e安装Mercurial\u003c/h1\u003e\n\u003cp\u003e在进行后面的操作之前需要安装Mercurial( \u003ca href=\"http://baike.baidu.com/view/1094619.htm\"\u003e百科\u003c/a\u003e)版本管理系统(可以输出hg名词检测是否安装)。输入以下命令安装:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo easy_install mercurial\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e对于 Ubuntu/Debian 系统,easy_install 命令可以用\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eapt-get install python-setuptools python-dev build-essential\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e安装。 如果上述命令安装失败的话,还可以尝试去官方网站 \u003ca href=\"http://mercurial.selenic.com/wiki/Download\"\u003e下载\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWindows下安装\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e国内国度网盘下载(32位): \u003ca href=\"http://pan.baidu.com/share/link?shareid=3528053518\u0026amp;uk=2365864479\"\u003ehttp://pan.baidu.com/share/link?shareid=3528053518\u0026amp;uk=2365864479\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e(64位): \u003ca href=\"http://pan.baidu.com/share/link?shareid=3560201274\u0026amp;uk=2365864479\"\u003ehttp://pan.baidu.com/share/link?shareid=3560201274\u0026amp;uk=2365864479\u003c/a\u003e\u003c/p\u003e"
July 23, 2013
exec: “pkg-config”: executable file not found in %PATH% 的解决办法
"\u003cp\u003e在windows下要用 \u003ca href=\"http://blog.haohtml.com/tag/golang\"\u003egolang\u003c/a\u003e 实现操作 \u003ca href=\"http://blog.haohtml.com/tag/zeromq\"\u003ezeromq\u003c/a\u003e 消息队列,发现在sublime下进行\u003c/p\u003e\n\u003cp\u003ego get -tags zmq_3_x github.com/alecthomas/gozmq\u003c/p\u003e\n\u003cp\u003e操作的时候,提示\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# pkg-config –cflags libzmq libzmq libzmq libzmq\nexec: “pkg-config”: executable file not found in %PATH%\nexit status 2\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e原因是因为没有安装pkg-config.需要手动安装,并设置一下环境变量.pkg-config下载地址: \u003ca href=\"http://ftp.acc.umu.se/pub/gnome/binaries/win32/dependencies/pkg-config_0.23-3_win32.zip\"\u003ehttp://ftp.acc.umu.se/pub/gnome/binaries/win32/dependencies/pkg-config_0.23-3_win32.zip\u003c/a\u003e ( \u003ca href=\"http://ftp.acc.umu.se/pub/gnome/binaries/win64/dependencies/pkg-config_0.23-2_win64.zip\"\u003ehttp://ftp.acc.umu.se/pub/gnome/binaries/win64/dependencies/pkg-config_0.23-2_win64.zip\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003e如果无法下载,直接打开所在的目录,找到合适的软件包下载.然后将包里bin目录里 …\u003c/p\u003e"
July 23, 2013
用golang发送邮件
"\u003cp\u003e配置文件 \u003ccode\u003econf.json\u003c/code\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e{\n\u0026#34;Username\u0026#34;: \u0026#34;sunxxg@163.com\u0026#34;,\n\u0026#34;Password\u0026#34;: \u0026#34;123456\u0026#34;,\n\u0026#34;Smtphost\u0026#34;:\u0026#34;smtp.163.com:25\u0026#34;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e主程序 sendmail.go\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport (\n\t\u0026#34;encoding/json\u0026#34;\n\t\u0026#34;fmt\u0026#34;\n\t\u0026#34;io\u0026#34;\n\t\u0026#34;log\u0026#34;\n\t\u0026#34;net/smtp\u0026#34;\n\t\u0026#34;os\u0026#34;\n\t\u0026#34;strings\u0026#34;\n)\n\ntype cfgmail struct {\n\tUsername string\n\tPassword string\n\tSmtphost string\n}\n\ntype cfg struct {\n\tName, Text string\n}\n\nfunc main() {\n\n\t// 从json文件中读取发送邮件服务器配置信息\n\tcfgjson := getConf()\n\n\tvar …\u003c/code\u003e\u003c/pre\u003e"
July 8, 2013
Linux下安装php开发框架yaf
"\u003cp\u003e\u003ca href=\"https://github.com/laruence/php-yaf\"\u003ehttps://github.com/laruence/php-yaf\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eyaf框架中文手册:\u003c/p\u003e\n\u003cp\u003eyaf手册:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.下载并安装yaf扩展\u003c/strong\u003e \u003ca href=\"http://pecl.php.net/package/yaf\"\u003ehttp://pecl.php.net/package/yaf\u003c/a\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#wget http://pecl.php.net/get/yaf-2.2.9.tgz\n#tar zxvf yaf-2.2.9.tgz\n#cd yaf-2.2.9\n\n[root@bogon yaf-2.2.9]# whereis phpize\nphpize: /usr/bin/phpize /usr/share/man/man1/phpize.1.gz\n/usr/bin/phpize\n\n[root@bogon yaf-2.2.9]# /usr/bin/phpize\nConfiguring for:\nPHP Api Version: 20090626\nZend Module Api No: 20090626\nZend Extension Api No: 220090626\n#whereis php-config\nphp-config: /usr/bin/php-config …\u003c/code\u003e\u003c/pre\u003e"
June 18, 2013
测试golang中的多核多线程
"\u003cp\u003e“并发 (concurrency)” 和 “并行 ( parallelism)” 是不同的。在单个 CPU 核上,线程通过时间片或者让出控制权来实现任务切换,达到 “同时” 运行多个任务的⺫的,这就是所谓的并发。但实际上任何时刻都只有一个任务被执行,其他任务通过某种算法来排队。\u003c/p\u003e\n\u003cp\u003e多核 CPU 可以让同个进程内的 “多个线程” 做到真正意义上的同时运,它们之间不需要排队 (依然会发生排队,因为线程数量可能超出 CPU 核数量,还有其他的进程等等。这里说的是一个理想状况),这才是并行。除了多核,并行计算还可能是多台机器上部署运行。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport (\n\u0026#34;fmt\u0026#34;\n\u0026#34;runtime\u0026#34;\n)\n\nfunc test(c chan bool, n int) {\n\nx := 0\nfor i := 0; i \u0026lt; 1000000000; i++ {\nx += i\n}\n\nprintln(n, x)\n\nif n == 9 {\nc \u0026lt;- true\n}\n}\n\nfunc main() {\nruntime.GOMAXPROCS(1) //设置cpu …\u003c/code\u003e\u003c/pre\u003e"
June 17, 2013
golang中的Array 、Slices 和 Maps
"\u003cp\u003e**注意\u003ccode\u003eslice\u003c/code\u003e和数组在声明时的区别:**声明数组时,方括号内写明了数组的长度或使用\u003ccode\u003e...\u003c/code\u003e自动计算长度,而声明\u003ccode\u003eslice\u003c/code\u003e时,方括号内没有任何字符。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003earr1 := [10]int{1,2,3,4} //数组,长度为10,只有4个元素指定,其它的元素值默认为0\narr2 := [...]string{\u0026#34;a\u0026#34;,\u0026#34;b\u0026#34;,\u0026#34;c\u0026#34;} //数组,长度自适应,这里长度为3\ns1 := []int{1,2,3,4} //slice,目前长度为4,可能通过append来动态添加元素个数\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e示例:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport (\n \u0026#34;fmt\u0026#34;\n)\n\nfunc main() {\n\n//array example\n arr := [10]int{1, 2, 3} //array 指定前三个值,其它值使用默认类型值0\n fmt.Println(len(arr))\n fmt.Println(arr)\n //a1 := append(arr, 4, 5) //数组不支持append,只有slice才支持append …\u003c/code\u003e\u003c/pre\u003e"
June 4, 2013
golang中包的用法
"\u003cp\u003e将d:/gotest/ 目录加入到GOPATH中.这里会涉及到包和结构体还有一些方法的用法,可以再深入的了了解一下\u003c/p\u003e\n\u003cp\u003e注意一下一些struct和 func 名称的大小写问题.\u003c/p\u003e\n\u003cp\u003e首先要在 \u003cstrong\u003e$GOPATH/src\u003c/strong\u003e 目录里创建一个包名目录,这里包名目录为stu,与文件名一样(也可以不一样),大概流程参考:\n\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/06/GO_package.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/GO_package.png\" alt=\"GO_package\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ed:/gotest/src/main/main.go\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport (\n\u0026#34;fmt\u0026#34;\n\u0026#34;stu\u0026#34;\n)\n\nfunc main() {\n\n//sxf := new(stu.Stu)\nsxf := \u0026amp;stu.Stu{}\n\nsxf.SetName(\u0026#34;zhangli\u0026#34;)\na := sxf.GetName()\n\nfmt.Println(a)\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003ed:/gotest/src/stu/stu.go\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage stu\n\ntype Stu struct {\n\tname string\n\t//age int\n}\n\nfunc (s *Stu) SetName(name string) {\n\ts.name = name\n} …\u003c/code\u003e\u003c/pre\u003e"
May 20, 2013
mysql 根据英文首字母来查询汉字函数
"\u003cp\u003egbk编码:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emysql\u0026gt; SELECT *,\n -\u0026gt; ELT(INTERVAL(CONV(HEX(left(A_UserName,1)),16,10),\n -\u0026gt; 0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7,0\nxBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB,0xC8F6,0xCBFA,0xCDDA,0xCE\nF4,0xD1B9,0xD4D1),\n -\u0026gt; \u0026#39;A\u0026#39;,\u0026#39;B\u0026#39;,\u0026#39;C\u0026#39;,\u0026#39;D\u0026#39;,\u0026#39;E\u0026#39;,\u0026#39;F\u0026#39;,\u0026#39;G\u0026#39;,\u0026#39;H\u0026#39;,\u0026#39;J\u0026#39;,\u0026#39;K\u0026#39;,\u0026#39;L\u0026#39;,\u0026#39;M\u0026#39;,\u0026#39;N\u0026#39;,\u0026#39;O\u0026#39;,\u0026#39;P\u0026#39;,\u0026#39;Q\u0026#39;, …\u003c/code\u003e\u003c/pre\u003e"
April 23, 2013
golang中实现自定义数据类型struct
"\u003cp\u003e可以参考: \u003ca href=\"http://blog.haohtml.com/archives/13556\"\u003egolang中的函数\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003efunc.go\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003epackage\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003emain\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e (\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;fmt\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003etype\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003estu\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003eName\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e//首字母大写,允许其它包直接使用,可以直接使用 stu.Name = \u0026#39;test\u0026#39; 也可以使用 setName和getName\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003eage\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e//不允许外面的包使用,可以使用 setAge和getAge方法\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003efunc\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003emain\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003eperl\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e:=\u003c/span\u003e new(\u003cspan style=\"color:#a6e22e\"\u003estu\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003eperl\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eName\u003c/span\u003e = \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;zhang\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e// age\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003esetAge\u003c/span\u003e(\u003cspan style=\"color:#a6e22e\"\u003eperl\u003c/span\u003e, \u003cspan style=\"color:#ae81ff\"\u003e30\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003eage\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003egetAge\u003c/span\u003e(\u003cspan style=\"color:#a6e22e\"\u003eperl\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003efmt\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;%v\\n\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#a6e22e\"\u003eage\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e//name\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003evar\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003ename\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estring\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003eperl\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esetName\u003c/span\u003e(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;sun\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003ename\u003c/span\u003e = \u003cspan style=\"color:#a6e22e\"\u003eperl\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003egetName\u003c/span\u003e()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003efmt\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;%i\\n\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#a6e22e\"\u003ename\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e//print struct\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003efmt\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;%v\\n\u0026#34;\u003c/span\u003e, …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
February 27, 2013
在zend stuido下使用git插件教程
"\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/archives/13679\"\u003e上一节zend stuido下安装了git软件插件\u003c/a\u003e。下面我们来讲一下git插件的使用方法.\u003c/p\u003e\n\u003cp\u003e由于我们目前已经创建好了git项目。所以这里只介绍直接从现成的git项目仓库导入.\u003c/p\u003e\n\u003cp\u003e选择菜单”文件(File)”-\u0026gt;”Import”\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/02/zendstudio-git-guide-1.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/zendstudio-git-guide-1.png\" alt=\"zendstudio-git-guide-1\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/02/zendstudio-git-guide-2.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/zendstudio-git-guide-2.png\" alt=\"zendstudio-git-guide-2\"\u003e\u003c/a\u003e \u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/02/zendstudio-git-guide-3.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2013/02/zendstudio-git-guide-3.png\" alt=\"zendstudio-git-guide-3\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e点击”Browse…”选择存放git的目录,然后点击”Search”按钮这样就可以读取一些git配置信息,并在上面显示出来项目目录下的所有文件.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/02/zendstudio-git-guide-4.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/zendstudio-git-guide-4.png\" alt=\"zendstudio-git-guide-4\"\u003e\u003c/a\u003e \u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/02/zendstudio-git-guide-5.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2013/02/zendstudio-git-guide-5.png\" alt=\"zendstudio-git-guide-5\"\u003e\u003c/a\u003e最后一步是选择当前项目的名字,这个随便起的。最后点击”Finish”按钮就可以了。\u003c/p\u003e\n\u003cp\u003e这时在IDE左侧会看到项目名字及项目结构信息。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/02/zendstudio-git-guide-6.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/zendstudio-git-guide-6.png\" alt=\"zendstudio-git-guide-6\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e下面可以修改一个文件,然后在左侧的导航里选择修改的文件,右键点击,选择”Team” 菜单,再选择”Commit”菜单,会弹出一个对话框,在”Commit message”对话框时里输入提示备注信息。点击”Commit”按钮就可以了。\u003c/p\u003e"
February 27, 2013
zend studio 安装git插件
"\u003cp\u003e搞php的用zend studio这个ide工具的开发人员应该不在少数,而对于我们团队开发使用svn和git版本控制软件也特别多的。我们公司团队使用的是zendstuido 10与git这两个软件。但默认情况下zendstuido并不支持git这个插件的,这个时候需要我们来手动安装git插件。方法如下:\u003c/p\u003e\n\u003cp\u003ezend studio菜单:Help -\u0026gt; Install new software…\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/02/zendstudio_install_git_plugins.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/zendstudio_install_git_plugins.png\" alt=\"zendstudio_install_git_plugins\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/02/zendstudio_install_git_plugins_detail.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/zendstudio_install_git_plugins_detail.png\" alt=\"zendstudio_install_git_plugins_detail\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e下一步会提示一些是否授受协议之类的。直接选择 我同意(i agree)就可以了。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/archives/13689\"\u003e下面我们来讲一下如何在zend stuido下使用git插件\u003c/a\u003e\u003c/p\u003e"
December 31, 2012
golang中的函数
"\u003cp\u003e函数是构建Go程序的基础部件;所遇有趣的事情都是在它其中发生的。函数\n的定义看起来像这样:\nListing 3.1. 函数定义\u003c/p\u003e\n\u003cp\u003etype mytype int 新的类型,参阅第 5 章\n\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2012/12/golang-func.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2012/12/golang-func.png\" alt=\"golang-func\"\u003e\u003c/a\u003e\n0 保留字func用于定义一个函数;\u003c/p\u003e\n\u003cp\u003e1 函数可以定义用于特定的类型,这类函数更加通俗的称呼是method。这\n部分称作receiver而它是可选的(可参考: \u003ca href=\"http://blog.haohtml.com/archives/13766\"\u003ehttp://blog.haohtml.com/archives/13766\u003c/a\u003e)。如下图:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2012/12/golang-struct-func.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2012/12/golang-struct-func.png\" alt=\"golang-struct-func\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e2 funcname是你函数的名字;\n3 int类型的变量q作为输入参数。参数用pass-by-value方式传递,意味着它\n们会被复制;\n4 变量r和s是这个函数的命名返回值。在Go的函数中可以返回多个值。\n参阅第32页的“多值返回”。如果不想对返回的参数命名,只需要提供类\n型:(int,int)。如果只有一个返回值,可以省略圆括号。如果函数是一\n个子过程,并且没有任何返回值,也可以省略这些内容;\n5 这是函数体,注意return是一个语句,所以包裹参数的括号是可选的。\u003c/p\u003e\n\u003cp\u003e这里有两个例子,左边的函数没有返回值,右边的只是简单的将输入返回。 …\u003c/p\u003e"
December 27, 2012
[golang]将函数作为值
"\u003cp\u003e就像其它在Go中的几乎所有的东西,函数也同样是值而已.它们可以像下面这样赋值给变量:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003epackage\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003emain\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;fmt\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003efunc\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003emain\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#a6e22e\"\u003ef\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efunc\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t \u003cspan style=\"color:#a6e22e\"\u003efmt\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ePrintln\u003c/span\u003e(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;func\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#75715e\"\u003e// 下面才开始调用函数\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#a6e22e\"\u003ef\u003c/span\u003e()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e结果会打印出 func 字符串。\u003c/p\u003e\n\u003cp\u003e另一种用法是立即调用函数,但是要求匿名函数要有返回值才可以,不然会提示错误信息.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2012/12/golang_func.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/golang_func.jpg\" alt=\"golang_func\"\u003e\u003c/a\u003e\u003c/p\u003e"
December 15, 2012
windows 下搭建 GoLang 语言开发环境
"\u003cp\u003egolang官方二进制分发包包括FreeBSD, Linux, Mac OS X (Snow Leopard/Lion), and Windows等平台,包括32位、64位等版本。\u003c/p\u003e\n\u003cp\u003e我自己使用的是windows 32位分发包,MSI格式的,下载地址为: \u003ca href=\"http://code.google.com/p/go/downloads/list\"\u003ehttp://code.google.com/p/go/downloads/list\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003egolang支持交叉编译,也就是说你在32位平台的机器上开发,可以编译生成64位平台上的可执行程序。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e环境变量说明:\u003c/strong\u003e\n$GOROOT 指向golang安装之后的根目录,windows平台下默认为c:\\go,会在安装过程中由安装程序自动写入系统环境变量。\n$GOARCH 目标平台(编译后的目标平台)的处理器架构(386、amd64、arm)\n$GOOS 目标平台(编译后的目标平台)的操作系统(darwin、freebsd、linux、windows)\n$GOBIN 指向安装之后根目录下的bin目录,即$GOROOT/bin,windows平台下默认为c:\\go\\bin,会在安装过程中由安装程序自动添加到PATH变量中\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e配 …\u003c/strong\u003e\u003c/p\u003e"
December 8, 2012
PHP类中static 和self的使用区别
"\u003cp\u003e摘自: \u003ca href=\"http://php.net/manual/en/language.oop5.late-static-bindings.php\"\u003ehttp://php.net/manual/en/language.oop5.late-static-bindings.php\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"limitations-ofself\"\u003eLimitations of \u003cem\u003eself::\u003c/em\u003e\u003c/h3\u003e\n\u003cp\u003eStatic references to the current class like \u003cem\u003eself::\u003c/em\u003e or \u003cem\u003e\u003cstrong\u003eCLASS\u003c/strong\u003e\u003c/em\u003e are resolved using the class in which the function belongs, as in where it was defined:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eExample #1 \u003cem\u003eself::\u003c/em\u003e usage\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e\u0026lt;code\u0026gt;\u0026lt;?php\u0026lt;br /\u0026gt; class A {\u0026lt;br /\u0026gt; public static function who() {\u0026lt;br /\u0026gt; echo __CLASS__;\u0026lt;br /\u0026gt; }\u0026lt;br /\u0026gt; public static function test() {\u0026lt;br /\u0026gt; self::who();\u0026lt;br /\u0026gt; }\u0026lt;br /\u0026gt; }\u003c/code\u003e class B …\u003c/p\u003e"
November 19, 2012
Ajax getjson 跨域通信 php+jquery
"\u003cp\u003e\u003cstrong\u003e网站A的表单提交部分:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e网站B的输出json部分:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e$_GET[‘jsoncallback’] . ‘(‘ . json_encode($return) . ‘)‘);\u003c/p\u003e\n\u003cp\u003e?\u0026gt;\u003c/p\u003e"
November 1, 2012
windows下node.js之 express框架+jade模板搭建
"\u003cp\u003e1、node.js安装\u003c/p\u003e\n\u003cp\u003e在Windows平台部署Node.js比较容易,从0.6.1开始,Node.js在Windows平台上可直接通过.mis文件安装。\u003c/p\u003e\n\u003cp\u003e下载地址 \u003ca href=\"http://nodejs.org/#download\"\u003ehttp://nodejs.org/#download\u003c/a\u003e 目前最新版本是 node-v0.8.3-x86.msi\u003c/p\u003e\n\u003cp\u003e文件在安装过程中已经指定了默认安装路径。\u003c/p\u003e\n\u003cp\u003e验证node.js 安装是否成功\u003c/p\u003e\n\u003cp\u003e打开cmd,直接输入\u003cstrong\u003enode -v\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e2.npm安装\u003c/p\u003e\n\u003cp\u003enode安装成功后npm已经默认安装,npm可以直接安装相关扩展\u003c/p\u003e\n\u003cp\u003e验证npm是否安装成功\u003c/p\u003e\n\u003cp\u003e打开cmd,直接输入\u003cstrong\u003enpm**** -v\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e3.express安装\u003c/p\u003e\n\u003cp\u003e打开cmd,直接输入\u003cstrong\u003enpm install -g express\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e-g:在当前目录下安装express框架\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2012/11/install_express_on_windows_for_nodejs.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2012/11/install_express_on_windows_for_nodejs.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e验证express是否安装成功\u003c/p\u003e\n\u003cp\u003e安装完成后,关闭cmd,在重新打开\u003c/p\u003e\n\u003cp\u003e进入cmd,直接输入\u003cstrong\u003eexpress -V\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e注意我这里用的大写V\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e4.用express创建项目\u003c/p\u003e\n\u003cp\u003e1).cmd进入要创建项目的目录,直接输入 express testapp(项目名称)\u003c/p\u003e\n\u003cp\u003e2)cd testapp //进入刚新建的站点目录\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3)cmd app …\u003c/strong\u003e\u003c/p\u003e"
September 12, 2012
百度地图API如何给自定义覆盖物添加事件
"\u003cp\u003e摘要:\u003c/p\u003e\n\u003cp\u003e给marker、lable、circle等Overlay添加事件很简单,直接addEventListener即可。那么,自定义覆盖物的事件应该如何添加呢?我们一起来看一看~\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、定义构造函数并继承Overlay\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e//定义自定义覆盖物的构造函数\u003c/li\u003e\n\u003cli\u003efunctionSquareOverlay(center, length, color){\u003c/li\u003e\n\u003cli\u003ethis._center = center;\u003c/li\u003e\n\u003cli\u003ethis._length = length;\u003c/li\u003e\n\u003cli\u003ethis._color = color;\u003c/li\u003e\n\u003cli\u003e}\u003c/li\u003e\n\u003cli\u003e//继承API的BMap.Overlay\u003c/li\u003e\n\u003cli\u003eSquareOverlay.prototype = newBMap.Overlay();\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003e二、初始化自定义覆盖物\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e//实现初始化方法\u003c/li\u003e\n\u003cli\u003eSquareOverlay.prototype.initialize = function(map){\u003c/li\u003e\n\u003cli\u003e//保存map对象实例\u003c/li\u003e\n\u003cli\u003ethis._map = map;\u003c/li\u003e\n\u003cli\u003e//创建div元素,作为自定义覆盖物的容器\u003c/li\u003e\n\u003cli\u003evardiv = document.createElement(“div”);\u003c/li\u003e\n\u003cli\u003ediv.style.position = …\u003c/li\u003e\u003c/ol\u003e"
September 7, 2012
数据类型和Json格式
"\u003col\u003e\n\u003cli\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e前几天,我才知道有一种简化的数据交换格式,叫做 \u003ca href=\"http://www.yaml.org/\"\u003eyaml\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e我翻了一遍它的 \u003ca href=\"http://www.yaml.org/spec/\"\u003e文档\u003c/a\u003e,看懂的地方不多,但是有一句话令我茅塞顿开。\u003c/p\u003e\n\u003cp\u003e它说, \u003cstrong\u003e从结构上看,所有的数据(data)最终都可以分解成三种类型\u003c/strong\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e第一种类型是 \u003cstrong\u003e标量\u003c/strong\u003e(scalar),也就是一个单独的字符串(string)或数字(numbers),比如”北京”这个单独的词。\u003c/p\u003e\n\u003cp\u003e第二种类型是 \u003cstrong\u003e序列\u003c/strong\u003e(sequence),也就是若干个相关的数据按照一定顺序并列在一起,又叫做数组(array)或列表(List),比如”北京,上海”。\u003c/p\u003e\n\u003cp\u003e第三种类型是 \u003cstrong\u003e映射\u003c/strong\u003e(mapping),也就是一个名/值对(Name/value),即数据有一个名称,还有一个与之相对应的值,这又称作散列(hash)或字典(dictionary),比如”首都:北京”。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e我恍然大悟,数据构成的最小单位原来如此简单!难怪在编程语言中,只要有了数组(array)和对象(object)就能够储存一切数据了。\u003c/p\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e我马上想到了 \u003ca href=\"http://www.json.org/json-zh.html\"\u003ejson\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e21世纪初,Douglas Crockford寻找一种简便的数据交换格式,能够在服务器之间交换数据。当时通用的数据交换语言是XML,但 …\u003c/p\u003e"
August 14, 2012
Git中gitignore失效的问题
"\u003cp\u003e使用git来管理代码,但发现仓库中加入了.gitignore文件,但并不能解除对.gitignore文件中指定的路径及文件进行忽略。是因为加入.gitignore的之前已经进行过提交,提交中含有要忽略的文件,而这个时候.gitignore 对这些文件是失效的,为了解决这个问题,需要先删除这些中间文件,然后进行一次提交就可以解决这些问题了。\u003c/p\u003e\n\u003cp\u003e在本地仓库将.gitgnore文件里指定的相关文件及路径全部删除,再commit到本机一下。然后执行push到git Server就可以了。这样就可以将git sever上的那些临时文件删除掉。以后再使用的话,产生的文件就不会在提交到git server上去了。\u003c/p\u003e"
August 13, 2012
redmine使用nginx提供服务
"\u003cp\u003e上一节 \u003ca href=\"http://blog.haohtml.com/archives/13282\"\u003ehttp://blog.haohtml.com/archives/13282\u003c/a\u003e 我们介绍了在centos下安装redmine软件的方法,但使用时候需要使用ip:3000 的形式才可以访问,不是太方便,我们习惯使用域名的形式来处理的。这里我们直接使用域名redmine.haohtml.com 来访问. 我们使用的是web server 为 nginx 。\u003c/p\u003e\n\u003cp\u003e我们使用虚拟主机配置文件redmine.conf.内容如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eupstream mongrel{\nserver 127.0.0.1:3000;\n}\n\nserver {\n\nlisten 80;\nserver_name redmine.haohtml.com;\nroot /data/wwwroot/redmine/redmine-2.0.3/public;\nlocation / {\nindex index.php index.html index.shtml;\nproxy_pass http://mongrel;\nproxy_redirect off;\nproxy_set_header Host $host; …\u003c/code\u003e\u003c/pre\u003e"
August 12, 2012
centos安装redmine项目管理系统[教程]
"\u003cp\u003e这里操作系统为Linux Centos5,参考文档: \u003ca href=\"http://www.redmine.org/projects/redmine/wiki/HowTo_install_Redmine_on_CentOS_5\"\u003ehttp://www.redmine.org/projects/redmine/wiki/HowTo_install_Redmine_on_CentOS_5\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"另外网上也有一键安装的软件官方网站为\"\u003e另外网上也有一键安装的软件,官方网站为:\u003c/h3\u003e\n\u003ch3 id=\"ruby--ruby-on-rails--rack\"\u003eRuby \u0026amp; Ruby on Rails \u0026amp; Rack\u003c/h3\u003e\n\u003cp\u003eThe required Ruby and Ruby on Rails versions for a given Redmine version is:\u003c/p\u003e\n\u003cp\u003eRedmine version\u003c/p\u003e\n\u003cp\u003eSupported Ruby versions\u003c/p\u003e\n\u003cp\u003eRequired Rails version\u003c/p\u003e\n\u003cp\u003eSupported RubyGems versions\u003c/p\u003e\n\u003cp\u003ecurrent trunk\u003c/p\u003e\n\u003cp\u003eruby 1.8.7, 1.9.2, 1.9.3, jruby-1.6.7\u003c/p\u003e\n\u003cp\u003eRails 3.2.6\u003c/p\u003e\n\u003cp\u003eRubyGems \u0026lt;= 1.8\u003c/p\u003e\n\u003cp\u003e2.0.3\u003c/p\u003e\n\u003cp\u003eruby 1.8.7, 1.9.2, 1.9.3, jruby-1.6.7\u003c/p\u003e\n\u003cp\u003eRails 3.2.6\u003c/p\u003e\n\u003cp\u003eRubyGems \u0026lt;= 1.8\u003c/p\u003e\n\u003cp\u003e2.0.2\u003c/p\u003e\n\u003cp\u003eruby …\u003c/p\u003e"
August 10, 2012
Redmine局域网访问缓慢问题解决
"\u003cp\u003e笔者查阅网上意见,发现是由于Redmine自带的WebrickWeb发布的问题,需要使用Mongrel组件来替换Webrick。在此放在这里方便大家,形成一套完整的Redmine搭建方案。\u003c/p\u003e\n\u003cp\u003e1. 替换其自带的服务器webrick 为mongrel,方法:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003egem install mongrel\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e如果提示类似“\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ehttp11.c: In function ‘header_done’:\nhttp11.c:172:13: error: ‘struct RString’ has no member named ‘ptr’\nhttp11.c:172:13: error: ‘struct RString’ has no member named ‘ptr’\nhttp11.c:172:13: error: ‘struct RString’ has no member named ‘ptr’\nhttp11.c:174:89: error: ‘struct RString’ has no member named ‘ptr’\nhttp11.c:176:52: error: ‘struct …\u003c/code\u003e\u003c/pre\u003e"
August 10, 2012
Windows下安装Redmine教程
"\u003cp\u003ewindows下的一键安装有:\u003c/p\u003e\n\u003cp\u003e参考网址:\u003c/p\u003e\n\u003cp\u003eRedmine是用Ruby开发的基于web的项目管理软件,是用ROR框架开发的一套跨平台项目管理系统,据说是源于Basecamp的ror版而来,支持多种数据库,有不少自己独特的功能,例如提供wiki、新闻台等,还可以集成其他版本管理系统和BUG跟踪系统,例如SVN、CVS、TD等等。这种 Web 形式的项目管理系统通过“项目(Project)”的形式把成员、任务(问题)、文档、讨论以及各种形式的资源组织在一起,大家参与更新任务、文档等内容来推动项目的进度,同时系统利用时间线索和各种动态的报表形式来自动给成员汇报项目进度。\u003c/p\u003e\n\u003cp\u003e我们这里使用RailsInstaller,Ruby和Rails都集成集中。\u003c/p\u003e\n\u003cp\u003e网址是:下载 \u003ca href=\"http://rubyforge.org/frs/download.php/75894/railsinstaller-2.1.0.exe\"\u003ehttp://rubyforge.org/frs/download.php/75894/railsinstaller-2.1.0.exe\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e安装在e:/盘根目录下。安装成功后目录如下图所示:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2012/08/railsinstaller_folder.gif\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2012/08/railsinstaller_folder.gif\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e1.\u003cstrong\u003e下载 redmine\u003c/strong\u003e(http://www.redmine.org/projects/redmine/wiki/Download) …\u003c/p\u003e"
July 16, 2012
SSH+Git Server on Windows – 在Windows下搭建Git服务器(教程)
"\u003cp\u003e推荐软件: \u003ca href=\"http://www.oschina.net/news/60555/gitstack-2-3-7\"\u003eWindows 的 Git 服务器GitStack\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e会看英文\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e软件需求:\u003c/strong\u003e\n1.windowXP, win7 都测试通过\n2.Copssh_3.1.4_Installer.exe\n3.Git-1.7.3.1-preview20101002.exe\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e搭建git服务器步骤:\u003c/strong\u003e\n1.安装copssh\n1.1 我选择安装路径c:\\ICW,其他选项都选默认.\n1.2 设置环境变量,系统的Path中添加C:\\ICW\\bin\u003c/p\u003e\n\u003cp\u003e1.3 右键 我的电脑,选择 管理,打开 系统工具-\u0026gt;本地用户和组-\u0026gt;用户, 在用户窗口点击右键,选择 新用户,用户 名输入git,密码输入git.\n1.4.选择git用户,右键 选属性, 点击 隶属于-\u0026gt;添加,使git用户被添加到administrator组,并拥有administrator权限.\n1.5 选择 开始-\u0026gt;所有程序-\u0026gt;copssh-\u0026gt;0.1 activate a user,在user name下拉列表中选择刚刚新建的git用户,点击next,输入 Type a passhrase,并记住输入的Type a …\u003c/p\u003e"
July 8, 2012
php下用iconv函数转换字符编码的问题
"\u003cp\u003e昨天在调试 WAP 网站时发现,在增加了 GB2312 到 UTF-8 转化以后,有些页面显示不正常了——有些页面只有一半的内容,另一半被截掉了。因为被截掉的部分包含了\u003c/p\u003e\n\u003cp\u003e的后半个标签\u003c/p\u003e\n\u003cp\u003e,因此整个页面都显示不出来,而报告错误。经过猜测、尝试,最后终于把问题集中在了 iconv 函数上。在经过高人指点以后,发现这个函数的第二个参数,除了可以指定要转化到的编码以外,还可以增加两个后缀://TRANSLIT 和 //IGNORE,其中 //TRANSLIT 会自动将不能直接转化的字符变成一个或多个近似的字符,//IGNORE 会忽略掉不能转化的字符,而默认效果是从第一个非法字符截断。但是我尝试了//TRANSLIT 和 //IGNORE 这两个后缀,效果还是不对。于是我想问题可能不是出在这里。\u003c/p\u003e\n\u003cp\u003e从 GB2312 到 UTF-8 转化应该不会有不能转化的字符,因为 UTF-8 的字符集完全包含了 GB2312 中的字符,所以我想大概是前面要转化的字符集指定错了,于是我尝试着把 GB2312 改成 GBK\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ary=addslashes(iconv(\u0026#34;GB2312\u0026#34;, …\u003c/code\u003e\u003c/pre\u003e"
April 21, 2012
Zend_Filters_Input来实现对密码重复验证
"\u003ch3 id=\"2254-使用-metacommands-来控制过滤器或校验器规则\"\u003e22.5.4. 使用 Metacommands 来控制过滤器或校验器规则\u003c/h3\u003e\n\u003cp\u003e除了声明从字段到过滤器或校验器的映射,你可以在数组声明中指定一些 “metacommands” ,开控制一些 Zend_Filter_Input 的可选的行为。 Metacommands 在给定的过滤器或校验器数组值里以字符串索引条目的形式出现。\u003c/p\u003e\n\u003ch4 id=\"22541the-fields-metacommand\"\u003e22.5.4.1. The \u003ccode\u003eFIELDS\u003c/code\u003e metacommand\u003c/h4\u003e\n\u003cp\u003e如果过滤器或校验器的规则名和需要应用规则的字段名不同,可以用 ‘fields’ metacommand 来指定字段名。\u003c/p\u003e\n\u003cp\u003e可以用类常量 \u003ccode\u003eZend_Filter_Input::FIELDS\u003c/code\u003e 而不是字符串来指定这个 metacommand。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026lt;?php\n$filters = array(\n \u0026#39;month\u0026#39; =\u0026gt; array(\n \u0026#39;Digits\u0026#39;, // filter name at integer index [0]\n \u0026#39;fields\u0026#39; =\u0026gt; \u0026#39;mo\u0026#39; // field name …\u003c/code\u003e\u003c/pre\u003e"
April 21, 2012
Zend_Filter_Input的基本用法
"\u003cp\u003e这里我们假设有一个登录入口,有三个表单元素,分别为用户名(username),密码(password)和验证码(captcha).\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e要求如下:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e所有元素去掉两边的空格\u003c/li\u003e\n\u003cli\u003e用户名要为数字和字母\u003c/li\u003e\n\u003cli\u003e验证码为数字类型(这里为了验证为空的情况下,注释掉了这块功能.启用的话,如果输入的是非数字的话,会直接提示不能为空.)\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003ePHP 代码如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e \u0026#39;StringTrim\u0026#39;,\n\t\t\t\u0026#39;username\u0026#39; =\u0026gt; \u0026#39;Alnum\u0026#39;,\n\t\t\t//\u0026#39;captcha\u0026#39; =\u0026gt; \u0026#39;Digits\u0026#39;\n\t);\n\n\t$validators = array(\n\t\t\t\u0026#39;username\u0026#39; =\u0026gt; array(\n\t\t\t\t\u0026#39;allowEmpty\u0026#39; =\u0026gt; false\n\t\t\t\t),\n\t\t\t\u0026#39;password\u0026#39; =\u0026gt; array(\n\t\t\t\t\t\u0026#39;allowEmpty\u0026#39; =\u0026gt; false\n\t\t\t\t),\n\t\t\t \u0026#39;captcha\u0026#39; =\u0026gt; …\u003c/code\u003e\u003c/pre\u003e"
April 19, 2012
23.6. Zend Framework 带有的标准表单元素
"\u003ch2 id=\"236zend-framework-带有的标准表单元素\"\u003e23.6. Zend Framework 带有的标准表单元素\u003c/h2\u003e\n\u003cp\u003eZend Framework 带有的具体元素类涵盖了大部分的 HTML 表单元素。其中大部分当装饰元素时,指定了特定的视图助手来用,但有一些还提供了另外的功能。下面是这些类的列表,还有它们提供的功能的描述。\u003c/p\u003e\n\u003ch3 id=\"2361zend_form_element_button\"\u003e23.6.1. Zend_Form_Element_Button\u003c/h3\u003e\n\u003cp\u003e用来生成 HTML 按钮元素, \u003ccode\u003eZend_Form_Element_Button\u003c/code\u003e 继承 Zend_Form_Element_Submit,并派生它的定制功能。它为装饰指定 ‘formButton’ 视图助手。\u003c/p\u003e\n\u003cp\u003e像提交元素一样,它使用元素的标签作为元素的值来显示,还句话说,通过设置元素的值来设置按钮上的文字。如果有翻译适配器,标签将显示翻译后的文字。\u003c/p\u003e\n\u003cp\u003e因为标签用作元素的一部分,但按钮元素只用 ViewHelper 和 DtDdWrapper 装饰器。\u003c/p\u003e\n\u003cp\u003e在组装和校验表单之后,我们可用 \u003ccode\u003eisChecked()\u003c/code\u003e 方法来检查是否给定的按钮被点击。\u003c/p\u003e\n\u003ch3 id=\"2362zend_form_element_checkbox\"\u003e23.6.2. Zend_Form_Element_Checkbox\u003c/h3\u003e\n\u003cp\u003eHTML checkboxes 让你返回一个特定的 …\u003c/p\u003e"
April 19, 2012
Zend_Form 之定制表单
"\u003ch3 id=\"23410-定制表单\"\u003e23.4.10. 定制表单\u003c/h3\u003e\n\u003cp\u003e一个使用基于配置的表单的替代方法是继承 \u003ccode\u003eZend_Form\u003c/code\u003e 类,有若干优点:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e可以容易进行单元测试来确保校验和解析如愿执行。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e精细地控制每个元素。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e重使用表单对象,最大化可移植性(不需要跟踪配置文件)。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e实现定制功能。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e最典型的用例是使用 \u003ccode\u003einit()\u003c/code\u003e 方法来设置指定的表单元素和配置:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026lt;?php\nclass My_Form_Login extends Zend_Form\n{\n public function init()\n {\n $username = new Zend_Form_Element_Text(\u0026#39;username\u0026#39;);\n $username-\u0026gt;class = \u0026#39;formtext\u0026#39;;\n $username-\u0026gt;setLabel(\u0026#39;Username:\u0026#39;)\n -\u0026gt;setDecorators(array( …\u003c/code\u003e\u003c/pre\u003e"
April 19, 2012
Zend_Form 的方法大全,按类分组
"\u003ch3 id=\"2348-方法\"\u003e23.4.8. 方法\u003c/h3\u003e\n\u003cp\u003e下面是 \u003ccode\u003eZend_Form\u003c/code\u003e 的方法大全,按类分组:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e配置和选项:\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003esetOptions(array $options)\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003esetConfig(Zend_Config $config)\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e插件加载器和路径:\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003esetPluginLoader(Zend_Loader_PluginLoader_Interface $loader, $type = null)\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003egetPluginLoader($type = null)\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eaddPrefixPath($prefix, $path, $type = null) \u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eaddPrefixPaths(array $spec)\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eaddElementPrefixPath($prefix, $path, $type = null)\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eaddElementPrefixPaths(array $spec)\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eaddDisplayGroupPrefixPath($prefix, $path)\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e元数据:\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003esetAttrib($key, $value)\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eaddAttribs(array …\u003c/code\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e"
April 19, 2012
zend_form 之定制表单元素
"\u003ch3 id=\"2339-定制元素\"\u003e23.3.9. 定制元素\u003c/h3\u003e\n\u003cp\u003e通过继承 \u003ccode\u003eZend_Form_Element\u003c/code\u003e 类,你可以生成自己的定制元素,这样做的原因是:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e共享通用的校验器和/或过滤器的元素\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e有定制装饰器功能的元素\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e有两个方法一般用来扩展元素: \u003ccode\u003einit()\u003c/code\u003e 可为元素添加定制的初始化逻辑; \u003ccode\u003eloadDefaultDecorators()\u003c/code\u003e 可用于设置一个用于元素的缺省装饰器的列表。\u003c/p\u003e\n\u003cp\u003e用例子来说明,你在一个表单里生成的所有文本元素需要用 \u003ccode\u003eStringTrim\u003c/code\u003e 来过滤、用通用的规则表达式来校验,并且你想用你生成的定制的装饰器来显示它们,’My_Decorator_TextItem’。另外,你有许多想指定的标准属性,包括 ‘size’、 ‘maxLength’ 和 ‘class’。你可以定义这样的元素如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026lt;?php\nclass My_Element_Text extends Zend_Form_Element\n{\n public function init()\n {\n $this-\u0026gt;addPrefixPath(\u0026#39;My_Decorator\u0026#39;, …\u003c/code\u003e\u003c/pre\u003e"
April 19, 2012
Zend_Form中的元数据和属性
"\u003cp\u003e\u003ccode\u003eZend_Form_Element\u003c/code\u003e 处理广泛的属性和元素元数据,基本属性包括:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cem\u003ename\u003c/em\u003e: 元素名,使用 \u003ccode\u003esetName()\u003c/code\u003e 和 \u003ccode\u003egetName()\u003c/code\u003e 访问器。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cem\u003elabel\u003c/em\u003e: 元素标签,使用 \u003ccode\u003esetLabel()\u003c/code\u003e 和 \u003ccode\u003egetLabel()\u003c/code\u003e 访问器。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cem\u003eorder\u003c/em\u003e: 在表单中出现的元素的索引,使用 \u003ccode\u003esetOrder()\u003c/code\u003e 和 \u003ccode\u003egetOrder()\u003c/code\u003e 访问器。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cem\u003evalue\u003c/em\u003e: 当前元素的值,使用 \u003ccode\u003esetValue()\u003c/code\u003e 和 \u003ccode\u003egetValue()\u003c/code\u003e 访问器。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cem\u003edescription\u003c/em\u003e: 元素的描述,常用于提供工具提示或 javascript 上下文提示,描述元素的意图,使用 \u003ccode\u003esetDescription()\u003c/code\u003e 和 \u003ccode\u003egetDescription()\u003c/code\u003e 访问器。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cem\u003erequired\u003c/em\u003e: 当执行表单校验时,指示元素是否必需的标志,使用 \u003ccode\u003esetRequired()\u003c/code\u003e 和 \u003ccode\u003egetRequired()\u003c/code\u003e 访问器,缺省为 false。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cem\u003eallowEmpty\u003c/em\u003e: 指示可选的元素是否应该校验空值的标志,当为 true,并且要求的标志为 false,空值就不传递给校验器链,并假定为 true。 …\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e"
April 19, 2012
zend_form 基础使用方法示例
"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epublic function indexAction()\n {\n\t\t$form = new Zend_Form();\n\n\t\tif ($form-\u0026gt;isValid($_POST)) {\n\t\t\t// success!\n\t\t\t$values = $form-\u0026gt;getValues();\n\n\t\t} else {\n\t\t\t// failure\n\n\t\t\t// deubg\n\t\t\t$this-\u0026gt;view-\u0026gt;form = $form;\n\t\t\treturn $this-\u0026gt;render(\u0026#39;form\u0026#39;);\n\n\t\t}\n\n\t\t$form-\u0026gt;setAction(\u0026#39;/members/index/register\u0026#39;)\n\t\t\t-\u0026gt;setMethod(\u0026#39;post\u0026#39;);\n\n\t\t$form-\u0026gt;setAttrib(\u0026#39;id\u0026#39;, \u0026#39;login\u0026#39;);\n\n\t\t// create and confirure username element\n\t\t//$username = new …\u003c/code\u003e\u003c/pre\u003e"
April 7, 2012
git中的Reversing Pushed Changes
"\u003ch3 id=\"reversing-pushed-changes\"\u003eReversing Pushed Changes\u003c/h3\u003e\n\u003cp\u003eSometimes you or somebody else might have pushed changes accidentally to the remove repository. To get rid of them, first get a log or history of the push commits:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ git log\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThen, use \u003ccode\u003egit reset\u003c/code\u003e to push back to a particular come it, identified by its SHA1 sequence from the log. For example:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ git reset --hard 6bb3dc30bc0c8fc36421474cf9376d658ee643aa\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSometimes just the first few letters and numbers of the sequence, such as \u003ccode\u003e6bb3dc\u003c/code\u003e would do.\u003c/p\u003e"
April 5, 2012
Git中的fetch和pull
"\u003cp\u003eGit中从远程的分支获取最新的版本到本地有这样2个命令:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003egit fetch origin master\ngit log -p master..origin/master\ngit merge origin/master\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e以上命令的含义:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e首先从远程的origin的master主分支下载最新的版本到origin/master分支上.\n然后比较本地的master分支和origin/master分支的差别.\n最后进行合并.\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e上述过程其实可以用以下更清晰的方式来进行:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003egit fetch origin master:tmp\ngit diff tmp\ngit merge tmp\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e从远程获取最新的版本到本地的test分支上\n之后再进行比较合并\u003c/p\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003egit pull:相当于是从远程获取最新版本并merge到本地\u003c/li\u003e\n\u003c/ol\u003e\n\u003cblockquote\u003e\n\u003cp\u003egit pull origin master\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e上述命令其实相当于git fetch 和 git merge\n在实际使用中,git fetch更安全一些\n因为在merge前,我们可以查看更新情况,然后再决定 …\u003c/p\u003e"
March 6, 2012
spring ioc aop 的原理
"\u003cp\u003e\u003cstrong\u003espring的IoC容器是spring的核心,spring AOP是spring框架的重要组成部分。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在传统的程序设计中,当调用者需要被调用者的协助时,通常由调用者来创建被调用者的实例。但在spring里创建被调用者的工作不再由调用者来完成,因此控制反转(IoC);创建被调用者实例的工作通常由spring容器来完成,然后注入调用者,因此也被称为依赖注入(DI),依赖注入和控制反转是同一个概念。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e面向方面编程(AOP)是以另一个角度来考虑程序结构\u003c/strong\u003e,通过分析程序结构的关注点来完善面向对象编程(OOP)。OOP将应用程序分解成各个层次的对象,而AOP将程序分解成多个切面。spring AOP 只实现了方法级别的连接点,在J2EE应用中,AOP拦截到方法级别的操作就已经足够。在spring中,未来使IoC方便地使用健壮、灵活的企业服务,需要利用spring AOP实现为IoC和企业服务之间建立联系。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eIOC:控制反转也叫依赖注入。利用了工厂模式\u003c/strong\u003e\n将对象交给容器管理,你只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。 …\u003c/p\u003e"
December 29, 2011
二维数组和指针(C语言)
"\u003cp\u003eint *p,a[5],b[3][4];\u003c/p\u003e\n\u003cp\u003e指针变量给一维数组赋值,可以写成p=a;或则p=\u0026amp;a[0];\u003c/p\u003e\n\u003cp\u003e二维数组需要写成 p=b[0];\n以下为指针与二维数组实例:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#include \u0026lt;stdio.h\u0026gt;\nmain() {\n int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};\n int (*p)[4]=a;\n\n printf(\u0026#34;%d\\n\u0026#34;,*(*(p+2) + 3));\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e输出结果为:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e23\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e===========================\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e应该注意指针数组和二维数组指针变量的区别。这两者虽然都可用来表示二维数组,但是其表示方法和意义是不同的。\u003c/strong\u003e\n二维数组指针变量是单个的变量,其一般形式中”(*指针变量名)”两边的括号不可少。\u003c/p\u003e\n\u003cp\u003e而指针数组类型表示的是多个指针(一组有序指针)在一般形式中”*指针数组名”两边不能有括号。\u003c/p\u003e\n\u003cp\u003eint (*p)[3];\n表示一个指向二维数组的指针变量。该二维数组的列数为 3或分解为一维数组的长度为3。\nint *p[3]\n表示 p 是一个 …\u003c/p\u003e"
December 24, 2011
Lua中非全局函数的写法
"\u003cp\u003e这里共有三种写法,这里基本上是将函数和表组合的写法.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.表和函数放在一起\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eLib = {}\nLib.foo = function (x, y) return x + y end\nLib.goo = function (x, y) return x -y end\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e2.使用且构造函数\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eLib = {\n foo = function (x, y) return x + y end,\n goo = function (x, y) return x - y end\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e注意第一个函数后面有一个逗号”,”\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3.Lua提供的另一种语法\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eLib = {}\nfunction Lib.foo (x, y)\n return x + y\nend\nfunction Lib.goo (x, y)\n return x -y\nend\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e当我们将函数保存在一个局部变量内时,我们得到一个局部函数,也就是说局部函数像局部变量一样在一定范围内有效。这种定义在包中是非常有用的:因为 Lua把 chunk当作函数处理,在 chunk内可以声明局部函数(仅仅在 chunk 内可见),词法定界保证 …\u003c/p\u003e"
December 23, 2011
详解如何让EditPlus支持LUA教程
"\u003cp\u003e如何让\u003cstrong\u003eEditPlus\u003c/strong\u003e支持\u003cstrong\u003eLUA\u003c/strong\u003e教程是本文要介绍的内容,这次主要介绍一下学习\u003cstrong\u003eLua\u003c/strong\u003e之前的准备工作。关于在\u003cstrong\u003eEditPlus\u003c/strong\u003e中实现\u003cstrong\u003elua\u003c/strong\u003e的安装,具体内容来看本文详解。\u003c/p\u003e\n\u003cp\u003e(1) 下载Lua安装包,最新版本是lua-5.1.3. 它的体积很小,只有210K, \u003ca href=\"http://luaforge.net/frs/?group_id=377\"\u003ehttp://luaforge.net/frs/?group_id=377\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e这是WINDOWS版本. 附带了编辑器,连环境变量都一次搞定了。\u003c/p\u003e\n\u003cp\u003e(2)安装\u003cstrong\u003elua\u003c/strong\u003e包\u003c/p\u003e\n\u003cp\u003e(3)安装EditPlus编辑器:\u003c/p\u003e\n\u003cp\u003e(4)让EditPlus支持lua高亮\u003c/p\u003e\n\u003cp\u003e下拉菜单”工具” — “首选项” ,选择”语法”. 点击”添加”按钮增加一个文件类型,在下面的”描述”和”扩展名”栏里都填写lua。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e下面设置语法文件\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003elua.stx文件下载地址:. 注意要按一下”载入”按钮.\u003c/p\u003e\n\u003cp\u003e再设置好”自动换行”和”缩进”.\u003c/p\u003e\n\u003cp\u003e(5)让EditPlus能调用Lua5调试代码\u003c/p\u003e\n\u003cp\u003e选择左面的”用户工具”,点击右面的”添加”–“应用程序”之后,”菜单文本”填 Run_Lua5″命令”栏, 需要写明你步骤(2)安装的lua5系统的位置.在”参数”栏, 选择”文件路径”, 或者$(FilePath) …\u003c/p\u003e"
December 11, 2011
git init 和git –bare init 的具体区别?
"\u003cp\u003e一般个人使用,用git init,这时候你的工作区也在这里。你要是想建立一个固定的地址让大家一起用,就在服务器上用git –bare init。\u003c/p\u003e\n\u003cp\u003e其实你可以看到,init建立的.git目录内容和–bare建立的目录内容是差不多的。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e在初始化远程仓库时最好使用 git –bare init 而不要使用:git init。这样在使用hooks的时候,会有用处。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e如果使用了git init初始化,则远程仓库的目录下,也包含work tree,当本地仓库向远程仓库push时, 如果远程仓库正在push的分支上(如果当时不在push的分支,就没有问题), 那么push后的结果不会反应在work tree上, 也即在远程仓库的目录下对应的文件还是之前的内容,必须得使用git reset –hard才能看到push后的内容.\u003c/p\u003e"
December 11, 2011
“remote:error:refusing to update checked out branch:refs/heads/master”的解决办法
"\u003cp\u003e在使用Git Push代码到数据仓库时,提示如下错误:\u003c/p\u003e\n\u003cp\u003e[remote rejected] master -\u0026gt; master (branch is currently checked out)\u003c/p\u003e\n\u003cp\u003e错误原型\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eremote: error: refusing to update checked out branch: refs/heads/master\u003c/p\u003e\n\u003cp\u003eremote: error: By default, updating the current branch in a non-bare repository\u003c/p\u003e\n\u003cp\u003eremote: error: is denied, because it will make the index and work tree inconsistent\u003c/p\u003e\n\u003cp\u003eremote: error: with what you pushed, and will require ‘git reset –hard’ to match\u003c/p\u003e\n\u003cp\u003eremote: error: the work tree to HEAD.\u003c/p\u003e\n\u003cp\u003eremote: error:\u003c/p\u003e"
November 17, 2011
fckeditor的Error creating folder “” (Can’t create directory)错误的解决办法
"\u003cp\u003e今天使用了fckeditor的编辑器,在下面的环境里测试着没有一点问题的,但上传到服务器上,总是提示\u003c/p\u003e\n\u003cp\u003eError creating folder “” (Can’t create directory)\u003c/p\u003e\n\u003cp\u003e这个错误.经测试发现是 \u003cstrong\u003eapache_lookup_uri\u003c/strong\u003e 函数出的问题,经测试需要获得物理路径,无奈只能修改为 $_SERVER函数\u003c/p\u003e\n\u003cp\u003e打开文件,fckeditor\\editor\\filemanager\\connectors\\php\\io.php\u003c/p\u003e\n\u003cp\u003e修改为\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eif ( function_exists( ‘apache_lookup_uri’ ) )\n{\n/*zongzong 修改\n$info = apache_lookup_uri( $path ) ;\nreturn $info-\u0026gt;filename . $info-\u0026gt;path_info ;\n*/\nreturn $_SERVER[‘DOCUMENT_ROOT’].$path;\n}\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e即可.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eapache_lookup_uri\u003c/strong\u003e 函数参考: …\u003c/p\u003e"
November 10, 2011
php里函数名或者方法名前加 & 符号表示的意思
"\u003ch1 id=\"先阅读手册\"\u003e先阅读手册\u003c/h1\u003e\n\u003cp\u003e从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用操作符**\u0026amp;**\u003c/p\u003e\n\u003cp\u003e例子 17-13. 由函数返回一个引用\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026lt;?php\nfunction \u0026amp;returns_reference()\n{\nreturn $someref;\n}\n\n$newref =\u0026amp; returns_reference();\n?\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e有关引用的更多信息, 请查看引用的解释。\u003c/p\u003e\n\u003cp\u003e在来看一段很多开源代码喜欢用的单例注册模式\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026lt;?php\nclass a{}\nclass b{}\nfunction \u0026amp; aa($name)\n{\n static $class = array();\n if(!$class[$name])\n {\n $class[$name] = new $name();\n }\n return $class[$name];\n}\n$a = \u0026amp; aa(\u0026#39;a\u0026#39;);\n$b = \u0026amp; aa(\u0026#39;b\u0026#39;);\n\n$a2 = \u0026amp; aa(\u0026#39;a\u0026#39;);\n$b2 = …\u003c/code\u003e\u003c/pre\u003e"
November 1, 2011
检查局域网可用ip的dos批处理脚本
"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e要扫描192.168.0.x段的所有可用ip地址\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003efor /L %i IN(1,1,254) DO ping -w 2 -n 1 192.168.0.%\narp -a\n\u003c/code\u003e\u003c/pre\u003e"
October 30, 2011
一个自动检测服务器网络状态的脚本
"\u003cp\u003e最近服务器总是莫明奇妙的网络不通。我在上一篇文章里写了一个自动检测网卡状态的脚本: \u003ca href=\"http://blog.haohtml.com/archives/11827\"\u003ehttp://blog.haohtml.com/archives/11827\u003c/a\u003e.但发现服务器仍然出现此问题.但服务器内部运行正常.这里基本可以确认是与外网不通的原因.就写了一个脚本,用来检测网络状态,在不通的情况就重启服务器了.此解决办法相当的变态.最好不要使用.\u003c/p\u003e\n\u003cp\u003e1.创建新文件 /data/check_net_status.sh,内容如下\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#!/bin/bash\nif [ $# -ne 1 ]\nthen\necho \u0026#39;ip address not defined!\u0026#39;\nexit\nfi\n\nip=$1\nlog_file=\u0026#34;$(date +%Y%m%d).log\u0026#34;\n\nret=`ping -c 10 $ip | grep ttl | wc -l`\nif [ $ret -lt 2 ]; then\necho \u0026#34;$(date +%H:%M:%S) ===== reboot\u0026#34; \u0026gt;\u0026gt; $log_file\nshutdown -r now\nfi …\u003c/code\u003e\u003c/pre\u003e"
October 27, 2011
php客户端memcached的安装教程
"\u003cp\u003e我们在上篇文章里()介绍了LNMP的安装方法.只安装了memcache客户端.有些用户可能需要memcached这种客户端的.这里介绍一种php客户端memcached的安装方法.\u003c/p\u003e\n\u003cp\u003e之前在安装memcache时有提到memcached客户端是叫memcache,其实还有一个基于libmemcached的客户端叫memcached,据说性能更好,功能也更多。参考:\u003c/p\u003e\n\u003cp\u003ememcache的官方主页: \u003ca href=\"http://pecl.php.net/package/memcache\"\u003ehttp://pecl.php.net/package/memcache\u003c/a\u003e\nmemcached的官方主页: \u003ca href=\"http://pecl.php.net/package/memcached\"\u003ehttp://pecl.php.net/package/memcached\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e以下是我安装Memcached版本的PHP模块的过程记录:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#wget http://download.tangent.org/libmemcached-0.9.tar.gz\n#tar zxf libmemcached-0.9.tar.gz\n#cd libmemcached-0.9\n#./configure --prefix=/usr/local/libmemcached --with-memcached\n#make …\u003c/code\u003e\u003c/pre\u003e"
October 22, 2011
FreeBSD下自动检查网卡状态并自动启用网卡
"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#/bin/bash\n\nlog_file=`date +%Y%m%d`\nlog_file=$log_file\u0026#34;.log\u0026#34;\ncheck_date=`date +%H:%M:%S`\n#status=`ifconfig bge0 | grep status | awk \u0026#39;{print $2}\u0026#39;`\nstatus=`ifconfig bge0 | awk \u0026#39;/status/{print $2}\u0026#39;`\n\nif [ $status != \u0026#39;active\u0026#39; ]; then\n status=\u0026#39;down\u0026#39;\n ifconfig bge0 up\nelse\n echo \u0026#39;ok\u0026#39;\nfi\n\ncheck_date=${check_date}\u0026#34; =========== \u0026#34;${status}\necho $check_date \u0026gt;\u0026gt; $log_file\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e另一处写法,其实一样的:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#!/bin/bash\nlog_file=\u0026#34;$(date …\u003c/code\u003e\u003c/pre\u003e"
September 15, 2011
[git] Git 高级:Git Reset, Checkout, Diff, Stash
"\u003ch4 id=\"git-reset\"\u003e\u003cstrong\u003eGit Reset\u003c/strong\u003e\u003c/h4\u003e\n\u003cp\u003e有时候,你可能想要撤销 Git 操作。通常,git reset 就是你需要的命令。但是,使用 git reset 可能会非常复杂,取决于你的撤销操作。如果本文没有提到你需要的,查看 \u003ca href=\"http://www.kernel.org/pub/software/scm/git/docs/git-reset.html\"\u003egit reset 官方文档\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e假设,你正在进行一个项目,想要取消所有的改变,返回到最近一次的提交,命令如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ git reset --hard HEAD\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e–hard flag 将指定提交(上例中,HEAD)中的任意内容放入工作目录和缓存区内。因为 HEAD 是最近一次提交,所以我们没有做任何改变。运行 git status,会看到提示没有需要提交的。\u003c/p\u003e\n\u003cp\u003e还有其它一些 git reset 使用的 flag。假设你想要回滚你的项目到多个提交之前,但是想要保存没有提交的改变,尝试下面的:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ git reset --soft 3ce072c72d948abfa\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e当然,替换为你自己需要的 hash。–soft flag 将保存你的改变在工作目录和缓存区。换句话来说,最新的提交将会是你选择的提交。\u003c/p\u003e\n\u003cp\u003e还有很多情况,你可以使用 git reset。如果你认为需要这个名利概念的功能,查看\u003ca href=\"http://www.kernel.org/pub/software/scm/git/docs/git-reset.html\"\u003e文档\u003c/a\u003e。 …\u003c/p\u003e"
August 30, 2011
Call to undefined function curl_init()错误解决
"\u003cp\u003e提示不支持这个函数,于是在php.ini文件里启用了扩展,把前面的;去掉,重启apache,竟然不起作用.后来查找了一下,原来还需要两个dll(libeay32.dll、ssleay32.dll)文件支持,将dll复制到c:/windows/system32目录里.然后重启apache即可.\u003c/p\u003e\n\u003cp\u003e特在此记录一下.\u003c/p\u003e"
August 5, 2011
C语言中用const改善程序的健壮性
"\u003cp\u003e关于C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,现将本人的一些体会总结如下,期望对大家有所帮助:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一 const基础\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e如果const关键字不涉及到指针,我们很好理解,下面是涉及到指针的情况:\u003c/p\u003e\n\u003cp\u003eint b = 500;\nconst int* a = \u0026amp;b; [1]\nint const \u003cem\u003ea = \u0026amp;b; [2]\nint\u003c/em\u003e const a = \u0026amp;b; [3]\nconst int* const a = \u0026amp;b; [4]\u003c/p\u003e\n\u003cp\u003e如果你能区分出上述四种情况,那么,恭喜你,你已经迈出了可喜的一步。不知道,也没关系,我们可以参考《Effective c++》Item21上的做法,如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。因此,[1]和[2]的情况相同,都是指针所指向的内容为常量(const放在变量声明符的位置无关),这种情况下不允许对内容进行更改操作,如不能*a = 3 ;[3]为指针本身是常量,而指针所指向的内容不是常 …\u003c/p\u003e"
August 5, 2011
const修饰指针和引用释疑(转载)
"\u003cp\u003econst修饰指针和引用的用法,对于初学C++的人直是讳莫如深,不知所云.一旦你了解了其用法,一切便不值一哂了.下面我为读者一一释疑:\n大致说来其可分为三种情况: const修饰指针,const修饰引用,const修饰指针的引用.\n\u003cstrong\u003e1.const修饰指针\u003c/strong\u003e\nconst修饰指针又可分为三种情况:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003econst修饰指针本身\u003c/li\u003e\n\u003cli\u003econst修饰指针所指的变量(或对象)\u003c/li\u003e\n\u003cli\u003econst修饰指针本身和指针所指的变量(或对象)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e(1).const修饰指针本身\u003c/strong\u003e\n这种情形下,指针本身为常量,不可改变,任何修改指针本身的行为都是非法的.例如:\nconst int a = 1;\nconst int b = 2;\u003c/p\u003e\n\u003cp\u003eint i = 3;\nint j = 4;\nint* const pi = \u0026amp;i; //ok, pi的类型为int* const , \u0026amp;i的类型为int* const\nint* const pi = \u0026amp;a; //error, pi的类型为int* const, \u0026amp;a的类型为const int* const\npi = \u0026amp;j; //error, 指针是常量, …\u003c/p\u003e"
August 5, 2011
C语言中 static 和 const
"\u003cp\u003estatic 的两大作用:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、控制存储方式:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003estatic被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间。\u003c/p\u003e\n\u003cp\u003e1、引出原因:函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,大家知道,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现?\n最容易想到的方法是定义一个全局的变量,但定义为一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅受此函数控制)。\u003c/p\u003e\n\u003cp\u003e2、 解决方案:因此c++ 中引入了static,用它来修饰变量,它能够指示编译器将此变量在程序的静态存储区分配空间保存,这样即实现了目的,又使得此变量的存取范围不变。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二、控制可见性与连接类型 :\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003estatic还有一个作用,它会把变量的可见范围限制在编译单元中,使它成为一个内部连接,这时,它的反义词为”extern”.\u003c/p\u003e\n\u003cp\u003estatic作用分析总结:static总是使得变量或对象的存储形式变成静态存储,连接方式变成内部连接,对于局部变量(已经是内部连接了),它仅改变其存储方式;对于全局变量( …\u003c/p\u003e"
August 5, 2011
程序基础C语言常量(const)参数
"\u003cp\u003e\u003cstrong\u003e函数 – 常量(const)参数\u003c/strong\u003e 非指针参数(也就是传值参数)不会被修改原始值, const 对它是没有意义的。 const 只用于指针。\u003c/p\u003e\n\u003cp\u003e*\u003cem\u003e1. 第一种用法: const 类型 \u003cem\u003e变量:\u003c/em\u003e\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e 这种用法将限制修改指针指向的值。#include\u003c/p\u003e\n\u003cp\u003eint fun(const int *p) {\u003c/p\u003e\n\u003cp\u003e\u003cem\u003ep += 1; /\u003c/em\u003e 只有去掉 const 这句才可以执行 */\u003c/p\u003e\n\u003cp\u003ereturn *p;\u003c/p\u003e\n\u003cp\u003e}int main(void)\u003c/p\u003e\n\u003cp\u003e{\u003c/p\u003e\n\u003cp\u003eint num = 3;\u003c/p\u003e\n\u003cp\u003eprintf(“%dn”, fun(\u0026amp;num));\u003c/p\u003e\n\u003cp\u003egetchar();\u003c/p\u003e\n\u003cp\u003ereturn 0;\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003e不过也有办法绕过这个限制:\u003c/p\u003e\n\u003cp\u003e#include\u003c/p\u003e\n\u003cp\u003eint fun(const int *p) {\u003c/p\u003e\n\u003cp\u003eint \u003cem\u003ep2 = p; /\u003c/em\u003e 来个重名指针会绕过 const 的限制 */\u003c/p\u003e\n\u003cp\u003e*p2 += 1;\u003c/p\u003e\n\u003cp\u003ereturn *p;\u003c/p\u003e\n\u003cp\u003e}int main(void)\u003c/p\u003e\n\u003cp\u003e{\u003c/p\u003e\n\u003cp\u003eint num = 3;\u003c/p\u003e\n\u003cp\u003eprintf(“%dn”, fun(\u0026amp;num)); /* 4 */getchar();\u003c/p\u003e"
July 1, 2011
关于C语言中的extern
"\u003cp\u003ec语言有三种链接,外部链接,内部链接和无链接。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e外部链接:对构成程序的所有文件可用,如函数和全局变量具有外部链接。\n内部链接:仅在声明他们的文件中是已知的。如声明为static的文件域具有内部链接。\n无连接:仅在自己的块中已知,其它地方没有办法访问,如局部变量。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eextern主要作用是:声明在程序的其它地方使用外部链接声明的对象。\n声明:表述对象的名称和类型。\n定义:为对象分配存储空间。\u003c/p\u003e\n\u003cp\u003e例如:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eint main(void)\n{\nextern int a, b;\nprintf(“%d %d”, a, b);\ngetch();\nreturn 0;\n}\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e/* 全局变量定义到了main之后 */\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eint a = 10, b = 20;\n程序输出10 20。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e通过extern声明变量a和b,可以在a和b定义之前使用,编译器不会提示错误。\u003c/p\u003e\n\u003cp\u003eextern最重要的用途是多文件程序,c允许程序分散在多个文件中,分别编译,链接到一起。\n我们在devc++中新建立一个c工程,然后在添新建一个单元保存名称为cunclx3.c\u003c/p\u003e\n\u003cp\u003emain.c的程序代码:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#include\n#include\nint …\u003c/p\u003e\u003c/blockquote\u003e"
June 29, 2011
git常用命令总结[原创]
"\u003cp\u003e\u003cstrong\u003etxt笔记一篇: \u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/06/git.txt\"\u003egit常用命令点击查看\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e深入理解学习Git工作流(git-workflow-tutorial) \u003ca href=\"http://segmentfault.com/a/1190000002918123\"\u003ehttp://segmentfault.com/a/1190000002918123\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e以下教程主要参考" \u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/04/git-tut.pdf\"\u003eGit-tutor(Git使用指南):\u003c/a\u003e 和 \u003ca href=\"http://blog.haohtml.com/archives/9066\"\u003ehttp://blog.haohtml.com/archives/9066\u003c/a\u003e"实用指南而整理,第3章几乎直接在复制过来的.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e相关教程:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e在 CentOS 装 Git: \u003ca href=\"http://blog.haohtml.com/archives/10093\"\u003ehttp://blog.haohtml.com/archives/10093\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e在FreeBSD下安装Git: \u003ca href=\"http://blog.haohtml.com/archives/10065\"\u003ehttp://blog.haohtml.com/archives/10065\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003esvn git 的windows客户端: \u003ca href=\"http://blog.haohtml.com/archives/10069\"\u003ehttp://blog.haohtml.com/archives/10069\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e第一章 Git的基本操作方法\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一.初始化仓库\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003egit init\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e此时会在当前目录*假如为($WORK)生成一个.git的目录文件.这个.git目录就是Git仓库.其中存放的是我们所提交的文档索引内容,Git 可基于文档索引内容对其所管理的文档进行内容追踪, …\u003c/p\u003e"
June 28, 2011
node.js在linux下的安装教程
"\u003cp\u003e\u003cstrong\u003e一.安装node.js\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewet \u003ca href=\"http://nodejs.org/dist/node-v0.4.8.tar.gz\"\u003ehttp://nodejs.org/dist/node-v0.4.8.tar.gz\u003c/a\u003e\ntar zxvf node-v0.4.8.tar.gz\ncd node-v0.4.8\n./configure –prefix=/usr/local/node\nmake\nmake install\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e二.测试\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e创建test.js文件,内容如下:\nvar http = require(‘http’);\nhttp.createServer(function (req, res) {\nres.writeHead(200, {‘Content-Type’: ‘text/plain’});\nres.end(‘Hello World\\n’);\n}).listen(1337, “127.0.0.1”);\nconsole.log(‘Server running at http://127.0.0.1:1337/’);\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e执行:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003enode test.js\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e在浏览器里输入 http://127.0.0.1:1337/,可以看到 “Hello World“字样,即表示安装成功!注意后面不能加文件 …\u003c/p\u003e"
June 27, 2011
svn git 的windows客户端
"\u003cp\u003e根据自己使用的操作系统是32位的还是64位的不同,需要选择软件的相应版本。\u003c/p\u003e\n\u003cp\u003e先安装msysgit:\n\u003ca href=\"https://git-scm.com/downloads\"\u003ehttps://git-scm.com/downloads\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e再安装git windows客户端tortoisegit :\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://download.tortoisegit.org/\"\u003ehttp://download.tortoisegit.org/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e在安装tortoisegit的时候,选择第一个 Use(Tortoise)Plink即可。\u003c/p\u003e\n\u003cp\u003e===================\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eTortoiseGit日常使用指南\u003c/strong\u003e: \u003ca href=\"/wp-content/uploads/2011/01/TortoiseGit_Guide.pdf\"\u003e/wp-content/uploads/2011/01/TortoiseGit_Guide.pdf\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e相关教程:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eGit使用教程视频:\nGit使用学习教程:\n在 CentOS 装 Git:\n在FreeBSD下安装:\u003c/p\u003e\n\u003cp\u003e============================================================\u003c/p\u003e\n\u003cp\u003esvn windows客户端:\n\u003ca href=\"http://tortoisesvn.tigris.org/\"\u003ehttp://tortoisesvn.tigris.org/\u003c/a\u003e\u003c/p\u003e"
June 25, 2011
Failed to initialize storage module解决方法
"\u003cp\u003e今天更新了一下自己的cms,然后后台就提示登陆不了,报错如下:Failed to initialize storage module。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e解决方法有两种如下:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1。在报错的文件里的session start();之前加入如下代码:ini_set(‘session.save_handler’, ‘files’); 。这种方法适合租用空间的用户使用。\u003c/p\u003e\n\u003cp\u003e2。在php.ini文件里,显式指定session的save_path(比如 c:/temp)然后重启web服务。如果服务器的管理权限属于你,那还是这样改比较方便。\u003c/p\u003e\n\u003cp\u003e原因分析:php5一个安全模式的bug,默认session的save_path是系统的临时目录,这样会要校验权限。\u003c/p\u003e\n\u003cp\u003ePHP中使用SESSION后出现Failed to initialize storage module错误的解决方法:\n在session start之前加入以下这句话\nini_set(‘session.save_handler’, ‘files’);\u003c/p\u003e"
June 16, 2011
c语言socket编程常用函数2
"\u003cp\u003e\u003cstrong\u003esocket()函数\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e#include\n#include int socket(int domain, int type, int protocol);\ndomain应该设置为”AF_INET”,和上面数据结构 struct sockaddr_in 中一样,或者其它的type 告诉内容是SOCK_STREAM还是SOCK_DGRAM 类型,或者其它的.\nprotocol 设置为0.\u003c/p\u003e\n\u003cp\u003esocket()只是返回以后在系统调用中可能用到的socket描述符,或者错误的时候返回-1.全局变量errno中将存储返回的错误值.\u003c/p\u003e\n\u003cp\u003e=====================\n\u003cstrong\u003ebind() 函数\u003c/strong\u003e\n一旦你有一个套接字,你可能要将套接字和机器上的一定的端口关联起来。 ( 如果你想用 listen() 来侦听一定端口的数据,这是必要一步 –MUD 告 诉你说用命令 “telnet x.y.z 6969” 。 ) 如果你只想用 connect() ,那么这个步骤没有必 要 。\n但是无论如何,请继续读下去。\u003c/p\u003e\n\u003cp\u003e这里是系统调用 bind() 的大概:\u003c/p\u003e\n\u003cp\u003e#include\n#include int bind(int …\u003c/p\u003e"
June 16, 2011
c语言socket编程笔记1
"\u003cblockquote\u003e\n\u003cp\u003estruct sockaddr {\nunsigned short sa_family; // 地址家族,Af_XXX\nchar sa_data[14]; // 14字节协议地址\n};\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003esa_family 能够是各种各样的类型,但是在这篇文章中都是”AF_INET” 。 sa_data 包含套接字中的目标地址和端口信息。\n这好像有点不明智。\u003c/p\u003e\n\u003cp\u003e=====================================\u003c/p\u003e\n\u003cp\u003e为了处理 struct sockaddr,程序员创造了一个并列的结构:\nstruct sockaddr_in (“in” 代表 “Internet”)\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003estruct sockaddr_in {\nshort int sin_family; //通讯类型(同struct sockadd中的sa_family一样可设置为 AF_INET )\nstruct in_addr sin_addr; //Internet 地址(结构体见下,网络字节顺序,储存 4 字节的 IP 地址)\nunsigned short int sin_port; //端口(网络字节顺序)\nunsigned …\u003c/p\u003e\u003c/blockquote\u003e"
June 9, 2011
利用PHP操作Linux消息队列完成进程间通信
"\u003cp\u003e当我们开发的系统需要使用多进程方式运行时,进程间通信便成了至关重要的环节。消息队列(message queue)是Linux系统进程间通信的一种方式。\u003c/p\u003e\n\u003cp\u003e关于Linux系统进程通信的概念及实现可查看: \u003ca href=\"http://www.ibm.com/developerworks/cn/linux/l-ipc/\"\u003ehttp://www.ibm.com/developerworks/cn/linux/l-ipc/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e关于Linux系统消息队列的概念及实现可查看: \u003ca href=\"http://www.ibm.com/developerworks/cn/linux/l-ipc/\"\u003ehttp://www.ibm.com/developerworks/cn/linux/l-ipc/part4/\u003c/a\u003e\nPHP的sysvmsg模块是对Linux系统支持的System V IPC中的System V消息队列函数族的封装。我们需要利用sysvmsg模块提供的函数来进进程间通信。先来看一段示例代码_1:\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e01``\u0026lt;?php\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e02\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e03``$message_queue_key\u003c/code\u003e \u003ccode\u003e= \u003c/code\u003e \u003ccode\u003eftok\u003c/code\u003e \u003ccode\u003e(\u003c/code\u003e \u003ccode\u003e__FILE__\u003c/code\u003e \u003ccode\u003e, \u003c/code\u003e \u003ccode\u003e'a'\u003c/code\u003e \u003ccode\u003e);\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e04\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e05``$message_queue\u003c/code\u003e \u003ccode\u003e= msg_get_queue(\u003c/code\u003e \u003ccode\u003e$message_queue_key\u003c/code\u003e \u003ccode\u003e, 0666);\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e06``var_dump(\u003c/code\u003e \u003ccode\u003e$message_queue\u003c/code\u003e \u003ccode\u003e);\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e07 …\u003c/code\u003e\u003c/p\u003e"
June 6, 2011
配置PHP.INI监测服务器的脚本耗时
"\u003cp\u003e配置php.ini中的\nauto_prepend_file\nauto_append_file\n加入自动解析页面来获取执行时间\u003c/p\u003e\n\u003cp\u003e; Automatically add files before or after any PHP document.\nauto_prepend_file = monitor_prog.php\nauto_append_file = monitor_prog.php\u003c/p\u003e\n\u003cp\u003e把monitor_prog.php放到包含目录下。\u003c/p\u003e\n\u003cp\u003emonitor_prog.php\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e// print_r($_SERVER);\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eif ( ! function_exists ( ‘ getmicrotime_t ‘ ) ) {\u003c/p\u003e\n\u003cp\u003efunction getmicrotime_t(){\u003c/p\u003e\n\u003cp\u003elist ( $usec , $sec ) = explode ( ” ” , microtime ());\u003c/p\u003e\n\u003cp\u003ereturn $usec ;\u003c/p\u003e\n\u003cp\u003e// return ((float)$usec + (float)$sec);\u003c/p\u003e\n\u003cp\u003e} // end func\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003e$time1 = date ( ‘ …\u003c/p\u003e"
May 30, 2011
C语言对mysql数据库的操作
"\u003cp\u003e这已经是一相当老的话题。不过今天我才首次使用,把今天的一些体会写下来,也许能给一些新手带来一定的帮助,更重要的是供自己今后忘记的怎么使用而进行查阅的!\u003c/p\u003e\n\u003cp\u003e我们言归正传\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.头文件:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#include\u003c/p\u003e\n\u003cp\u003e#include\u003c/p\u003e\n\u003cp\u003e#include “/usr/local/mysql/include/mysql/mysql.h” //这个是必需要包含的,下面对mysql的所有操作函数,都出自这里\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e2.定义一个MYSQL变量:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMYSQL mysql;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这里MYSQL是一个用于连接MySql数据库的变量。\u003c/p\u003e\n\u003cp\u003e在后面对mysql数据库的操作中,我们就用这个MYSQL变量作为句柄的。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3.定义数据库参数:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003echar host[32]=”localhost”;\u003c/p\u003e\n\u003cp\u003echar user[32]=”username”;\u003c/p\u003e\n\u003cp\u003echar passwd[32]=”pwd”;\u003c/p\u003e\n\u003cp\u003echar dbname[32]=”testdb”;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e4.数据库操作\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1).初始化数据库:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003emysql_init(\u0026amp;mysql);\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e2).连接数据库: …\u003c/p\u003e"
April 27, 2011
Eclipse与MyEclipse的区别
"\u003cp\u003eEclipse 是一个IDE(Integrated Developing Environment),而这个IDE是允许安装第三方开发的插件来使自身的功能得到扩展和增强的,而Myeclipse就是其中的一种有名的插件集之一,主要是为J2EE开发;MyEclipse将开发者常用到的一些有用的插件都集合起来,提供一种高级编程环境,可以比较轻松完成struts,Hibernate,Spring布局,编写strtus-config.xml;但它是收费的,没Eclipse MyEclipse是没用的。lomboz也是类似MyEclipse的插件,不过是免费的,当然功能没有MyEclipse好。\u003c/p\u003e\n\u003cp\u003eEclipse是一个开放源代码,基于Java的可扩张的开发平台,多数人都是将Eclipse作为Java的集成开发环境使用,虽然Eclipse使用Java开发:但Eclipse不仅仅局限于Java开发,还可用于其它语言的开发,如C/C++;Eclipse是一个框架和一组服务,它通过各种插件来构建开发环境,因此只要提供支持C/C++ 插件便能进行相应语言的开发.\u003c/p\u003e\n\u003cp\u003eEclipse最早是由IBM开发的,后 …\u003c/p\u003e"
April 19, 2011
4.1 静态方法和属性-深入PHP面向对象.模式与实践
"\u003cp\u003e摘自: \u003ca href=\"http://www.verycd.com/topics/2830432/\"\u003e深入PHP面向对象.模式与实践\u003c/a\u003e 第四章 高级特性\n\u003cstrong\u003e4.1 静态方法和属性\u003c/strong\u003e\n第2章的所有例子使用的都是对象.我们把类当作生成对象的模板,把对象作为活动组件,对象的方法可以被调用,对象的属性可以被访问.之前的例子也暗示了,面向对象编程中的实际操都是通过类的实例(而不是类本身)完成的.毕竟类仅仅是对象的模板.\u003c/p\u003e\n\u003cp\u003e事实并非如此简单.我们不仅可以通过对象访问方法和属性,还可以通过类来访问它们.这样的方法和属性属性是”静态的”(static),必须用static关键字来声明.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eclass StaticExample{\nstatic public $sNum = 0;\nstatic public function sayHello) {\nprint “hello”;\n}\n}\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch1 id=\"注解static关键字是在php5中引入的在php4程序中不能使用\"\u003e==========================================\n注解:static关键字是在php5中引入的,在php4程序中不能使用.\u003c/h1\u003e\n\u003cp\u003e静态方法是以类作为作用域的函数.静态方法不能访问这个类中的普通属性,因为那些属性属于一个对象,但可以访问静态属性.如果修改了一个静态属性,那么这个类的所有实例都能 …\u003c/p\u003e"
April 16, 2011
如何安装cacti监控nginx插件
"\u003cp\u003eScripts and templates for nginx.\u003c/p\u003e\n\u003cp\u003eNginx –\u003c/p\u003e\n\u003cp\u003eProvide graphing nginx clients statistics (active, reading, writing, waiting) and nginx socket statistics (accepts, handled, requests). It’s a formal devision used only for graphs usability.\u003c/p\u003e\n\u003cp\u003eFor use do next steps:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eEnable nginx http_stub_status_module at configure stage (if requared).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eEnable stub status. Add to nginx.conf (in any server context):\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003elocation /nginx_status {\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003estub_status on;\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch1 id=\"disable-access_log-if-requared\"\u003edisable access_log if requared\u003c/h1\u003e\n\u003cp\u003eaccess_log off;\u003c/p\u003e\n\u003cp\u003e#allow …\u003c/p\u003e"
April 1, 2011
深入理解ob_flush和flush的区别
"\u003cp\u003eob_flush/flush在手册中的描述, 都是刷新输出缓冲区, 并且还需要配套使用, 所以会导致很多人迷惑…\u003c/p\u003e\n\u003cp\u003e其实, 他们俩的操作对象不同, 有些情况下, flush根本不做什么事情..\u003c/p\u003e\n\u003cp\u003eob_*系列函数, 是操作PHP本身的输出缓冲区.所以, ob_flush是刷新PHP自身的缓冲区.\u003c/p\u003e\n\u003cp\u003e而flush, 严格来讲, 这个只有在PHP做为apache的Module(handler或者filter)安装的时候, 才有实际作用. 它是刷新WebServer(可以认为特指apache)的缓冲区.\u003c/p\u003e\n\u003cp\u003e在apache module的sapi下, flush会通过调用sapi_module的flush成员函数指针, 间接的调用apache的api: ap_rflush刷新apache的输出缓冲区, 当然手册中也说了, 有一些apache的其他模块, 可能会改变这个动作的结果..\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。\u003c/p\u003e\n\u003cp\u003e甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape浏览器会在接受到换 …\u003c/p\u003e\u003c/blockquote\u003e"
April 1, 2011
php中ob_start函数 积累
"\u003cp\u003e确实自己写不出来,只能看看别人的经验总结。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePHP的ob_start();用法\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e用PHP的ob_start();控制您的浏览器cache\u003c/p\u003e\n\u003cp\u003eOutput Control 函数可以让你自由控制脚本中数据的输出。它非常地有用,特别是对于:当你想在数据已经输出后,再输出文件头的情况。输出控制函数不对使用 header() 或 setcookie(), 发送的文件头信息产生影响,只对那些类似于 echo() 和 PHP 代码的数据块有作用。\n我们先举一个简单的例子,让大家对Output Control有一个大致的印象:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eExample 1.\u003c/p\u003e\n\u003cp\u003e程序代码:\u003c/p\u003e\n\u003cp\u003eob_start(); //打开缓冲区\necho “Hellon”; //输出\nheader(“location:”); //把浏览器重定向到\nob_end_flush();//输出全部内容到浏览器\n?\u0026gt;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e所有对header()函数有了解的人都知道,这个函数会发送一段文件头给浏览器,但是如果在使用这个函数之前已经有了任何输出(包括空输出,比如空格,回车和换行)就会提示出错。如果我们去掉第一行的ob_start(),再执行此程序,我们会发现 …\u003c/p\u003e"
March 31, 2011
php Safe_mode影响参数
"\u003cp\u003esafe_mode是唯一PHP_INI_SYSTEM属性,必须通过php.ini或httpd.conf来设置。要启用safe_mode,只需修改php.ini: safe_mode = On 或者修改httpd.conf,定义目录:\u003c/p\u003e\n\u003cp\u003eOptions FollowSymLinks php_admin_value safe_mode 1重启apache后safe_mode就生效了。启动safe_mode,会对许多PHP函数进行限制,特别是和系统相关的文件打开、命令执行等函数。\u003c/p\u003e\n\u003cp\u003e所有操作文件的函数将只能操作与脚本UID相同的文件\u003c/p\u003e\n\u003cp\u003e虽然safe_mode不是万能的(低版本的PHP可以绕过),但还是强烈建议打开安全模式,在一定程度上能够避免一些未知的攻击。不过启用 safe_mode会有很多限制,可能对应用带来影响,所以还需要调整代码和配置才能和谐。被安全模式限制或屏蔽的函数可以参考PHP手册。\u003c/p\u003e\n\u003cp\u003e函数名\u003c/p\u003e\n\u003cp\u003e限制\u003c/p\u003e\n\u003cp\u003edbmopen()\u003c/p\u003e\n\u003cp\u003e检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。\u003c/p\u003e\n\u003cp\u003edbase_open()\u003c/p\u003e\n\u003cp\u003e检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。 …\u003c/p\u003e"
March 23, 2011
遍历memcache中已缓存的key
"\u003cp\u003e最近需要做一个缓存管理的功能。其中有一个需要模糊匹配memcached的key然后进行删除匹配上的key对应的数据。\u003c/p\u003e\n\u003cp\u003e难点在于memcache 没有提供模糊匹配key删除缓存的功能,也没有提供遍历memcache key的功能。在网上search了下,\u003c/p\u003e\n\u003cp\u003e点击10个连接有9个都是一篇文章的copy。网上最流行的方法发现key不能正确的获得。baidu google 全用上了就是没有解决。。。\u003c/p\u003e\n\u003cp\u003e最后还是抱着试试的心态,终于把问题给解决了。废话少说。说说,我实现的代码:\u003c/p\u003e\n\u003cp\u003e遍历memcache的可以需要有一下几个步骤:\u003c/p\u003e\n\u003cp\u003e1、通过使用memcache 内置方法Memcache::getExtendedStats,首先获得items信息。\u003c/p\u003e\n\u003cp\u003e最后得到的解决类似与\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\n 1 $memcache = new Memcache();\n 2\n 3 $all_items = $memcache-\u0026gt;getExtendedStats(\u0026#39;items\u0026#39;);\n 4\n 5 var_export($all_items);\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\n 1 array (\n 2 …\u003c/code\u003e\u003c/pre\u003e"
March 23, 2011
windows环境下memcache服务器使用经验
"\u003cp\u003e将memcache服务器安装包解压到C:\\memcached文件夹后,使用cmd命令窗口安装。\u003c/p\u003e\n\u003cp\u003e1\u0026gt;开始\u0026gt;运行:CMD(确定)\u003c/p\u003e\n\u003cp\u003e2\u0026gt;cd C:\\memcached(回车)\u003c/p\u003e\n\u003cp\u003e3\u0026gt;memcached -d install(回车 这步执行安装)\u003c/p\u003e\n\u003cp\u003e4\u0026gt;memcached -d start(回车 这步执行启动memcache服务器,默认分配64M内存,使用11211端口)\u003c/p\u003e\n\u003cp\u003e此时memcache服务器已经可以正常使用了。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ememcache服务器安全:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eMemcache服务器端都是直接通过客户端连接后直接操作,没有任何的验证过程,这样如果服务器是直接暴露在互联网上的话是比较危险,轻则数据泄 露被其他无关人员查看,重则服务器被入侵,况且里面可能存在一些我们未知的bug或者是缓冲区溢出的情况,这些都是我们未知的,所以危险性是可以预见的。 为了安全起见,做两点建议,能够稍微的防止黑客的入侵或者数据的泄露。\u003c/p\u003e\n\u003cp\u003e现在就关于修改memcache服务器配置的问题说明如下:\u003c/p\u003e\n\u003cp\u003e1\u0026gt;用内网ip的方式提供web应用服务器调用,不允许直接通过外网调用,如将memcache服务器放 …\u003c/p\u003e"
March 23, 2011
freebsd+php+memcache、memcached安装和使用
"\u003cp\u003e来源: \u003ca href=\"http://www.lifecrunch.biz/archives/55\"\u003ehttp://www.lifecrunch.biz/archives/55\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"memcache-介绍\"\u003eMemcache 介绍\u003c/h2\u003e\n\u003cp\u003ememcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图 像、视频、文件以及数据库检索的结果等。Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,最初为了加速 LiveJournal 访问速度而开发的,后来被很多大型的网站采用。目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。起初作 者编写它可能是为了提高动态网页应用,为了减轻数据库检索的压力,来做的这个缓存系统。它的缓存是一种分布式的,也就是可以允许不同主机上的多个用户同时 访问这个缓存系统, 这种方法不仅解决了共享内存只能是单机的弊端,同时也解决了数据库检索的压力,最大的优点是提高了访问获取数据的速度!基于memcache作者对分布式 cache的理解和解决方案。 memcache完全可以用到其他地方 比如分布式数据库, 分布式计算等领域。\u003c/p\u003e\n\u003cp\u003eMemcache官方网站: …\u003c/p\u003e"
March 23, 2011
Memcache VS Memcached VS MemcacheDB
"\u003cp\u003e1、 简单讲Memcache和Memcached都讲的是同一个开源项目http://memcached.org/,只不过Memcached一般指的是后台的cache server(其实也是一个客户端的,参考php手册).而Memcache指的访问cache server的客户端。Memcached提供了两种访问协议,ASCII和Binary。\u003c/p\u003e\n\u003cp\u003e2、 MemcacheDB=Memcached+BerkeleyDB组成的轻量的持久数据库,与前两者是不同的两个东西。\u003c/p\u003e\n\u003cp\u003e3、作为数据库就要讲究consistency,但是Memcached是一种分布式的缓存机制,因此并不严格要求consistency,而且实际上每个memcached server之间本身不通讯也不共享,所谓的分布式是由memcached的客户端程序来决定的。一般分布式算法采用基于server节点数的取余法,这种方法以node数为基础,因此增减服务器就会造成很大hash失效问题。所以改进的算法一般采用consistent hash算法,这种算法取消了以服务器节点数作为基数的理念,而是直接对服务器的节点进行hash,然后散布 …\u003c/p\u003e"
March 23, 2011
Memcache的安全性
"\u003cp\u003eMemcache服务器端都是直接通过客户端连接后直接操作,没有任何的验证过程,这样如果服务器是直接暴露在互联网上的话是比较危险,轻则数据泄 露被其他无关人员查看,重则服务器被入侵,因为Mecache是以root权限运行的,况且里面可能存在一些我们未知的bug或者是缓冲区溢出的情况,这 些都是我们未知的,所以危险性是可以预见的。为了安全起见,我做两点建议,能够稍微的防止黑客的入侵或者数据的泄露。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e\u003cem\u003e内网访问\u003c/em\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e最好把两台服务器之间的访问是内网形态的,一般是Web服务器跟Memcache服务器之间。普遍的服务器都是有两块网卡,一块指向互联网,一块指向内 网,那么就让Web服务器通过内网的网卡来访问Memcache服务器,我们Memcache的服务器上启动的时候就监听内网的IP地址和端口,内网间的 访问能够有效阻止其他非法的访问。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ememcached -d -m 1024 -u root -l 192.168.0.200 -p 11211 -c 1024 -P /tmp/memcached.pid\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eMemcache服务器端设置监听通过内网的192.168.0.200的ip的11211端口,占 …\u003c/p\u003e"
February 22, 2011
“Xdebug MUST be loaded as a Zend extension in Unknown on line 0 “的解决办法
"\u003cp\u003e\u003cstrong\u003e解决方法:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e找到 php.ini 中的并修改如下:\u003c/p\u003e\n\u003cp\u003e写道\u003c/p\u003e\n\u003cp\u003e;extension=php_xdebug-2.1.0-5.2-vc6.dll\u003c/p\u003e\n\u003cp\u003ezend_extension_ts=”d:/AppServ\\php5\\ext\\php_xdebug-2.1.0-5.2-vc6.dll” //如果有其它提示,将”_ts”去掉就可以了\u003c/p\u003e\n\u003cp\u003exdebug 必须使用 zend_extension_ts 或者 zend_extension 来标明它是zend的扩展\u003c/p\u003e\n\u003cp\u003e写道\u003c/p\u003e\n\u003cp\u003e另:根据 PHP 版本,zend_extension 指令可以是以下之一:\u003c/p\u003e\n\u003cp\u003ezend_extension (non ZTS, non debug build)\u003c/p\u003e\n\u003cp\u003ezend_extension_ts ( ZTS, non debug build)\u003c/p\u003e\n\u003cp\u003ezend_extension_debug (non ZTS, debug build)\u003c/p\u003e\n\u003cp\u003ezend_extension_debug_ts ( ZTS, debug build)\u003c/p\u003e\n\u003cp\u003eZTS:ZEND Thread Safety\u003c/p\u003e\n\u003cp\u003e可通过phpinfo()查看ZTS是否启用,从而决定用zend_extension还 …\u003c/p\u003e"
February 11, 2011
linux实现daemon程序
"\u003cp\u003e\u003cstrong\u003e国外相关文档:()\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e编写Linux系统下Daemon程序的方法步骤\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、引言 Daemon程序是一直运行的服务端程序,又称为守护进程。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e本文介绍了在Linux下编写Daemon程序的步骤,并给出了例子程序。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二、Daemon程序简介\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eDaemon是长时间运行的进程,通常在系统启动后就运行,在系统关闭时才结束。一般说Daemon程序在后台运行,是因为它没有控制终端,无法和前台的用户交互。Daemon程序一般都作为服务程序使用,等待客户端程序与它通信。我们也把运行的Daemon程序称作守护进程。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e三、Daemon程序编写规则\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e编写Daemon程序有一些基本的规则,以避免不必要的麻烦。\u003c/p\u003e\n\u003cp\u003e1、首先是程序运行后调用fork,并让父进程退出。子进程获得一个新的进程ID,但继承了父进程的进程组ID。\u003c/p\u003e\n\u003cp\u003e2、调用setsid创建一个新的session,使自己成为新session和新进程组的leader,并使进程没有控制终端(tty)。\u003c/p\u003e\n\u003cp\u003e3、改变当前工作目录至根目录,以免影响可加载文件系统。或者也可以改变到某些特定的目录。\u003c/p\u003e\n\u003cp\u003e4、设置文件创建mask为0,避免创建文件时权限的影响。\u003c/p\u003e\n\u003cp\u003e5、关闭不需要的打开文件 …\u003c/p\u003e"
February 11, 2011
用c语言实现的daemon实例
"\u003cp\u003e守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。同时,守护进程完成许多系统任务。比如,作业规划进程crond,打印进程lpd等。\u003c/p\u003e\n\u003cp\u003e守护进程的编程本身并不复杂,复杂的是各种版本的Unix的实现机制不尽相同,造成不同Unix环境下守护进程的编程规则并不一致。这需要读者注意,照搬某些书上的规则(特别是BSD4.3和低版本的System V)到Linux会出现错误的。下面将全面介绍Linux下守护进程的编程要点并给出详细实例。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一. 守护进程及其特性\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e守护进程最重要的特性是后台运行。在这一点上DOS下的常驻内存程序TSR与之相似。其次,守护进程必须与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符,控制终端,会话和进程组,工作目录以及文件创建掩模等。这些环境通常是守护进程从执行它的父进程(特别是shell)中继承下来的。最后,守护进程的启动方式有其特殊之处。它可以在Linux系统启 …\u003c/p\u003e"
February 9, 2011
[sed] 鸟哥sed知识补遗
"\u003cp\u003e接自:\u003cstrong\u003e鸟哥Sed知识补遗****格式\u003c/strong\u003e sed [-nefr] [n1,n2] 动作\u003c/p\u003e\n\u003cp\u003e-n 安静模式,只有经过sed处理过的行才显示出来,其他不显示。\u003c/p\u003e\n\u003cp\u003e-e 直接在命令行模式上进行sed的操作。貌似是默认选项,不用写。\u003c/p\u003e\n\u003cp\u003e-f 将sed的操作写在一个文件里,用的时候 -f filename 就可以按照内容进行sed操作了。\u003c/p\u003e\n\u003cp\u003e-r 使之支持扩展正则表达式\u003c/p\u003e\n\u003cp\u003en1,n2 不一定需要, 选择要进行处理的行, 10,20 表示在10~20行之间处理\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e动作\u003c/strong\u003e\na 添加,接字符串,添加到当前行的下一行。\nc 替换, 接字符串,用他们替换n1到n2之间的行。\nd 删除符合模式的行 sed ‘/regexp/d’ // 之间是正则表达式,模式在d前面,d后面一般不接任何内容。\ni 插入,接字符串,添加到当前行的上一行。\u003c/p\u003e\n\u003cp\u003ep 打印,打印某个选择的数据,通常与-n 安静模式一起使用\u003c/p\u003e\n\u003cp\u003es 搜索, 还可以替换,类似与vim里的搜索替换功能。例如 1,20s/old/new/g 替换1~20行的old为new\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e注意动作最好用’ ‘括起来,防止空格导致错误。\u003c/strong\u003e \u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/02/sed.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/sed.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e例子:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e显示 passwd内容,将2~5 …\u003c/p\u003e"
February 9, 2011
[awk] awk学习资料汇总
"\u003cp\u003e原文链接: \u003ca href=\"http://bbs.linuxtone.org/thread-1714-1-1.html\"\u003ehttp://bbs.linuxtone.org/thread-1714-1-1.html\u003c/a\u003e\n一、AWK学习资料汇总\u003c/p\u003e\n\u003cp\u003e1、 \u003ca href=\"http://bbs.linuxtone.org/thread-222-1-1.html\"\u003eawk学习笔记\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e2、 \u003ca href=\"http://bbs.linuxtone.org/thread-678-1-2.html\"\u003eIBM AWK 学习资料\u003c/a\u003e[推荐]\u003c/p\u003e\n\u003cp\u003e3、 \u003ca href=\"http://bbs.linuxtone.org/thread-334-1-2.html\"\u003eawk实例\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e4、 \u003ca href=\"http://bbs.linuxtone.org/thread-267-1-2.html\"\u003eawk学习笔记2\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e5、 \u003ca href=\"http://bbs.linuxtone.org/thread-227-1-2.html\"\u003eawk用法小结\u003c/a\u003e [推荐]\u003c/p\u003e\n\u003cp\u003e6、 \u003ca href=\"http://bbs.linuxtone.org/thread-224-1-2.html\"\u003eawk学习实操\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e7、 \u003ca href=\"http://bbs.linuxtone.org/thread-223-1-2.html\"\u003eAWK:Linux 管理员的智能工具包\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e8、 \u003ca href=\"http://www.linux.gov.cn/shell/awk.htm\"\u003e肥肥的AWK学习笔记\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e9、 \u003ca href=\"http://bbs.linuxtone.org/thread-2777-1-1.html\"\u003eAWK命令小结\u003c/a\u003e [推荐]\u003c/p\u003e"
January 22, 2011
第 7 章进程控制开发
"\u003cp\u003e本章目标\u003c/p\u003e\n\u003cp\u003e文件是 Linux 中最常见最基础的操作对象,而进程则是系统调度的单位,在上一章学习了文件I/O 控制之后,本章主要讲解进程控制开发部分,通过本章的学习,读者将会掌握以下内容。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e掌握进程相关的基本概念\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e掌握 Linux 下的进程结构\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e掌握 Linux 下进程创建及进程管理\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e掌握 Linux下进程创建相关的系统调用\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e掌握守护进程的概念\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e掌握守护进程的启动方法\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e掌握守护进程的输出及建立方法\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e学会编写多进程程序\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e学会编写守护进程\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e7.1 Linux 下进程概述\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e7.1.1 进程相关基本概念\u003c/p\u003e\n\u003cp\u003e1.进程的定义\u003c/p\u003e\n\u003cp\u003e进程的概念首先是在60年代初期由MIT的Multics系统和IBM的TSS/360系统引入的。\u003c/p\u003e\n\u003cp\u003e经过了40 多年的发展,人们对进程有过各种各样的定义。现列举较为著名的几种。\u003c/p\u003e\n\u003cp\u003e(1)进程是一个独立的可调度的活动(E. Cohen,D. Jofferson)\u003c/p\u003e\n\u003cp\u003e(2)进程是一个抽象实体,当它执行某个任务时,将要分配和释放各种资源(P. Denning)\u003c/p\u003e\n\u003cp\u003e(3)进程是可以并行执行的计算部分。(S. E. Madnick,J. T. Donovan) …\u003c/p\u003e"
January 22, 2011
6.5.2 文件读写
"\u003cp\u003e\u003cstrong\u003e1.读文件\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(1)fread函数说明\u003c/p\u003e\n\u003cp\u003e在文件流打开之后,可对文件流进行读写等操作,其中读操作的函数为fread。\u003c/p\u003e\n\u003cp\u003e(2)fread函数格式\u003c/p\u003e\n\u003cp\u003efread函数格式如表6.18所示。\u003c/p\u003e\n\u003cp\u003e表6.18 fread函数语法要点\u003c/p\u003e\n\u003cp\u003e所需头文件 #include\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e函数原型\u003c/strong\u003e size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)\u003c/p\u003e\n\u003cp\u003eptr:存放读入记录的缓冲区\u003c/p\u003e\n\u003cp\u003esize:读取的记录大小\u003c/p\u003e\n\u003cp\u003enmemb:读取的记录数\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e函数传入值\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003estream:要读取的文件流\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e函数返回值\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e成功:返回实际读取到的nmemb数目\u003c/p\u003e\n\u003cp\u003e失败:EOF\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2.写文件\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(1)fwrite函数说明\u003c/p\u003e\n\u003cp\u003efwrite函数是用于对指定的文件流进行写操作。\u003c/p\u003e\n\u003cp\u003e(2)fwrite函数格式\u003c/p\u003e\n\u003cp\u003efwrite函数格式如表6.19 所示。\u003c/p\u003e\n\u003cp\u003e表6.19 fwrite函数语法要点\u003c/p\u003e\n\u003cp\u003e所需头文件#include\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e函数原型\u003c/strong\u003e size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream)\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e函数传入值ptr\u003c/strong\u003e:存放写入记录的缓冲区\u003c/p\u003e\n\u003cp\u003esize:写 …\u003c/p\u003e"
January 22, 2011
6.5 标准 I/O 开发
"\u003cp\u003e本章前面几节所述的文件及I/O 读写都是基于文件描述符的。这些都是基本的I/O 控制,是不带缓存的。而本节所要讨论的I/O 操作都是基于流缓冲的,它是符合ANSI C的标准I/O处理,这里有很多函数读者已经非常熟悉了(如printf、scantf 函数等),因此本节中仅简要介绍最主要的函数。\u003c/p\u003e\n\u003cp\u003e标准 I/O 提供流缓冲的目的是尽可能减少使用read和write调用的数量。标准I/O 提供了3 种类型的缓冲存储。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e· 全缓冲\u003c/strong\u003e。在这种情况下,当填满标准I/O 缓存后才进行实际I/O 操作。对于驻在磁盘上的文件通常是由标准I/O 库实施全缓冲的。在一个流上执行第一次I/O 操作时,通常调用malloc就是使用全缓冲。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e· 行缓冲\u003c/strong\u003e。在这种情况下,当在输入和输出中遇到新行符时,标准I/O 库执行I/O 操作。\n这允许我们一次输出一个字符(如fputc 函数),但只有写了一行之后才进行实际I/O 操作。\n当流涉及一个终端时(例如标准输入和标准输出),典型地使用行缓冲。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e· 不带缓冲\u003c/strong\u003e。标准I/O库不对字符进行缓冲。如果用标准I/O函数写若干字符到不带缓冲的流中,则相当于用write系统的用函数将这些字 …\u003c/p\u003e"
January 21, 2011
6.2 Linux 中文件及文件描述符概述
"\u003cp\u003e正如第1 章中所述,在Linux 中对目录和设备的操作都等同于文件的操作,因此,大大简化了系统对不同设备的处理,提高了效率。Linux 中的文件主要分为4 种:普通文件、目录文件、链接文件和设备文件。\u003c/p\u003e\n\u003cp\u003e那么,内核如何区分和引用特定的文件呢?这里用到的就是一个重要的概念——文件描述符。对于Linux 而言,所有对设备和文件的操作都使用文件描述符来进行的。文件描述符是一个非负的整数,它是一个索引值,并指向内核中每个进程打开文件的记录表。当打开一个现存文件或创建一个新文件时,内核就向进程返回一个文件描述符;当需要读写文件时,也需要把文件描述符作为参数传递给相应的函数。\u003c/p\u003e\n\u003cp\u003e通常,一个进程启动时,都会打开3 个文件:标准输入、标准输出和标准出错处理。这3 个文件分别对应文件描述符为0、1 和2(也就是宏替换STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO,鼓励读者使用这些宏替换)。\u003c/p\u003e\n\u003cp\u003e基于文件描述符的I/O 操作虽然不能移植到类Linux 以外的系统上去(如Windows),但它往往是实现某些I/O操作的惟一途径,如Linux中低级文件操作函数、多 …\u003c/p\u003e"
January 19, 2011
用PHP命令行控制脚本[CLI]
"\u003cp\u003eCLI :Command-Line Script(CLI – Command-Line Interface) //翻译;命令行接口\u003c/p\u003e\n\u003cp\u003e字串5\u003c/p\u003e\n\u003cp\u003ePHP CLI(Command Line Interface). \u003ca href=\"http://www.php.net/\"\u003ehttp://www.php.net/\u003c/a\u003e 预设支援CLI 了,什么是CLI,也就是Command Line Interface,简单的说,就是让你可以在系统上当shell 来跑。 如果还不懂,简单的说,就像你写perl 程式一样:\n#!/usr/local/bin/php\necho “Hello World!”;\n?\u0026gt;\u003c/p\u003e\n\u003cp\u003e字串3\n———————————————————官方[PHP 手册]叙述:\u003c/p\u003e\n\u003cp\u003e从版本 4.3.0 开始,PHP 提供了一种新类型的 SAPI(Server Application Programming Interface,服务端应用编程端口)支持,名为 CLI,意为 Command Line Interface,即命令行接口。顾名思义,该 SAPI 模块主要用作 PHP 的开发外壳应用。CLI SAPI 和其它 SAPI 模块相比有很多的不同之处,我们将在本章 …\u003c/p\u003e"
January 13, 2011
3.6.4 Make管理器的使用
"\u003cp\u003e使用Make管理器非常简单,只需在make命令的后面键入目标名即可建立指定的目标,如果直接运行make,则建立Makefile中的第一个目标。\u003c/p\u003e\n\u003cp\u003e此外 make 还有丰富的命令行选项,可以完成各种不同的功能。下表3.17 列出了常用的make命令行选项。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e表3.17 make的命令行选项\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e命 令 格 式 含 义\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e-C dir 读入指定目录下的Makefile\u003c/p\u003e\n\u003cp\u003e-f file 读入当前目录下的file文件作为Makefile\u003c/p\u003e\n\u003cp\u003e-i 忽略所有的命令执行错误\u003c/p\u003e\n\u003cp\u003e-I dir 指定被包含的Makefile所在目录\u003c/p\u003e\n\u003cp\u003e-n 只打印要执行的命令,但不执行这些命令\u003c/p\u003e\n\u003cp\u003e-p 显示make变量数据库和隐含规则\u003c/p\u003e\n\u003cp\u003e-s 在执行命令时不显示命令\u003c/p\u003e\n\u003cp\u003e-w 如果make在执行过程中改变目录,则打印当前目录名\u003c/p\u003e\u003c/blockquote\u003e"
January 13, 2011
3.6.3 Makefile规则
"\u003cp\u003eMakefile 的规则是Make 进行处理的依据,它包括了目标体、依赖文件及其之间的命令语句。一般的,Makefile 中的一条语句就是一个规则。在上面的例子中,都显示地指出了Makefile中的规则关系,如“$(CC) $(CFLAGS) -c $\u0026lt; -o $@”,但为了简化Makefile的编写,make还定义了隐式规则和模式规则,下面就分别对其进行讲解。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.隐式规则\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e隐含规则能够告诉make 怎样使用传统的技术完成任务,这样,当用户使用它们时就不必详细指定编译的具体细节,而只需把目标文件列出即可。Make 会自动搜索隐式规则目录来确定如何生成目标文件。如上例就可以写成:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOBJS = kang.o yul.o\u003c/p\u003e\n\u003cp\u003eCC = Gcc\u003c/p\u003e\n\u003cp\u003eCFLAGS = -Wall -O -g\u003c/p\u003e\n\u003cp\u003esunq : $(OBJS)\u003c/p\u003e\n\u003cp\u003e$(CC) $^ -o $@\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e为什么可以省略后两句呢?因为Make的隐式规则指出:所有“.o”文件都可自动由“.c”\u003c/p\u003e\n\u003cp\u003e文件使用命令“$(CC) $(CPPFLAGS) $(CFLAGS) -c file.c –o file.o”生成。这样“kang.o”和“yul.o”就会 …\u003c/p\u003e"
January 13, 2011
3.6.2 Makefile变量
"\u003cp\u003e上面示例的Makefile在实际中是几乎不存在的,因为它过于简单,仅包含两个文件和一个命令,在这种情况下完全不必要编写Makefile 而只需在Shell 中直接输入即可,在实际中使用的Makefile往往是包含很多的文件和命令的,这也是Makefile产生的原因。下面就可给\u003c/p\u003e\n\u003cp\u003e出稍微复杂一些的Makefile进行讲解:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003esunq\u003c/strong\u003e:kang.o yul.o\u003c/p\u003e\n\u003cp\u003eGcc kang.o bar.o -o myprog\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ekang.o\u003c/strong\u003e : kang.c kang.h head.h\u003c/p\u003e\n\u003cp\u003eGcc –Wall –O -g –c kang.c -o kang.o\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eyul.o\u003c/strong\u003e : bar.c head.h\u003c/p\u003e\n\u003cp\u003eGcc – Wall –O -g –c yul.c -o yul.o\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e在这个Makefile中有3 个目标体(target),分别为sunq、kang.o和yul.o,其中第一个目标体的依赖文件就是后两个目标体。如果用户使用命令“make sunq”,则make管理器就是找到sunq目标体开始执行。\u003c/p\u003e\n\u003cp\u003e这时,make会自动检查相关文件的时间戳。首先,在检查“kang.o”、“yul.o”和“sunq”3 个文件 …\u003c/p\u003e"
January 13, 2011
3.6.1 Makefile基本结构
"\u003cp\u003e\u003cstrong\u003e3.6.1 Makefile基本结构\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eMakefile 是Make 读入的惟一配置文件,因此本节的内容实际就是讲述Makefile 的编写规则。在一个Makefile中通常包含如下内容:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e需要由make工具创建的目标体(target),通常是目标文件或可执行文件;\u003c/li\u003e\n\u003cli\u003e要创建的目标体所依赖的文件(dependency_file);\u003c/li\u003e\n\u003cli\u003e创建每个目标体时需要运行的命令(command)。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e它的格式为:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003etarget: dependency_files\u003c/p\u003e\n\u003cp\u003ecommand\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e例如,有两个文件分别为hello.c 和hello.h,创建的目标体为hello.o,执行的命令为gcc\u003c/p\u003e\n\u003cp\u003e编译指令:gcc –c hello.c,那么,对应的Makefile就可以写为:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#The simplest example\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ehello.o: hello.c hello.h\u003c/strong\u003e \u003cstrong\u003e//\u003cstrong\u003e\u003cstrong\u003e要创建的目标体所偏依赖的文件\u003c/strong\u003e\u003c/strong\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003egcc\u003c/strong\u003e **–**\u003cstrong\u003ec hello.c\u003c/strong\u003e **–**\u003cstrong\u003eo hello.o\u003c/strong\u003e \u003cstrong\u003e//\u003cstrong\u003e\u003cstrong\u003e创建目标体要运行的命令\u003c/strong\u003e\u003c/strong\u003e\u003c/strong\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e接着就可以使用make了。使用make的格式为:make target,这样make就会自动读入Makefile(也可 …\u003c/p\u003e"
January 6, 2011
OAuth 核心 1.0 版 中文翻译版
"\u003cp\u003eOAuth 核心 1.0\nAbstract\nOAuth协议致力于使网站和应用程序(统称为消费方)能够在无须用户透露其认证证书的情况下,通过API访问某个web服务(统称为服务提供方)的受保护资源。更一般地说,OAuth为API认证提供了一个可自由实现且通用的方法。\u003c/p\u003e\n\u003cp\u003e一个典型的例子是某打印服务提供商printer.example.com(消费方),希望在无须用户提供其照片存储站点密码的情况下,访问用户储存在photos.example.net(服务提供方)上的个人照片。\u003c/p\u003e\n\u003cp\u003eOAuth不强求一个特定的用户接口或操作模式,也不限定服务提供方如何验证用户,特别适合认证证书对消费方不可用的情况,例如OpenID。\u003c/p\u003e\n\u003cp\u003eOAuth致力于为托管web服务认证提供统一的体验和实现,形成一个社区驱动的协议。OAuth构建于已被多个站点独立实现的已有协议和最佳化实践之上,是一个被大小服务提供者所支持、并为应用开发者和用户增进持续性和可信度的开放标准。\u003c/p\u003e\n\u003cp\u003e——————————————————————————–\u003c/p\u003e\n\u003cp\u003eTable of Contents\n1. 作者\n2. 记号与惯例\n3. 术语定义\n4. …\u003c/p\u003e"
December 20, 2010
50个非常有用的PHP工具
"\u003ch3 id=\"php是使用最为广泛的开源服务器端脚本语言之一当然php并不是速度最快的但它却是最常用的脚本语言这里有50个有益的php工具可以大大提高你的编程工作\"\u003ePHP是使用最为广泛的开源服务器端脚本语言之一,当然PHP并\u003ca href=\"http://izumi.plan99.net/blog/index.php/2008/01/17/ruby-vs-php-performance/\"\u003e不是速度最快\u003c/a\u003e的,但它却是\u003ca href=\"http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html\"\u003e最常用的脚本语言\u003c/a\u003e。这里有50个有益的PHP工具,可以大大提高你的编程工作:\u003c/h3\u003e\n\u003ch3 id=\"调试工具\"\u003e调试工具\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://code.google.com/p/webgrind/\"\u003eWebgrind\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://xdebug.org/index.php\"\u003eXdebug\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://gubed.mccabe.nu/\"\u003eGubed PHP Debugger\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.php-debugger.com/dbg/\"\u003eDBG\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.php-debug.com/www/\"\u003ePHP_Debug\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://sourceforge.net/projects/php-dyn/\"\u003ePHP_Dyn\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.bluestatic.org/software/macgdbp/\"\u003eMacGDBp\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"测试和优化工具\"\u003e测试和优化工具\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://www.phpunit.de/\"\u003ePHPUnit\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.simpletest.org/\"\u003eSimpleTest\u003c/a\u003e\n\u003ca href=\"http://www.simpletest.org/\"\u003e\u003cimg src=\"http://www.simpletest.org/images/simpletest-logo.png\" alt=\"Simpletest\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://selenium-rc.openqa.org/\"\u003eSelenium\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://matrix.squiz.net/developer/tools/php_cs\"\u003ePHP_CodeSniffer\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://dbug.ospinto.com/\"\u003edBug\u003c/a\u003e\n\u003ca href=\"http://dbug.ospinto.com/\"\u003e\n\u003cimg src=\"http://www.javaeye.com/upload/attachment/70647/69c5a918-6d6b-36fc-a619-1f3e0175fdf4.jpg\" alt=\"\"\u003e\n\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.coderholic.com/php-profile-class/\"\u003ePHP Profile Class\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"文档工具\"\u003e文档工具\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://phpdoc.org/\"\u003ephpDocumentor\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://phpdox.net/\"\u003ePHP DOX\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"安全工具\"\u003e安全工具\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://www.phpcaptcha.org/\"\u003eSecurimage\u003c/a\u003e :验证码工具。\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://trac.anl.gov/scavenger/wiki/WikiStart\"\u003eScavenger\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://php-ids.org/\"\u003ePHP-IDS\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://blog.evaria.com/2007/pixy-the-php-security-scanner/\"\u003ePixy\u003c/a\u003e :代码检查工具。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"图形处理\"\u003e图形处理\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://www.maani.us/charts4/\"\u003ePHP/SWF Charts\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://pchart.sourceforge.net/index.php\"\u003epChart – a chart-drawing PHP library\u003c/a\u003e\n\u003ca href=\"http://simplepie.org/\"\u003e\n\u003cimg src=\"http://www.javaeye.com/upload/attachment/70649/60c3f0c2-7ac6-3c82-90d7-6584e631eb24.jpg\" alt=\"\"\u003e\n\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://wideimage.sourceforge.net/wiki/MainPage\"\u003eWideImage\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.magickwand.org/\"\u003eMagickWand For PHP\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"代码优化\"\u003e代码优化\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://pear.php.net/package/PHP_Beautifier\"\u003ePHP_Beautifier\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.waterproof.fr/products/phpCodeBeautifier/\"\u003ePHPCodeBeautifier\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://qbnz.com/highlighter/\"\u003eGeSHi – Generic Syntax Highlighter\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"版本控制系统\"\u003e版本控制系统\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://phing.info/trac/\"\u003ePhing …\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e"
November 23, 2010
Allowed memory size of 8388608 bytes exhausted解决方法
"\u003cp\u003e出现该错误的原因:\u003c/p\u003e\n\u003cp\u003e是因为php页面消耗的最大内存默认是为 8M (在PHP的ini件里可以看到) ,如果文件太大 或图片太大 在读取的时候 会发生上述错误。\u003c/p\u003e\n\u003cp\u003e解决办法:\u003c/p\u003e\n\u003cp\u003e1,修改 php.ini\n将memory_limit由 8M 改成 16M(或更大),重启apache服务\u003c/p\u003e\n\u003cp\u003e2,在PHP 文件中 加入 ini_set(”memory_limit”,”100M”);\u003c/p\u003e\n\u003cp\u003e注意:为了系统的其它资源的正常使用 请您不要将 memory_limit设置太大,其中-1为不限\u003c/p\u003e\n\u003cp\u003e3,修改.htaccess 文档(前提是该目录支持.htaccess)\n在文档中新增一句:php_value memory_limit 16M(或更大)\u003c/p\u003e"
November 19, 2010
shell中的test表达式
"\u003cp\u003e摘自:UNIX Shell编程24学时编程\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e10.1.2 使用test\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e更常见的情况是,提供给if语句的清单是一个或更多个test命令,它们通过调用test命令而被激活,语法如下:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003etest expression\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这里,expression为test命令构造的表达式,该表达式的构造使用了特殊选项之一.在计算完表达式的值后,test命令或者返回0(真)或者返回1(假).\u003c/p\u003e\n\u003cp\u003e可用”[“命令对test命令进行缩写:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[ expression ]\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这里expression是test命令可以理解的任何有效表达式,该简化格式将是读者可能会踫见的最常用格式.\u003c/p\u003e\n\u003cp\u003etest可理解的表达式类型分为三类:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e文件测试.\n字符串比较.\n数字比较.\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e读者将逐步学业习这三类,另外,还会学习到复合表达式.\u003c/p\u003e\n\u003cp\u003e注意:在使用”[“简写test时,左中括号后面的空格和右括号前面的空格是必需的,如果没有空格,Shell不可能辨别表达式何时开始何时结束.\u003c/p\u003e\n\u003cp\u003e选项\u003c/p\u003e\n\u003cp\u003e描述\u003c/p\u003e\n\u003cp\u003e-b file\u003c/p\u003e\n\u003cp\u003e若文件存在且是一个块特殊文件,则为真\u003c/p\u003e\n\u003cp\u003e-c file\u003c/p\u003e\n\u003cp\u003e若文件存在且是一个字符特殊文件,则为真\u003c/p\u003e\n\u003cp\u003e-d file\u003c/p\u003e\n\u003cp\u003e若文件存在且是一个目录,则为真\u003c/p\u003e\n\u003cp\u003e-e …\u003c/p\u003e"
November 19, 2010
Shell中变量基础
"\u003cp\u003eshell中的只读变量:使用readonly关键字,后面加上变量名即可,如\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#name=’sxf’\u003c/p\u003e\n\u003cp\u003e#readonly name\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e即可.如果后面修改name的值,如\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#name=’tom’\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e会提示\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e"-bash: name: readonly variable"\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e错误信息.\u003c/p\u003e\n\u003cp\u003e在shell中删除变量只要用\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eunset variable\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e即可.但不能删除只读变量.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eshell中环境变量分三种:局部变量,环境变量,Shell变量\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e局部变量(local variable)是只在当前shell实例中存在的变量,而由其他Shel启动的程序不能使用该变量.\u003c/p\u003e\n\u003cp\u003e环境变量(environment variable)是Shell的任何子进程都能使用的变量,许多程序要正确运行都需要使用环境变量.通常Shell脚本只定义程序运行时所需要的环境变量.\u003c/p\u003e\n\u003cp\u003eShell变量(Shell variable)是Shell变量的特殊变量,也是Shell正确运行所必需的,这些变量有些是环境变量而有些是局部变量.\u003c/p\u003e\n\u003cp\u003e通常,为清楚地表示该变量是环境变量,一般将赋值语句和导出语句写在同一行,这可以帮助下一个维护该脚本的程序员快速 …\u003c/p\u003e"
November 18, 2010
DDOS攻击分析与预防专题
"\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/11/ddos2.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/11/ddos2.jpg\" alt=\"\"\u003e\u003c/a\u003eDDOS是英文Distributed Denial of Service的缩写,意即”分布式拒绝服务”,DDOS的中文名叫分布式拒绝服务攻击,俗称洪水攻击。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eDDoS攻击概念\u003c/strong\u003e\nDDoS攻击手段是在传统的DoS攻击基础之上产生的一类攻击方式。单一的DoS攻击一般是采用一对一方式的,当攻击目标CPU速度低、内存小或者网络带宽小等等各项性能指标不高它的效果是明显的。随着计算机与网络技术的发展,计算机的处理能力迅速增长,内存大大增加,同时也出现了千兆级别的网络,这使得DoS攻击的困难程度加大了 – 目标对恶意攻击包的”消化能力”加强了不少,例如你的攻击软件每秒钟可以发送3,000个攻击包,但我的主机与网络带宽每秒钟可以处理10,000个攻击包,这样一来攻击就不会产生什么效果。\u003c/p\u003e\n\u003cp\u003e这时候分布式的拒绝服务攻击手段(DDoS)就应运而生了。你理解了DoS攻击的话,它的原理就很简单。\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/11/ddos.gif\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/11/ddos.gif\" alt=\"\"\u003e\u003c/a\u003e如果说计算机与网络的处理能力加大了10倍,用一台攻击机来攻击不再能起作用的话,攻击者使用10台攻击机同时攻击呢?用100台呢?DDoS就是利用更多的傀儡机来发起进攻,以比从前更大的规模来进攻受害者。\n高速广泛连接的网络给大家 …\u003c/p\u003e"
November 18, 2010
PHP autoload 机制
"\u003cp\u003e\u003cstrong\u003e1\u003c/strong\u003e**、简介******\u003c/p\u003e\n\u003cp\u003ePHP5中引入了类的自动装载(autoload)机制。autoload机制可以使得PHP程序有可能在使用类时才自动包含类文件,而不是一开始就将所有的类文件include进来,这种机制也称为lazy loading。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e例子:\u003c/strong\u003e****\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/* autoload.php */\nfunction __autoload($classname) {\nrequire_once ($classname . “class.php”);\n}\n$person = new Person(”Altair”, 6);\nvar_dump ($person);\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e通常PHP5在使用一个类时,如果发现这个类没有加载,就会自动运行__autoload()函数,在这个函数中我们可以加载需要使用的类。\u003c/p\u003e\n\u003cp\u003eautoload至少要做三件事情,\u003cstrong\u003e第一件事是根据类名确定类文件名\u003c/strong\u003e,\u003cstrong\u003e第二件事是确定类文件所在的磁盘路径\u003c/strong\u003e(在我们的例子是最简单的情况,类与调用它们的 PHP程序文件在同一个文件夹下),\u003cstrong\u003e第三件事是将类从磁盘文件中加载到系统中\u003c/strong\u003e。第三步最简单,只需要使用include/require即可。要实现第一 步,第二步的 …\u003c/p\u003e"
November 17, 2010
牛人写的. 高级PHP应用程序漏洞审核技术
"\u003cp\u003e一个安全界的牛人写的. 很不错..\n\u003cstrong\u003e[目录]\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e前言\u003c/li\u003e\n\u003cli\u003e传统的代码审计技术\u003c/li\u003e\n\u003cli\u003ePHP版本与应用代码审计\u003c/li\u003e\n\u003cli\u003e其他的因素与应用代码审计\u003c/li\u003e\n\u003cli\u003e扩展我们的字典\n5.1 变量本身的key\n5.2 变量覆盖\n5.2.1 遍历初始化变量\n5.2.2 parse_str()变量覆盖漏洞\n5.2.3 import_request_variables()变量覆盖漏洞\n5.2.4 PHP5 Globals\n5.3 magic_quotes_gpc与代码安全\n5.3.1 什么是magic_quotes_gpc\n5.3.2 哪些地方没有魔术引号的保护\n5.3.3 变量的编码与解码\n5.3.4 二次攻击\n5.3.5 魔术引号带来的新的安全问题\n5.3.6 变量key与魔术引号\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e5.4 代码注射\n5.4.1 PHP中可能导致代码注射的函数\n5.4.2 变量函数与双引号\n5.5 PHP自身函数漏洞及缺陷\n5.5.1 PHP函数的溢出漏洞\n5.5.2 PHP函数的其他漏洞\n5.5.3 session_destroy()删除文件漏洞\n5.5.4 随机函数\n5.6 特殊字符\n5.6.1 截断\n5.6.1.1 include …\u003c/p\u003e"
November 8, 2010
PHP autoload机制详解
"\u003cp\u003e\u003cstrong\u003e(1) autoload机制概述\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进行复用,同时将来维护时也很便利。这也是OO设计的基本思想之一。在PHP5之前,如果需要使用一个类,只需要直接使用include/require将其包含进来即可。下面是一个实际的例子:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/* Person.class.php */\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eclass Person {\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003evar $name, $age;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003efunction __construct ($name, $age)\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e{\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e$this-\u0026gt;name = $name;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e$this-\u0026gt;age = $age;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e}\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e}\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e?\u0026gt;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/* no_autoload.php */\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003erequire_once (”Person.class.php”);\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e$person = new Person(”Altair”, 6);\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003evar_dump ($person);\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e?\u0026gt;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e在这个例子 …\u003c/p\u003e"
November 1, 2010
使用FreeBSD构建流量控制防火墙
"\u003cp\u003e\u003cstrong\u003e概述\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e利用FreeBSD内核支持的BRIDGE、IPFIREWALL以及DUMMYNET选项,可以建立基于FreeBSD的透明流量控制防火墙(桥接模式),起到限制流量和包过滤的功能。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e准备\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e可以在任何FreeBSD的兼容硬件上构建流量控制防火墙,但是基于性能和管理上的考虑,建议:\u003c/p\u003e\n\u003cp\u003e使用Intel PII450以上的处理器\u003c/p\u003e\n\u003cp\u003e使用至少128MB RAM\u003c/p\u003e\n\u003cp\u003e使用高性能10/100Mbps自适应网络适配器\u003c/p\u003e\n\u003cp\u003e如果多于一组桥接设备,建议使用双处理器系统\u003c/p\u003e\n\u003cp\u003e另外准备一块单独的网络适配器用于管理\u003c/p\u003e\n\u003cp\u003e——————————————————————————–\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e实例\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e联想万全1300 PC服务器,具有一颗Intel PII300处理器,配置有128MB RAM,主板集成Intel 82557网络适配器,另外安装了4块3Com 3C905B 10/100Mbps自适应PCI网络适配器。\u003c/p\u003e\n\u003cp\u003e——————————————————————————–\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e安装\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e安装最新版本的FreeBSD。可以从www.FreeBSD.org获取当前的FreeBSD版本信息,并且获得安装源文件。可以使用光盘安装和FTP安装方式。为了保证最好的硬件 …\u003c/p\u003e"
October 31, 2010
C语言中指针变量和数组的组合
"\u003cp\u003eint a[10];\u003c/p\u003e\n\u003cp\u003eint * p;\u003c/p\u003e\n\u003cp\u003eC语言规定数组名代表数组中第一个元素(即序号为0的元素)的地址,因此,下面两个语句等价:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ep = \u0026amp;a[0];\u003c/p\u003e\n\u003cp\u003ep = a;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e摘自:C语言程序设计(第二版)p211\u003c/p\u003e\n\u003cp\u003e(5)指针变量的值是可以改变的,见下例。\u003c/p\u003e\n\u003cp\u003e例10.20 改变指针变量的值。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#include \u0026lt;stdio.h\u0026gt;\nvoid main()\n{\nchar *a = \u0026#34;I love China!\u0026#34;:\na = a + 7;\nprintf(\u0026#34;%s\u0026#34;, a);\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e运行结果如下:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eChina!\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e指针变量a的值是可以变化的,输出字符串是地从a当时所指向的单元开始输出各个字符,起码到遇’\\0’为止。而数组名虽然代表地址,但它是常量,它的值是不能改变的。下面的用法是错误的:\u003c/p\u003e\n\u003cp\u003echar str[] = {“I love China!”};\u003c/p\u003e\n\u003cp\u003estr = str + 7;\u003c/p\u003e\n\u003cp\u003eprintf(“%s”, str);\u003c/p\u003e\n\u003cp\u003e需要说明,若定义了一个指针变量, 并使它指向一个字符串,就可以用下标形式引用指针变量所指的字符串中的字符。\u003c/p\u003e\n\u003cp\u003e例10.21 用带下标的字符指针变 …\u003c/p\u003e"
October 27, 2010
c语言中的scanf语法
"\u003cp\u003escanf函数,与 \u003ca href=\"http://baike.baidu.com/view/410546.htm\"\u003eprintf\u003c/a\u003e 函数一样,都被定义在 \u003ca href=\"http://baike.baidu.com/view/538727.htm\"\u003estdio.h\u003c/a\u003e 里,因此在使用scanf函数时要加上#include。它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中,其关键字最末一个字母f即为“格式”(format)之意。\u003c/p\u003e\n\u003ch2 id=\"scanf函数的一般形式\"\u003escanf函数的一般形式\u003c/h2\u003e\n\u003cp\u003escanf(格式控制,地址表列)\u003c/p\u003e\n\u003cp\u003eint scanf(char *format[,argument,…]);\u003c/p\u003e\n\u003cp\u003e“格式控制”的含义同printf函数;“地址表列”是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003escanf()函数返回成功赋值的数据项数,读到文件末尾出错时则返回EOF。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e例:使用scanf函数输入数据。\u003c/p\u003e\n\u003cp\u003e在visual c++ 6.0上的编写方式。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#include\u003c/p\u003e\n\u003cp\u003evoid main()\u003c/p\u003e\n\u003cp\u003e{\u003c/p\u003e\n\u003cp\u003eint a,b,c;\u003c/p\u003e\n\u003cp\u003eprintf(“please input a,b,c”);\u003c/p\u003e\n\u003cp\u003escanf(“%d,%d,%d”,\u0026amp;a,\u0026amp;b,\u0026amp;c);\u003c/p\u003e\n\u003cp\u003eprintf(“a=%d,b=%d,c=%d”,a,b,c);\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e在Dev-C++上运行程序为:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#include\u003c/p\u003e\n\u003cp\u003eint …\u003c/p\u003e\u003c/blockquote\u003e"
October 25, 2010
Windows 下为PHP添加扩展模块初探
"\u003cp\u003e说明:\u003c/p\u003e\n\u003cp\u003e本人新手,虽然用过很长时间的php,也写过一些简单php程序,但是一直没有对php的扩展模块有过研究。最近因为开发需要,要给一些php应用扩展功能,虽然手边有以前开发好的C程序,用popen等运行之也可以使用,但是从效率、调用便捷性、代码完整性等方面考虑总是觉得popen方式有些不妥,因此萌生了写个扩展模块的念头。于是乎上网找资料,并且初步完成了一个最基本的php扩展模块的框架。在此特别感谢花总的友情支持。\u003c/p\u003e\n\u003cp\u003ebtw: 本文所说的相关技术已经很陈旧了,实在不适合用“初探”这个词,但是于我个人而言,却又的确是初探,现总结出来,分享之。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e0、环境说明\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e框架生成环境:\u003c/p\u003e\n\u003cp\u003eFreeBSD 6.0-STABLE ( 用各版本 Linux 或者 cygwin 也可以,不过我手边只有 bsd,就用它了 )\u003c/p\u003e\n\u003cp\u003ePHP-4.4.4 源码包 (php-4.4.4.tar.bz2 或 php-4.4.4.tar.gz)\u003c/p\u003e\n\u003cp\u003e开发工具:\u003c/p\u003e\n\u003cp\u003eVC++ 6.0 ( 我没有用 VS .Net,因为 VC++6.0 启动比较快些,而且只是写个DLL而已 )\u003c/p\u003e\n\u003cp\u003e运行环境:\u003c/p\u003e\n\u003cp\u003eWindows 2003\u003c/p\u003e\n\u003cp\u003ePHP-4.4.4 …\u003c/p\u003e"
October 25, 2010
[教程]Linux下C语言对PHP扩展
"\u003cp\u003e\u003cstrong\u003e一,搭建php环境\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e下载php 5.2.6 源码 并解压编译安装,搭建php环境\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二,创建扩展项目\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e进入源码目录\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ecd php5.2.6/ext/\u003c/p\u003e\n\u003cp\u003e./ext_skel –extname=my_ext\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e创建名字为my_ext的项目,最终会生成 my_ext.so\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e三,更改配置和程序\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e$ vi ext/my_ext/config.m4\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e根据你自己的选择将\u003c/p\u003e\n\u003cp\u003ednl PHP_ARG_WITH(my_ext, for my_ext support,\u003c/p\u003e\n\u003cp\u003ednl Make sure that the comment is aligned:\u003c/p\u003e\n\u003cp\u003ednl [ –with-my_ext Include my_ext support])\u003c/p\u003e\n\u003cp\u003e修改成\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ePHP_ARG_WITH(my_ext, for my_ext support,\u003c/p\u003e\n\u003cp\u003eMake sure that the comment is aligned:\u003c/p\u003e\n\u003cp\u003e[ –with-my_ext Include my_ext support])\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e或者将\u003c/p\u003e\n\u003cp\u003ednl PHP_ARG_ENABLE(my_ext, whether to enable my_ext …\u003c/p\u003e"
October 25, 2010
在Windows下写PHP的C扩展
"\u003cp\u003e安装好如下软件:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eVC++ 6\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ephp二进制环境\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCygwin.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eI. 下载php的源码包\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e下载后php源码包解压后有个ext目录,这个目录就是负责开发扩展的目录,目录中有默认你扩展的所有源码。还有两个重要的文件:ext_skel , ext_skel_win32.php.\u003c/p\u003e\n\u003cp\u003eext_skel是创建扩展的shell,在windows上无法运行,所以就必须要有Cygwin。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eII. 建立php扩展骨架目录文件\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e如果你的cygwin没有安装在c:\\cygwin,进入php源码包\\ext目录下,修改ext_skel_win32.php :\u003c/p\u003e\n\u003cp\u003e$cygwin_path = ‘c:\\cygwin\\bin’;\u003c/p\u003e\n\u003cp\u003e修改为你的cygwin目录\u003c/p\u003e\n\u003cp\u003e$cygwin_path = ‘d:\\cygwin\\bin’;\u003c/p\u003e\n\u003cp\u003e命令行方式进入ext目录然后运行:\u003c/p\u003e\n\u003cp\u003ephp ext_skel_win32.php –extname=myhello\u003c/p\u003e\n\u003cp\u003e(当然,为了保证上面的命令行能正常运行,首先你得确保你的php目录在系统的环境变量里)\u003c/p\u003e\n\u003cp\u003e运行该命令后,有人发现下面的错误\u003c/p\u003e\n\u003cp\u003eWarning: …\u003c/p\u003e"
October 25, 2010
指针 数字数组和字符数组首地址的输出
"\u003cblockquote\u003e\n\u003cp\u003e#include\n#include\u003c/p\u003e\n\u003cp\u003eint main()\n{\u003c/p\u003e\n\u003cp\u003echar *p;int *p1;\u003c/p\u003e\n\u003cp\u003eint a[10]={1,2,3,4,5,6,7,8,9,0};\nchar str[]=”haohtmlcom”;\np=str;\np1=a;\u003c/p\u003e\n\u003cp\u003eprintf( “%x” , p); /*输出的是地址*/\nprintf(“%s”,p); /*输出的是字符串haohtmlcom*/\u003c/p\u003e\n\u003cp\u003eprintf(“%x”,p1); /*输出的是地址*/\u003c/p\u003e\n\u003cp\u003eprintf(“%s”,p1); /*输出的是字符串,乱码*/\u003c/p\u003e\n\u003cp\u003esystem(“pause”);\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003ep,p1中存放的应为字符串,但在输出时还要兼顾前面的输出格式符的控制,如果是%s,则会将p的地址内的数据输出,而不再输出p本身的内容地址.\u003c/p\u003e\n\u003cp\u003eprintf(“%c”, *p);//会输出字符串的第一个字母h\u003c/p\u003e\n\u003cp\u003eprintf(“%d”, *p1);//会输出数组的第一个数字.\u003c/p\u003e\n\u003cp\u003e所以 p,p1存放的都是地址,在用%c,%d时都能作为首地址输出第一个字母或数组元素,但是如果换用,%s,输出字符串,在一个地址空间内是不能存在字符串的,所以编译器会认为是连续空间 …\u003c/p\u003e"
October 20, 2010
linux 下的软件开发之GCC,GDB用法篇
"\u003cp\u003e在为Linux开发应用程序时,绝大多数情况下使用的都是C语言,因此几乎每一位Linux程序员面临的首要问题都是如何灵活运用C编译器。目前Linux下最常用的C语言编译器是GCC(GNU Compiler Collection),它是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。GCC不仅功能非常强大,结构也异常灵活。最值得称道的一点就是它可以通过不同的前端模块来支持各种语言,如Java、 Fortran、Pascal、Modula-3和Ada等。\u003c/p\u003e\n\u003cp\u003e开放、自由和灵活是Linux的魅力所在,而这一点在GCC上的体现就是程序员通过它能够更好地控制整个编译过程。在使用GCC编译程序时,编译过程可以被细分为四个阶段:\u003c/p\u003e\n\u003cp\u003e========================================\u003c/p\u003e\n\u003cp\u003e◆ 预处理(Pre-Processing)\u003c/p\u003e\n\u003cp\u003e◆ 编译(Compiling)\u003c/p\u003e\n\u003cp\u003e◆ 汇编(Assembling)\u003c/p\u003e\n\u003cp\u003e◆ 链接(Linking)\u003c/p\u003e\n\u003cp\u003e========================================\u003c/p\u003e\n\u003cp\u003eLinux程序员可以根据自己 …\u003c/p\u003e"
October 15, 2010
linux静态链接库与动态链接库的区别及动态库的创建
"\u003cp\u003e\u003cstrong\u003e一、引言\u003c/strong\u003e\n通常情况下,对函数库的链接是放在编译时期(compile time)完成的。所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(executable file)。程序在运行时,与函数库再无瓜葛,因为所有需要的函数已拷贝到自己门下。所以这些函数库被成为静态库(static libaray),通常文件名为“libxxx.a”的形式。\u003c/p\u003e\n\u003cp\u003e其实,我们也可以把对一些库函数的链接载入推迟到程序运行的时期(runtime)。这就是如雷贯耳的动态链接库(dynamic link library)技术。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二、动态链接库的特点与优势\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e首先让我们来看一下,把库函数推迟到程序运行时期载入的好处:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e可以实现进程之间的资源共享。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e什么概念呢?就是说,某个程序的在运行中要调用某个动态链接库函数的时候,操作系统首先会查看所有正在运行的程序,看在内存里是否已有此库函数的拷贝了。如果有,则让其共享那一个拷贝;只有没有才链接载入。这样的模式虽然会带来一些“动态链接”额外的开销,却大大的节省了系统的内存资源。C的标准库就是动态链接库,也就是说系统中所有运行的程序 …\u003c/p\u003e"
October 15, 2010
Linux中创建静态库和动态库
"\u003cp\u003e\u003cstrong\u003e函数库分为静态库和动态库两种。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。\u003c/p\u003e\n\u003cp\u003e动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。\u003c/p\u003e\n\u003cp\u003e程序1: hello.h\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#ifndef HELLO_H\u003c/p\u003e\n\u003cp\u003e#define HELLO_H\u003c/p\u003e\n\u003cp\u003evoid hello(const char *name);\u003c/p\u003e\n\u003cp\u003e#endif //HELLO_H\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e程序2: hello.c\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#include\u003c/p\u003e\n\u003cp\u003evoid hello(const char *name)\u003c/p\u003e\n\u003cp\u003e{\u003c/p\u003e\n\u003cp\u003eprintf(“Hello %s!\\n”, name);\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e程序3: main.c\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#include “hello.h”\u003c/p\u003e\n\u003cp\u003eint main()\u003c/p\u003e\n\u003cp\u003e{\u003c/p\u003e\n\u003cp\u003ehello(“everyone”);\u003c/p\u003e\n\u003cp\u003ereturn 0;\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e无论动态库还是静态库都需要用到.o文件来生成,先编译生成.o文件。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# gcc -c hello.c\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e1:创建静态库\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。例如:我们将创建的静态库名为myhello,则静态库文件名就是libmyhello.a。 …\u003c/p\u003e"
September 28, 2010
基于Web的IM概览
"\u003cp\u003e基于 WEB 的实时事件通知方式大致有五种方案:HTTP拉取方式(pull),HTTP流,Long Polling,Flash XMLSocket方式,Java Applet。\n首先说下Comet这个词,Comet 这个词是最早由Alex Russell(Dojo Toolkit 的项目 Lead)提出的,称基于 HTTP 长连接、无须在浏览器端安装插件的“服务器推(Push)”技术为“Comet”。\n\u003cstrong\u003e1.HTTP拉取方式(pull)\u003c/strong\u003e\n在这种传统的方法中,客户端以用户可定义的时间间隔去检查服务器上的最新数据。这种拉取方式的频率要足够高才能保证很高的数据精确度,但高频率可能会导致多余的检查,从而导致较高的网络流量。而另一方面,低频率则会导致错过更新的数据。理想地,拉取的时间间隔应该等于服务器状态改变的速度。常见的实现如利用 “” tag,当然利用xmlHttpRequest定时取也是一种方法。\n\u003cstrong\u003e2.HTTP流(Push机制)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eHTTP流有两种形式:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePage Stream: 页面上不间断的HTTP连接响应(HTTP 1.1 Keep Alive).\n通过在 HTML 页面里嵌入一个隐蔵 …\u003c/li\u003e\u003c/ul\u003e"
September 28, 2010
从零开始,安装运行Pushlets所需的Servlet相关环境
"\u003cp\u003e最近在研究基于WEB的聊天程序,了解了长连接相关技术,从网上看了很多文章,但多数是英文的,这让我很头疼。我准备自己动手测试一下网上的开源comet框架,最后我选择的是pushlet,先将我的一些操作步骤写下来和大家一起分享。\u003c/p\u003e\n\u003cp\u003e我先去 \u003ca href=\"http://www.pushlets.com/\" title=\"pushlets\"\u003epushlet官方网站\u003c/a\u003e 下载了相关代码,我选择的是5-feb-2010: v2.0.4 released版本的(下载地址:)。下载了后我解压打开相关文件,里面只有几个文件夹和文件,找了一下,DOC文件夹里面有说明文档,打开index.html,是英文的。按照左侧导航大概浏览一下,最后跳到install上面,硬着头皮打开浏览一下,大概意思是需要Servlet引擎环境。于是开始在Google上面找相关的文章。看了一下大概意思明白,就是需要安装Tomcat。\u003c/p\u003e\n\u003cp\u003e去Tomcat官方网站下载,我下载的是Tomcat 7.0.2 Released版本的(下载地址:)。下载解压出来是一个没有扩展名的文件:apache-tomcat-7.0.2-windows-x86,想到Windows下面的文件应该是EXE的,我将其扩展名改为exe运行,结果闪了一个命令窗口就没有了,在文 …\u003c/p\u003e"
September 26, 2010
Comet—“服务器推”技术
"\u003ch2 id=\"一名称解释\"\u003e一、名称解释:\u003c/h2\u003e\n\u003cp\u003eComet最早是由Alex Russell(Dojo Toolkit 项目主管和Dojo Foundation主席)在自己的博客中提出的术语,他是这样说的:”New services like Jot Live and Meebo are built with a style of data transmission that is neither traditional nor Ajax. Their brand of low-latency data transfer to the browser is unique, and it is becoming ever-more common. Lacking a better term, I’ve taken to calling this style of event-driven, server-push data streaming “Comet”.” “They all use long-lived HTTP connections to reduce the latency with which …\u003c/p\u003e"
September 26, 2010
PHP操作MongoDB
"\u003cp\u003e\u003cstrong\u003e一、MongoDB简介\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eMongoDB (名称来自”humongous”) 是一个可扩展的、高性能、开源、模式自由、面向文档的数据库,集文档数据库、键值对存储和关系型数据库的优点于一身。官方站点: \u003ca href=\"http://www.mongodb.org/\"\u003ehttp://www.mongodb.org/\u003c/a\u003e,MongoDB特点:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e面向文档存储(类JSON数据模式简单而强大)\u003c/li\u003e\n\u003cli\u003e动态查询\u003c/li\u003e\n\u003cli\u003e全索引支持,扩展到内部对象和内嵌数组\u003c/li\u003e\n\u003cli\u003e查询记录分析\u003c/li\u003e\n\u003cli\u003e快速,就地更新\u003c/li\u003e\n\u003cli\u003e高效存储二进制大对象 (比如照片和视频)\u003c/li\u003e\n\u003cli\u003e复制和故障切换支持\u003c/li\u003e\n\u003cli\u003eAuto-Sharding自动分片支持云级扩展性\u003c/li\u003e\n\u003cli\u003eMapReduce 支持复杂聚合\u003c/li\u003e\n\u003cli\u003e商业支持,培训和咨询\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e二、安装MongoDB\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e安装MongoDB非常的简单,仅需下载压缩包解压运行命令即可,下载地址: \u003ca href=\"http://www.mongodb.org/downloads\"\u003ehttp://www.mongodb.org/downloads\u003c/a\u003e,本文为windows平台,MongoDB运行命令:\u0026gt;bin/mongod。提示:首先要创建存储数据的文件夹,MongoDB 默认存储数据目录为 /data/db/ (或者 c:datadb),当然你也可以修改成不同目录,只需要指定 –dbpath 参数,eg: …\u003c/p\u003e"
September 23, 2010
Suhosin介绍-用Suhosin加强PHP脚本语言安全性
"\u003cp\u003ePHP是一种非常流行之网站脚本语言,但是它本身所固有之安全性是非常薄弱。本文讲述了PHP增强计划(Hardened-PHP project)和新之Suhosi计划,Suhosin提供了增强之PHP之安全配置。\u003c/p\u003e\n\u003cp\u003ePHP是带有争论地但又是最流行之一种网站脚本语言。它之所以流行,是因为它低廉之价格,然而,这低廉之价格导致用PHP写之网站应用程序越来越多之同时也越来越多之展现出PHP本身在安全上之脆弱,这种安全特性显示出PHP是极不可靠,不过同时对这个脚本语言本身而言它又是非常灵活之,使用它就能很容易之实现代码,不过这些代码都是臃肿之且不安全之,虽然是这样它还是一直都拥有很多之使用者。你可以根据实际情况来假设,一次又一次,各种应用软件都体现了这种脆弱性:容易受到SQL注入、跨站脚本、任意执行指令等等之攻击。\u003c/p\u003e\n\u003cp\u003e因为象safe_mode和open_basedir这样内置之PHP安全措施将被忽略,PHP增强计划创建之PHP更具有安全性,同时也对PHP进行校验检查。最初,这些是由增强之PHP补丁完成之,这些补丁需要修补并重新编译PHP自身。最近,PHP增强计划发布了一个名为Suhosin之新工程。 …\u003c/p\u003e"
September 20, 2010
WML标签速查手册(转)比较方便便于速查
"\u003cp\u003e\u003cstrong\u003e结构相关标签****语法及属性\u003c/strong\u003e\n\u0026lt; \u003cstrong\u003ewml\u003c/strong\u003e \u0026gt;\n\u003cstrong\u003e\u003cem\u003elang\u003c/em\u003e\u003c/strong\u003e” \u0026gt;\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e\u003cem\u003econtent\u003c/em\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u0026lt; \u003cstrong\u003ecard\u003c/strong\u003e \u0026gt;\n\u003cstrong\u003e\u003cem\u003ename\u003c/em\u003e\u003c/strong\u003e”\u003c/p\u003e\n\u003cp\u003etitle=” \u003ccode\u003e\u0026lt;strong\u0026gt;\u0026lt;em\u0026gt;label\u0026lt;/em\u0026gt;\u0026lt;/strong\u0026gt;\u003c/code\u003e”\u003c/p\u003e\n\u003cp\u003enewcontext=” \u003ccode\u003e\u0026lt;strong\u0026gt;\u0026lt;em\u0026gt;boolean\u0026lt;/em\u0026gt;\u0026lt;/strong\u0026gt;\u003c/code\u003e”\u003c/p\u003e\n\u003cp\u003estyle=” \u003ccode\u003e\u0026lt;strong\u0026gt;\u0026lt;em\u0026gt;style\u0026lt;/em\u0026gt;\u0026lt;/strong\u0026gt;\u003c/code\u003e”\u003c/p\u003e\n\u003cp\u003eonenterforward=” \u003ccode\u003e\u0026lt;strong\u0026gt;\u0026lt;em\u0026gt;url\u0026lt;/em\u0026gt;\u0026lt;/strong\u0026gt;\u003c/code\u003e”\u003c/p\u003e\n\u003cp\u003eonenterbackward=” \u003ccode\u003e\u0026lt;strong\u0026gt;\u0026lt;em\u0026gt;url\u0026lt;/em\u0026gt;\u0026lt;/strong\u0026gt;\u003c/code\u003e”\u003c/p\u003e\n\u003cp\u003eontimer=” \u003ccode\u003e\u0026lt;strong\u0026gt;\u0026lt;em\u0026gt;url\u0026lt;/em\u0026gt;\u0026lt;/strong\u0026gt;\u003c/code\u003e” \u0026gt; …\u003c/p\u003e"
September 9, 2010
WAP中汉字与图像的使用问题
"\u003ch3 id=\"wap显示汉字乱码的问题\"\u003ewap显示汉字乱码的问题\u003c/h3\u003e\n\u003cp\u003e1、可在WEB服务器中设置MIME表时,在text/vnd.wap.wml后加上“;charset=charset_name”,如GB2312汉字 :text/vnd.wap.wml;charset=gb2312\u003c/p\u003e\n\u003cp\u003e2、若你在设计动态WAP网页时,出现汉字显示乱码,你可以在程序中将返回类型指明所使用的字符集。 在程序中,将CHARSET加在向用户浏览 器发送信息的类型后, 按以下方式写: “Content-type: text/vnd.wap.wml;charset=gb2312″。 如在 ASP中:Response.ContentType =”text/vnd.wap.wml; charset=gb2312” ,JSP中\u0026lt;%@page contentType=”text/vnd.wap.wml; charset=gb2312″%\u0026gt;在PHP、PERL等服务器端脚本中比较类似。\u003c/p\u003e\n\u003cp\u003e3、你也可以用字符转换工具来转换,将你的程序代码转换为UTF8、或UNICODE。\u003c/p\u003e\n\u003cp\u003e4、另外一种指定xml,,比较遗憾的是现在部分手机与模拟器并不支持,将来也行会支持。\u003c/p\u003e\n\u003cp\u003e需要注 …\u003c/p\u003e"
September 3, 2010
php中抽象类和接口的概念和区别(二)
"\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e一个子类如果implements一个接口,就必须实现接口中的所有方法(不管是否需要);如果是继承一个抽象类,只需要实现需要的方法即可,这是抽象类的一个优点\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e如果一个接口中定义的方法名改变了,那么所有实现此接口的子类显然将无法通过编译,因为它们所实现的方法名已经不存在了,这是接口的一个缺点;而抽象类就不存在这个问题,只是为子类添加了一个新的方法(接口中旧的方法)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e看前面两点,似乎抽象类要比接口有着更多的优点,但它却有着一个难以弥补的缺点:就是一个子类只能有一个父类。A extends B . 这样A就拥有了B的所有方法和功能,但当A还想拥有C的功能的时候。就不能通过 A extends C 来实现, 而需要走一些弯路。目前系统架构的趋势就是由针对抽象(借口,抽象类)而不是具体编程,并且将功能尽可能的细分。 这就需要通过实现多个接口的方式来实现,显然,抽象类无法提供这样的功能。从系统重构的角度来说,一个具体类抽象出接口是十分方便的。只需要写一个接口,里面定义具体类的所有方法,然后在为这个具体类implement这个接口就可以了。而抽象类就要复杂的多,比如说 B extends …\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e"
September 3, 2010
php中抽象类和接口的概念和区别(一)
"\u003cp\u003einterface a {\n//接口内不可以定义属性\n//所有方法必须为抽象方法(既不实现,只定义)\u003c/p\u003e\n\u003cp\u003epublic function method1($param);\nprotected function method2($param);\n}\u003c/p\u003e\n\u003cp\u003e//接口不可被实现,例如\n$instance = new a; //错误\u003c/p\u003e\n\u003cp\u003e//接口实现类必须实现接口的所有方法,且方法参数也必须相同\n//例如\nclass b implaments a{\n//错误,封装应与接口相同\nprotected function method1($param)\n{\n//somecode here…\n}\u003c/p\u003e\n\u003cp\u003e//错误,参数应与接口定义相同\nprotected function method2()\n{\u003c/p\u003e\n\u003cp\u003e}\n}\u003c/p\u003e\n\u003cp\u003e接口功能是实现类似C++中的多重继承的,但其语法更为明了\u003c/p\u003e"
September 3, 2010
PHP的接口与抽象类
"\u003cp\u003e\u003cstrong\u003ePHP\u003c/strong\u003e的接口:为了实现特定功能而预留的类似类的一种类型。接口的主要目的:提供给类类似于模板的框架,以方便类的构建。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e在PHP****中定义接口\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在\u003cstrong\u003ePHP\u003c/strong\u003e中定义接口的形式如下:\u003c/p\u003e\n\u003cp\u003eInterface interfaceName\u003c/p\u003e\n\u003cp\u003e{\u003c/p\u003e\n\u003cp\u003eConst 1;\u003c/p\u003e\n\u003cp\u003e……\u003c/p\u003e\n\u003cp\u003eConst 2;\u003c/p\u003e\n\u003cp\u003eFunction methodName1();\u003c/p\u003e\n\u003cp\u003e……\u003c/p\u003e\n\u003cp\u003eFunction methodName2();\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePHP****中单一接口的实现\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e实现接口的语法如下:\u003c/p\u003e\n\u003cp\u003eClass class_name implements interface_name\u003c/p\u003e\n\u003cp\u003e例如:\u003c/p\u003e\n\u003cp\u003eid = $id;\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003efunction getID()\u003c/p\u003e\n\u003cp\u003e{\u003c/p\u003e\n\u003cp\u003ereturn $this-\u0026gt;id;\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003efunction setName($name)\u003c/p\u003e\n\u003cp\u003e{\u003c/p\u003e\n\u003cp\u003e$this-\u0026gt;name = $name;\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003efunction getName()\u003c/p\u003e\n\u003cp\u003e{\u003c/p\u003e\n\u003cp\u003ereturn $this-\u0026gt;name;\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003efunction otherFunc() //这是一个接口中不存在的方法\u003c/p\u003e\n\u003cp\u003e{\u003c/p\u003e\n\u003cp\u003eecho “Test”;\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003e?\u0026gt;\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePHP****中多重接口的实现\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在** \u003ca href=\"http://www.phpdo.net/\" title=\"php\"\u003ePHP …\u003c/a\u003e\u003c/p\u003e"
August 26, 2010
linux下php多线程的妙用
"\u003cp\u003e开始用php写后台服务一段时间了.也是在这样的驱动下,不断的学习php语法,体验这一原来一直以为神秘且敬而远之的神奇语言的魅力.最初看php多线程的资料是为了提高程序的处理能力,充分发挥linux多任务的优势.不曾想多线程没用成反到是带来了一系列的意外收获.让之后的许多问题迎刃而解,不敢独享特一一道来.\n本文所讲的东西是源自php的pcntl_fork函数.因为这个函数依赖操作系统fork的实现,所以本文所讲的东西只适用于linux/unix.ok,那么先看看这个函数的用法吧. \u003ca href=\"http://cn.php.net/manual/en/function.pcntl-fork.php\"\u003ephp手册\u003c/a\u003e 上是这么说的:\u003c/p\u003e\n\u003cp\u003e$pid = pcntl_fork();\u003c/p\u003e\n\u003cp\u003eif ($pid == -1) {\u003c/p\u003e\n\u003cp\u003edie(‘could not fork’);\u003c/p\u003e\n\u003cp\u003e} else if ($pid) {\u003c/p\u003e\n\u003cp\u003e// we are the parent\u003c/p\u003e\n\u003cp\u003epcntl_wait($status); //Protect against Zombie children\u003c/p\u003e\n\u003cp\u003e} else {\u003c/p\u003e\n\u003cp\u003e// we are the child\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003e?\u0026gt;\u003c/p\u003e\n\u003cp\u003e通过pcntl_fork创建一个子进程,如果返回值是-1的话,那么说明子进程创建失败.创建成功的进 …\u003c/p\u003e"
August 17, 2010
$HTTP_RAW_POST_DATA 和 $_POST的区别
"\u003cp\u003e这是手册里写的\u003c/p\u003e\n\u003cp\u003e总是产生变量包含有原始的 POST 数据。否则,此变量仅在碰到未识别 MIME 类型的数据时产生。不过,访问原始 POST 数据的更好方法是 php://input。$HTTP_RAW_POST_DATA 对于 enctype=”multipart/form-data” 表单数据不可用。\u003c/p\u003e\n\u003cp\u003e问题: $HTTP_RAW_POST_DATA == $_POST 吗?\u003c/p\u003e\n\u003cp\u003e照手册所写 ,答案应该就为否。\n假如不一样的话,他们的区别是什么呢?\u003c/p\u003e\n\u003cp\u003e我知道答案了,如下:\u003c/p\u003e\n\u003cp\u003eThe RAW / uninterpreted HTTP POst information can be accessed with:\n$GLOBALS[‘HTTP_RAW_POST_DATA’]\u003c/p\u003e\n\u003cp\u003eThis is useful in cases where the post Content-Type is not something PHP understands (such as text/xml).\u003c/p\u003e\n\u003cp\u003e也就是说,基本上$GLOBALS[‘HTTP_RAW_POST_DATA’] 和 $_POST是一样的。但是如 …\u003c/p\u003e"
August 17, 2010
PHP输入流php://input
"\u003cp\u003e在使用xml-rpc的时候,server端获取client数据,主要是通过php输入流input,而不是$_POST数组。所以,这里主要探讨php输入流php://input\u003c/p\u003e\n\u003cp\u003e对于\u003ca href=\"http://php.net/manual/en/wrappers.php.php\"\u003ephp://input\u003c/a\u003e介绍,PHP官方手册文档有一段话对它进行了很明确地概述。\u003c/p\u003e\n\u003cp\u003e“php://input allows you to read raw POST data. It is a less memory intensive alternative to \u003ca href=\"http://www.php.net/manual/en/reserved.variables.httprawpostdata.php\"\u003e$HTTP_RAW_POST_DATA\u003c/a\u003e and does not need any special php.ini directives. php://input is not available with \u003cem\u003eenctype=”multipart/form-data”\u003c/em\u003e.\n翻译过来,是这样:\n“php://input可以读取没有处理过的POST数据。相较于$HTTP_RAW_POST_DATA而言,它给内存带来的压力较小,并且不需要特殊的php.ini设置。php://input不能用于enctype=multipart/form-data”\u003c/p\u003e\n\u003cp\u003e我们应该怎 …\u003c/p\u003e"
July 27, 2010
PHP Warning: date() [function.date]: It is not safe是什么问题
"\u003cp\u003e\u003cstrong\u003e在用PHP5.3以上的PHP版本时,只要是涉及时间的会报一个”\u003c/strong\u003e PHP Warning: date() [function.date]: It is not safe to rely on the system’s timezone settings. You are \u003cem\u003erequired\u003c/em\u003e to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected ‘UTC’ for ‘8.0/no DST’ instead in **“这样的错。如何解决呢?**\u003cstrong\u003e实际上,从 PHP 5.1.0 ,当对使用date()等函数时,如果timezone设置不正确,在每一次调用时间函数时,都会产生\u003ccode\u003eE_NOTICE\u003c/code\u003e 或者 \u003ccode\u003eE_WARNING\u003c/code\u003e …\u003c/strong\u003e\u003c/p\u003e"
July 24, 2010
X-Cache 和 X-Cache-Lookup headers 的解释
"\u003cp\u003eX-Cache: 表示你的 http request 是由 proxy server 回的 .\nMISS 表 proxy无资料,代理动作, HIT 表 proxy 直接回应\u003c/p\u003e\n\u003cp\u003eX-Pad: 這個是800 年前的 netscape bug 的因素才用的\u003c/p\u003e\n\u003cp\u003e想象你在一个标准的\u003ca href=\"http://vbb.twftp.org/archive/index.php/t-1145.html\"\u003e透明代理\u003c/a\u003e80端口下,并且你正在访问一个运行了内部网络缓存(这样,又是一个代理)的站点。如果你查看HTTP headers查找某些信息,你能够找到像这样的2行,规定domain.tld 代表那个本地网站,proxy.local 代表你的内部的透明代理。\u003c/p\u003e\n\u003cp\u003eX-Cache :HIT from proxy.domain.tld, MISS from proxy.local\nX-Cache-Lookup :HIT from proxy.domain.tld:3128, MISS from proxy.local:3128\u003c/p\u003e\n\u003cp\u003e这2行是什么意思?如果这是你第一次访问那个站点(MISS from proxy.local),并且它的代理的缓存中有一个有效的网页(X-Cache HIT proxy.domain.tld)\u003c/p\u003e\n\u003cp\u003e现在我们刷新了页面 …\u003c/p\u003e"
July 20, 2010
推荐一个很强的PHP图片处理(含缩图)类
"\u003cp\u003e这是目前我找到功能最强大的缩图类了,功能很全,代码写得也很规范。但智能裁切还需要完善一下,现在只能智能裁正方形,要能裁长方形才好。\u003c/p\u003e\n\u003cp\u003e下载:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.21andy.com/blog/wp-content/plugins/coolcode/coolcode.php?p=517\u0026amp;download=thumb_class.php\"\u003ethumb_class.php\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e/**\u003c/p\u003e\n\u003cp\u003e* 基本图片处理,用于完成图片缩入,水印添加\u003c/p\u003e\n\u003cp\u003e* 当水印图超过目标图片尺寸时,水印图能自动适应目标图片而缩小\u003c/p\u003e\n\u003cp\u003e* 水印图可以设置跟背景的合并度\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e* Copyright(c) 2005 by ustb99. All rights reserved\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e* To contact the author write to {@link mailto:ustb80@163.com}\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e@author 偶然\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e@version $Id: thumb.class.php,v 1.9 2006/09/30 09:31:56 zengjian Exp $\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e@package system\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e*/\u003c/p\u003e\n\u003cp\u003e/**\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThumbHandler\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e@access public\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e*/\u003c/p\u003e\n\u003cp\u003e/*\u003c/p\u003e\n\u003cp\u003e使用方法:\u003c/p\u003e\n\u003cp\u003e自动裁切:\u003c/p\u003e\n\u003cp\u003e程序会按照图片的尺寸从中部裁切最大的正方形, …\u003c/p\u003e"
July 20, 2010
PHP图片处理类实现缩放、剪切、相框、水印、锐化、旋转、翻转、透明度、反色等功能
"\u003cp\u003e使用PHP来处理一下图片,还是不错的,下面是找到的一个PHP处理图片的类,可以实现图片的缩放、剪切、相框、水印、锐化、旋转、翻转、透明度、 反色功能操作,够强大吧。文章比较长,所以分页显示,可以一页页复制代码整合就可以使用了。’没有找到相 关图片!’\n);\u003c/p\u003e\n\u003cp\u003e/*\n构造函数:函数初始化\n*/\nfunction __construct($PICTURE_URL){\u003c/p\u003e\n\u003cp\u003e$this-\u0026gt;get_info($PICTURE_URL);\u003c/p\u003e\n\u003cp\u003e}\nfunction get_info($PICTURE_URL){\n/*\n处理原图片的信息,先检测图片是否 存在,不存在则给出相应的信息\n*/\n@$SIZE=getimagesize($PICTURE_URL);\nif(!$SIZE){\nexit($this-\u0026gt;ERROR[‘unalviable’]);\n}\u003c/p\u003e\n\u003cp\u003e//得到原图片的信息类型、宽度、高度\n$this-\u0026gt;PICTURE_MIME=$SIZE[‘mime’];\n$this-\u0026gt;PICTURE_WIDTH=$SIZE[0];\n$this-\u0026gt;PICTURE_HEIGHT=$SIZE[1]; …\u003c/p\u003e"
July 6, 2010
FreeBSD查看即时网络流量
"\u003cp\u003e1、数据包 “netstat 1″一秒钟累计一次,”netstat 2″两秒钟累计一次。依此类推\u003c/p\u003e\n\u003cp\u003e2、查看网 卡流量:”systat -if 1″每秒钟刷新一次,”systat -if 2″两秒钟刷新一次,依此类推\u003c/p\u003e"
June 26, 2010
Memcached深度分析
"\u003cp\u003eMemcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减 少数据库负载,提升性能。关于这个东西,相信很多人都用 过,本文意在通过对memcached的实现及代码分析,获得对这个出色的开源软件更深入的了解,并可以根据我们的需要对其进行更进一步的优化。末了将通 过对BSM_Memcache扩展的分析,加深对memcached的使用方式理解。\u003c/p\u003e\n\u003cp\u003e本文的部分内容可能需要比较好的数学基础作为辅助。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e◎Memcached是什么\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在阐述这个问题之前,我们首先要清楚它“不是什么”。很多人把它当作和SharedMemory那种形式的存储载体来使用,虽然memcached使用了 同样的“Key=\u0026gt;Value”方式组织数据,但是它和共享内存、APC等本地缓存有非常大的区别。Memcached是分布式的,也就是说它不是 本地的。它基于网络连接(当然它也可以使用localhost)方式完 成服务,本身它是一个独立于应用的程序或守护进程(Daemon方式)。\u003c/p\u003e\n\u003cp\u003eMemcached使用libevent库实现网络连接服务,理论上可以处理无限多 …\u003c/p\u003e"
June 24, 2010
Five Minutes程延辉 介绍开心农场架构
"\u003cp\u003eFive Minutes 公司程延辉(小名康天) 介绍开心农场架构,social game的技术挑战,支持千万级DAU的social game技术架构。这是一个对于开发者来说,非常精彩,非常有实用性指导的一次演讲,详细介绍了很多技术内幕。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.javaeye.com/topics/download/e4f72cf2-2baa-3f4b-9578-d220b6bceea9\"\u003e\u0026raquo;猛击这里下载演讲ppt\u0026laquo;\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eFive Minutes 公司的著名social game 开心农场,目前非常受用户欢迎,包括国外的Facebook,国内的开心网都是如此,是全球最大的social game,台下热烈掌声。呵呵。开心农场这个游戏从介绍看,相当成功,最早是08年9月在xiaonei上线,而后在51等平台推广,包括Facebook。现在已经有1570万游戏用户了,其中包括50万的Facebook用户。\u003c/p\u003e\n\u003cp\u003e开心农场架构主要难点:1。如何存储大规模的用户数据千万级2。如果应对大量访问每天数亿请求量3。如果应对数据的频繁修改,每秒数万次数据修改。\u003c/p\u003e\n\u003cp\u003e解决的方式\u003c/p\u003e\n\u003cp\u003e优化:\u003c/p\u003e\n\u003cp\u003e1。负载均衡,web服务器平行扩展。\u003c/p\u003e\n\u003cp\u003e2。服务器性能优化。\u003c/p\u003e\n\u003cp\u003e3。异步处理,缓存数据接口,Linux内核参数优化,挖掘PHP的效率,用fastcgi模式运行php, …\u003c/p\u003e"
June 11, 2010
php 静态类和方法
"\u003cp\u003e\u003ccode\u003e\u0026lt;?php\u0026lt;br /\u0026gt; /*\u0026lt;br /\u0026gt; //静态属性 或静态方法不需要所在类被实例化就可以使用\u0026lt;br /\u0026gt; //使用方法:类名::静态方法名(静态属性名)\u0026lt;br /\u0026gt; //例子:static.php\u0026lt;br /\u0026gt; */\u0026lt;br /\u0026gt; class Math\u0026lt;br /\u0026gt; {\u0026lt;br /\u0026gt; public static $PI=3.14; //定义静态属性\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e//public $PI=3.14; //静态方法不能调用非静态的属性\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e`//定义一个静态方法,求两个数中的最大值\u003c/p\u003e\u003c/p\u003e\n\u003cp\u003epublic static function getMax($num1,$num2){ //static 关键字\u003c/p\u003e\n\u003cp\u003ereturn $num1 \u003e $num2 ? $num1 : $num2;\u003cbr /\u003e\n}\u003c/p\u003e\n\u003cp\u003e// 定义一个静态方法,求圆面积\u003c/p\u003e\n\u003cp\u003epublic static function getCircleArea($radius){\u003cbr /\u003e\n//return Math::$PI * $radius * $radius;//也行\u003c/p\u003e\n\u003cp\u003ereturn …\u003c/p\u003e\u003c/p\u003e"
June 11, 2010
PHP生成静态页面类
"\u003cp\u003eclass Shtml\u003c/p\u003e\n\u003cp\u003e{\u003c/p\u003e\n\u003cp\u003evar $Templet;\u003c/p\u003e\n\u003cp\u003evar $DataSource;\u003c/p\u003e\n\u003cp\u003evar $Dir;\u003c/p\u003e\n\u003cp\u003evar $fileName;\u003c/p\u003e\n\u003cp\u003evar $mod;\u003c/p\u003e\n\u003cp\u003evar $handle;\u003c/p\u003e\n\u003cp\u003efunction Shtml($fileName=””)\u003c/p\u003e\n\u003cp\u003e{\u003c/p\u003e\n\u003cp\u003e$this-\u0026gt;fileName=$fileName;\u003c/p\u003e\n\u003cp\u003e$this-\u0026gt;mod=”wb”;\u003c/p\u003e\n\u003cp\u003e$this-\u0026gt;handle=false;\u003c/p\u003e\n\u003cp\u003e$this-\u0026gt;Templet = “”;\u003c/p\u003e\n\u003cp\u003e$this-\u0026gt;DataSource = array();\u003c/p\u003e\n\u003cp\u003e$this-\u0026gt;Dir = “”;\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003e/// \u0026lt;描述\u0026gt;\u003c/p\u003e\n\u003cp\u003e/// 绑定数据源,参数为一数组。\u003c/p\u003e\n\u003cp\u003e///\u003c/p\u003e\n\u003cp\u003efunction BindData($arr)\u003c/p\u003e\n\u003cp\u003e{\u003c/p\u003e\n\u003cp\u003e$this-\u0026gt;DataSource = $arr;\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003e/// \u0026lt;描述\u0026gt;\u003c/p\u003e\n\u003cp\u003e/// 设置文件存放路径。\u003c/p\u003e\n\u003cp\u003e///\u003c/p\u003e\n\u003cp\u003efunction SetDir($dir)\u003c/p\u003e\n\u003cp\u003e{\u003c/p\u003e\n\u003cp\u003e$this-\u0026gt;Dir = $dir;\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003efunction SetFileName($fileName)\u003c/p\u003e\n\u003cp\u003e{ …\u003c/p\u003e"
June 11, 2010
php设计模式介绍之注册模式
"\u003cp\u003e\u003cstrong\u003e《PHP 设计模式介绍》第五章 注册模式\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e我们通常认为避免使用全局变量是一种好的选择,因此,对象经常被作为参数从一段代码传递到另一段。但是传递实例的一个问题就是对象有时候不知道将要 传递给谁——?经过一个函数后才被传递到真正需要这个对象的函数。\u003c/p\u003e\n\u003cp\u003e为了编写,阅读,修改代码的方便,最好能够减少不同对象的数量,并且能够将大量广泛使用的对象统一表示为一个单一,常用的对象。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e问题\u003c/strong\u003e:\u003c/p\u003e\n\u003cp\u003e你如何通过单一的全局的对象来获取对其它对象的引用?\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e解决方案\u003c/strong\u003e:\u003c/p\u003e\n\u003cp\u003e“注册模式”就像“对象的电话簿”——储存并且能够取回对对象引用的登记簿。(注:PHP中的“联合数组”也起到了类似“电话簿”的功能。事实上, “注册模式”就是围绕PHP中强大的数组完成的。)“注册模式”的一些特性经常被包含在“单一模式”中(参见第四章),使得“注册模式”成为你整个应用信 息的决定性来源。\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e注释:“注册模式”类主要参考了Martin Fowlerdescribes用java语言实现的Patterns of Enterprise Application Architecture(企业应用程序体系结构模型)。Marcus Baker谢了一篇详细 …\u003c/em\u003e\u003c/p\u003e"
May 26, 2010
php和asp的301 重定向
"\u003cp\u003e\u003cstrong\u003ePHP:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eheader(‘HTTP/1.1 301 Moved Permanently’);\u003c/p\u003e\n\u003cp\u003eheader(‘Location: \u003ca href=\"http://www.haohtml.com/\"\u003ehttp://www.haohtml.com\u003c/a\u003e‘.$request_uri);\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eASP:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u0026lt;%\u003c/p\u003e\n\u003cp\u003eResponse.Status=”301 Moved Permanently”\u003c/p\u003e\n\u003cp\u003eResponse.AddHeader “Location”,” \u003ca href=\"http://www.haohtml.com/\"\u003ehttp://www.haohtml.com/\u003c/a\u003e”\u003c/p\u003e\n\u003cp\u003eResponse.End\u003c/p\u003e\n\u003cp\u003e%\u0026gt;\u003c/p\u003e"
May 15, 2010
错误1920 服务McAfee Framework服务(McAfee Framework)启动失败.确认有足够的权限启动
"\u003cp\u003e确认有足够的权限启动系统服务的解决方法重装至正在启动服务,出现安装程序信息:“错误1920。服务McAfee Framework服务(McAfee Framework)启动失败。确认有足够的权限启动系统服务。”按“忽略(I)”才能继续安装,但最后还是不能升级。\u003c/p\u003e\n\u003cp\u003e经过不断摸索,上官方网站查询资料,找到解决办法如下:\u003c/p\u003e\n\u003cp\u003e打开服务控制台,禁用 McAfee Framework 服务\n重新启动,启动后再进程中(打开任务管理器) 结束 UpdaterUI.exe\u003c/p\u003e\n\u003cp\u003e运行regedit ,删除以下:\nHKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\McAfee Framework\nHKEY_LOCAL_MACHINE\\SOFTWARE\\Network Associates\\TVD\nHKEY_LOCAL_MACHINE\\SOFTWARE\\Network Associates\\ePolicy orchestrator\n以上三个必须删除\u003c/p\u003e\n\u003cp\u003e删除以下目录\nC:\\Program Files\\Network Associates\\Common …\u003c/p\u003e"
May 15, 2010
mcafee不能更新,提示初始化Common updater子系统失败
"\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/05/mcafee-autoupdate.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/05/mcafee-autoupdate.jpg\" alt=\"mcafee-autoupdate\"\u003e\u003c/a\u003e升级mcafee时出现初始化Common updater子系统失败,重装修复问题依然存在,不能解决,看图:\u003c/p\u003e\n\u003cp\u003e一共有两种解决办法,其一是复制 FrameworkManifest.xml 这个文件来覆盖,其二是删除 FrameworkManifest.xml并重新安装Common Management Agent (CMA)\u003c/p\u003e\n\u003cp\u003e8.5.0.i版本的FrameworkManifest.xml文件下载:\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://qingwa.hackroad.com/newblog/template/elegantly/images/download.gif\" alt=\"mcafee不能更新,提示初始化Common updater子系统失败 - 饿狼 - 我们俩\"\u003e下载文件 (已下载 153 次)\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://qingwa.hackroad.com/newblog/attachment.php?fid=9\"\u003e点击这里下载文件: FrameworkManifest.xml\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e官方的bug说明:\u003c/p\u003e\n\u003cp\u003eCorporate KnowledgeBase\u003c/p\u003e\n\u003cp\u003eERROR: McAfee Common Framework returned error fffff95b @ 2 (issue: FrameworkManifest.xml corrupt)\u003c/p\u003e\n\u003cp\u003eCorporate KnowledgeBase ID: KB54520\u003c/p\u003e\n\u003cp\u003ePublished: August 08, 2008\u003c/p\u003e\n\u003cp\u003eEnvironment\u003c/p\u003e\n\u003cp\u003eMcAfee Common Management Agent 3.60 …\u003c/p\u003e"
May 14, 2010
PHP使用接口实现多重继承
"\u003cp\u003ePHP类虽然是单继承的,但是可以通过其它特殊的方式实现多重继承,比如使用接口实现,只要把类的特征抽象为接口,并通过实现接口的方式让对象有多重身 份,通过这样就可以模拟多重继承了。\u003c/p\u003e\n\u003cp\u003e下面就是一个用接口模拟多重继承的例子,源代码如下:\u003c/p\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003e\n\u003cp\u003einterface UserInterface{ // 定义User的接口\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003efunction getname();\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003einterface TeacherInterface{ //teacher 相关接口\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003efunction getLengthOfService();\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eclass User implements UserInterface { // 实现UserInterface接口\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eprivate$name = “tom”;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003epublicfunction getName(){\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ereturn$this-\u0026gt;name;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eclass Teacher implements TeacherInterface { // 实现TeacherInterface …\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e"
May 14, 2010
在smarty中增加类似foreach的功能自动加载数据
"\u003cp\u003e在smarty中使用自定义插件来加载数据(见:), 在使用的时候还是感觉不够方便,灵机一动就想写成类似foreach那种标签:\u003c/p\u003e\n\u003cp\u003e第一步:在Smarty_Compiler.class.php的_compile_tag函数中增加:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.csdn.net/yycai/archive/2009/12/28/5092770.aspx#\"\u003eview\u003cbr\u003e\n\u003cbr\u003e\nplain\u003c/a\u003e \u003ca href=\"http://blog.csdn.net/yycai/archive/2009/12/28/5092770.aspx#\"\u003ecopy\u003cbr\u003e\n\u003cbr\u003e\nto clipboard\u003c/a\u003e \u003ca href=\"http://blog.csdn.net/yycai/archive/2009/12/28/5092770.aspx#\"\u003eprint\u003c/a\u003e \u003ca href=\"http://blog.csdn.net/yycai/archive/2009/12/28/5092770.aspx#\"\u003e?\u003c/a\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e//加载\u003c/p\u003e\n\u003cp\u003e数据的开始标签\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ecase‘load’:\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e$this-\u0026gt;_push_tag(‘load’);\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ereturn$this-\u0026gt;_complie_load_start($tag_args);\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ebreak;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e//加载数据的结束标签\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ecase‘/load’:\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e$this-\u0026gt;_pop_tag(‘load’);\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ereturn“”;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ebreak;\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e第二步:增加一个方法:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.csdn.net/yycai/archive/2009/12/28/5092770.aspx#\"\u003eview\u003cbr\u003e\n\u003cbr\u003e\nplain\u003c/a\u003e \u003ca href=\"http://blog.csdn.net/yycai/archive/2009/12/28/5092770.aspx#\"\u003ecopy\u003cbr\u003e\n\u003cbr\u003e\nto clipboard\u003c/a\u003e \u003ca href=\"http://blog.csdn.net/yycai/archive/2009/12/28/5092770.aspx#\"\u003eprint\u003c/a\u003e \u003ca href=\"http://blog.csdn.net/yycai/archive/2009/12/28/5092770.aspx#\"\u003e?\u003c/a\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e/**\u003c/li\u003e\n\u003cli\u003e* 加载数据\u003c/li\u003e\n\u003cli\u003e* @param $tag_args\u003c/li\u003e\n\u003cli\u003e*/\u003c/li\u003e\n\u003cli\u003efunction _complie_load_start($tag_args)\u003c/li\u003e\n\u003cli\u003e{\u003c/li\u003e\n\u003cli\u003e$key = …\u003c/li\u003e\u003c/ol\u003e"
May 14, 2010
Smarty缩图函数
"\u003cp\u003e下载: \u003ca href=\"http://www.21andy.com/blog/wp-content/plugins/coolcode/coolcode.php?p=703\u0026amp;download=function.thumb.php\"\u003efunction.thumb.php\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e/*\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eSmarty plugin “Thumb”\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePurpose: creates cached thumbnails\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHome: \u003ca href=\"http://www.cerdmann.com/thumb/\"\u003ehttp://www.cerdmann.com/thumb/\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCopyright (C) 2005 Christoph Erdmann\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis library is distributed in the hope that it will be useful, but WITHOUT ANY …\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e"
May 14, 2010
Smarty高级特性 – 用户自定义函数使用 SMARTY:: register_function;
"\u003cp\u003eSmarty高级 特性 – 用户自定义函数 使用 SMARTY:: register_function;\u003c/p\u003e\n\u003cp\u003e前言:\n很久不用smarty了,因为大多数项目都是比较轻量型的。前段时间 笔者接了个还算可以的项目,下面有几个程序员 ,与一个美工组为项目团队。为了做快速的布署应用 ,也为了小组成员能形成一个统一的view层的控制,选择了smarty。发现smarty果然还是那么的强大,那么的很黄很暴力。\n作者:无喱头\u003c/p\u003e\n\u003cp\u003e故事背景:\n小张是个很漂亮的美工MM,与无喱头搭档已经很多年。请不要误解,无喱头是有老婆女儿的,他们之前没有任何的暧昧关系,仅仅是同事,或者是上下级。\n在两人的多年合作过程中,在很多地方,已经形成了一种默契。在很多时候,喱头提供封装好的php函数,然后通过一些技术 上的修改,可以直接使用小张在模板里引入php函数,这样可以很方便的把模板切成很多小块,便于维护。并且由于可以自定义一些关键字,小张可能很快的取出 想要的一些数据 。\n比如:\n{phpsoho “sort=article\u0026amp;order=ID …\u003c/p\u003e"
April 28, 2010
PHP图片处理剪切类
"\u003cp\u003e\u0026lt; ?php\u003c/p\u003e\n\u003cp\u003e/**\u003c/p\u003e\n\u003cp\u003e* 基本图片处理,用于完成图片缩入,水印添加\u003c/p\u003e\n\u003cp\u003e* 当水印图超过目标图片尺寸时,水印图能自动适应目标图片而缩小\u003c/p\u003e\n\u003cp\u003e* 水印图可以设置跟背景的合并度\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e* Copyright(c) 2005 by ustb99. All rights reserved\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e* To contact the author write to {@link mailto:ustb80@163.com}\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e@author 偶然\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e@version $Id: thumb.class.php,v 1.9 2006/09/30 09:31:56 zengjian Exp $\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e@package system\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e*/\u003c/p\u003e\n\u003cp\u003e/**\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThumbHandler\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e@access public\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e*/\u003c/p\u003e\n\u003cp\u003e/*\u003c/p\u003e\n\u003cp\u003e使用方法:\u003c/p\u003e\n\u003cp\u003e自动裁切:\u003c/p\u003e\n\u003cp\u003e程序会按照图片的尺寸从中部裁切最大的正方形,并按目标尺寸进行缩略\u003c/p\u003e\n\u003cp\u003e$t-\u0026gt;setSrcImg(“img/test.jpg”);\u003c/p\u003e\n\u003cp\u003e$t-\u0026gt;setCutType(1);//这一句就OK …\u003c/p\u003e"
April 28, 2010
PHP生成word文档格式试卷的代码
"\u003cp\u003ePHP生 成word文档的代码,这个是用来生产试卷的简单PHP代码\u003c/p\u003e\n\u003cp\u003e以下为引用的内容:试卷生成 difficulty.”\u003c/p\u003e\n\u003cp\u003e”;\n$cout.=” “.$row-\u0026gt;content.”\u003c/p\u003e\n\u003cp\u003e”;\n}//while\u003c/p\u003e\n\u003cp\u003e?\u0026gt;\n’;\n}\u003c/p\u003e\n\u003cp\u003efunction save($path)\n{\u003c/p\u003e\n\u003cp\u003eprint “”;\n$data = ob_get_contents();\u003c/p\u003e\n\u003cp\u003eob_end_clean();\u003c/p\u003e\n\u003cp\u003e$this-\u0026gt;wirtefile ($path,$data);\n}\u003c/p\u003e\n\u003cp\u003efunction wirtefile ($fn,$data)\n{\u003c/p\u003e\n\u003cp\u003e$fp=fopen($fn,”wb”);\nfwrite($fp,$data);\nfclose($fp);\n}\n}\n/*——-word class End——-*/\n$word=new word;\n$word-\u0026gt;start();\necho $cout;\n$wordname=”word/”.time().”.doc”;\n$word-\u0026gt;save($wordname);// 保存word并且结束.\n?\u0026gt;\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"%E2%80%9D%3C?php\"\u003e” target=_blank …\u003c/a\u003e\u003c/p\u003e"
April 26, 2010
开源免费的简易中文分词系统SCWS – PHP版
"\u003cp\u003eSCWS 是 Simple Chinese Words Segmentation 的缩写,即简易中文分词系统。\u003c/p\u003e\n\u003cp\u003e这是一套基于词频词典的机械中文分词引擎,它能将一整段的汉字基本正确的切分成词。词是汉语的基本语素单位,而书写的时候不像英语会在词 之间用空格分开,所以如何准确而又快速的分词一直是中文分词的攻关难点。\u003c/p\u003e\n\u003cp\u003eSCWS 在概念上并无创新成分,采用的是自行采集的词频词典,并辅以一定程度上的专有名称、人名、地名、数字年代等规则集,经小范围测试大概准确率在 90% ~ 95% 之间,已能基本满足一些中小型搜索引擎、关键字提取等场合运用。 SCWS 采用纯 C 代码开发,以 Unix-Like OS 为主要平台环境,提供共享函数库,方便植入各种现有软件系统。此外它支持 GBK,UTF-8,BIG5 等汉字编码,切词效率高。\u003c/p\u003e\n\u003cp\u003e[推荐]首个搭载 SCWS 分词系统的中小型站内全文检索解决方案 – \u003ca href=\"http://www.ftphp.com/\"\u003eFTPHP!\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e以下为本人在win03平台下,php5.2.5+apache2.2.11平台下推荐的方法,特别的简单,用的是gbk的字库的\u003c/p\u003e\n\u003cp\u003e1. …\u003c/p\u003e"
April 22, 2010
PHP生成内置图片Word文档的方法(一)
"\u003cp\u003e一般,有2种方法可以导出doc文档,一种是 使用com,并且作为php的一个扩展库安装到服务器上,然后创建一个com,调用它的方法。安装过office的服务器可以调用一个叫 word.application的com,可以生成word文档,不过这种方式我不推荐,因为执行效率比较低(我测试了一下,在执行代码的时候,服务器 会真的去打开一个word客户端)。理想的com应该是没有界面的,在后台进行数据转换,这样效果会比较好,但是这些扩展一般需要收费。\u003c/p\u003e\n\u003cp\u003e第2种方法,就是用PHP将我们的doc文档内容直接写入一个后缀为doc的文件中即可。使用这种方法不需要依赖第三方扩展,而且执行效率较高。\u003c/p\u003e\n\u003cp\u003eword本身的功能还是很强大的,它可以打开html格式的文件,并且能够保留格式,即使后缀为doc,它也能识别正常打开。这就为我们提供了方便。但是 有一个问题,html格式的文件中的图片只有一个地址,真正的图片是保存在其他地方的,也就是说,如果将HTML格式写入doc中,那么doc中将不能包 含图片。那我们如何创建包含图片的doc文档呢?我们可以使用和html很接近的mht格式。\u003c/p\u003e\n\u003cp\u003emht格式和html很类似,只 …\u003c/p\u003e"
April 19, 2010
魔法引用函数 magic_quotes_gpc和magic_quotes_runtime的区别和用法
"\u003cp\u003ePHP基础002: 魔法引用函数magic_quotes_gpc和magic_quotes_runtime的区别和用法\u003c/p\u003e\n\u003cp\u003ePHP提供两个方便我们引用数据的魔法引用函数magic_quotes_gpc和magic_quotes_runtime,这两个函数如果在 php.ini设置为ON的时候,就会为我们引用的数据碰到单引号’和双引号”以及反斜线 \\ 是自动加上反斜线,帮我们自动转译符号,确保数据操作的正确运行,可是我们在php不同的版本或者不同的服务器配置下,有的 magic_quotes_gpc和magic_quotes_runtime设置为on,有的又是off,所以我们写的程序必须符合on和off两种情 况。那么magic_quotes_gpc和magic_quotes_runtime两个函数有什么区别呢?看下面的说明:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emagic_quotes_gpc\u003c/strong\u003e\n作用范围是:WEB客户服务端;\n作用时间:请求开始是,例如当脚本运行时.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emagic_quotes_runtime\u003c/strong\u003e\n作用范围:从文件中读取的数据或执行exec()的结果或是从SQL查询中得到的;\n作用时间:每次当脚本访问运行状态中产生 …\u003c/p\u003e"
April 19, 2010
同服务器多网站的安全设置(windows server+apache+php)
"\u003cp\u003e在windows环境下,如果用IIS做webserver,可以配合ntfs为每个网站设置不同的用户权限,从而让一个网站的程序只能访问自己目 录下的内容.\u003c/p\u003e\n\u003cp\u003e而在windows的apache环 境下,由于apache默认是最高的system权限,因此非常危险,若不做安全设置,随便传一个php shell到任何一个网站上,就能控制整台服务器。\u003c/p\u003e\n\u003cp\u003e要实现这个目标,需要做以下设置:\u003c/p\u003e\n\u003cp\u003e1、在vhost中设置 open_basedir,设置后,php程序将只能打开规定目录下的内容(此指令不受安全模式是否打开的限制)。如下。同时最好把php.ini的 upload_tmp_dir 目录也添加进去,否则可能无法正常上传文件。\u003c/p\u003e\n\u003cp\u003eServerAdmin \u003ca href=\"mailto:admin@abc.com\"\u003eadmin@abc.com\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eDocumentRoot D:/abc\u003c/p\u003e\n\u003cp\u003eServerName \u003ca href=\"http://www.abc.com/\"\u003ewww.abc.com\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eErrorLog logs/abc.com-error_log\u003c/p\u003e\n\u003cp\u003eCustomLog logs/abc.com-access_log common\u003c/p\u003e\n\u003cp\u003ephp_admin_value open_basedir “D:/abc;D:/php/temp” …\u003c/p\u003e"
April 17, 2010
JW Media Player 中文文档
"\u003cp\u003e\u003cstrong\u003eThe JW MP3 Player (built with Adobe’s Flash) is the easiest way to add live music or podcasts to your website. It supports playback of a single MP3 file or an RSS, XSPF or ASX playlist, a wide range of flashvars (settings) for tweaking both behavior and appearance and an extensive, documented javascript/actionscript API.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e官方网址 \u003ca href=\"http://www.jeroenwijering.com/?item=JW_Media_Player\"\u003ehttp://www.jeroenwijering.com\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e这篇文档包含了JW MP3 Player,JW FLVPlayer,JW Media Player,JW Image Rotator的安装方法和配置方\n法\u003c/p\u003e\n\u003cp\u003eJW PLAYERS 3.11 文档\u003c/p\u003e\n\u003cp\u003e1,安装 (在你的站点里嵌入)\n2,参数 (配置) …\u003c/p\u003e"
April 17, 2010
JW Player使用简介
"\u003cp\u003e\u003cstrong\u003e一、JW Player是什么?\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e简单地说,JW Player是一种基于flash的交互式网页媒体播放器。它是由Jeroen 和 Wijering共同建立的LongTail Video所开发,问世于2005年,当时仍名不经传的YouTube首次采用的播放器就是JW Player。官方网址: \u003ca href=\"http://www.longtailvideo.com/\"\u003ehttp://www.longtailvideo.com/\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003eJW Player含:FLV Player、WMV Player、Image Rotator和Desktop Player四种,除了最后一种实为桌面播放器,其他三种都是网页播放器。本篇内容仅限FLV Player。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二、JW FLV Media Player简介\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eJW FLV Media Player可播放Adobe Flash Player所支持的媒体,具体包括:FLV、MP4、MP3、AAC、JPG、PNG和GIF等,还支持RTMP、HTTP、实时视频流、各种播放清单 格式、灵活的设置和广泛的javascript API。此外它还提供多种外观、功能性插件来扩展播放器,以便我们可以分享、推荐、搜索、分析甚至广告投放。 …\u003c/p\u003e"
April 13, 2010
smarty缓存使用技巧
"\u003cp\u003e\u003cstrong\u003e一、使用缓存\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e要开启smarty的缓存,只需将caching设为true,并指定cache_dir即可.\u003c/p\u003e\n\u003cp\u003e使用cache_lefetime指定 缓存生存时间,单位为秒\u003c/p\u003e\n\u003cp\u003e要对相同页面生成多个不同的缓存,在display或fetch中加入第二参数cache_id, 如$smarty-\u0026gt;display(‘index.tpl’,$my_cache_id);此特性可用于对不同的$_GET进行不同的缓存\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二、清除缓存\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eclear_all_cache();//清除所有缓存\u003c/p\u003e\n\u003cp\u003eclear_cache(‘index.tpl’);// 清除index.tpl的缓存\u003c/p\u003e\n\u003cp\u003eclear_cache(‘index.tpl’,cache_id);//清除指定id的缓存\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e三、使用自定义缓存方式\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e设置cache_handler_func使用自定义的函数处理缓存\u003c/p\u003e\n\u003cp\u003e如:\u003c/p\u003e\n\u003cp\u003e$smarty-\u0026gt;cache_handler_func = “myCache”;\u003c/p\u003e\n\u003cp\u003efunction myCache($action, \u0026amp;$smarty_obj, \u0026amp;$cache_content, $tpl_file=null, …\u003c/p\u003e"
April 1, 2010
采用curl库在PHP程序之间传递数组[原创]
"\u003cp\u003e[文章作者:张宴 本文版本:v1.1 最后修改:2007.08.23 转载请注明出处: \u003ca href=\"http://blog.s135.com/\"\u003ehttp://blog.s135.com\u003c/a\u003e]\u003c/p\u003e\n\u003cp\u003e最近在工作中遇到一个问题:a.php程序需要将接收到的数据同时写到“线上运行的正式数据库”和“进行开发调试的测试数据库”。而测试数据库可能经常 会面临对表结构、字段、配置信息做调整等问题,很不稳定,发生错误的概率很高,如果用a.php程序同时写“正式数据库”和“测试数据库”,势必影响到线 上运行的正式服务。\u003c/p\u003e\n\u003cp\u003e于是,我想到用PHP curl扩展库将生成的$data数组post传递一份给b.php程序,然后a.php程序继续往下执行写“正式数据库”的代码。a.php程序 将$data数组传递给b.php程序就完事了,至于b.php如何处理,就不关a.php的事了,b.php程序即使写“测试数据库”失败,也不会对 a.php程序造成影响。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/04/curl.gif\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/04/curl.gif\" alt=\"curl\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e按照这种思路,我写了a.php和b.php的代码:\u003c/p\u003e\n\u003cp\u003ea.php程序源代码:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.s135.com/#\"\u003eview plain\u003c/a\u003e \u003ca href=\"http://blog.s135.com/#\"\u003eprint\u003c/a\u003e \u003ca href=\"http://blog.s135.com/#\"\u003e?\u003c/a\u003e\u003c/p\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003e$data[“username”]=“张宴”;\u003c/li\u003e\n\u003cli\u003e$data[“password”]=“不知 道”; …\u003c/li\u003e\u003c/ol\u003e"
April 1, 2010
同一域名对应多个IP时,PHP获取远程网页内容的函数 [原创]
"\u003cp\u003e[文章作者:张宴 本文版本:v1.0 最后修改:2008.12.15 转载请注明原文链接: \u003ca href=\"http://blog.s135.com/post/389/\"\u003ehttp://blog.s135.com/post/389/\u003c/a\u003e]\u003c/p\u003e\n\u003cp\u003ePHP获取远程网页内容有多种方式,例如用自带的file_get_contents、fopen等函数。\u003c/p\u003e\n\u003cp\u003e引用\u003c/p\u003e\n\u003cp\u003eecho file_get_contents(“ \u003ca href=\"http://blog.s135.com/abc.php%22%29;%C2%A0%C2%A0\"\u003ehttp://blog.s135.com/abc.php”);\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e?\u0026gt;\u003c/p\u003e\n\u003cp\u003e但是,在DNS轮询等负载均衡中,同一域名,可能对应多台服务器,多个IP。假设 blog.s135.com被DNS解析到72.249.146.213、72.249.146.214、72.249.146.215三个IP,用户每 次访问blog.s135.com,系统会根据负载均衡的相应算法访问其中的一台服务器。\u003c/p\u003e\n\u003cp\u003e上周做一个视频项目时,就碰到这样一类需 求:需要依次访问每台服务器上的一个PHP接口程序(假设为abc.php),查询这台服务器的传输状态。\u003c/p\u003e\n\u003cp\u003e这时就不能直接用 file_get_contents访问 \u003ca href=\"http://blog.s135.com/abc.php\"\u003ehttp://blog.s135.com/abc.php\u003c/a\u003e 了,因为它可能一直重复访问某一台服务器。\u003c/p\u003e\n\u003cp\u003e …\u003c/p\u003e"
March 26, 2010
PHP中echo和print的区别
"\u003cp\u003ePHP 和 HTML 最简单的交互是通过 print 和 echo 语句来实现的,在实际使用中, print 和 echo 两者的功能几 乎是完全一样。可以这么说,凡是有一个可以使用的地方,另一个也可以使用。但是,两者之间也还是一个非常重要的区别:在 echo 函数中,可以同时输出 多个字符串,而在 print 函数中则只可以同时输出一个字符串。同时,echo函数并不需要圆括号,所以echo函数更像是语句而不像是函数。\u003c/p\u003e\n\u003cp\u003eecho 和 print 都不是函数,而是语言结构,\u003cstrong\u003e所以圆括号都不是必需的\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003eecho命令和print命令相同,没有区别 ;\necho函数和print函数有区别;\nprint()有返 回值,当其执行失败(比如断线)时返回flase;\nprintf()和sprintf()类似,均为格式化输出,不同的是前者输出到 标准输出,后者输出到变量。\u003c/p\u003e\n\u003cp\u003e他们的区别在于:\n(1) echo可以输出多个字符串,像下面这样:\necho ‘a’,’b’,’c’;\n如果你非要加上圆括号,注意写成echo (‘a’,’b’,’c’);是错误的,应该写成:\necho …\u003c/p\u003e"
March 26, 2010
windows下安装 Xdebug+WinCacheGrind
"\u003cp\u003e以PHP5.1.4,Windows平台为例(其它PHP版本,其它平台请参看官网文档):\n1. 在 \u003ca href=\"http://www.xdebug.org/download.php\"\u003ehttp://www.xdebug.org/download.php\u003c/a\u003e 下载适合自己php版本的php_xdebug- 2.0.1-5.1.2.dll【有附件提供下载,如果按照以下步骤完成后 phpinfo任无法显示xdebug,那么建议重新下载其他xdebug.dll文件试试 】;\n2. 将下载的xdebug.dll放到php\\ext目录里,可以重命名也可以不重命名,这里我没有重命名。\n3. 编辑php.ini,加入下面几行:\u003c/p\u003e\n\u003cp\u003eextension=php_xdebug-2.0.1-5.1.2.dll\u003c/p\u003e\n\u003cp\u003e;xdebug配置\n[Xdebug]\n;开启自动跟踪\nxdebug.auto_trace = On\n;开启异常跟踪\nxdebug.show_exception_trace = On\n;开启远程调试自动启动\nxdebug.remote_autostart = On\n;开启远程调试\nxdebug.remote_enable = On\n;收集变量\nxdebug.collect_vars = On\n; …\u003c/p\u003e"
March 26, 2010
PHP中如何使用header发送头部信息
"\u003cp\u003e在照彭武兴先生的《PHP BIBLE》中所述,header可以送出Status标头,如\u003c/p\u003e\n\u003cp\u003e就可以让用户浏览器出现文件找不到的404错误,但是我试了这样是不行的。\u003c/p\u003e\n\u003cp\u003e后 来我到w3.org上查了http的相关资料,终于试出来了如何Header出状态代码(Status),与大家分享。\u003c/p\u003e\n\u003cp\u003e其实应该是这样 的:\u003c/p\u003e\n\u003cp\u003e第一部分为 HTTP协议的版本(HTTP-Version)\u003c/p\u003e\n\u003cp\u003e第二部分为状态代码(Status)\u003c/p\u003e\n\u003cp\u003e第三部分为原因短语 (Reason-Phrase)\u003c/p\u003e\n\u003cp\u003e三部分中间用一个空格分开,且中间不能有回车,第一部分和第二部分是必需的,第三部分则是给人看的,可 写可不写甚至乱写。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e还有,这一句的输出必须在Html文件的第一行。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e下面我给出各代码所代表的意思(是从 w3.org上查到的,够权威了):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e1xx: Informational – Request received, continuing process\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e2xx: Success – The action was successfully received, understood,and accepted\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e3xx: Redirection …\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e"
January 22, 2010
用apache来实现限制ip可以访问phpmyadmin
"\u003cp\u003e为了安全,只允许固定ip才可以访问phpmyadmin,这个由于没有找到在phpmyadmin配置的地方,所以这里用apache来实现这个功能\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eServerAdmin www@163.com\nDocumentRoot “D:\\site\\phpMyAdmin”\nServerName php.haohtml.com\nDirectoryIndex index.php index.shtml\n\n\nOptions Indexes MultiViews\nAllowOverride None\norder deny,allow\nAllow from 192.168.0.7\nDeny from all\n\nAllow from all\n\nOptions FollowSymLinks Includes\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e经过上面一系列的配置,将只允许ip为192.168.0.7的ip才可以访问phpmyadmin,其它的ip都不允许访问.\u003c/p\u003e"
January 8, 2010
解除phpMyAdmin 导入大型MySQL数据库文件大小限制
"\u003cp\u003e今天在WPMZ环境下安装了DEDECMS,朋友将以前网站的数据进行导入时出现了一些问题,提示超出导入大小限制。默认MYSQL只能导入最大2MB的数据,于是我在网上找到了修改的方法,事实证明以下方法是可行的。(修改好后必须重启PHP,可)\n**\nphpMyAdmin 导入大型数据库文件大小限制配置…**\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e修改 php.ini 文件中下列3项的值:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eupload_max_filesize, memory_limit 和 post_max_size\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eupload_max_filesize,上传文件大小\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ememory_limit 设置内存\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003epost_max_size 提交数据的最大值\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e为你想改的大小值.\u003c/p\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003e在 phpMyAdmin 的配置文件中修改或加入这个设置:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e这个文件一般是在phpMyAdmin目录下的config.inc.php文件\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e$cfg[‘ExecTimeLimit’] = 0; // maximum execution time in seconds (0 for no limit)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e默认为300秒钟,改为0表示不受限制\u003c/p\u003e"
December 31, 2009
smarty局部缓存
"\u003cp\u003eSmarty提供了强大的 缓存功能。但有时我们并不希望整篇文档都被缓存,而是有选择的缓存某一部分内容或某一部分内容不被缓存。例如你在页面上端使用一个带有广告条位置的模板, 广告条可以包含任何HTML、图象、FLASH等混合信息. 因此这里不能使用一个静态的链接,同时我们也不希望该广告条被缓存. 这就需要在 insert 函数指定,同时需要一个函数取广告条的内容信息。smarty也提供了这种缓存控制能力。\u003c/p\u003e\n\u003cp\u003e我们可以使用$smarty-\u0026gt;register_block($params,\u0026amp;$smarty)使整篇页面中的某一块不被缓存。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eindex.tpl:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eXML/HTML代码\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u0026lt;divalign=‘center’\u0026gt;\u003c/li\u003e\n\u003cli\u003ePage created: {“0″|date_format:”%D %H:%M:%S”}\u003c/li\u003e\n\u003cli\u003e\u0026lt;{dynamic}\u0026gt;\u003c/li\u003e\n\u003cli\u003eNow is: {“0″|date_format:”%D %H:%M:%S”}\u003c/li\u003e\n\u003cli\u003e… do other stuff …\u003c/li\u003e\n\u003cli\u003e\u0026lt;{/dynamic}\u0026gt;\u003c/li\u003e\n\u003cli\u003ediv\u0026gt;\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eindex.php:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eXML/HTML …\u003c/p\u003e"
November 17, 2009
sphinx在windows下无法启动的解决办法
"\u003cp\u003e配置完成了sphinx,也安装成为系统服务,但在dos提示符下服务的时候错误\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003esearchd –-install -–config d:/csft3.1/bin/xxxx.conf\u003c/p\u003e\n\u003cp\u003e相应的删除服务命令为:\u003c/p\u003e\n\u003cp\u003esearchd –delete\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/sphinex-services.jpg\" alt=\"sphinex-services\"\u003e][1]\u003c/p\u003e\n\u003cp\u003e这里有两种办法:\n1.直接把配置文件复制到c:/windows/system32目录里一份就可以了.\n2.在安装服务的时候指定配置文件的物理路径(–config d:/csft3.1/bin/csft.conf)\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e索引或者查询时提示:ERROR: invalid token in 配置文件 line 1 col 1.\u003c/strong\u003e:\u003c/p\u003e\n\u003cp\u003e该提示表示当前的配置文件的编码不是UTF-8(无BOM头)格式,无法正确解析,请使用编辑软件打开配置文件,另存为UTF-8(无BOM头)格式;\u003c/p\u003e\n\u003cp\u003e错误的编码格式包括:Unicode、Unicode BOM、Unicode big endian、Unicode 低位在前、UTF-8 + BOM、UTF-8 Signature、UTF-8 包含签名等;\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e特别注意\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eWindows自带的记事本(Notepad)或者写字 …\u003c/p\u003e"
October 12, 2009
jQuery+PHP实现FCKEditor内容分页
"\u003cp\u003e如题,用jQuery+PHP实现FCKEditor内容分页,如下:\u003c/p\u003e\n\u003cp\u003ePHP分页函数:\n/*\u003cstrong\u003e****\u003cem\u003e*\\\u003c/em\u003e*FCKEditor分页处理***\u003c/strong\u003e****/\nfunction pageBreak($content)\n{\n//把文章内容按照\u003c/p\u003e\n\u003cp\u003e分割成数组\n$content = $content;\n$pattern = “/\u003c/p\u003e\n\u003cp\u003e\u0026lt;/span\u0026gt;\u0026lt;/div\u0026gt;/”;\n$strSplit = preg_split($pattern, $content, -1, PREG_SPLIT_NO_EMPTY); //将文章内容分割成数组\n$count = count($strSplit); //分割后的数组单元数目\n$outStr = “”; //返回的字串\n$i = 1;\u003c/p\u003e\n\u003cp\u003eif ($count \u0026gt; 1 ) {\n$outStr = “\n”;\nforeach($strSplit as $value) {\nif ($i \u0026lt;= 1) {\n$outStr .= “\u003c/p\u003e\n\u003cp\u003e$value\u003c/p\u003e\n\u003cp\u003e”;\n} else {\n$outStr .= “\u003c/p\u003e\n\u003cp\u003e$value\u003c/p\u003e\n\u003cp\u003e”;\n} …\u003c/p\u003e"
July 31, 2009
详细讲解C++ 类的继承
"\u003cp\u003e一个私有的或保护的派生类不是子类,因为非公共的派生类不能做基类能做的所有的事,就是指在公开场合,但是在类内部可以的\u003c/p\u003e\n\u003ch3 id=\"一引言\"\u003e一、引言\u003c/h3\u003e\n\u003cp\u003e在C++中,类是提供封装的逻辑单位,类的每一个对象都包含有描述其自身状态的数据集合,并且通过接收特定的消息来处理这个数据集合。如果程序设计 人员能够通过增加、修改或替换指定类的部分内容的方法对该类进行剪裁,就可以适应不同的应用,从而在很大程度上增强了数据封装的价值,而接下来要讨论的继 承就完全可以实现这种操作。\u003c/p\u003e\n\u003ch3 id=\"二与继承有关的基本概念\"\u003e二、与继承有关的基本概念\u003c/h3\u003e\n\u003cp\u003e继承是一个进程,通过继承,一个对象可以获得另一个对象的属性(包括函数),并可向其中加入属于自己的一些特征。作为C++语言的一种重要机制,用 继承的方法可以自动为一个类提供来自另一个类的操作和数据结构,进而使程序设计人员在一个一般的类的基础上很快建立一个新的类,而不必从零开始设计每个 类。\u003c/p\u003e\n\u003cp\u003e当一个类被其他的类继承时,被继承的类称为基类(可不是鸡肋^_^),又称为父类。\u003c/p\u003e\n\u003cp\u003e继承其他类属性的类称为派生类,又称为子类。\u003c/p\u003e\n\u003cp\u003e一般情况下,继承的进程起源于一个基类的定义,基类定义了其所有派生类的公有属性。从本质上讲,基类具有同一类集合中的公共属 …\u003c/p\u003e"
May 26, 2009
php计算两个数组交集和差集
"\u003cp\u003earray_intersect\n(PHP 4 \u0026gt;= 4.0.1, PHP 5)\u003c/p\u003e\n\u003cp\u003earray_intersect — 计算数组的交集说明\narray array_intersect ( array array1, array array2 [, array …])\narray_intersect() 返回一个数组,该数组包含了所有在 array1 中也同时出现在所有其它参数数组中的值。注意键名保留不变。\u003c/p\u003e\n\u003cp\u003e例子 1. array_intersect() 例子\u003c/p\u003e\n\u003cp\u003e“green”, “red”, “blue”);\n$array2 = array (“b” =\u0026gt; “green”, “yellow”, “red”);\n$result = array_intersect ($array1, $array2);\n?\u0026gt;\u003c/p\u003e\n\u003cp\u003e这使得 $result 成为:\u003c/p\u003e\n\u003cp\u003eArray\n(\n [a] =\u0026gt; green\n [0] =\u0026gt; red\n)\n注: 两个单元仅在 (string) $elem1 === (string) $elem2 时被认为是相同的。也就是说,当字符串的表达是一样的时候。 …\u003c/p\u003e"
May 25, 2009
php中的$_SERVER or $_ENV
"\u003cp\u003e服务器变量:$_SERVER\n注: 在 PHP 4.1.0 及以后版本使用。之前的版本,使用 $HTTP_SERVER_VARS。\u003c/p\u003e\n\u003cp\u003e$_SERVER 是一个包含诸如头信息(header)、路径(path)和脚本位置(script locations)的数组。数组的实体由 web 服务器创建。不能保证所有的服务器都能产生所有的信息;服务器可能忽略了一些信息,或者产生了一些未在下面列出的新的信息。这意味着,大量的这些变量在 CGI 1.1 规范中说明,所以应该仔细研究一下。\u003c/p\u003e\n\u003cp\u003e环境变量:$_ENV\n注: 在 PHP 4.1.0 及以后版本使用。之前的版本,使用 $HTTP_ENV_VARS。\u003c/p\u003e\n\u003cp\u003e在解析器运行时,这些变量从环境变量转变为 PHP 全局变量名称空间(namespace)。它们中的许多都是由 PHP 所运行的系统决定。完整的列表是不可能的。请查看系统的文档以确定其特定的环境变量。\u003c/p\u003e\n\u003cp\u003e其它环境变量(包括 CGI 变量),无论 PHP 是以服务器模块或是以 CGI 处理方式运行,都在这里列出了。\u003c/p\u003e\n\u003cp\u003e这是一个“superglobal”,或者可以描述为自动全局变量。这只不过意味这它在所有的脚本中 …\u003c/p\u003e"
May 5, 2009
php判断浏览器类型
"\u003cp\u003eUA = getenv(“HTTP_USER_AGENT”);\n $start = strpos($this-\u0026gt;UA,”(“)+1;//查看起始位置\n $length = strpos($this-\u0026gt;UA,”)”)-$start;//查看结束位置\n $middle = trim(substr($this-\u0026gt;UA,$start,$length)); //查看内容\n $end = trim(substr($this-\u0026gt;UA,$start+$length+1));//附加内容\n $message = explode(“;”,$middle);//转换成数组\n //———-操作系统—————–\n $os = trim($message[‘2’]);\n $os_array = explode(” “,$os);\n $this-\u0026gt;PLATFORM = trim($os_array[‘0’]);//操作系统\n //————浏览器————\n $brower = trim($message[‘1’]); …\u003c/p\u003e"
March 2, 2009
ZF框架中的MVC
"\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2009/03/8f5c2e59-c194-407e-93e4-949ca16aa67a.bmp\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/8f5c2e59-c194-407e-93e4-949ca16aa67a.bmp\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e"
December 3, 2008
配置apache服务器支持shtml
"\u003cp\u003e服务器采用shtml速度会比html慢,比php快。\u003c/p\u003e\n\u003cp\u003eshtml的特点就是能够进行页面包含,能够局部更新页面包含部分。广泛采用可以很容易解决网页中的广告问题,不需要更新全面静态页面。而只需更新一个包含页面即可。\u003c/p\u003e\n\u003cp\u003eapache下配置服务器支持shtml\u003c/p\u003e\n\u003cp\u003e打开文件:httpd.conf\u003c/p\u003e\n\u003cp\u003e去掉前面的 #LoadModule include_module modules/mod_include.so\u003c/p\u003e\n\u003cp\u003eOptions Indexes FollowSymLinks Includes\u003c/p\u003e\n\u003cp\u003eAllowOverride Options FileInfo\nOrder allow,deny\nAllow from all\u003c/p\u003e\n\u003cp\u003e找到下面两句,去掉前面的#\u003c/p\u003e\n\u003cp\u003eAddType text/html .shtml\nAddOutputFilter INCLUDES .shtml\u003c/p\u003e\n\u003cp\u003e重启apache即可。\u003c/p\u003e\n\u003cp\u003e建立页面:\u003c/p\u003e\n\u003cp\u003e测试\u003c/p\u003e\n\u003cp\u003efile为相对于当前文档的路径。\u003c/p\u003e\n\u003cp\u003evirtual为相对于虚拟目录的路径。\n如果需要让所有的html文件支持shtml.只需要修改上面一句。\u003c/p\u003e\n\u003cp\u003eAddOutputFilter INCLUDES .html\u003c/p\u003e"
November 27, 2008
用 P3P 实现隐私参数优选策略
"\u003cp\u003e偶尔在yahoo的 头信息里看到p3p就上网查了一下 放在这里储存\u003c/p\u003e\n\u003cp\u003eprint_r(get_headers());\u003c/p\u003e\n\u003cp\u003e?\u0026gt;\u003c/p\u003e\n\u003cp\u003e结果是这样的\u003c/p\u003e\n\u003cp\u003eArray\u003c/p\u003e\n\u003cp\u003e(\u003c/p\u003e\n\u003cp\u003e [0] =\u0026gt; HTTP/1.1 301 Moved Permanently\u003c/p\u003e\n\u003cp\u003e [1] =\u0026gt; Date: Mon, 17 Sep 2007 05:33:26 GMT\u003c/p\u003e\n\u003cp\u003e [2] =\u0026gt; Location: \u003ca href=\"http://cn.yahoo.com/\"\u003ehttp://cn.yahoo.com/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e [3] =\u0026gt; Connection: close\u003c/p\u003e\n\u003cp\u003e [4] =\u0026gt; Content-Type: text/html\u003c/p\u003e\n\u003cp\u003e [5] =\u0026gt; HTTP/1.1 200 OK\u003c/p\u003e\n\u003cp\u003e [6] =\u0026gt; Date: Mon, 17 Sep 2007 05:33:26 GMT\u003c/p\u003e\n\u003cp\u003e [7] =\u0026gt; P3P: policyref=” \u003ca href=\"http://p3p.yahoo.com/w3c/p3p.xml\"\u003ehttp://p3p.yahoo.com/w3c/p3p.xml\u003c/a\u003e“, CP=”CAO DSP COR CU\u003c/p\u003e\n\u003cp\u003eR ADM DEV TAI PSA PSD IVAi IVDi CONi …\u003c/p\u003e"
November 21, 2008
php中$_request与$_post、$_get的区别
"\u003cp\u003ephp中有$_request与$_post、$_get用于接受表单数据,当时他们有何种区别,什么时候用那种最好。\u003c/p\u003e\n\u003cp\u003e一、$_request与$_post、$_get的区别和特点\u003c/p\u003e\n\u003cp\u003e$_REQUEST[]具用$_POST[] $_GET[]的功能,但是$_REQUEST[]比较慢。通过post和get方法提交的所有数据都可以通过$_REQUEST数组获得\u003c/p\u003e\n\u003cp\u003e二、$_post、$_get的区别和特点\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eget是从服务器上获取数据,post是向服务器传送数据。\u003c/li\u003e\n\u003cli\u003eget是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。\u003c/li\u003e\n\u003cli\u003e对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。\u003c/li\u003e\n\u003cli\u003eget传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量 …\u003c/li\u003e\u003c/ol\u003e"
November 20, 2008
动态网页制作技巧PHP:详细彻底学习Smarty
"\u003cp\u003e页面请求变量\n以下是访问页面请求变量诸如get,post,cookies,server,enviroment和session变量的例子. 例如{$smarty.server.SERVER_NAME}取得服务器变量,{$smarty.env.PATH}取得系统环境变量path, {$smarty.request.username}取得get/post/cookies/server/env的复合变量。\u003c/p\u003e\n\u003cp\u003e{$smarty.now}变量用于访问当前时间戳.\n可以用 date_format调节器格式化输出. 例如{$smarty.nowdate_format:”%Y-%m-%d %H:%M:%S”}\u003c/p\u003e\n\u003cp\u003e{$smarty.const}\n你可以直接访问PHP常量. 例如{$smarty.const._MY_CONST_VAL}\u003c/p\u003e\n\u003cp\u003e{$smarty.capture}\n可以通过 {capture}..{/capture}结构 截取的输出可以使用{$smarty} 变量访问.\u003c/p\u003e\n\u003cp\u003e{$smarty.config}\n{$smarty}变量 可以访问已经加载的config变量. …\u003c/p\u003e"
November 13, 2008
require和include基本的区别
"\u003cp\u003e手册里是这么解释的:\u003c/p\u003e\n\u003cp\u003erequire() 和 include() 除了怎样处理失败之外在各方面都完全一样。include() 产生一个警告而 require() 则导致一个致命错误。换句话说,如果你想在丢失文件时停止处理页面,那就别犹豫了,用 require() 吧。include() 就不是这样,脚本会继续运行。同时也要确认设置了合适的include_path。\u003c/p\u003e\n\u003cp\u003e就是说再解析程序时即读取require的文件,而不是解析后,\u003c/p\u003e\n\u003cp\u003e如果不能读取到被require的文件,就不能进行下一步动作。\n所以,不被正确包含就会导致程序的文件,用require比较好。\u003c/p\u003e\n\u003cp\u003e可能效率上也略微高点。\n—————————————————————\u003c/p\u003e\n\u003cp\u003erequire() 无论如何都会包含文件,而 include() 可以有选择地包含:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ea.php 一定会被包含,而 b.php 一定不会被包含。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在PHP中include和require到底有什么区别呢?看这里的例子就知道了\u003c/p\u003e\n\u003cp\u003e:include.php3的运行结果是:\n 这是inc1.inc文件中的一个变量的值! …\u003c/p\u003e"
November 13, 2008
require和include经典一例抛析
"\u003cp\u003e 在php中,include和require的作用比较容易混淆。下面我以一个经典例子来深刻说明它们的区别。\n 当我们经常访问一个数据库时,可以把连库语句写成一个文件\ncon_db.php3\u003c/p\u003e\n\u003cp\u003e在实际应用时,我们可以在程序中调用这个文件。\n如require(“con_db.php3”)或include(“con_db.php3)\n这时,两个函数的效果是差不多的。\n但如果这样用\nfilename.php3\u003c/p\u003e\n\u003cp\u003e文件到myfun处将不能继续执行,因为函数里无法得到外面的变量(include也是一样的)。除非把$dbh作为一个变量传给函数。这又增加了调用函数的复杂度。\n我们可以通过把require或include放在函数里面来解决这个问题。\n如果用include,文件的第一个函数调用处将顺利通过,但第二个调用将无法执行,原因是不能在没有关闭数据库时在打开一次,也就是说,con_db.php3执行了两次。将include换成require,一切都正常。\n 也就是说,require类似于一次预扫描,在程序执行时,无论在函数里或是函数外,都将先把require的文件执行,且只执行一次。 …\u003c/p\u003e"
November 13, 2008
PHP的命名空间
"\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e摘要:命名变量,函数和类是挺困难的,除了要考虑到变量的名称要易于理解,还要担心是否这个名称在其它某个地方已经使用过. 在一小段脚本中,第二个问题是基本问题. 当你考虑重用你的代码, 在这之后的项目代码必须避免使用你用过的命名. 通常来说,可重用的代码总是包含在函数或类中, 需要处理许多可能发生的命名冲突. 但函数和类之间也可能发生命名冲突. 你可以尝试避免出现这种情况,通过在所有类前添加前缀的方法,或者你可以使用namespace语句.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e标签: \u003ca href=\"http://www.51cto.com/php/search.php?keyword=PHP%C3%FC%C3%FB%BF%D5%BC%E4\"\u003ePHP命名空间\u003c/a\u003e \u003ca href=\"http://www.51cto.com/php/search.php?keyword=PHP\"\u003ePHP\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e命名变量,函数和类是挺困难的,除了要考虑到变量的名称要易于理解,还要担心是否这个名称在其它某个地方已经使用过. 在一小段脚本中,第二个问题是基本问题. 当你考虑重用你的代码, 在这之后的项目代码必须避免使用你用过的命名. 通常来说,可重用的代码总是包含在函数或类中, 需要处理许多可能发生的命名冲突. 但函数和类之间也可能发生命名冲突. 你可以尝试避免出现这种情况,通过在所有类前添加前缀的方法,或者你可以使用namespace语句.\u003c/p\u003e\n\u003cp\u003eNamespace关键字给一块代码命名. 在这个代码块外部,脚本必须用操作 …\u003c/p\u003e"
November 13, 2008
把表记录生成数组
"\u003cp\u003e以下是来自phpcms2008程序global.func.php文件部分函数,仅供参考:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003efunction cache_read($file, $path = ”, $iscachevar = 0)\n{\n if(!$path) $path = CACHE_PATH;\n $cachefile = $path.$file;\n if($iscachevar)\n {\n global $TEMP;\n $key = ‘cache_’.substr($file, 0, -4);\n return isset($TEMP[$key]) ? $TEMP[$key] : $TEMP[$key] = @include $cachefile;\n }\n return @include $cachefile;\n}\n\nfunction cache_write($file, $array, $path = ”)\n{\n if(!is_array($array)) return false;\n $array = “”;\n $cachefile = ($path ? $path : CACHE_PATH).$file; …\u003c/code\u003e\u003c/pre\u003e"
November 12, 2008
PHP命名空间的分隔符是“\”
"\u003cp\u003ePHP最终开始支持namespace(命名空间)。 \u003cem\u003e但是经过开发者\u003ca href=\"http://wiki.php.net/_media/rfc/php.ns.txt?id=rfc%3Anamespaceseparator\u0026amp;cache=cache\"\u003e几个小时的讨论后\u003c/a\u003e,他们决定\u003ca href=\"http://news.php.net/php.internals/41374\"\u003e采用 “\\”\u003c/a\u003e 作为分隔符,而不是更流行的“ :: ”。\u003ca href=\"http://loveandtheft.org/2008/10/26/set-sail-for-fail-php-namespaces/\"\u003eFredrik Holmström\u003c/a\u003e指出了这种分隔方法可能会产生的问题,如打字出错(但不会出现错误提示),IDE兼容性问题,字符数字等等,\u003ca href=\"http://wiki.php.net/rfc/namespaceseparator\"\u003e好处\u003c/a\u003e则是容易输入和分析。”\u003c/em\u003e\u003c/p\u003e"
November 11, 2008
用PHP调用Oracle存储过程
"\u003cp\u003e PHP程序访问数据库,完全可以使用存储过程,有人认为使用存储过程便于维护,不过仁者见仁,智者见智,在这个问题上,偶认为使用存储过程意味着必须要DBA和开发人员更紧密配合,如果其中一方更变,则显然难以维护。\u003c/p\u003e\n\u003cp\u003e 但是使用存储过程至少有两个最明显的优点:速度和效率。使用存储过程的速度显然更快。\n 在效率上,如果应用一次需要做一系列SQL操作,则需要往返于PHP与ORACLE,不如把该应用直接放到数据库方以减少往返次数,增加效率。\n但是在INTERNET应用上,速度是极度重要的,所以很有必要使用存储过程。\n偶也是使用PHP调用存储过程不久,做了下面这个列子。\u003c/p\u003e\n\u003cp\u003e代码:-\u003c/p\u003e\n\u003cp\u003e//建立一个TEST表\nCREATE TABLE TEST (\n ID NUMBER(16) NOT NULL,\n NAME VARCHAR2(30) NOT NULL,\n PRIMARY KEY (ID)\n);\u003c/p\u003e\n\u003cp\u003e//插入一条数据\nINSERT INTO TEST VALUES (5, ‘PHP_BOOK’);\u003c/p\u003e\n\u003cp\u003e//建立一个存储过程\nCREATE OR …\u003c/p\u003e"
October 29, 2008
7.6. 分发器 第 7 章 Zend_Controller
"\u003ch2 id=\"76分发器\"\u003e7.6. 分发器\u003c/h2\u003e\n\u003ch3 id=\"761概述\"\u003e7.6.1. 概述\u003c/h3\u003e\n\u003cp\u003e分发是取得请求对象,提取其中的模块名,控制器名,动作名以及可选参数,然后实例化控制器并调用其中的动作的整过过程。如果其中的模块、控制器或者动作没能找到,将使用它们的默认值。 \u003ccode\u003eZend_Controller_Dispatcher_Standard\u003c/code\u003e 指定每个控制器和动作的默认值为 \u003ccode\u003eindex\u003c/code\u003e,模块的默认值为 \u003ccode\u003edefault\u003c/code\u003e,允许开发人通过 \u003ccode\u003esetDefaultController()\u003c/code\u003e、 \u003ccode\u003esetDefaultAction()\u003c/code\u003e 和 \u003ccode\u003esetDefaultModule()\u003c/code\u003e 改变默认值设定。\u003c/p\u003e\n\u003cp\u003e缺省模块\u003c/p\u003e\n\u003cp\u003e当创建模块程序,你可能也需要缺省模块的命名空间(缺省配置中,缺省模块_没有_命名空间)。从 1.5.0 开始,可以在前端控制器或你的派遣器里通过指定 \u003ccode\u003eprefixDefaultModule\u003c/code\u003e 为 true 来实现。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026lt;?php\n// In your front controller:\n$front-\u0026gt;setParam(\u0026#39;prefixDefaultModule\u0026#39;, true);\n\n// In your dispatcher: …\u003c/code\u003e\u003c/pre\u003e"
October 29, 2008
7.11. 使用传统的模块目录结构 第 7 章 Zend_Controller
"\u003ch2 id=\"711使用传统的模块目录结构\"\u003e7.11. 使用传统的模块目录结构\u003c/h2\u003e\n\u003ch3 id=\"7111简介\"\u003e7.11.1. 简介\u003c/h3\u003e\n\u003cp\u003e传统的模块目录结构允许你把不同的MVC应用程序分离成为独立的单元,并和不同的前端控制器配合再使用。示例一下这样的目录结构:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003edocroot/\n index.php\napplication/\n default/\n controllers/\n IndexController.php\n FooController.php\n models/\n views/\n scripts/\n index/\n foo/\n helpers/\n filters/\n blog/\n controllers/\n IndexController.php\n models/\n views/\n scripts/\n index/ …\u003c/code\u003e\u003c/pre\u003e"
October 26, 2008
php构造函数和析构函数
"\u003cp\u003e构造函数\nvoid __construct ([ mixed $args [, $… ]] )\nPHP 5 允行开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。\u003c/p\u003e\n\u003cp\u003eNote: 如果子类中定义了构造函数则不会暗中调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()。\u003c/p\u003e\n\u003cp\u003eExample#1 使用新标准的构造函数\u003c/p\u003e\n\u003cp\u003eclass BaseClass {\u003c/p\u003e\n\u003cp\u003efunction __construct() {\nprint “In BaseClass constructor\\n”;\n}\n}\u003c/p\u003e\n\u003cp\u003eclass SubClass extends BaseClass {\nfunction __construct() {\nparent::__construct();\nprint “In SubClass constructor\\n”;\n}\n}\u003c/p\u003e\n\u003cp\u003e$obj = new BaseClass();\n$obj = new SubClass();\n?\u0026gt;\n为了实现向后兼容性, …\u003c/p\u003e"
October 26, 2008
php范围解析操作符(::)
"\u003cp\u003e范围解析操作符(::)\n范围解析操作符(也可称作 Paamayim Nekudotayim)或者更简单地说是一对冒号,可以用于访问静态成员、方法和常量,还可以用于覆盖类中的成员和方法。\u003c/p\u003e\n\u003cp\u003e当在类的外部访问这些静态成员、方法和常量时,必须使用类的名字。\u003c/p\u003e\n\u003cp\u003e把 Paamayim Nekudotayim 选作该操作符的名字似乎有些奇怪。然而,这是 Zend 开发小组在写 Zend Engine 0.5 (被用于 PHP 3 中)时所作出的决定。事实上这个词在希伯莱文就是双冒号的意思。\u003c/p\u003e\n\u003cp\u003eExample#1 在类的外部使用 :: 操作符\u003c/p\u003e\n\u003cp\u003eself 和 parent 这两个特殊的关键字是用于在类的内部对成员或方法进行访问的。\u003c/p\u003e\n\u003cp\u003eExample#2 :: from inside the class definition\u003c/p\u003e\n\u003cp\u003e当一个子类覆盖其父类中的方法时,PHP 不会再执行父类中已被覆盖的方法,直到子类中调用这些方法为止。这种机制也作用于 构造函数和析构函数、重载 及 魔术 函数。\u003c/p\u003e\n\u003cp\u003eExample#3 调用父类的方法\u003c/p\u003e\n\u003cp\u003emyFunc();\u003c/p\u003e\n\u003cp\u003e?\u0026gt;\u003c/p\u003e\n\u003cp\u003eStatic Keyword …\u003c/p\u003e"
October 26, 2008
php中访问控制
"\u003cp\u003e访问控制\n对属性或方法的访问控制,是通过在前面添加关键字 public、protected 或 private 来实现的。由 public 所定义的类成员可以在任何地方被访问;由 protected 所定义的类成员则可以被其所在类的子类和父类访问(当然,该成员所在的类也可以访问);而由 private 定义的类成员则只能被其所在类访问。\u003c/p\u003e\n\u003cp\u003e对类成员的访问控制\n类成员都必须使用关键字public、protected 或 private 进行定义\u003c/p\u003e\n\u003cp\u003eExample#1 声明类成员\u003c/p\u003e\n\u003cp\u003epublic;\u003c/p\u003e\n\u003cp\u003eecho $this-\u0026gt;protected;\necho $this-\u0026gt;private;\n}\n}\u003c/p\u003e\n\u003cp\u003e$obj = new MyClass();\necho $obj-\u0026gt;public; // 这行能被正常执行\necho $obj-\u0026gt;protected; // 这行会产生一个致命错误\necho $obj-\u0026gt;private; // 这行也会产生一个致命错误\n$obj-\u0026gt;printHello(); // 输出 Public、Protected 和 Private\u003c/p\u003e\n\u003cp\u003e/** …\u003c/p\u003e"
October 22, 2008
PHP V5.2 中的新增功能,第 5 部分: 跟踪文件上传进度
"\u003cp\u003e级别: 中级\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://haohtml.com/wp/wp-admin/#author\"\u003eTracy Peterson\u003c/a\u003e (\u003ca href=\"mailto:tracy@tracypeterson.com?subject=%E8%B7%9F%E8%B8%AA%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E8%BF%9B%E5%BA%A6\u0026amp;cc=dwxed@us.ibm.com\"\u003etracy@tracypeterson.com\u003c/a\u003e), 自由撰稿人, Consultant\u003c/p\u003e\n\u003cp\u003e2007 年 6 月 08 日\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ePHP V5.2 为开发人员添加了 hook 以利用实时跟踪文件上传进度的功能。本文是 “\u003ca href=\"http://www.ibm.com/developerworks/cn/opensource/os-php-v52/\"\u003ePHP V5.2 中的新增功能\u003c/a\u003e” 系列文章(共五部分)的第 5 部分,将向您展示如何监视文件上传并相应地编写代码,以及如何创建 PHP 进度条。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e Web 2.0 是 Internet 上最炙手可热的时髦字眼,投资者纷纷把资金投入到涉及这项技术的投资项目中。数以百万计的 Web 站点和应用程序覆盖的描述性术语有很多。使用 Web 2.0,我们将描述一类 Web 站点,这些站点都提供了了解 Internet 上数以百万计用户心声的途径。与众不同之处在于它们全都为用户提供了交流和分享与共同利益相关的观点和数据的场所,这些站点可以快速生成大量内容。\u003c/p\u003e\n\u003cp\u003e 每个用户都将提供某种内容 —— 评论咖啡店、上班路线等。\u003ca href=\"http://www.youtube.com/\"\u003eYouTube\u003c/a\u003e 在这点上是一个优秀示例,为人们提供一个空间可以上传视频并使其他用户可以观看这些视频并提供反 …\u003c/p\u003e"
October 22, 2008
MVC模式的PHP实现
"\u003cp\u003e作者:Harry Fuecks 翻译:Easy Chen\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMVC模式在网站架构中十分常见。它允许我们建立一个三层结构的应用程式,从代码中分离出有用的层,帮助设计师和开发者协同工作以及提高我们维护和扩展既有程式的能力。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e视图(View)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e“视图”主要指我们送到Web浏览器的最终结果??比如我们的脚本生成的HTML。当说到视图时,很多人想到的是模版,但是把模板方案叫做视图的正确性是值得怀疑的。\u003c/p\u003e\n\u003cp\u003e对视图来说,最重要的事情可能是它应该是“自我意识(self aware)”的,视图被渲染(render)时,视图的元素能意识到自己在更大框架中的角色。\u003c/p\u003e\n\u003cp\u003e以XML为例,可以说XML在被解析时,DOM API有着这样的认知??一个DOM树里的节点知道它在哪里和它包含了什么。 (当一个XML文档中的节点用SAX解析时只有当解析到该节点时它才有意义。)\u003c/p\u003e\n\u003cp\u003e绝大多数模板方案使用简单的过程语言和这样的模板标签:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026lt;p\u0026gt;{some_text}\u0026lt;/p\u0026gt;\n\u0026lt;p\u0026gt;{some_more_text}\u0026lt;/p\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e它们在文档中没有意义,它们代表的意义只是PHP将用其他的东西来替换 …\u003c/p\u003e"
October 15, 2008
PHP 危险函数解释
"\u003cp\u003e*** 在编译 PHP 时,如无特殊需要,一定禁止编译生成 CLI 命令行模式的 PHP 解析支持。\n可在编译时使用 –disable-cli。一旦编译生成 CLI 模式的 PHP,则可能会被入侵者\n利用该程序建立一个 WEBShell 后门进程或通过 PHP 执行任意代码!\u003c/p\u003e\n\u003cp\u003ephpinfo()\n功能描述:输出 PHP 环境信息以及相关的模块、WEB 环境等信息。\n危险等级:中\u003c/p\u003e\n\u003cp\u003epassthru()\n功能描述:允许执行一个外部程序并回显输出,类似于 exec()。\n危险等级:高\u003c/p\u003e\n\u003cp\u003eexec()\n功能描述:允许执行一个外部程序(如 UNIX Shell 或 CMD 命令等)。\n危险等级:高\u003c/p\u003e\n\u003cp\u003esystem()\n功能描述:允许执行一个外部程序并回显输出,类似于 passthru()。\n危险等级:高\u003c/p\u003e\n\u003cp\u003echroot()\n功能描述:可改变当前 PHP 进程的工作根目录,仅当系统支持 CLI 模式\nPHP 时才能工作,且该函数不适用于 Windows” onclick=”tagshow(event)” class=”t_tag”\u0026gt;Windows 系统。\n危险等级:高\u003c/p\u003e\n\u003cp\u003escandir()\n功能描 …\u003c/p\u003e"
May 1, 2008
ADODB详解
"\u003cp\u003eADODB参考手册:\u003c/p\u003e\n\u003cp\u003ePHP在数据库的支持上是很令人称道的,几乎所有的知名数据库系统都有对应的函数库支持,而且支持得很完整。但遗憾的是,每一群数据库支持函数无论在名称或参数结构上,都有很大的差异,这使得PHP的系统开发者在面临更换数据库时,总会觉得痛苦万分。\u003c/p\u003e\n\u003cp\u003e难道这个问题就没有解决方法吗?当然有,答案就是将要介绍的ADODB这个PHP类库。\u003c/p\u003e\n\u003cp\u003eADODB提供了完整的方法和属性,可以用来控制数据库系统,更棒的是你只要记得它的功能即可,因为不同的数据库系统,只要修改一个属性值,ADODB就会自动依据设定取用正确的PHP函数。\u003c/p\u003e\n\u003cp\u003e此外,再配合数据库系统修改SQL命令,这样PHP系统就可以在最短的时间内更换到另一个数据库系统;如果在编写程序时,对SQL命令能做妥善规划,那就更快了。\u003c/p\u003e\n\u003cp\u003e经过以上的介绍,相信你已经对ADODB的功用有所了解了,以下为ADODB的详细介绍。\u003c/p\u003e\n\u003cp\u003e下载ADODB:可以在http://adodb.sourceforge.net/ 取得最新版的ADODB(见图17-2)。\u003c/p\u003e\n\u003cp\u003e图17-2\u003c/p\u003e\n\u003cp\u003eADODB的最新版本是adodb495a版,根据需要,可以下载完整版本的ADODB。如果您主要使 …\u003c/p\u003e"
April 12, 2008
说说大型高并发高负载网站的系统架构
"\u003cp\u003e 原文链接:(俊麟 Michael’s blog ) \u003ca href=\"http://www.toplee.com/blog/71.html\"\u003ehttp://www.toplee.com/blog/71.html\u003c/a\u003e\n 注:原文链接后的相关评论也很精彩,建议也参考一下原文链接后的评论。\u003c/p\u003e\n\u003cp\u003e 我在CERNET做过拨号接入平台的搭建,而后在Yahoo\u0026amp;3721从事过搜索引擎前端开发,又在MOP处理过大型社区猫扑大杂烩的架构升级等工作,同时自己接触和开发过不少大中型网站的模块,因此在大型网站应对高负载和并发的解决方案上有一些积累和经验,可以和大家一起探讨一下。\u003c/p\u003e\n\u003cp\u003e 一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构、性能的要求都很简单,随着互联网业务的不断丰富,网站相关的技术经过这些年的发展,已经细分到很细的方方面面,尤其对于大型网站来说,所采用的技术更是涉及面非常广,从硬件到软件、编程语言、数据库、WebServer、防火墙等各个领域都有了很高的要求,已经不是原来简单的html静态网站所能比拟的。\u003c/p\u003e\n\u003cp\u003e 大型网站,比如门户网站。在面对大量用户访问、高并发请求方面,基本的解决方案集 …\u003c/p\u003e"
March 10, 2008
清除缓存,php,html,jsp,asp中防止模式窗口页面不更新的情况
"\u003cp\u003e清除缓存,php,html,jsp,asp中防止页面不更新的情况\nCode:\u003c/p\u003e\n\u003cp\u003eHTML\u003c/p\u003e\n\u003cp\u003eASP\u003c/p\u003e\n\u003cp\u003e\u0026lt;%\u003c/p\u003e\n\u003cp\u003eResponse.Expires = -1\u003c/p\u003e\n\u003cp\u003eResponse.ExpiresAbsolute = Now() – 1\u003c/p\u003e\n\u003cp\u003eResponse.cachecontrol = “no-cache”\u003c/p\u003e\n\u003cp\u003e%\u0026gt;\u003c/p\u003e\n\u003cp\u003ePHP\u003c/p\u003e\n\u003cp\u003eheader(“Expires: Mon, 26 Jul 1997 05:00:00 GMT”);\u003c/p\u003e\n\u003cp\u003eheader(“Cache-Control: no-cache, must-revalidate”);\u003c/p\u003e\n\u003cp\u003eheader(“Pragma: no-cache”);\u003c/p\u003e\n\u003cp\u003eJSP\u003c/p\u003e\n\u003cp\u003eresponse.setHeader(“Pragma”,”No-Cache”);\u003c/p\u003e\n\u003cp\u003eresponse.setHeader(“Cache-Control”,”No-Cache”);\u003c/p\u003e\n\u003cp\u003eresponse.setDateHeader(“Expires”, 0);\u003c/p\u003e"
January 13, 2008
Adodb的十个实例
"\u003cp\u003e本想学pear的,可是网上看到的几篇帖子对adodb的评价相当高,所以改学了这个。\u003c/p\u003e\n\u003cp\u003eADODB的优点有这几个(网上说的,不是我说的):\u003c/p\u003e\n\u003cp\u003e1、速度比pear快一倍;\u003c/p\u003e\n\u003cp\u003e2、支持的数据库类型比pear多很多,甚至可以支持ACCESS;\u003c/p\u003e\n\u003cp\u003e3、无须安装,无须服务器支持(对新手来说,这点很重要吧)\u003c/p\u003e\n\u003cp\u003eTutorial\u003c/p\u003e\n\u003cp\u003eExample 1: Select Statement\u003c/p\u003e\n\u003cp\u003e任务: 连接一个名为Northwind的Access数据库, 显示 每条记录 的前两个字段.\u003c/p\u003e\n\u003cp\u003e在这个实例里, 我们新建了一个ADOC连接(ADOConnection)对象, 并用它来连接一个数据库. 这个连接采用PConnect 方法, 这是一个持久 连接. 当我们要查询数据 库时, 我们可以随时调 用这个连接的Execute()函数. 它会返回一个ADORecordSet对象 which is actually a cursor that holds the current row in the array fields[]. 我们使用MoveNext()从一个记录转向下一个记录 .\u003c/p\u003e\n\u003cp\u003eNB: …\u003c/p\u003e"
November 21, 2007
PHP5中的时间相差八小时的解决办法
"\u003cp\u003e\u003cstrong\u003e法一:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ePHP5系列版本新增了时区设置,默认为格林威治时间,与中国所在的东8区正好相差8个小时\u003c/p\u003e\n\u003cp\u003e找到php.ini中的“;date.timezone =”这行,将“;”去掉,改成“date.timezone = PRC”(PRC:People’s Republic of China 中华人民共和国),重启Apache,问题解决。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e法二:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e安装好php5后,在论坛不经意间,在论坛上看到有人说php5.1.2的时间显示整整少8个小时,\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026lt;?php\necho date(\u0026#34;Y-m-d H:i:s\u0026#34;);\n?\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e结果自己测试果然是相差8小时。\u003c/p\u003e\n\u003cp\u003e后来经过在论坛上找资料,结果终于解决,在php5以及起以上的版本,要输出本地的时间(限中国),可以这么写\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026lt;?php\ndate_default_timezone_set(\u0026#39;Asia/Shanghai\u0026#39;);\necho date(\u0026#39;Y-m-d H:i:s\u0026#39;);\n?\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这样时间相差八小时的问题就解决了!!~~~\u003c/p\u003e"
November 20, 2007
Smarty中in_array函数的应用
"\u003cp\u003ephp脚本:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$Action= array(“article”,”soft”,”news”);\n$smarty = new Smarty();\n$smarty-\u0026gt;assign(“Action”,$Action);\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e模板:\u003c/p\u003e\n\u003cp\u003e在数组内非数组内的值\u003c/p\u003e"
October 19, 2007
用PHP的ob_start();控制您的浏览器cache
"\u003cp\u003e Output Control 函数可以让你自由控制脚本中数据的输出。它非常地有用,特别是对于:当你想在数据已经输出后,再输出文件头的情况。输出控制函数不对使用 header() 或 setcookie(), 发送的文件头信息产生影响,只对那些类似于 echo() 和 \u003ca href=\"/?tag=php\"\u003ePHP\u003c/a\u003e 代码的数据块有作用。\u003c/p\u003e\n\u003cp\u003e我们先举一个简单的例子,让大家对Output Control有一个大致的印象:\nExample 1.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eob_start(); //打开缓冲区\necho “Hellon”; //输出\nheader(“location:index.php”); //把浏览器重定向到index.php\nob_end_flush();//输出全部内容到浏览器\n?\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e所有对header()函数有了解的人都知道,这个函数会发送一段文件头给浏览器,但是如果在使用这个函数之前已经有了任何输出(包括空输出,比如空格,回车和换行)就会提示出错。如果我们去掉第一行的ob_start(),再执行此程序,我们会发现得到了一条错误提示:”Header had all ready send by”!但是加 …\u003c/p\u003e"
October 13, 2007
PHP让页面马上过期
"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eheader(\u0026#34;Expires: \u0026#34;.gmdate(\u0026#34;D, d M Y H:i:s\u0026#34;,time()-1).\u0026#34; GMT\u0026#34;);\nheader(\u0026#34;Last-Modified: \u0026#34;.gmdate(\u0026#34;D, d M Y H:i:s\u0026#34;).\u0026#34; GMT\u0026#34;);\nheader(\u0026#34;Cache-Control: no-cache, must-revalidate\u0026#34;);\nheader(\u0026#34;Pragma: no-cache\u0026#34;);\n\u003c/code\u003e\u003c/pre\u003e"
October 12, 2007
利用ajax实现同步通信
"\u003cp\u003e1。创建ajax 对象, 可以用以下通用代码, 此代码适合各种浏览器\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003efunction newXMLHttpRequest()\n{\n var xmlreq = false;\n if (window.XMLHttpRequest)\n {\n xmlreq = new XMLHttpRequest();\n }\nelse\n { if (window.ActiveXObject)\n { try\n { xmlreq = new ActiveXObject(\u0026#34;Msxml2.XMLHTTP\u0026#34;);\n }\n catch (e1)\n {\n try\n {\n xmlreq = new ActiveXObject(\u0026#34;Microsoft.XMLHTTP\u0026#34;);\n }\n catch (e2)\n { }\n }\n }\n }\n return xmlreq;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e2。发送数据,ajax有2种方处理数据,同步和异步\u003c/p\u003e\n\u003cp\u003e同步:\u003c/p\u003e\n\u003cp\u003efunction get_xmlhttp()\u003c/p\u003e\n\u003cp\u003e{ var …\u003c/p\u003e"
September 25, 2007
ADODB中GetOne($sql)与GetRow($sql)的区别
"\u003cp\u003e**GetOne($sql)**Executes the SQL and returns the first field of the first row as an array. The recordset and remaining rows are discarded for you automatically. If an error occur, false is returned. 执行SQL指令,并且以阵列的方式回传第一笔记录的第一个栏位。资料集及其余的记录将会被自动清除,如果发生错误,就回传 false 值。译者注:这个功能在验证某笔记录在不在特别有用,可以减少系统记忆体及资源的用量。\u003c/p\u003e\n\u003cp\u003e**GetRow($sql)**执行SQL指令,并且以阵列的方式回传第一笔记录。资料集及其馀的记录将会被自动清除,如果发生错误,就回传 false 值。其中GetOne($sql)为了检测某一条记录是否存在时,特别有用,(如,用户在注册前,可以检测用户名是否已经被占用,比较适合GetOne($ql)).如果此时需要除检测该记录是否存在,并保存该记录的信息,就要用 …\u003c/p\u003e"
September 18, 2007
php上传大文件注意事项
"\u003cp\u003e 最近用php传大文件的时候,总是传不上,起始只是看了一下php.ini里的max_post_size的值,默认是8M,一直没有搞清楚到底是怎么回事,后来在一篇文章上看到还有一个upload_max_filesize 参数,这时才明白怎么回事,结果把默认的2M改成8M,重新上传,结果ok,上传成功了!\u003c/p\u003e\n\u003cp\u003e 以下是常见的一些上传附件时的一些问题,大家可以参考一下:\u003c/p\u003e\n\u003cp\u003e用php上传文件,问题最多的就是上传大体积文件时出现错误。\n这就涉及到php的配置文件:php.ini\u003c/p\u003e\n\u003cp\u003e在此配置文件中,有这么几个值是跟文件上传有密切关系的:\nfile_uploads = on //是否允许系统支持文件上传\n;upload_tmp_dir //临时文件的存储路径,linux下为系统默认路径,win32下需要指定\nupload_max_filesize = 2m //允许文件上传最大体积\u003c/p\u003e\n\u003cp\u003epost_max_size = 2m //通过post方法给php时,php所能接受的最大数据容量\u003c/p\u003e\n\u003cp\u003e如果你上传的文件体积在8m一下(通常情况),那修改以上设置就可以满足你的要求了。。\u003c/p\u003e\n\u003cp\u003e但要 \u0026gt;8m,那除了上面几 …\u003c/p\u003e"
September 17, 2007
Smarty中类的继承
"\u003cp\u003e\u003cstrong\u003eExtended Setup\u003c/strong\u003e\nThis is a continuation of the basic installation, please read that first!\nA slightly more flexible way to setup Smarty is to extend the class and initialize your Smarty environment. So instead of re-\npeatedly setting directory paths, assigning the same vars, etc., we can do that in one place. Lets create a new directory /\nphp/includes/guestbook/ and make a new file called setup.php. In our example environment, /php/includes is in\nour include_path. Be sure you set this up too, or …\u003c/p\u003e"
September 15, 2007
PHP fsockopen 简单抓取网页内容
"\u003cp\u003e 这几天在做采集的东东,\u003ca href=\"/?tag=php\"\u003ephp\u003c/a\u003e提供了很多访问远程计算机内容的方法,文件系统的函数些都支持读取远程文件,而fsockopen是争对于socket接口的编程函数,在网上搜了一下发现用这个函数来读取http内容也比较多,但是没有一个比较完善和适合我的,在某个小偷程序上改改,轻而易举的完善fsockopen请求http协议内容,从而获取请求内容.代码如下:\u003c/p\u003e\n\u003cp\u003efunction get_page_content($url){\u003c/p\u003e\n\u003cp\u003e$url = eregi_replace(‘^http://’, ”, $url);\u003c/p\u003e\n\u003cp\u003e$temp = explode(‘/’, $url);\u003c/p\u003e\n\u003cp\u003e$host = array_shift($temp);\u003c/p\u003e\n\u003cp\u003e$path = ‘/’.implode(‘/’, $temp);\u003c/p\u003e\n\u003cp\u003e$temp = explode(‘:’, $host);\u003c/p\u003e\n\u003cp\u003e$host = $temp[0];\u003c/p\u003e\n\u003cp\u003e$port = isset($temp\u003ca href=\"/?tag=php\"\u003e1\u003c/a\u003e) ? $temp\u003ca href=\"/?tag=php\"\u003e1\u003c/a\u003e : 80;\u003c/p\u003e\n\u003cp\u003e$fp = @fsockopen($host, $port, \u0026amp;$errno, \u0026amp;$errstr, 30);\u003c/p\u003e\n\u003cp\u003eif …\u003c/p\u003e"
September 15, 2007
用PHP写mail时的注意事项
"\u003cp\u003e今天看书,看到mail函数,就自己练着写了个简单的程序。\u003c/p\u003e\n\u003cp\u003e要注意的一点是,mail函数的使用,需要在php.ini里边配置。\n[mail function]\n; For Win32 only.\nSMTP = localhost\nsmtp_port = 25\u003c/p\u003e\n\u003cp\u003e; For Win32 only.\n;sendmail_from = \u003ca href=\"mailto:me@example.com\"\u003eme@example.com\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e配置后\n[mail function]\n; For Win32 only.\nSMTP = smtp.tom.com //指定你的邮箱smtp\nsmtp_port = 25\u003c/p\u003e\n\u003cp\u003e; For Win32 only.\nsendmail_from = \u003ca href=\"mailto:boy805@tom.com\"\u003eboy805@tom.com\u003c/a\u003e //你所使用的邮箱\u003c/p\u003e\n\u003cp\u003e配置好后要记得重启apache啊!\u003c/p\u003e\n\u003cp\u003e不过真是怪了,在单位写的就发送成功了,在家写一样一样的就没成功,大家来看看~~\u003c/p\u003e"
August 18, 2007
adodb教程:产生 Update 及 Insert 的SQL指令
"\u003cp\u003e\u003ca href=\"/?tag=adodb\"\u003eADODB\u003c/a\u003e 1.31版起,新增了两个资料集函数:GetUpdateSQL()及GetInsertSQL()。这允许你在执行了像”Select * FROM table query Where…”这样的查询函数後,建立一个 $rs-\u0026gt;fields复本,改变这些栏位,然後自动产生出更新或是新增的SQL指令。以下我们展示如何运用这些函数,我们将存取一个资料表,带有下列栏位:(ID,FirstName,LastName,Created)。在这些函数被执行前,你需要藉由一个对资料表的查询指令(select)来初始化一个资料集。 #==============================================\u003c/p\u003e\n\u003cp\u003e# GetUpdateSQL() 及 GetInsertSQL() 范例码\u003c/p\u003e\n\u003cp\u003e#==============================================\u003c/p\u003e\n\u003cp\u003einclude(‘ADOdb.inc.php’);\u003c/p\u003e\n\u003cp\u003einclude(‘tohtml.inc.php’);#==========================\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e# …\u003c/strong\u003e\u003c/p\u003e"
August 6, 2007
adodb和smarty分页类
"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eclass show_Pager\n\n{\n\nprotected$_total; //记录总数\n\nprotected$pagesize; //每一页显示的记录数\n\npublic$pages; //总页数\n\nprotected$_cur_page; //当前页码\n\nprotected$offset; //记录偏移量\n\nprotected$pager_Links; //url连接\n\nprotected$pernum = 5; //页码偏移量,这里可随意更改\n\npublicfunction __construct($total,$pagesize,$_cur_page)\n\n{\n\n$this-\u0026gt;_total=$total;\n\n$this-\u0026gt;pagesize=$pagesize; …\u003c/code\u003e\u003c/pre\u003e"
August 6, 2007
smarty中$cache_lifetime属性的使用
"\u003cp\u003eSetting$cache_lifetimepercache\u003c/p\u003e\n\u003cp\u003erequire(‘Smarty.class.php’);\u003c/p\u003e\n\u003cp\u003e$smarty=newSmarty;\u003c/p\u003e\n\u003cp\u003e$smarty-\u0026gt;caching=2;//lifetimeispercache\u003c/p\u003e\n\u003cp\u003e//setthecache_lifetimeforindex.tplto5minutes\u003c/p\u003e\n\u003cp\u003e$smarty-\u0026gt;cache_lifetime=300;\u003c/p\u003e\n\u003cp\u003e$smarty-\u0026gt;display(‘index.tpl’);\u003c/p\u003e\n\u003cp\u003e//setthecache_lifetimeforhome.tplto1hour\u003c/p\u003e\n\u003cp\u003e$smarty-\u0026gt;cache_lifetime=3600;\u003c/p\u003e\n\u003cp\u003e$smarty-\u0026gt;display(‘home.tpl’);\u003c/p\u003e\n\u003cp\u003e//NOTE:thefollowing$cache_lifetimesettingwillnotworkwhen$caching=2.\u003c/p\u003e\n\u003cp\u003e//Thecachelifetimeforhome.tplhasalreadybeenset …\u003c/p\u003e"
August 4, 2007
ADODB中几个有用的函数
"\u003cp\u003e**GetOne($sql,$inputarr=false)**Executes the SQL and returns the first field of the first row. The recordset and remaining rows are discarded for you automatically. If an error occur, false is returned.**GetRow($sql,$inputarr=false)**Executes the SQL and returns the first row as an array. The recordset and remaining rows are discarded for you automatically. If an error occurs, false is returned.\u003cstrong\u003eGetAll($sql,$inputarr=false)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eExecutes the SQL and returns the all the rows as a 2-dimensional array. …\u003c/p\u003e"
July 22, 2007
Smarty实例 – 使用ADODB连接数据库
"\u003cp\u003e今天就先来说说ADODB.说到ADODB,可能做过ASP的都知道WINDOWS平台的ADO组件,但我们这里的ADODB不是微软的那个数据库操作组件,而是由php语言写的一套数据库操作类库,先让我们来看看它倒底有什么样的优点.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e以标准的SQL语句书写的数据库执行代码在进行数据库移植时不用更改源程序,也就是说它可以支持多种数据库,包括ACCESS.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e提供与微软ADODB相似的语法功能.这一点对于从ASP转行到PHP的人们是一大福音,它的很多操作都与WINDOWS中的ADODB相似.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e可以生成\u003ca href=\"http://smarty.php.net\"\u003eSmarty\u003c/a\u003e循环需要的二维数组,这样会简化smarty开发.这一点是等会我给大家演示.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e支持数据库的缓存查询,最大可能的提高查询数据库的速度。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e其它的实用功能.\n虽然说优点很多,但是由于这个类库非常的庞大,光它的主执行类就107K,所以如果大家考虑执行效率的话就要认真想想了.不过说实话,它的功能还是很强大的,有很多的很实用的功能,使用它的这些功能,可以非常方便的实现我们想要的功能.所以对于那些老板没有特殊要求时大家不防用用它.\n**一、如何得到ADODB? 它的运行环境是什么?\n** …\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e"
July 18, 2007
在PHP中如何远程链接Mysql数据库?
"\u003cp\u003eMySQL是可以远程调用的,但用户要有远程调用的权限。\u003c/p\u003e\n\u003cp\u003e在增加用户的时候有一个host 选项,是任何主机 或 locahost,你选用 any host,这样,你就可以远程调用了。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-mysql\" data-lang=\"mysql\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003emysql_pconnect\u003c/span\u003e(\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e“\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e192\u003c/span\u003e.\u003cspan style=\"color:#ae81ff\"\u003e168\u003c/span\u003e.\u003cspan style=\"color:#ae81ff\"\u003e0\u003c/span\u003e.\u003cspan style=\"color:#ae81ff\"\u003e2\u003c/span\u003e:\u003cspan style=\"color:#ae81ff\"\u003e3306\u003c/span\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e″\u003c/span\u003e,\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e”\u003c/span\u003eroot\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e”\u003c/span\u003e,\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e”\u003c/span\u003epassword\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e”\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
Category: Web3
June 10, 2025
理解 Solana 中的 Slot、Block、Epoch、Entry、Shred 和 PoH
"\u003cp\u003e对于刚刚接触Solana的开发者来讲,会经常遇到 Slot Block Epochs Entry 和 Shred等一些概念术语,但很验证记住它们的意思和作用。\u003c/p\u003e\n\u003cp\u003e本篇将通过 Solana 的交易原理,让大家轻记信它们并了解它们之间的联系,并加深对Solana交易的理解。由于能力有限,文章中难免有误,大家可以在评论区留言,共同学习进步!\u003c/p\u003e\n\u003cp\u003e好了,下面让我们开始彻底搞明白这些术语及它们在Solana交易中的作用吧!\u003c/p\u003e\n\u003cp\u003e在开始之前我们先看一下在Soalna链中一笔交易是如何进行的。\u003c/p\u003e\n\u003ch2 id=\"交易流程\"\u003e交易流程\u003c/h2\u003e\n\u003cp\u003e\u003cimg src=\"https://www.helius.dev/_next/image?url=%2Fapi%2Fmedia%2Ffile%2Fturbine-in-solana-transaction-lifecycle.webp\u0026amp;w=3840\u0026amp;q=90\" alt=\"Visualization of where Turbine lies in the lifecycle of a Solana transaction\"\u003e\u003c/p\u003e\n\u003ch3 id=\"交易流程-1\"\u003e\u003cstrong\u003e交易流程\u003c/strong\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e用户客户端发起一笔交易,并使用钱包私钥进行签名\u003c/li\u003e\n\u003cli\u003e通过rpc协议将交易发送到用户指定的 Solana RPC 节点。这里RPC节点在区块链网络中存在多个,起到了负载均衡的作用\u003c/li\u003e\n\u003cli\u003eRPC节点验证交易合法性,如进行一系列的检查 ,一般指签名验证/账户检查(账户是否存在,读取权限合法)/账户余额是否足够支付手续费等,最后进行交易模拟执行,就是我们经常说的模拟交易阶段(这一步可以手动配置 \u003ccode\u003e--skip-preflight\u003c/code\u003e 或 \u003ccode\u003ekipPreflight: true\u003c/code\u003e 跳过)。如果这一步失败,则整个交易直接失败, …\u003c/li\u003e\u003c/ol\u003e"
April 22, 2025
深入理解 Serde、Bincode 与 Borsh 的关系与区别
"\u003cp\u003e在Rust开发中,无论是构建网络服务、存储数据还是开发区块链程序,**序列化(Serialization)和反序列化(Deserialization)**都是不可或缺的操作。序列化是将内存中的数据结构(struct)转换成字节序列或者其他格式(JSON, vec\u003cu8\u003e),以便存储或传输;反序列化则是将字节序列还原成原来的数据结构。\u003c/p\u003e\n\u003cp\u003eRust 生态中常用的序列化工具包括 \u003cstrong\u003eSerde\u003c/strong\u003e、\u003cstrong\u003eBincode\u003c/strong\u003e 和 \u003cstrong\u003eBorsh\u003c/strong\u003e。初学者在阅读文档或实际开发中可能会发现它们名字都很熟悉,但它们的定位、使用方式和特点却不完全相同。\u003c/p\u003e\n\u003cp\u003e本文将系统梳理三者的关系、差异和使用场景。\u003c/p\u003e\n\u003ch2 id=\"serde\"\u003eSerde\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eSerde(Serialization / Deserialization)\u003c/strong\u003e 是 Rust官方生态最流行的序列化框架。它提供了一种 \u003cstrong\u003e抽象接口\u003c/strong\u003e,让你可以将 Rust 类型序列化为多种格式,而不关心底层具体实现。\u003c/p\u003e\n\u003ch3 id=\"特点\"\u003e特点\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e通用性强\u003c/strong\u003e:支持 JSON、YAML、TOML、Bincode 等多种格式。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e灵活\u003c/strong\u003e:可以自定义序列化逻辑。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e宏支持\u003c/strong\u003e:通过 \u003ccode\u003e#[derive(Serialize, Deserialize)]\u003c/code\u003e 自动生成序列化代码。 …\u003c/li\u003e\u003c/ul\u003e"
March 28, 2025
solana中MEV监听交易的几种方法
"\u003ch1 id=\"策略分类\"\u003e策略分类\u003c/h1\u003e\n\u003cp\u003e在 Solana 上 \u003cstrong\u003eMEV(最大可提取价值)\u003c/strong\u003e 的几种策略主要有:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e套利(Arbitrage)\u003c/li\u003e\n\u003cli\u003e清算(Liquidation)\u003c/li\u003e\n\u003cli\u003e抢跑(Front-Running)\u003c/li\u003e\n\u003cli\u003e三明治攻击(Sandwich Attack)\u003c/li\u003e\n\u003cli\u003e后置插队(Back-Running)\u003c/li\u003e\n\u003cli\u003eJito MEV 竞标\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"套利arbitrage\"\u003e套利(Arbitrage)\u003c/h2\u003e\n\u003cp\u003e价格差异猎手 想象你是一个精明的商人,在不同的市场上发现同一件商品价格不同。比如,在A市场一个苹果卖1元,在B市场卖1.2元。你会怎么做?立即在A市场买入,然后在B市场卖出,赚取0.2元的差价。\u003c/p\u003e\n\u003cp\u003e在加密世界中,这就是套利。交易员快速在不同交易所或流动性池之间捕捉加密货币价格差异,瞬间完成买卖,赚取微小但稳定的利润。\u003c/p\u003e\n\u003ch2 id=\"清算liquidation\"\u003e清算(Liquidation)\u003c/h2\u003e\n\u003cp\u003e充当风险管理者角色。想象银行放贷时,借款人需要提供抵押物品,如果抵押物品价值下跌到无法覆盖贷款,银行会立即收回资产。\u003c/p\u003e\n\u003cp\u003e在加密借贷平台,当用户的抵押品价值跌破安全线,MEV机器人(\u003cstrong\u003e清算人Liquidator)\u003c/strong\u003e 通常可以以折扣价买入资产。这是因为在借贷平台(如 \u003cstrong\u003eSolend\u003c/strong\u003e、\u003cstrong\u003eMango Markets\u003c/strong\u003e)中,如果用户的抵押资产价值不足以覆盖 …\u003c/p\u003e"
March 27, 2025
SPL-Token CLI 使用入门教程
"\u003cp\u003e本篇文章将对官方教程的基本上进行整理和完善,同时对一些官方未提到的一些知识点和实践进行一些介绍,方便一些刚入门solana开发的同学能够对solana开发有更完整的了解。\u003c/p\u003e\n\u003cp\u003e本篇文章使用 \u003ccode\u003espl-token\u003c/code\u003e 命令行进行演示操作,分别介绍 Mint Account 和 token Account 的创建、转账、关闭账户并回收租金SOL等操作。\u003c/p\u003e\n\u003cp\u003e这里假如用户本机已经安装好solana命令行,并通过 \u003ccode\u003esolana-test-validator\u003c/code\u003e 命令在本地启动开发集群。\u003c/p\u003e\n\u003ch1 id=\"环境准备\"\u003e环境准备\u003c/h1\u003e\n\u003col\u003e\n\u003cli\u003e打开一个终端,在本地创建一个新集群\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e(\u003c/span\u003ebase\u003cspan style=\"color:#f92672\"\u003e)\u003c/span\u003e ➜ ~ solana-test-validator --ledger test-ledger -r\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLedger location: test-ledger\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLog: test-ledger/validator.log\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e⠠ Initializing... …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
February 25, 2025
Solana中的 Native Programs
"\u003cp\u003e在Solana中有一些少量的内置原生程序,它们的程序ID格式一般为 \u003ccode\u003exxx11111111111111111111111111111111\u003c/code\u003e。它们与第三方自定义程序不同,原生程序是 \u003cstrong\u003evalidator node\u003c/strong\u003e 运行所必须的一部分。同时它们也是集群升级的一部分,这些升级可能包括新功能的添加、BUG修复,又或者是性能的优化提升。这些内置原生程序极少的发生变化,目前提供的所有内置原生程序可以在 \u003ca href=\"https://docs.anza.xyz/runtime/programs\"\u003ehttps://docs.anza.xyz/runtime/programs\u003c/a\u003e 找到。\u003c/p\u003e\n\u003cp\u003e其中有两个非常重要的程序很值得我们关注,因为我们在开发中,需要经常用到他们。\u003c/p\u003e\n\u003ch1 id=\"system-program\"\u003eSystem Program\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e作用:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e创建新帐户\u003c/li\u003e\n\u003cli\u003e分配帐户数据\u003c/li\u003e\n\u003cli\u003e将帐户分配给所属的程序,即指定账户与程序的对应关系\u003c/li\u003e\n\u003cli\u003e转账最小 lamports 给账户(租金),防止账户被系统回收\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eProgram id: \u003ccode\u003e11111111111111111111111111111111\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eInstructions: \u003ca href=\"https://docs.rs/solana-program/2.2.0/solana_program/system_instruction/enum.SystemInstruction.html\"\u003eSystemInstruction\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1 id=\"bpf-loader\"\u003eBPF Loader\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e作用:\n\u003cul\u003e\n\u003cli\u003e部署所有自定义程序, …\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e"
February 15, 2025
Solana中 PDA、ATA 与 普通Account 的区别与关系
"\u003ch1 id=\"普通账户地址\"\u003e普通账户地址\u003c/h1\u003e\n\u003cp\u003e对于账户地址的创建是由一个密钥对来生成的,但在Solana中账户地址与以太坊中的账户地址还是有一些区别的。\u003c/p\u003e\n\u003ch2 id=\"以太坊账户地址\"\u003e以太坊账户地址\u003c/h2\u003e\n\u003cp\u003e以太坊账户地址的生成过程:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e通过私钥生成公钥\u003c/li\u003e\n\u003cli\u003e对公钥进行 Keccak-256 哈希\u003c/li\u003e\n\u003cli\u003e取哈希值的最后 160 位(20 字节)作为地址\u003c/li\u003e\n\u003cli\u003e将地址以 \u003ccode\u003e0x\u003c/code\u003e 开头,并根据需要选择是否使用 EIP-55 格式\u003c/li\u003e\n\u003c/ol\u003e\n\u003cblockquote\u003e\n\u003cp\u003e地址中通常是小写字母,但也有大写字母的变种,称为 \u003cstrong\u003eEIP-55\u003c/strong\u003e 格式。在 EIP-55 中,某些字符会根据哈希值的大小写进行区分,从而增加地址的错误检查能力。\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"solana-账户地址\"\u003eSolana 账户地址\u003c/h2\u003e\n\u003cp\u003eSolana账户地址的生成过程:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e通过私钥生成公钥,一般通过调用 Keypair.generate() 生成\u003c/li\u003e\n\u003cli\u003e公钥直接映射为账户的地址,长度为 32 字节\u003c/li\u003e\n\u003cli\u003e为了使用方便,一般对其进行 Base58 编码,将公钥转换为地址字符串\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e代码:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-typescript\" data-lang=\"typescript\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003econst\u003c/span\u003e { \u003cspan style=\"color:#a6e22e\"\u003eKeypair\u003c/span\u003e } \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003erequire\u003c/span\u003e(\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;@solana/web3.js\u0026#39;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e// 生成一个新的密钥对\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e\u003c/span\u003e\u003cspan style=\"color:#66d9ef\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003ekeypair\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eKeypair\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003egenerate\u003c/span\u003e();\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e// 获取公 …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
January 10, 2025
Solana中如何实现转账
"\u003cp\u003e在 Solana 中转账有两种方式。\u003c/p\u003e\n\u003ch1 id=\"修改结构体字段\"\u003e修改结构体字段\u003c/h1\u003e\n\u003cp\u003e一种是在不调用(\u003ccode\u003einvoking\u003c/code\u003e )系统程序( \u003ccode\u003eSystem Program\u003c/code\u003e )的情况下,将 \u003ccode\u003elamports\u003c/code\u003e 从一个账户转移到另一个账户。它的实现是直接通过修改结构体的 \u003ccode\u003elamports\u003c/code\u003e 字段值来实现的。\u003c/p\u003e\n\u003cp\u003e这种方法可以实现将 lamports 从任何由您的程序\u003cstrong\u003e拥有\u003c/strong\u003e的账户转移到任何账户。\u003ca href=\"https://solana.com/zh/developers/cookbook/programs/transfer-sol\"\u003e文档\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-rust\" data-lang=\"rust\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003e/// Transfers lamports from one account (must be program owned)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003e/// to another account. The recipient can by any account\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003e\u003c/span\u003e\u003cspan style=\"color:#66d9ef\"\u003efn\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003etransfer_service_fee_lamports\u003c/span\u003e(\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e from_account: \u003cspan style=\"color:#66d9ef\"\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003eAccountInfo\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e to_account: \u003cspan style=\"color:#66d9ef\"\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003eAccountInfo\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e amount_of_lamports: \u003cspan style=\"color:#66d9ef\"\u003eu64\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e) -\u0026gt; \u003cspan style=\"color:#a6e22e\"\u003eProgramResult\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#75715e\"\u003e// Does the from account have enough …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
December 22, 2024
Solana中账户类型 Account、AccountInfo与 SystemAccount 的区别
"\u003cp\u003e在Solana中 Account 的角色很重要,它就像Linux中\u003ccode\u003e一切皆文件\u003c/code\u003e的概念一样,无处不在。了解它也是开发Solana的基础,本节主要介绍我们最经常使用的 \u003ccode\u003eAccount\u003c/code\u003e 、\u003ccode\u003eAccountInfo\u003c/code\u003e 和 \u003ccode\u003eSystemAccount\u003c/code\u003e 这三种账户类型的区别与使用场景。\u003c/p\u003e\n\u003cp\u003e当然除此之外还有一些账户类型也很重要,如 \u003ccode\u003eUncheckedAccount\u003c/code\u003e、\u003ccode\u003eSigner\u003c/code\u003e、\u003ccode\u003eTokenAccount\u003c/code\u003e、\u003ccode\u003eMint\u003c/code\u003e、\u003ccode\u003eCpiAccount\u003c/code\u003e、\u003ccode\u003eLoader\u003c/code\u003e、\u003ccode\u003eProgram\u003c/code\u003e、\u003ccode\u003eAssociatedToken\u003c/code\u003e 等,我们这里就不再一一讲解,有兴趣的话可以参考官方相关文档。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e由于多数情况下都是使用anchor框架开发Solana合约,因此本文主要是根据 anchor-lang 文档里介绍账户来讲解\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch1 id=\"账户类型\"\u003e账户类型\u003c/h1\u003e\n\u003cp\u003e以下我们分别对这三种账户类型做一些简单的介绍。\u003c/p\u003e\n\u003ch2 id=\"accountinfo\"\u003eAccountInfo\u003c/h2\u003e\n\u003cp\u003e在 Solana 中 \u003ccode\u003eAccountInfo\u003c/code\u003e 是最基础的账户类型。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com/uploads/2025/accountinfo.svg\" alt=\"AccountInfo\"\u003e\u003c/p\u003e\n\u003cp\u003e其它几种账户类型都是对它的封装,它的\u003ca href=\"https://docs.rs/anchor-lang/0.30.1/anchor_lang/prelude/struct.AccountInfo.html\"\u003e定义\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-rust\" data-lang=\"rust\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#[repr(C)]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003epub\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estruct\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eAccountInfo\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e\u0026#39;a\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#66d9ef\"\u003epub\u003c/span\u003e key: …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
December 6, 2024
什么是Layer2网络
"\u003cp\u003e我们平时提到的比特币、以太坊、Solana,它们都属于Layer 1网络,而Layer 2(L2) 网络是指基于Layer1网络之上构建的一层网络,它很类似于Layer 1 网络,也是一个独立的区块链。但它的主要目的并不是为了代替 Layer 1 ,而是为了通过扩展 Layer 1 层网络从而解决一些在 Layer 1 网络中存在的一些问题,它同时继承了 Layer 1 网络的安全性和去中心化性。\u003c/p\u003e\n\u003ch1 id=\"以太坊存在的问题\"\u003e以太坊存在的问题\u003c/h1\u003e\n\u003cp\u003e这里以以太坊为例,在 L1 网络上随着交易量越来越大,交易频率也越来越频繁,导致Gas(网络交易费)越来越高,一笔交易可能在网络繁忙的时候高达十几美元,导致一些交易可能需要花费好久才可以真正成交到区块网络。\u003c/p\u003e\n\u003cp\u003e这两个问题大大提高了用户使用门槛,那有没有好的解决办法呢?\u003c/p\u003e\n\u003ch1 id=\"解决方案\"\u003e解决方案\u003c/h1\u003e\n\u003cp\u003e区块链的三个核心特性是 \u003ccode\u003e去中心化\u003c/code\u003e、\u003ccode\u003e安全性\u003c/code\u003e和\u003ccode\u003e可扩展性\u003c/code\u003e,一般简单的区块链架构只能实现其中两个特性(这一点很类似于分布式中的CAP理论)。想要一个安全且去中心化的区块链的话,只能牺牲可扩展性,而这也正是第二层网络发挥作用的地方。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e以太坊生态系统坚定认为,第 2 层扩展是解决可扩展性三难问题的唯一途径,同时保 …\u003c/strong\u003e\u003c/p\u003e"
December 4, 2024
Solana中如何解析指令
"\u003cp\u003e开发过Solodity的同学都知道在合约开发中,不同指令对应的不同前端Endpoint(API接口),这种开发模式特别的清晰且易维护。那在开发Solana合约时没有有对应的方法呢?\u003c/p\u003e\n\u003ch1 id=\"solana开发方式\"\u003eSolana开发方式\u003c/h1\u003e\n\u003cp\u003e开发 Solana 合约,一般分 Native 和 Anchor 框架开发。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eNative\u003c/code\u003e 主要是开发者通过SDK 手动实现所有业务逻辑。 这种模式一般对开发者要求比较高,除了需要了解相关概念外,最重要的还需要知道对应的SDK实现,如PDA账户的创建。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eAnchor框架\u003c/code\u003e 推荐使用,只需要一些宏即可以实现一些逻辑,不需要用户关心底层实现。这种开发方式对于指令的处理基本与Solidity中一致,开发者只要搞明白了基本用法就可以了。\u003c/p\u003e\n\u003cp\u003e下面主要讲一下在 Native 这种方式下,如何实现指令或附加数据的解析。\u003c/p\u003e\n\u003cp\u003e如果你对 \u003ccode\u003e指令\u003c/code\u003e这个概念不太理解的话,可以将其视为路由。其类于似在mvc开发中控制器路由,如 \u003ccode\u003e/user/info\u003c/code\u003e、 \u003ccode\u003e/user/base\u003c/code\u003e、\u003ccode\u003e/user/changepwd\u003c/code\u003e 之类。\u003c/p\u003e\n\u003ch1 id=\"示例介绍\"\u003e示例介绍\u003c/h1\u003e\n\u003cp\u003e我们先看一个在 \u003ca href=\"https://beta.solpg.io\"\u003ehttps://beta.solpg.io\u003c/a\u003e 网站上创建的一个 Native …\u003c/p\u003e"
December 3, 2024
解决编译solana程序 rustc版本号过低的问题
"\u003cp\u003e本方主要介绍在编译solana程序时,提示 rustc 版本号过低无法编译通过的问题。\u003c/p\u003e\n\u003ch1 id=\"问题描述\"\u003e问题描述\u003c/h1\u003e\n\u003cp\u003e在参考官方教程 \u003ca href=\"https://github.com/solana-developers/program-examples/tree/main/basics/favorites/native\"\u003ehttps://github.com/solana-developers/program-examples/tree/main/basics/favorites/native\u003c/a\u003e 在本地执行命令\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e➜ native git:\u003cspan style=\"color:#f92672\"\u003e(\u003c/span\u003emain\u003cspan style=\"color:#f92672\"\u003e)\u003c/span\u003e ✗ cargo build-sbf --manifest-path\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e./program/Cargo.toml --sbf-out-dir\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e./program/target/so\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e报错\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e➜ native git:\u003cspan style=\"color:#f92672\"\u003e(\u003c/span\u003emain\u003cspan style=\"color:#f92672\"\u003e)\u003c/span\u003e ✗ cargo build-sbf --manifest-path\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e./program/Cargo.toml --sbf-out-dir\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e./program/target/so\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eerror: package \u003cspan style=\"color:#e6db74\"\u003e`\u003c/span\u003esolana-program v2.1.7\u003cspan style=\"color:#e6db74\"\u003e`\u003c/span\u003e cannot be built because it requires rustc 1.79.0 or newer, \u003cspan style=\"color:#66d9ef\"\u003ewhile\u003c/span\u003e the currently active …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
December 2, 2024
在Solana中为什么Token Account没有owner属性
"\u003cp\u003e在上一篇\u003ca href=\"https://blog.haohtml.com/posts/understanding-the-difference-between-ata-accounts-and-token-accounts-in-solana/\"\u003e《了解 Solana 中ATA账户与普通账户的关系》\u003c/a\u003e中,我们介绍了在Solana中,ATA账户与Token Account 的区别,其中在浏览器记录查看 user2 用户详细的时候,发现它与前两个账户有所区别,它没有 Owner 属性,这在正常情况下是不应该出现的,所以,我们来分析一下,为什么Token Account没有 \u003ccode\u003eOwner\u003c/code\u003e 属性?\u003c/p\u003e\n\u003cp\u003e在 Soalna中,默认情况下所有的新账户都属于 \u003ca href=\"https://solana.com/docs/core/accounts#system-program\"\u003eSystem Program\u003c/a\u003e,也只有系统程序拥有的账户才可以作为交易费用支付者(也就是账户里必须的原生币sol)。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com/uploads/2025/system-account.svg\" alt=\"系统账户\"\u003e\u003c/p\u003e\n\u003cp\u003e因此示例中正常的 Token Account\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com/uploads/2025/image-20250107144557450.png\" alt=\"Token Accoun\"\u003e\u003c/p\u003e\n\u003cp\u003e异常账号\n\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com/uploads/2025/image-20250107145307758.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e出现我这种情况主要有两种情况:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e交易还在处理中,尚未完成,这种情况下一般只需要等待一会就会正常。\u003c/li\u003e\n\u003cli\u003e账户未被初始化,需要初始化后才恢复正常。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e常见的初始化方法:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e空投原生币\u003c/li\u003e\n\u003cli\u003e转账原生币\u003c/li\u003e\n\u003cli\u003e通过 SystemProgram.createAccount 创建账号·\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e在上篇文章里,我们为了演示转账记录,对 payer 和 user1 用户都进行了空投,在空投时将自动对账户进行初始化操作, …\u003c/p\u003e"
December 1, 2024
了解 Solana 中ATA账户与普通账户的关系
"\u003cp\u003e本文主要通过示例让大家理解在 Solana 中 \u003ccode\u003eATA\u003c/code\u003e 账户与普通账户的关系。\u003c/p\u003e\n\u003ch1 id=\"目的\"\u003e目的\u003c/h1\u003e\n\u003cp\u003e主篇内容目的是为了让开发者加深对 solana 中 Account 这一概念的理解,同时搞清楚 \u003ccode\u003e关联代币账户(ATA) \u003c/code\u003e 在 Solana 开发中的使用场景和用法,以及在多个账户之间的交易和手续费扣除情况。\u003c/p\u003e\n\u003cp\u003e本篇实现源码会在 \u003ca href=\"https://github.com/cfanbo/solana-repos/tree/main/tokenaccount-and-ata\"\u003egithub.com/cfanbo/solana-repos/\u003c/a\u003e 中找到。\u003c/p\u003e\n\u003cp\u003e这里用到的一些api 函数可以在以下地址找到:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://solana-labs.github.io/solana-web3.js/index.html\"\u003e@solana/web3.js\u003c/a\u003e 用户实现通过 Solana JSON RPC API 与 Solana 网络上的帐户和程序进行交互。\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://solana-labs.github.io/solana-program-library/token/js/index.html\"\u003e@solana/spl-token\u003c/a\u003e 用于实现与 SPL Token 和 Token-2022 程序交互。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e本文通过脚本实现 SPL Token 标准功能,并不需要调用已创建好的智能合约,因此不需要 programId.\u003c/p\u003e\n\u003ch1 id=\"设置网络环境\"\u003e设置网络环境\u003c/h1\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e➜ my-solana-program git:\u003cspan style=\"color:#f92672\"\u003e(\u003c/span\u003emaster\u003cspan style=\"color:#f92672\"\u003e)\u003c/span\u003e ✗ solana config get\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eConfig File: …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
November 7, 2024
彻底理解 ERC20 代币标准中的转账逻辑
"\u003cp\u003e在看 Solidity 文档 \u003ca href=\"https://solidity-by-example.org/app/erc20/\"\u003ehttps://solidity-by-example.org/app/erc20/\u003c/a\u003e 时,对于其中一段授权额的编码逻辑有点不明白,经过一翻查找资料才算彻底搞明白它的操作逻辑,这里特意将其记录一下。\u003c/p\u003e\n\u003ch1 id=\"erc20代币标准\"\u003eERC20代币标准\u003c/h1\u003e\n\u003cp\u003e在ERC20代币标准(\u003ca href=\"https://eips.ethereum.org/EIPS/eip-20\"\u003ehttps://eips.ethereum.org/EIPS/eip-20\u003c/a\u003e) 中定义了一系列的接口方法\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-solidity\" data-lang=\"solidity\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003einterface\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eIERC20\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#66d9ef\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003etotalSupply\u003c/span\u003e() \u003cspan style=\"color:#66d9ef\"\u003eexternal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eview\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ereturns\u003c/span\u003e (\u003cspan style=\"color:#66d9ef\"\u003euint256\u003c/span\u003e); \u003cspan style=\"color:#75715e\"\u003e// 返回代币总供应量。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003ebalanceOf\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003eaddress\u003c/span\u003e account) \u003cspan style=\"color:#66d9ef\"\u003eexternal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eview\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ereturns\u003c/span\u003e (\u003cspan style=\"color:#66d9ef\"\u003euint256\u003c/span\u003e); \u003cspan style=\"color:#75715e\"\u003e// 查询某个账户的代币余额。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003etransfer\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003eaddress\u003c/span\u003e recipient, \u003cspan style=\"color:#66d9ef\"\u003euint256\u003c/span\u003e amount) \u003cspan style=\"color:#66d9ef\"\u003eexternal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ereturns\u003c/span\u003e (\u003cspan style=\"color:#66d9ef\"\u003ebool\u003c/span\u003e); \u003cspan style=\"color:#75715e\"\u003e// 从调用者账户向其他地址转移代币。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eallowance\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003eaddress\u003c/span\u003e owner, …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
Category: 其它
October 17, 2024
IDE 翻译插件 Ai Translate 新版本发布
"\u003cp\u003eIDE 插件 \u003ccode\u003eAI Translate \u003c/code\u003e经过几个小版本的迭代,目前已经支持市面上主流的 LLM 服务提供商,主要有以下几个服务提供商:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eOpenAI\u003c/li\u003e\n\u003cli\u003eAnthropic\u003c/li\u003e\n\u003cli\u003eDeepL\u003c/li\u003e\n\u003cli\u003e智谱 GLM\u003c/li\u003e\n\u003cli\u003e字节跳动\u003c/li\u003e\n\u003cli\u003eDeepSeek\u003c/li\u003e\n\u003cli\u003eAlibaba\u003c/li\u003e\n\u003cli\u003eGitHub\u003c/li\u003e\n\u003cli\u003eGemini\u003c/li\u003e\n\u003cli\u003eOllama\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e除此之外,还有两个智能体服务商\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e阿里云百炼\u003c/li\u003e\n\u003cli\u003e扣子\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e基本已经满足了大多数开发者的翻译需求。\u003c/p\u003e\n\u003cp\u003e下载地址:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eJetBrains: \u003ca href=\"https://plugins.jetbrains.com/plugin/25313-ai-translate\"\u003ehttps://plugins.jetbrains.com/plugin/25313-ai-translate\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eVSCode: \u003ca href=\"https://marketplace.visualstudio.com/items?itemName=cfanbo.ai-translate\"\u003ehttps://marketplace.visualstudio.com/items?itemName=cfanbo.ai-translate\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e特别是最近对 \u003ccode\u003eOllama\u003c/code\u003e 的支持,允许用户使用本地的大模型提供服务,无需像其它几个 provider 一样,还需要注册会员和身份主证。只需要填写一个 URL 地址即可使用,非常的方便。\u003c/p\u003e\n\u003cp\u003e由于目前使用的 \u003ccode\u003eprompt\u003c/code\u003e 是统一的,因此不同 provider 的翻译效果可能不一样, …\u003c/p\u003e"
October 14, 2024
为 Zed IDE 设置自定义 LLM provider
"\u003cp\u003e在\u003ccode\u003eZed\u003c/code\u003e IDE中,默认只支持以下几种 providers :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://zed.dev/docs/assistant/configuration#zed-ai\"\u003eZed AI (Configured by default when signed in)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://zed.dev/docs/assistant/configuration#anthropic\"\u003eAnthropic\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://zed.dev/docs/assistant/configuration#github-copilot-chat\"\u003eGitHub Copilot Chat\u003c/a\u003e \u003ca href=\"https://zed.dev/docs/assistant/configuration#1\"\u003e1\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://zed.dev/docs/assistant/configuration#google-ai\"\u003eGoogle AI\u003c/a\u003e \u003ca href=\"https://zed.dev/docs/assistant/configuration#1\"\u003e1\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://zed.dev/docs/assistant/configuration#ollama\"\u003eOllama\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://zed.dev/docs/assistant/configuration#openai\"\u003eOpenAI\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e这对于国内开发者来说,由于政策原因,想使用起来可能需要借助一些科学上网的方法,这就有点麻烦了。另外国内几个大模型公司也都提供了一定的免费额度的 tokens,如果可以在 Zed 里集成国内几家的大模型,也是一个不错的主意。\u003c/p\u003e\n\u003cp\u003e几个月前试图通过自定义\u003ccode\u003eEndpoint\u003c/code\u003e 的方法绕过官方对使用区域的限制,但一直没有成功。今天重新试了一下仍是无效,本想打算在官方仓库里开发一个自定义provider的功能,就是感觉着有点麻烦,另外更担心个人电脑过旧,编译是一个大问题,于是重新在issue里找到了一个解决办法 \u003ca href=\"https://github.com/zed-industries/zed/pull/13276\"\u003ehttps://github.com/zed-industries/zed/pull/13276\u003c/a\u003e,就是设置起来有点麻烦。\u003c/p\u003e\n\u003cp\u003e本文将其设置方法整理如下。\u003c/p\u003e\n\u003ch1 id=\"配置-settingsjson\"\u003e配置 settings.json\u003c/h1\u003e\n\u003cp\u003e首先配置 settings.json …\u003c/p\u003e"
September 4, 2024
一款基于LLM实现的IDE翻译插件 AI Translate
"\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2024/09/logo.png\" alt=\"logo.png\"\u003e\u003c/p\u003e\n\u003cp\u003eAI Translate 是一款基于LLM实现的IDE专用翻译插件,主要为开发人员在查看项目源码时,可以快速对一些代码英文注释进行中文翻译,这对于英文有些弱的同学很有帮助,下面讲一下为什么开发这款IDE插件,以及它比其它同类翻译插件有什么好处。\u003c/p\u003e\n\u003ch1 id=\"为什么开发这款翻译插件\"\u003e为什么开发这款翻译插件\u003c/h1\u003e\n\u003cp\u003e在以前使用IDE看项目源码时,经常遇到长段的英文段落注释信息,理解起来经常会吃力。当时找了一些翻译插件,但都感觉多多少少有些缺陷。\u003c/p\u003e\n\u003cp\u003e主要表现以下几点:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e翻译质量差,有些翻译软件可能将一些专业术语翻译成了其它名词,整体翻译后的语句读起来很让人头疼\u003c/li\u003e\n\u003cli\u003e由于在源码文件里,多数源码说明 信息都是以注释方式出现的,多数翻译软件无法做到忽略注释符后连贯起来翻译。\u003c/li\u003e\n\u003cli\u003e目前市面比较好用的翻译插件“沉浸式翻译”,可惜只支持浏览器,并不支持IDE\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e曾有一段时间的做法是手动从IDE里复制信息、删除注释符、重新整理段落,再到网页翻译里进行翻译,有时翻译的效果不太好,可能同时会用两个翻译软件。\u003c/p\u003e\n\u003cp\u003e去年看kubernets源码时,再次被折腾一番,当时花了两三个小时开发了一款基于chrome浏览器的插件,主要实现功能是在软件翻译前,将注释符移除和重新 …\u003c/p\u003e"
November 30, 2022
shell终端配置
"\u003cp\u003e\u003ca href=\"%5Bhttps://ohmyz.sh%5D(https://link.zhihu.com/?target=https%3A//ohmyz.sh/)\"\u003eoh-my-zsh\u003c/a\u003e 是一款非常不错的shell配置,最近几年一直是重度用户。由于一些原因经常登录一些服务器,这里根据自己的习惯做一个笔记,以后不用每一次都要重新从各个地方找安装脚本了。\u003c/p\u003e\n\u003ch1 id=\"安装-zsh\"\u003e安装 zsh\u003c/h1\u003e\n\u003ch2 id=\"安装zsh\"\u003e安装zsh\u003c/h2\u003e\n\u003cp\u003e一般系统默认的都是\u003ccode\u003ebash\u003c/code\u003e,所以我们先安装 \u003ccode\u003ezsh\u003c/code\u003e。如果不清楚当前使用的哪一类shell的,可通过以下命令查看\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ cat $SHELL\n/bin/bash\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e我这里使用的默认shell。根据平台选择相应的安装zsh命令, 我这里是Ubuntu系统。\u003c/p\u003e\n\u003cp\u003eLinux、Debian平台\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo apt install -y zsh\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003emacOS\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ebrew install zsh\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCentos/RHE\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo yum update \u0026amp;\u0026amp; sudo yum -y install zsh\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"确认版本\"\u003e确认版本\u003c/h2\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ zsh --version\nzsh 5.8.1 (aarch64-unknown-linux-gnu)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e查看 \u003ccode\u003e/etc/shell\u003c/code\u003e 看是否存在zsh\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ cat /etc/shells\n/bin/sh\n/bin/bash\n/usr/bin/bash\n/bin/rbash …\u003c/code\u003e\u003c/pre\u003e"
October 31, 2022
在 vmware 里扩容Linux硬盘空间
"\u003cp\u003e在mac上创建了一个ubuntu的虚拟机做为k8s远程开发调试机器,但在编译程序的时候发现磁盘空间不足,于是需要对磁盘进行扩容。\u003c/p\u003e\n\u003cp\u003e下面为整个硬盘扩容过程。\u003c/p\u003e\n\u003ch1 id=\"硬盘扩容\"\u003e硬盘扩容\u003c/h1\u003e\n\u003cp\u003e首先将虚拟机关机,在 Vmware Fusion 软件上面菜单,点击 \u003ccode\u003eVirtual Machine\u003c/code\u003e -\u0026gt; \u003ccode\u003eSetting\u003c/code\u003e 菜单,然后在突出框框里的找到硬盘 \u003ccode\u003eHard Disk\u003c/code\u003e ,点击调整硬盘空间大小,然后点击\u003ccode\u003eApply\u003c/code\u003e 应用按钮。\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2022/10/68da0b3518a7ced98a9fd17cb55b89dd-1.webp\" alt=\"image-20230728130214297\"\u003e\u003c/p\u003e\n\u003ch1 id=\"磁盘格式化\"\u003e磁盘格式化\u003c/h1\u003e\n\u003cp\u003e查看当前磁盘分区信息\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esxf@vm:~/workspace$ sudo fdisk -l\n[sudo] password for sxf:\nDisk /dev/loop0: 63.29 MiB, 66359296 bytes, 129608 sectors\nUnits: sectors of 1 * 512 = 512 bytes\nSector size (logical/physical): 512 bytes / 512 bytes\nI/O size (minimum/optimal): 512 bytes / 512 bytes\n\nDisk /dev/loop1: …\u003c/code\u003e\u003c/pre\u003e"
November 23, 2021
利用代理拉取docker镜像
"\u003cp\u003e在日常开发中经常会遇到有些镜像在 gcr.io 仓库,其仓库是google提供的,由于国内网络环境的复杂性是无法拉取到这些镜像的,这时候就需要我们想一些办法来实现拉取了。\u003c/p\u003e\n\u003cp\u003e这里给出了两种解决方法,一种是直接使用代理,这种可以直接拉取远程镜像到本地。另一种是通过中转的方法,先找一个可以直接拉取到镜像的网络,先将存储到本地,然后再转镜像上传到三方国内可以访问的镜像,如我们最常用镜像 \u003ca href=\"https://hub.docker.com\"\u003ehttps://hub.docker.com\u003c/a\u003e。\u003c/p\u003e\n\u003ch1 id=\"代理方式\"\u003e代理方式\u003c/h1\u003e\n\u003cp\u003e使用代理方法的时候,如果通过直接设置 http_proxy 和 https_proxy 这两个环境变量是不可行的。如果是k8s环境的话,可能会使用到 \u003ccode\u003econtainerd\u003c/code\u003e 运行时,这时可能还需要设置 \u003ccode\u003ecrictl\u003c/code\u003e 配置,因此下面将分别介绍这个软件的配置方式。\u003c/p\u003e\n\u003cp\u003e如果k8s运行时,使用的是 Docker Engine ,则可以通过 docker 命令管理镜像;如果使用的是 \u003ccode\u003econtainerd\u003c/code\u003e运行时,则需要通过 \u003ccode\u003ecrictl\u003c/code\u003e 命令管理镜像。\u003c/p\u003e\n\u003cp\u003e不同运行时需要不同的管理客户端,因此下面我们将一下针对这两个软件配置的不同代理配置。 …\u003c/p\u003e"
July 1, 2019
mac手动停止 php-fpm 服务
"\u003cp\u003e由于要安装一个docker服务,对外提供端口用的是9000, 和php-fpm的监听端口冲突,所以需要先停止一下php-fpm服务。\u003c/p\u003e\n\u003cp\u003e多次执行\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003esudo killall php-fpm\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e发现过一会php-fpm会自动启动,就算一个一个的进程kill -9 也一样的效果。经过分析这个应该是和php-fpm配置文件 ~/Library/LaunchAgents/homebrew.mxcl.php@7.1.plist 有关。\u003c/p\u003e\n\u003cp\u003e我们知道 ~/Library/LaunchAgents 针对当前用户的启动项目录,针对这个项目里的一些配置服务有一个 launchctl 命令可以操作,其中有几个命令我们需要知道他的意思\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003elaunchctl load 启动plist运行\nlaunchctl unload 卸载\nlaunchctl list 查看所有启动任务\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e默认当用户登录后,mac系统会对当前目录 ~/Library/LaunchAgents 里的每个配置服务文件自动执行launchctl load 命令。如果我们想停止一个服务的话,则需要执行 launchctl unload 命令即可。\u003c/p\u003e\n\u003cp\u003e`$ …\u003c/p\u003e"
May 29, 2015
mac下的yum包管理工具MacPorts
"\u003cp\u003e这里推荐安装 \u003ca href=\"http://brew.sh/\"\u003eHomebrew\u003c/a\u003e,好像安装这个的用户比较的多的,安装命令也非常的简单。\u003c/p\u003e\n\u003cp\u003eMac下面除了用dmg、pkg来安装软件外,比较方便的还有用MacPorts来帮助你安装其他应用程序,跟BSD中的ports道理一样。MacPorts就像apt-get、yum一样,可以快速安装些软件。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e除了这个还有一些类似的工具: \u003ca href=\"http://brew.sh/\"\u003eHomebrew\u003c/a\u003e 和 Fink。\u003c/p\u003e\n\u003cp\u003eFlink是直接编译好的二进制包,MacPorts是下载所有依赖库的源代码,本地编译安装所有依赖,Homebrew是尽量查找本地依赖库,然后下载包源代码编译安装。\nFlink容易出现依赖库问题,MacPorts相当于自己独立构建一套,下载和编译的东西太多太麻烦,Homebrew的方式最合理。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e下面将MacPorts的安装和使用方法记录在这里以备查。\u003c/p\u003e\n\u003cp\u003e访问官方网站http://www.macports.org/install.php,这里提供有dmg安装和源码安装两种方式,dmg就多说了,下载 \u003ca href=\"https://distfiles.macports.org/MacPorts/MacPorts-2.3.3-10.10-Yosemite.pkg\"\u003eMacPorts-2.3.3-10.10-Yosemite.pkg\u003c/a\u003e,下一步下一步安装即可。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e通过Source安装MacPorts\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ewget …\u003c/p\u003e"
April 18, 2015
vmware11下安装mac osx 10.10教程(原创)
"\u003cp\u003e推荐此方法:\u003c/p\u003e\n\u003cp\u003e一. 安装vmware 12 pro的破解补丁(unlocker207)\u003c/p\u003e\n\u003cp\u003evmware 12 pro\nunlocker207( 204版本在vm11处可以使用,在vm12下不管用,各版本下载 \u003ca href=\"http://www.insanelymac.com/forum/files/file/339-unlocker/\"\u003ehttp://www.insanelymac.com/forum/files/file/339-unlocker/\u003c/a\u003e )\u003c/p\u003e\n\u003cp\u003e二. 下载 Yosemite Install(14F27)_10.10.5.cdr 镜像文件。安装方法同windows一样,设置为cd/dvd就可以了。默认vmware只显示iso文件,选择一下显示所有文件即可。\u003c/p\u003e\n\u003cp\u003e安装过程中会提示一下信息,和下面教程的错误和解决方法都一样。\u003c/p\u003e\n\u003cp\u003e===============================================\u003c/p\u003e\n\u003cp\u003e不在推荐使用以下这种方法,网络安装特别的慢,另外版本已经过时。推荐使用上面的方法安装!\u003c/p\u003e\n\u003cp\u003e在安装前请检查您的硬件配置是否支持,特别注意是”虚拟化”功能,有的主板虽然支持,但默认是关闭状态的,需要在bios里开启才可以。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2015/04/vt_enable.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2015/04/vt_enable.png\" alt=\"vt_enable\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e所需软件:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1.mac 补丁 unlocker\n2.mac os x …\u003c/p\u003e"
May 5, 2013
editplus查找替换的正则表达式应用
"\u003cp\u003e表达式 说明\n\\t 制表符.\n\\n 新行.\n. 匹配任意字符.\n| 匹配表达式左边和右边的字符. 例如, “ab|bc” 匹配 “ab” 或者 “bc”.\n[] 匹配列表之中的任何单个字符. 例如, “[ab]” 匹配 “a” 或者 “b”. “[0-9]” 匹配任意数字.\n[^] 匹配列表之外的任何单个字符. 例如, “[^ab]” 匹配 “a” 和 “b” 以外的字符. “[^0-9]” 匹配任意非数字字符.\n* 其左边的字符被匹配任意次(0次,或者多次). 例如 “be*” 匹配 “b”, “be” 或者 “bee”.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e其左边的字符被匹配至少一次(1次,或者多次). 例如 “be+” 匹配 “be” 或者 “bee” 但是不匹配 “b”.\n? 其左边的字符被匹配0次或者1次. 例如 “be?” 匹配 “b” 或者 “be” 但是不匹配 “bee”.\n^ 其右边的表达式被匹配在一行的开始. 例如 “^A” 仅仅匹配以 “A” 开头的行.\ncontentnbsp; 其左边的表达式被匹配在一行的结尾. 例如 “econtentquot; 仅仅匹配以 “e” 结尾的行.\n() 影响表达 …\u003c/li\u003e\u003c/ul\u003e"
January 25, 2013
git remote用法总结
"\u003cp\u003e\u003cstrong\u003egit remote\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003egit remote显示所有的remote(加-v显示详细信息)。\ngit remote add [shortname] [url]用来添加remote。\ngit fetch [remote-name]只会pull下来全部的更动,但不会自动merge,但是git pull会自动merge。\ngit remote show [remote-name]可以看到一个remote的详细信息。\ngit remote rename old new 用来改变一个remote的名字。\ngit remote rm [remote-name]删除一个remote。\ngit remote 不带参数,列出已经存在的远程分支,例如:\n#git remote\norigin_apps\u003c/p\u003e\n\u003cp\u003egit remote -v | –verbose 列出详细信息,在每一个名字后面列出其远程url,例如:\n#git remote -v\norigin_apps gitolite@scm:apps/Welcome.git (fetch)\norigin_apps …\u003c/p\u003e"
December 11, 2012
破解youku等视频网站广告的插件OpenGG.Clean.Player
"\u003cp\u003e官方网址: \u003ca href=\"http://opengg.me/781/opengg-clean-player/\"\u003ehttp://opengg.me/781/opengg-clean-player/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e安装地址: \u003ca href=\"http://userscripts.org/scripts/show/120679\"\u003ehttp://userscripts.org/scripts/show/120679\u003c/a\u003e\u003c/p\u003e"
November 10, 2012
使用mysql来实现lbs(地理位置服务)功能
"\u003cp\u003e现在大型的网站实现的lbs服务基本上是用mongodb的实现定位的(gps不太清楚)。对于小的应用来说,有些大材小用了,而且还大大增加了维护成本。这里用mysql来实现lbs的功能。\u003c/p\u003e\n\u003cp\u003e以下是从“知乎”网上的一篇文章()。\u003c/p\u003e\n\u003cp\u003e数据库设计层面,有两个方案\u003c/p\u003e\n\u003cp\u003e(1)字段主要包括 userId,lat,lng。分别代表用户ID、最近一次 Checkin 的经度、纬度。\nlat/lng 建立复合索引。\u003c/p\u003e\n\u003cp\u003e然后通过手机的定位,得到自己的位置,比如记为 myLat,myLng。\n代码如下,先做一个计算,算出 1km 所对应的经纬度范围:\n**double range = 180 / Math.PI * 1 / 6372.797; **\u003cem\u003e//里面的 1 就代表搜索 1km 之内,单位km\u003c/em\u003e\n\u003cstrong\u003edouble lngR = range / Math.cos(myLat * Math.PI / 180.0);\u003c/strong\u003e\n\u003cstrong\u003edouble maxLat = myLat + range;\u003c/strong\u003e\n\u003cstrong\u003edouble minLat = myLat – range;\u003c/strong\u003e\n\u003cstrong\u003edouble maxLng = myLng + lngR;\u003c/strong\u003e\n\u003cstrong\u003edouble …\u003c/strong\u003e\u003c/p\u003e"
September 8, 2012
adodb cs5破解办法及注册码
"\u003cp\u003e用记事本编辑“C:\\Windows\\System32\\Drivers\\etc\\”目录下的 hosts 文件\u003c/p\u003e\n\u003cp\u003e127.0.0.1 activate.adobe.com\n127.0.0.1 practivate.adobe.com\n127.0.0.1 ereg.adobe.com\n127.0.0.1 activate.wip3.adobe.com\n127.0.0.1 wip3.adobe.com\n127.0.0.1 3dns-3.adobe.com\n127.0.0.1 3dns-2.adobe.com\n127.0.0.1 adobe-dns.adobe.com\n127.0.0.1 adobe-dns-2.adobe.com\n127.0.0.1 adobe-dns-3.adobe.com\n127.0.0.1 ereg.wip3.adobe.com\n127.0.0.1 activate-sea.adobe.com\n127.0.0.1 wwis-dubc1-vip60.adobe.com\n127.0.0.1 activate-sjc0.adobe.com\u003c/p\u003e\n\u003cp\u003e以防止其连接 Adobe 的激活验证服务 …\u003c/p\u003e"
August 6, 2012
zend studio 破解及汉化(9.0.3/10.0.0)
"\u003cp\u003eZend studio 10 破解下载地址见: \u003ca href=\"http://www.geekso.com/ZendStudio100/\"\u003ehttp://www.geekso.com/ZendStudio100/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e==========================================================\u003c/p\u003e\n\u003cp\u003ezend studio 9.0.3版本,官方下载地址如下:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://downloads.zend.com/studio-eclipse/9.0.3/ZendStudio-9.0.3.msi\"\u003ehttp://downloads.zend.com/studio-eclipse/9.0.3/ZendStudio-9.0.3.msi\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e开始破解软件:\u003c/p\u003e\n\u003cp\u003e首先下载破解文件: \u003ca href=\"/wp-content/uploads/2012/08/com.zend.php.core_9.0.3.201205071416\" title=\"com.zend.php.core_9.0.3.201205071416.jar\"\u003ecom.zend.php.core_9.0.3.201205071416.jar\u003c/a\u003e ,下载完成后,复制到zend studio 9.0.3的plugins目录下,\u003c/p\u003e\n\u003cp\u003e覆盖原文件,记住不要解压。\u003c/p\u003e\n\u003cp\u003e启动zend studio 9.0.3, 输入下面注册码: …\u003c/p\u003e"
May 10, 2012
时间即财富:创业者浪费精力的八个错误
"\u003cp\u003e导读:本文作者Jeff Miller是美食网页应用Punchfork的创始人,同时也是DuckDuckGo、Ginzametrics、Art.sy、DataMinr以及Forkly的投资人。作者通过对自己创业初期一些错误选择进行盘点,告诉读者在创业初期应该学会选择,因为在创业初期,时间是最宝贵的财富。\u003c/p\u003e\n\u003cp\u003e创业的选择有两种,一是白手起家做创新品牌,另外就是已经有发展基础的品牌去做大,这两者之间最大的不同就是把握时机。每天都会有成百上千的机会摆在你的面前,你会选择哪一个?把握住其中的一个机会就意味着你将放弃其它那成百上千的诱惑。所以,创业最关键的技能就是把握时机。\u003c/p\u003e\n\u003cp\u003e作为一个成熟的企业,在发展的过程中都会面临各种时机,这些时机有的会让公司在付出较少的前提下获得更多利益,有的会促使公司有较大的发展。这些时机会由很多事情决定,比如有足够的活跃用户会向你进行反馈市场信息、发现某个榜样可以让你参考学习、发现了能够促进达成目标的优化方案等等。\u003c/p\u003e\n\u003cp\u003e回顾我自己创业的这六个月,发现自己对时机的选择真的是非常糟糕的。我经常在某项工作上花费大量时间,而最后对达成目标却没有任何效果。我特别容易偏爱短期(1至2周时间) …\u003c/p\u003e"
April 19, 2012
重装系统备份文件清单
"\u003cp\u003e包括lamp,lnmp 所涉及到的所有配置文件.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e重装安装系统备份\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003col\u003e\n\u003cli\u003ephp.ini文件\u003c/li\u003e\n\u003cli\u003erc.local\u003c/li\u003e\n\u003cli\u003e/etc/crontab\u003c/li\u003e\n\u003cli\u003enginx.conf 及相关虚拟主机配置文件\u003c/li\u003e\n\u003cli\u003e数据库备份\u003c/li\u003e\n\u003cli\u003e网站程序备份\u003c/li\u003e\n\u003cli\u003eftp配置文件备份\u003c/li\u003e\n\u003cli\u003e系统防火墙iptables设置\u003c/li\u003e\n\u003c/ol\u003e\u003c/blockquote\u003e\n\u003cp\u003e注: 恢复配置文件时,注意相关文件权限,如网站ftp目录的权限分配问题.\u003c/p\u003e"
April 6, 2012
CARD VERIFICATION CODE是什么
"\u003ch1 id=\"card-verification-code是什么-信用卡验证码是什么\"\u003eCard Verification Code是什么 信用卡验证码是什么\u003c/h1\u003e\n\u003ch1 id=\"card-verification-code是不是就是我们银行卡的密码\"\u003eCard Verification Code是不是就是我们银行卡的密码?\u003c/h1\u003e\n\u003cp\u003e\u003ca href=\"http://xianhuo.org/Card-Verification-Code.html\"\u003eCard Verification Code\u003c/a\u003e(简称 \u003ca href=\"http://xianhuo.org/Card-Verification-Code.html\"\u003eCVC\u003c/a\u003e) 不是银行卡密码。\n这里,就不介绍CVC的官方定义了。简单说,CVC就是在卡片背面磁条后面打印的3位数字,这个数字是银行通过特殊方法计算出来的,主要是用来防伪——防止有人利用别人的卡号仿制卡片。\n通常,只要卡片没有丢失,就没有人能够仿照你的卡片。\n某些网上交易会要求你提供这个号码,就是要确认卡片的真实性。\u003c/p\u003e\n\u003ch1 id=\"什么是信用卡的card-verification-code\"\u003e什么是信用卡的Card Verification Code\u003c/h1\u003e\n\u003ch3 id=\"什么是-信用卡验证码what-is-a-credit-card-verification-code\"\u003e什么是 \u003ca href=\"http://xianhuo.org/Card-Verification-Code.html\"\u003e信用卡验证码\u003c/a\u003e——What Is a Credit Card Verification Code?\u003c/h3\u003e\n\u003cp\u003e信用卡的背面签名栏上,紧跟卡号末尾四位数的3位就是CCV或者CVV了。\u003c/p\u003e\n\u003cp\u003e信用卡验证码(CVC—— \u003ca href=\"http://xianhuo.org/Card-Verification-Code.html\"\u003eCredit card verification code\u003c/a\u003e)是当发生以信用卡支付的交易(并且当时无法提供实际的信用卡)时,用来防范欺诈行为的一组数字。该验证码是一组必须输入的、从属于信用卡卡号的3位或4位数字。通过加密,它 …\u003c/p\u003e"
April 5, 2012
简单分析国内三大第三方支付平台
"\u003cp\u003e\u003ca href=\"http://img.bimg.126.net/photo/CY6ThbPmR3Yw3Qi5DBqqWw==/3738550640672303801.jpg\"\u003e\u003cimg src=\"http://img.bimg.126.net/photo/CY6ThbPmR3Yw3Qi5DBqqWw==/3738550640672303801.jpg\" alt=\"简单分析国内三大第三方支付平台 - liuxinyue1289@126 - 刘某某\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e从这张图表中可以看出,目前国内排在前三名的第三方支付平台是:支付宝(阿里巴巴)财付通(腾讯)银联电子支付(银联支付电子公司),下面就这三大支付平台做些简要的分析。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一:支付宝\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e支付宝公司从2004年建立开始,始终以“信任”作为产品和服务的核心,除淘宝和阿里巴巴外,支持使用支付宝交易服务的商家已经超过33万家;涵盖了虚拟游戏、数码通讯、商业服务,飞机订票等。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://img.bimg.126.net/photo/bQOb8SnZ1PSeaCwncfjLUQ==/3738550640672303817.jpg\"\u003e\u003cimg src=\"http://img.bimg.126.net/photo/bQOb8SnZ1PSeaCwncfjLUQ==/3738550640672303817.jpg\" alt=\"简单分析国内三大第三方支付平台 - liuxinyue1289@126 - 刘某某\"\u003e\u003c/a\u003e\u003ca href=\"http://img.bimg.126.net/photo/ad6qua1HFmON01GGM2Y7ww==/3738550640672303820.jpg\"\u003e\u003cimg src=\"http://img.bimg.126.net/photo/ad6qua1HFmON01GGM2Y7ww==/3738550640672303820.jpg\" alt=\"简单分析国内三大第三方支付平台 - liuxinyue1289@126 - 刘某某\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e支付宝目前支持的银行\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://img.bimg.126.net/photo/zdBAhLMTEWXm0ZkyG1F8Qg==/3738550640672303822.jpg\"\u003e\u003cimg src=\"http://img.bimg.126.net/photo/zdBAhLMTEWXm0ZkyG1F8Qg==/3738550640672303822.jpg\" alt=\"简单分析国内三大第三方支付平台 - liuxinyue1289@126 - 刘某某\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二:财付通\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e财付通财付通网站 (\u003ca href=\"https://www.tenpay.com\"\u003ewww.tenpay.com\u003c/a\u003e) 作为功能强大的支付平台,是由中国最早、最大的互联网即时通信软件开发商腾讯公司创办,为最广大的QQ用户群提供安全、便捷、简单的在线支付服务。是腾讯公司为促进中国电子商务的发展需要,满足互联网用户价值需求,针对网上交易安全而精心推出的一系列服务。 作用财付通作为在线支付工具,在B2C、C2C在线交易中,起到了信用中介的作用,同时为CP、SP提供了在线支付通道以及统一的计费平台,解除\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://img.bimg.126.net/photo/xlbOS-wcDJFqdOGkRxHKQw==/2608147134201838207.jpg\"\u003e\u003cimg src=\"http://img.bimg.126.net/photo/xlbOS-wcDJFqdOGkRxHKQw==/2608147134201838207.jpg\" alt=\"简单分析国内三大第三方支付平台 - liuxinyue1289@126 - 刘某某\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e财付通的工作原理类似于支付宝。是腾讯旗下自己创造的第三方支付平台,分为企业与个人两种。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e三:银联电子支付\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e银联电子支付服务有限公司(简称ChinaPay), …\u003c/p\u003e"
April 2, 2012
WordPress教程:wp_list_pages()函数
"\u003cp\u003e让页面可以设置号码,就代表着可以根据那些号码进行排序,下午研究了下代码,去官方网站查看了下wp_list_pages()的介绍,转载过来顺便介绍下函数怎么应用,方便自己及其他人修改模板。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$defaults = array(\n\n\u0026#39;depth\u0026#39; =\u0026gt; 0,\n\n\u0026#39;show_date\u0026#39; =\u0026gt; \u0026#39;\u0026#39;,\n\n\u0026#39;date_format\u0026#39; =\u0026gt; get_option(\u0026#39;date_format\u0026#39;),\n\n\u0026#39;child_of\u0026#39; =\u0026gt; 0,\n\n\u0026#39;exclude\u0026#39; =\u0026gt; \u0026#39;\u0026#39;,\n\n\u0026#39;title_li\u0026#39; =\u0026gt; __(\u0026#39;Pages\u0026#39;),\n\n\u0026#39;echo\u0026#39; =\u0026gt; 1,\n\n\u0026#39;authors\u0026#39; =\u0026gt; \u0026#39;\u0026#39;,\n\n\u0026#39;sort_column\u0026#39; =\u0026gt; …\u003c/code\u003e\u003c/pre\u003e"
March 19, 2012
WordPress添加“特色图片”功能并调用
"\u003cp\u003e我们在使用wordpress建博客的时候,是不是会发现有些主题中有“设为特色图像”功能,设置后会在首页或者文章的左上角,右上角加上特色的文章LOGO图片,还是比较酷的。但是有些主题是没有的,这是如何设置的呢?如果你的主题没有,但就想加上这个功能,如何设置?\u003c/p\u003e\n\u003cp\u003e第一步,在你的改款主题的functions.php加入如下代码:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eadd_theme_support( \u0026#39;post-thumbnails\u0026#39; );\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e第二步,在你的首页文件index.php模板内容位置加入:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026lt;?php if ( has_post_thumbnail() ) {\nthe_post_thumbnail(); ?\u0026gt;\n\u0026lt;?php } else {?\u0026gt;\n\u0026lt;img src=\u0026#34;\u0026lt;?php bloginfo(\u0026#39;template_url\u0026#39;); ?\u0026gt;/images/xxx.jpg\u0026#34; /\u0026gt;\n\u0026lt;?php } ?\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e注:XXX.JPG为你在没有特色图片的时候显示的默认图片。\u003c/p\u003e\n\u003cp\u003e第三步,完毕,在添加文章的时候添加特色图即可显示了。\u003c/p\u003e"
March 18, 2012
WordPress主题(模板)修改教程(十一):使用文章缩略图功能
"\u003cp\u003e今天磊子说的这个缩略图功能,其实网上已经传烂了,不知道大家有没有看过。今儿拿出来原因是,感觉网上说的不是很具体,一些设置没有提到,所以先给大家提前说一下。\u003c/p\u003e\n\u003cp\u003e首页你要看下你所用的主题有没有开启文章缩略图功能,如果看起的话,会在wordpress后台编辑页面或者文章时在右下角的地方看到一个特色图像的设置,如下图:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2012/03/thumbnail-action.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2012/03/thumbnail-action.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e如果没有说明你还没有激活这功能。我们需要在你主题functions.php里面加一段代码。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026lt;?php\n\nadd_theme_support( \u0026#39;post-thumbnails\u0026#39; ); //激活文章和页面的缩略图功能。\n\n//如果你想分别激活它们,可以使用下面的代码:\n\nadd_theme_support( \u0026#39;post-thumbnails\u0026#39;, array( \u0026#39;post\u0026#39; ) ); // 激活文章缩略图功能\n\nadd_theme_support( \u0026#39;post-thumbnails\u0026#39;, array( \u0026#39;page\u0026#39; ) ); // 激活页面缩略图功能\n\n?\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这样你的缩略图功能就激活了,然后 …\u003c/p\u003e"
March 18, 2012
WordPress文章缩略图使用详解
"\u003cp\u003e许多WordPress主题使用图片代表每篇文章,特别是一些杂志般布局的。图片可能只在首页显示,可能是独立的,或者放在摘要旁边。迄今为止,并没有标准化的方法来实现这个功能。很多主题需要用户冗长乏味的在自定义域中输入图片URL,图片通常需要手动裁切。从WordPress 2.9开始,主题作者可以轻松地开启缩略图选择界面,然后使用简单的模板标签调用图片。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2012/03/064359EQ7.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2012/03/064359EQ7.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e 首先,在主题的\u003ccode\u003efunctions.php\u003c/code\u003e中声明该主题支持缩略图功能,这将开启WP管理后台中的缩略图设置界面。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eadd_theme_support( \u0026#39;post-thumbnails\u0026#39; );\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e上面的代码将在文章(Post)和页面(Page)两种内容模型中都开启缩略图选择界面,如果只想选择其一,可以添加参数:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eadd_theme_support( \u0026#39;post-thumbnails\u0026#39;, array( \u0026#39;post\u0026#39; ) ); // Add it for posts\nadd_theme_support( \u0026#39;post-thumbnails\u0026#39;, array( …\u003c/code\u003e\u003c/pre\u003e"
March 18, 2012
WordPress更换新域名的4种设置方法
"\u003cp\u003e以网的cms一般情况下可以随便更换域名的.只需要将一些死链接修改就可以了.但是wordpress这个建站blog却不行,他把域名信息完全的写到数据库里的.要是更换域名的话,需要手动修改数据库里的几个字段为新的域名才可以的.下面有四种办法可以实现域名的办法.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e操作请注意:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1.一定不要使用记事本编辑php文件,否则很可能出现意想不到的错误,推荐使用UltraEdit,Dreamweaver等。\n2.如果对于修改代码不是很有把握,请预先备份好原来的文件。\n3.复制本文的代码,如果是全角符号,请自行改为半角符号,切记。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e方法一:修改wp-config.php\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1、在wp-config.php中,添加以下两行内容:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003edefine(\u0026#39;WP_HOME\u0026#39;,\u0026#39;http://blog.haohtml.com.com\u0026#39;);\ndefine(\u0026#39;WP_SITEURL\u0026#39;,\u0026#39;http://blog.haohtml.com\u0026#39;);\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ca href=\"https://www.newdomain.com\"\u003ewww.newdomain.com\u003c/a\u003e代表你的新网址\n2、登录后台,在 “常规 -\u0026gt; 设置”重新配置新博客地址(HOME)和 …\u003c/p\u003e"
March 16, 2012
wordpress导航英文字母“home”修改成中文“首页”的解决办法
"\u003cp\u003e这个需要修改原始文件,在站点的 /wp-content/languages/zh_CN.po\u003c/p\u003e\n\u003cp\u003e使用编辑器 poEdit ,在里面查找 home,修改掉那个中文翻译就可以了。\u003c/p\u003e\n\u003cp\u003e这个是应为WP在汉化过程中并没有将HOME 汉化成中文的 首页\u003c/p\u003e"
March 2, 2012
3G无线路由设置
"\u003cp\u003e刚从当当网网购了一个3G无线路由,准备做成wifi的无线网络,这样就可以通过手机上网了.目前情况为家里从房东那里拉了一根网线.我现在台式机的ip地址为192.168.1.100.掩码为255.255.255.0,网关为192.168.1.1(房东家里路由器).\u003c/p\u003e\n\u003cp\u003e大概网络拓扑图是这个样子的\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2012/03/3G_router_tu.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2012/03/3G_router_tu.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e注意:两个路由不能在同一个网段.这里3G无线路由下面的网络为192.168.0.X段.而原来房东的网段为192.168.1.X段.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e由于新购买的3G无线路由默认的ip地址为192.168.1.1,这和默认的网关ip地址发冲冲突了.所以我们需要先把这个3G路由器的ip地址修改成其它的ip才可以避免冲突情况.解决办法是先用一根网络网线让台式机和3G路由器连接.输入192.168.1.1地址,然后输入用户名和密码(默认都为admin).然后配置路由器的LAN接口ip地址为192.168.0.100,然后保存.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2012/03/lan_interface_configure.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2012/03/lan_interface_configure.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e配置此3G无线路由启用dhcp服务,这样凡是通过3G无线路由连接去的电脑或者手机获取的ip就为192.168.0.x网段.\u003c/p\u003e\n\u003cp\u003e允许分配的ip地址为 192.168.0.2 – …\u003c/p\u003e"
February 18, 2012
上班族难懂五险一金 交的越多是否越吃亏
"\u003cp\u003e专家表示:社保非理财 全局来看并不亏\u003c/p\u003e\n\u003cp\u003e交的越多是否到期领的也越多?强制缴纳是否没商量?缴纳者频繁“漂流”是否为本地人“做嫁衣裳”?\u003c/p\u003e\n\u003cp\u003e近日在网络上,有不少网友反映,尽管月月缴纳,但对所谓的“五险一金”知之甚少。记者在人民广场、浦东陆家嘴(11.72,-0.07,-0.59%)随机询问了10多名职场白领,大家对自己个人的五险一金只知道每月交纳,其他都一头雾水。人力专业人士介绍,社保并非理财,一定程度上起着“均贫富”作用,尽管存在一些实施上的瑕疵,但从全局和长远来看并不“亏”。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e交的越多是否越吃亏\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e案例:做低工资 多赚千元\u003c/p\u003e\n\u003cp\u003e刚拿到去年全年收入清单的李琳有点纳闷。她的税前收入是8000元,扣除社保、公积金和个税后每个月拿到6000多元。但公司财务告诉她,公司每个月其实为她支付的费用超过10000元。假设公司愿意为她支付的费用是固定不变的,但随着缴纳基数的不同,最终实际收入竟相差千元以上。\u003c/p\u003e\n\u003cp\u003e她向记者算了一笔账。上海2011年缴纳基数的上限是11688元,下限是2338元。个人每月缴纳养老保险、医疗保险、失业保险、住房公积金分别为收入的8%、2%、1%、7%,共计18%。单位要为个人这四者的比例分 …\u003c/p\u003e"
December 15, 2011
xen、kvm、vmware、hyper-v等虚拟化技术的比较
"\u003cp\u003e最近在实战Xen中,这篇文章是最近在网上看到的,发出来分享一下。\u003c/p\u003e\n\u003cp\u003exen和kvm,是开源免费的虚拟化软件。\nvmware是付费的虚拟化软件。\nhyper-v比较特别,是微软windows 2008 R2附带的虚拟化组件,如果你买了足够的授权,hyper-v(包括hyper-v 2008 core)都可以免费使用。\u003c/p\u003e\n\u003cp\u003e如果是vmware或hyper-v虚拟windows系统,不管是虚拟化软件本身,还是其中的子系统,都要支付许可费用。\n如果是vmware或hyper-v虚拟linux,虚拟化软件本身要支付许可费用,子系统可以用linux来节省成本。\n如果是xen或kvm虚拟windows,其中的子系统要支付许可费用。\n如果是xen或kvm虚拟linux,那么虚拟化软件本身和其中的子系统无需产生任何费用。\u003c/p\u003e\n\u003cp\u003e从性能上来讲,虚拟windows,如果都能得到厂商的支持,那么,性能优化可以不用担心。这几款软件全都能达到主系统至少80%以上的性能(磁盘,CPU,网络,内存),这时建议使用hyper-v来虚拟windows,微软自身的产品,虚拟windows是绝对有优势的。如果是虚拟linux,建议首先使 …\u003c/p\u003e"
December 11, 2011
“remote:error:refusing to update checked out branch:refs/heads/master”的解决办法
"\u003cp\u003e在使用Git Push代码到数据仓库时,提示如下错误:\u003c/p\u003e\n\u003cp\u003e[remote rejected] master -\u0026gt; master (branch is currently checked out)\u003c/p\u003e\n\u003cp\u003e错误原型\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eremote: error: refusing to update checked out branch: refs/heads/master\u003c/p\u003e\n\u003cp\u003eremote: error: By default, updating the current branch in a non-bare repository\u003c/p\u003e\n\u003cp\u003eremote: error: is denied, because it will make the index and work tree inconsistent\u003c/p\u003e\n\u003cp\u003eremote: error: with what you pushed, and will require ‘git reset –hard’ to match\u003c/p\u003e\n\u003cp\u003eremote: error: the work tree to HEAD.\u003c/p\u003e\n\u003cp\u003eremote: error:\u003c/p\u003e"
November 29, 2011
raid演示flash
"\u003cp\u003e本文件为exe格式的.点击下载: \u003ca href=\"/wp-content/uploads/2011/10/raid.exe\"\u003ehttp://blog.haohtml.com/wp-content/uploads/2011/10/raid.exe\u003c/a\u003e\u003c/p\u003e"
November 13, 2011
关于Linux操作系统源代码查看工具的介绍
"\u003cp\u003ea、Windows系统可以用Source Insight,Linux系统可以用Source Navigator。\u003c/p\u003e\n\u003cp\u003eb、vim或emacs编辑器,配合cscope、ctags、etags等交叉索引工具。\u003c/p\u003e\n\u003cp\u003ec、vim或emacs编辑器,配合grep、egrep等文本搜索工具,不过最好要对源代码目录结构有所熟悉\u003c/p\u003e\n\u003cp\u003ed、LXR,以网页的形式通过浏览器浏览,安装复杂(debian下安装容易,请版面搜寻lxr)\u003c/p\u003e\n\u003cp\u003ee、GNU global,可以在命令行用,也可以生成hypertext,类似lxr,但更省事。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/11/source_insight+key.zip\"\u003eSource Insight3.5(含Key)下载\u003c/a\u003e\u003c/p\u003e"
October 13, 2011
SecureCRT远程ssh使VIM语法加亮
"\u003cp\u003e使用SecureCRT登录linux服务器用VIM时显示彩色语法高亮的方法\u003c/p\u003e\n\u003cp\u003e1:在$HOME 目录下 vim ~/.vimrc 建立一个文件\n2:在最后面添两句:syntax on 和 set nocp ,然后保存\n3:在SecureCRT中设置 选项-\u0026gt;会话选项-\u0026gt;终端-\u0026gt;仿真-\u0026gt;终端:Linux\n4:重新登录linux服务器,打开 vim,现在就可自动对语法进行加亮了。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/10/vim.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/10/vim.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e"
July 27, 2011
修改window下dos窗口的编码为utf8
"\u003cp\u003e在中文Windows系统中,如果一个文本文件是UTF-8编码的,那么在CMD.exe命令行窗口(所谓的DOS窗口)中不能正确显示文件中的内容。在默认情况下,命令行窗口中使用的代码页是中文或者美国的,即编码是中文字符集或者西文字符集。\u003c/p\u003e\n\u003cp\u003e如果想正确显示UTF-8字符,可以按照以下步骤操作:\u003c/p\u003e\n\u003cp\u003e1、打开CMD.exe命令行窗口\u003c/p\u003e\n\u003cp\u003e2、通过 chcp命令改变代码页,UTF-8的代码页为65001\u003c/p\u003e\n\u003cp\u003echcp 65001\u003c/p\u003e\n\u003cp\u003e执行该操作后,代码页就被变成UTF-8了。但是,在窗口中仍旧不能正确显示UTF-8字符。\u003c/p\u003e\n\u003cp\u003e3、修改窗口属性,改变字体\u003c/p\u003e\n\u003cp\u003e在命令行标题栏上点击右键,选择”属性”-\u0026gt;”字体”,将字体修改为True Type字体”Lucida Console“,然后点击确定将属性应用到当前窗口。\u003c/p\u003e\n\u003cp\u003e这时使用type命令就可以显示UTF-8文本文件的内容了:\u003c/p\u003e\n\u003cp\u003etype filename.txt\u003c/p\u003e\n\u003cp\u003e4、通过以上操作并不能完全解决问题,因为显示出来的内容有可能不完全。可以先最小化,然后最大化命令行窗口,文件的内容就完整的显示出来了。\u003c/p\u003e"
June 29, 2011
如何查看自己的电脑是否是64位?
"\u003cp\u003e\u003cstrong\u003e2种方式:\u003c/strong\u003e\n一、开始>运行中输入“cmd”,然后在命令提示符窗口中输入“\u003cstrong\u003esysteminfo\u003c/strong\u003e”,如果您的系统是64位的,会在\n“OS 名称: Microsoft Windows XP Professional” 一行后明确标示出“x64 Edition”,否则您的系统就是32位的。\u003c/p\u003e\n\u003cp\u003e这个命令比较实用的,值很收藏.\u003c/p\u003e\n\u003cp\u003e二、开始\u0026gt;运行中输入“winver”,如果您的系统是64位的,同样会明确标示出“x64 Edition”。\u003c/p\u003e"
June 15, 2011
Ping 出现:TTL expired in transit
"\u003cp\u003e今天发现电信送的一条固定IP地址出现问题,查确认属于是他们私自更改了我们的IP地址.电话通知电信大客经理…在下午接通知,已经改好!\n我觉得还是自已测试一下,不能太相信别人的话,因此我通知他们稍等下.\n1、我先PING了一下IP地址,结果发现:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eC:\\Documents and Settings\\xm_dengwh\u0026gt;ping 218.xxx.xxx.xxx (这里是我们的IP地址)\u003c/p\u003e\n\u003cp\u003ePinging 218.xx.xx.xx with 32 bytes of data:\u003c/p\u003e\n\u003cp\u003eReply from 218.85.151.173: TTL expired in transit.\nReply from 218.85.151.173: TTL expired in transit.\nReply from 218.85.151.173: TTL expired in transit.\nReply from 218.85.151.173: TTL expired in transit.\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e需要注意的是: 我的IP地址:218.xxx.xxx.xxx和218.85.151.173不同.\u003c/p\u003e\n\u003cp\u003e不是正常 …\u003c/p\u003e"
June 8, 2011
10款对开发者有帮助的Android应用
"\u003cp\u003e这次收集的应用是准备给开发者的,相信对你会非常有帮助。\u003c/p\u003e\n\u003cp\u003e10款对开发者有帮助的Android应用,列表如下:\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"1-remote-desktop-client\"\u003e\u003ca href=\"http://www.androlib.com/android.application.com-xtralogic-android-rdpclient-jFAx.aspx\"\u003e1. Remote Desktop Client\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e该款应用帮你连接你的Windows电脑。\n\u003cimg src=\"http://static.oschina.net/uploads/img/201106/08084655_4vVm.jpg\" alt=\"Remote Desktop Client\"\u003e\u003c/p\u003e\n\u003ch3 id=\"2-andftp\"\u003e\u003ca href=\"http://www.androlib.com/android.application.lysesoft-andftp-zjz.aspx\"\u003e2. AndFTP\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFTP/SFTP客户端。\u003cimg src=\"http://static.oschina.net/uploads/img/201106/08084658_NY9e.jpg\" alt=\"AndFTP\"\u003e\u003c/p\u003e\n\u003ch3 id=\"3-manalytics\"\u003e\u003ca href=\"http://www.androlib.com/android.application.com-mugitek-analytics-pmB.aspx\"\u003e3. mAnalytics\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e查看你的项目的GA分析数据。\n\u003cimg src=\"http://static.oschina.net/uploads/img/201106/08084658_QJoE.png\" alt=\"mAnalytics\"\u003e\u003c/p\u003e\n\u003ch3 id=\"4-touchqode\"\u003e\u003ca href=\"http://www.androlib.com/android.application.com-touchqode-editor-qEFEF.aspx\"\u003e4. touchqode\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e在手机上查看和编辑源码,包括语法高亮、自动完成,整合FTP/SFTP。\n\u003cimg src=\"http://static.oschina.net/uploads/img/201106/08084659_4BIq.png\" alt=\"touchqode\"\u003e\u003c/p\u003e\n\u003ch3 id=\"5-android-web-editor-lite\"\u003e\u003ca href=\"http://www.androlib.com/android.application.com-webeditlite-app-xtCqD.aspx\"\u003e5. Android Web Editor Lite\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e同上面的Android应用类似,具有常用特性的代码编辑器。\n\u003cimg src=\"http://static.oschina.net/uploads/img/201106/08084700_EgZx.jpg\" alt=\"Android Web Editor\"\u003e\u003c/p\u003e\n\u003ch3 id=\"6-connectbot\"\u003e\u003ca href=\"http://www.androlib.com/android.application.org-connectbot-BDC.aspx\"\u003e6. ConnectBot\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e开源的SSH客户端。\n\u003cimg src=\"http://static.oschina.net/uploads/img/201106/08084701_G2cN.png\" alt=\"ConnectBot\"\u003e\u003c/p\u003e\n\u003ch3 id=\"7-phoenix-mysql-client\"\u003e\u003ca href=\"http://www.androlib.com/android.application.com-yazan-msc-qnDtx.aspx\"\u003e7. Phoenix MySql Client\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e该应用提供与MySQL Server的直接连接,执行SQL查询。另外一款MySQL客户端 for Android是 \u003ca href=\"http://www.androlib.com/android.application.org-androidakebulanmysql-zpxii.aspx\"\u003e付费\u003c/a\u003e 的。\n\u003cimg src=\"http://static.oschina.net/uploads/img/201106/08084702_hjHi.png\" alt=\"Phoenix MySql Client\"\u003e\u003c/p\u003e\n\u003ch3 id=\"8-magic-color-picker\"\u003e\u003ca href=\"http://www.androlib.com/android.application.com-siyusong-android-color-picker-jEFm.aspx\"\u003e8. Magic Color Picker\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e调色板/颜色提取器,支持不同的模式。\n\u003cimg src=\"http://static.oschina.net/uploads/img/201106/08084702_ZdS1.jpg\" alt=\"Magic Color Picker\"\u003e\u003c/p\u003e\n\u003ch3 id=\"9-jquery-mobile-docs\"\u003e\u003ca href=\"http://www.androlib.com/android.application.com-jquerymobiledocs-xqEBj.aspx\"\u003e9. jQuery Mobile docs\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ejQuery Mobile 文档,支持离线使用。地址:http://jquerymobile.com。\n\u003cimg src=\"http://static.oschina.net/uploads/img/201106/08084703_iKT6.jpg\" alt=\"jQuery Mobile docs\"\u003e\u003c/p\u003e\n\u003ch3 id=\"10-w3c-cheatsheet\"\u003e\u003ca href=\"http://www.androlib.com/android.application.org-w3c-mwi-cheatsheet-jqEFx.aspx\"\u003e10. …\u003c/a\u003e\u003c/h3\u003e"
April 21, 2011
中文网络协议图
"\u003cp\u003e学习网络技术,研究网络分析,都必须学习好网络协议,如果有一份详细的网络协议图,会非常有帮助的。下面是我在 \u003ca href=\"http://www.colasoft.com.cn/\"\u003e科来软件\u003c/a\u003e 看到的两份网络协议图,觉得很不错,转到这里,希望大家有所帮助。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e中文TCP/IP网络协议图(点击图片看大图)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/04/TCP-IP.gif\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/TCP-IP-211x300.gif\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e中文网络协议图(点击图片下载pdf格式协议图)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/04/network__protocol__map-300x187.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/network__protocol__map-300x187.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/04/network_protocol_map.zip\"\u003enetwork_protocol_map\u003c/a\u003e\u003c/p\u003e"
April 20, 2011
2011数据库技术大会演讲PPT下载(pdf版)
"\u003cp\u003e关于大会的更多精彩照片,请点击以下链接。(更新2011.4.16)\n\u003cstrong\u003e2011数据库技术大会现场图片,能找到你自己不?\u003c/strong\u003e\n\u003ca href=\"http://bbs.chinaunix.net/thread-2305667-1-1.html\"\u003ehttp://bbs.chinaunix.net/thread-2305667-1-1.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e2011数据库技术大会胜利结束了,非常感谢大家积极的参与支持。\n这次大会DBA相关的技术工程师达到了近700人,加上庞大的出版社、赞助商等参与者,大会总人数接近800人。会上再次汇集了国内各个领域的数据库技术工程师。\n这已经是第二届数据库技术大会了,如果算上下半年的架构师大会,就可以算作第4届由我们组织的技术大会了。经过这两年的发展,突然发现:DTCC、SACC真的成为了一个品牌。\n在第一届数据库技术大会中,有来自各个行业的技术工程师,例如,银行、证券、保险、电信、医疗、教育、制造业、物流、互联网等行业,不过,在这些行业中,互联网企业的占比较大。今年,这个行业比较有了一定的变化,那就是:教育、制造业、医疗、银行等行业的参与者的比重有明显的增加。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e职业比例的问题\u003c/strong\u003e\n数据库技术大会从名字上看,定位的人群就是DBA。另一方面,在一个企业中,纯DBA在企业的技术工程师中,占比不超 …\u003c/p\u003e"
March 3, 2011
JQuery中的ready和js中onload加载优先级问题
"\u003cp\u003eJQuery中的$(function(){})和js中onload,谁先加载?\u003c/p\u003e\n\u003cp\u003e在$(document).ready()执行时,整个DOM文档树已经解析完成,即各个DOM元素都已经可以访问了(但是对于某些元素的某些属性此时访问可能还不精确,如图片的宽度高度)。$(function(){})在根据需要放置位置,可能在ready之前,可以在其之后。\u003c/p\u003e\n\u003cp\u003eonload需要页面上所有的资源都加载上之后执行,而ready则是DOM文档树已经解析完成时,说ready比onload快最显著的是比如一个页面上有一个很大的图片,加载要好久,onload只有在图片加载完成之后执行,而ready不必等图片加载完成.\u003c/p\u003e\n\u003cp\u003e而且一些人所说的向document添加load事件 是完全不可能的。\u003c/p\u003e\n\u003cp\u003edocument准备之前是添加不进onload的,而且在document准备之后加onload是不会执行的。所以,document的onload只在html中声明有时才有用,动态加进去的一般是没用的。\u003c/p\u003e\n\u003cp\u003e因此要想实现页面加载时的loading效果,一般是在节点里面第一个位置添加div覆盖窗口,然后在或者onload里面把覆盖层移除。 …\u003c/p\u003e"
February 28, 2011
Windows 和 Linux 下生成以当前时间命名的文件
"\u003cp\u003e在 Windows、Linux 操作系统,分别利用BAT批处理文件和Shell脚本,生成类似“20110228_082905.txt”以“年月日_时分秒”命名的文件。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWindows BAT批处理文件:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e@echo off\nset time_hh=%time:~0,2%\nif /i %time_hh% LSS 10 (set time_hh=0%time:\u003cdel\u003e1,1%)\nset filename=%date:\u003c/del\u003e,4%%date:~5,2%%date:~8,2%_%time_hh%%time:~3,2%%time:~6,2%\necho test \u0026raquo; %filename%.txt\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003eLinux Shell 脚本:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#!/bin/sh\necho test \u0026raquo; $(date -d “today” +”%Y%m%d_%H%M%S”).txt\u003c/p\u003e\u003c/blockquote\u003e"
February 22, 2011
“2004错误:无法打开服务器服务,服务器性能数据将不会被返回”的解决办法
"\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/02/c08446b4c04fd36b8ad4b2df.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/c08446b4c04fd36b8ad4b2df.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e服务器出现错误,一时摸不着头脑,google……..解决方法 : 修改注册表禁用PerfNet性能计数器,批处理如下\u003c/p\u003e\n\u003cp\u003ereg add HKLMSYSTEMCurrentControlSetServicesPerfNetPerformance /v “Disable Performance Counters” /t REG_DWORD /d 1 /f\u003cstrong\u003e相关文章:\u003c/strong\u003e\u003ca href=\"http://hi.baidu.com/newshow/blog/item/4a1869cb49e7a911bf09e6e6.html\"\u003ehttp://hi.baidu.com/newshow/blog/item/4a1869cb49e7a911bf09e6e6.html\u003c/a\u003e\u003c/p\u003e"
February 10, 2011
Chrome不能访问更新服务器(错误:3) 的解决办法
"\u003cp\u003e听说chrome升级版本到9了,在家升级的时候发现正常的,但在公司升级的时候发现提示”\u003cem\u003e不能访问更新服务器\u003c/em\u003e( \u003cem\u003e错误:3\u003c/em\u003e)“,在网上找了一下,发现了下面的解决办法.\u003c/p\u003e\n\u003cp\u003e下面是解决办法:\nThis fixed my error 3 problem (this is for winxp, the folder for vista would be c:\\users\\appdata\\local\\google\\update):open a command prompt, and type in the following (after replacing with your username):cd “C:\\Documents and Settings\\Local Settings\\Application Data\\Google\\Update\\”Then run:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eGoogleUpdate.exe /RegServer\u003c/p\u003e\u003c/blockquote\u003e"
January 19, 2011
asp实现QQ号状态和QQ秀
"\u003cp\u003e原理基于Xmlhttp查询\u003cstrong\u003e\u003ca href=\"http://webpresence.qq.com/getonline?qq=QQ\"\u003ehttp://webpresence.qq.com/getonline?qq=QQ\u003c/a\u003e\u003c/strong\u003e 号\u003c/p\u003e\n\u003cp\u003e如果在线将返回1为在线,0为不在线。 好了,\u003c/p\u003e\n\u003cp\u003e或者:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e定义online数组,必须是online命名\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e获取在线状态\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e可以获取多个,必须以冒号分隔,以冒号结尾,比如:\u003c/p\u003e\n\u003cp\u003eonline[0]=0,表示271569542离线\u003c/p\u003e\n\u003cp\u003eonline[1]=1,表示78293657在线\u003c/p\u003e\n\u003cp\u003eonline[2]=1,表示123456在线\u003c/p\u003e\n\u003cp\u003e填写号码的先后顺序,分别对应数组online的0、1、2\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eQQ秀怎么返回那\u003c/p\u003e\n\u003cp\u003e这个地址http://qqshow-user.tencent.com/\u003c/p\u003e\n\u003cp\u003e是显示QQ秀的\u003c/p\u003e\n\u003cp\u003e下面来实现\u003c/p\u003e\n\u003cp\u003e程序部分\u003c/p\u003e\n\u003cp\u003e以下是代码片段:\u003c/p\u003e\n\u003cp\u003eif request(“q”)\u0026lt;\u0026gt;”” then\u003c/p\u003e\n\u003cp\u003edim q,url,result\u003c/p\u003e\n\u003cp\u003eq=request(“q”)\u003c/p\u003e\n\u003cp\u003eurl = “http://webpresence.qq.com/getonline?qq=”\u0026amp; q\u003c/p\u003e\n\u003cp\u003eresult=getHTTPPage(url)\u003c/p\u003e\n\u003cp\u003eif result = 1 then\u003c/p\u003e\n\u003cp\u003eresult=”当前在线” …\u003c/p\u003e"
December 24, 2010
web高性能及运维大会(O’Reilly Velocity China 2010)视频全集
"\u003cp\u003e\u003ca href=\"http://www.youku.com/playlist_show/id_5333814.html\"\u003ehttp://www.youku.com/playlist_show/id_5333814.html\u003c/a\u003e\u003c/p\u003e"
December 18, 2010
dos下的延时命令
"\u003cblockquote\u003e\n\u003cp\u003erem 等待5分钟\nping -n 300 127.1 \u0026gt;nul 2\u0026gt;nul\necho 时间到\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e或者\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eping 127.0.0.1 -n 5000\u0026gt;nul\u003c/p\u003e\u003c/blockquote\u003e"
December 4, 2010
vmware tools installation cannot be started manually while easy install…的解决办法
"\u003cp\u003e解决方法:\u003c/p\u003e\n\u003cp\u003e在开启虚拟机操作系统的情况下,在虚拟机设置中更改floppy为auto detect。然后点击菜单中的安装VMWare Tools,虚拟操作系统中的光驱里就会有VMWare Tools的安装程序了,自行安装即可\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/12/VMware-Tools-installation.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/12/VMware-Tools-installation.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e"
December 3, 2010
如何安装电脑主题
"\u003cp\u003e\u003cstrong\u003e主题一般有两种:\u003c/strong\u003e\n一种叫WindowBlinds主题(简称WB主题,文件格式:*.wba),\n另一种叫Visual Styles主题(简称VS主题,文件格式:*.theme文件和*.msstyles文件)。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eVisualStyles主题\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e为Windows风格文件,也就是主题文件,该类型文件,无需加载任何软件,只要破解了Uxtheme.dll文件,即可直接使用。\n在正常的情况下.theme文件和.msstyles文件都是系统默认关联的,也就是说双击这两种文件系统都会自动在显示属性中打开,大家可以利用这一点在安装之前先预览该主题或者风格。\u003c/p\u003e\n\u003cp\u003e附图参考:\n\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/12/windows_theme.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/12/windows_theme.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e第一种情况:有 .theme 主题文件\u003c/p\u003e\n\u003cp\u003e这种情况是最容易安装的了,只要保持原主题的目录结构,将 .theme 文件和文件夹复制到 X:\\WINDOWS\\Resources\\Themes\\ 目录下就完成安装了。举个最简单的例子,在网上下载了一个主题,假定这个主题名叫“Dogmax”,那么安装后应该是这样的目录结构:\u003c/p\u003e\n\u003cp\u003eX:\\WINDOWS\\Resources\\Themes\\Dogmax.theme (可无) …\u003c/p\u003e"
December 2, 2010
高效时间管理,加速你的工作-介绍GTD
"\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/12/gtd-cover1.gif\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/12/gtd-cover1.gif\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e人说在IT公司没有不忙的。你会发现每天RTX要闪烁几十个对话框是再正常不过的事情。可能你正好在写一个ppt,同时领导安排今天必须出一封邮件,刚在酝酿的时候突然还会有人电话催你开会,离开时刚好还有个朋友在QQ上请求帮忙找回密码,每天周而复始,逢人遍说忙似乎成了流行的口头禅。你会发现,时间永远也不够用,每天永远都有着“做不完”的事情。带着和所有人共同的问题,我了解了时间管理的方法论:GTD。下面我会带着一些自己的理解、更加直白的介绍一下GTD。\u003c/p\u003e\n\u003cp\u003eGTD就是Get Thing Done的缩写,翻译过来就是“把事情做完”,David Allen这本书的中文名叫:《尽管去做》。GTD的核心理念概括一句话,就是:你必须记录下来你要做的事,然后整理安排自己一一去执行了。说起来简单,做起来不容易,我们看一下GTD的五个核心原则是:收集、整理、组织、回顾、执行。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/12/gtd-principle.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/12/gtd-principle.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e先记住这五个原则的先后顺序。\u003c/p\u003e\n\u003cp\u003e一、人类的大脑很强大,能存储很多东西,但让一个成年人回忆起所有童年的事情,很难。与其让大脑存放了这么多信息,不如把信息从脑海里拿出来记在纸上, 让大脑释放出来去思考如何做一件成功的事。所以,GTD的第一步是“收 …\u003c/p\u003e"
December 2, 2010
从Godaddy转移域名到name.com
"\u003cp\u003e国内转移域名不仅手续繁琐而且需要额外支出,跟国外域名商之间转移域名的快捷方便一比较,你就会觉得国内域名商的落后、不思进取。\u003c/p\u003e\n\u003cp\u003e刚将一个域名从\u003ca href=\"http://godaddy.com/\"\u003eGodaddy\u003c/a\u003e转出到\u003ca href=\"http://name.com/\"\u003ename.com\u003c/a\u003e,花费的时间仅为一个小时。我对国内域名商的落后与不思进取的感受更深了。\n\u003ca href=\"http://bingu.net/wp-content/images/200906/mail.png\"\u003e\u003cimg src=\"http://bingu.net/wp-content/images/200906/_mail.png\" alt=\"从Godaddy转移域名到name.com\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e以下是转移的过程\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e首先,登录并进入Godaddy的域名管理器(Domain Manager)。\u003c/li\u003e\n\u003cli\u003e点击你要转移的域名所对应的后面的小锁。 \u003ca href=\"http://bingu.net/wp-content/images/200906/godaddy00.png\"\u003e\u003cimg src=\"http://bingu.net/wp-content/images/200906/_godaddy00.png\" alt=\"从Godaddy转移域名到name.com\"\u003e\u003c/a\u003e\n在接下来的页面中去掉“Lock Domain”前的小勾,然后点击“OK”。这时域名将去除锁定。\n\u003cimg src=\"http://bingu.net/wp-content/images/200906/godaddy000.png\" alt=\"从Godaddy转移域名到name.com\"\u003e\u003c/li\u003e\n\u003cli\u003e接下来,是“讨Auth Code”\n\u003ca href=\"http://bingu.net/wp-content/images/200906/godaddy001.png\"\u003e\u003cimg src=\"http://bingu.net/wp-content/images/200906/_godaddy001.png\" alt=\"从Godaddy转移域名到name.com\"\u003e\u003c/a\u003e\n点选“(Send by Email)”,几分钟后,你就能收到Godaddy发给你一封带Auth Code的邮件。(是的,就几分钟的事)\u003c/li\u003e\n\u003cli\u003e再来,登录\u003ca href=\"http://name.com/\"\u003ename.com\u003c/a\u003e,并进入\u003ca href=\"http://www.name.com/transfers_in/\"\u003eTransfer Domain Names\u003c/a\u003e(在页脚,你可以看到这个链接)。进去后,填入域名和“Auth Code”并确定。如无意外,点击“Checkout”进行付费(com转移是7.99刀,包括一年的续费,也就是说转移是不收费的,都用来续费了。)。付费后,name.com会发给你一封确定转移域名的邮件,点 …\u003c/li\u003e\u003c/ol\u003e"
November 22, 2010
6个最佳房地产 WordPress 主题
"\u003cp\u003eWordPress 并不是一个简单的博客程序,它能干的事情非常多。如果你是一个地产中介,想通过互联网出售房子,那么你也可以通过 WordPress 来实现,是的,选择一个适合房地产的 WordPress 主题,就会让你事半功倍,并且现在网络上有非常多的和房地产相关的 WordPress 主题,并且还集成了房地产相关的功能(如位置,价格,大小,几房几厅,经纪人,代理等)。所以今天就给大家介绍下5个非常不错的房地产相关的 WordPress 主题。\u003c/p\u003e\n\u003cp\u003e本文翻译自 \u003ca href=\"http://theme10.com/best-real-estate-wordpress-themes/\" title=\"Permalink to 14 Real Estate WordPress Themes\"\u003e14 Real Estate WordPress Themes\u003c/a\u003e,原文有 14 个房地产相关的 WordPress 主题,这里节选其中最好的 6 个。\u003c/p\u003e\n\u003ch2 id=\"1-estate-by-woothemes-estate-是一个非常强大的但是管理非常方便的适合房地产中介-wordpress-主题这个主题使用了-wordpress-30-开始的自定义日志类型和自定义分类模式这些高级功能使得在-wordpress-后台能够有个真正的房地产的功能并且灵活的页面模板高级搜索功能以及集成了-google-地图灵活的房地产图片管理你会发现这款主题是非常值得取用的\"\u003e1. Estate (by \u003ca href=\"http://www.woothemes.com/amember/go.php?r=1023\u0026amp;i=l1\"\u003eWoothemes\u003c/a\u003e) \u003ca href=\"http://www.woothemes.com/amember/go.php?r=1023\u0026amp;i=l80\"\u003eEstate\u003c/a\u003e 是一个非常强大的,但是管理非常方便的适合房地产中介 WordPress 主题,这个主题使用了 WordPress 3.0 开始的自定义日志类型和自定义分类模式这些高级功能,使得在 WordPress 后台能够有个真正的“房地产”的功能,并且灵活的页面模板高级搜索功能,以及集成了 Google 地图,灵活的房地产图片管理,你 …\u003c/h2\u003e"
September 28, 2010
PuTTY中文乱码的解决办法
"\u003cp\u003e打开putty,选择 Category中的Windows---\u0026gt;Appearance---\u0026gt; Font settings\n把”字体”改为”Fixedsys”(或者其他中文字体),字符集为CHINEASE_GB2312\u003c/p\u003e\n\u003ch2 id=\"怎么还是乱码\"\u003e怎么还是乱码?\u003c/h2\u003e\n\u003cp\u003e如果还是乱码的话,就执行以下命令,看看系统的字符集\necho $LANG $LANGUAGE\u003c/p\u003e\n\u003cp\u003e哦,原来系统的字符集是 UTF-8 呀。重新返回上面选择字符集的那一步, 选择配置窗口左边的 Translation,在右边的 Received data assumed to be in which character set 下拉列表中选择“UTF-8”\u003c/p\u003e\n\u003cp\u003e下99%的情形下,汉字是不会有乱码了。最后,总之一下 PuTTY 中乱码的解决办法:\n先看看系统的字符集,如果是 UTF-8 的,那就简单了,选择好中文字体,然后编码选择 UTF-8 就行了。\n如果编码是 GB2312、GBK、GB18030,当然也包括 BIG5这些,在 PuTTY 的编码选择中看不到这些编码,那就选择最后一个“Use font encoding”,绝大部分情况下这样就没啥问题 …\u003c/p\u003e"
September 17, 2010
doc批处理命令检测网络通讯情况
"\u003cblockquote\u003e\n\u003cp\u003e@set i=0\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e@:a\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eping 192.168.0.59\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e@if %ERRORLEVEL%==0 goto 3\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003etimeout /T 15\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e@goto a\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e@:3\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewrite.exe\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eexit\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e@set i=0 @:aping 203.171.226.59@if %ERRORLEVEL%==0 goto 3timeout /T 15@goto a@:3write.exeexit\u003c/p\u003e\u003c/blockquote\u003e"
September 14, 2010
技嘉主板dos无法识别 USB键盘鼠标的解决办法
"\u003cp\u003e电脑主板坏了,cpu为intel P4的,老早的板子了,暂时也找不到同型号的板子,折腾了多半个月也没有修好。狠狠心,把主板和cpu全换了,主板用的是技 \u003ca href=\"http://detail.zol.com.cn/motherboard/index168668.shtml\" title=\"技嘉 GA-P43-ES3G(rev.1.0)\"\u003e技嘉 GA-P43-ES3G(rev.1.0)\u003c/a\u003e ,cpu用的是e7500的,不算高不过已经够用了,还加了一个二手的显卡还不错的。不过在电脑启动的时候发现自己的usb键盘无法识别到,进入到系统里才能识别到了,后来查了查,原来主板支持这些的,只是在bios里给关闭了,只需要开启一下就可以了,方法如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e进入bios-Integratted Peripherals 子项下:\nUSB 1.0 Controller 设置为Enabled\nUSB 2.0 Controller 设置为Enabled (启动内建USB控制器)\nUSB key Function 设置为Enabled (支持DOS下USB键盘)\nUSB mouse Function 设置为Enabled (支持DOS下USB鼠标)\n\nF10保存,退出。\n\u003c/code\u003e\u003c/pre\u003e"
September 9, 2010
Firefox的wap插件:Firefox也能伪装成手机用户访问wap网站
"\u003cp\u003e要想Firefox能正常解析手机的wap网站,首先需要安装wml解析插件wmlbrowser。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ewmlbrowser 0.7.13\u003c/strong\u003e \u003ca href=\"https://addons.mozilla.org/en-US/firefox/addon/62\"\u003ehttps://addons.mozilla.org/en-US/firefox/addon/62\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e另外许多程序对来访者的user-agent进行了判断,所以还需要安装自定义user-agent的插件User Agent Switcher。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eUser Agent Switcher 0.6.10\u003c/strong\u003e \u003ca href=\"https://addons.mozilla.org/en-US/firefox/addon/59\"\u003ehttps://addons.mozilla.org/en-US/firefox/addon/59\u003c/a\u003e 安装好以上两个插件后,重启Firefox,然后工具-\u0026gt;User Agent Switcher-\u0026gt;OPtions-\u0026gt;User Agents-\u0026gt;Add ,填写在 Description:Wap , User Agent: Symbian 确定 ,最后 工具-\u0026gt;User Agent Switcher-\u0026gt; 选中刚设定的 Wap ,即可畅通无阻的浏览Wap站啦 !\u003c/p\u003e\n\u003cp\u003e用了这些插件后,你就能模拟手机用户访问wap网站了(尤其对一些同时支 …\u003c/p\u003e"
August 28, 2010
Windows 2003 关机时如何去掉讨厌的关机原因提示
"\u003cp\u003e每次需要关闭系统时,Win2003系统总是“多此一举”,要你选择关机原因,一次两次还能忍受,可是时间长了,真是讨厌它,现在决定将它删除 掉:\u003c/p\u003e\n\u003cp\u003e1.打开开始菜单中的运行对话框,输入组策略编辑命令“gpedit.msc”,打开组策略编辑窗口;\u003c/p\u003e\n\u003cp\u003e2.在该窗口中,依次展开“计算机配置”、“管理模板” 、“系统”目录,在对应的右边子窗口中,双击“关闭事件跟踪程序”选项;\u003c/p\u003e\n\u003cp\u003e3.在随后打开的设置界面中,将“已禁用”选项选中就可以了。\u003c/p\u003e"
May 23, 2010
dede织梦启用二级域名多站点图片url错误不显示的解决方法
"\u003cp\u003e前些天用dede做了个女性资讯站点http://www.yuerong.info ,之后启用了二级域名,发布文章的时候发现图片不显示,图片路径错误,发现许多网友也遇到这个问题,特将我的解决方法公布.这里提供两种解决办法.\u003c/p\u003e\n\u003cp\u003e第一种,也就最简单的方法,在和之间加入如下代码\u003c/p\u003e\n\u003cp\u003e但这种方法也有它的缺点,就是所有的相对路径前面都会加上上面的域名,这会导致文章页分页时发生错误.\u003c/p\u003e\n\u003cp\u003e第二种,需要修改dede的源码,是在目录include下的文件extend.func.php增加一个函数,函数的代码如下:\u003c/p\u003e\n\u003cp\u003efunction replaceurl($newurl)\u003c/p\u003e\n\u003cp\u003e{\u003c/p\u003e\n\u003cp\u003e$newurl=str_replace(‘/uploads’,’http://www.yuerong.info/uploads’,$newurl);\u003c/p\u003e\n\u003cp\u003ereturn $newurl;\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003e把代码中的域名替换成你的.另外调用文章正文内容的标签还需要改成 \u003cstrong\u003e{dede:field name=’body’ function=’replaceurl(@me)’/}\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e如果按照上面的方法还没有解决或者修改遇到困难,欢迎留言提出您的问题,我们共同讨论!\u003c/p\u003e"
May 11, 2010
分享一个chm转html格式的软件,绿色免安装
"\u003cp\u003e可以很方便的把CHM反编译成HTML格式的文件,包括里面的附件,生成的文件按照目录结构组织,可以再次编译成CHM格式。本站提供的为绿色版,不需要注册码。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2010/05/chmencoder.rar\"\u003e点击下载\u003c/a\u003e\u003c/p\u003e"
May 11, 2010
超级文本批量替换5.0
"\u003cp\u003e今天用对一些html里面的源代码进行替换,刚开始用的是”Advanced Find and Replace”这个软件,后来在替换另一个文件夹里的网页代码的时候,就是找不到要替换的内容,但打开源代码看了一下明明有的,后来一看编码是utf-8编码的,怀疑是网页编码的问题,于是从网上下载了一个"文本批量替换专家"这个软件,试了一下也不行.正准备放弃的时候,发现了"超级文本批量替换"这个软件,且还支持utf-8编码,下载到本地,测试一下,确实不错,前两个软件都没有办法替换的文本,用这个软件一会就给搞定了,看了一下,发现比前两个软件功能方面要强一些的.于是在这里提供给大家下载使用. \u003ca href=\"/wp-content/uploads/2010/05/ultrareplace.rar\"\u003e点击下载\u003c/a\u003e\u003c/p\u003e"
April 28, 2010
一个朋友去新浪乐居面试时的面试题(PHP)
"\u003cp\u003e以下是他回忆当时的笔试题\u003c/p\u003e\n\u003cp\u003e一、\u003c/p\u003e\n\u003cp\u003e1、有如下HTML:\u003c/p\u003e\n\u003cp\u003e1)用js取得________方法取得该对象;\u003c/p\u003e\n\u003cp\u003e2)用________属性取得属性title的属性值;\u003c/p\u003e\n\u003cp\u003e3)用________方法取得属性sina_title的属性值;\u003c/p\u003e\n\u003cp\u003e2、php中对数组序列化和反序列化的函数分别是______和_______;\u003c/p\u003e\n\u003cp\u003e3、rawurlencode和urlencode函数的区别是__________________;\u003c/p\u003e\n\u003cp\u003e4、php中过滤HTML的函数是_______,转义的函数是____________;\u003c/p\u003e\n\u003cp\u003e5、写出用正则把HTML中的js脚本过滤掉;\u003c/p\u003e\n\u003cp\u003e6、SQL中LEFT JOIN的含义是______________;\u003c/p\u003e\n\u003cp\u003e如果有一个表tl_user存储学生ID和名字name,另外一个表tl_score存储学生ID、科目subject和成绩score(有的学生没有考试成绩),写出sql语句打印出学生名字和各科总成绩;\u003c/p\u003e\n\u003cp\u003e7、写出三个调用系统命令的函数;\u003c/p\u003e\n\u003cp\u003e8、josn处理数组的函数是;\u003c/p\u003e\n\u003cp\u003e9、php中判断变量是否被设置是函数是_______;判断是否为空的是___________; …\u003c/p\u003e"
April 12, 2010
vmware 后台运行 如何 切换到前台
"\u003cp\u003e来到新公司以后开始使用VMWare Workstation V6。这个新版本允许在有运行中的虚拟机时切换到后台运行,VMWare不再占用任务栏空间,这个平时不会使用的程序窗口也不会被切换出来。如果在菜单 “编辑”-\u0026gt;“参数”-\u0026gt;标签页“工作区间”中选择了“虚拟机电源打开时显示托盘图标”,被切换到后台的VMWare就会在系统托盘里留下一 个图标,可以用它再将VMWare切换到前台。不过我没有看到过这个图标,想来是我的VMWare并没有安装,而是从一个可执行程序中直接运行的。\u003c/p\u003e"
January 31, 2010
One Number:同时监测 Gmail, Reader, Wave 和 Voice 的 Chrome 扩展
"\u003cp\u003e我相信作为Google的忠实用户,各位的 \u003ca href=\"http://www.google.org.cn/tag/chrome\"\u003eChrome\u003c/a\u003e 上一定安装了若干的Google服务提醒扩展吧:比如 \u003ca href=\"http://www.google.org.cn/posts/sample-chrome-extensions.html\"\u003eGmail的\u003c/a\u003e, \u003ca href=\"http://www.google.com/url?sa=t\u0026amp;source=web\u0026amp;ct=res\u0026amp;cd=1\u0026amp;ved=0CAcQFjAA\u0026amp;url=https%3A%2F%2Fchrome.google.com%2Fextensions%2Fdetail%2Fapflmjolhbonpkbkooiamcnenbmbjcbf\u0026amp;ei=5u84S7S8Ic6HkQWW0N3eDw\u0026amp;usg=AFQjCNGvxsz0kHFIQ1oIrVyAT9MQvmQ5uQ\u0026amp;sig2=f41wiZ4yOqDG8k5fKfbcSw\"\u003eGoogle Reader的\u003c/a\u003e, \u003ca href=\"http://www.google.org.cn/posts/chrome-extension-google-wave-checker.html\"\u003eGoogle Wave的\u003c/a\u003e, \u003ca href=\"http://www.google.org.cn/posts/official-google-voice-chrome-extension.html\"\u003eGoogle Voice的\u003c/a\u003e。。。那么多图标堆在工具栏,看着就头大。。。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2010/01/one_number.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/one_number.jpg\" alt=\"one_number\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://chrome.google.com/extensions/detail/cfkohgkpafhkpdcnfadadcibfboapggi\"\u003eOne Number\u003c/a\u003e 这个扩展正是为了解决这个问题而来,从此我们只需要一个图标就可以查看四个Google服务的未读信息数目了。安装这个扩展后,点击扩展图标跳转到Google输入Google账户用户名和密码即可启用。监视的服务列表,检查频度,未读数显示颜色等等也都可以在扩展的设置中自己设定,相当的方便。另外,One Number的 \u003ca href=\"http://www.google.org.cn/tag/gmail\"\u003eGmail\u003c/a\u003e 提醒也支持使用Google Apps的邮件监视。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://chrome.google.com/extensions/detail/cfkohgkpafhkpdcnfadadcibfboapggi\"\u003e点击这里\u003c/a\u003e 进入One Number在官方Chrome扩展中心的页面,点击INSTALL安装。\u003c/p\u003e"
December 2, 2009
dm分区教程
"\u003cp\u003e\u003cstrong\u003e教程如下:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e硬盘分区是我们曰常维护中必须掌握的一个基本知识,随着大容量硬盘的出现,Fdisk的缺点逐渐显示在我们面前。在分区时,Fdisk已经不能对容量在120G以上的硬盘进行分区操作,而且在对大容量硬盘进行分区操作时,Fdisk的速度让我们难以忍受。\nDM分区软件的出现,解决了这一操作难题,DM最明显的一个特点就是分区速度快,运行多种分区格式。DM虽然问世很久了,并且有很多人在使用,由于分区对新来来说,毕竟是一项高难度的工作,而且DM满脸英文面孔,又增加了学习这个软件的难度。\n目前世面上Windows 98无忧启动盘中,已经附带了DM分区软件。如果没有此软件,可以到网上下载,下载后,将软件放在启动盘中,启动机器后,运行DM就进入了DM分区软件的主菜单(如图一)。\n选择菜单可以使用键盘上的四个方向键(↑→↓←),或者直接点一下开头的键。如图一中,我们要进入Easy Disk Installation菜单,可以直接接一下E。\n[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/dm_1.jpg\" alt=\"dm_1\"\u003e][1]\n(图一)\n一、Easy Disk installatin:硬盘自动分区选项,此项为DM提供的硬盘自动分区选项。选择此选项后,DM会根据你的硬盘容量,自动 …\u003c/p\u003e"
December 2, 2009
Units specified don’t exist SHSUCDX can’t install
"\u003cp\u003e用的是联想thinkpad品牌笔记本的,在dos下用光盘来ghost xp系统的时候,经常出现:Units specified don’t exist SHSUCDX can’t install,然后就没有反映了,试了三张安装盘都不行的,光盘也都没有什么问题的呀,真是奇了怪了!\u003c/p\u003e\n\u003cp\u003e网上有人说用PE进入到系统里,使用里面的ghost来恢复,找了几个安装盘,发现在PE系统里识别不到硬盘,巧的是也没有ghost安装文件,没有办法心想可能是品牌机本本设置的问题,后来在网上baidu了一下,发现了解决的办法,如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eBIOS里面硬盘模式AHCI改为IDE~\n要到BIOS将硬盘的模式改成compatibility模式 就可以装\n\n上面是我参考的网上的回答\n\n我个人意见是品牌机有保护需要在blos里把保护去掉,然后重新格式化硬盘\n\n后来到BIOS里面将硬盘格式改为SATA(据说类似于IDE),重装,OK……搞定\n\n我认为也是这样的,blos里面对硬盘的设置有问题\n\n按以下方法成功解决问题!\n呵呵,这个是问题的最终原因了\n\n主要是sata硬盘驱动无法加载,我也是费了好大的劲才找到这个好东西,非常好用,我 …\u003c/code\u003e\u003c/pre\u003e"
November 20, 2009
利用老毛桃WinPE制作启动U盘安装系统
"\u003cp\u003e最新教程请参考: \u003ca href=\"http://www.laomaotao.net\"\u003e\u003cstrong\u003ehttp://www.laomaotao.net\u003c/strong\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e利用老毛桃WinPE制作一个可启动的U盘安装系统,如果没有老毛桃WinPE,可以到下面地址进行下载:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://73.duote.cn/winpeboot.iso\"\u003ehttp://73.duote.cn/winpeboot.iso\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e下载完后,我们可以将下载后的ISO文件用光驱虚拟器打开,当然,也可以刻成光盘,这就随你意愿了,如图:\n\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2009/11/ubs_boot_1.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/ubs_boot_1.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e我这里是三个可移动媒体,一个是物理光驱,一个是用来制作可启动的U盘,最后一个就是虚拟光驱了,我们可以双击自动运行,如果不能自运行,也可以打开这个虚拟光驱,找到SETUP\\PESetup.EXE文件,运行进行安装,弹出界面:\n\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2009/11/ubs_boot_2.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/ubs_boot_2.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e因为我们要做U盘启动,所以,要选第4项了,输入4,然后回车\n\u003cstrong\u003e下面,就是我们最关键的一步了,设置U盘第一启动,如果这步不会,那就等于前功尽弃了!\u003c/strong\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e首先,将你制作好的可启动U盘插到你的电脑上,然后,进入BIOS进行调整第一引导顺序了,因主板不同,BIOS多少有点区别,以往用光盘装系统,必须调整启动项为光驱启动,而现在我们要用U盘装系统,所以要调整为U盘启动。\u003c/p\u003e\n\u003cp\u003e下面我们举例两个不同bios的调整方法。\u003c/p\u003e\n\u003cp\u003e1、按DEL进入BIOS,进 …\u003c/p\u003e"
October 16, 2009
一台电脑登录多个msn账号的解决办法
"\u003cp\u003emsn默认情况下,一台电脑只允许登录一个msn账号,这对于许多用户都不是太习惯,毕竟现在流行的qq软件可以实现这个功能的,这时您只需要下载一个插件即可,那就是msnshell这个软件,msnshell简介如下:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eMSNShell 是一个为了支持 MSN Messenger 的发展,提供多种扩展服务及功能的免费增强包。MSNShell 为 MSN Messenger 量身定制了多种个性化功能。MSNShell 不但具有客户端定制功能,更扩展了多种附加服务,使用 MSN Messenger 将变得更加有趣。\nMSNShell拥有超过数以千万的使用者,赶快融入到 MSNShell 的大家庭中来吧。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e软件下载地址: \u003ca href=\"http://www.msnshell.net/download.html\"\u003ehttp://www.msnshell.net/download.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e安装完这个软件再次登录msn软件即可。\u003c/p\u003e"
October 6, 2009
用VMWare,在Xp下虚拟Win7
"\u003cp\u003e先说下我电脑的配置——\n处理器:AMD 5000+(黑)\n内存:2G\n硬盘:160G\n显卡:8600GT\n网卡:NF主板自带\n主板:Biostar T550 SE\u003c/p\u003e\n\u003cp\u003e————————————————我是过度的分割线—————————————\u003c/p\u003e\n\u003cp\u003e终于下完了Win7_7000的ISO文件,不过鉴于电脑中已经有了Win7的其他版本,还是先用虚拟机看看7000版本中,Win7是否有什么不一样的地方\u003c/p\u003e\n\u003cp\u003e我使用的虚拟机是VMWare6.5版本,VMware虚拟机用的很习惯,而且汉化版本和破解程度也很好,在网上的资源很多,推荐刚刚接触虚拟机的XDJM们用。\u003c/p\u003e\n\u003cp\u003e适合用虚拟机的人群:\u003c/p\u003e\n\u003cp\u003e1、懒人,只想尝鲜;\n2、系统配置不好,新系统跑起来巨慢的\n3、没事做系统评测的闲人(仅指我)\u003c/p\u003e\n\u003cp\u003e————————————————我是教程的分割线—————————————\u003c/p\u003e\n\u003cp\u003e一、VMWare创建虚拟机:\u003c/p\u003e\n\u003cp\u003e1、首先,创建一个新的虚拟机,如下图点击\n\u003cimg src=\"http://img.pconline.com.cn/images/bbs4/200812/31/1230722751200.jpg\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e2、点击下一步,在我们按照向导来规划虚拟机,当然有经验的也可以使用“用户模式”,因为里面对内存等硬件有额外的配置过程,我在这里面按照向导来\u003c/p\u003e\n\u003cp\u003e3、选择想要虚拟的操作系统,其实怎么选都可以,只 …\u003c/p\u003e"
September 26, 2009
怎样调整输入法顺序
"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e调整调出输入法的顺序,下面的方法均可:\n1.修改注册表法:\n在注册表编辑器(在“开始/运行”对话框中输入“REGEDIT”)中展开:“HKEY_CURRENT_USER\\Keyboard Layout\\Preload”分支,可看到名为”1”、”2”、”3”…的文件夹,它们分别顺序对应输入法菜单中的各项输入法。假设当前输入法菜单中,全拼对应的文件名是2,智能ABC对应的文件名是5,可先将5改为6(点右键选“重命名”即可修改),然后将2改为5,再将6改为2,最后重启系统。可看到输入法菜单中全拼和智能ABC的位置调换了。\n2.软件法\n我们可以用《Windows优化大师》或《超级魔法兔子》等软件来调整。运行《Windows优化大师》后,进入“系统个性设置”选项卡中的“输入法顺序”,选中任一输入法后,通过右边的“向上”、“向下”按键,调整到合适位置即可;同样,“超级魔法兔子”也用一个“输入法”选项供调整。\n3.重装法\n重新添加输入法以达到调整顺序的目的,具体方法:在控制面板中找到“输入法”图标双击打开输入法,找到需要调整的输入法,把它前面的输入法依次删除(这里删除并不是真的把输入法从电脑中删除, …\u003c/code\u003e\u003c/pre\u003e"
June 8, 2009
国内各种主流CMS系统的比较和汇总
"\u003cp\u003e国内各种主流CMS系统的比较和汇总\u003c/p\u003e\n\u003cp\u003eCMS(Content Management System),中文叫网站内容管理系统,大概2004以前,如果想进行网站内容管理,基本上都是靠手工维护,但 千变万化的信息流,但没有好的程序支持,还继续靠手工完成是不可能的事,如果有一个好的系统来支撑你的网站,那将节省大量的人力物力,开发者就可能给客户 一个软件包,可以用它定期人工修改网站。只要你配置安装好,你的编辑,在线记者,更新员只要定期更新数据,剩下的事就交给CMS去处理。\u003c/p\u003e\n\u003cp\u003eAsp\u003c/p\u003e\n\u003cp\u003e动易CMS管理系统,官方网站:\u003ca href=\"http://www.asp163.net/\"\u003ehttp://www.asp163.net/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e这套是国产AspCMS中非常强大的系统,从3.0的简单的一个文章系统到现在的2005的版本,一路走来,动易不断完善,而且也不断加强功能,包括个人版,学校版,政府版,企业版,后台包括的功能,信息发布,类别管理,权限控制,信息采集,而且跟第三方的程序,比如论坛,商城(2005的已经自带了),blog可以完美结合,基本上可以满足一个中大型网站的要求,但Asp和Access的的局限性,还有本身功能Dll的限制,使得免费版差不多成鸡肋,\u003c/p\u003e\n\u003cp\u003e风讯官方网站: …\u003c/p\u003e"
May 6, 2009
Drupal,开源cms里的巨擘。
"\u003cp\u003e我从2002年底就开始关注drupal了,当时在国内看不到一点关于drupal的资料,2003年写过几篇关于drupal的介绍文章,到现在都经常看到很多介绍drupal的文章里引用我的话。记得2003年看到\u003ca href=\"http://www.hiweed.com/\"\u003e海微\u003c/a\u003e在研究drupal,并且发布了中文语言包,打开了drupal进入中国的大门。海微是我一直敬仰的一个人,以前一直致力于xoops的中文化工作,现在竟然搞Hiweed Linux操作系统了。\u003c/p\u003e\n\u003cp\u003e海微发布drupal中文语言包后我就一直开始用drupal,不过都是当作普通的blog程序来用,基本上不装插件,也没改过风格。中途试着改过几次风格,但试了几次都放弃了,感觉很麻烦。\u003c/p\u003e\n\u003cp\u003e最近看了几个用drupal做的强站,看了之后感觉就是震撼,根本看不出是用个开源代码的做的,看了之后我又萌发了修改drupal风格的念头,打算为我的\u003ca href=\"http://www.geekg.com/\"\u003e极客集\u003c/a\u003e改个版。研究了两天,终于明白drupal模板的原理了,对CCK和views这两个超强模块也有了新的认识,把官方的主要模块都看了看,看得我眼都花了,实在是太多了,对drupal的评价就是:“只有想不到的,没有做不到的”你想要什么功能都有什么模块。这也是国外程序最大的特 …\u003c/p\u003e"
May 4, 2009
大中型网站架构探秘
"\u003cp\u003e【eNet硅谷动力专稿】相信很多IT人士都有过搭建自己主页的经验,10多年前的个人主页都非常简单,很多由Frontpage构建,多属于静态HTML页面,最多加一点特效而已。不过10年间,技术的进步是惊人的。现在,一个网站绝不可能仅仅由几个HTML页面构成。我们随便举一个例子,国内图片网站yupoo.com,在chinarank排名1000左右,而Alexa排名则为5000左右,这个网站不算大,就是这样一个中型站点,拥有超过60台服务器,架构中涉及的Web服务器就包括了Lighttpd、Apache和 nginx。Yupoo的流量不算大,就已经拥有了60台服务器,事实上,排名前几位的网站,都拥有成千上万台服务器,如何协调这些服务器之间的工作负载,如何统一指挥调度,如何维护这些服务器硬件都是棘手的挑战。\u003c/p\u003e\n\u003cp\u003e \u003cstrong\u003e负载均衡:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e 负载均衡是所有大中型网站必备的部署。显然,大型网站每天上千万独立IP的访问量,一个Web服务器根本承担不了,网站后台必需有多台服务器共同工作,因此各种负载均衡技术就应运而生了。\u003c/p\u003e\n\u003cp\u003e 较早的负载均衡是DNS负载均衡。原理很简单,只要在域名解析的时候,将多个地址配置成同一个 …\u003c/p\u003e"
May 3, 2009
ECC ,R-ECC,FBD ECC内存的分别
"\u003cp\u003eFBD即Fully-buffer DIMM(全缓存模组技术),它是一种串行传输技术,可以提升内存的容量和传输带宽.是Intel在DDR2、DDR3的基础上发展出来的一种新型内存模 组与互联架构,既可以搭配现在的DDR2内存芯片,也可以搭配未来的DDR3内存芯片。FB-DIMM可以极大地提升系统内存带宽并且极大地增加内存最大容量。\u003c/p\u003e\n\u003cp\u003eFB-DIMM技术是Intel为了解决内存性能对系统整体性能的制约而发展出来的,在现有技术基础上实现了跨越式的性能提升,同时成本也相对低廉。在整 个计算机系统中,内存可谓是决定整机性能的关键因素,光有快的CPU,没有好的内存系统与之配合,CPU性能再优秀也无从发挥。这种情况是由计算机原理所 决定的,CPU在运算时所需要的数据都是从内存中获取,如果内存系统无法及时给CPU供应数据,CPU不得不长时间处在一种等待状态,硬件资源闲置,性能 自然无从发挥。对于普通的个人电脑来说,由于是单处理器系统,目前的内存带宽已经能满足其性能需求;而对于多路的服务器来说,由于是多处理器系统,其对内 存带宽和内存容量是极度渴求的,传统的内存技术已经无法满足其需求了。这是因为目前的普 …\u003c/p\u003e"
May 3, 2009
英特尔® 至强® 处理器型号及参数特性
"\u003cp\u003e\u003cstrong\u003e所有英特尔® 至强® 处理器特性:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e英特尔® 虚拟化技术±\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e英特尔® 64 位内存扩展技术Φ\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e**病毒防护技术°**\u003c/p\u003e\n\u003cp\u003e处理器\u003c/p\u003e\n\u003cp\u003e号\u003c/p\u003e\n\u003cp\u003e架构\u003c/p\u003e\n\u003cp\u003e高速缓存\u003c/p\u003e\n\u003cp\u003e时钟\u003c/p\u003e\n\u003cp\u003e频率\u003c/p\u003e\n\u003cp\u003e前端\u003c/p\u003e\n\u003cp\u003e总线\u003c/p\u003e\n\u003cp\u003e功率\u003c/p\u003e\n\u003cp\u003e系统类型\u003c/p\u003e\n\u003cp\u003e四核\u003c/p\u003e\n\u003cp\u003e双核\u003c/p\u003e\n\u003cp\u003e超线程(HT)\u003c/p\u003e\n\u003cp\u003e技术†\u003cstrong\u003e45 纳米技术\u003c/strong\u003e\nL5410\u003c/p\u003e\n\u003cp\u003e45 纳米\u003c/p\u003e\n\u003cp\u003e12 MB 二级缓存¹\u003c/p\u003e\n\u003cp\u003e2.33 GHz\u003c/p\u003e\n\u003cp\u003e1333 MHz\u003c/p\u003e\n\u003cp\u003e50 瓦\u003c/p\u003e\n\u003cp\u003e双路\n\u003cimg src=\"http://www.intel.com/products/i/checkmark.gif\" alt=\"\"\u003e\nL5420\u003c/p\u003e\n\u003cp\u003e45 纳米\u003c/p\u003e\n\u003cp\u003e12 MB 二级缓存¹\u003c/p\u003e\n\u003cp\u003e2.50 GHz\u003c/p\u003e\n\u003cp\u003e1333 MHz\u003c/p\u003e\n\u003cp\u003e50 瓦\u003c/p\u003e\n\u003cp\u003e双路\n\u003cimg src=\"http://www.intel.com/products/i/checkmark.gif\" alt=\"\"\u003e\nX3360\u003c/p\u003e\n\u003cp\u003e45 纳米\u003c/p\u003e\n\u003cp\u003e12 MB 二级缓存¹\u003c/p\u003e\n\u003cp\u003e2.83 GHz\u003c/p\u003e\n\u003cp\u003e1333 MHz\u003c/p\u003e\n\u003cp\u003e95 瓦\u003c/p\u003e\n\u003cp\u003e单路\n\u003cimg src=\"http://www.intel.com/products/i/checkmark.gif\" alt=\"\"\u003e\nX3350\u003c/p\u003e\n\u003cp\u003e45 纳米\u003c/p\u003e\n\u003cp\u003e12 MB 二级缓存¹\u003c/p\u003e\n\u003cp\u003e2.66 GHz\u003c/p\u003e\n\u003cp\u003e1333 MHz\u003c/p\u003e\n\u003cp\u003e95 瓦\u003c/p\u003e"
May 3, 2009
McAfee托盘图标消失
"\u003cp\u003e咖啡图标是shstat.exe,看“任务管理器”里是否有这进程,没有就用系统的“搜索”,找到该文件并双击运行。\u003c/p\u003e\n\u003cp\u003e然后在开始菜单“运行”里键入:msconfig 打开“启动项”,看shstat.exe有否被勾上,若没有,勾之。如果启动项里连它名字也不见,那就找到该文件,建立一个快捷方式,拖放到开始菜单的“启动”里……\u003c/p\u003e"
March 27, 2009
经典的GIF
"\u003cp\u003e女吴乐一下,放松心情,放眼美女子生活\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2009/03/u793p55t4d23913f50dt20040730145537.gif\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2009/03/u793p55t4d23913f50dt20040730145537.gif\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e"
November 6, 2008
右键“新建”菜单中没有“文本文档”的解决方法
"\u003cp\u003e 这是我遇到的问题,费了一番麻烦才搞定。开始很多人提供的直接修改注册表的方法没用,用windows优化大师、超级兔子也不行,今天找到解决方法了。\u003c/p\u003e\n\u003cp\u003e 把以下内容存入记事本:\u003c/p\u003e\n\u003cp\u003eWindows Registry Editor Version 5.00\u003c/p\u003e\n\u003cp\u003e[HKEY_CLASSES_ROOT.txt]\n@=”txtfile”\n“Content Type”=”text/plain”\u003c/p\u003e\n\u003cp\u003e[HKEY_CLASSES_ROOT.txt\\ShellNew]\n“NullFile”=””\u003c/p\u003e\n\u003cp\u003e[HKEY_CLASSES_ROOT\\txtfile]\n@=”文本文档”\u003c/p\u003e\n\u003cp\u003e[HKEY_CLASSES_ROOT\\txtfile\\shell]\u003c/p\u003e\n\u003cp\u003e[HKEY_CLASSES_ROOT\\txtfile\\shell\\open]\u003c/p\u003e\n\u003cp\u003e[HKEY_CLASSES_ROOT\\txtfile\\shell\\open\\command]\n@=”NOTEPAD.EXE %1″\u003c/p\u003e\n\u003cp\u003e然后保存好,修改后缀名,把.TXT改成.REG。双击导入到注册表中,就可以了。\u003c/p\u003e"
October 30, 2008
一语双关的幽默句子
"\u003cp\u003e英语中有好多一语双关的幽默句子,现在为大家摘录一些常用幽默迷你句型,以供参考,据说是流传甚广的加菲猫语录哦。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eMoney is not everything. There’s Mastercard and Visa.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e钞票不是万能的,毕竟有时还需要信用卡。\u003c/p\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003eOne should love animals. They are so tasty.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e每个人都应该热爱动物,因为它们很好吃。\u003c/p\u003e\n\u003col start=\"3\"\u003e\n\u003cli\u003eSave water. Shower with your girlfriend.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e要节约用水,所以尽量和女友一起洗澡。\u003c/p\u003e\n\u003col start=\"4\"\u003e\n\u003cli\u003eLove the neighbor. But don’t get caught.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e要用心去爱你的邻居,不过不要让她的老公知道。\u003c/p\u003e\n\u003col start=\"5\"\u003e\n\u003cli\u003eBehind every successful man, there is a woman. And behind every unsuccessful man, there are two or more.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e每个成功男人的背后,都有一个女人。每个不成功男人的背后,都有两个或更多。\u003c/p\u003e\n\u003col start=\"6\"\u003e\n\u003cli\u003eEvery man should marry. After …\u003c/li\u003e\u003c/ol\u003e"
Category: 系统架构
July 24, 2023
分布式存储 Ceph 介绍
"\u003cp\u003e\u003ca href=\"https://ceph.io/\"\u003eCeph\u003c/a\u003e 是一个分布式存储系统,其广泛用于云平台,最常见的就是在 k8s 平台中,目前大部分云厂商都会选择 \u003ccode\u003eceph\u003c/code\u003e 做为基础设施中的后端存储。\u003c/p\u003e\n\u003cp\u003eCeph是高度可靠、易于管理和免费的。\u003ccode\u003eCeph\u003c/code\u003e 的力量可以改变您公司的IT基础设施和管理大量数据的能力。Ceph提供了非凡的可扩展性——成千上万的客户端访问PB到EB的数据。Ceph节点利用商品硬件和智能守护进程,Ceph存储集群容纳大量节点,这些节点相互通信以动态复制和重新分发数据。\u003c/p\u003e\n\u003ch1 id=\"简介\"\u003e简介\u003c/h1\u003e\n\u003cp\u003e对于一个 Ceph 集群至少需要一个 \u003ccode\u003eCeph Monitor\u003c/code\u003e、一个 \u003ccode\u003eCeph Manager\u003c/code\u003e 和 一个 \u003ccode\u003eCeph OSDs\u003c/code\u003e(其个数决定了对象副本的个数)。\u003c/p\u003e\n\u003cp\u003eCeph Metadata Server 是运行 Ceph 文件系统客户端所必需的。\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2023/07/7cf9b586bd67922a1ebbde8e01ad433a.png\" alt=\"ditaa-a05e8639fc0d9031e9903a52a15a18e182d673ff\"\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e最好的做法是为每个监视器配备一个Ceph管理器,但这不是必须的\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"monitors\"\u003eMonitors\u003c/h2\u003e\n\u003cp\u003eCeph Monitor ( \u003ccode\u003eceph-mon\u003c/code\u003e) 维护集群状态的映射,包括监视器映射、管理器映射、OSD 映射、MDS 映射和 CRUSH 映射。这些映射是 Ceph 守护进程相互协调所需的关键集群状态。监视器还负责管理守护进程和客 …\u003c/p\u003e"
May 21, 2023
树莓派安装 kubernetes v1.27.2
"\u003cp\u003eUbuntu 22.04.2 LTS\nARM64位系统\nkubernetes v1.27.2\u003c/p\u003e\n\u003cp\u003e以前写过一篇安装教程 \u003ca href=\"https://blog.haohtml.com/archives/30924\"\u003ehttps://blog.haohtml.com/archives/30924\u003c/a\u003e ,当时安装的版本是 \u003ccode\u003e\u0026lt; v1.24.0\u003c/code\u003e 版本,由于k8s 从 \u003ccode\u003ev1.24.0\u003c/code\u003e 版本开始,弃用了 \u003ccode\u003eDockershim\u003c/code\u003e 因此没有办法继续使用 \u003ccode\u003eDocker Engine\u003c/code\u003e 作为运行时,因此如果还想继续使用旧的运行时的话,则需要安装一个 \u003ccode\u003ecri-docker\u003c/code\u003e 的软件, 本文主要是介绍(版本 \u003ccode\u003e\u0026gt;=v1.24.0\u003c/code\u003e )继续使用 \u003ccode\u003eDocker Engine\u003c/code\u003e 的安装方法,这里以最新版本 \u003ccode\u003ev1.27.1\u003c/code\u003e 为例。\u003c/p\u003e\n\u003ch2 id=\"安装环境初始化\"\u003e安装环境初始化\u003c/h2\u003e\n\u003cp\u003e以下内容来自: \u003ca href=\"https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/\"\u003ehttps://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e执行下述指令:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecat \u003cspan style=\"color:#e6db74\"\u003e\u0026lt;\u0026lt;EOF | sudo tee /etc/modules-load.d/k8s.conf\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003eoverlay\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003ebr_netfilter\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003eEOF\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
April 4, 2023
GBP工作原理
"\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://zhuanlan.zhihu.com/p/305982159\"\u003ehttps://zhuanlan.zhihu.com/p/305982159\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.cnblogs.com/wushuai2018/p/16450239.html\"\u003ehttps://www.cnblogs.com/wushuai2018/p/16450239.html\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e"
December 28, 2022
Envoy中的 gRPC限流服务
"\u003cp\u003e\u003ca href=\"https://blog.haohtml.com/archives/32108\"\u003e上一节\u003c/a\u003e 我们大概介绍了一下Envoy中有关速率限制(限流)的一些内容,这一节我们看一下对于外部的 gRPC限流服务它又是如何工作和配置的。\u003c/p\u003e\n\u003cp\u003e在 Envoy 中对服务限流的配置除了可以在 Envoy 本身中实现外,还可以在通过外部服务实现,此时 Envoy 将通过 gRPC 协议调用外部限流服务,官方对此实现有一套现成的解决方案,主要是redis数据库+令牌桶算法实现,可参考官方\u003c/p\u003e\n\u003cp\u003e本文中的限制器或限流器均是同一个意思。\u003c/p\u003e\n\u003ch1 id=\"envoy-实现限流\"\u003eEnvoy 实现限流\u003c/h1\u003e\n\u003cp\u003e此实现是基于令牌桶算法实现,本身比较的简单,比较适合一般的使用场景。\u003c/p\u003e\n\u003cp\u003e这里是官方提供的一个配置\u003ca href=\"https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/local_rate_limit_filter#example-configuration\"\u003e示例\u003c/a\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e13 http_filters:\n14 - name: envoy.filters.http.local_ratelimit\n15 typed_config:\n16 \u0026#34;@type\u0026#34;: type.googleapis.com/envoy.extensions.filters.http.local_ratelimit.v3.LocalRateLimit\n17 …\u003c/code\u003e\u003c/pre\u003e"
December 20, 2022
Envoy 中的速率限制 ratelimit
"\u003cp\u003e在 Envoy 架构中 \u003ca href=\"https://www.envoyproxy.io/docs/envoy/latest/configuration/other_features/rate_limit#config-rate-limit-service\"\u003eRate limit service\u003c/a\u003e 共支持 \u003ca href=\"https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/other_features/global_rate_limiting#arch-overview-global-rate-limit\"\u003eglobal rate limiting\u003c/a\u003e 和 \u003ca href=\"https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/other_features/local_rate_limiting#arch-overview-local-rate-limit\"\u003elocal rate limit filter\u003c/a\u003e 两种速率限制。推荐使用 \u003ca href=\"https://github.com/envoyproxy/ratelimit\"\u003ehttps://github.com/envoyproxy/ratelimit\u003c/a\u003e 库。\u003c/p\u003e\n\u003ch1 id=\"global-rate-limiting\"\u003eGlobal rate limiting\u003c/h1\u003e\n\u003cp\u003eEnvoy 提供了两种全局限速实现\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e每个连接 或 每个HTTP请求 速率限制检查。\u003c/li\u003e\n\u003cli\u003e基于配额,具有定期负载报告,允许在多个 Envoy 实例之间公平共享全局速率限制。此实现适用于每秒请求负载较高的大型 Envoy 部署,这些负载可能无法在所有 Envoy 实例之间均匀平衡。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"per-connection-or-per-http-request-rate-limiting\"\u003ePer connection or per HTTP request rate limiting\u003c/h2\u003e\n\u003cp\u003eEnvoy 直接与全局 gRPC rate limiting service 集成, …\u003c/p\u003e"
January 8, 2022
了解eBPF技术
"\u003cp\u003eeBPF 的全称“扩展的伯克利数据包过滤器 (Extended Berkeley Packet Filter)” 来看,它是一种数据包过滤技术,是从 BPF (Berkeley Packet Filter) 技术扩展而来的。\u003c/p\u003e\n\u003cp\u003eBPF 提供了一种在 内核事件 和 用户程序 事件发生时安全注入代码的机制,这就让非内核开发人员也可以对内核进行控制。随着内核的发展,BPF 逐步从最初的数据包过滤扩展到了网络、内核、安全、跟踪等,而且它的功能特性还在快速发展中,这种扩展后的 BPF 被简称为 eBPF(早期的 BPF 被称为经典 BPF,简称 cBPF)。实际上,现代内核所运行的都是 eBPF,如果没有特殊说明,内核和开源社区中提到的 BPF 等同于 eBPF 。\u003c/p\u003e\n\u003ch1 id=\"使用场景及分类\"\u003e使用场景及分类\u003c/h1\u003e\n\u003cp\u003e根据 eBPF 的功能和使用场景,主要分类三类:\u003c/p\u003e\n\u003ch2 id=\"跟踪\"\u003e跟踪\u003c/h2\u003e\n\u003cp\u003e从内核和程序的运行状态中提取跟踪信息,来了解当前系统正在发生什么。\u003c/p\u003e\n\u003cp\u003e跟踪类 eBPF 程序主要用于从系统中提取跟踪信息,进而为监控、排错、性能优化等提供数据支撑。\u003c/p\u003e\n\u003cp\u003e其中 \u003ca href=\"https://github.com/iovisor/bcc/blob/master/docs/tutorial.md\"\u003eBCC\u003c/a\u003e 工具集中包含的绝大部分工具也都属于这个类型。\u003c/p\u003e\n\u003ch2 id=\"网络\"\u003e网络\u003c/h2\u003e\n\u003cp\u003e对网络数据包进行过滤和处理,以便了 …\u003c/p\u003e"
October 9, 2021
k8s解决证书过期问题
"\u003cp\u003e在k8s中的时间会提示证书过期问题,如\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# kubectl get nodes\nUnable to connect to the server: x509: certificate has expired or is not yet valid\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这里我们介绍一下续期方法。\u003c/p\u003e\n\u003cp\u003e注意:当前集群通过 kubeadm 命令创建。\u003c/p\u003e\n\u003cp\u003ekubeadm 安装得证书默认为 1 年,\u003cstrong\u003e注意原证书文件必须保留在服务器上才能做延期操作,否则就会重新生成,集群可能无法恢复\u003c/strong\u003e。\u003c/p\u003e\n\u003ch1 id=\"准备\"\u003e准备\u003c/h1\u003e\n\u003cp\u003e这里先查看一下测试集群的证书过期时间\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# kubeadm certs check-expiration\n[check-expiration] Reading configuration from the cluster...\n[check-expiration] FYI: You can look at this config file with \u0026#39;kubectl -n kube-system get cm kubeadm-config -o yaml\u0026#39;\n\nCERTIFICATE …\u003c/code\u003e\u003c/pre\u003e"
September 13, 2021
istio在虚拟机vm下的安装方法
"\u003cp\u003e建议参考官方文档 https://istio.io/latest/zh/docs/setup/install/virtual-machine/ ,这里提醒大家对于命令中文版部分命令与英文版不一致,请以 \u003cstrong\u003e英文版\u003c/strong\u003e 为准。\u003c/p\u003e\n\u003cp\u003e对于istio在vm上的安装教程主要分为三部分。首先是在k8s的master节点生成vm连接主节点的一些配置信息,其实是在vm上应用这些配置信息,最后也就是验证连接是否成功。\u003c/p\u003e\n\u003cp\u003e本篇主要介绍“单网络”的情况, 对于”多网络“请自行参考官方文档。\u003c/p\u003e\n\u003ch1 id=\"vm环境准备\"\u003evm环境准备\u003c/h1\u003e\n\u003ch2 id=\"生成vm通讯配置信息\"\u003e生成vm通讯配置信息\u003c/h2\u003e\n\u003cp\u003e这里主要介绍一些新手迷惑的部分。如环境变量设置及vm注册的方式\u003c/p\u003e\n\u003ch3 id=\"设置环境变量\"\u003e设置环境变量\u003c/h3\u003e\n\u003cp\u003e在设置变量时,对于”单网络“来讲 CLUSTER_NETWORK 和 VM_NETWORK 保留空值即可。如我这里设置如下\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ VM_APP\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;myapp\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ VM_NAMESPACE\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;vm\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ WORK_DIR\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;/root/myapp\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ SERVICE_ACCOUNT\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;vm-sa\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ CLUSTER_NETWORK\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u0026#34; …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
September 13, 2021
利用 docker buildx 构建多平台镜像
"\u003ch1 id=\"什么是-docker-buildx\"\u003e什么是 docker buildx\u003c/h1\u003e\n\u003cp\u003eDocker Buildx是一个CLI插件,它扩展了Docker命令,完全支持Moby BuildKit builder toolkit提供的功能。它提供了与docker build相同的用户体验,并提供了许多新功能,如创建作用域生成器实例和针对多个节点并发构建。\u003c/p\u003e\n\u003cp\u003eDocker Buildx包含在Docker 19.03中,并与以下Docker Desktop版本捆绑在一起。请注意,必须启用“实验特性”选项才能使用Docker Buildx。\u003c/p\u003e\n\u003cp\u003eDocker Desktop Enterprise version 2.1.0\nDocker Desktop Edge version 2.0.4.0 or higher\u003c/p\u003e\n\u003ch1 id=\"用法\"\u003e用法\u003c/h1\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eUsage: docker buildx [OPTIONS] COMMAND\n\nExtended build capabilities with BuildKit\n\nOptions:\n --builder string Override the configured builder instance …\u003c/code\u003e\u003c/pre\u003e"
August 7, 2021
服务网格Istio之服务入口 ServiceEntry
"\u003cp\u003e使用服务入口(Service Entry) 来添加一个服务入口到 Istio 内部维护的服务注册中心。添加了服务入口后,Envoy 代理可以向服务发送流量,就好像它是网格内部的服务一样,可参考 \u003ca href=\"https://istio.io/latest/zh/docs/concepts/traffic-management/#service-entries\"\u003ehttps://istio.io/latest/zh/docs/concepts/traffic-management/#service-entries\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e简单的理解就是允许内网向外网服务发送流量请求,但你可能会说正常情况下在pod里也是可以访问外网的,这两者有什么区别呢?\u003c/p\u003e\n\u003cp\u003e确实默认情况下,Istio 配置 Envoy 代理可以将请求传递给外部服务。但是无法使用 Istio 的特性来控制没有在网格中注册的目标流量。这也正是 ServiceEntry 真正发挥的作用,通过配置服务入口允许您管理运行在网格外的服务的流量。\u003c/p\u003e\n\u003cp\u003e此外,可以配置虚拟服务和目标规则,以更精细的方式控制到服务条目的流量,就像为网格中的其他任何服务配置流量一样。\u003c/p\u003e\n\u003cp\u003e为了更好的理解这一块的内容,我们先看一下普通POD发送请求的流程图\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2021/08/d2b5ca33bd970f64a6301fa75ae2eb22.png\" alt=\"\"\u003e普通 Pod 请求\u003c/p\u003e\n\u003ch1 id=\"创建-serviceentry-资源\"\u003e创建 ServiceEntry 资源\u003c/h1\u003e\n\u003cp\u003e举例来说:\u003c/p\u003e\n\u003cp\u003esvc-entry.yaml …\u003c/p\u003e"
July 31, 2021
在linux下安装Kubernetes
"\u003cp\u003e环境 ubuntu18.04 64位\u003c/p\u003e\n\u003cp\u003eKubernetes v1.21.3\u003c/p\u003e\n\u003cp\u003e这里需要注意,本教程安装的k8s版本号 \u003ccode\u003e\u0026lt;- v1.24.0\u003c/code\u003e,主要是因为从v1.24.0以后移除了 \u003ccode\u003eDockershim\u003c/code\u003e,无法继续使用 \u003ccode\u003eDocker Engine\u003c/code\u003e,后续将默认采用 \u003ca href=\"https://containerd.io/\"\u003econtainerd\u003c/a\u003e ,它是一个从 CNCF 毕业的项目。如果仍想使用原来 \u003ccode\u003eDocker Engine\u003c/code\u003e 的方式可以安装 \u003ca href=\"https://github.com/Mirantis/cri-dockerd\"\u003ecri-dockerd\u003c/a\u003e ,它是 Dockershim 的替代品。\u003c/p\u003e\n\u003cp\u003e如果你想将现在 Docker Engine 的容器更换为 \u003ccode\u003econtainerd\u003c/code\u003e,可以参考官方迁移教程 \u003ca href=\"https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/migrating-from-dockershim/change-runtime-containerd/\"\u003e将节点上的容器运行时从 Docker Engine 改为 containerd\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e为了解决国内访问一些国外网站慢的问题,本文使用了国内阿里云的镜像。\u003c/p\u003e\n\u003ch1 id=\"更换apt包源\"\u003e更换apt包源\u003c/h1\u003e\n\u003cp\u003e这里使用aliyun镜像 , 为了安全起见,建议备份原来系统默认的 /etc/apt/sources.list 文件\u003c/p\u003e\n\u003cp\u003e编辑文件 /etc/apt/sources.list,将默认网址 或 替换为\u003c/p\u003e\n\u003cp\u003e更新缓存\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ sudo apt-get clean all\n$ sudo …\u003c/code\u003e\u003c/pre\u003e"
June 27, 2021
SPIFFE 学习参考资料
"\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/spiffe/spiffe/blob/main/standards/SPIFFE_Workload_API.md\"\u003eThe SPIFFE Workload API\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.scriptjc.com/article/1097\"\u003eEnvoy spiffe spire\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.csdn.net/dnc8371/article/details/106701159\"\u003e简而言之SPIFFE\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://cloud.tencent.com/developer/article/1549231\"\u003eSPIFFE信任域\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://segmentfault.com/a/1190000018432444\"\u003e使用SPIRE(自动)提供TLS证书给Envoy以进行更强大的身份验证\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://segmentfault.com/a/1190000017881797\"\u003e谁使用SPIFFE?\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.envoyproxy.io/securing-the-service-mesh-with-spire-0-3-abb45cd79810\"\u003eSecuring the Service Mesh with SPIRE 0.3\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e"
April 29, 2021
初识kubernetes 组件
"\u003cp\u003e对于一个刚刚接触 kubernetes(k8s)的新手来说,想好更好的学习它,首先就要对它有一个大概的认知,所以本文我们先以全局观来介绍一个 kubernetes。\u003c/p\u003e\n\u003ch2 id=\"kubernetes-架构-8ee9f2fa987eccb490cfaa91c6484f67kubernetes-架构图\"\u003ekubernetes 架构 \u003cimg src=\"https://blogstatic.haohtml.com/uploads/2021/04/56aec9997240192091adad3e14358736-52.png\" alt=\"8ee9f2fa987eccb490cfaa91c6484f67\"\u003ekubernetes 架构图\u003c/h2\u003e\n\u003cp\u003ekubernets 整体可以分为两大部分,分别为 \u003ccode\u003eMaster\u003c/code\u003e 和 \u003ccode\u003eNode\u003c/code\u003e ,我们一般称其为节点,这两种角色分别对应着控制节点和计算节点,根据我们的经验可以清楚的知道 Master 是控制节点。\u003c/p\u003e\n\u003ch2 id=\"master-节点\"\u003eMaster 节点\u003c/h2\u003e\n\u003cp\u003e控制节点 \u003ccode\u003eMaster\u003c/code\u003e 节点由三部分组成,分别为 \u003ccode\u003eController Manager\u003c/code\u003e 、 \u003ccode\u003eAPI Server\u003c/code\u003e 和 \u003ccode\u003eScheduler\u003c/code\u003e ,它们相互紧密协作,每个部分负责不同的工作职责。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003econtroller-manager\u003c/code\u003e 全称为 kube-controler-manager 组件,主要用来负责容器编排。如一个容器(实际上是 pod,pod 是最基本的调度单元。一般一个 pod 里会部署一个容器服务)服务可以指定副本数量,如果实际运行的副本数据与期望的不一致,则会自动再启动几个容器副本,最终实现期望的数量。这个组件,就是一系列控制器的集合。我们可以 …\u003c/li\u003e\u003c/ul\u003e"
March 28, 2020
k8s中的Service与Ingress
"\u003cp\u003e集群中的服务要想向外提供服务,就不得不提到Service和Ingress。 下面我们就介绍一下两者的区别和关系。\u003c/p\u003e\n\u003ch1 id=\"service\"\u003eService\u003c/h1\u003e\n\u003cp\u003e必须了解的一点是对 Service 的访问只有在 Kubernetes 集群内有效,而在集群之外是无效的。\u003c/p\u003e\n\u003cp\u003eService可以看作是一组提供相同服务的Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。对于Service 的工作原理请参考\u003c/p\u003e\n\u003cp\u003e当需要从集群外部访问k8s里的服务的时候,方式有四种:\u003ccode\u003eClusterIP\u003c/code\u003e(默认)、\u003ccode\u003eNodePort\u003c/code\u003e、\u003ccode\u003eLoadBalancer\u003c/code\u003e、\u003ccode\u003eExternalName\u003c/code\u003e 。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e下面我们介绍一下这几种方式的区别\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 id=\"一clusterip\"\u003e\u003cstrong\u003e一、ClusterIP\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003e该方式是指通过集群的内部 IP 暴露服务,但此服务只能够在集群内部可以访问,这种方式也是默认的 ServiceType。\u003c/p\u003e\n\u003cp\u003e我们先看一下最简单的Service定义\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eapiVersion: v1\nkind: Service\nmetadata:\n name: hostnames\nspec:\n selector:\n app: hostnames\n ports:\n - name: …\u003c/code\u003e\u003c/pre\u003e"
March 28, 2020
mac下利用minikube安装Kubernetes环境
"\u003cp\u003e本机为mac环境,安装有brew工具,所以为了方便这里直接使用brew来安装minikube工具。同时本机已经安装过VirtualBox虚拟机软件。\u003c/p\u003e\n\u003cp\u003eminikube是一款专门用来创建k8s 集群的工具。\u003c/p\u003e\n\u003ch2 id=\"一安装minikube\"\u003e一、安装minikube\u003c/h2\u003e\n\u003cp\u003e参考 , 在安装minkube之前建议先了解一下minikube需要的环境。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e先安装一个虚拟化管理系统,如果还未安装,则在 HyperKit、VirtualBox 或 VMware Fusion 三个中任选一个即可,这里我选择了VirtualBox。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e如果你想使用hyperkit的话,可以直接执行 \u003cstrong\u003ebrew install hyperkit\u003c/strong\u003e 即可。\u003c/p\u003e\n\u003cp\u003e对于支持的driver_name有效值参考, 目前\u003cstrong\u003edocker\u003c/strong\u003e尚处于实现阶段。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ brew install minikube\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e查看版本号\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ minikube version\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eminikube version: v1.8.2\ncommit: eb13446e786c9ef70cb0a9f85a633194e62396a1\u003c/p\u003e\n\u003cp\u003e安装kubectl命令行工具\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ brew install kubectl\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"二启动minikube-创建集群\"\u003e二、启 …\u003c/h2\u003e"
January 15, 2020
开发者必知redis知识点
"\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e剖析Redis常用数据类型对应的数据结构 \u003ca href=\"https://time.geekbang.org/column/article/79159\"\u003ehttps://time.geekbang.org/column/article/79159\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eredis中的COW(Copy-On-Write) \u003ca href=\"https://www.jianshu.com/p/b2fb2ee5e3a0\"\u003ehttps://www.jianshu.com/p/b2fb2ee5e3a0\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eredis常用有哪些数据类型及每种数据类型的使用场景有哪些 \u003ca href=\"https://www.cnblogs.com/tqlin/p/10478459.html\"\u003ehttps://www.cnblogs.com/tqlin/p/10478459.html\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e如果存储一个JSON数据时,选择hash还是string 存储数据? \u003ca href=\"https://segmentfault.com/a/1190000019552836\"\u003ehttps://segmentfault.com/a/1190000019552836\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eredis与memcache的区别 \u003ca href=\"https://www.cnblogs.com/JavaBlackHole/p/7726195.html\"\u003ehttps://www.cnblogs.com/JavaBlackHole/p/7726195.html\u003c/a\u003e \u003ca href=\"https://blog.csdn.net/qq_34126805/article/details/81748107\"\u003ehttps://blog.csdn.net/qq_34126805/article/details/81748107\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eredis支持多CPU吗?如何发挥多cpu? …\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e"
October 18, 2019
一致性哈希算法及其在分布式系统中的应用(推荐)
"\u003ch1 id=\"摘要\"\u003e摘要\u003c/h1\u003e\n\u003cp\u003e本文将会从实际应用场景出发,介绍一致性哈希算法(Consistent Hashing)及其在分布式系统中的应用。首先本文会描述一个在日常开发中经常会遇到的问题场景,借此介绍一致性哈希算法以及这个算法如何解决此问题;接下来会对这个算法进行相对详细的描述,并讨论一些如虚拟节点等与此算法应用相关的话题。\u003c/p\u003e\n\u003ch1 id=\"分布式缓存问题\"\u003e分布式缓存问题\u003c/h1\u003e\n\u003cp\u003e假设我们有一个网站,最近发现随着流量增加,服务器压力越来越大,之前直接读写数据库的方式不太给力了,于是我们想引入Memcached作为缓存机制。现在我们一共有三台机器可以作为Memcached服务器,如下图所示。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/1.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e很显然,最简单的策略是将每一次Memcached请求随机发送到一台Memcached服务器,但是这种策略可能会带来两个问题:一是同一份数据可能被存在不同的机器上而造成数据冗余,二是有可能某数据已经被缓存但是访问却没有命中,因为无法保证对相同key的所有访问都被发送到相同的服务器。因此,随机策略无论是时间效率还是空间效率都非常不好。\u003c/p\u003e\n\u003cp\u003e要解决上述问题只需做到如下一点:保证对相同key的访问会被发送到相同的服务器。很多方法可以实现这一点,最常用的方法是计算哈希。例 …\u003c/p\u003e"
August 31, 2019
Redis 选择hash还是string 存储数据?
"\u003cp\u003e在Redis中存储数据时,经常使用string和hash这两种类型,至于这两者有什么不同,底层实现有何区别,推荐参考: \u003ca href=\"https://segmentfault.com/a/1190000019552836\"\u003ehttps://segmentfault.com/a/1190000019552836\u003c/a\u003e\u003c/p\u003e"
July 29, 2019
kubernetes dashboard向外网提供服务
"\u003cp\u003e目前新版本的 kubernetes dashboard ()安装了后,为了安全起见,默认情况下已经不向外提供服务,只能通过 \u003ca href=\"http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/\"\u003e\u003ccode\u003ehttp://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/\u003c/code\u003e\u003c/a\u003e 本机访问。在我们学习过程中,总有些不方便,这时我们可以利用 \u003ccode\u003ekubectl proxy\u003c/code\u003e 命令来实现。\u003c/p\u003e\n\u003cp\u003e首先我们看一下此命令的一些想着参数\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e➜ ~ kubectl proxy -h\nTo proxy all of the kubernetes api and nothing else, use:\n\n $ kubectl proxy --api-prefix=/\n\nTo proxy only part of the kubernetes api and also some static files:\n\n $ kubectl proxy --www=/my/files --www-prefix=/static/ --api-prefix=/api/\n\nThe above …\u003c/code\u003e\u003c/pre\u003e"
July 28, 2019
RabbitMQ常见面试题
"\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.rabbitmq.com/getstarted.html\"\u003eRabbitMq的消息类型(6种)\u003c/a\u003e、 \u003ca href=\"https://blog.haohtml.com/archives/15285\"\u003e消息确认机制\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRabbitMq中的概念及解释\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cul\u003e\n\u003cli\u003e \u003ccode\u003eServer(Broker)\u003c/code\u003e: 接收客户端连接,实现AMQP协议的消息队列和路由功能的进程;\u003c/li\u003e\n\u003cli\u003e \u003ccode\u003eVirtual Host\u003c/code\u003e:虚拟主机的概念,类似权限控制组,一个Virtual Host里可以有多个Exchange和Queue。\u003c/li\u003e\n\u003cli\u003e \u003ccode\u003eExchange\u003c/code\u003e: 交换机,接收生产者发送的消息,并根据Routing Key将消息路由到服务器中的队列Queue。\u003c/li\u003e\n\u003cli\u003e \u003ccode\u003eExchangeType\u003c/code\u003e: 交换机类型决定了路由消息行为,RabbitMQ中有四种类型Exchange,分别是\u003ccode\u003efanout\u003c/code\u003e、\u003ccode\u003edirect\u003c/code\u003e、\u003ccode\u003etopic\u003c/code\u003e 和 \u003ccode\u003eheaders\u003c/code\u003e;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eQueue\u003c/code\u003e:消息队列,用于存储还未被消费者消费的消息;\u003c/li\u003e\n\u003cli\u003e \u003ccode\u003eMessage\u003c/code\u003e:由Header和body组成,Header是由生产者添加的各种属性的集合,包括Message是否被持久化、优先级是多少、由哪个Message Queue接收等;body是真正需要发送的数据内容;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eBindingKey\u003c/code\u003e:绑定关键字,将一个特定的 \u003ccode\u003eExchange\u003c/code\u003e 和一个特定的 \u003ccode\u003eQueue\u003c/code\u003e 绑定起来。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e2. …\u003c/p\u003e"
July 28, 2019
rabbitmq消息队列的消息持久化机制
"\u003cp\u003e首先阅读这篇文章: \u003ca href=\"https://blog.csdn.net/yongche_shi/article/details/51500534\"\u003ehttps://blog.csdn.net/yongche_shi/article/details/51500534\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e之前其实已经写过一篇关于RabbitMQ持久化的 \u003ca href=\"http://jzhihui.iteye.com/blog/1642324\"\u003e文章\u003c/a\u003e ,但那篇文章侧重代码层面的写入流程,对于持久化操作何时发生以及什么时候会刷新到磁盘等问题其实都没有搞清楚,这篇文章着重于关注这些问题。\u003c/p\u003e\n\u003ch2 id=\"消息什么时候需要持久化\"\u003e消息什么时候需要持久化?\u003c/h2\u003e\n\u003cp\u003e根据 \u003ca href=\"http://www.rabbitmq.com/blog/2011/01/20/rabbitmq-backing-stores-databases-and-disks/\"\u003e官方博文\u003c/a\u003e 的介绍,RabbitMQ在两种情况下会将消息写入磁盘:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e消息本身在 \u003ccode\u003epublish\u003c/code\u003e 的时候就要求消息写入磁盘;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e内存紧张\u003c/code\u003e 需要将部分内存中的消息转移到磁盘;\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"消息什么时候会刷到磁盘\"\u003e消息什么时候会刷到磁盘?\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e写入文件前会有一个Buffer,大小为1M(1048576),数据在写入文件时,首先会写入到这个Buffer,如果Buffer已满,则会将Buffer写入到文件(未必刷到磁盘);\u003c/li\u003e\n\u003cli\u003e有个固定的刷盘时间:25ms,也就是不管Buffer满不满,每隔25ms,Buffer里的数据及未刷新到磁盘的文件内容必定会刷到磁盘;\u003c/li\u003e\n\u003cli\u003e每次消息写入后,如果没有后续写入请求,则会直接将已写入的消息刷到磁盘:使用Erlang的receive x after 0 …\u003c/li\u003e\u003c/ol\u003e"
July 26, 2019
docker exec 命令原理
"\u003cp\u003e我们经常使用 docker exec 命令进入到一个容器里进行一些操作,那么这个命令是如果进入到容器里的呢?想必大家都知道用到了Namespace来实现,但至于底层实现原理是什么,想必都不是特别清楚吧。\u003c/p\u003e\n\u003cp\u003e我们知道容器的本质其实就是一个进程,每个进程都有一个Pid,至于容器的Pid值可以通过 docker inspect container_id 来查看,我们这里是一个Python应用容器,我们看一下他的 Pid值\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003edocker inspect --format \u0026#39;{{ .State.Pid }}\u0026#39; 4ddf4638572d\n25686\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e而每个进程都有自己的Namespace,你可以通过查看宿主机的 proc 文件,看到这个 25686 进程的所有 Namespace 对应的文件\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003els -l /proc/25686/ns\ntotal 0\nlrwxrwxrwx 1 root root 0 Aug 13 14:05 cgroup -\u0026gt; cgroup:[4026531835]\nlrwxrwxrwx 1 root root 0 Aug 13 14:05 ipc …\u003c/code\u003e\u003c/pre\u003e"
July 26, 2019
docker中的命名空间
"\u003cp\u003eNamespace 的作用是“隔离”,它让应用进程只能看到该Namespace 内的“世界”;而 Cgroups 的作用是“限制”,它给这个“世界”围上了一圈看不见的墙。\u003c/p\u003e\n\u003cp\u003e命名空间是 Linux 内核一个强大的特性。每个容器都有自己单独的命名空间,运行在其中的应用都像是在独立的操作系统中运行一样。命名空间保证了容器之间彼此互不影响。\u003c/p\u003e\n\u003cp\u003e在docker中一共有以下几个命名空间,每个Namespace的发挥着不同的作用。\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/docker-namespace.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003ch3 id=\"pid-命名空间\"\u003epid 命名空间\u003c/h3\u003e\n\u003cp\u003e不同用户的进程就是通过 pid 命名空间隔离开的,且不同命名空间中可以有相同 pid。在同一个Namespace中只能看到当前命名空间的进程。所有的 LXC 进程在 Docker 中的父进程为Docker进程,每个 LXC 进程具有不同的命名空间。同时由于允许嵌套,因此可以很方便的实现嵌套的 Docker 容器。\u003c/p\u003e\n\u003ch3 id=\"net-命名空间\"\u003enet 命名空间\u003c/h3\u003e\n\u003cp\u003e有了 pid 命名空间, 每个命名空间中的 pid 能够相互隔离,但是网络端口还是共享 host 的端口。网络隔离是通过 net 命名空间实现的, 每个 net 命名空间有独立的 网络设备, IP 地址, 路由表, …\u003c/p\u003e"
July 13, 2019
docker容器调试利器nicolaka/netshoot
"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e在日常工作中,我们一般会将容器进行精简,将其大小压缩到最小,以此来提高容器部署效率,参考\u003ca href=\"https://mp.weixin.qq.com/s/S1Ib08SpQbf1SCbCutUoqQ\"\u003e小米云技术 – Docker最佳实践:5个方法精简镜像\u003c/a\u003e。但有一个比较尴尬的问题就是对容器排障,由于容器里没有了我们日常工作中用到许多排障命令,如top、ps、netstat等,所以想排除故障的话,常用的做法是安装对应的命令,如果容器过多的话,再这样搞就有些麻烦了,特别是在一些安装包源速度很慢的情况。\u003c/p\u003e\n\u003ch2 id=\"解决方案\"\u003e解决方案\u003c/h2\u003e\n\u003cp\u003e今天发现一篇文章(\u003ca href=\"http://www.dockone.io/article/9032\"\u003e简化 Pod 故障诊断:kubectl-debug 介绍\u003c/a\u003e)介绍针对此类问题的解决方案的,这里介绍的是一个叫做 \u003ccode\u003ekubectl-debug\u003c/code\u003e 的命令,由国内知名的PingCAP公司出品的,主要用在k8s环境中的。我们知道容器里主要两大技术,一个是用\u003cstrong\u003ecgroup来实现容器资源的限制\u003c/strong\u003e,一个是用\u003cstrong\u003eNamespace来实现容器的资源隔离的\u003c/strong\u003e)。(kubectl-debug 命令是基于一个工具包() 来实现的,其原理是利用将一个工具包容器添加到目标容器所在的Pod里,实现和目标容器的Network Namespace一致,从而达到对新旧容器进程的相互可见性,这样我们就可以直接在目标容器里 …\u003c/p\u003e"
July 12, 2019
基于docker环境实现Elasticsearch 集群环境
"\u003cp\u003e最近搭建了es集群的时候,现在需要测试添加一个新的数据节点,项目是使用docker-compose命令来搭建的。\u003c/p\u003e\n\u003cp\u003e以下基于最新版本 es7.2.0进行, 配置文件目录为 es, 所以docker 在创建网络的时候,网络名称会以 es_ 前缀开始,如本例中我们在docker-composer.yaml文件中指定了网络名称为esnet,但docker生成的实例名称为 es_esnet,至于网络相关的信息可以通过 \u003ccode\u003edocker network --help\u003c/code\u003e 查看。\u003c/p\u003e\n\u003ch2 id=\"搭建es集群\"\u003e搭建es集群\u003c/h2\u003e\n\u003cp\u003e// docker-compose.yaml 集群配置文件\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eversion: \u0026#39;2.2\u0026#39;\nservices:\n es01:\n image: docker.elastic.co/elasticsearch/elasticsearch:7.2.0\n container_name: es01\n environment:\n - node.name=es01\n - node.master=true\n - node.data=true\n - …\u003c/code\u003e\u003c/pre\u003e"
July 10, 2019
kafka常用术语
"\u003cp\u003e官方网站:,中文: \u003ca href=\"http://kafka.apachecn.org/\"\u003ehttp://kafka.apachecn.org/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e注意它和其它消息系统(消息队列)在\u003cstrong\u003e定义\u003c/strong\u003e上的区别,以便更好的理解它的应用场景。\u003cstrong\u003eApache Kafka 是一款分布式流处理平台(Distributed Streaming Platform)\u003c/strong\u003e。\u003c/p\u003e\n\u003ch2 id=\"术语\"\u003e术语\u003c/h2\u003e\n\u003cp\u003e消息:Record。消息实体,是通信的基本单位。\n主题:Topic。主题是承载消息的\u003cstrong\u003e逻辑容器\u003c/strong\u003e,在实际使用中多用来区分具体的业务。\n分区:Partition。一个\u003cstrong\u003e有序不变\u003c/strong\u003e的消息序列。每个主题Topic下可以有多个分区。\n消息位移:Offset。表示分区中每条消息的位置信息,是一个\u003cstrong\u003e单调递增\u003c/strong\u003e且不变的值。\n缓存代理,Broker。Kafka集群中的一台或多台服务器统称broker。\n副本:Replica。Kafka 中同一条消息能够被拷贝到多个地方以提供数据冗余,这些地方就是所谓的副本。\u003cstrong\u003e\u003cem\u003e副本还分为领导者副本和追随者副本\u003c/em\u003e\u003c/strong\u003e,各自有不同的角色划分。副本是在分区层级下的,即每个分区可配置多个副本实现高可用。\n生产者:Producer。向主题发布新消息的应用程序。\n消费者:Consumer。从主题订阅新消息的应用程序。\n消费者位 …\u003c/p\u003e"
July 3, 2019
ES集群的高可用性之节点
"\u003cp\u003e为了防止ES集群中单点问题,一般都需要对集群节点做高可用性,当发生单点问题时,也可以向外正常提供服务。这里主要记录一下节点的加入、离开和主节点选举。\u003c/p\u003e\n\u003cp\u003e集群安装教程请参考:\u003c/p\u003e\n\u003ch2 id=\"节点角色\"\u003e节点角色\u003c/h2\u003e\n\u003cp\u003e集群是由多个节点组成的,每个节点都扮演着不同的角色,一般常用的有 Master、Data 和 client。节点角色介绍:\u003c/p\u003e\n\u003cp\u003e节点角色配置参数:\nnode.master: true\nnode.data: false\nnode.ingest: false\u003c/p\u003e\n\u003cp\u003e在一个集群中,可以通过 查看到每个节点在集群中扮演的角色,一个节点可同时拥有多个角色,如值MDI,同时也是每个节点的默认值,其中的 Ingest 节点也称作\u003cstrong\u003e预处理节点\u003c/strong\u003e,不过在生产环境中一般将master 和 data节点分开的。所有节点默认都是支持 Ingest 操作的。节点组合参考:\u003c/p\u003e\n\u003ch2 id=\"新节点的加入\"\u003e新节点的加入\u003c/h2\u003e\n\u003cp\u003e随着数量大的增加,有时候我们不得进行机器的扩容,这时间就需要加入一些新的机器节点,用来提高访问速度。\u003c/p\u003e\n\u003cp\u003e当一个新节点加入的时候,它通过读取 \u003ccode\u003ediscovery.zen.ping.unicast.hosts\u003c/code\u003e 配置的节点获取集群状态,然后找到 \u003ccode\u003emaster\u003c/code\u003e 节点,并向 …\u003c/p\u003e"
July 2, 2019
docker容器 Exited (137)错误代码
"\u003cp\u003e最近要搭建es集群,由于刚接触es不久,直接使用的docker构建,发现当用两个容器搭建好集群时,再添加新的es容器节点时,总是出现其它容器被kill的现象,查看容器日志未发现任何错误信息,导致一段时间非常的迷茫。\u003c/p\u003e\n\u003cp\u003e起始认为是配置不当引起了,于是一直在配置这方面找问题,网上的有些教程是直接在物理机器上或者虚拟机上进行部署,而自己的环境是docker, 通过 docker-compose 来部署的,\b环境有些差异。\u003c/p\u003e\n\u003cp\u003e有网友提醒有可能是由 OOM 引起的问题,因为代码是137, 使用命令 “\u003ccode\u003edocker inspect 容器ID\u003c/code\u003e” 查看了一下容器, status列显示”\u003ccode\u003eOOMKilled\u0026quot;: false\u003c/code\u003e” ,所以从这里查看的话,并非是 OOM 引起的,起初个人分析容器的启动过程,是在启动一个容器时,dockerd应该先检查内存是否足够,如果不足够的话,则启动新窗口失败才对,而不是先将已存在的窗口killed,再去启动新容器,所以仍将OOM的原因排除掉了。\u003c/p\u003e\n\u003cp\u003e后来\b发现一篇文章 介绍到这个和 docker for mac 分配的内存大小有关系,试着将给 docker 分配的内存调整 …\u003c/p\u003e"
January 26, 2019
docker中将MySQL运行在容器中失败提示“ InnoDB : Error 22 with aio_write”的解决办法
"\u003cp\u003e今天利用docker容器创建mysql8.0的时候(window系统),指定了本地宿主机器的一个目录为容器mysql的datadir目录,发现创建失败了。\u003c/p\u003e\n\u003cp\u003e创建命令:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ docker run -d --name mysql81 -v /e/container/mysql/mysql81/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 33081:3306 mysql\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e错误提示:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ docker logs mysql81\n2019-01-26T03:05:42.567230Z 0 [Warning] [MY-011070] [Server] \u0026#39;Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it\u0026#39; is deprecated and will be removed in a future release. …\u003c/code\u003e\u003c/pre\u003e"
January 15, 2019
docker build . 命令后面的.是什么意思
"\u003cp\u003e今天来公司自己构建了一个Dockerfile,放在一个经常用到的项目目录里,内容如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# This is a comment\nFROM ubuntu:14.04\nMAINTAINER Docker Newbee \u0026lt;newbee@docker.com\u0026gt;\nRUN apt-get -qq update\nRUN apt-get -qqy install ruby ruby-dev\nRUN gem install sinatra\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e然后执行\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo docker build -t \u0026#34;cfanbo/test:v2\u0026#34; .\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e发现在构建的时候发送给 docker daemon 竟然有4G多,超极大。首先的第一反映出问题了。一个ubuntu镜像也没有这么大呀,况且现在还没有开始从远程pull 镜像呢。\u003c/p\u003e\n\u003cp\u003e那到底什么情况了呢?经过一翻搜索,发现在docker build . 的时候,会将当前目录里的内容发送给 docker daemon。只需要加一个 .dockerignore 文件,将其它内容排除掉就可以了,类似于git中的.gitignore文件的作用。\u003c/p\u003e\n\u003cp\u003e后面就想通 …\u003c/p\u003e"
October 20, 2018
分布式系统与消息的投递(转)
"\u003cp\u003e\u003ca href=\"https://mp.weixin.qq.com/s/ZLzwQAIG6ZL88ohusOyxIQ\"\u003ehttps://mp.weixin.qq.com/s/ZLzwQAIG6ZL88ohusOyxIQ\u003c/a\u003e\u003c/p\u003e"
October 13, 2018
Heap And Stack 堆与栈的区别
"\u003cp\u003e\u003cstrong\u003e堆与栈的区别\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e推荐: \u003ca href=\"https://www.programmerinterview.com/index.php/data-structures/difference-between-stack-and-heap/\"\u003ehttps://www.programmerinterview.com/index.php/data-structures/difference-between-stack-and-heap/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e栈是上下顺序存储的,且“先进后出LIFO”规则,只能删除顶部的元素,而堆是没有特定的顺序的存储,您可以删除任意元素。堆分配需要维护分配的内存和未分配的内存的完整记录,以及一些开销维护以减少碎片,找到足够大以适应请求大小的连续内存段,等等。内存可以随时释放,留出自由空间。有时,内存分配器将执行维护任务,比如通过将分配的内存到处移动来对内存进行碎片整理,或者在运行时进行垃圾收集——当内存不再处于作用域中时对其进行标识并释放它。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e栈用在线程中,程序执行时由线程创建有限数量的栈空间,当线程结束的时候会自动回收,属于系统级。\n堆一般是由应用程序在启动时创建,由应用程序回收,属于应用级。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe stack is attached to a thread, so when the thread exits the stack is reclaimed. The heap is …\u003c/p\u003e\u003c/blockquote\u003e"
October 11, 2018
raft一致性算法动画演示
"\u003cp\u003e\u003ca href=\"http://thesecretlivesofdata.com/raft/\"\u003ehttp://thesecretlivesofdata.com/raft/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://raft.github.io/raft.pdf\"\u003eThe Raft Paper\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eraft算法中文版: \u003ca href=\"https://github.com/maemual/raft-zh_cn/blob/master/raft-zh_cn.md\"\u003ehttps://github.com/maemual/raft-zh_cn/blob/master/raft-zh_cn.md\u003c/a\u003e\u003c/p\u003e"
October 11, 2018
Kubernetes学习资源
"\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2021/04/1f57f5934f4db11b6e9e473ffd043b03.jpeg\" alt=\"\"\u003ek8s guide\u003c/p\u003e\n\u003ch2 id=\"准备\"\u003e准备\u003c/h2\u003e\n\u003cp\u003e对于一个新手来说,第一步是必须了解什么是 \u003ca href=\"https://kubernetes.io/zh/docs/concepts/overview/what-is-kubernetes/\"\u003ekubernetees\u003c/a\u003e、 \u003ca href=\"https://kubernetes.io/zh/docs/concepts/architecture/\"\u003e设计架构\u003c/a\u003e 和相关 \u003ca href=\"https://kubernetes.io/zh/docs/concepts/\"\u003e概念\u003c/a\u003e。只有在了解了这些的情况下,才能更好的知道k8s中每个组件的作用以及它解决的问题。\u003c/p\u003e\n\u003ch2 id=\"安装工具\"\u003e安装工具\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://minikube.sigs.k8s.io/\"\u003eminikube\u003c/a\u003e 参考 \u003ca href=\"https://minikube.sigs.k8s.io/docs/start/\"\u003ehttps://minikube.sigs.k8s.io/docs/start/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://kind.sigs.k8s.io/docs/\"\u003ekind\u003c/a\u003e 参考 \u003ca href=\"https://kind.sigs.k8s.io/docs/user/quick-start/\"\u003ehttps://kind.sigs.k8s.io/docs/user/quick-start/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e以上是安装k8s环境的两种推荐方法,这里更推荐使用kind。主要原因是 \u003ccode\u003eminikube\u003c/code\u003e 只支持单个节点,而 \u003ccode\u003ekind\u003c/code\u003e 可以支持多个节点,这样就可以实现在一台电脑上部署的环境与生产环境一样,方便大家学习。\u003c/p\u003e\n\u003cp\u003e要实现管理控制 Kubernetes 集群资源如pod、node、service等的管理,还必须安装一个命令工具 \u003ca href=\"https://kubernetes.io/zh/docs/reference/kubectl/kubectl/\"\u003ekubectl\u003c/a\u003e ,请参考: \u003ca href=\"https://kubernetes.io/zh/docs/tasks/tools/\"\u003ehttps://kubernetes.io/zh/docs/tasks/tools/\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"学习文档\"\u003e学习文档\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eKubernetes 文档 \u003ca href=\"https://kubernetes.io/zh/docs/home/\"\u003ehttps://kubernetes.io/zh/docs/home/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePlay with …\u003c/li\u003e\u003c/ul\u003e"
September 29, 2018
kubernetes中apiserver的证书
"\u003cp\u003e在kubernetes中,与api server 通讯时一般都需要使用https证书,这些证书文件存在放 /etc/kubernetes/pki 目录中(ubuntu)。主要有以下几种\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e/etc/kubernetes/pki/ca.{crt,key}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e如果你已有现成的证书也可以直接将证书复制到这个目录里即可。这时kubeadm就会跳过证书生成这个步骤。\u003c/p\u003e\n\u003cp\u003e证书生成后,kubeadm 接下来会为其它组件生成访问api server 所需要的配置文件,这些文件路径为: /etc/kubernetes/xxx.conf:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003els /etc/kubernetes/\nadmin.conf controller-manager.conf kubelet.conf scheduler.conf\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这里可以看到这四个配置文件,分别 为不同的组件之间提供配置。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/kubernetes-master.jp\"\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/kubernetes-master.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e这些配置文件中存储的是Master节点的ip地址、端口号、证书目录等信息。这样对应的客户端(scheduler,kubelet, controller-manager等)就可以直接加载并读取相应的配置文件来与kube-apiserver 建立安全连 …\u003c/p\u003e"
August 1, 2018
Redis中的锁
"\u003cp\u003e单Redis实例锁: \u003ca href=\"http://www.redis.cn/commands/setnx.html\"\u003ehttp://www.redis.cn/commands/setnx.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e分布式锁: \u003ca href=\"http://redis.cn/topics/distlock.html\"\u003ehttp://redis.cn/topics/distlock.html\u003c/a\u003e(提供各种开发语言提供的库)\u003c/p\u003e"
July 10, 2018
使用Dockerfile构建Swoole+php7环境
"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eFROM php:7.2.7-cli\nRUN apt-get update \n \u0026amp;\u0026amp; apt-get install -y libmemcached-dev zlib1g-dev\nRUN pecl install redis-4.0.1 \n \u0026amp;\u0026amp; pecl install swoole-4.0.1 \n \u0026amp;\u0026amp; pecl install memcached-3.0.4 \n \u0026amp;\u0026amp; pecl install xdebug-2.6.0 \n \u0026amp;\u0026amp; docker-php-ext- enable redis swoole memcached xdebug\nCOPY . /usr/src/myapp\nWORKDIR /usr/src/myapp\nCMD [ \u0026#34;php\u0026#34;, \u0026#34;-m\u0026#34; ]\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e构建完环境后,使用方法见: \u003ca href=\"https://blog.haohtml.com/archives/17925\"\u003ehttps://blog.haohtml.com/archives/17925 …\u003c/a\u003e\u003c/p\u003e"
July 5, 2018
一个docker-compose微服务脚本,自用
"\u003cp\u003e容器为swoole+php7\u003c/p\u003e\n\u003cp\u003edocker-compose.yml\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eversion: \u0026#39;3.6\u0026#39;\nservices:\n redis:\n image: redis\n web:\n image: cfanbo/swoole4_php7:v1\n depends_on:\n - redis\n links:\n - redis\n volumes:\n - /Users/sxf/sites/msgserve:/usr/src/myapp\n command: \u0026#34;php /usr/src/myapp/src/wx_push_server.php start\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e对于 wx_push_server.php文件里redis的主机地址应该写成docker-compose配置文件里的容器服务名(redis)\u003c/p\u003e"
June 15, 2018
服务发现:Zookeeper vs etcd vs Consul vs Eureka
"\u003cp\u003e\u003ca href=\"https://studygolang.com/articles/4837\"\u003ehttps://studygolang.com/articles/4837\u003c/a\u003e \u003ca href=\"https://blog.csdn.net/dengyisheng/article/details/71215234\"\u003ehttps://blog.csdn.net/dengyisheng/article/details/71215234\u003c/a\u003e\u003c/p\u003e"
June 13, 2018
分布式事务XA解决方案之两阶段提交(2PC)
"\u003cp\u003e对于三阶段提交请参考:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/binyue/p/3678390.html\"\u003ehttps://www.cnblogs.com/binyue/p/3678390.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/charlesblc/p/6289348.html\"\u003ehttps://www.cnblogs.com/charlesblc/p/6289348.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e在 \u003ca href=\"https://zh.wikipedia.org/wiki/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C\" title=\"计算机网络\"\u003e计算机网络\u003c/a\u003e 以及 \u003ca href=\"https://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E5%BA%93\" title=\"数据库\"\u003e数据库\u003c/a\u003e 领域内, \u003cstrong\u003e二阶段提交\u003c/strong\u003e(英语:Two-phase Commit)是指,为了使基于 \u003ca href=\"https://zh.wikipedia.org/wiki/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F\" title=\"分布式系统\"\u003e分布式系统\u003c/a\u003e 架构下的所有节点在进行 \u003ca href=\"https://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E5%BA%93%E4%BA%8B%E5%8A%A1\" title=\"数据库事务\"\u003e事务\u003c/a\u003e 提交时保持一致性而设计的一种 \u003ca href=\"https://zh.wikipedia.org/wiki/%E7%AE%97%E6%B3%95\" title=\"算法\"\u003e算法\u003c/a\u003e(Algorithm)。通常, \u003cstrong\u003e二阶段提交\u003c/strong\u003e 也被称为是一种 \u003cstrong\u003e协议\u003c/strong\u003e(Protocol)。在分布式系统中,每个节点虽然可以知晓自己的操作时成功或者失败,却无法知道其他节点的操作的成功或失败。当一个事务跨越多个节点时,为了保持事务的 \u003ca href=\"https://zh.wikipedia.org/wiki/ACID\" title=\"ACID\"\u003eACID\u003c/a\u003e 特性,需要引入一个作为 \u003cstrong\u003e协调者\u003c/strong\u003e 的组件来统一掌控所有节点(称作 \u003cstrong\u003e参与者\u003c/strong\u003e)的操作结果并最终指示这些节点是否要把操作结果进行真正的提交(比如将更新后的数据写入磁盘等等)。因此,二阶段提交的算法思路可以概括为: \u003cstrong\u003e参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情报决定各参与者是否要提交操作还是中止操作。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e需要注意的是, \u003cstrong\u003e二阶段提交\u003c/strong\u003e(英文缩写: \u003cstrong\u003e2PC\u003c/strong\u003e)不 …\u003c/p\u003e"
April 20, 2018
使用docker-compose 快速创建一个mysql 数据库容器
"\u003cp\u003e\u003cstrong\u003e//创建一个独立的容器目录\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emkdir docker-db\ncd docker-db\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e前提、创建 docker Compose 配置文件\u003c/strong\u003e\n#vi docker-compose.yml 文件,内容如下\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eversion: \u0026#39;3.6\u0026#39;\nservices:\n\n db:\n image: hub.c.163.com/library/mysql:5.7\n restart: always\n environment:\n MYSQL_ROOT_PASSWORD: 123456\n MYSQL_DATABASE: wordpress\n MYSQL_USER: root\n MYSQL_PASSWORD: 123456\n MYSQL_ALLOW_EMPTY_PASSWORD: \u0026#34;yes\u0026#34;\n ports:\n - \u0026#34;33061:3306\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eimage也可以直接写mysql:5.7 …\u003c/p\u003e"
February 8, 2018
Docker Machine 简介
"\u003cp\u003e一句话概括的话就是 Docker Machine是一个可以方便对多个宿主服务器中的多个容器进行管理的工具。\u003c/p\u003e\n\u003cp\u003eDocker 与 Docker Machine 的区别 \u003ca href=\"https://www.cnblogs.com/sparkdev/p/7066789.html\"\u003ehttps://www.cnblogs.com/sparkdev/p/7066789.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eDocker Machine 工具出现的意义 \u003ca href=\"https://www.2cto.com/net/201707/660864.html\"\u003ehttps://www.2cto.com/net/201707/660864.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eDocker Machine 用法 \u003ca href=\"http://www.linuxidc.com/Linux/2017-06/145232.htm\"\u003ehttp://www.linuxidc.com/Linux/2017-06/145232.htm\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eDocker Machine 命令 \u003ca href=\"http://blog.csdn.net/warren_1992/article/details/51451522\"\u003ehttp://blog.csdn.net/warren_1992/article/details/51451522\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eMac平台上Docker安装与使用 \u003ca href=\"http://blog.csdn.net/warren_1992/article/details/51451522\"\u003ehttp://blog.csdn.net/warren_1992/article/details/51451522\u003c/a\u003e\u003c/p\u003e"
February 8, 2018
windows平台在dos下执行docker pull 命令出错
"\u003cp\u003e\u003cstrong\u003e这里docker Machine 是安装和管理 Docker 的工具(用来代替Boot2Docker,对于个人玩的话,不建议使用docker Machine,毕竟多了一个虚拟层,不如直接使用当前物理机器作为容器的宿主机)\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ docker pull gitlab/gitlab-ce:latest\n\u003c/code\u003e\u003c/pre\u003e\u003cblockquote\u003e\n\u003cp\u003eWarning: failed to get default registry endpoint from daemon (error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.33/info: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the …\u003c/p\u003e\u003c/blockquote\u003e"
November 19, 2017
centos 下安装 certbot 常见问题
"\u003cp\u003e上一篇( \u003ca href=\"https://blog.haohtml.com/archives/17422\"\u003ehttps://blog.haohtml.com/archives/17422\u003c/a\u003e)我们介绍了centos下安装certbot的方法,但有时间服务器环境不一样,总会遇到一些问题,常见问题如下:\u003c/p\u003e\n\u003cp\u003ecentos7.5下安装certbot常见问题\u003c/p\u003e\n\u003cp\u003e一、出错”ImportError: ‘pyOpenSSL’ module missing required functionality. Try upgrading to v0.14 or newer.“\n解决办法:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo pip uninstall pyOpenssl\nsudo pip install pyOpenSSL==0.14.0\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e查看版本:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epip show pyOpenssl\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e一、出错信息为“certbot AttributeError: ‘module’ object has no attribute ‘SSL_ST_INIT’”\u003c/p\u003e\n\u003cp\u003e解决办法:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epip uninstall pyOpenSSL\npip install pyOpenSSL==16.2.0\n\u003c/code\u003e\u003c/pre\u003e"
December 12, 2016
使用Gitlab一键安装包后的日常备份恢复与迁移
"\u003ch4 id=\"gitlab-创建备份\"\u003e\u003cstrong\u003eGitlab 创建备份\u003c/strong\u003e\u003c/h4\u003e\n\u003cp\u003e使用Gitlab一键安装包安装Gitlab非常简单, 同样的备份恢复与迁移也非常简单. 使用一条命令即可创建完整的Gitlab备份:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003egitlab-rake gitlab:backup:create\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e使用以上命令会在\u003ccode\u003e/var/opt/gitlab/backups\u003c/code\u003e目录下创建一个名称类似为\u003ccode\u003e1393513186_gitlab_backup.tar\u003c/code\u003e的压缩包, 这个压缩包就是Gitlab整个的完整部分, 其中开头的\u003ccode\u003e1393513186\u003c/code\u003e是备份创建的日期.\u003c/p\u003e\n\u003ch4 id=\"gitlab-修改备份文件默认目录\"\u003e\u003cstrong\u003eGitlab 修改备份文件默认目录\u003c/strong\u003e\u003c/h4\u003e\n\u003cp\u003e你也可以通过修改\u003ccode\u003e/etc/gitlab/gitlab.rb\u003c/code\u003e来修改默认存放备份文件的目录:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003egitlab_rails[\u0026#39;backup_path\u0026#39;] = \u0026#39;/mnt/backups\u0026#39;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003e/mnt/backups\u003c/code\u003e修改为你想存放备份的目录即可, 修改完成之后使用\u003ccode\u003egitlab-ctl reconfigure\u003c/code\u003e命令重载配置文件即可.\u003c/p\u003e\n\u003ch4 id=\"gitlab-自动备份\"\u003e\u003cstrong\u003eGitlab 自动备份\u003c/strong\u003e\u003c/h4\u003e\n\u003cp\u003e也可以通过\u003ccode\u003ecrontab\u003c/code\u003e使用备份命令实现自动备份:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo su -\ncrontab -e\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e加入以下, 实现每天凌 …\u003c/p\u003e"
November 4, 2016
在linux下,解决修改文件权限引起的git出现的文件变化问题
"\u003cp\u003e有时候,我们将服务器上的web文件夹的权限进行了修改,但git默认是也会记录权限状态的,这个时间用git status会发现所有的文件都处于被修改的状,这显示不是我们想要的。这时我们只要让git把文件权限忽略掉就可以了。\u003c/p\u003e\n\u003cp\u003e在操作前首先我们确认一下当前配置项core.filemode,默认为true,(也可以使用cat .git/config查看)\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ git config --list\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e然后执行\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ git config core.filemode false\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这样就设置了忽略文件权限。查看下配置:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ cat .git/config\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/git%E5%BF%BD%E7%95%A5%E6%96%87%E4%BB%B6%E6%9D%83%E9%99%90%E7%9A%84%E9%85%8D%E7%BD%AE.png\" alt=\"git%e5%bf%bd%e7%95%a5%e6%96%87%e4%bb%b6%e6%9d%83%e9%99%90%e7%9a%84%e9%85%8d%e7%bd%ae\"\u003e]\ngit忽略文件权限的配置\u003c/p\u003e"
March 15, 2016
给一个正在运行的Docker容器动态添加Volume(转)
"\u003cp\u003e之前有人问我Docker容器启动之后还能否再挂载卷,考虑mnt命名空间的工作原理,我一开始认为这很难实现。不过现在我认为是它实现的。\u003c/p\u003e\n\u003cp\u003e简单来说,要想将磁盘卷挂载到正在运行的容器上,我们需要:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e使用\u003ca href=\"https://github.com/jpetazzo/nsenter\"\u003ensenter\u003c/a\u003e将包含这个磁盘卷的整个文件系统mount到临时挂载点上;\u003c/li\u003e\n\u003cli\u003e从我们想当作磁盘卷使用的特定文件夹中创建绑定挂载(bind mount)到这个磁盘卷的位置;\u003c/li\u003e\n\u003cli\u003eumount第一步创建的临时挂载点。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"注意事项\"\u003e\u003cstrong\u003e注意事项\u003c/strong\u003e\u003c/h4\u003e\n\u003cp\u003e在下面的示例中,我故意包含了$符号来表示这是Shell命令行提示符,以帮助大家区分哪些是你需要输入的,哪些是机器回复的。有一些多行命令,我也继续用\u0026gt;。我知道这样使得例子里的命令无法轻易得被拷贝粘贴。如果你想要拷贝粘贴代码,请查看文章最后的示例脚本。\u003c/p\u003e\n\u003ch4 id=\"详细步骤\"\u003e\u003cstrong\u003e详细步骤\u003c/strong\u003e\u003c/h4\u003e\n\u003cp\u003e下面示例的前提是你已经使用如下命令启动了一个简单的名为charlie的容器:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ docker run --name charlie -ti ubuntu bash\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e我们需要做的是将宿主文件夹 \u003ccode\u003e/home/jpetazzo/Work/DOCKER/docker\u003c/code\u003e 挂载到容器里的 \u003ccode\u003e/src\u003c/code\u003e 目录。好了,让我们开始吧。 …\u003c/p\u003e"
March 30, 2015
亿级用户下的新浪微博平台架构
"\u003ch2 id=\"序言\"\u003e序言\u003c/h2\u003e\n\u003cp\u003e新浪微博在2014年3月公布的月活跃用户(MAU)已经达到1.43亿,2014年新年第一分钟发送的微博达808298条,如此巨大的用户规模和业务量,需要高可用(HA)、高并发访问、低延时的强大后台系统支撑。\u003c/p\u003e\n\u003cp\u003e微博平台第一代架构为LAMP架构,数据库使用的是MyIsam,后台用的是php,缓存为Memcache。\u003c/p\u003e\n\u003cp\u003e随着应用规模的增长,衍生出的第二代架构对业务功能进行了模块化、服务化和组件化,后台系统从php替换为Java,逐渐形成SOA架构,在很长一段时间支撑了微博平台的业务发展。\u003c/p\u003e\n\u003cp\u003e在此基础上又经过长时间的重构、线上运行、思索与沉淀,平台形成了第三代架构体系。\u003c/p\u003e\n\u003cp\u003e我们先看一张微博的核心业务图(如下),是不是非常复杂?但这已经是一个简化的不能再简化的业务图了,第三代技术体系就是为了保障在微博核心业务上快速、高效、可靠地发布新产品新功能。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://static.codeceo.com/images/2015/01/55d1809347e311e238e6a71e3fb726c0.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003ch2 id=\"第三代技术体系\"\u003e第三代技术体系\u003c/h2\u003e\n\u003cp\u003e微博平台的第三代技术体系,使用正交分解法建立模型:在水平方向,采用典型的三级分层模型,即接口层、服务层与资源层;在垂直方向,进一步细分为业务架构、技术架构、监控平台与服务治理平台。下面是平台的整体架构图:\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://static.codeceo.com/images/2015/01/405eb2f493a34eb937bfb32f08a34c12.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e如上图所示,正交分解法将整 …\u003c/p\u003e"
March 28, 2015
用PHP尝试RabbitMQ(amqp扩展)实现消息的发送和接收
"\u003cp\u003e上篇文章我们介绍了 \u003ca href=\"http://blog.haohtml.com/archives/15484\"\u003eamqp扩展在windows下的安装方法\u003c/a\u003e,这里我们看一下用法。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e消费者:接收消息\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e逻辑:\n创建连接–\u0026gt;创建channel–\u0026gt;创建交换机–\u0026gt;创建队列–\u0026gt;绑定交换机/队列/路由键–\u0026gt;接收消息\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026lt;?php\n/*************************************\n* PHP amqp(RabbitMQ) Demo - consumer\n* Author: Linvo\n* Date: 2012/7/30\n*************************************/\n//配置信息\n$conn_args = array(\n \u0026#39;host\u0026#39; =\u0026gt; \u0026#39;192.168.1.93\u0026#39;,\n \u0026#39;port\u0026#39; =\u0026gt; \u0026#39;5672\u0026#39;,\n \u0026#39;login\u0026#39; =\u0026gt; \u0026#39;guest\u0026#39;,\n \u0026#39;password\u0026#39; =\u0026gt; \u0026#39;guest\u0026#39;, …\u003c/code\u003e\u003c/pre\u003e"
March 28, 2015
windows下安装rabbitmq的php扩展amqp(原创)
"\u003cp\u003e从php官方下载相应的版本 \u003ca href=\"http://pecl.php.net/package/amqp\"\u003ehttp://pecl.php.net/package/amqp\u003c/a\u003e,我这里使用的是1.4.0版本( \u003ca href=\"http://pecl.php.net/package/amqp/1.4.0/windows\"\u003ehttp://pecl.php.net/package/amqp/1.4.0/windows\u003c/a\u003e)\n根据当前使用的php版本选择相应的扩展dll,下载后是一个压缩包,里面有两个dll扩展(php_amqp.dll和rabbitmq.1.dll)。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2015/03/php_amqp1.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/php_amqp1.jpg\" alt=\"php_amqp\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e我的环境是64位的,php5.5.12.所以使用的是 \u003ca href=\"http://windows.php.net/downloads/pecl/releases/amqp/1.4.0/php_amqp-1.4.0-5.5-ts-vc11-x64.zip\"\u003ehttp://windows.php.net/downloads/pecl/releases/amqp/1.4.0/php_amqp-1.4.0-5.5-ts-vc11-x64.zip\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e1.将php_amqp.dll放在php的ext目录里,然后修改php.ini文件,在文件的最后面添加两行\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[amqp\\]\nextension=php_amqp.dll\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e2.将rabbitmq.1.dll文件放在php的根目录里(也就是ext目录的父级目录),然后修改apache的httpd.con文件,文件尾部添加一行\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eLoadFile …\u003c/code\u003e\u003c/pre\u003e"
August 2, 2014
RabbitMQ中的ack介绍
"\u003cp\u003eno_ack 的用途:确保 message 被 consumer “成功”处理了。这里“成功”的意思是,(在设置了 no_ack=false 的情况下)只要 consumer 手动应答了 Basic.Ack ,就算其“成功”处理了。\u003c/p\u003e\n\u003cp\u003e对于ack简单的说就是“消费者”先从queue里读取一条数据,然后去处理,等处理完了,再给queue一个 ack 回应,表示处理完了,这时queue就将这条数据从队列中删除。如果不回应给队列ack的话,则这条消息仍然存在在queue中(这个也属于一种应用场景)。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e在 no_ack=true 的情况下,RabbitMQ 认为 message 一旦被 deliver 出去了,就已被确认了,所以会立即将缓存中的 message 删除。所以在 consumer 异常时会导致消息丢失。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003eno_ack=false\u003c/strong\u003e(此时为 \u003cstrong\u003e手动应答\u003c/strong\u003e)\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e在这种情况下,要求 consumer 在处理完接收到的 Basic.Deliver + Content-Header + Content-Body 之后才回复 Ack 。而这个 Ack 是 AMQP 协议中的 Basic.Ack …\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e"
August 1, 2014
认识 RabbitMQ 消息队列
"\u003ch1 id=\"rabbitmq架构图\"\u003eRabbitMQ架构图\u003c/h1\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2014/08/rabbitmq-struct.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/rabbitmq-struct.png\" alt=\"rabbitmq-struct\"\u003e\u003c/a\u003e rabbitmq 架构图\u003c/p\u003e\n\u003ch1 id=\"基本概念\"\u003e基本\u003cstrong\u003e概念\u003c/strong\u003e\u003c/h1\u003e\n\u003cp\u003e\u003ccode\u003eBroker\u003c/code\u003e:简单来说就是消息队列服务器实体。\n\u003ccode\u003eExchange\u003c/code\u003e:消息交换机,它指定消息按什么规则,路由到哪个队列。\n\u003ccode\u003eQueue\u003c/code\u003e:消息队列载体,每个消息都会被投入到一个或多个队列。\n\u003ccode\u003eBinding\u003c/code\u003e:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。\n\u003ccode\u003eRouting Key\u003c/code\u003e:路由关键字,exchange根据这个关键字进行消息投递。\n\u003ccode\u003evhost\u003c/code\u003e:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。\n\u003ccode\u003eproducer\u003c/code\u003e:消息生产者,就是投递消息的程序。\n\u003ccode\u003econsumer\u003c/code\u003e:消息消费者,就是接受消息的程序。\n\u003ccode\u003echannel\u003c/code\u003e:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。\u003c/p\u003e\n\u003ch1 id=\"操作流程\"\u003e操作流程\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e(1)客户端连接到消息队列服务器,打开一个channel。\u003c/li\u003e\n\u003cli\u003e(2)客户端声明一个exchange,并设置相关属性。\u003c/li\u003e\n\u003cli\u003e(3)客户端声明一个queue,并设置相关属性。\u003c/li\u003e\n\u003cli\u003e(4)客户端使用routing key,在exchange和queue之间建立好绑定关系。\u003c/li\u003e\n\u003cli\u003e(5)客户 …\u003c/li\u003e\u003c/ul\u003e"
August 1, 2014
将rabbitmq 里的消息持久化
"\u003ch2 id=\"消息持久设置\"\u003e消息持久设置:\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e将交换机置为可持久;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e将通道置为可持久\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e消息发送时设置可持久。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e当我们“生产”了一条可持久化的消息,尝试中断MQ服务,启动消费者获取消息,消息依然能够恢复。相反,则抛出异常。\u003c/p\u003e\n\u003cp\u003e上面三条必须全部设置,不然消息将无法持久化。\u003c/p\u003e"
August 1, 2014
rabbitmq 添加远程访问功能
"\u003cp\u003e刚刚安装过的rabbitmq 消息队列,并启用了插件管理功能,3.3.1版中,处于安全的考虑,guest这个默认的用户只能通过http://localhost:15672 来登录,其他的IP无法直接使用这个账号。 这对于服务器上没有安装桌面的情况是无法管理维护的,除非通过在前面添加一层代理向外提供服务,这个又有些麻烦了,这里通过配置文件来实现这个功能。\u003c/p\u003e\n\u003cp\u003e只要编辑 /etc/rabbitmq/rabbitmq.config 文件,添加以下配置就可以了。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[\n{rabbit, [{tcp_listeners, [5672]}, {loopback_users, [“asdf”]}]}\n].\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e现在添加了一个新授权用户asdf,可以通过外网使用这个用户名和密码访问.(记得要先用命令添加这个命令才行,#rabbitmqctl add_user asdf pwd123456)我是通过在管理平台里直接添加的用户和密码的,我的测试环境装有桌面的。\n参考文档: \u003ca href=\"http://www.rabbitmq.com/access-control.html\"\u003ehttp://www.rabbitmq.com/access-control.html\u003c/a\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# rabbitmqctl add_user …\u003c/code\u003e\u003c/pre\u003e"
August 1, 2014
【架构】关于RabbitMQ
"\u003ch1 id=\"1什么是rabbitmq\"\u003e1 什么是RabbitMQ?\u003c/h1\u003e\n\u003cp\u003eRabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然:\n\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2014/08/rabbitmq_decouping.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/rabbitmq_decouping.png\" alt=\"rabbitmq_decouping\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e单向解耦\n双向解耦(如:RPC)\u003c/p\u003e\n\u003cp\u003e例如一个日志系统,很容易使用RabbitMQ简化工作量,一个Consumer可以进行消息的正常处理,另一个Consumer负责对消息进行日志记录,只要在程序中指定两个Consumer所监听的queue以相同的方式绑定到同一个exchange即可,剩下的消息分发工作由RabbitMQ完成。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2014/08/rabbitmq_producer_consumer.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/rabbitmq_producer_consumer.png\" alt=\"rabbitmq_producer_consumer\"\u003e\u003c/a\u003e\n使用RabbitMQ server需要:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eErLang语言包;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRabbitMQ安装包;\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eRabbitMQ同时提供了java的客户端(一个jar包)。\u003c/p\u003e\n\u003ch1 id=\"2概念和特性\"\u003e2 概念和特性\u003c/h1\u003e\n\u003ch2 id=\"21交换机exchange\"\u003e2.1 交换机(exchange):\u003c/h2\u003e\n\u003cp\u003e1. 接收消息,转发消息到绑定的队列。四种类型:direct, topic, headers and fanout\u003c/p\u003e\n\u003cp\u003edirect:转发消息 …\u003c/p\u003e"
June 17, 2014
进程管理工具Supervisord
"\u003ch2 id=\"supervisord-简介\"\u003eSupervisord 简介\u003c/h2\u003e\n\u003cp\u003e上面已经介绍了Go目前是有两种方案来实现他的daemon,但是官方本身还不支持这一块,所以还是建议大家采用第三方成熟工具来管理我们的应用程序,这里我给大家介绍一款目前使用比较广泛的进程管理软件: \u003ca href=\"http://supervisord.org/\"\u003eSupervisord\u003c/a\u003e。Supervisord是用Python实现的一款非常实用的进程管理工具。supervisord会帮你把管理的应用程序转成daemon程序,而且可以方便的通过命令开启、关闭、重启等操作,而且它管理的进程一旦崩溃会自动重启,这样就可以保证程序执行中断后的情况下有自我修复的功能。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e我前面在应用中踩过一个坑,就是因为所有的应用程序都是由Supervisord父进程生出来的,那么当你修改了操作系统的文件描述符之后,别忘记重启Supervisord,光重启下面的应用程序没用。当初我就是系统安装好之后就先装了Supervisord,然后开始部署程序,修改文件描述符,重启程序,以为文件描述符已经是100000了,其实Supervisord这个时候还是默认的1024个,导致他管理的进程所有的描述符也是1024.开放之后压力一上来系统就开始报文件描述符用光 …\u003c/p\u003e\u003c/blockquote\u003e"
June 17, 2014
京东网站url规划分析
"\u003cp\u003e对于一些大型产品网站,当不同产品项的过滤条件不一样的时候,多个过滤条件会完全不一样。如服装行业与电脑配置的许多参数都不一样。而他们又是如何实现自动通过程序来调用的呢,是一个很值得学习的知识的。\u003c/p\u003e\n\u003cp\u003e下面我们来通过京东其中一个服装url来看一下,他们是如何实现这一点的。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2014/06/jd_url_parse1.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/jd_url_parse1.png\" alt=\"jd_url_parse1\"\u003e\u003c/a\u003e上图是对于一些大类频道的url规划信息。非常的清楚,就不再一一讲述了。下面我们主要讲右侧”条件筛选“这一块.\u003c/p\u003e\n\u003cp\u003e分析url:\n\u003ca href=\"http://list.jd.com/list.html?cat=1315%2C1342%2C9733\u0026amp;brand=35553%2Ctzmall\u0026amp;page=1\u0026amp;ext=53345%3A%3A1373%5E%5E64135%3A%3A8646%5E%5E95400%3A%3A8648%5E%5E10669%3A%3A1656%5E%5E29520%3A%3A1589%5E%5E110357%3A%3A10991%5E%5E\u0026amp;delivery=2\u0026amp;sort=sort_dredisprice_asc\"\u003ehttp://list.jd.com/list.html?cat=1315%2C1342%2C9733\u0026amp;brand=35553%2Ctzmall\u0026amp;page=1\u0026amp;ext=53345%3A%3A1373%5E%5E64135%3A%3A8646%5E%5E95400%3A%3A8648%5E%5E10669%3A%3A1656%5E%5E29520%3A%3A1589%5E%5E110357%3A%3A10991%5E%5E\u0026amp;delivery=2\u0026amp;sort=sort_dredisprice_asc\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e经过用js的unescape(url)反编码后,得出url …\u003c/p\u003e"
June 15, 2014
Swift中的柯里化函数
"\u003cp\u003e柯里化函数(curried function)的类型相当于一个嵌套函数类型。例如,下面的柯里化函数 \u003ccode\u003eaddTwoNumber()()\u003c/code\u003e 的类型是 \u003ccode\u003eInt -\u0026gt; Int -\u0026gt; Int\u003c/code\u003e:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-lang-swift\" data-lang=\"lang-swift\"\u003efunc addTwoNumbers(a: Int)(b: Int) -\u0026gt; Int{\n return a + b\n}\naddTwoNumbers(4)(5) // returns 9\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e柯里化函数的函数类型从右向左组成一组。例如,函数类型 \u003ccode\u003eInt -\u0026gt; Int -\u0026gt; Int\u003c/code\u003e 可以被理解为 \u003ccode\u003eInt -\u0026gt; (Int -\u0026gt; Int)\u003c/code\u003e——也就是说,一个函数传入一个 \u003ccode\u003eInt\u003c/code\u003e 然后输出作为另一个函数的输入,然后又返回一个 \u003ccode\u003eInt\u003c/code\u003e。例如,你可以使用如下嵌套函数来重写柯里化函数 \u003ccode\u003eaddTwoNumbers()()\u003c/code\u003e:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-lang-swift\" data-lang=\"lang-swift\"\u003efunc addTwoNumbers(a: Int) -\u0026gt; (Int -\u0026gt; Int){\n func addTheSecondNumber(b: Int) -\u0026gt; Int{\n return a + b\n } …\u003c/code\u003e\u003c/pre\u003e"
April 8, 2014
日600亿消息,月4.65亿用户——WhatsApp的Erlang世界[架构设计](最新版)
"\u003cp\u003e来自 High Scalability。相较 \u003ca href=\"http://highscalability.com/blog/2014/2/26/the-whatsapp-architecture-facebook-bought-for-19-billion.html\"\u003e上篇\u003c/a\u003e,这篇内容更新、更全。 \u003ca href=\"http://www.csdn.net/article/2014-04-04/2819158-how-whatsapp-grew-to-nearly-500-million-users-11000-cores-an\"\u003e译文\u003c/a\u003e a\u003c/p\u003e\n\u003cp\u003e【编者按】在之前我们有分享过HighScalability创始人Tod Hoff总结的 \u003ca href=\"http://www.csdn.net/article/2014-02-27/2818559-an-overview-at-whatsapp%27s-19b-architecture\"\u003eWhatsApp早期架构\u003c/a\u003e,其中包括了大量的Erlang优化来支撑单服务器200万并发连接,以及如何支撑所有类型的手机并提供一个完美的用户体验。然而时过境迁,两年后WhatsApp又是如何支撑10倍于之前的流量,以及应用的飞速扩展,这里我们一起看Tod带来的总结。以下为译文:\u003c/p\u003e\n\u003ch3 id=\"两年内的飞跃\"\u003e两年内的飞跃\u003c/h3\u003e\n\u003cp\u003e天价应用当下的规模显然不能与两年前同日而语,这里总结了一些WhatsApp两年内发生的主要变化:\u003c/p\u003e\n\u003cp\u003e**1. **从任何维度上都可以看到WhatsApp的巨变,但是工程师的数量却一直未变。当下,WhatsApp有更多的主机、更多的数据中心、更多的内存、更多的用户以及更多的扩展性问题,然而最引以为豪的却是那支10人工程团队——每个工程师平均负责4000万个用户。当然,这也是云时代的胜利:工程师只负责软件的开发,网络、硬件及数据中心运维全部假手于人。\u003c/p\u003e\n\u003cp\u003e**2. **在之前,面对负载的激增,他们必须让单服务器支撑尽可能多的连接数,但是现在他 …\u003c/p\u003e"
February 18, 2014
纽约时报网站改版背后的web技术
"\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2014/02/nytimes-redesign.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2014/02/nytimes-redesign.png\" alt=\"nytimes-redesign\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e原文地址: \u003ca href=\"http://open.blogs.nytimes.com/2014/01/08/the-technology-behind-the-nytimes-com-redesign/?_php=true\u0026amp;_type=blogs\u0026amp;_php=true\u0026amp;_type=blogs\u0026amp;_r=1\"\u003e“The Technology Behind the NYTimes.com Redesign”\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e纽约时报英文网站今年进行了一次改版,这次改版不仅仅是给一艘大船重新刷了遍油漆那么简单,除了外观上的重新设计,我们也对代码进行了大量的重构,采用了新的框架,让网站更快,也为以后代码的维护、升级便利性进行了重新设计。 \u003ca href=\"https://twitter.com/remmons\"\u003eReed Emmons\u003c/a\u003e,是这次改版的负责人,在这篇文章将分享我们如何让纽约时报这首老船更快更酷。\u003c/p\u003e\n\u003cp\u003e很少有机会能够在像纽约时报这么老资格和规模的网站进行一场「从头来过」的重构和设计工作,我这里说的从头来过,不仅仅是视觉设计上的重新设计,更是一个重新发明整个数码传媒平台。纽约时报的上次一次视觉改版是在2006年,但是我们得回溯到2000千禧年才有如此规模的从底层的重构和改版。我们决定重构用户端和服务端以支持我们新的服务、设计和新闻报道,比如说更佳的网站性能、响应式布局等等。尽管有些旧有的代码依旧保留或者进行了深度重构,大部分老的代码都被删除或者仅仅是用来做参考。\u003c/p\u003e\n\u003ch4 id=\"静态页面发布历史的教训\"\u003e\u003cstrong\u003e静态页面发布:历史的教训\u003c/strong\u003e\u003c/h4\u003e\n\u003cp\u003e直到今天为止,纽约时报的大部分网页内容还是静态 html 页面,这些页面储存在我们 …\u003c/p\u003e"
November 9, 2013
lxc学习-安装篇
"\u003cp\u003e\u003cstrong\u003e安装环境:\u003c/strong\u003e\u003c/p\u003e\n\u003ch1 id=\"内存-1g\"\u003eVirtualBox 4.2.18\nCentos6.4 64位\n内存 1G\u003c/h1\u003e\n\u003cp\u003e\u003cstrong\u003e安装方法:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e[shell]\u003c/p\u003e\n\u003cp\u003eyum -y install gcc libcap-devel libcgroup\nwget \u0026ldquo;\u003ca href=\"http://downloads.sourceforge.net/project/lxc/lxc/lxc-0.9.0/lxc-0.9.0.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Flxc%2Ffiles%2Flxc%2F\u0026amp;ts=1383981486\u0026amp;use_mirror=jaist%22\"\u003ehttp://downloads.sourceforge.net/project/lxc/lxc/lxc-0.9.0/lxc-0.9.0.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Flxc%2Ffiles%2Flxc%2F\u0026amp;ts=1383981486\u0026amp;use_mirror=jaist\u0026quot;\u003c/a\u003e\ntar zxvf lxc-0.9.0.tar.gz\ncd lxc-0.9.0\n./autogen.sh\n./configure\nmake \u0026amp;\u0026amp; make install[/shell]\u003c/p\u003e\n\u003cp\u003e这里,在/usr/local/bin 目录里可以看到以 lxc_开头的命令.(注意要将这个目录添加到用户的环境变量里)\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/11/lxc_commends.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2013/11/lxc_commends.png\" alt=\"lxc_commends\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e更多学习参考资料请参考: …\u003c/p\u003e"
October 22, 2013
安装zeromq时,出现 error while loading shared libraries: libzmq.so 错误的解决办法
"\u003cp\u003eIs this on Ubuntu? You’ll need to add /usr/local/lib to ldconfig to be able to use ZeroMQ. Here’s a web page with some info: \u003ca href=\"http://ubuntuforums.org/showthread.php?t=420008\"\u003ehttp://ubuntuforums.org/showthread.php?t=420008\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eHere are the actual instructions:\u003c/p\u003e\n\u003cp\u003eAdd \u003cstrong\u003e/usr/local/lib\u003c/strong\u003e to a new line in ld.so.conf:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ sudo vi /etc/ld.so.conf\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eRerun ldconfig:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ sudo ldconfig\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThat should work (if I remember correctly). Let me know if you have any issues.\u003c/p\u003e"
August 8, 2013
Redis配置文件参数说明
"\u003cp\u003e\u003cstrong\u003e配置文件参数说明\u003c/strong\u003e:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eRedis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003edaemonize no\u003c/strong\u003e\u003c/p\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003e当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003epidfile /var/run/redis.pid\u003c/strong\u003e\u003c/p\u003e\n\u003col start=\"3\"\u003e\n\u003cli\u003e指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e** port 6379**\u003c/p\u003e\n\u003col start=\"4\"\u003e\n\u003cli\u003e绑定的主机地址\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003ebind 127.0.0.1\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e5.当 客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003etimeout 300\u003c/strong\u003e\u003c/p\u003e\n\u003col start=\"6\"\u003e\n\u003cli\u003e指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eloglevel verbose\u003c/strong\u003e\u003c/p\u003e\n\u003col start=\"7\"\u003e\n\u003cli\u003e日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送 …\u003c/li\u003e\u003c/ol\u003e"
May 5, 2013
linux下安装zeromq消息队列软件
"\u003cp\u003e在上一节 \u003ca href=\"http://blog.haohtml.com/archives/13790\"\u003e消息中间件的技术选型心得-RabbitMQ、ActiveMQ和ZeroMQ\u003c/a\u003e 我们介绍了一些相关的消息队列软件.这里我们对安装zeromqq这款软件的安装及php使用方法介绍一下.\u003c/p\u003e\n\u003cp\u003ecentos下安装zeromq消息队列软件.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一.安装服务端\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecd ~\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewget http://download.zeromq.org/zeromq-3.2.3.tar.gz\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etar zxvf zeromq-3.2.3.tar.gz\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecd zeromq-3.2.3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e./configure \u003cspan style=\"color:#75715e\"\u003e# –prefix=/usr/local/zeromq\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emake \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e make install\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e**二.安装php扩展 **\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit clone git://github.com/mkoppanen/php-zmq.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecd php-zmq\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ephpize\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e./configure –with-php-config\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e/usr/local/php/bin/php-config\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emake \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e make install\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e执行完以后,会提示:\u003c/p\u003e\n\u003cp\u003eInstalling shared …\u003c/p\u003e"
May 5, 2013
消息中间件的技术选型心得-RabbitMQ、ActiveMQ和ZeroMQ
"\u003cp\u003eRabbitMQ、ActiveMQ和ZeroMQ都是极好的消息中间件,但是我们在项目中该选择哪个更适合呢?很多开发者面临这个烦恼。下面我会对这三个消息中间件做一个比较,看了后你们就心中有数了。\u003c/p\u003e\n\u003cp\u003eRabbitMQ是AMQP协议领先的一个实现,它实现了代理(Broker)架构,意味着消息在发送到客户端之前可以在中央节点上排队。此特性使得RabbitMQ易于使用和部署,适宜于很多场景如路由、负载均衡或消息持久化等,用消息队列只需几行代码即可搞定。但是,这使得它的可扩展性差,速度较慢,因为中央节点增加了延迟,消息封装后也比较大。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/05/rabbitmq.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/rabbitmq.jpg\" alt=\"rabbitmq\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.zeromq.org/\"\u003eZeroMQ\u003c/a\u003e 是一个非常轻量级的消息系统,专门为高吞吐量/低延迟的场景开发,在金融界的应用中经常可以发现它。与RabbitMQ相比,ZeroMQ支持许多高级消息场景,但是你必须实现ZeroMQ框架中的各个块(比如Socket或Device等)。ZeroMQ非常灵活,但是你必须学习它的80页的手册(如果你要写一个分布式系统,一定要阅读它)。\n\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/05/zmq.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/zmq.jpg\" alt=\"zmq\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eActiveMQ居于两者之间,类似于ZemoMQ,它可以部署于代理模式和P2P模式。类似于RabbitMQ,它易于实现高级场 …\u003c/p\u003e"
February 18, 2013
RESTful Web Service Cookbook 学习笔记
"\u003cp\u003e每个HTTP方法都具有特定的主义.\nGET 的目的是得到一个资源的表述\nPUT 用于建立或更新一个资源\nDELETE 用于删除一个资源\nPOST 用于创建多个新资源或者对资源进行多种其它变更\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e不要将GET方法用于不安全或非幂等操作.因为这样做可能会造成永久性的、不到的、不符合需要的资源改变。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e在所有上述方法中,GET被滥用的情况最少,因为GET既安全又幂等。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/02/crud.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/crud.png\" alt=\"crud\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e参考:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/02/rest-mi.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/rest-mi-20230904211219008.png\" alt=\"rest-mi\"\u003e\u003c/a\u003e\u003c/p\u003e"
January 17, 2013
运行cacti的问题Cannot connect to MySQL server on ‘localhost’.Please make sure you have specified a valid MySQL database name in ‘include/config.php’
"\u003cp\u003e参考以次的教程 \u003ca href=\"http://blog.haohtml.com/archives/9428\"\u003ehttp://blog.haohtml.com/archives/9428\u003c/a\u003e,在centos安装cacti监控工具,发现在命令行下运行\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ephp /var/www/html/cacti/poller.php\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e的时候,提示以下错误\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFATAL: Cannot connect to MySQL server on ‘localhost’. Please make sure you have specified a valid MySQL database name in ‘include/config.php’\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e而这此配置文件是没有任何问题的,cacti后台访问一切正常的。poller.php是使用/var/lib/mysql/mysql.sock的,\u003c/p\u003e\n\u003cp\u003e当我在my.cnf里把mysql.sock定义到/var/lib/mysql/mysql.sock时,poller.php可以连接,\n但执行mysql就提示错误了,我把mysql.sock的位置改为/tmp/mysql.sock,使用网上提供\u003cstrong\u003e解决办法:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eln -s /tmp/mysql.sock …\u003c/p\u003e\u003c/blockquote\u003e"
December 7, 2011
利用autobench测试web服务器极限并发数
"\u003ch1 id=\"一目的\"\u003e一、目的\u003c/h1\u003e\n\u003cp\u003e利用autobench工具结合httperf命令对web服务器进行测试,得出该服务器可以承载的最大并发连接数与最佳并发数。\u003c/p\u003e\n\u003ch1 id=\"二测试工具\"\u003e二、测试工具\u003c/h1\u003e\n\u003ch2 id=\"工具介绍\"\u003e工具介绍\u003c/h2\u003e\n\u003ch3 id=\"1httperf\"\u003e1、Httperf\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"http://code.google.com/p/httperf/\"\u003ehttperf\u003c/a\u003e 是一款高性能的HTTP测试工具,使用它我们可以准确定位服务器的并发连接能力。下面介绍一下它的主要特征\u003c/p\u003e\n\u003cp\u003e(1) 可以观察测试客户端(并非被测服务器)在发起压力测试时的负载情况。这样在测试高并发的情况下可以准确的分析问题。(被测服务器无法承载高并发还是测试客户端无法发起过多请求)\n(2)支持HTTP/1.1和SSL\n(3)可以生成可扩展的测试计划\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e下载\u003c/strong\u003e:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e安装\u003c/strong\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# tar xvzf httperf-0.9.0.tar.gz\n# cd httperf-0.9.0\n#./configure\n# make \u0026amp;\u0026amp; make install\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e更多的使用方法参见man page。\u003c/p\u003e\n\u003ch3 id=\"2autobench\"\u003e2、autobench\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"http://www.xenoclast.org/autobench/\"\u003eautobench\u003c/a\u003e 是一款基于httperf的Perl脚本。它会在一次测试中调用多次httperf来对web服务器进行测试,每次会按照给定的参数增加并发连接数,将httperf的测试结果保存 …\u003c/p\u003e"
December 7, 2011
velocity2011讲师经验总结及velocity2011的ppt下载[54chen]
"\u003cp\u003e总结:\n1)会场有点小,比较热\n2)讲的东西为了照顾更多人,比较片面,如果有想听深入的同学,可以参加我们 \u003ca href=\"http://blog-brother.com/\"\u003e哥学社\u003c/a\u003e 的吃喝会。\n3)会上遇到了douban强宁大侠、安全宝的冯大侠、还有一位来自清华的主任、以及各位一线的朋友恕不能一一列出,深感荣幸。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"http://www.slideshare.net/54chen/ss-10490088\" title=\"互联网创业服务器运维工具集\"\u003e互联网创业服务器运维工具集\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eView more \u003ca href=\"http://www.slideshare.net/\"\u003epresentations\u003c/a\u003e from \u003ca href=\"http://www.slideshare.net/54chen\"\u003ezhen chen\u003c/a\u003e.\u003c/p\u003e"
November 22, 2011
varnish英文手册生词
"\u003cp\u003e当客户端请求相同的页面时.varnish只发送一个请求到后端(backend)机器,等后面返回数据信息的时候再copy多份\u003c/p\u003e\n\u003cp\u003eserve – 服务\u003c/p\u003e\n\u003cp\u003eplethora – 过多\u003c/p\u003e\n\u003cp\u003eencounter – 遇到\u003c/p\u003e\n\u003cp\u003ehopefully – 希望\u003c/p\u003e\n\u003cp\u003eGuru – 领袖\u003c/p\u003e\n\u003cp\u003emeditation – 冥想\u003c/p\u003e\n\u003cp\u003erelevant – 有关\u003c/p\u003e\n\u003cp\u003eprobably – 可能\u003c/p\u003e\n\u003cp\u003eclue – 线索\u003c/p\u003e\n\u003cp\u003eransaction – 交易\u003c/p\u003e\n\u003cp\u003eelaboration – 拟定\u003c/p\u003e\n\u003cp\u003efurther – 进一步\u003c/p\u003e\n\u003cp\u003evarious – 各种\u003c/p\u003e\n\u003cp\u003eDirector – 主任\u003c/p\u003e\n\u003cp\u003eresilience – 弹性\u003c/p\u003e\n\u003cp\u003edistribute – 分发\u003c/p\u003e\n\u003cp\u003eprobe – 探头\u003c/p\u003e\n\u003cp\u003estale – 陈旧\u003c/p\u003e\n\u003cp\u003ecoalesce – 合并\u003c/p\u003e\n\u003cp\u003eidentical – 相同\u003c/p\u003e\n\u003cp\u003eshield – 盾\u003c/p\u003e\n\u003cp\u003eMisbehave – 胡作非为\u003c/p\u003e\n\u003cp\u003eability – 能力\u003c/p\u003e\n\u003cp\u003eGrace – 恩典(优雅,恩,恩惠)\u003c/p\u003e"
November 21, 2011
varnish中vcl_recv子程序actions 动作
"\u003cp\u003e\u003cstrong\u003e主要有以下动作\u003c/strong\u003e\npass \\当一个请求被pass后,这个请求将通过varnish转发到后端服务器,但是它不会被缓存。pass可以放在vcl_recv 和 vcl_fetch中。\nlookup \\当一个请求在vcl_recv中被lookup后,varnish将从缓存中提取数据,如果缓存中没有数据,将被设置为pass,不能在 vcl_fetch中设置lookup。\npipe \\pipe和 pass相似,都要访问后端服务器,不过当进入pipe 模式后,在此连接未关闭前,后续的所有请求都发到后端服务器(这句是我自己理解后简化的,有能力的朋友可以看看官方文档,给我提修改建议) 。\ndeliver \\请求的目标被缓存,然后发送给客户端\nesi \\ESI-process the fetched document(我理解的就是vcl 中包换一段 html代码)\u003c/p\u003e"
November 21, 2011
varnishstat 参数分析
"\u003cp\u003eHitrate ratio由三个数字组成,第一个数字范围0-10,第二个数字范围0-100,第三个数字范围0-1000。\u003c/p\u003e\n\u003cp\u003e分别表示过去N秒内的Hitrate avg。上图由于我是刚打开varnishstat,因此三个数字都是4,表示过去4秒内的平均hitrate,如果打开的时间足够长,以上三个数字就会逐渐变成\u003cstrong\u003e10,100,1000\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003eHitrate avg里的内容是命中率,需要乘以100转换成百分比,例如上图表示命中率为99.23%\u003c/p\u003e\n\u003cp\u003e接着往下看,三列数据分别表示实时数据,每秒平均值,自启动以来每秒平均值。有些参数是没有后两列的,这是因为这些值都有固定变动范围,例如N work threads,只会在0到最大值(我设的是200)之间变动,搞每秒平均值意义不大(我猜)。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e以下指标需要重点关注一下:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eClient connections accepted: (每秒处理连接数)。\nClient requests received:经验表明connection:request=1:10左右时比较理想,比这个数大很多或者小很多都是不好的。代表到目前为止,浏览器向反向代理服务器发送的HTTP请求累积 …\u003c/p\u003e"
November 21, 2011
varnishncsa(以 NCSA 的格式显示日志)
"\u003cp\u003e\u003cstrong\u003e●varnishncsa(以 NCSA 的格式显示日志)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eAuthor: Dag-Erling Sm?rgrav\u003c/p\u003e\n\u003cp\u003eDate: 2010-05-31\u003c/p\u003e\n\u003cp\u003eVersion: 1.0\u003c/p\u003e\n\u003cp\u003eManual section: 1\u003c/p\u003e\n\u003cp\u003eDisplay varnish logs in apache/NCSA combined log format\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSYNOPSIS\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003evarnishncsa [-a] [-b] [-C] [-c] [-D] [-d] [-f] [-I regex] [-i tag]\u003c/p\u003e\n\u003cp\u003e[-n varnish_name] [-P file] [-r file] [-V] [-w file] [-X regex] [-x tag]\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eDESCRIPTION\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eVarnishncsa 工具读取共享内存的日志,然后以 apache/NCSA 的格式显示出来。下 面的选项可以用。\u003c/p\u003e\n\u003cp\u003e-a 当把日志写到文件里时,使用附加,而不是覆盖。\u003c/p\u003e\n\u003cp\u003e-b 只显示 varnishd 和后端服务器的日志。\u003c/p\u003e\n\u003cp\u003e-C 匹配正则表达式的时候,忽略大小写差异。\u003c/p\u003e\n\u003cp\u003e-c 只显示 varnishd 和客户端的日志。\u003c/p\u003e\n\u003cp\u003e-D 以进程方式运行\u003c/p\u003e\n\u003cp\u003e-d 在 …\u003c/p\u003e"
November 21, 2011
Misbehaving servers(服务器停止运转)
"\u003cp\u003eVarnish的一个关键特色就是它有能力防御 web和应用服务器宕机。\n\u003cstrong\u003eGrace mode\u003c/strong\u003e\n当几个客户端请求同一个页面的时候,varnish只发送一个请求到后端服务器,然后让那个其他几个请求挂起等待返回结果,返回结果后,复制请求的结果发送给客户端。\n如果您的服务每秒有数千万的点击率,那么这个队列是庞大的,没有用户喜欢等待服务器响应。为了使用过期的 cache 给用户提供服务,我们需要增加他们的 TTL,保存所有cache 中的内容在 TTL过期以后30 分钟内不删除,使用以下VCL:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esub vcl_fetch {\n set beresp.grace = 30m;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eVarnish 还不会使用过期的目标给用户提供服务,所以我们需要配置以下代码,在cache过期后的15 秒内,使用旧的内容提供服务:\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esub vcl_recv {\n set req.grace = 15s;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e你会考虑为什么要多保存过去的内容 30 分钟?当然,如果你使用了健康检查,你可以通过健康状态设置保存的时间:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eif (! req.backend.healthy) {\n set req.grace …\u003c/code\u003e\u003c/pre\u003e"
November 21, 2011
varnish中的Health checks(健康检查)
"\u003cp\u003e让我们设置一个 director和两个后端,然后加上健康检查:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ebackend server1 {\n .host = \u0026#34;server1.example.com\u0026#34;;\n .probe = {\n .url = \u0026#34;/\u0026#34;;\n .interval = 5s;\n .timeout = 1 s;\n .window = 5;\n .threshold = 3;\n }\n }\nbackend server2 {\n .host = \u0026#34;server2.example.com\u0026#34;;\n .probe = {\n .url = \u0026#34;/\u0026#34;;\n .interval = 5s;\n .timeout = 1 s;\n .window = 5;\n .threshold = 3;\n }\n }\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这些新的就是探针,varnish将检查通过探针检查每个后端服务器是 …\u003c/p\u003e"
November 21, 2011
varnish中的Directors
"\u003cp\u003e您可以把多台 backends 聚合成一个组,这些组被叫做 directors。这样可以增强性能和弹力。您可以定义多个 backends和多个 group在同一个directors。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ebackend server1 {\n .host = \u0026#34;192.168.0.10\u0026#34;;\n}\nbackend server2{\n .host = \u0026#34;192.168.0.10\u0026#34;;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e现在我们创建一个 director:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003edirector example_director round-robin {\n{\n .backend = server1;\n}\n# server2\n{\n .backend = server2;\n}\n# foo\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这个 director 是一个循环的 director。它的含义就是 director 使用循环的方式把backends分给请求。\n但是如果您的一个服务器宕了?varnish 能否指导所有的请求到健康的后端?当然可以,这就是健康检查在起作用了。\u003c/p\u003e"
November 21, 2011
varnish中advanced backend configuration (后端服务高级配置)
"\u003cp\u003e在某些时刻您需要 varnish 从多台服务器上缓存数据。您可能想要 varnish 映射所有的URL 到一个单独的主机或者不到这个主机。这里很多选项。\n我们需要引进一个 java程序进出php的web站点。假如我们的java程序使用的 URL开始于/JAVA/\u003c/p\u003e\n\u003cp\u003e我们让它运行在8000端口,现在让我们看看默认的default.vcl:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ebackend default {\n .host = \u0026#34;127.0.0.1\u0026#34;;\n .port = \u0026#34;8080\u0026#34;;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e我们添加一个新的 backend:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ebackend java {\n .host = \u0026#34;127.0.0.1\u0026#34;;\n .port = \u0026#34;8000\u0026#34;;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e现在我们需要告诉特殊的URL 被发送到哪里:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esub vcl_recv {\n if (req.url ~ \u0026#34;^/java/\u0026#34;) {\n set req.backend = java;\n } else {\n set req.backend …\u003c/code\u003e\u003c/pre\u003e"
November 21, 2011
Achiveving a high hitrate(提高缓存命中率)-varnish篇
"\u003cp\u003e现在 varnish 已经正常运行了,您可以通过 varnish 访问到您的 web 应用程序。如果您的 web 程序在设计时候没有考虑到加速器的架构,那么您可能有必要修改您的应用程序或者varnish配置文件,来提高varnish的命中率。\n既然这样,您就需要一个工具用来观察您和web服务器之间HTTP头信息。服务器端您可以轻松的使用varnish 的工具,比如varnishlog和 varnishtop,但是客户端的工具需要您自己去准备,下面是我经常使用的工具。\n\u003cstrong\u003eVarnistop\u003c/strong\u003e\n您可以使用varnishtop 确定哪些URL经常命中后端。 Varnishtop –i txurl 就是一个基本的命令。您可以通过阅读“Statistics”了解其他示例。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eVarnishlog\u003c/strong\u003e\n当您需要鉴定哪个 URL 被频繁的发送到后端服务器,您可以通过varnishlog对请求做一个全面的分析。 varnishlog –c –o /foo/bar 这个命令将告诉您所有(-o)包含”/football/bar”字段来自客户端(-c)的请求。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eLwp-request\u003c/strong\u003e\nLwp-request是 www …\u003c/p\u003e"
November 21, 2011
varnish中的Statistics(统计 varnish相关数据)-Varnishtop ,Varnishhist ,Varnishsizes ,Varnishstat
"\u003cp\u003e现在您的varnish已经正常运行,我们来看一下varnish在做什么,这里有些工具可以帮助您做到。\n\u003cstrong\u003eVarnishtop\u003c/strong\u003e\nVarnishtop工具读取共享内存的日志,然后连续不断的显示和更新大部分普通日志。\n适当的过滤使用 –I,-i,-X 和-x 选项,它可以按照您的要求显示请求的内容,客户端,浏览器等其他日志里的信息。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003evarnishtop -i rxurl \\您可以看到客户端请求的 url次数。\nVarnishtop -i txurl \\您可以看到请求后端服务器的url次数。\nVarnishtop -i Rxheader –I Accept-Encoding \\可以看见接收到的头信息中有有多少次包含Accept-Encoding。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003eVarnishhist\u003c/strong\u003e\nVarnishhist工具读取varnishd的共享内存段日志,生成一个连续更新的柱状图,显示最后 N 个请求的处理情况。这个 N 的值是终端的纵坐标的高度,横坐标代表的是对数,如果缓存命中就标记“|”,如果缓存没有命中就标记上“#”符号。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eVarnishsizes\u003c/strong\u003e\nVarnishsizes 和varnishhist相似,除 …\u003c/p\u003e"
November 21, 2011
Varnish Configuration Language – VCL (varnish 配置 语言-VCL)
"\u003cp\u003e官方手册:\u003c/p\u003e\n\u003cp\u003e** **Varnish 有一个很棒的配置系统,大部分其他的系统使用配置指令,让您打开或者关闭一些开关。 Varnish使用区域配置语言,这种语言叫做“VCL”(varnish configuration language),在执行vcl时,varnish 就把VCL转换成二进制代码。\n** **VCL 文件被分为多个子程序,不同的子程序在不同的时间里执行,比如一个子程序在接到请求时执行,另一个子程序在接收到后端服务器传送的文件时执行。\nvarnish 将在不同阶段执行它的子程序代码,因为它的代码是一行一行执行的,不存在优先级问题。随时可以调用这个子程序中的功能并且当他执行完成后就退出。\u003c/p\u003e\n\u003cp\u003e** **如果到最后您也没有调用您的子进程中的功能,varnish 将执行一些内建的 VCL代码,这些代码就是default.vcl 中被注释的代码.\u003c/p\u003e\n\u003cp\u003e** 99%的几率您需要改变vcl_recv 和 vcl_fetch 这两个子进程。**\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003evcl_recv\u003c/strong\u003e\n** **vcl_recv(当然,我们在字符集上有点不足,应为它是unix)在请求的开始被调用,在接收、解析 …\u003c/p\u003e"
November 21, 2011
PutVarnish on port 80(使varnish工作在 80 端口上)
"\u003cp\u003e\u003cstrong\u003ePutVarnish on port 80(使 varnish工作在 80 端口上)\u003c/strong\u003e\n如果您的程序正常运行,没有问题,我们就可以把varnish调整到80端口运行。先关闭vernish\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epkill varnishd\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e然后停止您的 web服务器,修改web服务器配置,把 web服务器修改成监听8080端口,然后修改varnish 的default.vcl和改变默认的后端服务器端口为8080.\n先启动您的web服务器,然后在启动varnish:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003evarnishd -f /usr/local/etc/varnish/default.vcl -s malloc,1G -T 127.0.0.1:2000\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e我们取消了-a 选项,这样varnish将监控默认端口,启动后,检查您的 web程序是否正常。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e相关教程:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003evarnish中Varnishlog命令解析:\u003c/p\u003e\n\u003cp\u003elinux下varnish配置及使用教程:\u003c/p\u003e\n\u003cp\u003eVarnish Configuration Language – VCL (varnish 配置 语言-VCL):\u003c/p\u003e\n\u003cp\u003evarnish中的Statistics(统计 varnish相关数 …\u003c/p\u003e"
November 21, 2011
varnish中Varnishlog命令解析
"\u003cp\u003eVarnish一个真正的特点就是它如何记录数据的。使用内存段代替普通的日志文件,当内存段使用完以后,又从头开始,覆盖最旧的记录。这样就可以非常快的记录数据,并且不需要磁盘空间。缺点就是您没有把数据写到磁盘上,可能会消失。 (varnish也支持将数据写到硬盘的文件上,看您如何选择)\nVarnishlog 这个程序可以查看 varnish 记录了哪些数据。Varnishlog 给您生成原始的日志,包括所有的事件。我一会给您演示。\n在运行了varnish的终端窗口上,运行varnishlog这个命令。\n您可以看见如下显示\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#./varnishlog\n0 CLI – Rd ping\n0 CLI – Wr 200 PONG 1277172542 1.0\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这是检查varnish的主进程是否正常,如果看见这就说明一切OK.\u003c/p\u003e\n\u003cp\u003e现在您去浏览器通过 varnish 重新访问您的 web程序,您将看到如下信息:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e11 SessionOpen c 127.0.0.1 58912 0.0.0.0:8080\n11 ReqStart c 127.0.0.1 58912 595005213\n11 …\u003c/code\u003e\u003c/pre\u003e"
November 20, 2011
Troubleshooting varnish(varnish排错方法)
"\u003cp\u003e1.有时候 varnish 会出错,为了使您知道该检查哪里,您可以检查 varnishlog,/var/log/syslog/,var/log/messages 这里可以发现一些信息,知道varnish怎么了。\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e2.When varnish won’t start\n有些时候,varnish 不能启动。这里有很多 varnish不能启动的原因,通常我们可以观看/dev/null的权限和是否其他软件占用了端口。\n使用debug模式启动 varnish,然后观看发生了什么:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003evarnishd -f /usr/local/etc/varnish/default.vcl -s malloc,1G -T 127.0.0.1:2000 -a 0.0.0.0:8080 –d\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e提示-d 选项,它将给您更多的信息关于接下来发生了什么。让我们看看如果其他程序暂用了varnish 的端口,它将显示什么:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# varnishd -n foo -f /usr/local/etc/varnish/default.vcl -s malloc,1G -T 127.0.0.1:2000\n-a …\u003c/code\u003e\u003c/pre\u003e"
November 18, 2011
linux下varnish配置及使用教程
"\u003cp\u003ecentos6.0 32位\nVarnish3.0.2\u003c/p\u003e\n\u003cp\u003e我们先配置nginx环境.参考教程:http://blog.haohtml.com/archives/6051\n并修改nginx的监听端口为81.下面我们varnish监听的端口为80端口.\u003c/p\u003e\n\u003cp\u003e==============================================================\n目前varnish的最新版本为3.0.2,这里我们使用最新的稳定版本\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecd /usr/local/soft\nwget http://repo.varnish-cache.org/source/varnish-3.0.2.tar.gz\ntar zxvf varnish-3.0.2.tar.gz\ncd varnish-3.0.2\n./configure --prefix=/usr/local/varnish\nmake \u0026amp;\u0026amp; make install\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e如果在执行./configure命令的过程中遇到”No package ‘libpcre’ found”的错误提示信息的话,需要执行以下命令\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eexport …\u003c/code\u003e\u003c/pre\u003e"
October 19, 2011
memcache的addServer的故障转移机制
"\u003cp\u003e如果有多台memcached服务器端(当然其他支持memcache协议的服务前端都可以,比如Tokyo Tyrant),最好使用$memcache-\u0026gt;addServer 来连接服务前端。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e连接示例:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$mem_conf = array(\n array(\u0026#39;host\u0026#39;=\u0026gt;\u0026#39;192.168.0.11\u0026#39;, \u0026#39;port\u0026#39;=\u0026gt;\u0026#39;11211\u0026#39;),\n array(\u0026#39;host\u0026#39;=\u0026gt;\u0026#39;192.168.0.12\u0026#39;, \u0026#39;port\u0026#39;=\u0026gt;\u0026#39;11211\u0026#39;),\n array(\u0026#39;host\u0026#39;=\u0026gt;\u0026#39;192.168.0.13\u0026#39;, \u0026#39;port\u0026#39;=\u0026gt;\u0026#39;11211\u0026#39;)\n);\n\n$memcache = new Memcache ( );\nforeach ( $mem_conf as $v ) {\n $memcache-\u0026gt;addServer ( $v …\u003c/code\u003e\u003c/pre\u003e"
September 14, 2011
Nginx作为反向代理时传递客户端IP
"\u003cp\u003e因为架构的需要采用多级 Nginx 反向代理,但是后端的程序获取到的客户端 IP 都是前端 Nginx 的 IP,问题的根源在于后端的 Nginx 在 HTTP Header 中取客户端 IP 时没有取对正确的值。同样适用于前端是 Squid 或者其他反向代理的情况。(通用的解决方案是直接取服务器的变量 HTTP_X_FORWARDED_FOR 的值即可取出客户端的真实ip地址)\u003c/p\u003e\n\u003cp\u003e首先前端的 Nginx 要做转发客户端 IP 的配置:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003elocation / {\u003c/p\u003e\n\u003cp\u003eproxy_pass http://localhost:8000;# Forward the user’s IP address to Rails\u003c/p\u003e\n\u003cp\u003eproxy_set_header X-Real-IP $remote_addr;\u003c/p\u003e\n\u003ch1 id=\"needed-for-https\"\u003eneeded for HTTPS\u003c/h1\u003e\n\u003ch1 id=\"proxy_set_header------x_forwarded_proto-https\"\u003e proxy_set_header X_FORWARDED_PROTO https;\u003c/h1\u003e\n\u003cp\u003eproxy_set_header X-Forwarded-For $remote_addr; …\u003c/p\u003e\u003c/blockquote\u003e"
September 9, 2011
kickstart安装教程[原创]
"\u003cp\u003e转载请注明本文来源: \u003ca href=\"http://blog.haohtml.com/archives/11341\"\u003ehttp://blog.haohtml.com/archives/11341\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e我们知道RH中的Kickstart可以实现RedHat光盘启动后的自动安装,如果把 ks.cfg及RPM安装文件考到一台HTTP或NFS服务器上,就可以实现网络自动安装,但还是需要RedHat的启动盘来启动机器,但加上DHCP、 TFTP和PXElinux及支持PXE的网卡,噢,那就可以实现远程启动了。也就是说,有了上面的条件,你只要给一台支持PXE的客户机上电,然后再打 入一个设置好的命令就可以安装好一RedHat台机器了。\n实现上面安装的过程是这样的:PXE网卡启动——DHCP服务器——获得IP——从TFTP上下载pxelinux.0、vmlinuz、initrd——启动系统——通过PEXlinux去HTTP下载ks.cfg文件—–跟据ks.cfg去HTTP下载RPM包及安装系统——完成安装。\u003c/p\u003e\n\u003cp\u003e下面的教程我们主要的工作目录在/tftpboot/目录里,/tftpboot/目录里是光盘安装包,可以将光盘内容全部复制到这里,也可以直接挂载到pub目录.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e基本介绍:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003elinux下的网络批量 …\u003c/p\u003e"
September 8, 2011
squid命中率(转)
"\u003cp\u003e察看命中率的shell\ncat access.log|gawk ‘{print $4}’|sort|uniq -c|sort -nr\u003c/p\u003e\n\u003cp\u003e重点观察下面三个内容\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTCP_MEM_HIT\u003c/li\u003e\n\u003cli\u003eTCP_IMS_HIT\u003c/li\u003e\n\u003cli\u003eTCP_REFRESH_HIT\u003c/li\u003e\n\u003c/ul\u003e\n\u003cblockquote\u003e\n\u003cp\u003e1198559749.083 0 60.4.218.18 TCP_REFRESH_HIT/200 271 GET – FIRST_UP_PARENT/d text/html\n1198559813.186 1 218.106.61.11 TCP_IMS_HIT/304 233 GET – NONE/- text/html\n1198559829.358 0 218.106.61.11 TCP_IMS_HIT/304 224 GET – NONE/- text/html\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eTCP_IMS_HIT:NONE 客户端发送确认请求,Squid发现更近来的、新鲜的请求资源的拷贝。\nSquid发送更新的内容到客户端,而不联系原始服务器。(这指明Squid对本次请求,不会与任何其他服务器(邻居或原始服务器)通信。)\nTCP_MEM_HIT:NONE …\u003c/p\u003e"
September 6, 2011
squid中HTTP/1.1 501 Method Not Implemented的解决办法
"\u003cp\u003e刚安装的squid,但在用squidclient清除缓存的时候,提示错误:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003efreebsd# ./squidclient -m PURGE -p 80 http://www.testsquid.com/index.html\nHTTP/1.1 501 Method Not Implemented\nDate: Tue, 28 Jun 2011 23:03:22 GMT\nServer: Apache/2.2.19 (FreeBSD) mod_ssl/2.2.19 OpenSSL/0.9.8k DAV/2\nAllow: GET,HEAD,POST,OPTIONS,TRACE\nContent-Length: 217\nConnection: close\nContent-Type: text/html; charset=iso-8859-1\n\n\u0026lt;!DOCTYPE HTML PUBLIC \u0026#34;-//IETF//DTD HTML 2.0//EN\u0026#34;\u0026gt;\n\u0026lt;html\u0026gt;\u0026lt;head\u0026gt;\n\u0026lt;title\u0026gt;501 Method Not …\u003c/code\u003e\u003c/pre\u003e"
August 28, 2011
关于SQUID3.0的cache_peer说明介绍
"\u003cp\u003ehttp_port 8000 vhost # Squid 服务器监听本机 8000 端口,vhost 支持虚拟主机。\u003c/p\u003e\n\u003cp\u003ecache_peer 192.168.1.50 parent 81 0 no-query originserver weight=1 name=a\ncache_peer 192.168.1.50 parent 82 0 no-query originserver weight=1 name=b\ncache_peer 192.168.1.51 parent 80 0 no-query originserver weight=1 name=c\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ecache_peer_domain a \u003ca href=\"https://www.serverA1.com\"\u003ewww.serverA1.com\u003c/a\u003e\u003c/strong\u003e\n\u003cstrong\u003ecache_peer_domain b \u003ca href=\"https://www.serverA2.com\"\u003ewww.serverA2.com\u003c/a\u003e\u003c/strong\u003e\n\u003cstrong\u003ecache_peer_domain c \u003ca href=\"https://www.serverB.com\"\u003ewww.serverB.com\u003c/a\u003e\n#以上六行配置,让 Squid 服务器知道:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e**\n#从客户端过来的请求,如果是 \u003ca href=\"https://www.serverA1.com\"\u003ewww.serverA1.com\u003c/a\u003e,则 Squid 向 ServerA 192.168.1.50 的端口 81发送请求;\n#**\u003cstrong\u003e从客户端过 …\u003c/strong\u003e\u003c/p\u003e"
August 23, 2011
每个程序员都应该了解的磁盘知识
"\u003cp\u003e虽然我们可能经常都在说 SSD 时代即将来临,可能我们今天的建立在磁盘结构上的很多知识都将无用武之地,但毕竟当前很多的存储产品,包括很多NoSQL产品,都是建立在磁盘存储的理论基础上的。下面是一个关于磁盘原理的PPT,描述了磁盘存储的各种知识。推荐给大家。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"http://www.slideshare.net/iammutex/what-every-data-programmer-needs-to-know-about-disks\" title=\"What every data programmer needs to know about disks\"\u003eWhat every data programmer needs to know about disks\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eView more \u003ca href=\"http://www.slideshare.net/\"\u003epresentations\u003c/a\u003e from \u003ca href=\"http://www.slideshare.net/iammutex\"\u003eiammutex\u003c/a\u003e\u003c/p\u003e"
August 9, 2011
Nagios监控Mysql服务器
"\u003cp\u003e\u003cstrong\u003eNagios-监控Mysql\u003c/strong\u003e服务器\u003c/p\u003e\n\u003cp\u003e监控Mysql需要在nagios和Mysql服务器这两个部分做处理:Mysql服务器安装nrpe、创建Mysql监控用户;配置nagios及用htpasswd创建浏览器验证帐号。下面分步描述。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、 在Mysql服务器安装nrpe\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e这个操作与nagios服务器安装nrpe基本相同,唯一不同的是nrpe.cfg文件server_address,把它改成Mysql服务器的ip地址即可。检查无误后启动nrpe服务.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二、创建Mysql访问用户nagios\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e这个账号仅仅是nagios监控程序用来访问Mysql数据库所用,与其它帐号毫无关系。为了安全起见,nagios这个账号的权限应该特别低,仅仅有数据库的select权限即可。再进一步,我们创建一个空的数据库nagdb,然后让nagios账号访问这个空库,就可以通过check_Mysql插件测试和监控Mysql数据库。\u003c/p\u003e\n\u003cp\u003e一切正常以后,Mysql服务器这边的配置和测试就算完成了。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e三、nagios服务器上的操作\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e即在nagios配置文件后面追加内容。\u003c/p\u003e\n\u003cp\u003e(一)、主机配置文件追加Mysql主机定义,联系 …\u003c/p\u003e"
August 9, 2011
zfs与ufs有什么区别
"\u003cp\u003eFreeBSD9.0将使用zfs作为默认的文件系统.with ZFS, basically you don’t need to use 3rd party volume management software to manage raw device, before you can access them as file system.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eZFS的特点:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eZFS是SUN推出的世界上第一个128位的文件系统,这意味着它能存储1800亿亿(18.4 × 10^1 8)倍于当前64位文件系统的数据。ZFS的设计如此超前以至于这个极限就当前现实际可能永远无法遇到。据说:“要填满一个128位的文件系统,将耗尽地球上所有存储设备。除非你拥有煮沸整个海洋的能量,不然你不可能将其填满。(Populating 128-bit file systems would exceed the quantum limits of earth-based storage. You couldn’t fill a 128-bit storage pool without boiling the oceans.)”[1] …\u003c/p\u003e"
August 8, 2011
nagios出现NRPE: Unable to read output问题的解决办法
"\u003cp\u003e在服务器部署好nagios,分别在客户端安装好,但是其中几台系统不是自己安装,里面的环境不太了解。\u003c/p\u003e\n\u003cp\u003e在nagios服务器端使用nrpe检查出现\u003c/p\u003e\n\u003ch3 id=\"nrpe-unable-to-read-output\"\u003eNRPE: Unable to read output\u003c/h3\u003e\n\u003cp\u003e在监控机上运行check_nrpe -H IP\u003c/p\u003e\n\u003cp\u003e可以查看到客户端的nrpe信息,说明监控机与被监控机的nrpedaemon通信是正常。\u003c/p\u003e\n\u003cp\u003e在网上查找了一下,也没个具体的原因等。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e根据问题查找得出一些分析的注意地方:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1、检查客户端nrpe的权限是否可读,可被nagios执行。\u003c/p\u003e\n\u003cp\u003e2、检查nrpe.cfg里面commands命令路径是否正确。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e常见的一些nrpe的错误信息解决方法:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在监控机上,执行:\u003c/p\u003e\n\u003cp\u003e#\u003ca href=\"mailto:#root@localhost\"\u003eroot@localhost\u003c/a\u003e libexec]# /opt/nagios/libexec/check_nrpe -H IP\u003c/p\u003e\n\u003cp\u003eCHECK_NRPE: Error – Could not complete SSL handshake.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e解决方案:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在被监控机nrpe.cfg中,增加监控主机的地址:\u003c/p\u003e\n\u003cp\u003e#NOTE: This option is ignored if NRPE is running …\u003c/p\u003e"
August 8, 2011
Nagios监控客户端CentOS设置(check_nrpe)
"\u003cp\u003e上一节我们在FreeBSD上实现了了安装nagios(),下面我们要监控一台linux(centos)的主机.\u003c/p\u003e\n\u003cp\u003eNote: It is possible to execute Nagios plugins on remote Linux/Unix machines through SSH. There is a\ncheck_by_ssh plugin that allows you to do this. Using SSH is more secure than the NRPE addon, but it also imposes a larger (CPU) overhead on both the monitoring and remote machines. This can become an issue when you start monitoring hundreds or thousands of machines. Many Nagios admins opt for using using the NRPE addon because of the lower …\u003c/p\u003e"
July 29, 2011
性能测试工具sysbench简介
"\u003cp\u003e\u003ca href=\"http://sysbench.sourceforge.net/\"\u003esysbench\u003c/a\u003e是一款开源的多线程性能测试工具,可以执行CPU/内存/线程/IO/数据库等方面的性能测试。数据库目前支持MySQL/Oracle/PostgreSQL。本文只是简单演示一下几种测试的用法,后续准备利用sysbench来对MySQL进行一系列的测试。具体的一些参数设置,需要根据不同的测试要求来进行调整。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e下载\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e**\n编译安装**\n默认支持MySQL,如果需要测试Oracle/PostgreSQL,则在configure时需要加上–with-oracle或者–with-pgsql参数\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e./configure --prefix=/u01/sysbench \\\n--with-mysql-includes=/opt/mysql/include/mysql \\\n--with-mysql-libs=/opt/mysql/lib/mysql\n\nmake \u0026amp;\u0026amp; make install\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e参数\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eNinGoo:/u01/sysbench/bin\u0026gt;$sysbench\nMissing required command argument.\nUsage:\n sysbench …\u003c/code\u003e\u003c/pre\u003e"
July 26, 2011
利用taskset有效控制cpu资源
"\u003cp\u003e常常感觉系统资源不够用,一台机子上跑了不下3个比较重要的服务,但是每天我们还要在上面进行个备份压缩等处理,网络长时间传输,这在就很影响本就不够用的系统资源;\u003c/p\u003e\n\u003cp\u003e这个时候我们就可以把一些不太重要的比如copy/备份/同步等工作限定在一颗cpu上,或者是多核的cpu的一颗核心上进行处理,虽然这不一定是最有效的方法,但可以最大程度上利用了有效资源,降低那些不太重要的进程占用cpu资源;\u003c/p\u003e\n\u003cp\u003e查看系统下cpu信息:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#cat /proc/cpuinfo\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003etaskset就可以帮我们完成这项工作,而且操作非常简单;\u003c/p\u003e\n\u003cp\u003e该工具系统默认安装,rpm包名util-linux\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#taskset --help\ntaskset (util-linux 2.13-pre7)\nusage: taskset [options] [mask | cpu-list] [pid | cmd [args...]]\nset or get the affinity of a process\n\n-p, --pid operate on existing given pid\n-c, --cpu-list …\u003c/code\u003e\u003c/pre\u003e"
July 22, 2011
squid缓存php动态文件
"\u003cblockquote\u003e\n\u003cp\u003eacl QUERY urlpath_regex cgi-bin ?\nno_cache deny QUERY\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这段代码会不cache 所有带 cgi-bin 和 ? 的url path.表面看来,如果url 里面不带?还是可以被缓存的。可惜实际并非如此,squid 会根据header读取httpd的声明信息,例如生成时间等信息;实际上.php的页面不返回 last-modified 信息,因此很难被cache。\u003c/p\u003e\n\u003cp\u003e通过增加 php 的last-modified header强制 squid 的cache功能:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eheader(“Last-Modified: ” . gmdate(“D, d M Y H:i:s”) . ” GMT”);\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eheader要放在所有.php文件中去。换而言之,就是要\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e在 include.php中,构造一个当前时间转换为最近那次5分钟/n分钟划分的时间函数\u003c/li\u003e\n\u003cli\u003e把这个时间函数的结果返回到 header\u003c/li\u003e\n\u003cli\u003e在所有页面中调用这个 include\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e以上方法本人已经测试通过.\u003c/p\u003e\n\u003cp\u003e分别是加last-modified …\u003c/p\u003e"
July 12, 2011
[教程]为PHP安装phpRedis扩展模块
"\u003cp\u003e\u003cstrong\u003e一.安装phpredis\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# wget \u003ca href=\"https://download.github.com/owlient-phpredis-2.1.1-1-g90ecd17.tar.gz\"\u003ehttps://download.github.com/owlient-phpredis-2.1.1-1-g90ecd17.tar.gz\u003c/a\u003e\n# tar -zxvf owlient-phpredis-2.1.1-1-g90ecd17.tar.gz\n# cd owlient-phpredis-2.1.1-1-g90ecd17\n# /usr/local/php/bin/phpize\n# ./configure –with-php-config=/usr/local/php/bin/php-config\n# make \u0026amp;\u0026amp; make install\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e修改php.ini文件,应用扩展\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# /usr/local/php/etc/php.ini\n加入:\nextension=redis.so\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e重启httpd\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# service httpd -k restart\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e我这里使用的是php-fpm模块运行的Nginx\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/usr/local/php/sbin/php-fpm restart\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e通过phpinfo()函数查看,可以看到redis扩展\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/07/phpredis.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/07/phpredis.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e如 …\u003c/p\u003e"
July 6, 2011
网络流量实时监控工具 nload
"\u003cp\u003e\u003cstrong\u003eLinux下nload的安装:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003enload是个很好用的一个工具,功能也很强.只是相对单一,只能查看总的流量,不能像iptraf那样,可针对IP,协议等\n可以实时地监控网卡的流量,分Incoming,Outgoing两部分,也就是流入与流出的流量。同时统计当前,平均,最小,最大,总流量的值,使人看了一目了然,如下图\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/07/linux_nload.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/07/linux_nload.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e下载地址:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://sourceforge.net/project/showfiles.php?group_id=35865\"\u003ehttp://sourceforge.net/project/showfiles.php?group_id=35865\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#wget \u003ca href=\"http://cdnetworks-kr-1.dl.sourceforge.net/project/nload/nload/0.7.2/nload-0.7.2.tar.gz\"\u003ehttp://cdnetworks-kr-1.dl.sourceforge.net/project/nload/nload/0.7.2/nload-0.7.2.tar.gz\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e#tar zxvf nload-0.7.2.tar.gz\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#cd nload-0.7.2\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#./configure –prefix=/usr/local/nload \u0026amp;\u0026amp; make \u0026amp;\u0026amp; make install\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e安装好以后,来看看效果\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#/usr/local/nload/bin/nload …\u003c/p\u003e\u003c/blockquote\u003e"
July 4, 2011
centos搭建jira bug问题追踪系统
"\u003cp\u003e\u003cstrong\u003e一. 安装jdk\u003c/strong\u003e\n参考:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二. 建立JIRA数据库\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003emysql\u0026gt;create database jiradb character set utf8;\nmysql\u0026gt;grant all on jiradb.* to `jira`@`localhost` identified by ‘jira’;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e三.JIRA 安装\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewget \u003ca href=\"http://wpc.29c4.edgecastcdn.net/8029C4/downloads/software/jira/downloads/atlassian-jira-enterprise-4.2.4-b591-standalone.tar.gz\"\u003ehttp://wpc.29c4.edgecastcdn.net/8029C4/downloads/software/jira/downloads/atlassian-jira-enterprise-4.2.4-b591-standalone.tar.gz\u003c/a\u003e\ntar zxvf atlassian-jira-enterprise-4.2.4-b591-standalone.tar.gz\nmv atlassian-jira-enterprise-4.2.4-b591-standalone /usr/local/jira\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e创建jira.home文件夹\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003emkdir -p /usr/local/jira_home\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e修改vi …\u003c/p\u003e"
June 21, 2011
centos下安装RabbitMQ消息队列
"\u003cp\u003e这里环境为centos7 64位.\n一。安装erlang\u003c/p\u003e\n\u003cp\u003e[shell]su -c ‘rpm -Uvh \u003ca href=\"http://download.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm\"\u003ehttp://download.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm\u003c/a\u003e’\nsudo yum install erlang[/shell]\u003c/p\u003e\n\u003cp\u003e二。安装rabbitmq\u003c/p\u003e\n\u003cp\u003e我们是用CentOS7(RHEL7也一样),可以从这里: \u003ca href=\"http://fedoraproject.org/wiki/EPEL/FAQ#howtouse\"\u003ehttp://fedoraproject.org/wiki/EPEL/FAQ#howtouse\u003c/a\u003e 找到安装有erlang的RHEL7(CentOS同)软件仓库并安装:\u003c/p\u003e\n\u003cp\u003e[shell]\nwget -c \u003ca href=\"http://www.rabbitmq.com/releases/rabbitmq-server/v3.5.0/rabbitmq-server-3.5.0-1.noarch.rpm\"\u003ehttp://www.rabbitmq.com/releases/rabbitmq-server/v3.5.0/rabbitmq-server-3.5.0-1.noarch.rpm\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003esudo rpm –import \u003ca href=\"http://www.rabbitmq.com/rabbitmq-signing-key-public.asc\"\u003ehttp://www.rabbitmq.com/rabbitmq-signing-key-public.asc\u003c/a\u003e\nsudo yum install …\u003c/p\u003e"
May 22, 2011
开源混合存储方案(Flashcache)
"\u003cp\u003e\u003cstrong\u003e\u003ca href=\"http://www.slideshare.net/mryufeng/flashcache\" title=\"开源混合存储方案(Flashcache)\"\u003e开源混合存储方案(Flashcache)\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eView more \u003ca href=\"http://www.slideshare.net/\"\u003epresentations\u003c/a\u003e from \u003ca href=\"http://www.slideshare.net/mryufeng\"\u003eFeng Yu\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eFlashCache简介: \u003ca href=\"http://blog.haohtml.com/archives/10263\"\u003ehttp://blog.haohtml.com/archives/10263\u003c/a\u003e\u003c/p\u003e"
May 22, 2011
推荐 14 款开源的 Web 应用测试工具
"\u003cp\u003e\u003ca href=\"http://www.oschina.net/p/jmeter\"\u003e\u003cimg src=\"http://static.oschina.net/uploads/img/201105/22092540_Ka0N.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eJMeter是Apache组织的开放源代码项目,它是功能和性能测试的工具,100%的用java实现。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://www.oschina.net/uploads/img/201003/01171026_RWEE.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.oschina.net/p/the+grinder\"\u003eGrinder\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eGrinder是一个负载测试框架,通过 \u003ca href=\"http://www.oschina.net/p/jython\"\u003eJython\u003c/a\u003e 来编写测试脚本,基于HTTP的测试可以由浏览器来记录整个要测试的过程。\u003c/p\u003e\n\u003cp\u003e关键特性:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e泛型测试方法\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e灵活的测试脚本编写\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e分布式框架\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e成熟的HTTP支持\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href=\"http://www.oschina.net/p/multi-mechanize\"\u003eMulti-Mechanize\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eMulti-Mechanize 是一个开源的Web性能和负载测试框架,可让你并发运行多个 Python 脚本来对网站或者Web服务进行压力测试。\u003c/p\u003e\n\u003cp\u003e主要特性:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e支持各种 HTTP methods\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e高级超链接和HTML表单支持\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e支持 SSL\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e自动处理 Cookies\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e可设置HTTP头\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e自动处理重定向\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e支持代理\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e支持 HTTP 认证\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e下面是一些测试结果图表:\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://www.oschina.net/uploads/img/201003/25213132_igf9.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.oschina.net/p/selenium\"\u003eSelenium\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eSelenium (SeleniumHQ) 是 thoughtworks公司的一个集成测试的强大工具。\u003c/p\u003e\n\u003cp\u003e一、Selenium 的版本\u003c/p\u003e\n\u003cp\u003eSelenium 现在存在2个版本,一个叫 selenium-core, 一 …\u003c/p\u003e"
May 22, 2011
腾讯陈军:腾讯云平台与技术实践分享
"\u003cp\u003e[第三届中国云计算大会]2011年最受瞩目的IT业界盛会——第三届中国云计算大会于2011年5月18-20日在北京国家会议中心隆重举行。本 次大会由中国电子学会主办,中国电子学会云计算专家委员会、中国云计算技术与产业联盟承办,CSDN网站、《程序员》杂志和电子工业出版社协办。\u003c/p\u003e\n\u003cp\u003e5月20日,在第三节云计算大会分论坛二“云计算平台与应用实践”中,腾讯网络平台部技术总监陈军带来了主题为《腾讯云平台与技术实践》精彩演讲。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://articles.csdn.net/uploads/allimg/110520/6_110520142414_1.jpg\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e更多精彩演讲,即将为您播报,敬请关注。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e以下是陈军的演讲实录:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e我是腾讯的陈军,我加入腾讯之前在硅谷工作了十几年,我要讲的就是开发平台与腾讯海量业务面对的挑战,重点讲几个比较有意思的话题,网络方面,集群任务调度、分布式同步,还有云存储和数据中心运维,因为腾讯做的东西很多。时间关系,就挑一些重点来讲。\u003c/p\u003e\n\u003cp\u003e去年12月份腾讯和360事件之后,腾讯就做了一个策略的转变,就是要打造开放平台。目前朋友社区和Qzone平台已经向第三方开放。目的就是营造一个良 好的互联网生态圈,带动互联网产业链的发展。这样就可以让一些小公司、创业公司可以借助腾讯这个平台来服务亿万用户。\u003c/p\u003e\n\u003cp\u003e这里有一个比较成功的 …\u003c/p\u003e"
May 18, 2011
使用mysql-proxy实现mysql读写分离[修正于2011-06-23]
"\u003cp\u003e由于公司数据库负载较大,所以便打算使用读写分离来减轻mysql的负载。目前较为常见的mysql读写分离分为两种:\u003c/p\u003e\n\u003cp\u003e1、\u003cstrong\u003e基于程序代码内部实现\u003c/strong\u003e:在代码中根据select、insert进行路由分类;这类方法也是目前生产环境应用最广泛的。优点是性能较好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支。缺点是需要开发人员来实现,运维人员无从下手。\u003c/p\u003e\n\u003cp\u003e2、\u003cstrong\u003e基于中间代理层实现\u003c/strong\u003e:我们都知道代理一般是位于客户端和服务器之间,代理服务器接到客户端请求后通过判断然后转发到后端数据库。在这有两个代表性程序\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emysql-proxy\u003c/strong\u003e**:** \u003ca href=\"http://dev.mysql.com/downloads/mysql-proxy/\"\u003emysql-proxy\u003c/a\u003e 为mysql开源项目,通过其自带的lua脚本进行sql判断,虽然是mysql官方产品,但是mysql官方并不建议将mysql-proxy用到生产环境。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eamoeba\u003c/strong\u003e**:**由陈思儒开发,作者曾就职于阿里巴巴,现就职于盛大。该程序由java语言进行开发,目前只听说阿里巴巴将其用于生产环境。另外,此项目严重缺少维护和推广(作者有个官方博客,很多用户反馈的问题发现作者不理睬)\u003c/p\u003e\n\u003cp\u003e经过上述简单的比较,通过程序代码实现mysql读写分离自然是一个不错的选 …\u003c/p\u003e"
May 8, 2011
用cacti监控centos下mysql,memcache等服务状态
"\u003cp\u003eCACTI测试OK\n安装环境:CENTOS5.4\n提前需要安装的组件:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003emysql\n2。APACHE\n3。PHP\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e步骤:\n一。安装 net-snmp\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eyum install net-snmp*\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e注意加个*,把所有的咚咚都装上,否则没有cacti需要的命令.\u003c/p\u003e\n\u003cp\u003e二。安装 php-snmp\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eyum install php-snmp\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e三.安装rrdtool,根据自己系统的版本,选择不同的RPM包\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"http://www.express.org/%7Ewrl/rrdtool/\"\u003ewget\u003c/a\u003e \u003ca href=\"http://www.express.org/%7Ewrl/rrdtool/rrdtool-1.2.30-1.el5.wrl.x86_64.rpm\"\u003ehttp://www.express.org/~wrl/rrdtool/rrdtool-1.2.30-1.el5.wrl.x86_64.rpm\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003ewget \u003ca href=\"http://www.express.org/%7Ewrl/rrdtool/rrdtool-devel-1.2.30-1.el5.wrl.x86_64.rpm\"\u003ehttp://www.express.org/~wrl/rrdtool/rrdtool-devel-1.2.30-1.el5.wrl.x86_64.rpm\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003ewget \u003ca href=\"http://www.express.org/%7Ewrl/rrdtool/rrdtool-perl-1.2.30-1.el5.wrl.x86_64.rpm\"\u003ehttp://www.express.org/~wrl/rrdtool/rrdtool-perl-1.2.30-1.el5.wrl.x86_64.rpm\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e三个包必须一块安装\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003erpm -ivh *-1.2.30*\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e四。安装cacti\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewget\nrpm -ivh …\u003c/p\u003e\u003c/blockquote\u003e"
April 16, 2011
cacti 监控nginx 出现 no (LWP::UserAgent not found)的解决办法
"\u003cp\u003e在上一篇\u0026laquo; \u003ca href=\"http://blog.haohtml.com/archives/9288\"\u003e如何安装cacti监控nginx的插件\u003c/a\u003e \u0026raquo;文章里我们介绍了如何安装,但在最后发现执行\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eget_nginx_clients_status.pl \u003ca href=\"http://nginx.server.tld/nginx\"\u003ehttp://nginx.server.tld/nginx\u003c/a\u003e_status\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e的时候,提示 no (LWP::UserAgent not found) 错误的原因是该系统 perl 缺少了相关组建,解决办法:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[shell]yum -y install perl-libwww-perl[/shell]\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e如果还不行,再按下面的方法解决:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[shell]#perl -MCPAN -e shell 一直回车,知道出现cpan\u0026amp;amp;gt;\u0026amp;nbsp; 提示符开始。\n\ncpan\u0026amp;gt; install LWP::UserAgent\ncpan\u0026amp;gt; exit\n[/shell]\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e如果perl相关组件安装成功,就能正常显示了。\u003c/p\u003e\n\u003cp\u003e[root@localhost scripts]# ./get_nginx_clients_status.pl\nnginx_active:149 …\u003c/p\u003e"
April 16, 2011
[教程]Centos 5.5 快速安装cacti
"\u003cp\u003e\u003cstrong\u003e一、准备工作\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e环境:Centos 5.4 x86_64\n所需软件:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ehttp\nPhp\nPhp-mysql\nPhp-snmp\nMysql\nPerl-DBD-MySQL\nPhp-pdo\nrrdtool\nNet-snmp\nNet-snmp-libs\nNet-snmp-utils\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e#下载相关软件\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ecd /usr/local/src/\u003c/p\u003e\n\u003cp\u003ewget \u003ca href=\"http://www.cacti.net/downloads/cacti-0.8.7e.tar.gz\"\u003ehttp://www.cacti.net/downloads/cacti-0.8.7e.tar.gz\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e二、环境介绍\u003c/strong\u003e\n主监控机是Centos 5.4 x86_64\n主监控机IP=10.0.0.52\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e三、安装配置\u003c/strong\u003e\n(1)在主监控机上安装apache+php+gd的web环境,推荐编译安装,不再赘述,本处方便起见用yum装了\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eyum install php php-mysql php-snmp mysql mysql-server net-snmp net-snmp-libs net-snmp-utils php-pdo perl-DBD-MySQL\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e(2)在主监控机上安装rrdtool,rrdtool依赖的包过多,所以选择增加源,然后用yum安装\n#增 …\u003c/p\u003e"
March 24, 2011
[教程]windows下安装awstats来分析apache的访问日志
"\u003cp\u003e下面的教程是在windows2003服务器下安装配置的,由于awstats是由perl程序写的,所以需要我们在安装awstats以前,需要安装ActivePerl( \u003ca href=\"http://www.activestate.com/\"\u003ehttp://www.activestate.com/\u003c/a\u003e),这里安装的为 v5.10.1版本.安装路径为d:\\perl,记得要启动httpd.conf文件里的LoadModule cgi_module modules/mod_cgi.so模块.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一.下载软件包\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e从官方网站( \u003ca href=\"http://awstats.sourceforge.net/\"\u003ehttp://awstats.sourceforge.net/\u003c/a\u003e)下载最新的awstats压缩包(也可以下载.exe的安装文件),这里下载的是awstats-7.0.zip压缩包.将其解压到D:\\site\\awstats-7.0目录里.\n\u003cstrong\u003e二.初始化配置环境\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e打开D:/site/awstats-7.0/tools文件夹,双击执行awstats_configure.pl,根据提示输入自己apache的安装环境和httpd.conf文件所在的位置,以下为我本机的环境,如图所示:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/03/awstats_install_1.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/awstats_install_1.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/03/awstats_install_2.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/awstats_install_2.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e回车后,提示\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/03/awstats_install_3.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/awstats_install_3.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e这里直接输入”n”,我们手动来配置就可以了,接着是两次回车就可以 …\u003c/p\u003e"
March 23, 2011
squid中日志文件详解
"\u003ch3 id=\"a4\"\u003e4.4 日志文件路径\u003c/h3\u003e\n\u003cp\u003e我将在第13章讨论所有squid的日志细节。你现在你关注的唯一事情是,squid将它的日志放在何处。默认的日志目录是squid安装位置下的logs目录。例如,假如你在./configure时没有使用–prefix=选项,那么默认的日志文件路径是/usr/local/squid/var/logs.\u003c/p\u003e\n\u003cp\u003e你必须确认日志文件所存放的磁盘位置空间足够。在squid写日志时如果接受到错误,它会退出和重启。该行为的主要理由应引起你的注意。squid想确认你不会丢失任何重要的日志信息,特别是你的系统被滥用或者被攻击时。\u003c/p\u003e\n\u003cp\u003esquid有三个主要的日志文件:cache.log,access.log,store.log.第一个文件即cache.log,包含状态性的和调试性的消息。当你刚开始运行squid时,你应密切的关注该文件。假如squid拒绝运行,理由也许会出现在cache.log文件的结尾处。在正常条件下,该文件不会变得很大。也请注意,假如你以-s选项来运行squid,重要的cache.log消息也可被送到你的syslog进程。通过使用cache_log指令,你可以改变该日志文件的路 …\u003c/p\u003e"
March 10, 2011
负载均衡工具haproxy安装,配置,使用
"\u003cp\u003e\u003cstrong\u003e一,什么是haproxy\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eHAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代 理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。 HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二,安装haproxy\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e下载列表地址 \u003ca href=\"http://haproxy.1wt.eu/#down\"\u003ehttp://haproxy.1wt.eu\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewget \u003ca href=\"http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.8.tar.gz\" title=\"haproxy下载\"\u003ehttp://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.8.tar.gz\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e#tar zxvf haproxy-1.4.8.tar.gz\n#cd haproxy-1.4.8\n#uname -a //查看linux内核版本\n#make TARGET=linux26 PREFIX=/usr/local/haproxy\n#make install PREFIX=/usr/local/haproxy\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e三,配置haproxy\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003evi …\u003c/strong\u003e\u003c/p\u003e"
February 15, 2011
可伸缩性最佳实践:来自eBay的经验
"\u003cp\u003e摘自:\u003c/p\u003e\n\u003cp\u003e在eBay,可伸缩性是我们每天奋力抵抗的一大架构压力。我们所做的每一项架构及设计决策,身前身后都能看到它的踪影。当我们面对的是全世界数以亿计的用户,每天的页面浏览量超过10亿,系统中的数据量要用皮字节(1015或250)来计算——可伸缩性是生死交关的问题。\u003c/p\u003e\n\u003cp\u003e在一个可伸缩的架构中,资源的消耗应该随负载线性(或更佳)上升,负载可由用户流量、数据量等测量。如果说性能衡量的是每一工作单元所需的资源消 耗,可伸缩性则是衡量当工作单元的数量或尺寸增加时,资源消耗的变化情况。换句话说,可伸缩性是整个价格-性能曲线的形状,而不是曲线上某一点的取值。\u003c/p\u003e\n\u003cp\u003e可伸缩性有很多侧面——事务的方面、运营的方面、还有开发的方面。我们在改善一个Web系统的事务吞吐量的过程中学到了很多经验,本文总结了其中若 干关键的最佳实践。可能很多最佳实践你会觉得似曾相识,也可能有素未谋面的。这些都是开发和运营eBay网站的众人的集体经验结晶。\u003c/p\u003e\n\u003ch3 id=\"最佳实践-1按功能分割\"\u003e最佳实践 #1:按功能分割\u003c/h3\u003e\n\u003cp\u003e相关的功能部分应该合在一起,不相关的功能部分应该分割开来——不管你把它叫做SOA、功能分解还是工程秘诀。而且,不相关的功能之间耦合程度越松散,就越能灵活地独立 …\u003c/p\u003e"
December 17, 2010
[教程]FreeBSD下安装cacti教程(原创)
"\u003cp\u003e以下配置环境为:FreeBSD8.1 Nginx0.8.54 PHP5.2.15 Mysql5.1.54-log\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一.首先配置php网站环境\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e一般采用的lamp(linux,apache,php,mysql),我们这里用的是FreeBSD的系统,web用的是Nginx,平台搭建教程请参考:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二.安装sockets扩展\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e注意要选择sockets的扩展版本与您所使用的php版本一致,这里我使用的为php5.2.15版本,所以选择了php52-sockets.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#cd /usr/ports/net/php52-sockets\n#make install clean\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e上面的命令会产生一个sockets.so的扩展,系统会自动将一行\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eextension=sockets.so\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e信息添加到/usr/local/etc/php/extensions.ini 文件末尾.\u003c/p\u003e\n\u003cp\u003e如果您确认已经安装过pdo_mysql这个扩展的话,这步可以跳过.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#cd /usr/ports/databases/php5-pdo_mysql\n#make install clean\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e三、安装rrdtool12\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#cd …\u003c/p\u003e\u003c/blockquote\u003e"
December 13, 2010
KVM与Xen和VMware的PK
"\u003cp\u003eKVM和Xen都是linux下的虚拟机软件,不过似乎都说Xen比KVM强大一些,我也试用了一段时间,今天终于在我的HP笔记本上安装了个Xen上的WinXP,感觉似乎比KVM下的是更稳定一些。\u003c/p\u003e\n\u003cp\u003e不过就配置来说,kvm比xen简单太多了,Xen还必须有个单独的内核,原有的Linux内核是作为模块加载的。Kvm不论是安装win还是linux系统都必须有CPU的支持,而Xen只有安装Win的时候才需要CPU的支持。\u003c/p\u003e\n\u003cp\u003e就稳定性来说,还是老辣的Xen好的多,KVM下用everest等软件取硬件信息就死机,xen就不会。但是对鼠标的支持就是KVM好一些了,到了虚拟机的屏幕里就直接锁定了,不像Xen有两个鼠标,位置不一样老是漂来漂去的,让我找的烦死了。\u003c/p\u003e\n\u003cp\u003e这篇文章翻译至KVM的maintainer Avi Kivity的一篇\u003ca href=\"http://avikivity.blogspot.com/2008/04/maintainability-vs-performance.html\"\u003e文章\u003c/a\u003e. 文中提到了KVM比ESX和Xen优越的一个地方:既能获得很好的performance,又能解决设备驱动的维护问题。还是有一定的道理。\u003c/p\u003e\n\u003cp\u003eI/O的性能对一个hypervisor而言至关重要。同时,I/O也是一个很大的维护负担,因为有大量需要被支持的硬件设备,大量的I/O协议,高可 …\u003c/p\u003e"
November 24, 2010
Memcache mutex设计模式
"\u003cp\u003e周六的S2 \u003ca href=\"http://www.s2forum.org/1/topic/\"\u003eWeb 2.0技术沙龙\u003c/a\u003e上介绍了memcache中使用mutex场景(文后要演讲稿),有网友对详情感兴趣,简单介绍如下。\u003c/p\u003e\n\u003ch3 id=\"场景\"\u003e场景\u003c/h3\u003e\n\u003cp\u003eMutex主要用于有大量并发访问并存在cache过期的场合,如\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e首页top 10, 由数据库加载到memcache缓存n分钟\u003c/li\u003e\n\u003cli\u003e微博中名人的content cache, 一旦不存在会大量请求不能命中并加载数据库\u003c/li\u003e\n\u003cli\u003e需要执行多个IO操作生成的数据存在cache中, 比如查询db多次\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"问题\"\u003e问题\u003c/h3\u003e\n\u003cp\u003e在大并发的场合,当cache失效时,大量并发同时取不到cache,会同一瞬间去访问db并回设cache,可能会给系统带来潜在的超负荷风险。\u003cstrong\u003e我们曾经在线上系统出现过类似故障\u003c/strong\u003e。\u003c/p\u003e\n\u003ch3 id=\"解决方法\"\u003e解决方法\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003e方法一\u003c/strong\u003e\n在load db之前先add一个mutex key, mutex key add成功之后再去做加载db, 如果add失败则sleep之后重试读取原cache数据。为了防止死锁,mutex key也需要设置过期时间。伪代码如下\n(\u003cem\u003e注:下文伪代码仅供了解思路,可能存在bug,欢迎随时指出。\u003c/em\u003e)\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eif (memcache.get(key) == null) {\n // 3 min …\u003c/code\u003e\u003c/pre\u003e"
November 24, 2010
Twitter系统运维经验
"\u003cp\u003e最近看到的另外一个介绍Twitter技术的视频[\u003ca href=\"http://assets.en.oreilly.com/1/event/29/Fixing%20Twitter_%20Improving%20the%20Performance%20and%20Scalability%20of%20the%20World%27s%20Most%20Popular%20Micro-blogging%20Site%20Presentation.pdf\"\u003eSlides\u003c/a\u003e] [\u003ca href=\"http://blip.tv/file/2300327\"\u003eVideo\u003c/a\u003e (GFWed)],这是Twitter的John Adams在\u003ca href=\"http://en.oreilly.com/velocity2009\"\u003eVelocity 2009\u003c/a\u003e的一个演讲,主要介绍了Twitter在系统运维方面一些经验。 本文大部分整理的观点都在Twitter(@\u003ca href=\"http://twitter.com/xmpp\"\u003exmpp\u003c/a\u003e)上发过,这里全部整理出来并补充完整。\u003c/p\u003e\n\u003cp\u003eTwitter没有自己的硬件,都是由NTTA来提供,同时NTTA负责硬件相关的网络、带宽、负载均衡等业务,Twitter operations team\u003cstrong\u003e只关注核心的业务,包括Performance,Availability,Capacity Planning容量规划,配置管理\u003c/strong\u003e等,这个可能跟国内一般的互联网公司有所区别。\u003c/p\u003e\n\u003ch3 id=\"1-运维经验\"\u003e1. 运维经验\u003c/h3\u003e\n\u003ch4 id=\"-metrics\"\u003e* Metrics\u003c/h4\u003e\n\u003cp\u003eTwitter的监控后台几乎都是图表(critical metrics),类似驾驶室的转速表,时速表,让操作者可以迅速的了解系统当前的运作状态。联想到我们做的类似监控后台,数据很多,但往往还需要浏览者做二次分析判断,像这样满屏都是图表的方法做得还不够,可以学习下这方面经验。 据John介绍可以从图表上看到系统的瓶颈-系统最弱 …\u003c/p\u003e"
November 18, 2010
杨卫华:新浪微博的架构发展历程
"\u003cp\u003e新浪科技讯 11月16日下午消息,由 \u003ca href=\"http://t.sina.com.cn/\"\u003e新浪微博\u003c/a\u003e( \u003ca href=\"http://t.sina.com.cn/\"\u003ehttp://t.sina.com.cn\u003c/a\u003e)(\u003ca href=\"http://t.sina.com.cn/\"\u003ehttp://t.sina.com.cn\u003c/a\u003e)主办的中国首届微博开发者大会在北京举行,这是国内微博行业的首场技术盛宴。作为国内微博市场的绝对领军者,新浪微博将在此次大会上公布一系列针对开发者的扶持政策,以期与第三方开发者联手推动微博行业的整体发展。图为微博平台首席架构师杨卫华演讲。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e以下为演讲实录:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e大家下午好,在座的大部分都是技术开发者,技术开发者往往对微博这个产品非常关心。最晚的一次,是12点多收到一个邮件说想了解一下微博底层是 怎么构架的。很多技术人员对微博的构架非常感兴趣,就是一个明星他有300万粉丝,这个技术怎么来实现?今天在这里跟大家分享一下微博的底层机构,让大家 对微博的底层技术有更好的了解。另外不管是做客户端、1.0、2.0、论坛、博客都要考虑架构的问题,架构实际上是有一些共性的。今天我通过讲解微博里面 的一些架构,分析一下架构里面哪些共性大家可以参考。\u003c/p\u003e\n\u003cp\u003e首先给大家介绍一下微博架构发展的历程。新浪微博在短短一年时间内从零发展到五千万用户,我们的基层架构也发展了几个版本。第一版就是是 …\u003c/p\u003e"
November 11, 2010
分布式数据库拆表拆库的常用策略
"\u003cp\u003e在大容量,高负荷的web系统中,对数据库进行一系列拆分,可有效提升数据库容量和性能。在初学程序的早期,程序员通常都喜欢按传统数据库设计模式,设计为单库和单一功能表的结构,这样的结构在数据量和并发量达到一定程度之后,会出现严重性能问题和维护问题。在出现问题的时候才着手进行优化,会非常痛苦,所以应该在系统架设之初就考虑好之后会出现的问题。\u003c/p\u003e\n\u003cp\u003e目前有些数据库策略是采用单库结构,然后通过同步分发到数台服务器实现读写分离。个人觉得这样的策略非常笨拙,还是想办法将其分隔开来好,否则每台机器的内存都很容易超支。\u003c/p\u003e\n\u003cp\u003e一般只对数据量比较大的表进行拆分,这应该没有什么异议;还有一种是有可能会进行维护的比较重要的表,比如文章目录表,如果有从其它系统倒数据进来的可能的话,也要拆掉,不然倒数据时一不小心把目录表弄坏了,发现忘了备份,那真是欲哭无泪。\u003c/p\u003e\n\u003cp\u003e下面来分析一下:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、时间结构\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e如果业务系统对时效性较高,比如新闻发布系统的文章表,可以把数据库设计成时间结构,按时间分有几种结构:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e平板式\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e表类似:\narticle_200901\narticle_200902\narticle_200903\u003c/p\u003e\n\u003cp\u003e用年来分还是用月可自定, …\u003c/p\u003e"
November 9, 2010
网络七层协议及负载均衡
"\u003cp\u003e根据OSI模型把网络通信的工作分为七层.一至四层被认为是低层,这些层与数据移动密切相关.五至七层是高层,包含应用程序级的数据.每一层负责一项具体的工作,然后把数据传送到下一层.由低到高具体分为:物理层.数据链路层,网络层,传输层,会话层,表示层和应用层.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/11/osi.gif\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/11/osi.gif\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOSI模型的最低层或第一层:物理层\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e物理层包含物理连网网媒介,实际上就是布线,光纤,网卡和其它用来把两台网络通信设备连接在一起的设施.它规定了激活,维持,关闭通信端之间的机械特性,电气特性,功能特性及过程特性.虽然物理层不提供纠错服务,但它能够设定数据传输速率并监测数据出错率.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOSI模型的第二层:数据链路层\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e数据链路层的主要作用是控制网络层与物理层之间的通信.它保证了数据在不可靠的物理线路上进行可靠的传递.它把从网络层接收到的数据侵害成特定的可被牧师层传输的帧,保证了传输的可靠性.它的主要作用包括:物理地址寻址,数据的成帧,流量控制,数据的栓错,重发等.它是独立于网络层和物理层的,工作时无须关心计算机是否在运行软件还是其它操作.\n数据链路层协议主要有:SDLC,DHLC,PPP,STP,帧中继等.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOSI模型的第三层:网络层\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e很多 …\u003c/p\u003e"
November 9, 2010
Nginx中的upstream
"\u003cp\u003eNginx中upstream有以下几种方式:\u003c/p\u003e\n\u003cp\u003e1、轮询(weight=1)\n默认选项,当weight不指定时,各服务器weight相同,\n每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。\u003c/p\u003e\n\u003cp\u003e[shell]upstream bakend {\nserver 192.168.1.10;\nserver 192.168.1.11;\n}\n[/shell]\u003c/p\u003e\n\u003cp\u003e2、weight\n指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。\n如果后端服务器down掉,能自动剔除。\n比如下面配置,则1.11服务器的访问量为1.10服务器的两倍。\u003c/p\u003e\n\u003cp\u003e[shell]upstream bakend {\nserver 192.168.1.10 weight=1;\nserver 192.168.1.11 weight=2;\n}[/shell]\u003c/p\u003e\n\u003cp\u003e3、ip_hash\n每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session不能跨服务器的问题。\n如果后端服务器down掉,要手工down掉。\u003c/p\u003e\n\u003cp\u003e[shell]upstream …\u003c/p\u003e"
October 30, 2010
又拍网架构中的分库设计
"\u003cp\u003e又拍网是一个照片分享社区,从2005年6月至今积累了260万用户,1.1亿张照片,目前的日访问量为200多万。5年的发展历程里经历过许多起伏,也积累了一些经验,在这篇文章里,我要介绍一些我们在技术上的积累。\u003c/p\u003e\n\u003cp\u003e又拍网和大多数Web2.0站点一样,构建于大量开源软件之上,包括\u003ca href=\"http://www.mysql.com/\"\u003eMySQL\u003c/a\u003e、\u003ca href=\"http://www.php.net/\"\u003ePHP\u003c/a\u003e、\u003ca href=\"http://nginx.org/en/\"\u003enginx\u003c/a\u003e、\u003ca href=\"http://www.python.org/\"\u003ePython\u003c/a\u003e、\u003ca href=\"http://www.danga.com/memcached/\"\u003ememcached\u003c/a\u003e、\u003ca href=\"http://code.google.com/p/redis\"\u003eredis\u003c/a\u003e、\u003ca href=\"http://lucene.apache.org/solr/\"\u003eSolr\u003c/a\u003e、\u003ca href=\"http://hadoop.apache.org/\"\u003eHadoop\u003c/a\u003e和\u003ca href=\"http://www.rabbitmq.com/\"\u003eRabbitMQ\u003c/a\u003e等等。又拍网的服务器端开发语言主要是\u003ca href=\"http://www.php.net/\"\u003ePHP\u003c/a\u003e和\u003ca href=\"http://www.python.org/\"\u003ePython\u003c/a\u003e,其中\u003ca href=\"http://www.php.net/\"\u003ePHP\u003c/a\u003e用于编写Web逻辑(通过HTTP和用户直接打交道), 而\u003ca href=\"http://www.python.org/\"\u003ePython\u003c/a\u003e则主要用于开发内部服务和后台任务。在客户端则使用了大量的Javascript, 这里要感谢一下\u003ca href=\"http://mootools.net/\"\u003eMooTools\u003c/a\u003e这个JS框架,它使得我们很享受前端开发过程。 另外,我们把图片处理过程从\u003ca href=\"http://www.php.net/\"\u003ePHP\u003c/a\u003e进程里独立出来变成一个服务。这个服务基于\u003ca href=\"http://nginx.org/en/\"\u003enginx\u003c/a\u003e,但是是作为\u003ca href=\"http://nginx.org/en/\"\u003enginx\u003c/a\u003e的一个模块而开放REST API。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/10/sharding1.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/sharding1.png\" alt=\"开发语言\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e**图1:**开发语言\u003c/p\u003e\n\u003cp\u003e由于\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.php.net/\"\u003ePHP\u003c/a\u003e的单线程模型,我们把耗时较久的运算和I/O操作从HTTP请求周期中分离出来, 交给由\u003ca href=\"http://www.python.org/\"\u003ePython\u003c/a\u003e实现的任务进程来完成,以保证请求响应速度。这 …\u003c/p\u003e"
October 30, 2010
软件架构设计中的同步与异步问题(修改版)
"\u003cp\u003e内容概要:本文分析了大型程序系统设计中经常需要面对的同步和异步结构问题。列举异步结构模式实现手段,论证异步模式效率远远优越于同步模式,证明在硬件资源理想情况下,对同步模式而言并发量对计算机系统的平均交易处理时间没有影响,对异步模式而言平均交易处理时间会随着并发量的增大而急剧下降,最终也趋向一个恒定值。在实际有限计算机资源情况下,程序设计必须设置最大并发量以控制并发程度,否则过多并发量会形成交易对硬件资源的竞争,造成交易的拥塞。\u003c/p\u003e\n\u003cp\u003e关键词:同步,异步,消息队列,效率,并发\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一.基本概念\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e同步和异步问题是大型程序设计中需要慎重等待的问题,但目前这方面的讨论很少,本文就试图进行有关方面讨论。\u003c/p\u003e\n\u003cp\u003e一个大型的程序系统常常是由很多不能功能模块组成的。程序系统运行时不同功能模块要按一定顺序执行,以协同完成一件任务。功能模块协作运行完成一件任务存在同步和异步两种方式。如果在某一时间段,这个程序系统的所有功能模块都在为完成相同的一件任务而服务,某一个功能模块在完成一件任务的子任务后,需要等待其他功能模块完成子任务,这样只有当全部功能模块按顺序完成一件任务后,程序系统才能接收下一个任务,功能模块是串行运行,这 …\u003c/p\u003e"
October 28, 2010
ipvsadm+keepalived 实现高可用负载均衡
"\u003ch4 id=\"一使用系统red-hat-enterprise-linux-server-release-54\"\u003e一.使用系统Red Hat Enterprise Linux Server release 5.4\u003c/h4\u003e\n\u003ch4 id=\"二安装环境\"\u003e二.安装环境\u003c/h4\u003e\n\u003ch4 id=\"1说明\"\u003e1.说明\u003c/h4\u003e\n\u003cp\u003erealserver:192.168.1.11\u003c/p\u003e\n\u003cp\u003erealserver:192.168.1.12\u003c/p\u003e\n\u003cp\u003elvs控制机 MASTER:192.168.1.100\u003c/p\u003e\n\u003cp\u003eBACKUP:192.168.1.101\u003c/p\u003e\n\u003cp\u003e虚拟VIP:192.168.1.200\u003c/p\u003e\n\u003cp\u003e其中:realserver上只需要简单的安装apache即可\u003c/p\u003e\n\u003cp\u003elvs控制机需要安装:ipvsadm,keepalived\u003c/p\u003e\n\u003ch4 id=\"2lvs控制机安装主备机分别安装ipvsadm\"\u003e2.lvs控制机安装,主备机分别安装ipvsadm\u003c/h4\u003e\n\u003cp\u003e实现LVS/DR最重要的两个东西是ipvs内核模块和ipvsadm工具包,现在的系统已经包含ip_vs模块\u003c/p\u003e\n\u003ch4 id=\"1检查内核模块看一下ip_vs是否被加载\"\u003e1)检查内核模块,看一下ip_vs 是否被加载\u003c/h4\u003e\n\u003cblockquote\u003e\n\u003ch1 id=\"lsmod-grep-ip_vs\"\u003elsmod |grep ip_vs\u003c/h1\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eip_vs 35009 0\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e如果没有显示,则说明没有加载,执行命令 modprobe ip_vs 就可以把ip_vs模块加载到内核\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#modprobe ip_vs\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch4 id=\"2安装ipvsadm\"\u003e2)安装ipvsadm\u003c/h4\u003e\n\u003cp\u003e先把目 …\u003c/p\u003e"
October 26, 2010
Centos5下配置 lvs DR
"\u003cp\u003e系统环境如下:\u003c/p\u003e\n\u003cp\u003eserver1:192.168.1.206 vip server centos5\nserver2:192.168.1.210 apache centos5\nserver3:192.168.1.211 apache centos5\u003c/p\u003e\n\u003cp\u003evip:192.168.1.208\nport:80\u003c/p\u003e\n\u003cp\u003e============================================\u003c/p\u003e\n\u003cp\u003e下面的安装是在vip server上进行的\u003c/p\u003e\n\u003cp\u003e1、查看自己的操作系统的内核 #uname -a\u003c/p\u003e\n\u003cp\u003e2、这个内核已经包括了ipvs的补丁,进行如下的操作就可以\u003c/p\u003e\n\u003cp\u003e3、下面建立一个指向,为了保证ipvsadm安装\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003emodprobe ip_vs\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ecat /proc/net/ip_vs\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e出现如下的提示\u003c/p\u003e\n\u003cp\u003eIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags\u003c/p\u003e\n\u003cp\u003e– \u0026gt; RemoteAddress:Port Forward Weight ActiveConn InActConn\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e4、安装ipvsadm …\u003c/strong\u003e\u003c/p\u003e"
October 22, 2010
nginx与lvs做负载均衡的比较
"\u003cp\u003elvs和nginx都可以用作多机负载的方案,它们各有优缺,在生产环境中需要好好分析实际情况并加以利用。\u003c/p\u003e\n\u003cp\u003e首先提醒,做技术切不可人云亦云,我云即你云;同时也不可太趋向保守,过于相信旧有方式而等别人来帮你做垫被测试。把所有即时听说到的好东西加以钻研,从而提高自己对技术的认知和水平,乃是一个好习惯。\u003c/p\u003e\n\u003cp\u003e下面来分析一下两者:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、lvs的优势:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1、抗负载能力强,因为lvs工作方式的逻辑是非常之简单,而且工作在网络4层仅做请求分发之用,没有流量,所以在效率上基本不需要太过考虑。在我手里的lvs,仅仅出过一次问题:在并发最高的一小段时间内均衡器出现丢包现象,据分析为网络问题,即网卡或linux2.4内核的承载能力已到上限,内存和cpu方面基本无消耗。\u003c/p\u003e\n\u003cp\u003e2、配置性低,这通常是一大劣势,但同时也是一大优势,因为没有太多可配置的选项,所以除了增减服务器,并不需要经常去触碰它,大大减少了人为出错的几率。\u003c/p\u003e\n\u003cp\u003e3、工作稳定,因为其本身抗负载能力很强,所以稳定性高也是顺理成章,另外各种lvs都有完整的双机热备方案,所以一点不用担心均衡器本身会出什么问题,节点出现故障的话,lvs会自动判别,所以系统整体是非常稳定 …\u003c/p\u003e"
October 1, 2010
[教程]FreeBSD下squid3.0安装教程
"\u003cp\u003e以下文章,虽然在FreeBSD下安装,linux下的安装方法类似.只是一些命令如fetch=\u0026gt;wget变更一下即可.\u003c/p\u003e\n\u003cp\u003e如何您是在FreeBSD下用ports来安装的话,前两步基本可以省略,默许的安装路径为/usr/local/sbin/squid,配置目录为/usr/local/etc/squid。\u003c/p\u003e\n\u003cp\u003e此版本好像有漏洞,安装时请使用最新的稳定版本: \u003ca href=\"http://www.cnbeta.com/articles/121237.htm\"\u003ehttp://www.cnbeta.com/articles/121237.htm\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、编译安装\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#fetch \u003ca href=\"http://www.squid-cache.org/Versions/v3/3.0/squid-3.0.STABLE25.tar.gz\"\u003ehttp://www.squid-cache.org/Versions/v3/3.0/squid-3.0.STABLE25.tar.gz\u003c/a\u003e\n#tar zxvf squid-3.0.STABLE25.tar.gz //稳定版\n#cd squid-3.0.STABLE25\n#./configure –prefix=/usr/local/squid \u003cbr\u003e\n–enable-arp-acl \u003cbr\u003e\n–enable-linux-netfilter \u003cbr\u003e\n–enable-pthreads …\u003c/p\u003e\u003c/blockquote\u003e"
September 30, 2010
apache squid 配置反向代理服务相关文章
"\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"http://www.haohtml.com/server/services/44403.html\"\u003eapache + squid 配置反向代理服务\u003c/a\u003e环境 :ubuntu 9.04(linux 2.6.28-15-generic) apache版本:Apache/2.2.11 squid版本:Squid3.0/STABLE8 本机IP :192.168.1.102并在/etc/hosts里添加www.abc.com的伪域名以便测试 安装方式 :apt-get安装(源码安装同) 配置文件: apache:(/etc/apach…\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"http://www.haohtml.com/server/services/44402.html\"\u003eLinux下Squid3.0反向代理的安装与配置\u003c/a\u003e1. Squid3.0的安装是很简单的: ./configure –prefix=/usr/local/squid make make install chown -R nobody.nobody /usr/local/squid/var/ /usr/local/squid/sbin/squid -z Squid3.0的配置也不复杂: 假设我们有两台Apache服务器需要反向代理:www.avnads.c…\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"http://www.haohtml.com/server/services/44401.html\"\u003esquid3.0快速缓存实现\u003c/a\u003e一、编译安装 #tar zxvf …\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e"
September 11, 2010
远程存储图片到其它服务器上
"\u003cp\u003e关于\u003ca href=\"http://www.dbanotes.net/web/web_image_server.html\"\u003e图片服务器的优化\u003c/a\u003e基本都是采用独立的域名,使用独立的域名,不光是可以并发连接的问题,还有一个重要因素是可以避免 COOKIE 的影响。下面介绍几种方案来实现图片服务器。本人在硬件方面还是个菜鸟,不对之处请谅解!\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e使用同步软件拷贝数据\n使用ftp传递数据,php也可以操作\n使用samba来共享文件夹\n使用NFS来共享文件夹\n使用其他专业数据存储\n使用socket来post上传数据\n使用curl来上传数据\nAJAX、FLASH跨域上传\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e共享方式\u003c/strong\u003e\nNFS:在图片服务器上使用NFS服务,其他服务器上绑定NFS的共享目录,目录权限是可读可写,这样来实现读写。\n其他的共享方式应该都差不多吧,没研究,需要的自己google。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e因为php是不能直接在不同服务器之间存取文件的,但是我们还是可以采用FTP方式远程传输,socket方式来POST文件的。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e使用FTP远程传输\u003c/strong\u003e\nPHP是支持FTP的,给个FTP类里面,自己看着办吧,上传后调用FTP类,同步到FTP服务器中,好处是现有程序只需要在上传那段加上FTP上传就行了,坏处就是一定要支持FTP。\u003c/p\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003e\n\u003cp\u003e// …\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e"
September 1, 2010
squid优化建议
"\u003cp\u003e\u003cstrong\u003esquid优化建议(转贴) 作者:听松一隅\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eSQUID是个很不错CACHE服务器,各大门户网站都在用。过去二天也做了些SQUID优化,把经验贴上来。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e几个重要参数:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003emaximum_object_size 是能cache最大的文件大小。对应wmv,rm文件,建议设置为32768 kB\u003c/li\u003e\n\u003cli\u003emaximum_object_size_in_memory 是在内存中cache的最大文件大小。一般为128的倍数.\u003c/li\u003e\n\u003cli\u003ecache_mem 是SQUID可用到的最大内存。经实践,4G内存的服务器用2G;超过2G导致SQUID运行不稳\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e首先要分析SQUID所cache内容:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e运行 squidclient -p 80 cache_object://localhost/info 能看到如下内容:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eStorage Swap size: 7549104 KB\nStorage Mem size: 418804 KB\nMean Object Size: 160.46 KB\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eMean Object Size是平均内容大小,一般要把maximum_object_size_in_memory设置成离它最近的128的倍数。 …\u003c/p\u003e"
August 28, 2010
三种LVS负载均衡模式
"\u003cp\u003e调度器的实现技术中,IP负载均衡技术是效率最高的,IP虚拟服务器软件(IPVS)是在linux内核中实现的。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eLVS负载均衡模式—1.NAT模式\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eNAT用法本来是因为网络IP地址不足而把内部保留IP地址通过映射转换成公网地址的一种上网方式(原地址NAT)。如果把NAT的过程稍微变化,就可以成为负载均衡的一种方式。原理其实就是把从客户端发来的IP包的IP头目的地址在DR上换成其中一台REALSERVER的IP地址并发至此REALSERVER,而REALSERVER则在处理完成后把数据经过DR主机发回给客户端,DR在这个时候再把数据包的原IP地址改为DR接口上的IP地址即可。期间,无论是进来的流量,还是出去的流量,都必须经过DR。\u003c/p\u003e\n\u003cp\u003e**LVS负载均衡模式—2.IP隧道模式\n**\n隧道模式则类似于VPN的方式,使用网络分层的原理,在从客户端发来的数据包的基础上,封装一个新的IP头标记(不完整的IP头,只有目的IP部)发给REALSERVER,REALSERVER收到后,先把DR发过来的数据包的头给解开,还原其数据包原样,处理后,直接返回给客户端,而不需要再经过DR。需要注意的是,由 …\u003c/p\u003e"
August 28, 2010
Nginx+keepalived负载均衡篇
"\u003cp\u003e由于nginx的url hash功能可以很好的提升squid的性能,所以我把squid前端的负载均衡器更换为nginx,但是一台nginx就形成了单点,现在使用keepalived来解决这个问题,keepalived的故障转移时间很短,而且配置简单,这也是选择keepalived的一个主要原因,建议日PV值小的中小型企业web均可采用如下方案实行,下面直接上安装步骤:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、\u003cstrong\u003e\u003cstrong\u003e环境\u003c/strong\u003e\u003c/strong\u003e:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ecentos5.3、nginx-0.7.51、keepalived-1.1.19\u003c/p\u003e\n\u003cp\u003e主nginx负载均衡器:192.168.0.154\u003c/p\u003e\n\u003cp\u003e辅nginx负载均衡器:192.168.9.155\u003c/p\u003e\n\u003cp\u003evip:192.168.0.188\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e二、安装keepalived\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#tar zxvf keepalived-1.1.19.tar.gz\u003c/p\u003e\n\u003cp\u003e#cd keepalived-1.1.19\u003c/p\u003e\n\u003cp\u003e#./configure –prefix=/usr/local/keepalived\u003c/p\u003e\n\u003cp\u003e#make\u003c/p\u003e\n\u003cp\u003e#make install\u003c/p\u003e\n\u003cp\u003e#cp /usr/local/keepalived/sbin/keepalived /usr/sbin/\u003c/p\u003e\n\u003cp\u003e#cp …\u003c/p\u003e\u003c/blockquote\u003e"
August 22, 2010
squid和varnish的小结
"\u003cp\u003e上周初步接触linux下的这2个反向缓存软件,都实验了一下,貌似squid还是比较顺利的,varnish则碰到了一些问题\u003c/p\u003e\n\u003cp\u003e从varnish的文档看,性能比squid强很多,而且不是一点点,下面国外某在线媒体的12台squid换成3台varnish前后访问响应延时比较,据说有人也测试过的确如此,\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/squid-vs-varnish.jpg\" alt=\"\"\u003e][1]\u003c/p\u003e\n\u003cp\u003e但我就不那么顺利了。先说squid,安装很顺利,网上的中文文档也很多,在这次尝试中,被缓存的网站的静态内容并不多,主要还是以PHP为主,所以反向cache的效果并不是很好,缓存命中率在60到70%之间,缓存的主要对象是图片。由于安装调试都很顺利,所以在“试玩”了一天后,直接就上线用上了,几天下来,正常。由于做反向缓存的服务器内存不大,只有1G,所以缓存大小只设置了384M,使用了shm,保证了速度,但应该是没有充分发挥出缓存的效能,后期准备增加1G的内存,把缓存扩大到1G,这样的话,缓存对象的大小还能再设置大一些,也许有些mp3之类的也可以缓存起来,这样命中率也许会更高些。\u003c/p\u003e\n\u003cp\u003e但即便缓存的命中不是很高,但对后面WEB服务器的压力确实是大大减少了,下面是web服务器上并发连接的图示,一处 …\u003c/p\u003e"
August 22, 2010
lvs-可伸缩Web和媒体服务
"\u003cp\u003e基于LVS可伸缩Web和媒体服务的体系结构如图2.2所示:在前端是一个负载调度器,一般采用IP负载均衡技术来获得整个系统的高吞吐率;在第二层是服务器池,Web服务和媒体服务分别运行在每个结点上;第三层是数据存储,通过分布式文件系统使得每个服务器结点共享相同的数据。集群中结点间是通过高速网络相连的。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/08/web-media-cluster.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/web-media-cluster.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e2.2:基于LVS的可伸缩Web和媒体集群\u003c/p\u003e\n\u003cp\u003e分布式文件系统提供统一的存储空间,这使得系统的维护工作比较方便,且系统运行比较高效。当所有服务器结点超载时,管理员可以很快地加入新的结点来处理请求,而无需将Web文档等复制到结点的本地硬盘上。Webmaster可以看到统一的文档存储空间,维护和更新页面比较方便,对分布式文件系统中页面的修改对所有的服务器都有效。大的媒体文件(如视频文件)分段存储在分布式文件系统的多个结点上,可以提高文件系统的性能和文件服务器间的负载均衡。\u003c/p\u003e\n\u003cp\u003eIP负载调度器(即VS/DR方法,将在下一章详细叙述)可以分别将Web服务和媒体服务负载均衡地分发到各个服务器上,服务器将响应数据直接返回给客户,这样可以极大地提高系统的吞吐率。\u003c/p\u003e\n\u003cp\u003eReal公司以其高压缩比的音频视频格式和音频视频 …\u003c/p\u003e"
August 22, 2010
LVS集群的通用结构
"\u003cp\u003eLVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/08/lvs-architecture.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/lvs-architecture.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e图2.1:LVS集群的体系结构\u003c/p\u003e\n\u003cp\u003e为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。LVS集群的体系结构如图2.1所示,它有三个主要组成部分:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址上的。它可以是用IP负载均衡技术的负载调度器,也可以是基于内容请求分发的负载调度器,还可以是两者的结合。\u003c/li\u003e\n\u003cli\u003e服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。\u003c/li\u003e\n\u003cli\u003e后端存储(backend storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e调度器采用IP负载均衡技术、基于内容请求分发技术或者两者相结合。在IP负载均衡技术中,需要服务器池拥有相同的内容提供相同的服务。当客 …\u003c/p\u003e"
August 20, 2010
Keepalived服务器状态监测
"\u003cp\u003ekeepalived是一个类似于layer3, 4 \u0026amp; 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。\u003c/p\u003e\n\u003cp\u003eLayer3,4\u0026amp;5工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下:\u003c/p\u003e\n\u003cp\u003eLayer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器\u003c/p\u003e\n\u003cp\u003e发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,…\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e相关keepalived实现的教程:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e基于LVS的集群配置:\u003c/p\u003e\n\u003cp\u003e利用LVS+Keepalived 实现高性能高可用负载均衡服务器:\u003c/p\u003e\n\u003cp\u003eCentOS5.5环境下布 …\u003c/p\u003e"
August 11, 2010
可扩展性设计之数据切分
"\u003cp\u003e可能很多读者朋友在网上或者杂志上面都已经多次见到关于数据切分的相关文章了, 只不过在有些文章中称之为数据的 Sharding 。其实不管是称之为数据的 Sharding 还是数据的切分,其概念都是一样的。简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果。 数据的切分同时还可以提高系统的总体可用性,因为单台设备 Crash 之后,只有总体数据的某部分不可用,而不是所有的数据。\u003c/p\u003e\n\u003cp\u003e数据的切分( Sharding )根据其切分规则的类型,可以分为两种切分模式。\n\u003cstrong\u003e垂直(纵向)切分:\u003c/strong\u003e 一种是按照不同的表(或者 Schema )来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直(纵向)切分;\n\u003cstrong\u003e水平(横向)切分:\u003c/strong\u003e 另外一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分。\u003c/p\u003e\n\u003cp\u003e垂直切分的最大特点就是规则简单,实施也更为方便,尤其适合各业务之间的耦合度非常低,相互影响很小,业务逻辑非常清晰的系统。在这种系统中,可以很容易做到将不同业务模块所 …\u003c/p\u003e"
August 3, 2010
Cacti进阶应用一:汇总流量图-将数据合并后作图
"\u003cp\u003e在使用Cacti方便快捷的建立监控图时,往往根据实际应用必须监控几台甚至上百台服务器的汇总流量图来观察该应用服务器组的总流量等指标。\u003c/p\u003e\n\u003cp\u003e这里我们就来介绍如何用cacit快速的建立汇总流量图,其他汇总图建立方法相同;\n\u003cstrong\u003e一、创建CDEF\u003c/strong\u003e\n1、点击cacti左边菜单中的graph Management下的CDEFs\n2、点击CDEF‘s右边的add,增加一个名为Turn All Data into Bits项\u003c/p\u003e\n\u003cp\u003e3、在CDEF Items表格中点击add,输入如下图:依次创建以下三个Items;\n[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/4.jpg\" alt=\"\"\u003e][1]\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/5.jpg\" alt=\"\"\u003e][2]\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/6.jpg\" alt=\"\"\u003e][3]\u003c/p\u003e\n\u003cp\u003e4、完成后如下图:\n[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/7.jpg\" alt=\"\"\u003e][4]\nCDEF item创建完成。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二、创建new graph\u003c/strong\u003e\n1、点击cacti左边菜单中的graph Management\u003c/p\u003e\n\u003cp\u003e2、在右边点击add出现如下图,直接选择create\n[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/1.jpg\" alt=\"\"\u003e][5]\u003c/p\u003e\n\u003cp\u003e3、在Graph Configuration表格中的title输入新图的名字;如IDC all interface traffic in(bits/sec)\u003c/p\u003e\n\u003cp\u003e4、表格最下的选项Vertical Label是纵轴的标识,这里我们填入Bits Per …\u003c/p\u003e"
August 1, 2010
Cacti的常用插件
"\u003cp\u003e\u003cstrong\u003e一、Cacti的插件框架PIA\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1、PIA\u003c/strong\u003e\n要想让Cacti支持更多的插件,那么首先要安装PIA(Cacti-Plugin),下面是PIA与其它插件之间的框架图\n\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/08/cacti-pia.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/08/cacti-pia.jpg\" alt=\"\"\u003e\u003c/a\u003e\nPIA的下载地址:http://www.cactiusers.org/index.php\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/08/cacti-plugin-0.8.7g-PA-v2.8.tar.gz\"\u003ecacti-plugin-0.8.7g-PA-v2.8.tar\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e将压缩包里的文件解压放在cacti目录里,导入pa.sql脚本.然后在”User Management”里的admin用户启用”plugin Management “权限.这时可以在左侧菜单看到”\u003cstrong\u003ePlugin Management\u003c/strong\u003e“菜单.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2、PIA的安装\u003c/strong\u003e\n主要有以下几个步骤\ntar -zvxf cacti-plugin-arch.tar.gz\npatch -PI -N \u0026lt; cacti-plugin-arch.diff\nmysql -ucacti -p2010 \u0026lt; pa.sql\n修改includesl/config.php下的\n$canfiig[‘url_path’] = “/cacti/”;\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二、Cacti的常用插件\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1、Thold插件\u003c/p\u003e\n\u003cp\u003e功能:基于上下界线 …\u003c/p\u003e"
July 30, 2010
用cacti来监控windows 服务器,snmp服务在windows的配置
"\u003cp\u003e\u003cstrong\u003e监控客户端windows2003服务器的snmp服务配置(202.96.209.2)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(1)、打开“控制面板”—“添加删除程序”—“添加删除组建”,在“管理和监视工具”中选中“简单网络管理协议(snmp)”,点击“下一步”,开始安装,在安装过程中需要i386文件.\u003c/p\u003e\n\u003cp\u003e(2)、打开“开始”—“程序”—“管理工具”—“服务”,找到“snmp service”,右键打开“属性”,选择“安全”,在“接受团体名称”处,点“添加”,在“团体名称”处写入你的cacti使用的community,选中“接受来自这些主机的snmp数据包”,默认值为“localhost”,点击“编辑”,将“localhost”改为\u003cstrong\u003ecacti监控服务器的实际 ip地址\u003c/strong\u003e.(指定要接收哪些主机的snmp数据,这里要填写上运行cacti程序的服务器ip地址)\u003c/p\u003e\n\u003cp\u003e(3)、还需要安装SNMP Informant-STD 1.6 软件下载地址: \u003ca href=\"http://www.wtcs.org/informant/download.htm\"\u003ehttp://www.wtcs.org/informant/download.htm\u003c/a\u003e\n有防火墙的要开通UDP端口161(可以在cmd命令行下输入:netstat -an 来查看udp协议的161端口 …\u003c/p\u003e"
July 29, 2010
[教程]cacti for windows 安装
"\u003cp\u003e本文章前提为配置好了apache(iis)+php+mysql这些基本的需要。\u003c/p\u003e\n\u003cp\u003e安装snmp服务,需要windows光盘或i386目录的文件。在”安全”标签设置好团体字后重新启动snmp服务。主要防火墙对udp 161开放权限一定要做好,不要将161完全暴露在公网上,最好只对特定的IP或子网开放。(可以用netstat -an命令查看udp协议的161端口是否在监听)\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ecacti相关软件下载:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1.cacti下载: \u003ca href=\"http://www.cacti.net/downloads/\"\u003ehttp://www.cacti.net/downloads/\u003c/a\u003e\n2.Cygwin下载: \u003ca href=\"http://www.cygwin.com/setup.exe\"\u003ehttp://www.cygwin.com/setup.exe\u003c/a\u003e\n3.rrdtool下载(1.2X): \u003ca href=\"http://www.cacti.net/downloads/rrdtool/win32/\"\u003ehttp://www.cacti.net/downloads/rrdtool/win32/\u003c/a\u003e\n4.net-snmp下载: \u003ca href=\"http://sourceforge.net/projects/net-snmp/files/\"\u003ehttp://sourceforge.net/projects/net-snmp/files/\u003c/a\u003e(注意下载的是net-snmp binaries的EXE安装文件,这里使用win32下的文件)\n5.Spine(原来好像是cactid)下载: …\u003c/p\u003e"
July 27, 2010
用linux上的cacti去监控windows服务器
"\u003cp\u003e另篇相同的教程: \u003ca href=\"http://blog.haohtml.com/index.php/archives/4850\"\u003ehttp://blog.haohtml.com/index.php/archives/4850\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e以前一直用cacti或者mrtg来监控交换机流量,很少用来监控服务器,最近突然有个任务需要监控windows服务器,一般刚装好的cacti,里面的监控设置都是基于交换机和linux的,没有专门监控windows的选择,于是研究了一下,和大家分享一下经验。另外我的cacti是安装的debian linux上,有些安装命令不适合其他linux上,请大家注意。\u003c/p\u003e\n\u003cp\u003e操作系统:debian 5\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.安装mysql\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eapy-get install mysql-server-5.0\u003c/p\u003e\n\u003cp\u003e安装时会提示你输入mysql root密码\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2.安装apache和php\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eapt-get install apache2 libapache2-mod-php5 php5 php5-gd php5-mysql php5-cli php5-common php5-snmp php-net-socket\u003c/p\u003e\n\u003cp\u003ephp5-gd是关系到绘图\u003c/p\u003e\n\u003cp\u003ephp5-mysql和数据库有关系\u003c/p\u003e\n\u003cp\u003ephp-net-socket这个有时候cacti …\u003c/p\u003e"
July 21, 2010
监控工具mrtg,cacti,rrdtool,nagios,zabbix比较和安装
"\u003cp\u003e\u003ca href=\"http://www.cacti.net/\"\u003ecacti\u003c/a\u003e 是一个用 \u003ca href=\"http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/\"\u003errdtool\u003c/a\u003e 来画图的网络监控系统, 通常一说到网络管理, 大家首先想到的经常是 \u003ca href=\"http://people.ee.ethz.ch/~oetiker/webtools/mrtg/\"\u003emrtg\u003c/a\u003e, 但是 mrtg 画的图简单且难看, rrdtool 虽然画图本领一流, 画出来的图也漂亮, 但是他也就是一个画图工具, 不像 mrtg 那样本身还集成了数据收集功能. cacti 则是集成了各种数据收集功能,然后用 rrdtool 画出监控图形. 其本身界面比起同类系统要漂亮不少. 推荐所有有监控需求的人都去研究一下.\u003c/p\u003e\n\u003cp\u003ecacti 和 \u003ca href=\"http://www.nagios.org/\"\u003enagios\u003c/a\u003e 是不同功用的系统, nagios 适合监视大量服务器上面的大批服务是否正常, 重点并不在图形化的监控, 其集成的很多功能例如报警,都是 cacti 没有或者很弱的. cacti 主要用途还是用来收集历史数据和画图, 所以界面比 nagios 漂亮很多.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://net-snmp.sourceforge.net/\"\u003enet-snmp\u003c/a\u003e 是一套广泛使用在类 unix 系统上的 \u003ca href=\"http://www.cisco.com/univercd/cc/td/doc/cisintwk/ito_doc/snmp.htm\"\u003esnmp\u003c/a\u003e 软件, 包含一套 snmp agent 框架 ,一个 snmpd 和 一堆 snmp 工具 , 其前身为 ucd-snmp. 关于 snmp 是什么, 以及如何配置的文章,网上搜一下有一堆一堆的. 在这里就不 …\u003c/p\u003e"
July 7, 2010
再跟 Flickr 学习网站运维经验
"\u003cp\u003e学习了一下 Flickr 的运维工程师 John Allspaw 的这个\u003ca href=\"http://www.slideshare.net/jallspaw/operational-efficiency-hacks-web20-expo2009\"\u003eOperational Efficiency Hacks\u003c/a\u003e 讲座内容。做一点笔记。\u003c/p\u003e\n\u003cp\u003e现在 Flickr 的数据相比\u003ca href=\"http://www.dbanotes.net/web/flickr_lamp_capacity_planning.html\"\u003e2007 年\u003c/a\u003e的时候真是有了显著的增长:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e24 TB 的 MySQL 数据\u003c/li\u003e\n\u003cli\u003e每秒钟 MySQL 有 3.2 万次写操作\u003c/li\u003e\n\u003cli\u003e每秒钟 MySQL 有 12万次读操作\u003c/li\u003e\n\u003cli\u003e图片容量 6 PB\u003c/li\u003e\n\u003cli\u003e每天要用掉 10TB 存储\u003c/li\u003e\n\u003cli\u003e超过 15000 个服务监控点\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e在 2004 年的时候 ,Flickr 使用 \u003ca href=\"http://www.imagemagick.org/\"\u003eImageMagick\u003c/a\u003e (version 6.1.9)之后转移到 \u003ca href=\"http://www.graphicsmagick.org/\"\u003eGraphicsMagick\u003c/a\u003e, 我还\u003ca href=\"http://www.dbanotes.net/arch/yupoo_arch.html\"\u003e以为\u003c/a\u003e是因为版权问题,现 在知道这样做是因为速度,换用 GraphicsMagick 处理速度提升了 15%,而 ImageMagick 功能尽管强大,但都是 Flickr 用不到的功能。如无必要,勿增实体啊。GraphicsMagick 在并行方面(\u003ca href=\"http://openmp.org/wp/\"\u003eOpenMP\u003c/a\u003e)的支持也很不错(\u003ca href=\"http://www.kitchensoap.com/2008/09/02/why-we-use-graphicsmagick/\"\u003e参 考\u003c/a\u003e)。\u003c/p\u003e\n\u003cp\u003e除了技术手段的优化,Flickr 充分利用硬件本身的更新换代带来的好处,曾经用 18 台新机器替换掉原来的 67 台 Web 服务器, …\u003c/p\u003e"
July 7, 2010
高并发高流量网站架构
"\u003cp\u003eWeb2.0的兴起,掀起了互联网新一轮的网络创业大潮。以用户为导向的新网站建设概念,细分了网站功能和用户群,不仅成功的造就了一大批新生的网站,也 极大的方便了上网的人们。但Web2.0以用户为导向的理念,使得新生的网站有了新的特点——高并发,高流量,数据量大,逻辑复杂等,对网站建设也提出了 新的要求。\u003c/p\u003e\n\u003cp\u003e本文围绕高并发高流量的网站架构设计问题,主要研究讨论了以下内容:\u003c/p\u003e\n\u003cp\u003e首先在整个网络的高度讨论了使用镜像网站,CDN内容分发网络等技术对负载均衡带来的便利及各自的优缺点比较。然后在局域网层次对第四层交换技术,包括硬 件解决方案F5和软件解决方案LVS,进行了简单的讨论。接下来在单服务器层次,本文着重讨论了单台服务器的Socket优化,硬盘级缓存技术,内存级缓 存技术,CPU与IO平衡技术(即以运算为主的程序与以数据读写为主的程序搭配部署),读写分离技术等。在应用层,本文介绍了一些大型网站常用的技术,以 及选择使用该技术的理由。最后,在架构的高度讨论了网站扩容,容错等问题。\u003c/p\u003e\n\u003cp\u003e本文以理论与实践相结合的形式,结合作者实际工作中得到的经验,具有较广泛的适用性。\u003c/p\u003e\n\u003cp\u003e1 引言\u003c/p\u003e\n\u003cp\u003e1.1 互联网的发展\n最近十 …\u003c/p\u003e"
June 26, 2010
关于 I/O 的五分钟法则(Five-Minute Rule)
"\u003cp\u003e去年在对 SSD 做调查的时候就关注过这个\u003ca href=\"http://queue.acm.org/detail.cfm?id=1413264\"\u003e五分钟法则\u003c/a\u003e,今天又发现了\u003ca href=\"http://cacm.acm.org/magazines/2009/7/32091-the-five-minute-rule-20-years-later/fulltext#R15\"\u003e这 篇文章\u003c/a\u003e的修订版(为了纪念 Jim Gray),这个话题倒是可以简单介绍一下,对架构师衡量 I/O 能力、Cache 评估和做硬件选型还是会有一些帮助的。\u003c/p\u003e\n\u003cp\u003e在 1987 年,\u003ca href=\"http://en.wikipedia.org/wiki/Jim_Gray_%28computer_scientist%29\"\u003eJim Gray\u003c/a\u003e 与 Gianfranco Putzolu 发表了这个”五分钟法则”的观点,简而言之,如果一条记录频繁被访问,就应该放到内存里,否则的话就应该待在硬盘上按需要再访问。这个临界点就是五分钟。 看上去像一条经验性的法则,实际上五分钟的评估标准是根据投入成本判断的,根据当时的硬件发展水准,在内存中保持 1KB 的数据成本相当于硬盘中存储同样大小数据 400 秒的开销(接近五分钟)。这个法则在 1997 年左右的时候进行过一次回顾,证实了五分钟法则依然有效(硬盘、内存实际上没有质的飞跃),而这次的回顾则是针对 SSD 这个”新的旧硬件”可能带来的影响。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/06/Five-Minute-Rule.gif\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/Five-Minute-Rule.gif\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e随着闪存时代的来临,五分钟法则一分为二:是把 SSD 当成较慢的内存(extended buffer pool )使用还是当成较快的硬盘(extended disk)使用。小内存页在内存和 …\u003c/p\u003e"
June 10, 2009
MFS分布式文件系统架设笔记
"\u003cp\u003e什么是MFS文件系统?\nMoose File System 是一个具备容错功能的网络分布式文件系统,它将数据分布在网络中的不同服务器上,MooseFS 通过 FUSE 使之看起来就是一个 Unix 的文件系统。\nMFS文件系统个人理解: 将分布在各个范围的计算机,将他们未使用的分区统一进行管理使用的一种文件系统.\n\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2009/06/architecture.png\" alt=\"architecture\"\u003e\nMFS文件系统结构:\n包含3种角色:\n管理服务器managing server (master)\n数据存储服务器data servers (chunkservers)\n客户机挂载使用client computers\u003c/p\u003e\n\u003cp\u003e个人理解3种角色作用:\n管理服务器:负责各个数据存储服务器的管理,文件读写调度,文件空间回收以及恢复.多节点拷贝\n数据存储服务器:负责连接管理服务器,听从管理服务器调度,提供存储空间.\n客户端:挂接远程管理服务器上所管理的数据存储服务器,通过fuse内核接口.看起来共享的文件系统和\n本地unix文件系统使用一样的效果.\u003c/p\u003e\n\u003cp\u003e架设过程:\u003c/p\u003e\n\u003cp\u003e服务器2台\n(最少是2台,一台服务器做管理服务器,数据存储服务器,以及客户端3种角色,另外一台计算机做数据存储和客户端)\n称第1台计 …\u003c/p\u003e"
May 7, 2009
nginx图片服务器的架构方案[2009-03-18 01:15:06]
"\u003cp\u003e图片服务通常数据容量较大,而且访问也频繁,鉴于此,图片服务就会有两种问题,一是存储问题,二是访问量问题。\u003c/p\u003e\n\u003cp\u003e存储问题就是硬盘容量问题,花钱买硬盘就可以了,看似简单,但着实也是最苦的问题。按目前探索来看,最好的方式是:在任何时刻遇到硬盘空间不够时,买颗硬盘插上,最多改改配置,就能立刻利用;另外,硬盘要能充分利用,不然图片存储量大再加上备份,很恐怖,最好是每颗硬盘都用上100%的空间。\u003c/p\u003e\n\u003cp\u003e访问量也是个大问题,如果服务不允许防盗链,那么访问量会引起带宽、服务器压力等问题,有钱的话直接扔CDN,没钱或者有更多的钱,就自己做吧。根据垣古不变的真理“越老的图,访问量也相对较少”这一点,分成两大部分,一边处理最新的图片,一边处理老旧的图片。最新的图片访问量大,但存储量较少;老图片访问量低,但存储量大。\u003c/p\u003e\n\u003cp\u003e大概分析完了,开始制定方案。\u003c/p\u003e\n\u003cp\u003e一、拟定一个存储目录规则:\u003c/p\u003e\n\u003cp\u003e在现有的/a/b/abcde.jpg这样的hash方式下多加一个日期的目录变成:/200810/16/a/b/abcde.jpg或者/2008/10/16/a/b/abcde.jpg。按日期制定这个目录规则后,就可以按年月来拆机器了。\u003c/p\u003e\n\u003cp\u003e二、分机器, …\u003c/p\u003e"
May 7, 2009
图片服务器的hash架构[2009-04-19 23:17:00]
"\u003cp\u003e\u003ca href=\"/wp-content/uploads/2009/05/image_hash.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2009/05/image_hash.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e如图,这是一个最简洁的架构。\u003c/p\u003e\n\u003cp\u003e在这个架构里,负载均衡器都可以省了,用最为廉价的dns来替代,dns的优点就是廉价,不用维护,也不愁性能和稳定,还可以跨机房多用几条带宽作分流。另外,在图片服务中,可以选择用另一个域名做dns。优点是主站中的任何cookie等header不会带到图片服务中,省了不少上传流量和服务器可能有的处理时间;缺点是多花了点域名的钱。目前门户都喜欢用这办法,小站用的话,用另一个域名还附带有一个特别的优点:因为部分域名服务商允许添加的二级域名有限,所以用别的域名可以节约有限的域名资源。dns这一块也可以用泛域名,不过貌似国内的泛域名支持不是特别的稳定,有些网站的泛域名,在linux下不能解析windows就正常,比较奇怪,我也没法解释。\u003c/p\u003e\n\u003cp\u003e在这个架构里我总共开了36个域名,但是一时没有那么多机器,所以有一些域名指向同一台机器。一般来说,一个刚上线的项目,放一台机也未尝不可,但是链接(包括域名)一定要固定下来,不然以后调整会非常痛苦。\u003c/p\u003e\n\u003cp\u003e域名的事情还是比较简单的,只要照着填写web表单就完成了,配置四台nginx服务器当然也是非常简单的,因为不需要什么特殊的功能,所以四台机 …\u003c/p\u003e"
May 7, 2009
新型的大型bbs架构(squid+nginx)[2009-03-18 01:15:06]
"\u003cp\u003e这个架构基于squid、nginx和lvs等技术,从架构上对bbs进行全面优化和保护,有如下特点:\u003c/p\u003e\n\u003cp\u003e1、高性能:所有的点击基本上全部由前端缓存负责,提供最快速的处理。\u003c/p\u003e\n\u003cp\u003e2、高保障度:不需考虑应用程序稳定与否、程序语言是何种、数据库是何种,都能从架构上保证稳定。\u003c/p\u003e\n\u003cp\u003e3、高可用性:对应用程序的修改达到最简化:在程序的某些地方加入清缓存的语句即可,当然还需要做页面静态化的工作和统计工作。\u003c/p\u003e\n\u003cp\u003e首先看图,这个图比较大:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2009/05/archi_bbs.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2009/05/archi_bbs.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e这个架构的特点和一些流程的说明:\u003c/p\u003e\n\u003cp\u003e1、主域名和图片域名分离\u003c/p\u003e\n\u003cp\u003e域名分离可以使流量分离,缓存策略分离等等,好处诸多。bbs初期一定要做好规划,将图片用另外的域名独立服务,即使没有足够机器,域名也要先分开。另外,图片服务器可以使用有别于主域名的另一个域名,一个好处是可以减少读取cookie对图片服务器的压力,另一个是提高安全性,避免cookie泄露。\u003c/p\u003e\n\u003cp\u003e2、使用LVS作为前端、二级代理和数据库的访问入口\u003c/p\u003e\n\u003cp\u003e使用LVS作为入口,比其他任何一种方式都来得更优质。首先LVS的负载能力很强,因为它工作在网络协议的第4层,使用虚拟ip技术,所以它本身并不担负任何流量的处理,仅仅是一个封包转发的功能;第 …\u003c/p\u003e"
May 7, 2009
Nginx 简单的负载均衡配置示例
"\u003cp\u003e\u003ca href=\"http://www.haohtml.com\"\u003ewww.haohtml.com\u003c/a\u003e 和 blog.haohtml.com 域名均指向 Nginx 所在的服务器IP。\u003c/p\u003e\n\u003cp\u003e用户访问,将其负载均衡到192.168.1.2:80、192.168.1.3:80、192.168.1.4:80、192.168.1.5:80四台服务器。\u003c/p\u003e\n\u003cp\u003e用户访问,将其负载均衡到192.168.1.7服务器的8080、8081、8082端口。\u003c/p\u003e\n\u003cp\u003e以下为配置文件nginx.conf:\n引用\nuser www www;\u003c/p\u003e\n\u003cp\u003eworker_processes 10;\u003c/p\u003e\n\u003cp\u003e#error_log logs/error.log;\n#error_log logs/error.log notice;\n#error_log logs/error.log info;\u003c/p\u003e\n\u003cp\u003e#pid logs/nginx.pid;\u003c/p\u003e\n\u003cp\u003e#最大文件描述符\nworker_rlimit_nofile 51200;\u003c/p\u003e\n\u003cp\u003eevents\n{\nuse epoll;\u003c/p\u003e\n\u003cp\u003eworker_connections 51200;\n}\u003c/p\u003e\n\u003cp\u003ehttp\n{\ninclude conf/mime.types;\ndefault_type …\u003c/p\u003e"
May 7, 2009
服务器的大用户量的承载方案 Nginx Squid Apache PHP MySQL
"\u003cp\u003e一、前言\u003c/p\u003e\n\u003cp\u003e二、编译安装\u003c/p\u003e\n\u003cp\u003e三、 安装MySQL、memcache\u003c/p\u003e\n\u003cp\u003e四、 安装Apache、PHP、eAccelerator、php-memcache\u003c/p\u003e\n\u003cp\u003e五、 安装Squid\u003c/p\u003e\n\u003cp\u003e六、后记\u003c/p\u003e\n\u003cp\u003e一、前言,准备工作\u003c/p\u003e\n\u003cp\u003e当前,LAMP开发模式是WEB开发的首选,如何搭建一个高效、可靠、稳定的WEB服务器一直是个热门主题,本文就是这个主题的一次尝试。\u003c/p\u003e\n\u003cp\u003e我们采用的架构图如下:\u003c/p\u003e\n\u003cp\u003e引用\u003c/p\u003e\n\u003cp\u003e——– ———- ————- ——— ————\u003c/p\u003e\n\u003cp\u003e| 客户端 | ===\u0026gt; |负载均衡器| ===\u0026gt; |反向代理/缓存| ===\u0026gt; |WEB服务器| ===\u0026gt; |数据库服务器|\u003c/p\u003e\n\u003cp\u003e——– ———- ————- ——— ————\u003c/p\u003e\n\u003cp\u003eNginx Squid …\u003c/p\u003e"
Category: 服务器
July 20, 2022
Linux中调试 iptables
"\u003cp\u003e环境:\u003c/p\u003e\n\u003cp\u003e客户端(windows) 192.168.6.21\u003c/p\u003e\n\u003cp\u003e服务器(Ubuntu): 192.168.6.23\u003c/p\u003e\n\u003ch1 id=\"开启iptables调试内核模块\"\u003e开启iptables调试内核模块\u003c/h1\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e $ modprobe nf_log_ipv4\n $ sysctl net.netfilter.nf_log.2\n net.netfilter.nf_log.2 = nf_log_ipv4\n\u003c/code\u003e\u003c/pre\u003e\u003ch1 id=\"添加iptables规则\"\u003e添加iptables规则\u003c/h1\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e $ iptables -t raw -A PREROUTING -p icmp -j TRACE\n $ iptables -t raw -A OUTPUT -p icmp -j TRACE\n\u003c/code\u003e\u003c/pre\u003e\u003ch1 id=\"测试规则\"\u003e测试规则\u003c/h1\u003e\n\u003cp\u003e客户端执行 ping 命令,\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e $ ping 192.168.6.23 -n 1\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这里使用 -n 参数指定发送的包数量为1,方便我们分析日志\u003c/p\u003e\n\u003cp\u003e此时在服务器上执行查看日志命令, 日志文件为:\u003ccode\u003e/var/log/syslog\u003c/code\u003e 或者 \u003ccode\u003e/var/log/kern.log\u003c/code\u003e 或者 \u003ccode\u003e/var/log/messages\u003c/code\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ tail -f /var/log/syslog\n Jul 20 11:28:40 ubuntu kernel: [ …\u003c/code\u003e\u003c/pre\u003e"
May 24, 2022
Linux 中的 Tun/Tap 介绍
"\u003ch1 id=\"tuntap-设备\"\u003eTUN/TAP 设备\u003c/h1\u003e\n\u003cp\u003e在计算机中TUN与TAP是操作系统内核中的虚拟网络设备。不同于硬件设备这些虚拟的网络设备全部用软件实现,但提供了与硬件设备完全相同的功能。\u003c/p\u003e\n\u003cp\u003e我们先了解一下物理设备的工作原理\n\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2022/07/57e54aad529225723698841910e61c46.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e所有主机物理网卡收到的数据包时,会先将其交给内核的 Network Stack 处理,然后通过 Socket API 通知给用户态的用户程序。\u003c/p\u003e\n\u003cp\u003eLinux 中 \u003ccode\u003eTun/Tap\u003c/code\u003e 驱动程序为应用程序提供了两种交互方式:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e虚拟网络接口和字符设备 \u003ccode\u003e/dev/net/tun\u003c/code\u003e。写入字符设备 \u003ccode\u003e/dev/net/tun\u003c/code\u003e 的数据会发送到虚拟网络接口中;\u003c/li\u003e\n\u003cli\u003e发送到虚拟网络接口中的数据也会出现在该字符设备上;\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e我们再看下 tun 设备的工作原理\n\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2022/07/ece6896a211da4167687ea55edc4f2c9.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e用户态应用往字符设备 \u003ccode\u003e/dev/tunX\u003c/code\u003e 写数据时,写入的数据都会出现在TUN虚拟设备上,当内核发送一个包给 TUN 虚拟设备时,通过读这个字符设备 \u003ccode\u003e/dev/tunX\u003c/code\u003e 同样可以拿到包的内容。\u003c/p\u003e\n\u003cp\u003e用户态应用程序写数据到 \u003ccode\u003etun/tap\u003c/code\u003e 设备后进入内核态,内核态通过TCP协议复制到用户态,最后数据再次复制到内核态并通过物理网卡转发出去,期间共经历了三次用户态与内核态的复制 …\u003c/p\u003e"
December 29, 2018
windows下更新docker源(aliyun)
"\u003cp\u003e每个aliyun账号都有一个专属的镜像源\u003c/p\u003e\n\u003cp\u003e我这里安装的是 Docker Toolbox 软件,更新docker源有两种情况,一种是你还没有创建过Docker Machine,另一种是你已经创建过了Docker Machine。\u003c/p\u003e\n\u003ch2 id=\"一未安装过\"\u003e一、未安装过\u003c/h2\u003e\n\u003ch4 id=\"创建一台安装有docker环境的linux虚拟机指定机器名称为default同时配置docker加速器地址\"\u003e创建一台安装有Docker环境的Linux虚拟机,指定机器名称为default,同时配置Docker加速器地址。\u003c/h4\u003e\n\u003cp\u003e$ docker-machine create –engine-registry-mirror=https://xxxx.mirror.aliyuncs.com -d virtualbox default\u003c/p\u003e\n\u003ch4 id=\"查看机器的环境配置并配置到本地然后通过docker客户端访问docker服务\"\u003e查看机器的环境配置,并配置到本地。然后通过Docker客户端访问Docker服务。\u003c/h4\u003e\n\u003cp\u003e$ docker-machine env default\n$ eval “$(docker-machine env default)”\n$ docker info\u003c/p\u003e\n\u003cp\u003e这里 xxxx 是您的专有加速器地址\u003c/p\u003e\n\u003ch2\u003e\u003c/h2\u003e\n\u003cp\u003e二、已安装过\u003c/p\u003e\n\u003cp\u003e登录已创建的Docker VM\n$ docker-machine ssh default\n$ sudo vi …\u003c/p\u003e"
April 26, 2018
U盘安装Centos7.4
"\u003cp\u003e启动盘制作教程: \u003ca href=\"https://www.cnblogs.com/yeeo1/p/7306611.html\"\u003ehttps://www.cnblogs.com/yeeo1/p/7306611.html\u003c/a\u003e \u003ca href=\"http://blog.51cto.com/mifan6/2070118\"\u003ehttp://blog.51cto.com/mifan6/2070118\u003c/a\u003e\u003c/p\u003e"
March 12, 2018
linux下git版本过底引起的无法git clone的解决方案
"\u003cp\u003e刚安装的新系统,git版本为1.8.3,使用git clone命令的时候,提示“… Peer reports incompatible or unsupported protocol version”\u003c/p\u003e\n\u003cp\u003e只需要升级一下基本包即可。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo yum update nss curl \u003cspan style=\"color:#75715e\"\u003e# nss为名称解析和认证服务 curl为网络请求库\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
June 23, 2017
批量结束linux进程
"\u003cp\u003e这里 `php timer.php`` 进程是使用swoole来搞的一个crond服务,用来定时采集一些数据\u003c/p\u003e\n\u003cp\u003e用ps显示的有以下进程\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eroot 6583 0.0 0.2 219676 4872 ? Ss 10:46 0:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)\nwww 7076 2.7 1.0 304928 19920 ? S 11:32 0:05 php-fpm: pool www\nwww 7077 3.0 1.4 312964 26940 ? S 11:32 0:05 php-fpm: pool www\nwww 7117 2.5 1.2 310668 23724 ? S 11:35 0:01 php-fpm: pool www\nroot 7121 0.0 0.2 331188 4500 ? Ssl 11:36 0:00 php timer.php\nroot 7122 0.0 0.2 257012 4168 ? S 11:36 0:00 php timer.php\nroot 7124 0.0 0.2 …\u003c/code\u003e\u003c/pre\u003e"
June 20, 2017
使用Let’s Encrypt 给网站加 HTTPS
"\u003cblockquote\u003e\n\u003cp\u003e2017.03.27更新:\u003ccode\u003e/usr/bin/letsencrypt\u003c/code\u003e 被 \u003ccode\u003e/usr/bin/certbot\u003c/code\u003e 替代,更新文章中所用到的命令。参考: \u003ca href=\"https://wiki.archlinux.org/index.php/Let%E2%80%99s_Encrypt\"\u003eArchlinux Let’s Encrypt Wiki\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cem\u003eLet’s Encrypt\u003c/em\u003e 证书生成不需要手动进行,官方推荐 \u003ca href=\"https://certbot.eff.org/\"\u003ecertbot\u003c/a\u003e 这套自动化工具来实现。3步轻松搞定:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e下载安装 certbot (Let’s Encrypt项目的自动化工具)\u003c/li\u003e\n\u003cli\u003e创建配置文件\u003c/li\u003e\n\u003cli\u003e执行证书自动化生成命令\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e环境:\ncentos7 64位\nnginx\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、安装certbot\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$yum -y install certbot\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e#检查安装是否成功\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$certbot --help\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e如果安装过程中遇到python的问题,解决办法请参考: \u003ca href=\"https://blog.haohtml.com/archives/17491\"\u003ehttps://blog.haohtml.com/archives/17491\u003c/a\u003e\n\u003cstrong\u003e二、生成域名证书\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e这里使用的域名为 blog.haohtml.com, 网站根目录为 \u003cstrong\u003e/data/wwwroot/haohtml/blog\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#为一个已经存在的站点生成证书文件,一个证书可以多个域名共用,一次也可以生成多个域名谈证书(内容放在了同一个文件里), …\u003c/p\u003e\u003c/blockquote\u003e"
December 20, 2016
gitlab修改时区
"\u003cp\u003e刚装的系统,默认时间是UTC,比北京时间少了8个小时.\u003c/p\u003e\n\u003cp\u003e修改 /var/opt/gitlab/gitlab-rails/etc/gitlab.yml 配置文件中的 time_zone : ‘Beijing’\u003c/p\u003e\n\u003cp\u003e重启gitlab 即可\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#gitlab-ctl restart\n\u003c/code\u003e\u003c/pre\u003e"
December 15, 2016
Linux系统排查
"\u003cp\u003e常见工作中,计算机系统的资源主要包括CPU,内存,硬盘以及网络,过度使用这些资源将使系统陷入困境。本系列一共四篇博文,结合我在实习期间的学习,介绍一些常见的Linux系统排障工具及方法。\u003c/p\u003e\n\u003cp\u003e第1篇—— \u003ca href=\"http://www.cnblogs.com/Security-Darren/p/4685629.html\"\u003e内存篇\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e第2篇—— \u003ca href=\"http://www.cnblogs.com/Security-Darren/p/4700384.html\"\u003eCPU篇\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e第3篇—— \u003ca href=\"http://www.cnblogs.com/Security-Darren/p/4700386.html\"\u003e磁盘I/O篇\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e第4篇—— \u003ca href=\"http://www.cnblogs.com/Security-Darren/p/4700387.html\"\u003e网络篇\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e事实上,当上述服务器系统资源中的任何一个遭遇瓶颈,都会带来服务器性能的下降,典型的症状就是系统运行迟缓。\u003c/p\u003e\n\u003cp\u003e本文从以下几个角度介绍Linux系统内存相关的排查。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e内存的使用率如何查看,使用率真的很高吗\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e内存用在哪里了\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e内存优化可以有哪些手段\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e"
November 26, 2016
linux screen 命令详解
"\u003cp\u003e\u003cstrong\u003e一、背景\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为它们执行的时间太长了。必须等待它们执行完毕,在此期间不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二、简介\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eGNU Screen\u003c/strong\u003e是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。\u003c/p\u003e\n\u003cp\u003eGNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e会话恢复\u003c/strong\u003e\n: 只要Screen本身没有终止,在其内部运行的会话都可以恢复。这一点对于远程登录的用户特别有用——即使网络连接中断,用户也不会失去对已经打开的命令行会话的控制。只要再次登录到主机上执行\u003cstrong\u003escreen -r\u003c/strong\u003e就可以恢复会话的运行。同样在暂时离开的时候,也可以执行分离命令\u003cstrong\u003edetach\u003c/strong\u003e,在保证里面的程序正常运行的情况下让Screen挂起(切换到后台)。这一点和图形界面下的VNC很相似。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e …\u003c/strong\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e"
September 18, 2016
如何用十条命令在一分钟内检查Linux服务器性能
"\u003cp\u003e如果你的Linux服务器突然负载暴增,报警短信快发爆你的手机,如何在最短时间内找出Linux性能问题所在?来看Netflix性能工程团队的这篇博文,看它们通过十条命令在一分钟内对机器性能问题进行诊断。\u003cstrong\u003e概述\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e通过执行以下命令,可以在1分钟内对系统资源使用情况有个大致的了解。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003euptime\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003edmesg | tail\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003evmstat 1\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003empstat -P ALL 1\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003epidstat 1\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eiostat -xz 1\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003efree -m\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003esar -n DEV 1\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003esar -n TCP,ETCP 1\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003etop\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003egtop\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003epstree 查看进程树之间派生的关系\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003etrap 捕捉进行接收到的信号标识,如 SIGKILL/SIGTERM\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/nicolargo/glances\"\u003eGlances\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e其中一些命令需要安装sysstat包,有一些由procps包提供。这些命令的输出,有助于快速定位性能瓶颈,检查出所有资源(CPU、内存、磁盘IO等)的利用率(utilization)、饱和度(saturation)和错误(error)度量,也就是所谓的USE方法。\u003c/p\u003e\n\u003cp\u003e下面我们来逐一介绍下这些命令,有关这些命 …\u003c/p\u003e"
August 30, 2016
让终端走代理的几种方法
"\u003ch4 id=\"方法1:\"\u003e\u003cstrong\u003e方法1\u003c/strong\u003e\u003c/h4\u003e\n\u003cp\u003e在终端中直接运行命令\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eexport http_proxy=http://proxyAddress:port\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这个办法的好处是简单直接,并且影响面很小(只对当前终端有效)。\u003c/p\u003e\n\u003ch4 id=\"方法2:\"\u003e\u003cstrong\u003e方法2\u003c/strong\u003e\u003c/h4\u003e\n\u003cp\u003e把代理服务器地址写入shell配置文件\u003ccode\u003e.bashrc\u003c/code\u003e或者\u003ccode\u003e.zshrc\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e直接在\u003ccode\u003e.bashrc\u003c/code\u003e或者\u003ccode\u003e.zshrc\u003c/code\u003e添加下面内容\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eexport http_proxy=\u0026#34;http://localhost:port\u0026#34;\nexport https_proxy=\u0026#34;http://localhost:port\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e以使用shadowsocks代理为例,ss的代理端口为\u003ccode\u003e1080\u003c/code\u003e,那么应该设置为\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eexport http_proxy=\u0026#34;http://127.0.0.1:1080\u0026#34;\nexport https_proxy=\u0026#34;http://127.0.0.1:1080\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003elocalhost\u003c/code\u003e就是一个域名,域名默认指向 \u003ccode\u003e127.0.0.1\u003c/code\u003e,两者是一样的。\u003c/p\u003e\n\u003cp\u003e然后\u003ccode\u003eESC\u003c/code\u003e后\u003ccode\u003e:wq\u003c/code\u003e保存文件,接着在终端中执行\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esource ~/.bashrc\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e或者退出当前终端再起一个终端。 这个办法的好处 …\u003c/p\u003e"
June 7, 2016
gitlab安装-设置1-修改仓库(repositories)的位置
"\u003cp\u003e安装好gitlab后,要将仓库(repositories)放在一个大硬盘上,在ubuntu服务器上安装的默认位置为 /var/opt/gitlab/git-data/ 目录,需要修改仓库对应的目录\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e操作步骤:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1:新建新仓库目录\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emkdir -p /mnt/application/gitlab/git-data\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e2:修改配置文件 sudo vi /etc/gitlab/gitlab.rb\n搜索:git_data_dir 修改成:git_data_dir “新目录”\n如:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003egit_data_dir \u0026#34;/mnt/application/gitlab/git-data\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e保存\n3:重新生成gitlab\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo gitlab-ctl reconfigure\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e生成不报错,而且在新建仓库目录可以看到从下的目录,即修改成功。\u003c/p\u003e"
May 9, 2016
修改gitlab的项目部署url地址
"\u003cp\u003e\u0026lt;刚在centos7上部署了最新版本的gitlab 8.7.3,发现在创建的git项目地址为http://localhost/username/www.git ,外网无法访问,这时我们只需要修改一个配置文件即可。我安装的时候全部使用的默认配置,路径为 /var/opt/gitlab/gitlab-rails/etc/,配置文件为 gitlab.yml ,文件顶部配置如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ehost: localhost\nport: 80\nhttps: false\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e修改host值为你想使用的外网域名或服务器IP地址即可,保存退出。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003egitlab-ctl restart\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e注意这里的命令是restart不是 reconfigure(根据配置文件/etc/gitlab/gitlab.rb 重新生成配置) ,否则还会恢复原来的配置。\u003c/p\u003e\n\u003cp\u003e用ps -ef | grep nginx命令看了下,发现运行的nginx的路径是/opt/gitlab/embedded/sbin/nginx,而配置文件路径是/var/opt/gitlab/nginx,怪不得我打开/etc/nginx/nginx.conf没看到gitlab …\u003c/p\u003e"
April 18, 2016
HomeBrew中国镜像源
"\u003cp\u003eMac 终端跑入即可\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecd /usr/local/\ngit remote set-url origin http://mirrors.ustc.edu.cn/homebrew.git\n#或者这个:\ngit remote set-url origin git://mirrors.tuna.tsinghua.edu.cn/homebrew.git\nbrew update\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e如果还是感觉慢,看看这个: \u003ca href=\"https://mirrors.tuna.tsinghua.edu.cn/help/homebrew/\"\u003ehttps://mirrors.tuna.tsinghua.edu.cn/help/homebrew/\u003c/a\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecd ~/tmp\ngit clone git://mirrors.tuna.tsinghua.edu.cn/homebrew.git\nrm -rf /usr/local/.git\nrm -rf /usr/local/Library\ncp -R homebrew/.git /usr/local/\ncp -R homebrew/Library /usr/local/\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e然后重试update。\u003c/p\u003e\n\u003ch3 id=\"使用homebrew-science或者homebrew-python\"\u003e使用homebrew-science或者homebrew-python\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecd …\u003c/code\u003e\u003c/pre\u003e"
March 12, 2016
windows平台下的PHP的线程安全版本与非线程安全版本的区别
"\u003cp\u003eWindows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分(Linux/Unit平台没有这个概念的东西的),这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍。\u003c/p\u003e\n\u003cp\u003ePHP有2中运行方式:\u003cstrong\u003eISAPI\u003c/strong\u003e和\u003cstrong\u003eFastCGI\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003eISAPI执行方式是以DLL动态库的形式使用,可以在被用户请求后执行,在处理完一个用户请求后不会马上消失,所以需要进行线程安全检查,这样来提高程序的执行效率,所以如果是以ISAPI来执行PHP,建议选择Thread Safe版本;\u003c/p\u003e\n\u003cp\u003e而FastCGI执行方式是以单一线程来执行操作,所以不需要进行线程的安全检查,除去线程安全检查的防护反而可以提高执行效率,所以,如果是以FastCGI来执行PHP,建议选择Non Thread Safe版本。\u003c/p\u003e\n\u003cp\u003e对于apache服务器来说一般选择isapi方式,而对于nginx服务器则选择FastCGI方式。\u003c/p\u003e\n\u003cp\u003e1.\u003cstrong\u003eNon Thread Safe\u003c/strong\u003e版本php适用在使用CGI以及fastCGI的web服务器上,如nginx,lighttpd以及IIS的CGI模式下\u003c/p\u003e\n\u003cp\u003e2. …\u003c/p\u003e"
February 2, 2016
利用 Dockerfile 来创建镜像
"\u003cp\u003e使用 \u003ccode\u003edocker commit\u003c/code\u003e 来扩展一个镜像比较简单,但是不方便在一个团队中分享。我们可以使用 \u003ccode\u003edocker build\u003c/code\u003e 来创建一个新的镜像。为此,首先需要创建一个 Dockerfile,包含一些如何创建镜像的指令。\u003c/p\u003e\n\u003cp\u003e新建一个目录和一个 Dockerfile\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e $ mkdir sinatra\n $ cd sinatra\n $ touch Dockerfile\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDockerfile 中每一条指令都创建镜像的一层,例如:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e # This is a comment\n FROM ubuntu:14.04\n MAINTAINER Docker Newbee\n RUN apt-get -qq update\n RUN apt-get -qqy install ruby ruby-dev\n RUN gem install sinatra\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDockerfile 基本的语法是\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e使用\u003ccode\u003e#\u003c/code\u003e来注释\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eFROM\u003c/code\u003e 指令告诉 Docker 使用哪个镜像作为基础\u003c/li\u003e\n\u003cli\u003e接着是维护者 \u003ccode\u003eMAINTAINER\u003c/code\u003e 的信息\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eRUN\u003c/code\u003e开头的指令会在创建中运行,比如安装一个软件包,在这里使用 apt-get …\u003c/li\u003e\u003c/ul\u003e"
February 2, 2016
docker安装入门篇
"\u003ch1 class=\"comments-section\" id=\"一下载镜像-image\"\u003e一、下载镜像 image\u003c/h1\u003e\n\u003cp\u003e可以使用 \u003ccode\u003edocker pull\u003c/code\u003e 命令来从仓库获取所需要的镜像。\u003c/p\u003e\n\u003cp\u003e下面的例子将从 Docker Hub 仓库下载一个 Ubuntu 12.04 操作系统的镜像。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e $ sudo docker pull ubuntu:12.04\n Pulling repository ubuntu\n ab8e2728644c: Pulling dependent layers\n 511136ea3c5a: Download complete\n 5f0ffaa9455e: Download complete\n a300658979be: Download complete\n 904483ae0c30: Download complete\n ffdaafd1ca50: Download complete\n d047ae21eeaf: Download complete\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e下载过程中,会输出获取镜像的每一层信息。\u003c/p\u003e\n\u003cp\u003e该命令实际上相当于\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ sudo docker pull registry.hub.docker.com/ubuntu:12.04\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e命令, …\u003c/p\u003e"
February 2, 2016
docker常用命令
"\u003cp\u003e官方命令: \u003ca href=\"https://docs.docker.com/reference/\"\u003ehttps://docs.docker.com/reference/\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"1-查看docker信息versioninfo\"\u003e1. 查看docker信息(version、info)\u003c/h2\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# 查看docker版本\n$docker version\n\n# 显示docker系统的信息\n$docker info\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"2-对image的操作searchpullimagesrmihistory\"\u003e2. 对image的操作(search、pull、images、rmi、history)\u003c/h2\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# 检索image(sudo docker pull ubuntu:12.04,该命令实际上相当于 $ sudo docker pull registry.hub.docker.com/ubuntu:12.04 命令,即从注册服务器 registry.hub.docker.com 中的 ubuntu 仓库来下载标记为 12.04 的镜像。)\n$docker search image_name[:tag]\n\n# 下载image\n$docker pull image_name\n\n# 列出镜像列表; -a, --all=false Show all images; --no-trunc=false Don\u0026#39;t truncate output; …\u003c/code\u003e\u003c/pre\u003e"
February 2, 2016
docker与vm之间的最基本的区别
"\u003cp\u003e5分钟弄懂Docker! \u003ca href=\"http://www.csdn.net/article/2014-07-02/2820497-what%27s-docker\"\u003ehttp://www.csdn.net/article/2014-07-02/2820497-what%27s-docker\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eDocker入门与实践: \u003ca href=\"https://www.gitbook.com/book/yeasy/docker_practice\"\u003ehttps://www.gitbook.com/book/yeasy/docker_practice\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。\u003c/p\u003e\n\u003cp\u003e下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eVirtual Machines是由虚拟机管理程序来实现对 \u003cstrong\u003e虚拟机\u003c/strong\u003e 的管理,而docker是用docker Engine来实现对 \u003cstrong\u003e应用\u003c/strong\u003e 的管理。可以理解为一个套硬件的管理,一个是软件的管理。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2016/02/virtualization.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/virtualization.png\" alt=\"virtualization\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2016/02/docker.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/docker.png\" alt=\"docker\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch1 class=\"comments-section\" id=\"对比传统虚拟机总结\"\u003e 对比传统虚拟机总结\u003c/h1\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2016/02/docker-vs-vm.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/docker-vs-vm.jpg\" alt=\"docker-vs-vm\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch1 id=\"基本概念\"\u003e基本概念\u003c/h1\u003e\n\u003cp\u003eDocker 包括三个基本概念\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e镜像(Image)\u003c/li\u003e\n\u003cli\u003e容器(Container)\u003c/li\u003e\n\u003cli\u003e仓库(Repository)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e理解了这三个概念,就理解了 Docker …\u003c/p\u003e"
December 16, 2015
linux中 kill USR1和USR2 的区别
"\u003cp\u003eUSR1亦通常被用来告知应用程序重载配置文件;例如,向Apache HTTP服务器发送一个\u003c/p\u003e\n\u003cp\u003e**USR1信号将导致以下步骤的发生:\n** 停止接受新的连接,等待当前连接停止,重新载入配置文件,重新打开日志文件,重启服务器,从而实现相对平滑的不关机的更改。\u003c/p\u003e\n\u003cp\u003e以上摘自wiki:\u003c/p\u003e\n\u003cp\u003e呃,近日发现还有USR2,貌似这个USR1和2都可以用户自定义的,同样摘自上面的wiki:\u003c/p\u003e\n\u003cp\u003e在POSIX兼容的平台上,\u003cstrong\u003eSIGUSR1\u003c/strong\u003e和\u003cstrong\u003eSIGUSR2\u003c/strong\u003e是发送给一个进程的信号,它表示了用户定义的情况。它们的符号常量在头文件signal.h中定义。在不同的平台上,信号的编号可能发生变化,因此需要使用符号名称。kill -HUP pid 或者 killall -HUP pName:\n其中pid是进程标识,pName是进程的名称\n如果想要更改配置而不需停止并重新启动服务,可以使用上面两个命令。在对配置文件作必要的更改后,发出该命令以动态更新服务配置。\n根据约定,当你发送一个挂起信号(信号1或HUP)时,大多数服务器进程(所有常用的进程)都会进行复位操作并重新加载它们的配置文件。\u003c/p\u003e"
September 24, 2015
brew安装mysql为系统服务
"\u003cp\u003e默认情况下,使用brew install mysql 安装完mysql以后,需要手动启动mysql。为了方便以后使用,这里将mysql安装成系统服务。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ebrew info mysql\u003c/code\u003e 已经给了.plist文件,只需要load一下就可以,plist文件名不一定是\u003ccode\u003ecom.mysql.mysqld.plist\u003c/code\u003e, 可以先到 `brew –prefix mysql` 目录看下。具体如下:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emkdir -p ~/Library/LaunchAgents\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecp \u003cspan style=\"color:#e6db74\"\u003e`\u003c/span\u003ebrew --prefix mysql\u003cspan style=\"color:#e6db74\"\u003e`\u003c/span\u003e/com.mysql.mysqld.plist ~/Library/LaunchAgents/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elaunchctl load -w ~/Library/LaunchAgents/com.mysql.mysqld.plist\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e其实 \u003ca href=\"http://stackoverflow.com/questions/8014500/autostart-mysql-on-boot-from-terminal\"\u003ehttp://stackoverflow.com/questions/8014500/autostart-mysql-on-boot-from-terminal\u003c/a\u003e 这里有说。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e cp \u003cspan style=\"color:#e6db74\"\u003e`\u003c/span\u003ebrew --prefix mysql\u003cspan style=\"color:#e6db74\"\u003e`\u003c/span\u003e/*mysql*.plist …\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
July 30, 2015
用shell分析nginx日志里的访问最多的IP地址
"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# $3的位置是IP地址,可按情况修改,如:\n# [30/Sep/2012:19:14:47 +0800] 110.75.176.58 www.example.com \u0026#34;GET / HTTP/1.1\u0026#34; 200 3629 \u0026#34;-\u0026#34; \u0026#34;Yahoo! Slurp China\u0026#34;\ncat nginx.log | awk \u0026#39;{print $3}\u0026#39; | sort | uniq -c | sort -nr | less\n\n#输出:\n# 120 189.17.37.109\n# 96 12.15.61.22\n# 95 12.20.29.33\n# 。。。 。。。\n\u003c/code\u003e\u003c/pre\u003e"
June 17, 2015
linux下安装php7+mysql5.7+nginx
"\u003cp\u003e\u003cstrong\u003e环境:\u003c/strong\u003e\n\u003ca href=\"https://www.centos.org/\"\u003eCentOS7.1 X64\u003c/a\u003e \u003ca href=\"http://dev.mysql.com/downloads/mysql/\"\u003eMySQL5.7.10\u003c/a\u003e \u003ca href=\"http://php.net/downloads.php#v7.0.4\"\u003ePHP7.0.4\u003c/a\u003e \u003ca href=\"http://tengine.taobao.org/\"\u003eTengine/2.1.2 (nginx/1.6.2)\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e参考: \u003ca href=\"http://blog.haohtml.com/archives/15340\"\u003ehttp://blog.haohtml.com/archives/15340\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一。安装常用扩展库\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers libevent …\u003c/code\u003e\u003c/pre\u003e"
May 24, 2015
mac终端中显示tree的命令(转)
"\u003cp\u003e寻觅了良久终于找到了mac下如何在终端显示tree的命令了,作为从linux下转过来的人,还没适应mac的finder,还是喜欢在命令行下查看文件。\u003c/p\u003e\n\u003cp\u003e命令:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003efind . -print | sed -e \u0026#39;s;[^/]*/;|____;g;s;____|; |;g\u0026#39;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e然后手动alias一下,在你的.bash_profile或者.zshrc中添加:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ealias tree=\u0026#34;find . -print | sed -e \u0026#39;s;[^/]*/;|____;g;s;____|; |;g\u0026#39;\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e搞定\u003c/p\u003e\n\u003cp\u003e要是能显示颜色和控制层级就更好了。\u003c/p\u003e\n\u003cp\u003ePS:也可以通过brew install tree 安装。\u003c/p\u003e"
December 6, 2014
Linux 下添加硬盘/新建分区(fdisk + mkfs.ext4 + mount)
"\u003cp\u003e此教程只供参考,未进行整理!\u003c/p\u003e\n\u003cp\u003e使用fdisk命令查看新添加的硬盘\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2014/12/QQ%E6%88%AA%E5%9B%BE20141206152231.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2014/12/QQ%E6%88%AA%E5%9B%BE20141206152231.jpg\" alt=\"QQ截图20141206152231\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e会看到类似这种页面信息的(说明:这里的图为已经有两个硬盘在使用了, 新添加的硬盘为sdc,尚未使用)\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://www.fikker.com/bigcache2/help/linux-fdisk.html#e1\"\u003e第一步:添加硬盘/新建分区(fdisk)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.fikker.com/bigcache2/help/linux-fdisk.html#e2\"\u003e第二步:格式化分区(mkfs.ext4)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.fikker.com/bigcache2/help/linux-fdisk.html#e3\"\u003e第三步:加载分区(mount)\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e1、第一步:添加硬盘/新建分区(fdisk)\u003c/p\u003e\n\u003cp\u003ea、查看当前系统所有硬盘及分区情况:fdisk -l\u003c/p\u003e\n\u003cp\u003eb、在指定的硬盘(例:/dev/sdb)上创建分区:fdisk /dev/sdb , 根据提示进行下一步操作,如:查看帮助(h),新建分区(n),删除分区(d),查看分区情况(p)\u003c/p\u003e\n\u003cp\u003ec、分区成功后,写分区表并退出(w)\u003c/p\u003e\n\u003cp\u003e注:fdisk 支持硬盘最大尺寸为 2TB,更详细说明请参看 Linux 在线手册(man fdisk)或百度一下。\u003c/p\u003e\n\u003cp\u003e2、第二步:格式化分区(mkfs.ext4)\u003c/p\u003e\n\u003cp\u003e对新建分区(例:/dev/sdb1)进行格式化:mkfs.ext4 /dev/sdb1 。\u003c/p\u003e\n\u003cp\u003e3、第三步:加载分区\u003c/p\u003e\n\u003cp\u003ea、创建分区挂接目录,例:mkdir /disk-cache-1 和 mkdir /disk-cache-2 …\u003c/p\u003e"
August 13, 2014
基本调优工具
"\u003cp\u003e一\nmpstat – 查看CPU使率信息\nvmstat – 报告虚存统计数据\niostat – 报告CPU状态和存储I/O统计数据\nnetstat – 报告络栈各项参数\nps – 系统上运的进程及其状态\ntop – 报告占CPU和内存最的进程\nsar – 报告系统活动状态\npidstat – 检查具体某个进程的CPU和内存情况\nperf – 综合性能检查具\u003c/p\u003e\n\u003cp\u003e二\nsysctl – 调整内核参数\nstrace – 跟踪进程的执\ndtrace – 综合跟踪具\nstap – 综合跟踪具\ntaskset – 绑定执CPU\npmap – 报告进程内存映射信息\nfree – 报告物理帧和虚拟帧信息\ndmesg – 系统启动信息,包括对各设备的监测\n/proc – 各项系统参数读写接\u003c/p\u003e\n\u003cp\u003e三\n/sys – 额外系统参数读写接\niotop – 类似top,但于检测I/O\nionice – 类似nice,但于设置进程的I/O优先级\nifcong – 监测与配置络接\ntcpdump – 捕获某个络接上的流量\nnicstat – 监测卡状态\nsysctl – 调整内核参数\nstrace – …\u003c/p\u003e"
December 14, 2013
Nginx利用多核cpu提高性能_配置参数worker_cpu_affinity
"\u003cp\u003e上篇文章我们介绍了Nginx 的优化方法,这里主要对worker_cpu_affinity参数详细介绍一下.(官方\u003ca href=\"http://nginx.org/en/docs/ngx_core_module.html#worker_cpu_affinity\"\u003ehttp://nginx.org/en/docs/ngx_core_module.html#worker_cpu_affinity\u003c/a\u003e )\n\u003ca href=\"#\" title=\"收起\"\u003e\n\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"简介\"\u003e简介\u003c/h2\u003e\n\u003cp\u003eNginx默认没有开启利用多核cpu,我们可以通过增加worker_cpu_affinity配置参数来充分利用多核cpu的性能。cpu是任务处理,计算最关键的资源,cpu核越多,性能就越好。\u003c/p\u003e\n\u003ch2 id=\"规则设定\"\u003e规则设定\u003c/h2\u003e\n\u003cp\u003e(1)cpu有多少个核,就有几位数,1代表内核开启,0代表内核关闭\u003c/p\u003e\n\u003cp\u003e(2)worker_processes最多开启8个,8个以上性能就不会再提升了,而且稳定性会变的更低,因此8个进程够用了\u003c/p\u003e\n\u003ch2 id=\"演示实例\"\u003e演示实例\u003c/h2\u003e\n\u003ch3 id=\"两核cpu开启两个进程\"\u003e\u003cstrong\u003e两核cpu,开启两个进程\u003c/strong\u003e\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\nworker_processes 2;\nworker_cpu_affinity 01 10;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e01表示启用了第一个cpu内核,10表示启用了第二个cpu内核\u003c/p\u003e\n\u003cp\u003eworker_cpu_affinity 01 10;表示开启了两个进程,第一个进程对应着第一个cpu内核,第二个进程对应着第二个cpu内核\u003c/p\u003e\n\u003ch3 id=\"两核cpu开启八个进程\"\u003e\u003cstrong\u003e两 …\u003c/strong\u003e\u003c/h3\u003e"
November 19, 2013
linux下使用iostat和pidstat查看进程使用资源情况
"\u003cp\u003e\u003cstrong\u003e引言\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在查看系统资源使用情况时,很多工具为我们提供了从设备角度查看的方法。例如使用 \u003ca href=\"http://www.cnblogs.com/bangerlee/articles/2547161.html\"\u003eiostat\u003c/a\u003e 查看磁盘io统计信息:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003elinux:~ # iostat -d 3\nDevice: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn\nsda 1.67 0.00 40.00 120\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e以上显示的是从sda的角度统计的结果。当我们需要从进程的角度,查看每个进程使用系统资源的情况,有什么方法吗?\u003c/p\u003e\n\u003cp\u003e使用pidstat工具可以获取每个进程使用cpu、内存和磁盘等系统资源的统计信息,pidstat由sysstat rpm包提供,可在suse11使用。下面我们来看pidstat的具体用法。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e默认输出\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e执行pidstat,将输出系统启动后所有活动进程的cpu统计信息:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003elinux:~ # pidstat\nLinux 2.6.32.12-0.7-default (linux) 06/18/12 …\u003c/code\u003e\u003c/pre\u003e"
November 14, 2013
sysctl -P 报错 error: “net.bridge.bridge-nf-call-arptables” is an unknown key 的解决办法
"\u003cp\u003e今天在安装openvz的时候(安装教程: \u003ca href=\"/archives/14724\"\u003ehttp://blog.haohtml.com/archives/14724\u003c/a\u003e),修改完内核参数后,执行\u003c/p\u003e\n\u003cp\u003e[shell]sysctl -P[/shell]\u003c/p\u003e\n\u003cp\u003e后,提示\u003c/p\u003e\n\u003cp\u003e[shell]net.ipv4.ip_forward = 1\nnet.ipv4.conf.default.rp_filter = 1\nnet.ipv4.conf.default.accept_source_route = 0\nkernel.sysrq = 1\nkernel.core_uses_pid = 1\nnet.ipv4.tcp_syncookies = 1\nerror: \u0026ldquo;net.bridge.bridge-nf-call-ip6tables\u0026rdquo; is an unknown key\nerror: \u0026ldquo;net.bridge.bridge-nf-call-iptables\u0026rdquo; is an unknown key\nerror: \u0026ldquo;net.bridge.bridge-nf-call-arptables\u0026rdquo; is an …\u003c/p\u003e"
November 12, 2013
使用Vagrant在Windows下部署开发环境[转]
"\u003cp\u003e做Web开发少不了要在本地搭建好开发环境,虽然说目前各种脚本都有对应的Windows版,甚至是一键安装包,但很多时候和Windows环境的相性并不是那么好,各麻烦的问题是实际部署的环境通常是Linux,常常还要面临着开发和部署环境不一致,上线前还要大量的调试。更要命的是,如果有很多机器需要装的话,那就真是一个灾难了。\u003c/p\u003e\n\u003cp\u003eWindows下玩Linux少不了虚拟机,但装系统依旧是相当费事。在现在什么都在自动化的今天,Vagrant就是这么一个神器,基于Ruby开发,使用开源 \u003ca href=\"https://www.virtualbox.org/\"\u003eVirtualBox\u003c/a\u003e 作为虚拟化支持,可以轻松的跨平台部署。\u003c/p\u003e\n\u003cp\u003e今天试着把几台机器的环境都换成Vagrant,很爽很顺畅,于是就试着整理了一下使用小结:\u003c/p\u003e\n\u003cp\u003e目前所选用的是当前的最新版本Vagrant 1.2.7 (对应的Vagrantfile V2版),VirtualBox 使用的是 4.2.16\n准备工作:\u003c/p\u003e\n\u003cp\u003e下载安装 VirtualBox : \u003ca href=\"https://www.virtualbox.org/\"\u003ehttps://www.virtualbox.org/\u003c/a\u003e 下载安装 Vagrant : \u003ca href=\"http://www.vagrantup.com/\"\u003ehttp://www.vagrantup.com/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e下载需要使用的 box :\u003c/p\u003e\n\u003cp\u003e官方提供的范例: …\u003c/p\u003e"
November 11, 2013
使用 Vagrant 打造跨平台开发环境
"\u003cp\u003e\u003ca href=\"http://vagrantup.com/\"\u003eVagrant\u003c/a\u003e 是一款用来构建虚拟开发环境的工具,非常适合 php/python/ruby/java 这类语言开发 web 应用,“代码在我机子上运行没有问题”这种说辞将成为历史。\u003c/p\u003e\n\u003cp\u003e我们可以通过 Vagrant 封装一个 Linux 的开发环境,分发给团队成员。成员可以在自己喜欢的桌面系统(Mac/Windows/Linux)上开发程序,代码却能统一在封装好的环境里运行,非常霸气。\u003c/p\u003e\n\u003ch2 id=\"安装步骤\"\u003e安装步骤\u003c/h2\u003e\n\u003ch3 id=\"1-安装-virtualbox\"\u003e1. 安装 VirtualBox\u003c/h3\u003e\n\u003cp\u003e虚拟机还是得依靠 VirtualBox 来搭建,免费小巧。\n下载地址: \u003ca href=\"https://www.virtualbox.org/wiki/Downloads\"\u003ehttps://www.virtualbox.org/wiki/Downloads\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e* 虽然 Vagrant 也支持 VMware,不过 VMware 是收费的,对应的 Vagrant 版本也是收费的\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"2-安装-vagrant\"\u003e2. 安装 Vagrant\u003c/h3\u003e\n\u003cp\u003e下载地址: \u003ca href=\"http://downloads.vagrantup.com/\"\u003ehttp://downloads.vagrantup.com/\u003c/a\u003e 根据提示一步步安装。\u003c/p\u003e\n\u003cp\u003e此外,还得下载官方封装好的基础镜像:\nUbuntu precise 32 VirtualBox …\u003c/p\u003e"
October 11, 2013
Linux 之 /etc/profile、~/.bash_profile 等几个文件的执行过程
"\u003cp\u003e\u003cstrong\u003e在登录Linux时要执行文件的过程如下:\u003c/strong\u003e\n在刚登录Linux时,首先启动 /etc/profile 文件,然后再启动用户目录下的 ~/.bash_profile、 ~/.bash_login或 ~/.profile文件中的其中一个,\u003c/p\u003e\n\u003cp\u003e执行的顺序为:~/.bash_profile、 ~/.bash_login、 ~/.profile。\u003c/p\u003e\n\u003cp\u003e如果 ~/.bash_profile文件存在的话,一般还会执行 ~/.bashrc文件。\u003c/p\u003e\n\u003cp\u003e因为在 ~/.bash_profile文件中一般会有下面的代码:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eif [ -f ~/.bashrc ] ; then\n. ./bashrc\nfi\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e~/.bashrc中,一般还会有以下代码:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eif [ -f /etc/bashrc ] ; then\n. /etc/bashrc\nfi\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e所以,~/.bashrc会调用 /etc/bashrc文件。最后,在退出shell时,还会执行 ~/.bash_logout文件。\u003c/p\u003e\n\u003cp\u003e执行顺序为: /etc/profile -\u0026gt; (~/.bash_profile | ~/.bash_login | ~/.profile) -\u0026gt; …\u003c/p\u003e"
July 14, 2013
nginx日志切割
"\u003cp\u003enginx的日志文件没有rotate功能。如果你不处理,日志文件将变得越来越大,还好我们可以写一个nginx日志切割脚本来自动切割日志文件。\u003c/p\u003e\n\u003cp\u003e第一步就是重命名日志文件,不用担心重命名后nginx找不到日志文件而丢失日志。在你未重新打开原名字的日志文件前,nginx还是会向你重命名的文件写日志,linux是靠文件描述符而不是文件名定位文件。\u003c/p\u003e\n\u003cp\u003e第二步向nginx主进程发送USR1信号。\u003c/p\u003e\n\u003cp\u003enginx主进程接到信号后会从配置文件中读取日志文件名称,重新打开日志文件(以配置文件中的日志名称命名),并以工作进程的用户作为日志文件的所有者。\u003c/p\u003e\n\u003cp\u003e重新打开日志文件后,nginx主进程会关闭重名的日志文件并通知工作进程使用新打开的日志文件。\u003c/p\u003e\n\u003cp\u003e工作进程立刻打开新的日志文件并关闭重名名的日志文件。\u003c/p\u003e\n\u003cp\u003e然后你就可以处理旧的日志文件了。\u003c/p\u003e\n\u003cp\u003enginx日志按日期自动切割脚本如下\n[shell]\n#nginx日志切割脚本\n#author: \u003ca href=\"http://www.nginx.cn\"\u003ehttp://www.nginx.cn\u003c/a\u003e\n#!/bin/bash\n#设置日志文件存放目录\nlogs_path=\u0026quot;/usr/local/nginx/logs/\u0026quot;\n#设 …\u003c/p\u003e"
June 25, 2013
centos 6关闭ipv6
"\u003cp\u003e通过网卡属性查看\u003c/p\u003e\n\u003cp\u003e命令:ifconfig\u003c/p\u003e\n\u003cp\u003e注释:有 “inet6 addr:。。。。。。。“ 的表示开启了ipv6功能.使用下面的方法可以关闭ipv6\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.修改/etc/modprobe.d/dist.conf\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e[shell]#vi /etc/modprobe.d/dist.conf[/shell]\u003c/p\u003e\n\u003cp\u003e添加下面两行内容\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ealias net-pf-10 off\nalias ipv6 off\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e保存退出,并且重新启动系统\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2.验证ipv6模块是否加载\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e[shell]#lsmod|grep ipv6[/shell]\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e4.开机不启动\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e[shell]#chkconfig ip6tables off[/shell]\u003c/p\u003e\n\u003cp\u003e重启 用命令“lsmod | grep v6”查看,是否启动加载!\u003c/p\u003e\n\u003cp\u003e=======================================\u003c/p\u003e\n\u003cp\u003e1.修改/etc/sysconfig/network,追加:\u003c/p\u003e\n\u003cp\u003eNETWORKING_IPV6=no\u003c/p\u003e\n\u003cp\u003e2.修改/etc/hosts文件,把ipv6的那句本地主机名解析的也注释掉:\u003c/p\u003e\n\u003cp\u003e#::1 localhost localhost6 …\u003c/p\u003e"
June 3, 2013
centos下更新Python版本的步骤
"\u003cp\u003e准备安装gitlab,发现系统目前的python版本为2.4.3版本.太低了, 虽然目前最高版本为3.3.0版本.但gitlab不支持这个版本.没有办法,我们这里将python升级到2.7.6版本.\u003c/p\u003e\n\u003cp\u003e更新python千万不要把老版本的删除!新老版本是可以共存的,很多基本的命令、软件包都要依赖预装的老版本python的,比如yum。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e第1步:更新gcc,因为gcc版本太老会导致新版本python包编译不成功\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e[shell]yum -y install gcc[/shell]\u003c/p\u003e\n\u003cp\u003e系统会自动下载并安装或更新,等它自己结束\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e第2步:下载Python 2.7.0软件包\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e[shell]wget \u003ca href=\"http://python.org/ftp/python/2.7/Python-2.7.tar.bz2\"\u003ehttp://python.org/ftp/python/2.7/Python-2.7.tar.bz2\u003c/a\u003e\ntar -jxvf Python-2.7.tar.bz2\ncd Python-2.7\n./configure\nmake all\nmake install\nmake clean\nmake distclean\n/usr/local/bin/python2.7 -V\ncd ../[/shell]\u003c/p\u003e\n\u003cp\u003e编译安装完毕以 …\u003c/p\u003e"
May 27, 2013
Centos下gitlab安装指南[原创]
"\u003cp\u003e最后一次更新时间:2013-05-29\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/gitlabhq/gitlabhq\"\u003egitlab 5.2.0\u003c/a\u003e\ncentos6.3 i686\n\u003ca href=\"http://redis.googlecode.com/files/redis-2.6.13.tar.gz\"\u003eRedis 2.6.13\n\u003c/a\u003e \u003ca href=\"http://nginx.org/download/nginx-1.4.1.tar.gz\"\u003enginx-1.4.1\u003c/a\u003e\n\u003ca href=\"http://mysql.spd.co.il/Downloads/MySQL-5.5/mysql-5.5.31-linux2.6-i686.tar.gz\"\u003emysql-5.5.31-linux2.6-i686.tar.gz\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e这里与官方的教程有些不一样,主要是一些软件如mysql nginx redis之类的以前是手动编译安装的.\u003c/p\u003e\n\u003cp\u003e网上也有提供一键安装包工具:\u003ca href=\"http://bitnami.com/stack/gitlab\"\u003ehttp://bitnami.com/stack/gitlab\n\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003egitlab中文使用指南:\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/05/GitLab%E4%BD%BF%E7%94%A8%E4%BB%8B%E7%BB%8D.pdf\"\u003eGitLab使用介绍\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e首先我们选择比较快的yum源,不然安装速度会非常的慢的.这里使用中国科技大学的yum源更换yum源方法参考:,\u003c/p\u003e\n\u003cp\u003e说明:\n默认安装的git版本可能会低一些,需要升级到最新版本才可以.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1. Packages / Dependencies\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e[shell]yum -y install readline-devel gdbm-devel ncurses-devel openssl-devel zlib-devel gcc gcc-c++ make autoconf curl-devel expat-devel gettext-devel …\u003c/p\u003e"
April 9, 2013
使用nohup在后台运行scp
"\u003cp\u003e对于scp的用法见:\u003c/p\u003e\n\u003cp\u003e需要从远程拷贝一个比较大的文件,所以要让SCP在后台运行\u003c/p\u003e\n\u003cp\u003egoogle搜了一下都是说使用ssh的public key让两台机器可以不用密码连接\u003c/p\u003e\n\u003cp\u003e但不是每个人都有这个条件允许两台机器无密码通行的\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e所以可以使用下面的方法实现:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1.nohup scp user@server:path/file localpath\u003c/p\u003e\n\u003cp\u003e2.输入密码\u003c/p\u003e\n\u003cp\u003e3.按Ctrl+z挂起当前进程\u003c/p\u003e\n\u003cp\u003e4.使用命令bg让挂起的进程继续运行\u003c/p\u003e"
March 19, 2013
sphinx分布式索引简介
"\u003cp\u003e\u003cstrong\u003esphinx分布式索引原理:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e当searchd收到一个对分布式索引的查询时,它做如下操作:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e连接到远程代理\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e执行查询\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e(在远程代理执行搜索的同时)对本地索引进行查询\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e接收来自远程代理的搜索结果\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e将所有结果合并,删除重复项\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e将合并后的结果返回给客户端\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e在应用程序看来,普通索引和分布式索引完全没有区别。\u003c/p\u003e\n\u003cp\u003e任一个searchd实例可以同时做为主控端(master,对搜索结果做聚合)和从属端(只做本地\u003c/p\u003e\n\u003cp\u003e搜索)。这有如下几点好处:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e集群中的每台机器都可以做为主控端来搜索整个集群,搜索请求可以在主控端之间获\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e得负载平衡,相当于实现了一种HA(high availability,高可用性),可以应对某个\u003c/p\u003e\n\u003cp\u003e节点失效的情况。\u003c/p\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003e如果在单台多CPU或多核机器上使用,一个做为代理对本机进行搜索的searchd实例\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e就可以利用到全部的CPU或者核。\u003c/p\u003e\n\u003cp\u003e更好的HA支持已在计划之中,到时将允许指定哪些代理之间互相备份、有效性检查、跟踪\u003c/p\u003e\n\u003cp\u003e运行中的代理、对检索请求进行负载均衡,等等。\u003c/p\u003e\n\u003cp\u003esphinx分布式索引配置:\u003c/p\u003e\n\u003cp\u003eindex dist1\u003c/p\u003e\n\u003cp\u003e{\u003c/p\u003e\n\u003cp\u003elocal index to be …\u003c/p\u003e"
March 9, 2013
linux下启动mysql提示”mysql deamon failed to start”错误的解决办法
"\u003cp\u003e有台linux服务器,系统为centos系统.\u003c/p\u003e\n\u003cp\u003e描述:\u003c/p\u003e\n\u003cp\u003e网站突然连接不上数据库,于是朋友直接重启了一下服务器。进到cli模式下,执行 service myqsld start 发现还是提示”mysql deamon failed to start”错误信息.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/etc/init.d/mysqld start\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMySQL Daemon failed to start.\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eStarting mysqld: [FAILED]\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e查看mysqld的log文件\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#less /var/log/mysqld.log\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/usr/libexec/mysqld: Can’t change dir to ‘XXX’ (Errcode: 13)\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e首先是查看数据库日志\u003c/p\u003e\n\u003cp\u003emysqld started\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[Warning] Can’t create test file xxx.lower-test [Warning] Can’t create test file xxx.lower-test …\u003c/p\u003e\u003c/blockquote\u003e"
February 1, 2013
iptables规则的查看、添加、删除和修改[教程]
"\u003cp\u003e在 Linux 中 iptables 实际上只是一个操作 Linux 内核 Netfilter 子系统的“界面”。顾名思义,Netfilter 子系统的作用,就是 Linux 内核里挡在“网卡”和“用户态进程”之间的一道“防火墙”。 也就是说 \u003ccode\u003eiptables\u003c/code\u003e 工作在用户态,它和我们平时开发的应用程序完全一样的,只是它的作用是用来操作 \u003ccode\u003eNetFilter\u003c/code\u003e 的一个工具。而 \u003ccode\u003eNetFilter\u003c/code\u003e 工作在内核态,它们的关系,可以用如下的示意图来表示:\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2022/06/4a540c412455b4213552bbb531c535ad.webp\" alt=\"\"\u003e图来自极客时间\u003c/p\u003e\n\u003cp\u003e在 iptables 中存在四表五链的概念。\u003c/p\u003e\n\u003cp\u003e表分别为 \u003ccode\u003efilter\u003c/code\u003e、\u003ccode\u003enat\u003c/code\u003e、\u003ccode\u003eraw\u003c/code\u003e、\u003ccode\u003emangle\u003c/code\u003e ,当数据包抵达防火墙时,将依次应用 raw、mangle、nat、和 filter 表中对应链内的规则,其中表的应用顺序为:raw -\u0026gt; mangle -\u0026gt; nat -\u0026gt; filter,而表中链的规则自上向下依次执行,执行中有可能跳转到其它链中继续执行。 \u003cimg src=\"https://blogstatic.haohtml.com/uploads/2021/10/d2b5ca33bd970f64a6301fa75ae2eb22.png\" alt=\"\"\u003eiptables Processing Flowchart\u003c/p\u003e\n\u003cp\u003e如果按七层网络协议的话,则 ipables 中的数据流向为\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2021/10/d4305170eed2b86a240d044f337dd95c.png\" alt=\"\"\u003e(来自Netfilter 官方的原理 …\u003c/p\u003e"
January 31, 2013
ldconfig命令作用
"\u003cp\u003eldconfig是一个动态链接库管理命令\u003c/p\u003e\n\u003cp\u003e为了让动态链接库为系统所共享,还需运行动态链接库的管理命令–ldconfig\nldconfig 命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态 链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表.\u003c/p\u003e\n\u003cp\u003eldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令.\n**ldconfig命令行用法如下: **\nldconfig [-v|–verbose] [-n] [-N] [-X] [-f CONF] [-C CACHE] [-r ROOT] [-l] [-p|–print-cache] [-c FORMAT] [–format=FORMAT] [-V] [- |–help|–usage] path…\u003c/p\u003e\n\u003cp\u003e**ldconfig可用的选项说明如下: **\n(1) -v或–verbose …\u003c/p\u003e"
January 26, 2013
iostat命令
"\u003cp\u003eLinux系统中的 iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。iostat属于sysstat软件包。可以用yum install sysstat 直接安装。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.命令格式:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eiostat[参数][时间][次数]\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2.命令功能:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e通过iostat方便查看CPU、网卡、tty设备、磁盘、CD-ROM 等等设备的活动情况, 负载信息。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3.命令参数:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e-c 显示CPU使用情况\u003c/p\u003e\n\u003cp\u003e-d 显示磁盘使用情况\u003c/p\u003e\n\u003cp\u003e-k 以 KB 为单位显示\u003c/p\u003e\n\u003cp\u003e-m 以 M 为单位显示\u003c/p\u003e\n\u003cp\u003e-N 显示磁盘阵列(LVM) 信息\u003c/p\u003e\n\u003cp\u003e-n 显示NFS 使用情况\u003c/p\u003e\n\u003cp\u003e-p[磁盘] 显示磁盘和分区的情况\u003c/p\u003e\n\u003cp\u003e-t 显示终端和CPU的信息\u003c/p\u003e\n\u003cp\u003e-x 显示详细信息\u003c/p\u003e\n\u003cp\u003e-V 显示版本信息\u003c/p\u003e\n\u003cp\u003e4.使用实例:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e实例1:显示所有设备负载情况\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e命令:\u003c/p\u003e\n\u003cp\u003eiostat\u003c/p\u003e\n\u003cp\u003e输出:\u003c/p\u003e\n\u003cp\u003e[root@CT1186 ~]# iostat\u003c/p\u003e\n\u003cp\u003eLinux …\u003c/p\u003e"
January 25, 2013
分布式TCP压力测试工具 tcpcopy
"\u003cp\u003etcpcopy是一种应用请求复制(基于tcp的packets)工具,其应用领域较广,我们曾经应用于网易的广告投放系统,urs系统,nginx hmux协议开发等系统,避免了上线带来的很多问题。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e总体说来,tcpcopy主要有如下功能:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1)分布式压力测试工具,利用在线数据,可以测试系统能够承受的压力大小(远比ab压力测试工具真实地多),也可以提前发现一些bug\n2)对于后端的短连接,请求丢失率非常低(1/10万),可以应用于热备份\n3)普通上线测试,可以发现新系统是否稳定,提前发现上线过程中会出现的诸多问题,让开发者有信心上线\n4)对比试验,同样请求,针对不同或不同版本程序,可以做性能对比等试验\n5)利用多种手段,构造无限在线压力,满足中小网站压力测试要求\n6)实战演习(架构师必备)\u003c/p\u003e\n\u003cp\u003etcpcopy可以用于实时和离线回放领域,并且tcpcopy支持mysql协议的复制,开源一年以来,功能上越来越完善。\u003c/p\u003e\n\u003cp\u003e如果你对上线没有信心,如果你的单元测试不够充分,如果你对新系统不够有把握,如果你对未来的请求压力无法预测,tcpcopy可以帮助你解决上述难题。 …\u003c/p\u003e"
January 25, 2013
git config –global push.default
"\u003cp\u003e参考教程 \u003ca href=\"http://blog.haohtml.com/archives/10093\"\u003ehttp://blog.haohtml.com/archives/10093\u003c/a\u003e 刚安装的git最新版本,发现有些命令发生了一些变化.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[web@bogon www]$ git push\nwarning: push.default is unset; its implicit value is changing in\nGit 2.0 from ‘matching’ to ‘simple’. To squelch this message\nand maintain the current behavior after the default changes, use:\u003c/p\u003e\n\u003cp\u003egit config –global push.default matching\u003c/p\u003e\n\u003cp\u003eTo squelch this message and adopt the new behavior now, use:\u003c/p\u003e\n\u003cp\u003egit config –global push.default simple\u003c/p\u003e\n\u003cp\u003eSee ‘git help config’ and search for ‘push.default’ for further …\u003c/p\u003e\u003c/blockquote\u003e"
January 17, 2013
如何查看crontab的日志记录
"\u003cp\u003e昨天crontab中的同步任务没有执行,不知道是什么原因没有执行,貌似任务hang住了,想查询一下crontab到底问题出在哪里,或者hang在了什么地方。\u003c/p\u003e\n\u003cp\u003e1. linux\u003c/p\u003e\n\u003cp\u003e看 /var/log/cron这个文件就可以,可以用tail -f /var/log/cron观察\u003c/p\u003e\n\u003cp\u003e2. unix\u003c/p\u003e\n\u003cp\u003e在 /var/spool/cron/tmp文件中,有croutXXX001864的tmp文件,tail 这些文件就可以看到正在执行的任务了。\u003c/p\u003e\n\u003col start=\"3\"\u003e\n\u003cli\u003email任务\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e在 /var/spool/mail/root 文件中,有crontab执行日志的记录,用tail -f /var/spool/mail/root 即可查看最近的crontab执行情况。\u003c/p\u003e"
January 17, 2013
查看Linux系统 重启日志,登录日志和输入命令的日志
"\u003cp\u003e查看 重启情况\u003c/p\u003e\n\u003cp\u003e# last reboot\u003c/p\u003e\n\u003cp\u003e——————————————————————————————————————————————–\u003c/p\u003e\n\u003cp\u003ereboot system boot 2.6.18-92.el5 Mon Dec 6 12:50 (05:11)\nreboot system boot 2.6.18-92.el5 Mon Dec 6 10:49 (07:12)\nreboot system boot 2.6.18-92.el5 Sun Dec 5 18:56 (23:05)\nreboot system boot 2.6.18-92.el5 Mon Nov 29 09:55 (7+08:06)\nreboot system boot 2.6.18-92.el5 Sun Nov 28 13:47 (8+04:14)\nreboot system boot 2.6.18-92.el5 Thu Nov 25 11:59 …\u003c/p\u003e"
January 14, 2013
nginx无法启动: libpcre.so.1/libpcre.so.0: cannot open shared object file解决办法
"\u003cp\u003eNGINX启动时提示错误:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/usr/local/nginx/sbin/nginx -t\n/usr/local/nginx/sbin/nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eldd $(which /usr/local/nginx/sbin/nginx)\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003elinux-vdso.so.1 =\u0026gt; (0x00007fff48ff0000)\nlibcrypt.so.1 =\u0026gt; /lib64/libcrypt.so.1 (0x0000003065800000)\nlibpcre.so.1 =\u0026gt; not found\nlibssl.so.6 =\u0026gt; /lib64/libssl.so.6 (0x0000003067000000)\nlibcrypto.so.6 =\u0026gt; /lib64/libcrypto.so.6 (0x0000003066400000)\nlibdl.so.2 =\u0026gt; …\u003c/p\u003e\u003c/blockquote\u003e"
November 22, 2012
ftp中“二进制传输模式”和“ASCII传输模式”有什么区别?
"\u003cp\u003e《Red Hat Linux 指南:服务器设置与程序设计篇》第2章FTP:跨越网络传送文件,这一章为您介绍实现FTP协议的服务器和客户端有很多种、以及开FTP服务器可以让用户以匿名用户身份anonymous或者ftp登录,最后为您介绍FTP提供了两种传输文件的模式:二进制模式和ASCII模式。本小节讲述的是二进制传输模式和ASCII传输模式。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2.3.6 二进制传输模式和ASCII传输模式\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eFTP服务器vsftpd能够(但并不总是)提供两种文件传输模式。二进制模式传输总是复制文件的精确的、字节对字节的文件映像,而绝不会改变行结束符。所有二进制文件都用二进制模式传送。除非需要转换行结束符,否则也要使用二进制模式来传输ASCII文件。\u003c/p\u003e\n\u003cp\u003eASCII文件(比如文本文件或程序源代码,在Linux下使用vi之类的文本编辑器创建这些文件)使用单个换行符(NEWLINE,CONTROL-J,记作”\\n”)来标记每行的末尾;其他操作系统则用不同的方式来标记行尾。Windows用RETURN(CONTROL-M,记作”\\r”)后面跟随NEWLINE(总共两个字符)来标记每行的末尾。Mac系统只使 …\u003c/p\u003e"
October 22, 2012
理解inode
"\u003cp\u003e\u003ca href=\"http://en.wikipedia.org/wiki/Inode\"\u003einode\u003c/a\u003e 是一个重要概念,是理解Unix/Linux文件系统和硬盘储存的基础。\u003c/p\u003e\n\u003cp\u003e我觉得,理解inode,不仅有助于提高系统操作水平,还有助于体会Unix设计哲学,即如何把底层的复杂性抽象成一个简单概念,从而大大简化用户接口。\u003c/p\u003e\n\u003cp\u003e下面就是我的inode学习笔记,尽量保持简单。\u003c/p\u003e\n\u003cp\u003e===================================\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e理解inode\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e作者:阮一峰\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2012/10/inode.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2012/10/inode.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、inode是什么?\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e理解inode,要从文件储存说起。\u003c/p\u003e\n\u003cp\u003e文件储存在硬盘上,硬盘的最小存储单位叫做”扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)。\u003c/p\u003e\n\u003cp\u003e操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个”块”(block)。这种由多个扇区组成的”块”,是文件存取的最小单位。”块”的大小,最常见的是4KB,即连续八个 sector组成一个 block。\u003c/p\u003e\n\u003cp\u003e文件数据都储存在”块”中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为”索引节 …\u003c/p\u003e"
September 16, 2012
linux下时间格式为24小时制的办法(centos)
"\u003cp\u003e下面是自己解决的方法\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003etzselect\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e根据提示选择\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e5 –\u0026gt; 9–\u0026gt;1–\u0026gt;1–\u0026gt;ok\nrm /etc/localtime\nln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这时就可以看到时间已经修改成为国内的时间了。时间也对的。时间为24小时制。\u003c/p\u003e"
September 5, 2012
增加Apache2和Nginx的header长度限制
"\u003cp\u003enginx默认的header长度上限是4k,如果超过了这个值\nnginx会直接返回400错误\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[error] 16613#0: *105 upstream sent too big header while reading response header from upstream\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e可以通过以下2个参数来调整header上限\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eclient_header_buffer_size 16k;\nlarge_client_header_buffers 4 16k;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e看起来是,nginx默认会用client_header_buffer_size这个buffer来读取header值,如果header过大,它会使用large_client_header_buffers来读取\u003c/p\u003e\n\u003cp\u003eclient_header_buffer_size\u003c/p\u003e\n\u003cp\u003esyntax: client_header_buffer_size size\u003c/p\u003e\n\u003cp\u003edefault: 1k\u003c/p\u003e\n\u003cp\u003econtext: http, server\u003c/p\u003e\n\u003cp\u003eDirective sets the headerbuffer size for the request header from …\u003c/p\u003e"
August 20, 2012
Ubuntu12.04 root用户登录桌面设置
"\u003cp\u003eubuntu12.04默认是不允许root登录的,在登录窗口只能看到普通用户和访客登录。以普通身份登陆Ubuntu后我们需要做一些修改,\n普通用户登录后,修改系统配置文件需要切换到超级用户模式,在终端窗口里面输入: sudo -s.然后输入普通用户登陆的密码,回车即可进入 root用户权限模式.\u003c/p\u003e\n\u003cp\u003e然后执行: vi /etc/lightdm/lightdm.conf.\u003c/p\u003e\n\u003cp\u003e增加 **greeter-show-manual-login=true allow-guest=false . **修改完的整个配置文件是\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[SeatDefaults]\ngreeter-session=unity-greeter\nuser-session=ubuntu\n\u003cstrong\u003egreeter-show-manual-login=true #手工输入登陆系统的用户名和密码\nallow-guest=false #不允许guest登录\u003c/strong\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e****然后我们启动root帐号:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003esudo passwd root\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e根据提示输入roott帐号密码。\u003c/p\u003e\n\u003cp\u003e重启ubuntu,登录窗口会有“登录”选项,点击“登录”选项,就会提示让输入用户名了。 …\u003c/p\u003e"
August 18, 2012
git下添加新项目及用户
"\u003cp\u003e我们在上一节()配置成功了git-server。这里我们新创建一个git项目并允许开者使用.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1. 生成密钥与公钥\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e***\u003cem\u003e[dev1@bogon ~]$ ssh-keygen -t rsa\nGenerating public/private rsa key pair.\nEnter file in which to save the key (/home/dev1/.ssh/id_rsa):\nCreated directory ‘/home/dev1/.ssh’.\nEnter passphrase (empty for no passphrase):\nEnter same passphrase again:\nYour identification has been saved in /home/dev1/.ssh/id_rsa.\nYour public key has been saved in /home/dev1/.ssh/id_rsa.pub.\nThe key fingerprint is: …\u003c/em\u003e\u003c/p\u003e\u003c/blockquote\u003e"
August 14, 2012
CentOS 6.0 SSH命令无法执行的问题的解决办法
"\u003cp\u003e需要通过这台centos,ssh到另外一台\u003c/p\u003e\n\u003cp\u003e结果发现没有ssh\u003c/p\u003e\n\u003cp\u003e通常可能是未安装openssh所导致的\u003c/p\u003e\n\u003cp\u003e执行\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003erpm -qa | grep openssh\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e如果没有:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eopenssh-clients\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e那就安装:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eyum -y install openssh-clients\u003c/p\u003e\u003c/blockquote\u003e"
July 17, 2012
如何在linux下解压缩rar格式的文件压缩包
"\u003cp\u003e前言:没有特殊原因,文档如果要传到linux上,一定要打成*.zip格式,这样方便解压,一般来说没有理由要用rar.关于 linux上unzip命令有空细讲,本节讲下,如何让linux支持解压缩rar文件\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一 、系统环境\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1.1 系统环境\n实验环境一:\nCentOS release 5.5 (Final)\n2.6.18-194.el5\nx86_64 GNU/Linux \u0026lt;–64位系统\n实验环境二:\nCentOS release 5.4 (Final)\n2.6.18-164.el5\ni686 GNU/Linux \u0026lt;–32位系统\u003c/p\u003e\n\u003cp\u003e1.2命令查看方法:\n[root@oldboy tools]# cat /etc/redhat-release\nCentOS release 5.5 (Final)\n[root@oldboy tools]# uname -r\n2.6.18-194.el5\n[root@oldboy tools]# uname -m\nx86_64\n\u003cstrong\u003e二、下载并安装rar软件\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e2.1 下载( \u003ca href=\"http://www.rarsoft.com/download.htm\"\u003ehttp://www.rarsoft.com/download.htm\u003c/a\u003e) …\u003c/p\u003e"
July 16, 2012
解决SSH里“Server Refused Our Key”的方法
"\u003ch1 id=\"heading\"\u003e/*\u003cstrong\u003e*\u003c/strong\u003e*\u003cstrong\u003e*\u003c/strong\u003e*\u003cstrong\u003e*\u003c/strong\u003e*\u003cstrong\u003e*\u003c/strong\u003e*\u003cstrong\u003e*\u003c/strong\u003e*\u003cstrong\u003e*\u003c/strong\u003e*\u003cstrong\u003e*\u003c/strong\u003e*****\ntitle:解决SSH里“Server Refused Our Key”的方法\nauthor:insun\nblog:http://yxmhero1989.blog.163.com/\n*\u003cstrong\u003e*\u003c/strong\u003e*\u003cstrong\u003e*\u003c/strong\u003e*\u003cstrong\u003e*\u003c/strong\u003e*\u003cstrong\u003e*\u003c/strong\u003e*\u003cstrong\u003e*\u003c/strong\u003e*\u003cstrong\u003e*\u003c/strong\u003e*\u003cstrong\u003e*\u003c/strong\u003e*\u003cstrong\u003e*\u003c/strong\u003e*/\u003c/h1\u003e\n\u003cp\u003e在公司使用虚拟机研究爬虫抓网页和相关数据,要连接linux虚拟机。\u003c/p\u003e\n\u003cp\u003eputty.exe 该软件可连接服务器,用来连接远程的linux服务器和虚拟机,或者用来设置代理。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2012/07/615867249059712387.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2012/07/615867249059712387.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e网关设置正确的话,应该可以不用密钥可以login的。若在其他地方才要ppk密钥key。\u003c/p\u003e\n\u003cp\u003ewinscp406setup.exe 该软件用来在pc和服务器中传送文件\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2012/07/putty_2.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2012/07/putty_2.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2012/07/winscp.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2012/07/winscp.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e输入root后出现“Disconnected:No supported authentication methods available”\n命令行里输入 ipconfig /flushdns这个试一下,自己研究去哈哈\u003c/p\u003e\n\u003cp\u003e====================================================================================\u003c/p\u003e\n\u003cp\u003e找了 …\u003c/p\u003e"
July 9, 2012
在WINDOWS下使用copSSH配置GIT服务器
"\u003cp\u003e近日对GIT进行了研究,发现还真是个好东东,但是在GIT服务器的配置上,在试用了多个SSH服务器之后,始终未能搞定,导致几近崩溃;最终靠着秉承“外事问谷歌,内事问百度”的理念,终于找到了一篇E文的博客,才算搞定。今把过程展示出来,希望对大家能有帮助。(注:本文严重参考了以下博客 \u003ca href=\"http://www.timdavis.com.au/git/setting-up-a-msysgit-server-with-copssh-on-windows/\"\u003ehttp://www.timdavis.com.au/git/setting-up-a-msysgit-server-with-copssh-on-windows/\u003c/a\u003e,在此表示强烈感谢)\n**基本原理:**使用copSSH在WINDOWS(XP)上建立SSH服务器;使用生成的“公钥-私钥”对作为身份标识;在服务器上配置SHELL脚本环境;配置客户端,加载私钥。详细过程如下:\n\u003cstrong\u003e安装前准备:\u003c/strong\u003e\nDownload \u003ca href=\"http://www.itefix.no/copssh/\"\u003ecopSSH\u003c/a\u003e [ \u003ca href=\"http://sourceforge.net/projects/sereds/files/Copssh/\"\u003eSourceForge Link\u003c/a\u003e] (注:SSH服务器软件)\u003c/p\u003e\n\u003cp\u003eDownload \u003ca href=\"http://code.google.com/p/msysgit/\"\u003emsysgit\u003c/a\u003e (注:WINDOWS下的git安装包)\nDownload \u003ca href=\"http://code.google.com/p/tortoisegit/\"\u003eTortiseGIT\u003c/a\u003e (注:WINDOWS下的git图形化软件,与TortiseSVN是同门)\nDownload \u003ca href=\"http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html\"\u003ePuTTY …\u003c/a\u003e\u003c/p\u003e"
July 8, 2012
Nginx——关闭Nginx日志
"\u003cp\u003e有时候,nginx日志十分吓人,我们有个客户受到攻击,nginx出现too many connections错误,日志5分钟就写入了10GB,硬盘很快就会满了。 那么,如何关闭Nginx日志?怎么取消/停止Nginx日志? 可以修改nginx.conf\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eaccess_log /dev/null;\nerror_log /dev/null;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这样全部把他们丢到系统的黑洞里了。不用每时每刻都往系统磁盘疯狂的读写日志了 还延长硬盘的寿命。\u003c/p\u003e\n\u003cp\u003e修改完,重启Nginx( kill -HUP \u003ccode\u003ecat logs/nginx.pid\u003c/code\u003e )即可。\u003c/p\u003e"
June 20, 2012
IIS启用gzip的方法,IIS如何开启gzip
"\u003cp\u003e现代的浏览器IE6和Firefox都支持客户端Gzip,也就是说,在服务器上的网页,传输之前,先使用Gzip压缩再传输给客户端,客户端接收 之后由浏览器解压显示,这样虽然稍微占用了一些服务器和客户端的CPU,但是换来的是更高的带宽利用率。对于纯文本来讲,压缩率是相当可观的。如果每个用 户节约50%的带宽,那么你租用来的那点带宽就可以服务多一倍的客户了。\u003c/p\u003e\n\u003cp\u003eIIS6已经内建了Gzip压缩的支持,可惜,没有设置更好的管理界面。所以要打开这个选项,还要费些功夫。\u003c/p\u003e\n\u003cp\u003e首先,如果你需要压缩静态文件(HTML),需要在硬盘上建一个目录,并给它“IUSR_机器名”这个用户的写权限。如果压缩动态文件 (PHP,asp,aspx)就不需要了,因为它的页面是每次都动态生成的,压缩完就放弃。然后在IIS管理器中,“网站”上面右键-属性,不是下面的某 个站点,而是整个网站。进入“服务”标签,选上启用动态内容压缩,静态内容压缩。\u003c/p\u003e\n\u003cp\u003e然后选中网站下面那个服务器扩展,新建一个服务器扩展。名字无所谓,下面的添加文件的路径是:\u003c/p\u003e\n\u003cp\u003ec:\\windows\\system32\\inetsrv\\gzip.dll,然后启用这个扩展。\u003c/p\u003e\n\u003cp\u003e这时 …\u003c/p\u003e"
June 4, 2012
linux nginx php木马排查及加固整理
"\u003cp\u003e\u003cstrong\u003e1、改变目录和文件属性,禁止写入\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003efind -type f -name *.php –exec chmod 444 {} ;\nfind -type d -exec chmod 555 {} ;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e注:当然要排除上传目录、缓存目录等;\n同时最好禁止chmod函数,攻击者可通过chmod来修改文件只读属性再修改文件\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2、php配置\u003c/strong\u003e\n禁用危险函数\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003epassthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,\nini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,escapeshellcmd,popen,dl,\nsyslog,show_source\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e3、nginx配置\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e限制一些目录执行php文件\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003elocation~^/images/.*.(php|php5)$\n{\ndenyall;\n} …\u003c/p\u003e\u003c/blockquote\u003e"
May 26, 2012
Linux下独立添加PHP扩展模块mbstring 和 curl
"\u003cp\u003e环境php5.2.13, 不支持mbstring扩展\n假如php的源码包在/usr/local/src/php-5.2.13\nphp安装目录是/usr/local/php\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# cd /usr/local/src/php-5.2.13/ext/mbstring/\n# rpm -qa|egrep “autoconf|gcc” 这个是检测这些组件是否安装,没有安装请执行下面这句,否则会报错\n# yum -y install autoconf gcc gcc-c++\n# phpize\n# ./configure –with-php-config=/usr/local/bin/php-config\n# make\n# make install\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e执行完毕后在php.ini里增加\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eextension=mbstring.so\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e重启web服务器, 看一下phpinfo, 应该支持mbstring了!\u003c/p\u003e\n\u003cp\u003e===================================\n1.安装curl\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewget …\u003c/p\u003e\u003c/blockquote\u003e"
May 26, 2012
You could try using –skip-broken to work around the problem 解决办法
"\u003cp\u003e–\u0026gt; Missing Dependency: libevent-1.4.so.2()(64bit) is needed by package mysql-proxy-0.5.1-2.el5.x86_64 (epel)\u003c/p\u003e\n\u003cp\u003eError: Missing Dependency: libevent-1.4.so.2()(64bit) is needed by package mysql-proxy-0.5.1-2.el5.x86_64 (epel)\u003c/p\u003e\n\u003cp\u003eYou could try using –skip-broken to work around the problem\u003c/p\u003e\n\u003cp\u003eYou could try running: package-cleanup –problems\u003c/p\u003e\n\u003cp\u003epackage-cleanup –dupes\u003c/p\u003e\n\u003cp\u003erpm -Va –nofiles –nodigest\u003c/p\u003e\n\u003cp\u003eThe program package-cleanup is found in the yum-utils package.\u003c/p\u003e\n\u003cp\u003e解决:\u003c/p\u003e\n\u003cp\u003e[root@oracle10g bin]# yum –skip-broken update\u003c/p\u003e"
May 26, 2012
CentOS 5.1安装php mcrypt和mbstring的扩展
"\u003cp\u003e还是先说系统及php相应的版本:\u003c/p\u003e\n\u003cp\u003eCentOS 5.1 内核 2.6.18; php 5.2.6 ;phpmyadmin3.2.2\u003c/p\u003e\n\u003cp\u003e其 实大家遇到的问题是phpmyadmin 3.2.2 这个版本需要更高的php版本来支持,当然CentOS 5.1 5.2 5.3这些版本的php都是5.1的,所以问题就自然来了。如果我们要安装php-mcrypt和php-mbstring 的扩展,用系统自带的yum 来升级安装是不行的。但是用rpm 或源码安装也是没有问题的。可是我从网上找了很多帖子不是这里有问题就是那里不行。今天就尝试下看是否有更快捷的方法。\u003c/p\u003e\n\u003cp\u003e结果还真是让我三番五次的试出来了,下面我就给大家说明下。\u003c/p\u003e\n\u003cp\u003e因为很多博客系统和网站都需要一个GD库的支持,默认情况下很多是不直接支持的,需要我们单独安装,所以为了升级安装我的php版本我从网上找了一个yum升级的源:http://www.jasonlitka.com\u003c/p\u003e\n\u003cp\u003e这样我们要具体做得就是更改 /etc/yum.reposd 里面的文件,我们先把原有的文件全部进行重命名的备份,然后新件一个 .repo后缀的文件 名字自己随便起,在这个文件中添加内 …\u003c/p\u003e"
May 26, 2012
解决办法The page you are looking for is temporarily unavailable错误,php-cgi没启动
"\u003cp\u003e今天访问WordPress程序做的网站,突然出现\u003cstrong\u003eThe page you are looking for is temporarily unavailable\u003c/strong\u003e错误,服务器环境为: Linux+Nginx+MySQL+PHP。于是上网查找解决方法,找到以下两个解决方法,作为参考:\u003c/p\u003e\n\u003cp\u003e** 解决方法一:**\u003c/p\u003e\n\u003cp\u003e访问discuz论坛很正常,但是一旦访问uc_server的后台就这样nginx就提示以下错误:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe page you are looking for is temporarily unavailable.\nPlease try again later.\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e1.先检查PHP FastCGI进程数是否够用:\u003c/p\u003e\n\u003cp\u003enetstat -anpo|grep “php-cgi”|wc -l\n如果输出为0的话,则表示FastCGI 进程数够大,可通过修改php-fpm.conf或者使用 \u003ca href=\"http://blog.haohtml.com/archives/5530\"\u003ehttp://blog.haohtml.com/archives/5530\u003c/a\u003e 介绍的命令修改\u003c/p\u003e\n\u003cp\u003e2.此时则修改scgi_params文件,找到:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003escgi_param SCGI 1;\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e把它改为:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003escgi_param …\u003c/strong\u003e\u003c/p\u003e"
May 11, 2012
ps和pstree
"\u003cp\u003eps和pstree是用于系统分析的基本命令。ps有3中不同风格的命令选项,UNIX风格、BSD风格和GNU风格。这里我们只介绍UNIX风格选项。\u003c/p\u003e\n\u003cp\u003eps命令可以显示当前运行的进程列表。top命令也可以显示进程信息,但ps可以提供更加详细的内容。使用相应选项可以影响进程显示的数量。ps -A命令可以列出所有进程及其相应的进程ID(PID),当我们使用如pmap或renice等工具时会用到此PID。\u003c/p\u003e\n\u003cp\u003e当系统运行java应用时,ps -A产生的输出结果很容易填满整个显示区域,这导致很难得到所有运行中进程的完整视图。在这种情况下,pstree命令就派上用场了,它使用树状显示所有运行中的进程并合并所有的子进程(例如java线程),pstree命令有助于确认原始进程。还有另一个ps变种pgrep也非常有用。\u003c/p\u003e\n\u003cp\u003e例子2-4:ps输出示例\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2012/05/ps_-a.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2012/05/ps_-a.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e下面我们来了解一些常用的选项\u003c/p\u003e\n\u003cp\u003e-e :所有进程。等同于-A\u003c/p\u003e\n\u003cp\u003e-l :显示长格式\u003c/p\u003e\n\u003cp\u003e-F :附加全格式\u003c/p\u003e\n\u003cp\u003e-H :显示进程的层次结构\u003c/p\u003e\n\u003cp\u003e-L :显示线程,可能出现LWP和NLWP栏位\u003c/p\u003e\n\u003cp\u003e-m :在进程后显示线程\u003c/p\u003e\n\u003cp\u003e下面的命令演示输出进程的详细信息:\u003c/p\u003e\n\u003cp\u003eps -elFL\u003c/p\u003e\n\u003cp\u003e例子2-5: …\u003c/p\u003e"
May 4, 2012
nginx: [warn] the “log_format” directive may be used only on “http” level ...解决办法
"\u003cp\u003e新开了一个vps,装了最新的nginx 1.0.2版本,将原来的虚拟主机配置直接拿过来.用nginx -t 测试语法的时候,发现提示以下警告信息\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[root@centos nginx]# ./sbin/nginx -t\nnginx: [warn] the “log_format” directive may be used only on “http” level in /usr/local/nginx/conf/vhosts/bbs.conf:62\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e解决办法如下:\u003c/p\u003e\n\u003cp\u003e将/usr/local/nginx/conf/nginx.conf 里server段里的下面代码移出放到该server段的前面即可。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003elog_format access ‘$remote_addr – $remote_user [$time_local] “$request” ‘\n‘$status $body_bytes_sent “$http_referer” ‘\n‘”$http_user_agent” $http_x_forwarded_for’;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e如果有其的虚拟主机开启了日志,也按上面的要求移出server段 …\u003c/p\u003e"
April 29, 2012
linux tcpdump命令参数及用法详解–linux下抓包网络分析
"\u003cp\u003e采用命令行方式,它的命令格式为:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003etcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ][ -i 网络接口 ] [ -r 文件名] [ -s snaplen ][ -T 类型 ] [ -w 文件名 ] [表达式 ]\u003c/strong\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e1. tcpdump的选项介绍\u003c/strong\u003e\n-a 将网络地址和广播地址转变成名字;\n-d 将匹配信息包的代码以人们能够理解的汇编格式给出;\n-dd 将匹配信息包的代码以c语言程序段的格式给出;\n-ddd 将匹配信息包的代码以十进制的形式给出;\n-e 在输出行打印出数据链路层的头部信息;\n-f 将外部的Internet地址以数字的形式打印出来;\n-l 使标准输出变为缓冲行形式;\n-n 不把网络地址转换成名字;\n-t 在输出的每一行不打印时间戳;\n-v 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;\n-vv 输出详细的报文信息;\n-c 在收到指定的包的数目后,tcpdump就会停止;\n-F 从指定的文件中读取表达式,忽略其它的表达式;\n-i …\u003c/p\u003e\u003c/blockquote\u003e"
April 7, 2012
perl首次安装Can’t locate CPAN.pm in @INC的解决办法
"\u003cp\u003eperl -MCPAN -e ‘install “模块名称”\u003c/p\u003e\n\u003cp\u003e我在在线安装perl 模块时,发现有这样的问题。应该是说没有安装CPAN这个服务吧。\u003c/p\u003e\n\u003cp\u003e1、执行perl -MCPAN -e shell出错,提示如下:\u003c/p\u003e\n\u003cp\u003e[root@GM ~]# perl -MCPAN -e shell\u003c/p\u003e\n\u003cp\u003eCan’t locate CPAN.pm in @INC (@INC contains:……省略\u003c/p\u003e\n\u003cp\u003e2、到cpan的官方站点下载CPAN模块\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://search.cpan.org/search?query=CPAN\u0026amp;mode=all\"\u003ehttp://search.cpan.org/search?query=CPAN\u0026amp;mode=all\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[root@GM ~]#wget \u003ca href=\"http://cpan.communilink.net/authors/id/A/AN/ANDK/CPAN-1.9600.tar.gz\"\u003ehttp://cpan.communilink.net/authors/id/A/AN/ANDK/CPAN-1.9600.tar.gz\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e3、解压,编绎,安装\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[root@GM ~]# tar -zxvf CPAN-1.9600.tar.gz\n[root@GM ~]#cd CPAN-1.9600\n[root@GM CPAN-1.9600]# perl Makefile.PL\n[root@GM CPAN-1.9600]# make …\u003c/p\u003e\u003c/blockquote\u003e"
April 5, 2012
CentOS下搭建Git服务器Gitosis[教程]
"\u003cp\u003e说明:由于条件有限,我这里使用的是同一台centos的,但教程内容基本上通用。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.编译安装git\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003egit安装教程:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2.安装gitosis\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e$ yum install python python-setuptools\u003c/li\u003e\n\u003cli\u003e$ git clone \u003ca href=\"git://github.com/res0nat0r/gitosis.git\"\u003egit://github.com/res0nat0r/gitosis.git\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e$ cd gitosis\u003c/li\u003e\n\u003cli\u003e$ python setup.py install\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e网址: \u003ca href=\"https://github.com/res0nat0r/gitosis\"\u003ehttps://github.com/res0nat0r/gitosis\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3.在开发机器上生成公共密钥(用来初始化gitosis)\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e$ ssh-keygen -t rsa #不需要密码,一路回车就行(在本地操作)\u003c/li\u003e\n\u003cli\u003e$ scp ~/.ssh/id_rsa.pub root@xxx:/tmp/ # 上传你的ssh public key到服务器\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003e4.初始化gitosis[服务器端]\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e$ adduser git # 新增一个git用户(先添加用户组 groupadd git)\u003c/li\u003e\n\u003cli\u003e$ su git # 切换倒git用户下\u003c/li\u003e\n\u003cli\u003e$ gitosis-init \u0026lt; …\u003c/li\u003e\u003c/ol\u003e"
March 25, 2012
nginx 的限制连接模块limit_zone与limit_req_zone
"\u003cp\u003enginx 上有两个限制连接的模块一个是 limit_zone 另一个是 limie_req_zone,两个都可以限制连接,但具体有什么不同呢?\n下面是 nginx 官网上给的解释\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003elimit_req_zone\nLimit frequency of connections from a client.\nThis module allows you to limit the number of requests for a given session, or as a special case, with one address.\nRestriction done using leaky bucket.\u003c/p\u003e\n\u003cp\u003elimit_zone\nLimit simultaneous connections from a client.\nThis module makes it possible to limit the number of simultaneous connections for the assigned session or as a special case, from one …\u003c/p\u003e\u003c/blockquote\u003e"
February 5, 2012
在安装php的make时候,出现错误”chmod: cannot access `ext/phar/phar.phar’: No such file or directory”的解决办法
"\u003cp\u003e在对php进行configure的时候,只需要在./configure的后面加上–without-pear 即可.\u003c/p\u003e"
February 5, 2012
编译php出错:error while loading shared libraries: libmysqlclient.so.18: cannot open shared object f
"\u003cp\u003e近日在编译php,make的时候出错:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/root/dev/php-5.3.6/sapi/cli/php: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory\nmake: *** [ext/phar/phar.php] Error 127\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e===================================================\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e网上找到的解决办法是:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib/\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e照做后仍然报错,原因是该方法适用于32位系统,64位系统应使用下面的这行\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib64/\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e另外:在编译的时候,不写mysql的路径,而使用mysqlnd代替,也可解决该问题的出现。\u003c/p\u003e"
February 5, 2012
[教程]CentOS下安装lnmp教程(最新版2012-02-05)
"\u003cp\u003e2013-01-25 更新的安装shell脚本,这里使用的是nginx1.2.6。 \u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2012/02/sh.txt\"\u003e点击查看shell安装脚本\u003c/a\u003e,\u003cstrong\u003e测试环境:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eCentos 6.3 X86_64\nPHP 5.3.10\nNginx-1.2.6\nmemcached-1.4.15.tar.gz\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e以下教程参考上次写的lnmp安装教程整理的,部分细节由于软件版本的变更也同时进行了增加和修改.\u003c/p\u003e\n\u003cp\u003e以下基于x64位操作系统(64位操作系统,64位cpu).查看方法参考: \u003ca href=\"http://blog.haohtml.com/archives/11093\"\u003ehttp://blog.haohtml.com/archives/11093\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e安装环境及软件:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eCentos6.1 X86_64\nmysql-5.5.22-linux2.6-x86_64.tar.gz\n\u003ca href=\"http://cn2.php.net/distributions/php-5.3.10.tar.gz\"\u003ephp-5.3.10.tar.gz\u003c/a\u003e \u003ca href=\"http://nginx.org/download/nginx-1.0.11.tar.gz\"\u003enginx-1.2.0.tar.gz\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e以上软件全部为截止当前日期 2012-2-5 为止最新稳定版的软件.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e前期准备工作\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e一.安装常用命令\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eyum -y install wget make zip unzip \u003ca href=\"http://blog.haohtml.com/archives/5980\"\u003epatch\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e//有些命令可能以前安装过.这里就不需要重新安装了,不确定的话,再安装一次也没有关系的,系统会自动跳过安装过 …\u003c/p\u003e"
January 29, 2012
centos升级内核教程
"\u003cp\u003e当前系统为CentOS Linux release 6.0 (Final),内核版本为2.6.32-71.el6.i686.由于最近内核出现最新的漏洞(\u003ca href=\"http://bbs.chinaunix.net/thread-3666212-1-1.html\"\u003elinux kernel 又爆内存提权漏洞,\u0026gt;=2.6.39 内核无一幸免\u003c/a\u003e{#thread_subject} 和),所以将内核升级至3.2.2最新版本.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.查看当前系统内核\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[root@bogon linux-3.2.2]# uname -r\n2.6.32-71.el6.i686\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e2.下载linux-3.2.2内核包\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecd ~\nwget -c http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.2.2.tar.bz2\ntar jxvf linux-3.2.2.tar.bz2\ncd linux-3.2.2\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e3.配置内核并安装\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emake mrproper #清除环境变量,即清除配置文件\nmake menuconfig #在菜单模式下选择需要编译的内核模块\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e找到以下选项并选中\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003enetworking support—\u0026gt;networking …\u003c/p\u003e"
January 29, 2012
Linux中各种文件系统基本特性ext2,ext3,ext4
"\u003cp\u003e\u003cstrong\u003e各种文件系统基本特性\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eExt2\u003c/strong\u003eExt2 文件系统是Linux 特有的文件系统,它拥有传统UNIX 文件系统的许多特性,如块、inode\u003c/p\u003e\n\u003cp\u003e和目录等概念。Ext2 非常健壮,具有很多优良的性能。同时,Ext2 也是可扩展的,它提供\u003c/p\u003e\n\u003cp\u003e的扩展功能允许用户在不格式化文件系统的情况下使用新的特性。\u003c/p\u003e\n\u003cp\u003e—————————————————-\u003c/p\u003e\n\u003cp\u003e最大文件大小: 1TB\u003c/p\u003e\n\u003cp\u003e最大文件极限: 仅受文件系统大小限制\u003c/p\u003e\n\u003cp\u003e最大分区/文件系统大小: 4TB\u003c/p\u003e\n\u003cp\u003e最大文件名长度: 255 字符\u003c/p\u003e\n\u003cp\u003e缺省最小/最大块大小: 1024/4096 字节\u003c/p\u003e\n\u003cp\u003e缺省inode 分配: 每4096 字节为1\u003c/p\u003e\n\u003cp\u003e在强制FS 检查前的最大装载: 20(可配置)\u003c/p\u003e\n\u003cp\u003e—————————————————-\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eExt3\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eExt3 文件系统构筑于ext2 文件系统之上,对标准的Linux ext2 文件系统进行了日志扩展。\u003c/p\u003e\n\u003cp\u003e日志特性显著地减少文件系统崩溃后的恢复时间,它被广泛地应用于带有共享磁盘的HA 站\u003c/p\u003e\n\u003cp\u003e点。\u003c/p\u003e\n\u003cp\u003e—————————————————-\u003c/p\u003e\n\u003cp\u003e最大文件大小: 1TB\u003c/p\u003e\n\u003cp\u003e最大文件极限: 仅受文件系统大小限制\u003c/p\u003e\n\u003cp\u003e最大分区/文件系统大小: 4TB\u003c/p\u003e\n\u003cp\u003e最大文件名长度: 255 …\u003c/p\u003e"
January 11, 2012
lsof命令详解
"\u003cp\u003e卸载移动存储时经常提示device busy,也可能误删了一个正在打开的文件。。。。\n这时候可以试试lsof\u003c/p\u003e\n\u003cp\u003e**lsof简介 **\u003c/p\u003e\n\u003cp\u003e****lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。\u003c/p\u003e\n\u003cp\u003e**lsof使用 **\u003c/p\u003e\n\u003cp\u003e****lsof输出信息含义\n在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eCOMMAND PID USER FD TYPE DEVICE SIZE …\u003c/p\u003e\u003c/blockquote\u003e"
January 11, 2012
在FreeBSD系统中用pkill命令踢出SSH在线登录用户
"\u003cp\u003eFreeBSD是一个多用户多任务的操作系统,用户可以在不同地方通过ssh连上FreeBSD服务器,在系统中我们可以使用w命令来查看当前在线登录用户。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[root@host01 ~]# w\u003c/p\u003e\n\u003cp\u003e03:05:23 up 19 min, 3 users, load average: 0.00, 0.03, 0.05\nUSER TTY FROM LOGIN@ IDLE WHAT\nroot \u003cstrong\u003ep0\u003c/strong\u003e 192.168.0.2 01:39 6:52 /usr/bin/perl\nroot \u003cstrong\u003ep1\u003c/strong\u003e 192.168.0.31 01:45 0.00s w\nroot \u003cstrong\u003ep2\u003c/strong\u003e 192.168.0.23 01:52 2.00s -bash\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e看到了吧,已经有3个用户登录到服务器了。接下来使用who am i 看那个是自己的登录终端,下面自己是pts/1\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[root@host01 ~]# who am i\nroot\u003cstrong\u003ep1\u003c/strong\u003e 2009-08-02 03:06 (192.168.0.31)\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e接下来使用pkill命令将要其它的用户踢出,这里为p0和p2。\u003c/p\u003e\n\u003cp\u003e[root@host01 ~]# \u003cstrong\u003epkill -kill -t p2\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e再使 …\u003c/p\u003e"
January 11, 2012
VSFTP中”Fixing 500 OOPS: vsftpd: refusing to run with writable root inside chroot ()”的解决办法!
"\u003cp\u003e今天在参考以前写的在FreeBSD下配置vsftpd教程的时候.发现以下错误:\u003c/p\u003e\n\u003cp\u003eAfter upgrading vsftpd to 2.3.5 you may be getting the following message when trying to log in.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e500 OOPS: vsftpd: refusing to run with writable root inside chroot ()\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eThis is due to the following update:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e– Add stronger checks for the configuration error of running with a writeable\nroot directory inside a chroot(). This may bite people who carelessly turned\non chroot_local_user but such is life.\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eThe problem is that your users root directory is writable(用户根 …\u003c/p\u003e"
January 7, 2012
FreeBSD启动出现”My unqualified host name unkown…Sleeping for retry”的解决办法
"\u003cp\u003e最简单的方法是把/etc/rc.conf里的hostname改成”localhost”。即\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ehostname=”localhost”\u003c/p\u003e\u003c/blockquote\u003e"
December 28, 2011
如何安装nginx的第三方模块
"\u003cp\u003e昨天晚上一口气将agentzh写的” \u003ca href=\"http://blog.sina.com.cn/s/blog_6d579ff40100xm7t.html\"\u003eNginx变量漫谈1-8\u003c/a\u003e“看完了.于是手动测试一下这些第三方模块.\u003c/p\u003e\n\u003cp\u003e这里以HttpEchoModule模块为例.\u003c/p\u003e\n\u003cp\u003e由于以前安装过nginx,所以这里重新configure一下.并且指定新添加的模块路径.使用–add-module=/path/to/module_name指令.可以参考:\u003c/p\u003e\n\u003cp\u003e这里只指定了一个HttpEchoModule这个模块.模块下载地址见:,如果有多个模块的话,只需要多次使用-add-module指令即可.\u003c/p\u003e\n\u003cp\u003e先下载HttpEchoModule模块\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecd /usr/src/soft/nginx-1.1.1/\nmkdir module\ncd module\nwget \u0026#34;https://github.com/agentzh/echo-nginx-module/tarball/v0.37rc7\u0026#34;\ntar zxvf v0.37rc7\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e重新配置加入第三方模块\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecd /usr/src/soft/nginx-1.1.1\n./configure --user=www --group=www …\u003c/code\u003e\u003c/pre\u003e"
December 23, 2011
详解LUA开发环境配置
"\u003cp\u003e这里系统为centos6.2 的64系统.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#wget http://www.lua.org/ftp/lua-5.2.0.tar.gz\n# tar zxvf lua-5.2.0.tar.gz\n# cd lua-5.2.0\n# make\nPlease do \u0026#39;make PLATFORM\u0026#39; where PLATFORM is one of these:\naix ansi bsd freebsd generic linux macosx mingw posix solaris\nSee doc/readme.html for complete instructions.\n# make generic\n# make install\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e至此lua环境已经配置成功.下面我们测试一下,直接输入lua命令:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# lua\nLua 5.2.0 Copyright (C) 1994-2011 Lua.org, PUC-Rio\n\u0026gt; print(\u0026#34;Hello Lua\u0026#34;)\nHello Lua\n\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e每个语句结尾的分号(;)是可选的,但如果同一行有多个语句最好用.\u003c/p\u003e\n\u003cp\u003e你键入的每个 …\u003c/p\u003e"
December 14, 2011
ubuntu下pdf阅读器安装
"\u003cp\u003e在ubuntu下打开windows系统下的pdf文件,无法正常显示,只有乱码。\u003c/p\u003e\n\u003cp\u003e于是安装pdf阅读器,可直接在终端命令行输入如下命令:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003esudo apt-get install xpdf-chinese-simplified xpdf-chinese-traditional\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e就可以了。\u003c/p\u003e"
December 14, 2011
Ubuntu安装Fcitx(小企鹅五笔输入法)
"\u003cp\u003eUbuntu自带的输入法不太尽如人意思,用起来也不方便,我在Ubuntu和FC中都是用Fcitx,很好用!\u003c/p\u003e\n\u003cp\u003e安装配置如下:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1. 安装 fcitx\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003esudo apt-get install fcitx\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2. 配置默认输入法为 fcitx\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eim-switch -s fcitx // 注意无须加 sudo\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3. 重启 x-window\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e重启之后,fcitx 输入法应当正常启动,输入条将显示在屏幕最上面,不过输入框中文显示可能是 “口口”,需要小小的改动。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e4. 修改配置文件\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003egedit ~/.fcitx/config\u003c/p\u003e\n\u003cp\u003e//如果没有配置gedit 支持GB18030编码,打开后文件会是乱码(此处针对9.10前版本,9.10无需配置已支持)\u003c/p\u003e\n\u003cp\u003e修改如下几项:\u003c/p\u003e\n\u003cp\u003e显示字体(中)=YaHei Consolas Hybrid //\u003cstrong\u003e主要是看你的OpenOffice中有什么字体,加进来就行\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003eEnter键行为=1 # =1表示回车时清除输入框中输入的内容,随个人喜好设置\u003c/p\u003e\n\u003cp\u003e上一页=, # 使用 , . 翻页,随个人喜好设置\u003c/p\u003e\n\u003cp\u003e下一页=.\u003c/p\u003e\n\u003cp\u003e[输入法]\u003c/p\u003e\n\u003cp\u003e使用拼音=0\u003c/p\u003e\n\u003cp\u003e拼音名称=智能拼音\u003c/p\u003e\n\u003cp\u003e使用双拼=0\u003c/p\u003e\n\u003cp\u003e双拼名 …\u003c/p\u003e"
December 12, 2011
CentOS 6.0 VNC远程桌面配置
"\u003ch1 id=\"比如你的桌面号为10000则vnc的连接端口号为59001000015900\"\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/12/vnc_server.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/12/vnc_server.jpg\" alt=\"\"\u003e\u003c/a\u003e\n\u003cstrong\u003e引言:\u003c/strong\u003e\n必须明白:\nvncserver在调用的时候,会根据你的配置来启用server端的监听端口,\n端口默认是从5900开始,再加上你的桌面号。\n比如你的桌面号为1,则vnc的连接端口号为5900+1=5901\n比如你的桌面号为10000,则vnc的连接端口号为5900+10000=15900\u003c/h1\u003e\n\u003cp\u003e下面配置VNC服务器,使用户(root)能够通过vnc客户端远程连接到linux系统的图形界面(前提是你的服务器要安装桌面)\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1、检查linux系统是否安装VNC\u003c/strong\u003e\n在终端窗口输入命令:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003erpm -q vnc-server\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e返回信息如下\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003epackage vnc-server is not installed\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e说明vnc服务器没有安装\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2、运行以下命令进行安装:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e****yum install vnc vnc-server\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e3、启动VNC服务\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e****vncserver\nYou will require a password to access your desktops.\nPassword:\nVerify:\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e会提示输入密码,这个密码是远程登录时所需要输入的密码,输入密码,回车\n**4、切 …\u003c/p\u003e"
December 12, 2011
Centos64位系统下”configure: error: libjpeg.(a|so) not found”的解决办法
"\u003cp\u003e刚刚发布了Centos6.1新版本.就下载了64位的版本进行测试.\u003c/p\u003e\n\u003cp\u003e按照原来的lnmp安装教程.在安装php的过程中.执行到./configure 这一步的时候.竟然提示”configure: error: libjpeg.(a|so) not found”这项错误.明明已经安装过了libjpeg 和libjpeg-devel了.可这里仍然提示找不到库文件.很明显是路径的问题.默认会在/usr/lib/目录里查找相应的文件.但用whereis libjpeg发现.libjpeg被安装在了/usr/lib64/目录里.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[root@bogon php-5.2.17]# whereis libjpeg\nlibjpeg: /usr/lib/libjpeg.so /usr/lib64/libjpeg.so\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e1.如果提示”configure: error: libjpeg.(a|so) not found”错误\u003c/p\u003e\n\u003cp\u003e所以这里我们需要复制一份libjpeg.so到/usr/lib/目录里才可以.再次执行./configure命令即可.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecp -frp /usr/lib64/libjpeg.* …\u003c/code\u003e\u003c/pre\u003e"
December 10, 2011
FreeBSD/Linux下安装cacti的memcached的监控插件
"\u003cp\u003e因为python的模板使用了python来获取数据,所以需要安装python环境以及python的memcached客户端\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.安装ez_setup工具\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewget -q \u003ca href=\"http://peak.telecommunity.com/dist/ez_setup.py\"\u003ehttp://peak.telecommunity.com/dist/ez_setup.py\u003c/a\u003e\npython ez_setup.py\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e2.安装python的memcached客户端\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewget \u003ca href=\"ftp://ftp.tummy.com/pub/python-memcached/python-memcached-1.45.tar.gz\"\u003eftp://ftp.tummy.com/pub/python-memcached/python-memcached-1.45.tar.gz\u003c/a\u003e\ntar -zxvf python-memcached-1.45.tar.gz\ncd python-memcached-1.45\npython setup.py install\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e3.下载cacti的memcached模板\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewget \u003ca href=\"http://content.dealnews.com/dealnews/developers/cacti-memcached-1.0.tar.gz\"\u003ehttp://content.dealnews.com/dealnews/developers/cacti-memcached-1.0.tar.gz\u003c/a\u003e\ntar -zxvf cacti-memcached-1.0.tar.gz\ncd cacti-memcached …\u003c/p\u003e\u003c/blockquote\u003e"
December 7, 2011
rpm 常用命令
"\u003cp\u003erpm 常用命令\n1.安装一个包\n# rpm -ivh\u003c/p\u003e\n\u003cp\u003e2.升级一个包\n# rpm -Uvh\u003c/p\u003e\n\u003cp\u003e3.移走一个包\n# rpm -e\u003c/p\u003e\n\u003cp\u003e4.安装参数\n–force 即使覆盖属于其它包的文件也强迫安装\n–nodeps 如果该RPM包的安装依赖其它包,即使其它包没装,也强迫安装。\u003c/p\u003e\n\u003cp\u003e5.查询一个包是否被安装\n# rpm -q \u0026lt; rpm package name\u0026gt;\u003c/p\u003e\n\u003cp\u003e6.得到被安装的包的信息\n# rpm -qi \u0026lt; rpm package name\u0026gt;\u003c/p\u003e\n\u003cp\u003e7.列出该包中有哪些文件\n# rpm -ql \u0026lt; rpm package name\u0026gt;\u003c/p\u003e\n\u003cp\u003e8.列出服务器上的一个文件属于哪一个RPM包\n#rpm -qf\u003c/p\u003e\n\u003cp\u003e9.可综合好几个参数一起用\n# rpm -qil \u0026lt; rpm package name\u0026gt;\u003c/p\u003e\n\u003cp\u003e10.列出所有被安装的rpm package\n# rpm -qa\u003c/p\u003e\n\u003cp\u003e11.列出一个未被安装进系统的RPM包文件中包含有哪些文件?\n# rpm -qilp \u0026lt; rpm package name\u0026gt;\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e\u0026lt;\u0026gt;\u003c/strong\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cstrong\u003e一、安装\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e命令格式:\u003c/p\u003e"
November 29, 2011
magent编译及常见错误解决办法
"\u003cp\u003e# 编译magent\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ecd /home/lnmp/src\nmkdir magent\ncd magent/\nwget \u003ca href=\"http://memagent.googlecode.com/files/magent-0.5.tar.gz\"\u003ehttp://memagent.googlecode.com/files/magent-0.5.tar.gz\u003c/a\u003e\ntar zxvf magent-0.5.tar.gz\n/sbin/ldconfig \u0026amp;\u0026amp; sed -i “s#LIBS = -levent#LIBS = -levent -lm#g” Makefile\nmake\nmkdir -p /usr/local/webserver/magent/bin\ncp magent /usr/local/webserver/magent/bin/magent\ncd ../\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e错误1:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003egcc -lrt -Wall -g -O2 -I/usr/local/include -m64 -c -o magent.o magent.c\nmagent.c: In function ‘writev_list’:\nmagent.c:729: error: ‘SSIZE_MAX’ undeclared (first use in …\u003c/p\u003e\u003c/blockquote\u003e"
November 29, 2011
Memcached代理软件 magent
"\u003cp\u003emagent是一款开源的Memcached代理服务器软件。\n\u003cstrong\u003e命令参数:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e-h this message\n-u uid\n-g gid\n-p port, default is 11211. (0 to disable tcp support)\n-s ip:port, set memcached server ip and port\n-b ip:port, set backup memcached server ip and port\n-l ip, local bind ip address, default is 0.0.0.0\n-n number, set max connections, default is 4096\n-D don\u0026#39;t go to background\n-k use ketama key allocation algorithm\n-f file, unix socket path to listen on. default is off\n-i number, max keep alive connections for one memcached …\u003c/code\u003e\u003c/pre\u003e"
November 18, 2011
linux下varnish配置及使用教程
"\u003cp\u003ecentos6.0 32位\nVarnish3.0.2\u003c/p\u003e\n\u003cp\u003e我们先配置nginx环境.参考教程:http://blog.haohtml.com/archives/6051\n并修改nginx的监听端口为81.下面我们varnish监听的端口为80端口.\u003c/p\u003e\n\u003cp\u003e==============================================================\n目前varnish的最新版本为3.0.2,这里我们使用最新的稳定版本\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecd /usr/local/soft\nwget http://repo.varnish-cache.org/source/varnish-3.0.2.tar.gz\ntar zxvf varnish-3.0.2.tar.gz\ncd varnish-3.0.2\n./configure --prefix=/usr/local/varnish\nmake \u0026amp;\u0026amp; make install\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e如果在执行./configure命令的过程中遇到”No package ‘libpcre’ found”的错误提示信息的话,需要执行以下命令\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eexport …\u003c/code\u003e\u003c/pre\u003e"
November 15, 2011
LVM基本介绍与常用命令
"\u003cp\u003e\u003cstrong\u003e一、LVM介绍\u003c/strong\u003e\nLVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制\nLVM – 优点:\nLVM通常用于装备大量磁盘的系统,但它同样适于仅有一、两块硬盘的小系统。\u003c/p\u003e\n\u003cp\u003e小系统使用LVM的益处:\u003c/p\u003e\n\u003cp\u003e传统的文件系统是基于分区的,一个文件系统对应一个分区。这种方式比较直观,但不易改变:\u003c/p\u003e\n\u003cp\u003e1.不同的分区相对独立,无相互联系,各分区空间很易利用不平衡,空间不能充分利用;\u003c/p\u003e\n\u003cp\u003e2.当一个文件系统/分区已满时,无法对其扩充,只能采用重新分区/建立文件系统,非常麻烦;或把分区中的数据移到另一个更\u003c/p\u003e\n\u003cp\u003e大的分区中;或采用符号连接的方式使用其它分区的空间。\u003c/p\u003e\n\u003cp\u003e3.如果要把硬盘上的多个分区合并在一起使用,只能采用再分区的方式,这个过程需要数据的备份与恢复。\u003c/p\u003e\n\u003cp\u003e当采用LVM时,情况有所不同:\u003c/p\u003e\n\u003cp\u003e1.硬盘的多个分区由LVM统一为卷组管理,可以方便的加入或移走分区以扩大或减小卷组的可用容量,充分利用硬盘空间;\u003c/p\u003e\n\u003cp\u003e2.文件系统建立在逻辑卷上,而逻辑卷可根据需要改变大小(在卷组容量范围内)以满足要求;\u003c/p\u003e\n\u003cp\u003e3.文件系统建立在LVM上,可以跨分区,方便使用;\u003c/p\u003e\n\u003cp\u003e大系统使 …\u003c/p\u003e"
November 6, 2011
php5.3不支持ZendOptimizer的解决办法(Zend Guard Loader)
"\u003cp\u003e[ \u003cstrong\u003e2013-04-04]好像ZendGuard-5_5_0版本找不到这个dll文件的\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ePHP 5.3 下,Zend Optimizer 已经被全新的 \u003cstrong\u003eZend Guard Loader\u003c/strong\u003e 取代\u003c/p\u003e\n\u003cp\u003e已经Zend Optimer的代替品为 Opcache,请参考: \u003ca href=\"http://blog.haohtml.com/archives/14071\"\u003ehttp://blog.haohtml.com/archives/14071\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e————————————————\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e下载 Zend Guard Loader 压缩包。(官方下载地址: \u003ca href=\"http://www.zend.com/en/products/guard/downloads\"\u003ehttp://www.zend.com/en/products/guard/downloads\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e解压并提取 ZendGuardLoader.so(Linux)或 ZendLoader.dll(Windows),对应你的PHP版本。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e在你的 php.ini 文件添加下面一行,用来加载 Zend Guard Loader:\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e**Linux 和 Mac OS X: **zend_extension = 完整路径/ZendGuardLoader.so\n\u003cstrong\u003eWindows(非线程安全):\u003c/strong\u003e zend_extension = 完整路 …\u003c/p\u003e"
November 1, 2011
freeBSD挂载光驱
"\u003cp\u003e挂接光驱\nmount -t cd9660 /dev/acd0 /cdrom\n卸载光驱\numount -f /cdrom\n挂接USB\nmount -t msdos /dev/da0s1 /mnt/usb\n卸载USB\numount /dev/da0s1\u003c/p\u003e"
October 31, 2011
Freebsd解决ARP欺骗问题
"\u003cp\u003e\u003cstrong\u003e1.不安装软件的方法。\u003c/strong\u003e\n首先要重启,确保你拿到的网关地址是正确的。\n步骤如下:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eifconfig\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e显示类似如下内容\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ebge0: flags=8843 mtu 1500\noptions=1b\ninet 192.168.0.5 netmask 0xffffffc0 broadcast 192.168.0.1\nether 00:17:08:2a:13:88\nmedia: Ethernet autoselect (100baseTX )\nstatus: active\nplip0: flags=108810 mtu 1500\nlo0: flags=8049 mtu 16384\ninet 127.0.0.1 netmask 0xff000000\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e我们把网关的信息存到一个文件里。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eecho 192.168.0.1 00:17:08:2a:13:88 \u0026gt; /etc/ipmac\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e接着使用crontab -e编辑系统定时排程(计划任务)让它按照设定时间循环执行\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e*/5 * * * * /usr/sbin/arp -f /etc/ipmac\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这样就每5分钟更新一次网关MAC地址,保证正确。\u003c/p\u003e\n\u003cp\u003e注 …\u003c/p\u003e"
October 20, 2011
dd 命令用来测试硬盘读写速度(转)
"\u003cp\u003edd 是 Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1. 命令简介\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003edd 的主要选项:\n指定数字的地方若以下列字符结尾乘以相应的数字:\nb=512, c=1, k=1024, w=2, xm=number m\u003c/p\u003e\n\u003cp\u003eif=file\n输入文件名,缺省为标准输入。\u003c/p\u003e\n\u003cp\u003eof=file\n输出文件名,缺省为标准输出。\u003c/p\u003e\n\u003cp\u003eibs=bytes\n一次读入 bytes 个字节(即一个块大小为 bytes 个字节)。\u003c/p\u003e\n\u003cp\u003eobs=bytes\n一次写 bytes 个字节(即一个块大小为 bytes 个字节)。\u003c/p\u003e\n\u003cp\u003ebs=bytes\n同时设置读写块的大小为 bytes ,可代替 ibs 和 obs 。\u003c/p\u003e\n\u003cp\u003ecbs=bytes\n一次转换 bytes 个字节,即转换缓冲区大小。\u003c/p\u003e\n\u003cp\u003eskip=blocks\n从输入文件开头跳过 blocks 个块后再开始复制。\u003c/p\u003e\n\u003cp\u003eseek=blocks\n从输出文件开头跳过 blocks 个块后再开始复制。(通常只有当输出文件是磁盘或磁带时才有效)。\u003c/p\u003e\n\u003cp\u003ecount=blocks\n仅拷贝 blocks 个块,块大小等于 ibs 指定的字节数。 …\u003c/p\u003e"
October 20, 2011
FreeBSD/Linux检测硬盘坏道
"\u003cp\u003e\u003cstrong\u003eLinux检测硬盘坏道\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ebadblocks\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e功能说明:检查磁盘装置中损坏的区块。\u003c/p\u003e\n\u003cp\u003e语法:badblocks [-svw][-b ][-o ][磁盘装置][磁盘区块数][启始区块]\u003c/p\u003e\n\u003cp\u003e补充说明:执行指令时须指定所要检查的磁盘装置,及此装置的磁盘区块数。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e参数:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e-b 指定磁盘的区块大小,单位为字节。\u003c/p\u003e\n\u003cp\u003e-o 将检查的结果写入指定的输出文件。\u003c/p\u003e\n\u003cp\u003e-s 在检查时显示进度。\u003c/p\u003e\n\u003cp\u003e-v 执行时显示详细的信息。\u003c/p\u003e\n\u003cp\u003e-w 在检查时,执行写入测试。\u003c/p\u003e\n\u003cp\u003e[磁盘装置] 指定要检查的磁盘装置。\u003c/p\u003e\n\u003cp\u003e[磁盘区块数] 指定磁盘装置的区块总数。\u003c/p\u003e\n\u003cp\u003e[启始区块] 指定要从哪个区块开始检查。\u003c/p\u003e\n\u003cp\u003ebadblocks 检测磁盘坏块\u003c/p\u003e\n\u003cp\u003e1)$badblocks -s //显示进度 -v //显示执行详细情况 /dev/sda1\u003c/p\u003e\n\u003cp\u003e2)读写方式检测 未挂载的磁盘设备或分区\u003c/p\u003e\n\u003cp\u003e$badblocks -s //显示进度 -w //以写去检测 -v //显示执行详细情况 /dev/sda2\u003c/p\u003e\n\u003cp\u003e=========================\u003cstrong\u003eFreeBSD检测硬盘坏道\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e利用硬盘的S.M.A.R.T.功能来做。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ecd …\u003c/p\u003e\u003c/blockquote\u003e"
October 20, 2011
FreeBSD下的fsck命令
"\u003cp\u003e对文件系统进行检查,并对损害的文件系统进行修复。\n\u003cstrong\u003efsck的语法如下:\u003c/strong\u003e\nfsck (-F fstype) (-v) (-m) (-special…)\nfsck (-F fstype) (-v) (-y|Y|n|N)\n(-o fstype options) (special…)\n其中:\n-F fstype : 说明被检查的文件系统的类型\n-v : 返回完成的命令行,但不运行\n-y|Y: 对所有问题均回答Yes\n-n|N: 对所有问题均回答No\n-m: 对文件系统进行检查,不修复文件系统,\n如果文件系统经检查后是可安装的,则显示\nufs fsck : sanity check : /dev/rdsk/c0t0d0s0 okay.\n-o: 文件系统类型选项,选项由逗号分隔,\u003c/p\u003e\n\u003cp\u003e**最常用的选项有两个: **\nP: 整理(preen)模式\nF: 强制检查模式,此选项忽略文件系统状态标志。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e移去一个没有相关文件的目录入口 答Yes或Y来删除该目录入口\u003c/li\u003e\n\u003cli\u003e重连接一个已分配但不能访问的文件\n对fsck的”RECONNECT?”回答Yes,即把该I节点连接到lost+found目录下,文件名即是I …\u003c/li\u003e\u003c/ol\u003e"
October 19, 2011
FreeBSD如何查看当前网络带宽占用情况?默认值CPU 硬盘IO 虚拟内存命令
"\u003cp\u003esystat 能实时查看各种信息\nsystat -pigs 默认值CPU\nsystat -iostat 硬盘IO\nsystat -swap 交换分区\nsystat -mbufs 网络缓冲区\nsystat -vmstat 虚拟内存\nsystat -netstat 网络\nsystat -icmp ICMP协议\nsystat -ip IP协议\nsystat -tcp TCP协议\nsystat -ifstat 网卡\u003c/p\u003e\n\u003cp\u003e显示PCI总线设备信息\npciconf -lv\n显示内核加载的模块\nkldstat -v\n显示指定模块\nklsdstat -m ipfilter\u003c/p\u003e\n\u003cp\u003e即插即用设备\npnpinfo\u003c/p\u003e\n\u003cp\u003e显示设备占用的IRQ和内存地址\ndevinfo -u\u003c/p\u003e\n\u003cp\u003ecpu\nsysctl -a|grep cpu\nsysctl -a|grep sched 查看使用的调度器,我编译的是ULE\u003c/p\u003e\n\u003cp\u003e虚拟内存\nvmstat\u003c/p\u003e\n\u003cp\u003e硬盘\ngstat\nsystat -iostat\niostat\u003c/p\u003e\n\u003cp\u003e网卡\nifconfig\nsystat -ifstat\u003c/p\u003e\n\u003cp\u003e网络\nnetstat\nsockstat\ntcpdump\ntrafshow\nsystat …\u003c/p\u003e"
October 18, 2011
Linux性能测试工具Lmbench介绍和使用说明
"\u003cp\u003eLinux性能测试工具Lmbench是一套简易可移植的,符合ANSI/C标准为UNIX/POSIX而制定的微型测评工具。一般来说,它衡量两个关键特征:反应时间和带宽。Lmbench旨在使系统开发者深入了解关键操作的基础成本。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1、Lmbench的使用与介绍\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eLinux性能测试工具Lmbench是一套简易可移植的,符合ANSI/C标准为UNIX/POSIX而制定的微型测评工具。一般来说,它衡量两个关键特征:反应时间和带宽。Lmbench旨在使系统开发者深入了解关键操作的基础成本。其官方网站是:http://www.bitmover.com/lmbench/。\n\u003cstrong\u003e2、Lmbench主要功能\u003c/strong\u003e\n带宽测评工具反应时间测评工具其他读取缓存文件\n拷贝内存\n读内存\n写内存\n管道\nTCP上下文切换\n网络:连接的建立,管道,TCP,UDP和RPChotpotato\n文件系统的建立和删除\n进程创建\n信号处理\n上层的系统调用\n内存读入反应时间处理器时钟比率计算\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3、Linux性能测试工具Lmbench主要特性\u003c/strong\u003e\na)对于操作系统的可移植性测试:评测工具是由C语言编写的,具有较好的可移植性(尽管它们更易于被GCC编 …\u003c/p\u003e"
October 17, 2011
如何更改windows的远程桌面3389端口
"\u003cp\u003e共修改两个地方\u003c/p\u003e\n\u003cp\u003e1:打开“开始→运行”,输入“regedit”,打开注册表,进入以下路径:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\Wds\\rdpwd\\Tds\\tcp]\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e看见PortNamber值了吗?其默认值是3389,修改成所希望的端口即可,例如6111。\n2:再打开\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentContro1Set\\Control\\Tenninal Server\\WinStations\\RDP-Tcp]\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e将PortNumber的值(默认是3389)修改成端口6111。\u003c/p\u003e\n\u003cp\u003e此修改只有重启服务器才可以生效.\u003c/p\u003e"
October 17, 2011
FreeBSD下查看物理内存大小
"\u003cp\u003e\u003cstrong\u003e法一:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[root@www ~]# cat /var/run/dmesg.boot | grep memory\nreal memory = 2147483648 (2048 MB)\navail memory = 2091028480 (1994 MB)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e法二:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[root@www ~]# sysctl -a | grep hw.physmem\nhw.physmem: 2134253568\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e第二个命令和第一个命令有些差别,这个基本上可以忽略.换成MB的话,基本上也是2G的\u003c/p\u003e"
October 13, 2011
CentOS 5下Memcached安装
"\u003cp\u003e参考前面的教程:安装了lnmp环境,这里要安装memcached.但在编译的时候提示需要指定libevent库,可是在安装lnmp的候默认是已经安装过的.解决办法如下:\u003c/p\u003e\n\u003cp\u003ememcached需要libevent支持,所以首先安装libevent\u003c/p\u003e\n\u003cp\u003e查看系统是否已经安装libevent\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# rpm -qa|grep libevent\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e如果有,不要高兴,先升级\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#yum -y install libevent libevent-devel\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e测试libevent是不是已经安装成功\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#ls -al /usr/lib | grep libevent\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e可以看到多个已经安装的类包 \u003cstrong\u003e安装memcached( \u003ca href=\"http://memcached.org/\"\u003ehttp://memcached.org/\u003c/a\u003e)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e可以先查看编译参数\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[shell]wget http://memcached.googlecode.com/files/memcached-1.4.15.tar.gz\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003etar zxvf memcached-1.4.15.tar.gz\u003c/p\u003e\n\u003cp\u003ecd memcached-1.4.15\u003c/p\u003e\n\u003cp\u003e./configure –help\u003c/p\u003e\n\u003cp\u003e./configure …\u003c/p\u003e"
October 9, 2011
device 0 has different MAC address than expected 的解决办法
"\u003cp\u003e今天克隆了一份vm(centos),发现重启网卡的时候提示”device 0 has different MAC address than expected…”之类的错误,手动修改mac地址也不行.后来找到一种解决办法如下:\u003c/p\u003e\n\u003cp\u003e删除 HWADDR 一行,然后执行ifconfig和service network restart命令.然后用ifconfig命令查看就会发现已经可以正常使用了.\u003c/p\u003e\n\u003cp\u003e不过在eth0文件里HWADDR这一行系统并没有自动添加上的.\u003c/p\u003e"
September 29, 2011
CentOS5.5关闭sendmail服务【开机此处太慢】
"\u003cp\u003esendmail服务在系统启用的时候特别的慢,平时用的也不多的,所以为了安全直接将此服务关闭.并加速机器启用速度.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1,关闭sendmail服务\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e/etc/rc.d/init.d/sendmail stop\u003c/p\u003e\n\u003cp\u003eShutting down sendmail: [ OK ]\nShutting down sm-client: [ OK ]\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2,关闭sendmail自启动\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e[root@lsp ~]# chkconfig sendmail off\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3,确认sendmail自启动已被关闭(都为off就OK)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e[root@lsp ~]# chkconfig –list sendmail\u003c/p\u003e\n\u003cp\u003esendmail 0:off 1:off 2:off 3:off 4:off 5:off 6:off\u003c/p\u003e\n\u003cp\u003e————–\u003c/p\u003e\n\u003cp\u003echkconfig –list 可以用来查看所有的服务\u003c/p\u003e\n\u003cp\u003e如果提示chkconfig命令找不到,可使用/sbin/chkconfig的形式\u003c/p\u003e"
September 29, 2011
升级centos5.6到centos6.0
"\u003cp\u003e切记升级系统前,请务必备份重要文件!\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e首先,清除所有软件包\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eyum clean all\nyum list updates\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e升级centos\nyum update\nreboot\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这样就升级完了,可以检查一下系统目前的版本:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003elsb_release -a\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这样就升级完了,可以检查一下系统目前的版本:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#rpm -q centos-release\n\u003c/code\u003e\u003c/pre\u003e"
September 29, 2011
如何查看linux版本
"\u003cp\u003e如何得知自己正在使用的linux是什么版本呢,下面的几种方法将给你带来答案!\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e查看内核版本命令:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e** 1) [root@q1test01 ~]# cat /proc/version **\u003c/p\u003e\n\u003cp\u003eLinux version 2.6.9-22.ELsmp (\u003ca href=\"mailto:bhcompile@crowe.devel.redhat.com\"\u003ebhcompile@crowe.devel.redhat.com\u003c/a\u003e) (gcc version 3.4.4 20050721 (Red Hat 3.4.4-2)) #1 SMP Mon Sep 19 18:00:54 EDT 2005\u003c/p\u003e\n\u003cp\u003e** 2) [root@q1test01 ~]# uname -a **\u003c/p\u003e\n\u003cp\u003eLinux q1test01 2.6.9-22.ELsmp #1 SMP Mon Sep 19 18:00:54 EDT 2005 x86_64 x86_64 x86_64 GNU/Linux\u003c/p\u003e\n\u003cp\u003e** 3) [root@q1test01 ~]# uname -r **\u003c/p\u003e\n\u003cp\u003e2.6.9-22.ELsmp\u003c/p\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003e查看linux版本:\u003c/li\u003e\n\u003c/ol\u003e\n\u003col\u003e\n\u003cli\u003e登录到服务器执行 lsb_release -a ,即可列出所有版本信息,例如:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e** …\u003c/p\u003e"
September 13, 2011
(linux)nfs配置教程[原创]
"\u003cp\u003e转载请注明文本来源:\u003c/p\u003e\n\u003cp\u003e网络文件系统(NFS,Network File System)是一种将远程主机上的分区(目录)经网络挂载到本地系统的一种机制,通过对网络文件系统的支持,用户可以在本地系统上像操作本地分区一样来对远程主机的共享分区(目录)进行操作。\u003c/p\u003e\n\u003cp\u003e操作环境为:Centos6.0\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、NFS服务端设置(192.168.0.100)\u003c/strong\u003e\n1.安装并启用相应的服务,将防火墙关闭\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#yum -y install nfs* portmap\n#启动端口映射\n#service portmap start\n#启动NFS 服务,此时NFS 会激活守护进程,然后就开始监听 Client 端的请求\n#service nfs start\n#关闭防火墙\n#service iptables stop\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e在这里可以对nfs进行一下验证\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#mount -t nfs 192.168.0.100:/data/nfs /mnt/nfs\n#本地验证\n#touch /mnt/nfs/server.txt\n#ls /mnt/nfs\n#ls /data/nfs\n\u003c/code\u003e\u003c/pre\u003e\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e如果/mnt/nfs和/data/nfs两个目录里的内容一 …\u003c/code\u003e\u003c/pre\u003e"
September 12, 2011
php-fpm日志里出现[WARNING] fpm_children_bury()信息的解决办法
"\u003cp\u003e最近接手nginx+php的WEB环境维护,发现PHP-cgiCPU很好,也造成负载很高,于是在网上找了些资料,并且针对自己的错误,将问题收集再次,并且网上还给了解决方案,所以放在这里留作以后查询\u003c/p\u003e\n\u003cp\u003ean 11 08:54:01.164292 [NOTICE] fpm_children_make(), line 352: child 10088 (pool default) started\u003c/p\u003e\n\u003cp\u003eJan 11 08:54:01.164325 [WARNING] fpm_children_bury(), line 215: child 7985 (pool default) exited on signal 15 SIGTERM after 63.778601 seconds from start\u003c/p\u003e\n\u003cp\u003eJan 11 08:54:01.165485 [NOTICE] fpm_children_make(), line 352: child 10089 (pool default) started\u003c/p\u003e\n\u003cp\u003eJan 11 08:54:01.165514 [WARNING] fpm_children_bury(), …\u003c/p\u003e"
September 9, 2011
kickstart 语法详解
"\u003cp\u003e\u003cstrong\u003ekickstart 语法\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e接下来探讨ks.cfg 的相关参数,这些参数笔者将依上述ks,cfg 出现的先后顺序来讨论,有些参数并不是一定要设置。完整的kickstart 参数意义可参考下列网址。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.redhat.com/docs/manuals/enterprise/RHEL-3-Manual/sysadmin-guide/s1-kickstart2-options.html\"\u003ehttp://www.redhat.com/docs/manuals/enterprise/RHEL-3-Manual/sysadmin-guide/s1-kickstart2-options.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eks.cfg 文件由三个部份皆组成:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003ecommand 区段—此部份包含了必要安装选项\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003epackages 区段—列出欲安装套件\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e%pre and %post 区段\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ecommand 区段\n■lang(必要):安装时所使用的语言\n例如:安装过程中选用中文语言,lang zh_TW.Big5\n■langsupport (必要):指定系统使用的语言。假如你安装一至多国语系,你必需使用默认选项去指定默认语言。语法为:\n例如:langsupport –default en_US.UTF-8 zh_TW.Big5 en_US.UTF-8\n■键盘(必要):设置系统键盘的种类。语法 …\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e"
September 9, 2011
redhat下使用dvd作为yum源
"\u003cp\u003e使用rpm包的最大问题就是安装依赖问题,yum就是为了解决这个问题而出现的,但是Redhat AS的更新是要收费的,所以在解决这个收费的问题之前你只能暂时用安装盘作为yum源,实际上,这也是可以做到的:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1、mount安装盘到/mnt/cdrom\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#mkdir /mnt/cdrom\n#mount -t auto /dev/cdrom /mnt/cdrom\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e2、创建/etc/yum.rep.d/rhel.repo,文件内容如下:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[base]\nname=Red Hat Enterprise Linux $releasever – $basearch\nbaseurl=file:///mnt/cdrom/\nenabled=1\ngpgcheck=0\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release\u003c/p\u003e\u003c/blockquote\u003e"
September 7, 2011
RHEL6/CentOS6下root用户密码破解
"\u003cp\u003eRHEL升级到版本6以后,发现root用户密码破解和centos.5的不一样了;在单用户模式下输入passwd命令不再有效。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/09/centos-6-pass.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/09/centos-6-pass.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e这是由于在安装RHEL6(centos6)的过程中或者以前使用过程上,SELinux的默认级别为非0的缘故;\u003c/p\u003e\n\u003cp\u003e因此在进入单用户模式以后需要输入_setenforce 0_命令来将SELinux级别临时变为0以后,才可以使用passwd命令!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/09/centos-reset-root-passwd.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/09/centos-reset-root-passwd.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e当然如果你在安装过程中,更改了SELinux的级别,那么就不会遇到上述问题了!\u003c/p\u003e\n\u003cp\u003e据称,这是RHEL6的一个bug……\u003c/p\u003e"
September 5, 2011
Linux下做软RAID
"\u003cp\u003eGUI:安装CentOS5.0过程中做软RAID:\u003c/p\u003e\n\u003cp\u003eCLI:Linux下做软raid: \u003ca href=\"http://docs.haohtml.com/download/linux/LINUX%c8%edRAID.pdf\"\u003ehttp://docs.haohtml.com/download/linux/LINUX%c8%edRAID.pdf\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e======== \u003cstrong\u003emdadm使用详解\u003c/strong\u003e======================\u003c/p\u003e\n\u003cp\u003e**\u003c/p\u003e\n\u003cp\u003e**\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e★mdadm简介\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e我们可以使用man mdadm命令来查看mdadm的帮助信息:\u003c/p\u003e\n\u003cp\u003e[root@localhost mdadm-2.6.2]# man mdadm\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e☆mdadm用法\u003c/strong\u003e\n\u003cstrong\u003e基本语法\u003c/strong\u003e:\u003c/p\u003e\n\u003cp\u003emdadm [mode] [options]\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e目前支持\u003c/strong\u003e:\u003c/p\u003e\n\u003cp\u003eLINEAR, RAID0(striping), RAID1(mirroring), RAID4, RAID5, RAID6, RAID10, MULTIPATH和FAULTY\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e模式(7种):\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAssemble:加入一个以前定义的阵列\u003c/li\u003e\n\u003cli\u003eBuild:创建一个没有超级块的阵列\u003c/li\u003e\n\u003cli\u003eCreate:创建一个新的阵列,每个设备具有超级块\u003c/li\u003e\n\u003cli\u003eManage: 管理阵列(如添加和删除)\u003c/li\u003e\n\u003cli\u003eMisc:允许单独对阵列中的某个设备进行操作(如停止阵列)\u003c/li\u003e\n\u003cli\u003eFollow …\u003c/li\u003e\u003c/ul\u003e"
September 5, 2011
scp 无密码在两台主机之间拷贝文件
"\u003cp\u003e用scp 在两台主机之间相互之间拷贝文件,还是方面!但是需要密码!怎么样才能无密码相互之间拷贝文件呢!\n以下就实现是方法!\n在A主机上运行\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#ssh-keygen -t rsa\u003c/p\u003e\n\u003cp\u003e[root@localhost ~]# ssh-keygen -t rsa\u003c/p\u003e\n\u003cp\u003eGenerating public/private rsa key pair.\u003c/p\u003e\n\u003cp\u003eEnter file in which to save the key (/root/.ssh/id_rsa):\u003c/p\u003e\n\u003cp\u003eEnter passphrase (empty for no passphrase):\u003c/p\u003e\n\u003cp\u003eEnter same passphrase again:\u003c/p\u003e\n\u003cp\u003eYour identification has been saved in /root/.ssh/id_rsa.\u003c/p\u003e\n\u003cp\u003eYour public key has been saved in /root/.ssh/id_rsa.pub.\u003c/p\u003e\n\u003cp\u003eThe key fingerprint is:\u003c/p\u003e\n\u003cp\u003e61:34:37:bd:03:aa:c8:85:0d:e9:d0:b6:6e:c2:50:89 root@localhost\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e …\u003c/p\u003e"
September 5, 2011
超级详细Tcpdump的用法
"\u003cp\u003e第一种是关于类型的关键字,主要包括host,net,port, 例如 host 210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明 202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是host.\u003c/p\u003e\n\u003cp\u003e第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,这些关键字指明了传输的方向。举例说明,src 210.27.48.2 ,指明ip包中源地址是210.27.48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0 。如果没有指明方向关键字,则缺省是src or dst关键字。\u003c/p\u003e\n\u003cp\u003e第三种是协议的关键字,主要包括fddi,ip,arp,rarp,tcp,udp等类型。Fddi指明是在FDDI(分布式光纤数据接口网络)上的特定 的网络协议,实际上它是”ether”的别名,fddi和ether具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和 分析。其他的几个关键字就是指明了监听的包的协议内容。 …\u003c/p\u003e"
September 4, 2011
常用MYSQL安全设置加固
"\u003cp\u003e1.修改root用户口令,删除空口令\n2.删除默认数据库和数据库用户\n3.改变默认mysql管理员帐号\n4.关于密码的管理\n5.使用独立用户运行msyql\n6.禁止远程连接数据库\n7.限制连接用户的数量\n8.用户目录权限限制\n9.命令历史记录保护\n10.禁止MySQL对本地文件存取\n11.MySQL服务器权限控制\n12.使用chroot方式来控制MySQL的运行目录\n13.关闭对无关的Web程序访问的支持\n14.数据库备份策略\n15. Mysqld安全相关启动选项\n16.information_schema 安全\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.修改root用户口令,删除空口令\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e缺省安装的MySQL的root用户是空密码的,为了安全起见,必须修改为强密码,所谓的强密码,至少8位,由字母、数字和符号组成的不规律密码。使用MySQL自带的命令mysaladmin修改root密码,同时也可以登陆数据库,修改数据库mysql下的user表的字段内容,修改方法如下所示:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# /usr/local/mysql/bin/mysqladmin -u root password “upassword” //使 …\u003c/p\u003e\u003c/blockquote\u003e"
September 4, 2011
常用PHP安全设置加固
"\u003cp\u003e1.隐藏php版本\n2.禁用危险的php函数\n3.命令注入攻击\n4.SQL注入攻击\n5.xss攻击\n6.会话劫持攻击\n7.关闭注册全局变量\n8.上传文件\n9.远程包含、本地包含\n10.Php.ini包含补丁文件,我们可以根据需要,通过它包含或者nginx的模块\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.隐藏php版本\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eexpose_php=off\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e2.禁用危险的php函数\u003c/strong\u003e\npopen,pentl_exec,passthru,exec,system,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,show_source,escapeshellcmd,escapeshellarg,curl_exec,curl_multi_exec,parse_ini_file,assert\n至于eval函数,我们用suhosin把这些全部都加进eval的黑 …\u003c/p\u003e"
September 2, 2011
linux下ssh使用rsa认证教程[原创]
"\u003cp\u003e下面我们来对linux(centos)平台如何使用ssh的rsa认证功能来实现安全登录服务器的教程.为了安全我们一般不直接使用root这个用户,而使用其它用户来代替.如果需要root权限的时候,直接在服务器上进行su命令进行用户切换就可以了.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一.配置/etc/ssh/ssh_config文件\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eServerKeyBits 1024 //# 注释取消,将768改为1024\n\nPermitRootLogin no //# 注释取消,将yes改为no 禁止root登录\n\u003c/code\u003e\u003c/pre\u003e\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eRSAAuthentication yes //# 启用 RSA 认证\nPubkeyAuthentication yes //# 启用公钥认证\nAuthorizedKeysFile //# .ssh/authorized_keys # 验证公钥的存放路径\n\u003c/code\u003e\u003c/pre\u003e\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ePermitEmptyPasswords no //# 取消注释,禁止空密码登录\nPasswordAuthentication no //# 取消注释,禁止使用密码方式登录,有密钥谁还用密码啊\n注意一下,在centos5.0之前SSH服务 …\u003c/code\u003e\u003c/pre\u003e"
September 2, 2011
Nginx中的gzip模块简介
"\u003ch2 id=\"gzip\"\u003egzip\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e语法:\u003c/strong\u003e \u003cem\u003egzip on|off\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e默认值:\u003c/strong\u003e \u003cem\u003egzip off\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e作用域:\u003c/strong\u003e \u003cem\u003ehttp, server, location, if (x) location\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e开启或者关闭gzip模块\u003c/p\u003e\n\u003ch2 id=\"gzip_buffers\"\u003egzip_buffers\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e语法:\u003c/strong\u003e \u003cem\u003egzip_buffers number size\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e默认值:\u003c/strong\u003e \u003cem\u003egzip_buffers 4 4k/8k\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e作用域:\u003c/strong\u003e \u003cem\u003ehttp, server, location\u003c/em\u003e\n设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。例如 4 4k 代表以4k为单位,按照原始数据大小以4k为单位的4倍申请内存。 4 8k 代表以8k为单位,按照原始数据大小以8k为单位的4倍申请内存。\u003c/p\u003e\n\u003cp\u003e如果没有设置,默认值是申请跟原始数据相同大小的内存空间去存储gzip压缩结果。\u003c/p\u003e\n\u003ch2 id=\"gzip_comp_level\"\u003e\u003cstrong\u003egzip_comp_level\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e语法:\u003c/strong\u003e \u003cem\u003e\u003cstrong\u003egzip_comp_level\u003c/strong\u003e 1..9\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e默认值:\u003c/strong\u003e \u003cem\u003e\u003cstrong\u003egzip_comp_level\u003c/strong\u003e 1\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e作用域:\u003c/strong\u003e \u003cem\u003ehttp, server, location\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003egzip压缩比,1 压缩比最小处理速度最快,9 压缩比最大但处理最慢(传输快但比较消耗cpu)。\u003c/p\u003e\n\u003ch2 id=\"gzip_min_length\"\u003egzip_min_length\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e语法: …\u003c/strong\u003e\u003c/p\u003e"
September 1, 2011
Linux系统监控工具之vmstat详解
"\u003cp\u003evmstat是一个十分有用的Linux系统监控工具,使用vmstat命令可以得到关于进程、内存、内存分页、堵塞IO、traps及CPU活动的信息。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、前言\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e很显然从名字中我们就可以知道vmstat是一个查看虚拟内存(Virtual Memory)使用状况的工具,但是怎样通过vmstat来发现系统中的瓶颈呢?在回答这个问题前,还是让我们回顾一下Linux中关于虚拟内存相关内容。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二、虚拟内存运行原理\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在系统中运行的每个进程都需要使用到内存,但不是每个进程都需要每时每刻使用系统分配的内存空间。当系统运行所需内存超过实际的物理内存,内核会释放某些进程所占用但未使用的部分或所有物理内存,将这部分资料存储在磁盘上直到进程下一次调用,并将释放出的内存提供给有需要的进程使用。\u003c/p\u003e\n\u003cp\u003e在Linux内存管理中,主要是通过“调页Paging”和“交换Swapping”来完成上述的内存调度。调页算法是将内存中最近不常使用的页面换到磁盘上,把活动页面保留在内存中供进程使用。交换技术是将整个进程,而不是部分页面,全部交换到磁盘上。\u003c/p\u003e\n\u003cp\u003e分页(Page)写入磁盘的过程被称作Page-Out,分页(Page)从磁盘重新回到 …\u003c/p\u003e"
September 1, 2011
PHP-FPM高负载的解决办法
"\u003cp\u003e这里只是介绍了php-fpm的优化方法的,但一般情况下和nginx组合使用的时候,单独优化其中一项的话,作用不是特别的大,同时还需要对nginx进行优化.nginx的做法方法参考:.上面的优化前和优化后的图,看得出前后差距还是特别的大的.\u003c/p\u003e\n\u003cp\u003e导致nginx 502 bad gateway的PHP-CGI(FASTCGI)\u003c/p\u003e\n\u003cp\u003eNGINX频爆502 BAD GATEWAY的错误,看了网上的教程,仍没有彻底解决。\u003c/p\u003e\n\u003cp\u003e目前我总结的解决502 BAD GATEWAY的方式有:\u003c/p\u003e\n\u003cp\u003e1.视服务器的性能,在php-fmp.conf里增加max_children的值,我目前用的15.\u003c/p\u003e\n\u003cp\u003e2.用reload参数定时重载php-fpm。这个主要原因是php脚本执行时间过长造成的,重载php-fpm能杜绝这个问题。如何彻底解决php-cgi脚本占用大量内存从而导致502错误的产生还值得进一步探讨,目前该做法不失为一种好办法。\u003c/p\u003e\n\u003cp\u003e具体的做法是,用crontab让php-fpm平滑重启,从而不影响PHP脚本的运行。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e*/10 * * * * /usr/local/php/sbin/php-fpm reload …\u003c/p\u003e\u003c/blockquote\u003e"
September 1, 2011
Linux主分区,扩展分区,逻辑分区的联系和区别
"\u003cp\u003e言归正传,在安装 CentOS5.3 的过程中,会遇到磁盘分区的界面,下拉式菜单中有 4 个选项,这时你不要选择默认,打开下拉式菜单,选择最后一项(翻译成中文意思是:建立自定义的分割模式)。然后选择右下角的确认,在下一个对话界面里依序建立 / 、 /home 及 swap ,完成后如图。确认设置后的分割区。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/09/0512054353-0.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/09/0512054353-0.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e为强调重点,把图中重要内容,再写一遍。\u003c/p\u003e\n\u003cp\u003e/ 根目录 ext3 hda1\u003c/p\u003e\n\u003cp\u003e/home 用户目录 ext3 hda2\u003c/p\u003e\n\u003cp\u003eSwap 交换分区 swap hda3\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e对 hda1 的解释:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ehd : IDE 硬盘。如果是 SCSI 硬盘,则为 sd ,这个只能记住,没有更好的办法。\u003c/p\u003e\n\u003cp\u003ea: : 第一块硬盘。如果是第二块硬盘,则为 b ,依此类推 c,d……\u003c/p\u003e\n\u003cp\u003e1 : 主分区。其中 1 , 2 , 3 , 4 都是主分区,从第 5 开始为逻辑分区,最大到 16\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e磁盘容量与主分区、扩展分区、逻辑分区的关系:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e硬盘的容量=主分区的容量+扩展分区的容量扩展分区的容量=各个逻辑分区的 …\u003c/p\u003e"
September 1, 2011
Linux(nginx)下安装awstats日志分析软件
"\u003cp\u003e这里用的是centos的系统,linux上的安装方法基本上都一样的.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一.下载awstats软件\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e从地址可以下载,这里使用的是最新的7.0的版本\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#cd /usr/local\n#wget \u003ca href=\"http://cdnetworks-kr-1.dl.sourceforge.net/project/awstats/AWStats/7.0/awstats-7.0.zip\"\u003ehttp://cdnetworks-kr-1.dl.sourceforge.net/project/awstats/AWStats/7.0/awstats-7.0.zip\u003c/a\u003e#unzip awstats-7.0.zip awstats\n#chmod +x /usr/local/awstats/tools/awstats_configure.pl\n#chmod +x /usr/local/awstats/wwwroot/cgi-bin/awstats.pl\n#chmod +x /usr/local/awstats/tools/awstats_buildstaticpages.pl\n#用来存放swstats的数据文件\n#mkdir /var/lib/awstats\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e二.创建配置文件\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#cd /usr/local/awstats/tools/\n#perl ./awstats_configure.pl\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e根据提 …\u003c/p\u003e"
September 1, 2011
Linux下如何查看 CPU 信息, 包括位数和多核信息
"\u003cp\u003e\u003cstrong\u003e查看当前操作系统内核信息\u003c/strong\u003e\n# uname -aLinux redcat 2.6.31-20-generic #58-Ubuntu SMP Fri Mar 12 05:23:09 UTC 2010 i686 GNU/Linux\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e查看当前操作系统发行版信息\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e#cat /etc/issue\u003c/p\u003e\n\u003cp\u003eUbuntu 9.10 n l\u003cstrong\u003e查看cpu型号\u003c/strong\u003e# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c\u003c/p\u003e\n\u003cp\u003e2 Intel(R) Core(TM)2 Duo CPU P8600 @ 2.40GHz\u003c/p\u003e\n\u003cp\u003e(看到有2个逻辑CPU, 也知道了CPU型号)\u003cstrong\u003e查看物理cpu颗数\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e# cat /proc/cpuinfo | grep physical | uniq -c2 physical id : 0\u003c/p\u003e\n\u003cp\u003e(说明实际上是1颗2核的CPU)\u003cstrong\u003e查看cpu运行模式\u003c/strong\u003e\u003c/p\u003e\n\u003ch1 id=\"getconf-long_bit32说明当前cpu运行在32bit模式下-但不代表cpu不支持64bit查看cpu是否支持64bitcat-proccpuinfo--grep-flags--grep--lm---wc-l2结果大于0-说明支持64bit计算-lm指long-mode-支持lm则是64bit查看cpu信息概要昨天看aix的时候刚发现的在ubuntu上竟然也有lscpuarchitecture-i686-架构686\"\u003egetconf LONG_BIT32(说明当前CPU运行在32bit模式下, 但不代表CPU不支持64bit)\u003cstrong\u003e查看cpu是否支持64bit\u003c/strong\u003e# cat /proc/cpuinfo | grep flags | …\u003c/h1\u003e"
September 1, 2011
linux 下如何查看和踢除正在登陆的其它用户
"\u003cp\u003e如何在linux下查看当前登录的用户,并且踢掉你认为应该踢掉的用户?\n请使用who这个命令来查看当前正在登录的用户\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[root@localhost http]# who\nroot tty1 Apr 9 13:17\nhttp pts/0 Apr 16 15:13 (192.168.8.235)\nhttp pts/1 Apr 16 15:13 (192.168.8.235)\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e注意:可能有朋友马上要叫出来了:“什么?!有3个用户在登录!我被黑了!”,呵呵,开玩笑了~~上面的消息告诉我们:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003etty\u003c/strong\u003e是指在任何一个虚拟控制台登录则产生一个tty,比如你插上显示器登录主机,就会增加一个tty.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003epts\u003c/strong\u003e是每一个远程连接都会产生的,比如我现在使用ftp客户端连接到主机上,主机就会产生一个pts,事实上上面的192.168.8.235就是我,那两个http就我的连接。\ntty和pts详见:\u003c/p\u003e\n\u003cp\u003e要踢出某个用户以及该用户运行的程序(很野蛮),请采用如下方法:\n比如:想踢除http这个用户和他的所有开启的程序执行下面命令\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003epkill -u http\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e注意:这个命令实际上很危险,要相当小心的执行!!\n说他危险的 …\u003c/p\u003e"
September 1, 2011
LINUX下判断CPU和系统是32位还是64位
"\u003cp\u003e\u003cstrong\u003e判断操作系统是32位还是64位的方法:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e输入如下命令:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e$ uname -a\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e输出:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ex86_64 GNU/Linux 表示64位内核\u003c/p\u003e\n\u003cp\u003ei386/i486/i586/i686 表示32位内核\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e判断Linux kernel是32位还是64位的方法:\u003c/p\u003e\n\u003cp\u003e输入如下命令:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e$ cat /proc/cpuinfo |grep flags\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e输出:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003elm(long mode) 表示64位CPU\u003c/p\u003e\n\u003cp\u003eProtoected 表示32位CPU\u003c/p\u003e\n\u003cp\u003eReal 表示16位CPU\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e==================================================================\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e在LINUX下怎样决断你的CPU是32位还是64位?\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e打入下面的命令\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003egrep flags /proc/cpuinfo\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e输出\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eflags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi …\u003c/p\u003e\u003c/blockquote\u003e"
August 31, 2011
linux 系统tty、pty和pts 的概念及区别
"\u003cp\u003e\u003cstrong\u003e基本概念:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003etty(终端设备的统称):\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003etty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西被键盘与显示器取代,所以现在叫终端比较合适。\u003c/p\u003e\n\u003cp\u003e终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。\u003c/p\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003epty(虚拟终端):\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e但是如果我们远程telnet到主机或使用xterm时不也需要一个终端交互么?是的,这就是虚拟终端pty(pseudo-tty)\u003c/p\u003e\n\u003col start=\"3\"\u003e\n\u003cli\u003epts/ptmx(pts/ptmx结合使用,进而实现pty):\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003epts(pseudo-terminal slave)是pty的实现方法,与ptmx(pseudo-terminal master)配合使用实现pty。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eLinux终端:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在Linux系统的设备特殊文件目录/dev/下,终端特殊设备文件一般有以下几种:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1、串行端口终端(/dev/ttySn)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e串 行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。有段时间这些串行端口设备通常 …\u003c/p\u003e"
August 31, 2011
为VMware Linux增加虚拟硬盘
"\u003cp\u003eVMware安装Linux的时候默认分配的空间是4GB,可能会不够,这个时候可以通过增加一块虚拟硬盘,将/usr或其他内容拷贝过去解决这个问题:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e总个操作过程可分为:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e分区\u003c/li\u003e\n\u003cli\u003e格式化\u003c/li\u003e\n\u003cli\u003e挂载\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e三个过程.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e创建虚拟硬盘\u003c/strong\u003e\n1、关闭VM中正在运行的虚拟系统;\u003c/p\u003e\n\u003cp\u003e2、在虚拟系统名称上点右键-》Virtual Machine Settings;\n3、在Hardware页点“Add”-》Add a hard disk-》Create a new virtual disk-》SCSI(recommended)-》分配空间大小-》OK;\n4、可以看见Hardware中出现了一块新的硬盘Hard Disk 2。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e对虚拟硬盘进行分区和格式化\u003c/strong\u003e\n[root@cncmail data1]# fdisk -l ## 这里是查看目前系统上有几块硬盘\u003c/p\u003e\n\u003cp\u003eDisk /dev/sda: 36.4 GB, 36401479680 bytes\n255 heads, 63 sectors/track, 4425 cylinders\nUnits = cylinders of 16065 * 512 = 8225280 bytes …\u003c/p\u003e"
August 23, 2011
[教程]Nginx无缝升级教程
"\u003cp\u003e今天Nginx1.1.1发布了,准备将自己的nginx版本升级一下.\u003c/p\u003e\n\u003cp\u003e以下是我平滑将Nginx1.0.4升级到Nginx1.1.1的完整过程,作为一个教程或者备忘。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# /usr/local/nginx/sbin/nginx –V //查看当前Nginx版本\u003c/p\u003e\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003enginx: nginx version: nginx/1.0.4\nnginx: built by gcc 4.4.4 20100726 (Red Hat 4.4.4-13) (GCC)\nnginx: TLS SNI support enabled\nnginx: configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e一.配置nginx并编译,切记不要make install\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# wget \u003ca href=\"http://nginx.org/download/nginx-1.1.1.tar.gz\"\u003ehttp://nginx.org/download/nginx-1.1.1.tar.gz\u003c/a\u003e\n# tar zxvf nginx-1.1.1.tar.gz …\u003c/p\u003e\u003c/blockquote\u003e"
August 5, 2011
Nginx fastcgi perl (pl、cgi)支持
"\u003cp\u003e\u003cstrong\u003e1. 安装FCGI模块\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# wget \u003ca href=\"http://search.cpan.org/CPAN/authors/id/B/BO/BOBTFISH/FCGI-0.70.tar.gz\"\u003ehttp://search.cpan.org/CPAN/authors/id/B/BO/BOBTFISH/FCGI-0.70.tar.gz\u003c/a\u003e\n# tar zxvf FCGI-0.70.tar.gz\n# cd FCGI-0.70\n# perl Makefile.PL\n# make\n# make install\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e2. 安装 IO 和 IO::ALL模块\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# wget \u003ca href=\"http://search.cpan.org/CPAN/authors/id/G/GB/GBARR/IO-1.25.tar.gz\"\u003ehttp://search.cpan.org/CPAN/authors/id/G/GB/GBARR/IO-1.25.tar.gz\u003c/a\u003e\n# tar zxvf IO-1.25.tar.gz\n# cd IO-1.25\n# perl Makefile.PL\n# make\n# make install\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e升级MakeMaker版\u003c/strong\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#wget \u003ca href=\"http://search.cpan.org/CPAN/authors/id/M/MS/MSCHWERN/ExtUtils-MakeMaker-6.54.tar.gz\"\u003ehttp://search.cpan.org/CPAN/authors/id/M/MS/MSCHWERN/ExtUtils-MakeMaker-6.54.tar.gz\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e#tar zxvf ExtUtils-MakeMaker-6.54\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003ch1 id=\"perl-makefilepl\"\u003eperl …\u003c/h1\u003e\u003c/blockquote\u003e"
August 2, 2011
nagios访问apache权限问题解决
"\u003cp\u003eIt appears as though you do not have permission to view information for any of the services you requested…\u003c/p\u003e\n\u003cp\u003e打开cgi.cfg配置文件,里面有个参数:\u003c/p\u003e\n\u003cp\u003euse_authentication=1\u003c/p\u003e\n\u003cp\u003e为了保障系统的安全性,nagios设置了这个参数,默认为1,改为0即可\u003c/p\u003e\n\u003cp\u003e1.装了几次,换了几个版本的系统,脑袋都大了,终于解决了\u003c/p\u003e\n\u003cp\u003enrpe在 ./configure时提示\u003c/p\u003e\n\u003cp\u003echecking for SSL… configure: error: Cannot find ssl libraries\u003c/p\u003e\n\u003cp\u003e把openssl-devel装上就可以了\u003c/p\u003e\n\u003cp\u003e2.nagios web界面提示\u003c/p\u003e\n\u003cp\u003eIt appears as though you do not have permission to view information for any of the services you requested…\u003c/p\u003e\n\u003cp\u003e打开cgi.cfg配置文件,里面有个参数:\u003c/p\u003e\n\u003cp\u003euse_authentication=1\u003c/p\u003e\n\u003cp\u003e为了保障系统的安全 …\u003c/p\u003e"
August 1, 2011
理解Linux系统负荷
"\u003cp\u003e\u003cstrong\u003e一、查看系统负荷\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e如果你的电脑很慢,你或许想查看一下,它的工作量是否太大了。\u003c/p\u003e\n\u003cp\u003e在Linux系统中,我们一般使用uptime命令查看(w命令和top命令也行)。(另外,它们在苹果公司的Mac电脑上也适用。)\u003c/p\u003e\n\u003cp\u003e你在终端窗口键入uptime,系统会返回一行信息。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2011/08/3c61c58dd6bbd277cc8c71cabb97e277.png\" alt=\"bg2011073001\"\u003e\u003c/p\u003e\n\u003cp\u003e这行信息的后半部分,显示”load average”,它的意思是”系统的平均负荷”,里面有三个数字,我们可以从中判断系统负荷是大还是小。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2011/08/b639ca5e9954b512d726cb480644fbdc.png\" alt=\"bg2011073003\"\u003e\u003c/p\u003e\n\u003cp\u003e为什么会有三个数字呢?你从手册中查到,它们的意思分别是1分钟、5分钟、15分钟内系统的平均负荷。\u003c/p\u003e\n\u003cp\u003e如果你继续看手册,它还会告诉你,当CPU完全空闲的时候,平均负荷为0;当CPU工作量饱和的时候,平均负荷为1。\u003c/p\u003e\n\u003cp\u003e那么很显然,”load average”的值越低,比如等于0.2或0.3,就说明电脑的工作量越小,系统负荷比较轻。\u003c/p\u003e\n\u003cp\u003e但是,什么时候能看出系统负荷比较重呢?等于1的时候,还是等于0.5或等于1.5的时候?如果1分钟、5分钟、15分钟三个值不一样,怎么办?\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二、一个类比\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e判断系统负荷是否过重,必须理解load average的真正含义。下面,我根据” \u003ca href=\"http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages\"\u003eUnderstanding Linux …\u003c/a\u003e\u003c/p\u003e"
July 31, 2011
Apache下实现隐藏服务器名称
"\u003cp\u003e我这里用的是FreeBSD的操作系统的.用curl 命令查看文件头\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/07/apache_hidden_os_name_0.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/07/apache_hidden_os_name_0.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e为了安全起见,我们需要将FreeBSD字样及其它信息隐藏起来.操作如下:\u003c/p\u003e\n\u003cp\u003e在httpd.conf文件里添加以下两行\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eServerTokens Prod\nServerSignature Off\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e重启apache即可.\u003c/p\u003e\n\u003cp\u003e如图所示:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/07/apache_hidden_os_name.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/07/apache_hidden_os_name.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e"
July 27, 2011
服务器出现-由注册表引起的I/O操作发生了不可恢复的错误 的解决方法
"\u003cp\u003e昨天一台服务器的80端口突然不行了,3389虽然通,但连接不上,其它的3306和21端口都正常的.初步怀疑是系统资源不足引起的.第二天让机房检查,最后没有办法重启解决了.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e服务器出现此问题:\n很多使用Windows Server 2003系统的用户都会收到如下错误:\n事件类型: 错误\n事件来源: Application Popup\n事件种类: 无\n事件 ID: 333\n日期: 2007-8-11\n事件: 8:48:03\n用户: N/A\n计算机: LZ_YQ\n描述:\n由注册表引起的 I/O 操作发生了不可恢复的错误。 注册表将不能读取、写出或刷新包含注册表系统图像的其中一个文件。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e然后系统失去响应,需要重新启动。\u003c/p\u003e\n\u003cp\u003e事件ID是333,英文日志为:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eEvent Type: Error\nEvent Source: Application Popup\nEvent Category: None\nEvent ID: 333\nDate: date\nTime: time\nUser: N/A\nComputer: computer name\nDescription: An I/O operation …\u003c/p\u003e\u003c/blockquote\u003e"
July 25, 2011
iptables 开放80端口
"\u003cp\u003eiptables -F //清空规则\u003c/p\u003e\n\u003cp\u003eiptables -A INPUT -p tcp –dport 22 -j ACCEPT /*允许包从22端口进入*/\niptables -A OUTPUT -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT /*允许从22端口进入的包返回*/\niptables -A OUTPUT -p udp –dport 53 -j ACCEPT\niptables -A INPUT -p udp –sport 53 -j ACCEPT\niptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT /*允许本机访问本机*/\niptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT\niptables -A INPUT -p tcp -s 0/0 –dport 80 -j ACCEPT /*允许所有IP访问80端口*/\niptables -A OUTPUT -p tcp –sport 80 -m state …\u003c/p\u003e"
July 24, 2011
linux下网站排障分析常用的命令
"\u003cp\u003e\u003cstrong\u003e系统连接状态篇:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e1.查看TCP连接状态\nnetstat -nat |awk \u0026#39;{print $6}\u0026#39;|sort|uniq -c|sort -rn\nnetstat -n | awk \u0026#39;/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}\u0026#39; 或\nnetstat -n | awk \u0026#39;/^tcp/ {++state[$NF]}; END {for(key in state) print key,\u0026#34;t\u0026#34;,state[key]}\u0026#39;\nnetstat -n | awk \u0026#39;/^tcp/ {++arr[$NF]};END {for(k in arr) print k,\u0026#34;t\u0026#34;,arr[k]}\u0026#39;\nnetstat -n |awk \u0026#39;/^tcp/ {print $NF}\u0026#39;|sort|uniq -c|sort -rn\nnetstat -ant | awk \u0026#39;{print $NF}\u0026#39; | grep -v \u0026#39;[a-z]\u0026#39; | …\u003c/code\u003e\u003c/pre\u003e"
July 22, 2011
隐藏 Apache & PHP 的版本号
"\u003cp\u003e有朋友问起,如何隐藏 HTTP header 中发送包含在 Server 信息里面的 Apache 和 PHP 版本号(譬如我们可以到 Firefox 的附加工具里面找 Live HTTP Headers;还可以用curl -I IPaddress|http://域名 ) 下面是做法:\n\u003cstrong\u003eApache:\u003c/strong\u003e\n打开 httpd.conf,在文件最后加入以下代码:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e#Hidden I can with apache version number\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eServerTokens ProductOnly\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eServerSignature Off\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003ePHP:\u003c/strong\u003e\n隐藏 PHP 版本就是隐藏类似于 “X-Powered-By: PHP/5.1.2-1+b1” 这个,开启 php.ini,加入:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eexpose_php = Off\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e设置了expose_php=Off后,用phpinfo查看的时候,页面上原来正常显示的图片会消失隐藏的.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e相关:\u003c/em\u003e\u003c/p\u003e"
July 22, 2011
使用sed处理php-fpm.conf和nginx.conf文本里的注释信息
"\u003cp\u003e默认系统环境安装教程: \u003ca href=\"http://blog.haohtml.com/archives/6051\"\u003ehttp://blog.haohtml.com/archives/6051\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ephp-fpm.conf:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e想自己搞一个自动修改php-fpm.conf的shell脚本.刚安装的php,默认的是nobody用户运行的,这里修改为了www,并去掉了两边的注释符\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003esed ‘63,66s/|–\u0026gt;//g’ php-fpm.conf | sed ‘s/nobody/www/g’\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e上面将”“和”–\u0026gt;“两个字符串全部删除了.多个之间用”|“符号隔开\u003c/p\u003e\n\u003cp\u003es前面的63,66为处理的行号,如果为一行的话,直接指定一个行号就可以了.这里使用了从63行到66行中间的数据,包括这两行.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003enginx.conf\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e下面的命令是用来配置nginx.conf文件的\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esed \u0026#39;2s/nobody/www/\u0026#39; /usr/local/nginx/conf/nginx.conf.default | sed \u0026#39;2s/#//g\u0026#39;| sed \u0026#39;64,71s/#//g\u0026#39; | sed …\u003c/code\u003e\u003c/pre\u003e"
July 22, 2011
用shell和php脚本实现定时检测服务器情况
"\u003cp\u003e实现原理,利用 cron来定时执行一个shell脚本,如果发现服务器不通或者上次故障后恢复正常,则发送邮件.否则不用发送邮件. 目前此Shell在FreeBSD和Linux下均可以正常运行.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eping.sh\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#!/bin/bash\nif [ $# -ne 1 ]\nthen\necho \u0026#39;must have one param,must be ip address format!\u0026#39;\nexit\nfi\n\nip=$1\ntmpfile=/tmp/$ip.txt\nif [ -f $tmpfile ]; then\nlastmsg=`cat $tmpfile`\nelse\nlastmsg=\u0026#39;YES\u0026#39;\nfi\n\nret=`ping -c 3 $ip | grep ttl | wc -l`\nif [ $ret -lt 2 ]; then\necho \u0026#39;NO\u0026#39; \u0026gt; $tmpfile\n/usr/local/bin/php /data/haohtml.com/www/ping.php $ip \u0026gt; /dev/null 2\u0026gt;\u0026amp;1\nelif [ …\u003c/code\u003e\u003c/pre\u003e"
July 21, 2011
Cannot access the Hardware Clock via any known method.的解决办法
"\u003cp\u003e今天在服务器上修改时间的进修,发现用date -s 21:45:12不起作用,提示"\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eCannot access the Hardware Clock via any known method.\nUse the --debug option to see the details of our search for an access method.\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e"错误,后来google了一下,有人说在64位平台的原因,说是一个bug的.\u003c/p\u003e\n\u003cp\u003e在执行clock -w 和hwclock命令的时候,总提示错误信息.这里介绍一种方法:\u003c/p\u003e\n\u003cp\u003e#tzselect\u003c/p\u003e\n\u003cp\u003e然后选择”5) Asia”,回车,选择国家" 9) China"回车,在选择的地区里选择"1) east China – Beijing, Guangdong, Shanghai, etc.",最后选择"1) Yes"对上面的设置进行确认即可.会提示以下信息,这时时间已经正常了.为了长久有效,可以添加到.profile文件里,我是添加到/etc/profile文件里了,不知道对否的.反正时间是过来了.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eYou can make this change …\u003c/code\u003e\u003c/pre\u003e"
July 21, 2011
一个简单的ping检测服务器状态的shell脚本
"\u003cp\u003e这个脚本特别的简单的,一次只能检测一个ip地址,可以放在crontab里定时检测.可以用来检测服务器状态情况.特别的实用的,如果有多个ip地址的话,可能必定一下,循环一下就可以了.\u003c/p\u003e\n\u003cp\u003e只有当不通或者宕机后恢复正常的时候才发送指定消息.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#!/bin/bash\nif [ $# -ne 1 ]\nthen\necho \u0026#39;must have one params ip address format!\u0026#39;\nexit\nfi\n\nip=$1\ntmpfile=$ip.txt\nif [ -f $tmpfile ]; then\nlastmsg=`cat $tmpfile`\nelse\nlastmsg=\u0026#39;YES\u0026#39;\nfi\n\nret=`ping -c 3 $ip | grep ttl | wc -l`\nif [ $ret -lt 2 ]; then\necho \u0026#39;NO\u0026#39; \u0026gt; $tmpfile\necho \u0026#39;send waring message!\u0026#39;\n//这里可以执行php脚本,用来 发送邮件信息\nelif [ $lastmsg = …\u003c/code\u003e\u003c/pre\u003e"
July 21, 2011
linux中的shell重定向
"\u003cp\u003e下面的shell 可不可以详细解释一下呀?\n(ls you no 2\u0026gt;\u0026amp;1;ls yes 2\u0026gt;\u0026amp;1) 2\u0026gt;\u0026amp;1|egrep * \u0026gt;file\n(ls you no 2\u0026gt;\u0026amp;1;ls yes 2\u0026gt;\u0026amp;1)|egrep * \u0026gt;file\n(ls you no;ls yes) 2\u0026gt;\u0026amp;1|egrep * \u0026gt;file\u003c/p\u003e\n\u003cp\u003e2\u0026gt;\u0026amp;1又是什么意思呀??\n在 shell中 \u0026gt;代表输出重定向\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e0表示标准输入\n1表示标准输出(默认值)\n2表示标准错误输出\n2\u0026gt;\u0026amp;1意思是:把 标准错误输出 重定向到 标准输出.\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003els xxx \u0026gt;out.txt 2\u0026gt;\u0026amp;1, 实际上可换成 ls xxx \u003cstrong\u003e1\u003c/strong\u003e\u0026gt;out.txt 2\u0026gt;\u0026amp;1;重定向符号\u0026gt;默认是1,错误和输出都传到out.txt了。\u003c/p\u003e\n\u003cp\u003e|:是管道,例子:\ncmd1 | cmd2 意思是:命令cmd1的标准输出座位cmd2的标准输入.\u003c/p\u003e\n\u003cp\u003e详细解释第三个命令行,(ls you no;ls yes) …\u003c/p\u003e"
July 20, 2011
linux中tail命令详解
"\u003cp\u003elinux中tail命令—用于查看文件内容\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e最基本的是cat、more和less。\u003c/strong\u003e\n1. 如果你只想看文件的前5行,可以使用head命令,如:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ehead -5 /etc/passwd\u003c/p\u003e\u003c/blockquote\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003e如果你想查看文件的后10行,可以使用tail命令,如:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cblockquote\u003e\n\u003cp\u003etail -2 /etc/passwd 或 tail -n 2 /etc/passwd\ntail -f /var/log/messages\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e参数-f使tail不停地去读最新的内容,这样有实时监视的效果 用Ctrl+c来终止!\n3. 查看文件中间一段,你可以使用sed命令,如:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003esed -n ‘5,10p’ /etc/passwd\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这样你就可以只查看文件的第5行到第10行。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003etail语法格式:\u003c/strong\u003e\ntail [ -f ] [ -c Number | -n Number | -m Number | -b Number | -k Number ] [ File ]\n或者\ntail [ -r ] [ -n Number ] [ File ]\n\u003cstrong\u003e使用说明:\u003c/strong\u003e\ntail 命令从指定点开始将 File 参数指定的文件写到标准输出。如果没有指定文件,则会使用标准输 …\u003c/p\u003e"
July 19, 2011
Linux的bg和fg命令
"\u003cp\u003e我们都知道,在 Windows 上面,我们要么让一个程序作为服务在后台一直运行,要么停止这个服务。而不能让程序在前台后台之间切换。而 Linux 提供了 fg 和 bg 命令,让我们轻松调度正在运行的任务。\u003c/p\u003e\n\u003cp\u003e假设你发现前台运行的一个程序需要很长的时间,但是需要干其他的事情,你就可以用 Ctrl-Z ,挂起这个程序,然后可以看到系统提示(方括号中的是作业号):\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[1]+ Stopped /root/bin/rsync.sh\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e然后我们可以把程序调度到后台执行:(bg 后面的数字为作业号)\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#bg 1\n[1]+ /root/bin/rsync.sh \u0026amp;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e用 jobs 命令查看正在运行的任务:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#jobs\n[1]+ Running /root/bin/rsync.sh \u0026amp;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e如果想把它调回到前台运行,可以用\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#fg 1\n/root/bin/rsync.sh\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这样,你在控制台上就只能等待这个任务完成了。\u003c/p\u003e\n\u003cp\u003efg、bg、jobs、\u0026amp;、ctrl + z都是跟系统任务有关的,虽然现在基本上不怎么需要用到这些命令,但学会了也是很实用的.\u003c/p\u003e\n\u003cp\u003e一。\u0026amp; 最经常被用到\n这个用在 …\u003c/p\u003e"
July 19, 2011
linux/unix中的nohup命令
"\u003cp\u003eUnix/Linux下一般比如想让某个程序在后台运行,很多都是使用 \u0026amp; 在程序结尾来让程序自动运行。比如我们要运行mysql在后台:\u003c/p\u003e\n\u003cp\u003e/usr/local/mysql/bin/mysqld_safe –user=mysql \u0026amp;\u003c/p\u003e\n\u003cp\u003e但是加入我们很多程序并不象mysqld一样做成守护进程,可能我们的程序只是普通程序而已,一般这种程序使用 \u0026amp;\u003c/p\u003e\n\u003cp\u003e结尾,但是如果终端关闭,那么程序也会被关闭。但是为了能够后台运行,那么我们就可以使用nohup这个命令,比如我们有个test.php需要在后台运行,并且希望在后台能够定期运行,那么就使用nohup:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003enohup /root/test.php \u0026amp;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e提示:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[~]$ appending output to nohup.out\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e嗯,证明运行成功,同时把程序运行的输出信息放到当前目录的 nohup.out 文件中去。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003enohup 命令\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e用途\u003c/strong\u003e:LINUX命令用法,不挂断地运行命令。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e语法\u003c/strong\u003e:nohup Command [ Arg … ] [ \u0026amp; ]\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e描述\u003c/strong\u003e:nohup 命令运行由 Command 参数和任何相关的 \u003ca href=\"http://baike.baidu.com/view/1476704.htm\"\u003eArg\u003c/a\u003e 参 …\u003c/p\u003e"
July 19, 2011
CentOS下安装lighttpd
"\u003cp\u003e在向大家详细介绍CentOS lighttpd安装之前,首先让大家了解下CentOS系统作用,然后全面介绍CentOS lighttpd安装,CentOS社区不断与其他的同类社区合并,使CentOS Linux逐渐成为使用最广泛的RHEL兼容版本。CentOS Linux的稳定性不比RHEL差,唯一不足的就是缺乏技术支持,因为它是由社区发布的免费版。希望对大家有用。\u003c/p\u003e\n\u003cp\u003eCentOS lighttpd安装\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewget \u003ca href=\"http://www.lighttpd.net/download/lighttpd-1.4.19.tar.gz\"\u003ehttp://www.lighttpd.net/download/lighttpd-1.4.19.tar.gz\u003c/a\u003e\ntar zxvf lighttpd*\ncd lightt*\n./configure –prefix=/usr/local/lighttpd –with-pcre\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eCentOS lighttpd安装这时候说缺少pcre-devel\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eyum install pcre-devel\n./configure –with-pcre\nmake\nmake install\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e在ubuntu下用apt-get install lighttpd来安装,方便了很多,CentOS …\u003c/p\u003e"
July 15, 2011
Please provide a path to MagickWand-config or Wand-config program的解决办法
"\u003cp\u003e今天在安装lnmp的时候,发现在安装imagick-3.0.1.tgz时,执行\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e./configure --with-php-config=/usr/local/php/bin/php-config\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e的时候,提示以下错误:\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003echecking for PHP includes… -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext\nchecking for PHP extension directory… /usr/lib64/php/modules\nchecking for PHP installed headers prefix… /usr/include/php\nchecking for re2c… no\nconfigure: WARNING: You will need re2c 0.9.11 or later if you want to regenerate PHP parsers.\nchecking …\u003c/code\u003e\u003c/pre\u003e"
July 13, 2011
nginx [emerg]: getpwnam(“www”) failed
"\u003cp\u003e在配置nginx提示如下错误时:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[emerg]: getpwnam(“www”) failed\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e解决方案:\u003c/strong\u003e\n在nginx.conf中 把#user nobdy改为user www www既可.\u003c/p\u003e\n\u003cp\u003e如果还提示同样的错误,请检查www组和www用户是否存在,不存在的话,直接创建即可\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/usr/sbin/groupadd www\n/usr/sbin/useradd -g www www\u003c/p\u003e\u003c/blockquote\u003e"
July 12, 2011
[教程]为PHP安装phpRedis扩展模块
"\u003cp\u003e\u003cstrong\u003e一.安装phpredis\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# wget \u003ca href=\"https://download.github.com/owlient-phpredis-2.1.1-1-g90ecd17.tar.gz\"\u003ehttps://download.github.com/owlient-phpredis-2.1.1-1-g90ecd17.tar.gz\u003c/a\u003e\n# tar -zxvf owlient-phpredis-2.1.1-1-g90ecd17.tar.gz\n# cd owlient-phpredis-2.1.1-1-g90ecd17\n# /usr/local/php/bin/phpize\n# ./configure –with-php-config=/usr/local/php/bin/php-config\n# make \u0026amp;\u0026amp; make install\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e修改php.ini文件,应用扩展\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# /usr/local/php/etc/php.ini\n加入:\nextension=redis.so\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e重启httpd\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# service httpd -k restart\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e我这里使用的是php-fpm模块运行的Nginx\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/usr/local/php/sbin/php-fpm restart\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e通过phpinfo()函数查看,可以看到redis扩展\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/07/phpredis.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/07/phpredis.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e如 …\u003c/p\u003e"
July 12, 2011
phpize简介
"\u003cp\u003ephpize 是属于 php-devel 中的东西,主要是设定 php 外挂模块的一些设定\u003c/p\u003e\n\u003cp\u003e所以安装 php-devel 相关套件就会有 phpize 可以使用 (档案预设存放于 /usr/bin/phpize )\u003c/p\u003e\n\u003cp\u003ephpize 命令是用来准备 PHP 外挂模块的编译环境的。下面例子中,外挂模块的源程序位于 extname 目录中:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e$ cd extname\n$ phpize\n$ ./configure (注一)\n$ make\n$ make install\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e成功的安装将建立 extname.so 并放置于 PHP 的外挂模块目录中 (预设存放于 /usr/lib/php/modules/ 内) 。\u003c/p\u003e\n\u003cp\u003e需要调整 php.ini,加入 extension=extname.so 这一行之后才能使用此外挂模块。\u003c/p\u003e\n\u003cp\u003e注一:\u003c/p\u003e\n\u003cp\u003e如在执行 ./configure 时出现 not find –with-php-config 时,\u003c/p\u003e\n\u003cp\u003e可重下以下指令,因 –with-php-config 预设在 /usr/bin/php-config 可找到\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e./configure …\u003c/strong\u003e\u003c/p\u003e"
July 11, 2011
统计apache日志中每日访问IP中访问量最多的100个IP
"\u003cp\u003e统计apache日志中每日访问IP中访问量最大的100个IP地址\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ecat access.log |awk ‘{print $1}’|sort|uniq -c|sort -nr|head -100 \u0026gt; 37res.txt\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e来源:\u003c/p\u003e"
July 9, 2011
升级centos内核
"\u003cp\u003e因要测试一些软件,需要2.6.30以上的内核,安装好CentOS 5.5,内核是2.6.18-194.el5.这次的升级还算比较顺利,具体的过程如下:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[root@localhost ~]# uname -r\n2.6.18-194.el5\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e1.下载linux-2.6.30内核包到/usr/src目录\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ecd /usr/src\nwget \u003ca href=\"ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.30.tar.gz\"\u003eftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.30.tar.gz\u003c/a\u003e\ntar -xzvf linux-2.6.30.tar.bz2 -C /usr/src\ncd linux-2.6.30\nmake mrproper 清除环境变量,即清除配置文件\nmake menuconfig 在菜单模式下选择需要编译的内核模块:\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003enetworking support—\u0026gt;networking options—\u0026gt;network packet filtering framework(netfilter)\u003c/p\u003e\n\u003cp\u003e(1).core netfilter configuration\nA 勾中”Netfilter …\u003c/p\u003e"
July 8, 2011
linux下 lvm 磁盘扩容
"\u003cp\u003e打算给系统装一个oracle,发现磁盘空间不足。在安装系统的时候我选择的是自动分区,系统就会自动以LVM的方式分区。为了保证系统后期的可用性,建议所有新系统安装都采用LVM,之后生产上的设备我也打算这样做。\u003c/p\u003e\n\u003cp\u003e参于LVM基本介绍与常用命令请参考:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/07/lvm-pic.bmp\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/07/lvm-pic.bmp\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/07/lvm.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/07/lvm.jpg\" alt=\"lvm\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eLVM结构图\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e扩容之前的磁盘状况\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[root@localhost ~]# df -h\u003c/p\u003e\n\u003cp\u003e文件系统 容量 已用 可用已用%%挂载点\u003c/p\u003e\n\u003cp\u003e/dev/mapper/VolGroup-lv_root 5.3G 2.5G 2.6G 50% /\u003c/p\u003e\n\u003cp\u003etmpfs 538M 0 538M 0% /dev/shm\u003c/p\u003e\n\u003cp\u003e/dev/sda1 485M 30M 430M 7% /boot\u003c/p\u003e\n\u003cp\u003e[root@localhost ~]# fdisk -l\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eDisk /dev/sda: 8589 MB, 8589934592 bytes\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e……………\u003c/p\u003e\n\u003cp\u003eDevice Boot Start End Blocks Id System …\u003c/p\u003e\u003c/blockquote\u003e"
July 8, 2011
centos下安装新硬盘
"\u003cp\u003e下面的操作是在vmware下进行的.使用的是scsi硬盘.\u003c/p\u003e\n\u003cp\u003e一.新添加一个硬盘后,用fdisk -l查看的时候,没有发现新硬盘,后台重启了下linux.再次使用fdisk -l命令即可看发现新添加的硬盘.新使用大小为5G.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/07/fdisk-l.bmp\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/07/fdisk-l.bmp\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e由于我们安装系统的时候用的一块scsi硬盘,SCSI接口设备是用sd命名的.所以第一块硬盘显示的是/dev/sda.当添加第二块scsi硬盘的时候,就成了/dev/sdb了.依次类推.如果使用的是 IDE 硬盘的话,则是 hda ,hdb,hdc…,同样依次类推.\u003c/p\u003e\n\u003cp\u003e二.使用fdisk进行分区\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#fdisk /dev/sdb\u003c/p\u003e\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eDevice contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel\nBuilding a new DOS disklabel. Changes will remain in memory only,\nuntil you decide to write them. After that, of course, the previous …\u003c/code\u003e\u003c/pre\u003e"
July 8, 2011
CentOS下lvm分区简介
"\u003cp\u003eLVM 是逻辑盘卷管理器( Logical Volume Manager )的简称,是一种分区管理机制。 LVM 是建立在硬盘 和分区 之上的一个逻辑层,为文件系统屏蔽下层磁盘分区布局,从而提高磁盘分区管理的灵活性。\u003c/p\u003e\n\u003cp\u003e要配置LVM,可以按以下步骤进行:\u003c/p\u003e\n\u003cp\u003e1. 创建和初始化物理卷(Physical Volume),通过pvcreate建立pv,即pv阶段;\u003c/p\u003e\n\u003cp\u003e2. 添加物理卷到卷组(Volume Group),使用vgcreate加入多个pv成为vg,即vg阶段;\u003c/p\u003e\n\u003cp\u003e3. 在卷组上创建逻辑卷(logical volume),使用lvcreate划分vg,成为一个或多个lv,即lv阶段;\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/07/lvm-pic.bmp\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/07/lvm-pic.bmp\" alt=\"\"\u003e\u003c/a\u003e 上图参考: \u003ca href=\"http://www.haohtml.com/server/unix/46733.html\"\u003ehttp://www.haohtml.com/server/unix/46733.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e具体思路是:将若干个磁盘分区连接为一个整块的卷组( Vloume group ),管理员可以在卷组上随意创建逻辑卷( logical volumes ),并进一步在逻辑卷上创建文件系统。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e物理卷( Physical Volume , PV )\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ePV 在 LVM 系统中处于最底层,PV 一般是整个硬盘、或硬 …\u003c/p\u003e"
July 4, 2011
Ubuntu 网络配置ip.重启
"\u003cp\u003e\u003cstrong\u003e(1)Ubuntu Server修改IP\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e配置文件地址 /etc/network/interfaces\u003c/p\u003e\n\u003cp\u003e使用编辑器打开\u003c/p\u003e\n\u003cp\u003e加入以下语句:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eauto eth0\niface eth0 inet static\naddress 192.168.1.11 #IP地址\nnetmask 255.255.255.0 #子网掩码\ngateway 192.168.1.1 #网关\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e(2)Ubuntu Server修改DNS\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e配置文件地址 /etc/resolv.conf\u003c/p\u003e\n\u003cp\u003e使用编辑器打开\u003c/p\u003e\n\u003cp\u003e改为如下内容:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003esearch localdomain\nnameserver 202.96.128.86 希望修改成的DNS\nnameserver 202.96.128.166 备用DNS\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e(3)Ubuntu Server最后一步,也是最重要的一步。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在rc.local里加入这个重启网络配置的命令:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003esudo /etc/init.d/networking restart\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e** (4) 设置主机名称(hostname)**\u003c/p\u003e\n\u003cp\u003e查看当前主机的主机名称:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003esudo /bin/hostname\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e修改名称:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003esudo …\u003c/p\u003e\u003c/blockquote\u003e"
June 30, 2011
is not in the sudoers file. This incident will be reported的解决办法
"\u003cp\u003e\u003cstrong\u003e在一般用户下执行sudo命令提示xxx is not in the sudoers file. This incident will be reported.解决方法:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e$whereis sudoers\n/etc/sudoers\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e有时候我们只需要执行一条root权限的命令也要su到root,是不是有些不方便?这时可以用sudo代替。默认新建的用户不在sudo组,需要编辑/etc/sudoers文件将用户加入,该文件只能使用visudo命令,\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e首先需要切换到root, su – (注意有- ,这和su是不同的,在用命令”su”的时候只是切换到root,但没有把root的环境变量传过去,还是当前用乎的环境变量,用”su -“命令将环境变量也一起带过去,就象和root登录一样)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e然后 visudo 或者 vim /etc/sudoers, visudo 这个和vi的用法一样,由于可能会有人不太熟悉vi,所以简要说一下步骤\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e移动光标,到一行 root ALL=(ALL) ALL 的下一行,添加一行\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eyour_user_name ALL=(ALL) ALL\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e然后保存退出! …\u003c/p\u003e"
June 29, 2011
linux的vm相关参数介绍
"\u003col\u003e\n\u003cli\u003e保证linux有足够的物理内存,可以调整vm的如下参数\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003evm.min_free_kbytes=409600;//默认值是3797,保证物理内存有足够空闲空间,防止突发性换页\nvm.vfs_cache_pressure=200;//默认是100,增大这个参数设置了虚拟内存回收directory和i-node缓冲的倾向,这个值越大。越易回收\nvm.swappiness=40 //缺省60,减少这个参数会使系统尽快通过swapout不使用的进程资源来释放更多的物理内存\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一般在rac的配置环境中配置这三个参数,可以防止换页引起节点短暂无响应,导致节点重启\u003c/strong\u003e\n2. 改善io系统的性能\novercommit_memory = 0\nvm.overcommit_ratio = 10 //默认值是50,用于虚拟内存的物理内存的百分比\nvm.dirty_ratio = 20 //默认值是40,为了保持稳定,持续的写入,把这个值调整的小一些,经验值是20\u003c/p\u003e\n\u003cp\u003evm.dirty_background_ratio //缺省数值是500,也就是5秒,如果系统要求稳定持续的写,可以适当降低该值,把峰值的写操作平均多 …\u003c/p\u003e"
June 28, 2011
在 CentOS 装 Git
"\u003cp\u003e在 Ubuntu 上安装 Git 非常的简单,只需要:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003esudo apt-get install git-core\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e但是 CentOS 默认的 yum 源中没有 Git,只能下载 RPM 包安装,确保已安装了依赖的包\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003esudo yum -y install curl curl-devel zlib-devel openssl-devel perl cpio expat-devel gettext-devel perl-ExtUtils-MakeMaker perl-CPAN tk\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e安装最新的 Git\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e$ wget \u003ca href=\"http://www.codemonkey.org.uk/projects/git-snapshots/git/git-latest.tar.gz\"\u003ehttp://www.codemonkey.org.uk/projects/git-snapshots/git/git-latest.tar.gz\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e$ tar xzvf git-latest.tar.gz\u003c/p\u003e\n\u003cp\u003e$ cd git-{date}\u003c/p\u003e\n\u003cp\u003e$ autoconf\u003c/p\u003e\n\u003cp\u003e$ ./configure –with-curl=/usr/local\u003c/p\u003e\n\u003cp\u003e$ make\u003c/p\u003e\n\u003cp\u003e$ sudo make install\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e检查版本\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e$ git –version\u003c/p\u003e\n\u003cp\u003egit version 1.7.3.GIT\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e常 …\u003c/strong\u003e\u003c/p\u003e"
June 27, 2011
在FreeBSD 8.1下搭建Git服务器
"\u003cp\u003eGit是一个由林纳斯•托瓦兹为了更好地管理linux内核开发而创立的分布式版本控制/软件配置管理软件。与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持,使源代码的发布和交流极其方便。 Git 的速度很快,这对于诸如 Linux kernel 这样的大项目来说自然很重要。 Git 最为出色的是它的合并跟踪(merge tracing)能力。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1、在FreeBSD8.1下安装Git服务器\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e(1)用ports安装Git\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecd /usr/ports/devel/git\nmake install clean\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e(2)修改/etc/rc.conf,让git随开机启动\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003egit_daemon_enable=”YES”\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e(3)新增使用者git\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epw useradd git\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e(4)启用git daemon\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e/usr/local/etc/rc.d/git_daemon start\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e(5)用sockstat 来验证git是否启动\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esockstt -4l | grep 9418\nroot git-daemon 37064 3 tcp4 …\u003c/code\u003e\u003c/pre\u003e"
June 26, 2011
FreeBSD下安装mysqli扩展[原创]
"\u003cp\u003e参考原来的文章:,后来发现程序使用的mysqli扩展没有安装,这里介绍安装方法.\u003c/p\u003e\n\u003cp\u003e此方法在FreeBSD8.2下,php5.2.17和php5.3.6均正常!\u003c/p\u003e\n\u003cp\u003e由于原来用的ports安装方法,默认的安装包下载到了/usr/ports/distfiles这个目录里了.这里直接使用,如果没有的话,请从网上下载一个安装包,但要注意一定要和已经安装过的php版本一样才可以.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一.找到mysqli所在位置\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ecd /usr/ports/distfiles/\ntar zxvf php-5.3.6.tar.gz\ncd php-5.3.6/ext/mysqli\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e二.安装mysqli\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/usr/local/bin/phpize\n————————–\nConfiguring for:\nPHP Api Version: 20090626\nZend Module Api No: 20090626\nZend Extension Api No: 220090626\nconfigure.in:3: warning: prefer named diversions\nconfigure.in:3: warning: …\u003c/p\u003e\u003c/blockquote\u003e"
June 23, 2011
详解Linux系统修改环境变量PATH路径的方法
"\u003cp\u003e**关于PATH的作用:\n** PATH说简单点就是一个字符串变量,当输入命令的时候LINUX会去查找PATH里面记录的路径。比如在根目录/下可以输入命令ls,在/usr目录下也可以输入ls,但其实ls这个命令根本不在这个两个目录下,事实上当你输入命令的时候LINUX会去/bin,/usr/bin,/sbin等目录下面去找你此时输入的命令,而PATH的值恰恰就是/bin:/sbin:/usr/bin:……。其中的冒号使目录与目录之间隔开。\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e**关于新增自定义路径:\n** 现在假设你新安装了一个命令在/usr/locar/new/bin下面,而你又想像ls一样在任何地方都使用这个命令,你就需要修改环境变量PATH了,准确的说就是给PATH增加一个值/usr/locar/new/bin。你只需要一行bash命令export PATH=$PATH:/usr/locar/new/bin。这条命令的意思太清楚不过了,使PATH自增:/usr/locar/new/bin,既PATH=PATH+”:/usr/locar/new/bin”;通常的做法是把这行bash命令写到/root/.bashrc …\u003c/p\u003e"
June 21, 2011
centos下安装RabbitMQ消息队列
"\u003cp\u003e这里环境为centos7 64位.\n一。安装erlang\u003c/p\u003e\n\u003cp\u003e[shell]su -c ‘rpm -Uvh \u003ca href=\"http://download.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm\"\u003ehttp://download.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm\u003c/a\u003e’\nsudo yum install erlang[/shell]\u003c/p\u003e\n\u003cp\u003e二。安装rabbitmq\u003c/p\u003e\n\u003cp\u003e我们是用CentOS7(RHEL7也一样),可以从这里: \u003ca href=\"http://fedoraproject.org/wiki/EPEL/FAQ#howtouse\"\u003ehttp://fedoraproject.org/wiki/EPEL/FAQ#howtouse\u003c/a\u003e 找到安装有erlang的RHEL7(CentOS同)软件仓库并安装:\u003c/p\u003e\n\u003cp\u003e[shell]\nwget -c \u003ca href=\"http://www.rabbitmq.com/releases/rabbitmq-server/v3.5.0/rabbitmq-server-3.5.0-1.noarch.rpm\"\u003ehttp://www.rabbitmq.com/releases/rabbitmq-server/v3.5.0/rabbitmq-server-3.5.0-1.noarch.rpm\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003esudo rpm –import \u003ca href=\"http://www.rabbitmq.com/rabbitmq-signing-key-public.asc\"\u003ehttp://www.rabbitmq.com/rabbitmq-signing-key-public.asc\u003c/a\u003e\nsudo yum install …\u003c/p\u003e"
June 20, 2011
老生常谈: ulimit问题及其影响
"\u003cp\u003eulimit最初设计是用来限制进程对资源的使用情况的,因为早期的系统系统资源包括内存,CPU都是非常有限的,系统要保持公平,就要限制大家的使用,以达到一个相对公平的环境。以下是典型的机器默认的限制情况:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ ulimit -a\ncore file size (blocks, -c) 0\ndata seg size (kbytes, -d) unlimited\nscheduling priority (-e) 0\nfile size (blocks, -f) unlimited\npending signals (-i) 204800\nmax locked memory (kbytes, -l) 32\nmax memory size (kbytes, -m) unlimited\nopen files (-n) 1024\npipe size (512 bytes, -p) 8 …\u003c/code\u003e\u003c/pre\u003e"
June 17, 2011
iostat来对linux硬盘IO性能进行了解
"\u003cp\u003e以前一直不太会用这个参数。现在认真研究了一下iostat,因为刚好有台重要的服务器压力高,所以放上来分析一下.下面这台就是IO有压力过大的服务器\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$iostat -x 1\nLinux 2.6.33-fukai (fukai-laptop) _i686_ (2 CPU)\navg-cpu: %user %nice %system %iowait %steal %idle\n 5.47 0.50 8.96 48.26 0.00 36.82\n\nDevice: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util\nsda 6.00 273.00 99.00 7.00 2240.00 2240.00 42.26 1.12 10.57 7.96 84.40\nsdb 0.00 …\u003c/code\u003e\u003c/pre\u003e"
June 16, 2011
Linux系统设置–ulimit
"\u003cp\u003e**功能说明:**控制shell程序的资源。\u003c/p\u003e\n\u003cp\u003e**语 法:**ulimit [-aHS][-c ][-d \u0026lt;数据节区大小\u0026gt;][-f \u0026lt;文件大小\u0026gt;][-m \u0026lt;内存大小\u0026gt;][-n \u0026lt;文件数目\u0026gt;][-p \u0026lt;缓冲区大小\u0026gt;][-s \u0026lt;堆叠大小\u0026gt;][-t ][-u \u0026lt;程序数目\u0026gt;][-v \u0026lt;虚拟内存大小\u0026gt;]\u003c/p\u003e\n\u003cp\u003e**补充说明:**ulimit为shell内建指令,可用来控制shell执行程序的资源。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e参 数:\u003c/strong\u003e\n-a 显示目前资源限制的设定。\n-c 设定core文件的最大值,单位为区块。\n-d \u0026lt;数据节区大小\u0026gt; 程序数据节区的最大值,单位为KB。\n-f \u0026lt;文件大小\u0026gt; shell所能建立的最大文件,单位为区块。\n-H 设定资源的硬性限制,也就是管理员所设下的限制。\n-m \u0026lt;内存大小\u0026gt; 指定可使用内存的上限,单位为KB。\n-n \u0026lt;文件数目\u0026gt; 指定同一时间最多可开启的文件数。\n-p \u0026lt;缓冲区大小\u0026gt; 指定管道缓冲区的大小,单位512字节。 …\u003c/p\u003e"
June 15, 2011
Linux下的Memcache安装
"\u003cp\u003e服务器端主要是安装memcache服务器端,目前的最新版本是 memcached-1.3.0 。\n下载:http://www.danga.com/memcached/dist/memcached-1.2.2.tar.gz\n另外,Memcache用到了libevent这个库用于Socket的处理,所以还需要安装libevent,libevent的最新版本是libevent-1.3。(如果你的系统已经安装了libevent,可以不用安装)\n官网: \u003ca href=\"http://www.monkey.org/~provos/libevent/\"\u003ehttp://www.monkey.org/~provos/libevent/\u003c/a\u003e\n下载: \u003ca href=\"http://www.monkey.org/~provos/libevent-1.3.tar.gz\"\u003ehttp://www.monkey.org/~provos/libevent-1.3.tar.gz\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e用wget指令直接下载这两个东西.下载回源文件后。\n1.先安装libevent。这个东西在配置时需要指定一个安装路径,即./configure –prefix=/usr;然后make;然后make install;\u003c/p\u003e\n\u003cp\u003e2.再安装memcached,只是需要在配置时需要指定libevent的安装路径即./configure –with-libevent=/usr;然 …\u003c/p\u003e"
June 15, 2011
windows下网络测试的好工具:NTttcp和NetCPS
"\u003cp\u003e网上的免费网络测试工具很多,在这里,我将向大家介绍两款优秀的网络测试工具,可以帮助大家便捷的进行网络性能测试。这两款工具即 NTttcp 和 NetCPS。\n——————————————————————————————–\u003c/p\u003e\n\u003cp\u003e在上次专题文章中,我向大家介绍了优秀的开源软件 iperf,以及如何用它来快速进行网络性能测试。之后我收到了很多TechRepublic读者的反馈,向我推荐或询问同类的优秀软件,因此在本期文章中,我再向各位推荐两款类似的工具软件,即微软的Network Performance Tool (NTttcp)以及 NetChain的 NetCPS.\u003c/p\u003e\n\u003cp\u003eMicrosoft的 NTttcp 测试工具可以说是iperf的强化版本,并且针对Windows环境进行了优化。 NTttcp的优势在于它可以根据网络任务调整CPU使用率,并且支持多核CPU。另外,NTttcp针对不同系统平台拥有不同的版本,如32-bit (x86)版本, 64-bit (x64)版本,以及IA-64版本。使用Windows XP, Windows Server 2003, Windows Vista, …\u003c/p\u003e"
June 15, 2011
Linux环境变量的设置和查看方法
"\u003cp\u003e\u003cstrong\u003e1. 显示环境变量HOME\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e$ echo $HOME\u003c/p\u003e\n\u003cp\u003e/home/redbooks\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2. 设置一个新的环境变量hello\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e$ export HELLO=”Hello!”\u003c/p\u003e\n\u003cp\u003e$ echo $HELLO\u003c/p\u003e\n\u003cp\u003eHello!\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3. 使用env命令显示所有的环境变量\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e$ env\u003c/p\u003e\n\u003cp\u003eHOSTNAME=redbooks.safe.org\u003c/p\u003e\n\u003cp\u003ePVM_RSH=/usr/bin/rsh\u003c/p\u003e\n\u003cp\u003eShell=/bin/bash\u003c/p\u003e\n\u003cp\u003eTERM=xterm\u003c/p\u003e\n\u003cp\u003eHISTSIZE=1000\u003c/p\u003e\n\u003cp\u003e…\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e4. 使用set命令显示所有本地定义的Shell变量\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e$ set\u003c/p\u003e\n\u003cp\u003eBASH=/bin/bash\u003c/p\u003e\n\u003cp\u003eBASH_VERSINFO=([0]=”2″[1]=”05b”[2]=”0″[3]=”1″[4]=”release”[5]=”i386-redhat-linux-gnu”)\u003c/p\u003e\n\u003cp\u003eBASH_VERSION=’2.05b.0(1)-release’\u003c/p\u003e\n\u003cp\u003eCOLORS=/etc/DIR_COLORS.xterm\u003c/p\u003e\n\u003cp\u003eCOLUMNS=80\u003c/p\u003e\n\u003cp\u003eDIRSTACK=()\u003c/p\u003e\n\u003cp\u003eDISPLAY=:0.0\u003c/p\u003e\n\u003cp\u003e…\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e5. 使用unset命令来清除环境变量\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eset可以设置某个环境变量的值。清除环境变 …\u003c/p\u003e"
June 15, 2011
Linux下使用Iptraf进行网络流量的分析
"\u003cp\u003e下面的教程我个人安装的时候,总是失败,在/usr/local/bin目录里没有iptraf这个文件,没有办法直接用\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eyum -y install iptraf\u003c/strong\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e命令安装成功了.\u003c/p\u003e\n\u003cp\u003eIptraf是一款Linux环境下,监控网络流量的一款绝佳的免费小软件,特别是安装到防火墙上,与Iptables一起工作,监控流经防火墙的网络异常,效果非常好。\u003c/p\u003e\n\u003cp\u003e我的安装配置环境是redhat 9.0\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、软件下载\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eIptraf的最新版本是2.7.0,可以从下面的地址下载\u003ca href=\"ftp://iptraf.seul.org/pub/Iptraf/\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二、安装环境需要\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e— gcc 2.7.2.3 or later\u003c/p\u003e\n\u003cp\u003e— GNU C (glibc) development library 2.1 or later\u003c/p\u003e\n\u003cp\u003e— ncurses development libraries 4.2 or later\u003c/p\u003e\n\u003cp\u003e可以在Linux下执行:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# rpm -qa | grep gcc\u003c/p\u003e\n\u003cp\u003e# rpm -qa | grep glibc\u003c/p\u003e\n\u003cp\u003e# rpm -qa | grep ncurses\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e如果没有,则请安装。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e三、安装\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e从网站下载软件包,将下载得到的Iptraf-2.7.0.tar.gz上传到你所要安装的机器上,我 …\u003c/p\u003e"
June 13, 2011
CentOS 5.5 Nginx+JDK+MySQL+Tomcat(jsp)
"\u003cp\u003e\u003cstrong\u003e一.安装Nginx\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/archives/6051\"\u003ehttp://blog.haohtml.com/archives/6051\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e二.安装jdk\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/archives/9765\"\u003ehttp://blog.haohtml.com/archives/9765\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e三、安装apache tomcat\u003c/strong\u003e\n1、下载apache tomcat并安装tomcat\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewget \u003ca href=\"http://labs.renren.com/apache-mirror/tomcat/tomcat-7/v7.0.14/bin/apache-tomcat-7.0.14.tar.gz\"\u003ehttp://labs.renren.com/apache-mirror/tomcat/tomcat-7/v7.0.14/bin/apache-tomcat-7.0.14.tar.gz\u003c/a\u003e\ntar zxvf apache-tomcat-7.0.14.tar.gz\nmv apache-tomcat-7.0.14 /usr/local/tomcat\ncp -rf /usr/local/tomcat/webapps/* /www/\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e2、配置tomcat的server.xml文件,并启动或停止tomcat\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#vim /usr/local/tomcat/conf/server.xml\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e查找appBase=”webapps”,修改为appBase=”/www”,其中/www 即为网页的根目录。\n安装完成后,启 …\u003c/p\u003e"
June 13, 2011
CentOS下配置Java环境JDK
"\u003cp\u003e**第一步:**查看Linux自带的JDK是否已安装 (卸载centOS已安装的1.4)\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026lt;1\u0026gt;# rpm -qa|grep jdk ← 查看jdk的信息或直接执行\n或\n# rpm -q jdk\u003c/p\u003e\n\u003cp\u003e或\n# java -version\n# rpm -qa | grep gcj ← 确认gcj的版本号\n# yum -y remove java-1.4.2-gcj-compat ← 卸载gcj\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e第二步:安装JDK\u003c/strong\u003e\n\u003cem\u003e\u0026lt;1\u0026gt;从SUN下载jdk-1_5_0_14-linux-i586-rpm.bin或jdk-1_5_0_14-linux-i586.bin\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003ejdk1.6的下载地址:\n在/usr下新建java文件夹,将安装包放在/usr/java目录下\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# mkdir /usr/java\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cem\u003e\u0026lt;2\u0026gt;安装JDK\u003c/em\u003e\n# cd /usr/java\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e①jdk-1_5_0_14-linux-i586-rpm.bin文件安装\n# chmod 777 …\u003c/p\u003e\u003c/blockquote\u003e"
June 12, 2011
数据中心TCP优化:同时满足低时延和高吞吐量
"\u003cp\u003e大的数据中心有成千上万台服务器,服务器之间大都用TCP来协作并传输数据,最终为用户提供服务。那数据中心的TCP工作得如何呢? 斯坦福大学和微软的两人对Bing服务的6000多台服务器集群在TCP方面的数据进行研究,用的数据是一个月的日志,包括应用、套接字级别和包级别的日志,压缩完后大概是150T的数据。老外真是牛!\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、发现的问题\u003c/strong\u003e\n1、突发的丢包现象\n2、部分包传输时延大,90%的传输RTT值小于1毫秒,10%的RTT值在1到15毫秒之间\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二、可能的原因\u003c/strong\u003e\n交换机是是先存储后转发数据包的,在一个端口上缓冲的数据包太多时,会有两种结果,一是交换机会丢掉新过来的包,二是已经缓冲的包的转发时延变大。这就是造成上面问题的原因。\u003c/p\u003e\n\u003cp\u003e下面是两种场景,第一种是如下图:\n\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/06/tcp_worker1.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/06/tcp_worker1-300x198.png\" alt=\"\"\u003e\u003c/a\u003e\n多台工作机器把数据发给一台负责聚合的机器,这个有时会造成聚合机器所连接的交换机端口上缓冲太多的数据包,因缓冲区不多了而丢弃新收到的包。这些有些工作机器会出现超时重发。\u003c/p\u003e\n\u003cp\u003e另一种场景如下图:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/06/tcp_send_receiver2.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/06/tcp_send_receiver2.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e两种机器同时给另一台机器发数据,其中一台发送的数据量很大,这样使得接收者上连的交换机端口缓冲区缓冲了大量数据包,使得另一个发送者发送的少量数据包产生 …\u003c/p\u003e"
June 9, 2011
CentOS访问Windows共享文件夹的两种方法
"\u003cp\u003e\u003cstrong\u003e1 在地址栏中输入下面内容:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003esmb://Windows IP/Share folder name\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003esmb为Server Message Block协议的简称,是一种IBM协议,运行在TCP/IP协议之上。\u003c/p\u003e\n\u003cp\u003e从Windows 95开始,Microsoft Windows都提供了Server和Client的SMB协议支持,Microsoft为Internet提供了SMB开源版本,及CIFS(Common Internet File System),通用文件系统。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2 将Windows的共享文件夹挂载到本地\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在终端中输入命令:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003emount -t cifs -o username=”Admin”,password=”” //192.168.1.1/ShareFolder /mnt/MyShare\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e注意命令行中的空格和逗号,空密码也可以。\u003c/p\u003e\n\u003cp\u003e此命令就是将192.168.1.1上的共享文件夹ShareFolder 挂载到本地的/mnt/MyShare文件夹,执行完,就可在MyShare里看到ShareFolder里的内容。\u003c/p\u003e\n\u003cp\u003e删除挂载用命令:umount /mnt/MyShare\u003c/p\u003e\n\u003cp\u003e摘自:\u003c/p\u003e"
June 9, 2011
[教程]centos连接windows远程桌面
"\u003cp\u003e大家都知道linux下都是用rdesktop来连接windows的远程桌面。注意只能在centos下的gui模式下运行,如果在cli下运行,则会提示以下错误:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAutoselected keyboard map en-us\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eERROR: Failed to open display:\u003c/p\u003e\n\u003cp\u003e所以先安装rdesktop\u003c/p\u003e\n\u003cp\u003e可以通过yum list看看有没有rdesktop包,可以看到有rdesktop.i386-1.4.1-4\u003c/p\u003e\n\u003cp\u003e下面我们直接安装:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eshell\u0026gt; yum install rdesktop.i386\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e----过程省略—-\u003c/p\u003e\n\u003cp\u003e安装完成后我们直接用\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eshell\u0026gt; rdesktop -a 16 192.168.1.5:3389来连接windows远程桌面。 -a 16表示用16位颜色打开桌面,后面的ip地址是windows服务器地址 :3389是windows的远程桌面的端口号,其实默认的3389可以省略,如果调整了windows远程桌面的端口,这里就必须带上。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e整个地球都知道rdesktop,有了它,我们可以从Solaris或者Linux使用Windows,当 …\u003c/p\u003e"
June 9, 2011
为CentOS配置snmp代理(转)
"\u003cp\u003e切换到系统管理员帐户\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e安装snmp\u003c/strong\u003e\n确认snmp代理已安装\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003erpm -q net-snmp\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e如果未安装,安装snmp\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eyum install net-snmp\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e设置开机自动运行snmp\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/sbin/chkconfig snmpd on\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e配置snmp\u003c/strong\u003e\n编辑/etc/snmp/snmpd.conf\u003c/p\u003e\n\u003cp\u003e更改团体名\n查找如下行\n# sec.name source community\ncom2sec notConfigUser default public\n将团体名public改为其它任意字段,例:\ncom2sec notConfigUser default monit\u003c/p\u003e\n\u003cp\u003e给予可读权限\n查找如下行\n# group context sec.model sec.level prefix read write notif\naccess notConfigGroup “” any noauth exact systemview none none\n将read权限systemview改为all,例:\naccess notConfigGroup “” any noauth exact all none …\u003c/p\u003e"
June 9, 2011
linux ifstat网卡流量监测
"\u003cp\u003e在Linux/Unix监控系统网卡的实时流量,iftop是个不错的选择她可以详细到来源和目标及端口,iftop相比ifstat信息更加的丰富,但是如果只监控网卡的流量ifstat当然是最佳选择,可以从下载,她还提供了window版本。\u003c/p\u003e\n\u003cp\u003e安装方法: \u003ca href=\"http://blog.haohtml.com/archives/9671\"\u003ehttp://blog.haohtml.com/archives/9671\u003c/a\u003e\nifstat——–报告接口状态,是一个网络流量监测程序。能查看网卡的流出和流入的字节.\n**简单描述:**ifstat就像iostat/vmstat描述其它的系统状况一样,是一个统计网络接口活动状态的工具\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e参数:\u003c/strong\u003e\n-l 监测环路网络接口(lo)。缺省情况下,ifstat监测活动的所有非环路网络接口。经使用发现,加上-l参数能监测所有的网络接口的信息,而不是只监测lo的接口信息,也就是说,加上-l参数比不加-l参数会多一个lo接口的状态信息。\u003c/p\u003e\n\u003cp\u003e-a 监测能检测到的所有网络接口的状态信息。使用发现,比加上-l参数还多一个plip0的接口信息,搜索一下发现这是并口(网络设备中有一个叫PLIP (Parallel Line Internet Protocol). 它提供 …\u003c/p\u003e"
June 8, 2011
FreeBSD下安eaccelerator
"\u003cblockquote\u003e\n\u003cp\u003e# cd /usr/ports/www/eaccelerator\n#make install clean\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e安装完会提示在/usr/local/etc/php.ini文件末尾添加一行zend_extension=”/usr/local/lib/php/20090626/eaccelerator.so”,并创建临时目录/tmp/eaccelerator.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#echo ‘zend_extension=”/usr/local/lib/php/20090626/eaccelerator.so”‘ \u0026raquo; /usr/local/etc/php.ini\n#mkdir /tmp/eaccelerator\n#chown www /tmp/ eaccelerator\n#chmod 0700 /tmp/eaccelerator\u003c/p\u003e\u003c/blockquote\u003e"
June 7, 2011
apache的日志级别和设置
"\u003cp\u003e\u003cstrong\u003e1.emerg\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e紧急 – 系统无法使用。\u003c/p\u003e\n\u003cp\u003e“Child cannot open lock file. Exiting”\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2.alert\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e必须立即采取措施。\u003c/p\u003e\n\u003cp\u003e“getpwuid: couldn’t determine user name from uid”\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3.crit\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e致命情况。\u003c/p\u003e\n\u003cp\u003e“socket: Failed to get a socket, exiting child”\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e4.error\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e错误情况。\u003c/p\u003e\n\u003cp\u003e“Premature end of script headers”\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e5.warn\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e警告情况。\u003c/p\u003e\n\u003cp\u003e“child process 1234 did not exit, sending another SIGHUP”\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e6.notice\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e一般重要情况。\u003c/p\u003e\n\u003cp\u003e“httpd: caught SIGBUS, attempting to dump core in …”\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e7.info\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e普通信息。\u003c/p\u003e\n\u003cp\u003e“Server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers)…”\u003c/p\u003e"
June 7, 2011
解决Apache出现的CPU高占用率的问题
"\u003cp\u003e所谓Apache出现CPU高占用率就是指Apache在一段时间内持续占用很高的CPU使用率,甚至达到CPU100%,这个时候造成网站无法访问。解决的方法就是仔细观察Apache的日志文件,查阅错误的信息。\u003c/p\u003e\n\u003cp\u003e我个人试了一下启用了\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eEnableSendfile Off\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e暂时解决了,\u003c/p\u003e\n\u003cp\u003e下面我们针对几种错误信息进行分析并给出解决的方法:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1. Apache与WinSock v2相冲突\u003c/strong\u003e\n\u003ca href=\"http://httpd.apache.org/docs/2.0/mod/mpm_winnt.html\"\u003eApache官方提供的手册\u003c/a\u003e 中提到,在Windows系统下Apache2.x为了提高性能而使用了Microsoft WinSock v2 API,但是一些常见的防火墙软件会破坏他的正确性,从而使得Apache出现死循环操作造成CPU100%。\u003c/p\u003e\n\u003cp\u003e其错误提示如下所示:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[error] (730038)An operation was attempted on something that is not a socket.: winnt_accept: AcceptEx failed. Attempting to recover.\u003c/p\u003e\n\u003cp\u003e[error] (OS 10038) : Child 3356: …\u003c/p\u003e\u003c/blockquote\u003e"
June 6, 2011
FreeBSD下Ports文件目录介绍
"\u003cp\u003e当提到 Ports Collection 时, 第一个要说明的就是何谓 “skeleton”。 简单地说, port skeleton 是让一个程序在 FreeBSD 上简洁地编译并安装的所需文件的最小组合。 每个 port skeleton 包含:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e一个 \u003ccode\u003eMakefile\u003c/code\u003e。 \u003ccode\u003eMakefile\u003c/code\u003e 包括好几个部分, 指出应用程序是如何编译以及将被安装在系统的哪些地方。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e一个 \u003ccode\u003edistinfo\u003c/code\u003e 文件。这个文件包括这些信息: 这些文件用来对下载后的文件校验和进行检查 (使用 \u003ca href=\"http://www.freebsd.org/cgi/man.cgi?query=sha256\u0026amp;sektion=1\"\u003esha256(1)\u003c/a\u003e), 来确保在下载过程中文件没有被破坏。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e一个 \u003ccode\u003efiles\u003c/code\u003e 目录。 这个目录包括在 FreeBSD 系统上编译和安装程序需要用到的补丁。 这些补丁基本上都是些小文件, 指出特定文件作了哪些修正。 它们都是纯文本的的格式,基本上是这样的 “删除第 10 行” 或 “将第 26 行改为这样 …”, 补丁文件也被称作 “diffs”, 他们由 \u003ca href=\"http://www.freebsd.org/cgi/man.cgi?query=diff\u0026amp;sektion=1\"\u003ediff(1)\u003c/a\u003e程序生成。\n这个目录也包含了在编译 port 时要用到的其它文件。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e一个 \u003ccode\u003epkg-descr\u003c/code\u003e 文件。 这是一个提供更多细节,有软件的多行描 …\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e"
June 6, 2011
ifstat命令行统计网络流量
"\u003cp\u003e早上在BSD区问了个关于统计网络流量的问题,我喜欢用命令行方式查看,斑竹大人指点–\u0026gt;ifstat . ^_^ 现在将方法写出来:\u003c/p\u003e\n\u003cp\u003e下载 ifstat , \u003ca href=\"http://gael.roualland.free.fr/ifstat/ifstat-1.1.tar.gz\"\u003ehttp://gael.roualland.free.fr/ifstat/ifstat-1.1.tar.gz\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewget \u003ca href=\"http://gael.roualland.free.fr/ifstat/ifstat-1.1.tar.gz\"\u003ehttp://gael.roualland.free.fr/ifstat/ifstat-1.1.tar.gz\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003etar xzvf ifstat-1.1.tar.gz\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003ecd ifstat-1.1\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e./configure\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003emake\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003emake install\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e都是老套路,别和我说你没装gcc .\u003c/p\u003e\n\u003cp\u003e然后 man ifstat\u003c/p\u003e\n\u003cp\u003e-t 显示时间 格式:HH:MM:SS\u003c/p\u003e\n\u003cp\u003e-i 指定的网卡 ,如果有多块网卡 以”,”分隔\u003c/p\u003e\n\u003cp\u003e-T 显示所有接口的带宽.\u003c/p\u003e\n\u003ch1 id=\"ifstat--t--i-tun0tun1--t\"\u003eifstat -t -i tun0,tun1 -T\u003c/h1\u003e\n\u003cp\u003eTime tun0 tun1 Total\u003c/p\u003e\n\u003cp\u003eHH:MM:SS KB/s in KB/s out KB/s …\u003c/p\u003e"
June 1, 2011
iostat来对linux硬盘IO性能进行检测
"\u003cp\u003e近期公司安装了几台DELL PE2650和2850的服务器,统一安装的是RHLE5.132位系统,而服务器的SCSI硬盘都统一做了raid1。公司老总要求对硬盘IO作统一检测报告,在Linux下找了许多工具,发现最实用的还是iostat,这个需要先安装sysstat ,即\u003cstrong\u003eyum -y install sysstat\u003c/strong\u003e;公司内部的yum服务器搭建这个不是本文的重点,这里不作详细叙述。\u003c/p\u003e\n\u003cp\u003e# iostat -x 1 10\nLinux 2.6.18-92.el5xen 03/01/2010\navg-cpu: %user %nice %system %iowait %steal %idle\n1.10 0.00 4.82 39.54 0.07 54.46\nDevice: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util\nsda 0.00 3.50 0.40 2.50 5.60 48.00 18.48 0.00 0.97 …\u003c/p\u003e"
June 1, 2011
Linux IO性能测试
"\u003cp\u003e近来想了解一下开发环境的IO性能,分别用dd/orion/iozone/bonnie++四种工具测试了一下\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e开发环境系统配置如下:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eIntel SR1625 server, 2 CPU, 32GB内存, 用主板自带卡做了raid1+0,8个7200转SATA硬盘\u003c/p\u003e\n\u003cp\u003e操作系统是RHEL 5.3 64位\u003c/p\u003e\n\u003cp\u003e因为物理内存是32GB,因此整个过程都选用了60GB+的数据量来测试,以避免cache的影响\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1. 首先用自带的dd命令先测一下, 块大小为8k\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003edd只能提供一个大概的测试结果,而且是连续IO而不是随机IO\u003c/p\u003e\n\u003cp\u003e读测试\u003c/p\u003e\n\u003cp\u003etime dd if=/dev/sda2 f=/dev/null bs=8k count=8388608\u003c/p\u003e\n\u003cp\u003e8388608+0 records in\u003c/p\u003e\n\u003cp\u003e8388608+0 records out\u003c/p\u003e\n\u003cp\u003e68719476736 bytes (69 GB) copied, 516.547 seconds, 133 MB/s\u003c/p\u003e\n\u003cp\u003ereal 8m36.926s\u003c/p\u003e\n\u003cp\u003euser 0m0.117s\u003c/p\u003e\n\u003cp\u003esys 0m55.216s\u003c/p\u003e\n\u003cp\u003e写测试\u003c/p\u003e\n\u003cp\u003etime dd if=/dev/zero …\u003c/p\u003e"
May 28, 2011
FreeBSD/Linux检测硬盘坏道 第二篇
"\u003cp\u003eLinux认证:FreeBSD/Linux检测硬盘坏道,$badblocks -s //显示进度 -w //以写去检测 -v //显示执行详细情况 /dev/sda2\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eLinux检测硬盘坏道\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ebadblocks功能说明:检查磁盘装置中损坏的区块。\u003c/p\u003e\n\u003cp\u003e语法:badblocks [-svw][-b ][-o ][磁盘装置][磁盘区块数][启始区块]\u003c/p\u003e\n\u003cp\u003e补充说明:执行指令时须指定所要检查的磁盘装置,及此装置的磁盘区块数。\u003c/p\u003e\n\u003cp\u003e参数:\u003c/p\u003e\n\u003cp\u003e-b 指定磁盘的区块大小,单位为字节。\u003c/p\u003e\n\u003cp\u003e-o 将检查的结果写入指定的输出文件。\u003c/p\u003e\n\u003cp\u003e-s 在检查时显示进度。\u003c/p\u003e\n\u003cp\u003e-v 执行时显示详细的信息。\u003c/p\u003e\n\u003cp\u003e-w 在检查时,执行写入测试。\u003c/p\u003e\n\u003cp\u003e[磁盘装置] 指定要检查的磁盘装置。\u003c/p\u003e\n\u003cp\u003e[磁盘区块数] 指定磁盘装置的区块总数。\u003c/p\u003e\n\u003cp\u003e[启始区块] 指定要从哪个区块开始检查。\u003c/p\u003e\n\u003cp\u003ebadblocks 检测磁盘坏块\u003c/p\u003e\n\u003cp\u003e1)$badblocks -s //显示进度 -v //显示执行详细情况 /dev/sda1\u003c/p\u003e\n\u003cp\u003e2)读写方式检测 未挂载的磁盘设备或分区\u003c/p\u003e\n\u003cp\u003e$badblocks -s //显示进度 -w //以写去检测 -v //显示执行详细情况 /dev/sda2 …\u003c/p\u003e"
May 28, 2011
configure: error: mcrypt.h not found. Please reinstall libmcrypt
"\u003cp\u003e今日参考以前的文章安装lnmp的时候,发现这次在安装php的时候竟然提示”configure: error: mcrypt.h not found. Please reinstall libmcrypt”,意思是,没有查找到mcrytp.h,需要安装libcrytp,以前安装了n次都没有问题的,在网上找了一个解决办法.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewget \u003ca href=\"ftp://mcrypt.hellug.gr/pub/crypto/mcrypt/attic/libmcrypt/libmcrypt-2.5.7.tar.gz\"\u003eftp://mcrypt.hellug.gr/pub/crypto/mcrypt/attic/libmcrypt/libmcrypt-2.5.7.tar.gz\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003etar -zxvf libmcrypt-2.5.7.tar.gz\ncd libmcrypt-2.5.7\nmkdir -p /usr/local/libmcrytp\n./configure prefix=/usr/local/libmcrytp/\nmake\nmake install\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e然后再安装PHP\u003c/p\u003e"
May 28, 2011
linux的mount(挂载)命令详解
"\u003cp\u003e**点评:**linux下挂载(mount)光盘镜像文件、移动硬盘、U盘、Windows和NFS网络共享 linux是一个优秀的开放源码的操作系统,可以运行在大到巨型小到掌上型各类计算机系统上,随着 linux系统的日渐成熟和稳定以及它开放源代码特有的优越性,linux在全世界得到了越来越广泛的linux下挂载(mount)光盘镜像文件、移动硬盘、U盘、Windows和NFS网络共享.\nlinux是一个优秀的开放源码的操作系统,可以运行在大到巨型小到掌上型各类计算机系统上,随着 linux系统的日渐成熟和稳定以及它开放源代码特有的优越性,linux在全世界得到了越来越广泛的应用。现在许多企业的计算机系统都是由UNIX系 统、Linux系统和Windows系统组成的混合系统,不同系统之间经常需要进行数据交换。下面我根据自己的实际工作经验介绍一下如何在linux系统 下挂接(mount)光盘镜像文件、移动硬盘、U盘以及Windows网络共享和UNIX NFS网络共享。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e挂接命令(mount)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e首先,介绍一下挂接(mount)命令的使用方法,mount命令参数非常多,这里主要讲一下今天我们要 …\u003c/p\u003e"
May 22, 2011
启用 Ubuntu 中的 root 帐号
"\u003cp\u003e其实我个人认为这没有多大必要,因为当你需要 root 的权限时,使用 sudo 便可以了。如果你实在需要在 Ubuntu 中启用 root 帐号的话,那么不妨执行下面的操作:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003esudo passwd root\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e此命令将会重新设置 root 的密码,按照提示输入新的密码,并加以确认。之后,重启系统时,就可以用 root 登录了。\u003c/p\u003e\n\u003cp\u003e如果你想要禁用 root 帐号,则执行下列命令:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003esudo passwd -l root\u003c/p\u003e\u003c/blockquote\u003e"
May 18, 2011
在FreeBSD上架VPN笔记
"\u003cp\u003e摘自:\u003c/p\u003e\n\u003cp\u003e在 Freebsd 上用 mpd5 构建 PPTP VPN\u003c/p\u003e\n\u003ch2 id=\"安装-mpd5\"\u003e安装 MPD5\u003c/h2\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecd /usr/ports/net/mpd5\nmake install clean\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e在 /etc/rc.conf 中启用 mpd5 添加如下行\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003empd_enable=\u0026#34;YES\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"配置-mpd-pptp-vpn\"\u003e配置 mpd pptp VPN\u003c/h2\u003e\n\u003cp\u003e复制默认的 mpd.conf 配置文件\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecd /usr/local/etc/mpd5/\ncp mpd.conf.sample mpd.conf\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e修改 mpd.conf 文件中的 startup: default: pptp_server: 三块,其它的不要理睬,放在里面不要删除,因为可以通过 default: 标签来调用需要执行的模块,所以不受影响。\u003c/p\u003e\n\u003cp\u003e以下是这三部分的代码,需要修改的地方见我的中文解释。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003estartup:\n # configure mpd users\n set user admin password ### 设置 mpd 的访问帐号及密码,通过 telnet 或 web 访问时需要此帐号\n #set user foo1 …\u003c/code\u003e\u003c/pre\u003e"
April 17, 2011
ipfw:getsockopt(IP_FW_GET):Protocol not available
"\u003cp\u003e本想通过防火墙限制一下,谁知输入出现下面的错误:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[root@Aaronwang ~]# ipfw show\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eipfw: getsockopt(IP_FW_GET): Protocol not available\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e看来是我在编译内核的时候没有把IPFW编译进来,如果确信编译过了,那一定是没有reboot的问题了,我就是当时忘记reboot,才出现这个问题的.看来又要再编译一次内核了!上次内核编译是00:59:01,这次又是在半夜,看来我还真是个夜猫子!呵呵!\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[root@Aaronwang ~]# uname -a\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eFreeBSD Aaronwang 7.2-RELEASE-p6 FreeBSD 7.2-RELEASE-p6 #5: Thu Jan 14 00:59:01 CST 2010 root@Aaron wang:/usr/obj/usr/src/sys/Aaron.wang i386\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e编译ipfw要在/root/Aaron.wang里面加入下列内容:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eoptions IPFIREWALL\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这个选项将 IPFW 作为内核的一部分来启用。\u003c/p\u003e\n\u003cp\u003eoptions …\u003c/p\u003e"
April 17, 2011
FreeBSD IPFW 防火墙的安装和设置
"\u003cp\u003eIPFW本身是FreeBSD内置的,要使用IPFW设置防火墙需要重新编译FreeBSD内核。注意,因为在编译后IPFW默认拒绝所有网络服务,包括对系统本身都会拒绝,所以在配置过程中一定要小心谨慎。\u003c/p\u003e\n\u003cp\u003e内核编译方法请参考:\u003cstrong\u003eStep 1,对IPFW的一些基本参数进行配置:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e#cd /sys/i386/conf\u003c/strong\u003e//如果没有这个目录,说明你的系统没有安装Ports服务,要记得装上。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e#cp GENERIC ./kernel_IPFW\u003c/strong\u003e用 vi 打开kernel_IPFW文件,在文件未尾加入以下个行:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eoptions IPFIREWALL\u003c/strong\u003e//将包过滤部分代码编译进内核。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003eoptions IPFIREWALL_VERBOSE\u003c/strong\u003e//启用通过Syslogd记录日志;如果没有指定这个选项,即使你在过滤规则中指定了记录包,也不会真的记录它们。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eoptions IPFIREWALL_VERBOSE_LIMIT=10\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e//限制通过Syslogd记录的每项包规则的记录条数。如果你受到了大量的攻击,想记录防火墙的活动,但又不想由于Syslog洪水一般的记录将你淹没,那么这个选项将会很有用。当使用了这条规则,当规则链中 …\u003c/p\u003e"
April 16, 2011
nginx下关于PHP-FPM在高负载下的优化配置
"\u003cp\u003e今天调整了服务器的PHP-FPM配置,其中有几个参数可以在网站在高并发下,保持服务器的稳定.不会挂掉.请看下面的内容.\u003c/p\u003e\n\u003cp\u003e代码:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\n \u0026lt;value name=\u0026#34;max_children\u0026#34;\u0026gt;5\u0026lt;/value\u0026gt;\n\n Settings group for \u0026#39;apache-like\u0026#39; pm style\n \u0026lt;value name=\u0026#34;apache_like\u0026#34;\u0026gt;\n\n Sets the number of server processes created on startup.\n Used only when \u0026#39;apache-like\u0026#39; pm_style is selected\n \u0026lt;value name=\u0026#34;StartServers\u0026#34;\u0026gt;20\u0026lt;/value\u0026gt;\n\n Sets the desired minimum number of idle server …\u003c/code\u003e\u003c/pre\u003e"
April 16, 2011
nginx php-fpm性能优化设置
"\u003cp\u003eWhen you running a highload website with PHP-FPM via FastCGI, the following tips may be useful to you : )\n如果您高负载网站使用PHP-FPM管 理FastCGI,这些技巧也许对您有用:)\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eCompile PHP’s modules as less as possible, the simple the best (fast);\n1.尽量少安装PHP模块,最简单是最好(快)的\u003c/li\u003e\n\u003cli\u003eIncreas PHP FastCGI child number to 100 and even more. Sometime, 200 is OK! ( On 4GB memory server);\n2.把您的PHP FastCGI子进程数调到100或以上,在4G内存的服务器上200就可以\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e注:我的1g测试机,开64个是最好的,建议使用压力测试获取最佳值\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/04/nginx_php-fpm.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/04/nginx_php-fpm.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003col start=\"3\"\u003e\n\u003cli\u003e\n\u003cp\u003eUsing SOCKET PHP FastCGI, and put into /dev/shm on Linux;\n3.使用socket连 …\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e"
April 13, 2011
20个Nginx Web服务器最佳安全实践
"\u003cp\u003eNginx是一个轻量级,高性能的Web服务器/反向代理和电子邮件代理(IMAP/POP3),它可以运行在UNIX,GNU/Linux,BSD变种,MAC OS X,Solaris和Microsoft Windows上。根据Netcraft的调查数据显示,互联网上6%的域名都使用了Nginx Web服务器。Nginx是解决C10K问题的服务器之一,与传统服务器不一样,Nginx不依赖于线程处理请求,相反,它使用了一个更具扩展性的事件驱动(异步)架构。Nginx在很多高流量网站上得到了应用,如WordPress,Hulu,Github和SourceForge。\u003c/p\u003e\n\u003cp\u003e本文的主要目是介绍如何提高运行在Linux或UNIX类操作系统上的Nginx Web服务器的安全性。\u003c/p\u003e\n\u003cp\u003eNginx默认配置文件和默认端口\u003c/p\u003e\n\u003cp\u003e◆ /usr/local/nginx/conf/ – Nginx服务器配置目录,/usr/local/nginx/conf/nginx.conf 是主配置文件\u003c/p\u003e\n\u003cp\u003e◆ /usr/local/nginx/html/ – 默认文档位置\u003c/p\u003e\n\u003cp\u003e◆ /usr/local/nginx/logs/ – …\u003c/p\u003e"
April 13, 2011
PHP.INI配置:Session配置详细说明教程
"\u003cp\u003e网上有很多PHP.INI文件配置的中文说明,但是对于PHP初学者来说在进行PHP运行环境搭建配置时还是容易一头雾水,今天换一种角度来分享如何进行php.ini配置,以求达到解决实际问题的效果,开篇以\u003ca href=\"http://www.leapsoul.cn/\"\u003ePHP教程\u003c/a\u003e方式详细介绍如何通过php.ini来配置Session,以实现基本的Session应用。\u003c/p\u003e\n\u003cp\u003e我们知道在利用PHP进行购物车、用户登录等交互式网站开发时,Session是一种很好的解决方法,如果采用\u003ca href=\"http://www.leapsoul.cn/?p=275\"\u003eXAMPP\u003c/a\u003e,\u003ca href=\"http://www.leapsoul.cn/?p=292\"\u003eAppServ\u003c/a\u003e等PHP安装包,一般情况下,PHP Session设置系统都会配置如果采用手动配置PHP运行环境,就需要我们通过php.ini来对Session进行配置,下面详细介绍如何进行Session配置。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePHP运行环境说明\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e我采用的是DedeAMPZ,PHP版本5.2.4,如果你是手动安装PHP运行环境,你需要将php.ini-dist或者php.ini-recommended重命名为php.ini,并将其复制在windows目录下。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ephp.ini中的session配置说明\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e下面介绍能让session运行的必要配置步骤\u003c/p\u003e\n\u003cp\u003e手动配置PHP运行环境时,最容易遗忘的一项是服务器 …\u003c/p\u003e"
April 11, 2011
linux CentOS中top命令参数说明
"\u003cp\u003e先来一些CentOS(Linux)的基础知识:用top命令查看CPU使用率\u003c/p\u003e\n\u003cp\u003eCentOS 是 RHEL(Red Hat Enterprise Linux)源代码再编译的产物,而且在 RHEL 的基础上修正了不少已知的 Bug ,相对于其他 Linux 发行版,其稳定性值得信赖。\u003c/p\u003e\n\u003cp\u003e在系统维护的过程中,随时可能有需要查看 CPU 使用率,并根据相应信息分析系统状况的需要。在 CentOS 中,可以通过 top 命令来查看 CPU 使用状况。运行 top 命令后,CPU 使用状态会以全屏的方式显示,并且会处在对话的模式 — 用基于 top 的命令,可以控制显示方式等等。退出 top 的命令为 q (在 top 运行中敲 q 键一次)。\u003c/p\u003e\n\u003cp\u003e在命令行中输入 “top” 即可启动 top ,运行后如下图所示:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/04/centos_top.gif\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/04/centos_top.gif\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e如上图所示,top 的全屏对话模式可分为3部分:\u003cstrong\u003e系统信息栏\u003c/strong\u003e、\u003cstrong\u003e命令输入栏\u003c/strong\u003e、\u003cstrong\u003e进程列表栏\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e第一部分 — 最上部的 系统信息栏 :\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e第一行(top):\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e“00:11:04”为系统当前时刻;\u003c/p\u003e\n\u003cp\u003e“3:35”为系统启动后到现在的运作时间;\u003c/p\u003e\n\u003cp\u003e“2 users”为当前登录到系统的用户,更确切的说是登录到用户 …\u003c/p\u003e"
April 11, 2011
CentOS系统如何查看cpu
"\u003cp\u003e在使用一个系统的时候,我们肯定要看看系统配置,而CentOS系统下看配置,可没有windows那么直观。你只能一个一个查看。如何查看CentOS系统的CPU也就让很多人不知所措了。\u003c/p\u003e\n\u003cp\u003e下面,我们就来学习一下如何在CentOS系统中查看CPU吧。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一:CentOS系统cpu\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e[root@srv /]# more /proc/cpuinfo | grep “model name”\u003c/p\u003e\n\u003cp\u003emodel name : Intel(R) Xeon(R) CPU X3220 @ 2.40GHz\u003c/p\u003e\n\u003cp\u003emodel name : Intel(R) Xeon(R) CPU X3220 @ 2.40GHz\u003c/p\u003e\n\u003cp\u003emodel name : Intel(R) Xeon(R) CPU X3220 @ 2.40GHz\u003c/p\u003e\n\u003cp\u003emodel name : Intel(R) Xeon(R) CPU X3220 @ 2.40GHz\u003c/p\u003e\n\u003cp\u003e[root@srv /]# grep “model name” /proc/cpuinfo\u003c/p\u003e\n\u003cp\u003emodel name : …\u003c/p\u003e"
April 11, 2011
libiconv.so.2: cannot open shared object file解决办法
"\u003cp\u003e\u003cstrong\u003e解决办法如下:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1.在/etc/ld.so.conf中加一行/usr/local/lib,\u003c/p\u003e\n\u003cp\u003e2.然后运行/sbin/ldconfig,文件解决,没有报错了~~\u003c/p\u003e"
April 11, 2011
2010-03-08 Fatal error: Can’t open and lock privilege tables: Table ‘mysql.host’ doesn’t exist的解决方法 – [MySQL]
"\u003cp\u003e今天在用一个装好的Mysql时,用safe_mysqldq启动的时候,出现\u003c/p\u003e\n\u003cp\u003eFatal error: Can’t open and lock privilege tables: Table ‘mysql.host’ doesn’t exist\u003c/p\u003e\n\u003cp\u003e最终解决方法如下:\u003c/p\u003e\n\u003cp\u003e在mysql的安装目录下,我的是/usr/local/mysql\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e./scripts/mysql_install_db –usrer=mysql –datadir=/usr/local/mysql/data/\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e原因是重装的时候数据目录不一致导致\u003c/p\u003e\n\u003cp\u003e然后再次启动,OK\u003c/p\u003e"
April 11, 2011
‘./mysql-bin.index’ not found (Errcode: 13) 的解决方法
"\u003cp\u003e今天突然收到消息机房的一台服务器的mysql无法启动了,首先检查了一下mysql的错误日志,发现最后出现以下错误:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e020101 00:42:21 mysqld started\n/usr/local/mysql/libexec/mysqld: File ‘./mysql-bin.index’ not found (Errcode: 13)\n020101 0:42:21 [ERROR] Aborting\u003c/p\u003e\n\u003cp\u003e020101 0:42:21 [Note] /usr/local/mysql/libexec/mysqld: Shutdown complete\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e提示./mysql-bin.index无法找到(由于mysql开启了bin日志功能),到数据库根目录查看该文件是存在的,可能是文件权限的问题,查看了数据库根目录的权限是700,所有者和用户组都是root,可能是上次转移数据库的时候不小心修改了文件夹的权限。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e解决方法:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003echgrp -R mysql ./var \u0026amp;\u0026amp; chown -R mysql ./var (这里数据库根目录为/*****/var)\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e重新启 …\u003c/p\u003e"
April 10, 2011
SSH 超时断开连接解决办法
"\u003cp\u003e有2种方法\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1、 配置服务器\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e#vi /etc/ssh/sshd_config\u003c/p\u003e\n\u003cp\u003e1)找到 ClientAliveInterval参数,如果没有就自己加一行\u003c/p\u003e\n\u003cp\u003e数值是秒,比如你设置为120 ,则是2分钟\u003c/p\u003e\n\u003cp\u003eClientAliveInterval 120\u003c/p\u003e\n\u003cp\u003e2)ClientAliveCountMax\u003c/p\u003e\n\u003cp\u003e指如果发现客户端没有相应,则判断一次超时,这个参数设置允许超时的次数。如3 、5等自定义\u003c/p\u003e\n\u003cp\u003e修改两项参数后如下:\u003c/p\u003e\n\u003cp\u003e—————————-\u003c/p\u003e\n\u003cp\u003eClientAliveInterval 120\u003c/p\u003e\n\u003cp\u003eClientAliveCountMax 0 ###在不允许超时次数\u003c/p\u003e\n\u003cp\u003e重新加载sshd服务。退出客户端,再次登陆即可验证。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2、 配置客户端\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e#vi /etc/ssh/ssh_config\u003c/p\u003e\n\u003cp\u003e然后找到里面的\u003c/p\u003e\n\u003cp\u003eServerAliveInterval\u003c/p\u003e\n\u003cp\u003e参数,如果没有你同样自己加一个就好了\u003c/p\u003e\n\u003cp\u003e参数意义相同,都是秒数,比如5分钟等\u003c/p\u003e\n\u003cp\u003eServerAliveInterval 300\u003c/p\u003e\n\u003cp\u003e=====================================\u003c/p\u003e\n\u003cp\u003e上面是配置需要服务器权限,如果没有服务器权限则可以使用这个方法,其思想是:客 …\u003c/p\u003e"
April 10, 2011
centos 5.x 安装 zendOptimizer 3.3.9
"\u003cp\u003e刚完成了在CentOS5.5安装Zend Optimizer插件的任务,以前老版本 Zend Optimizer的安装方法是运行安装脚本 ./install.sh,新的Zend Optimizer 3.3.9没有安装脚本,只能按照以下方法安装。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewget \u003ca href=\"http://downloads.zend.com/optimizer/3.3.9/ZendOptimizer-3.3.9-linux-glibc23-i386.tar.gz\"\u003ehttp://downloads.zend.com/optimizer/3.3.9/ZendOptimizer-3.3.9-linux-glibc23-i386.tar.gz\u003c/a\u003e (32位)\n或者\nwget \u003ca href=\"http://downloads.zend.com/optimizer/3.3.9/ZendOptimizer-3.3.9-linux-glibc23-x86_64.tar.gz\"\u003ehttp://downloads.zend.com/optimizer/3.3.9/ZendOptimizer-3.3.9-linux-glibc23-x86_64.tar.gz\u003c/a\u003e (64位)\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e解压缩下载的文件包(x86):\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003etar -zxvf ZendOptimizer-3.3.9-linux-glibc23-i386.tar.gz\ncd ZendOptimizer-3.3.9-linux-glibc23-i386\ncd data/5_2_x_comp/\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这里要注意,进入data文件夹后,so文件是对应版本的,看好PHP版本再安 …\u003c/p\u003e"
April 9, 2011
CentOS 5 VPS上配置pptpd作为VPN服务器[瑞豪开源]
"\u003cp\u003e美国VPS的一大用途就是做为加密的VPN服务器,在国内连上这些VPN服务器就可以无限制访问互联网。常用的VPN服务器一般分两种,一种是SSL VPN,代表软件有openvpn,这个VPN软件有Windows下的客户端软件;另外一种是pptpd VPN,Windows自带这种VPN的客户端支持。本文记录了在CentOS 5 VPS下安装pptpd VPN服务器的过程。\u003c/p\u003e\n\u003ch2 id=\"内核支持\"\u003e内核支持\u003c/h2\u003e\n\u003cp\u003epptpd VPN需要内核支持mppe,我们的VPS自带的内核已经把mppe编译进去了,没有把mppe另外当作内核的模块。\u003c/p\u003e\n\u003ch2 id=\"软件安装\"\u003e软件安装\u003c/h2\u003e\n\u003cp\u003e要安装pptpd VPN,ppp和iptables这两个软件是必须安装的,安装命令:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eyum install -y ppp iptables\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e然后下载pptpd的rpm包:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e32位\n64位\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e要注意64位的系统要下载64位的rpm包,32位的系统要下载32位的rpm包,别搞错了\u003c/p\u003e\n\u003cp\u003e64位系统安装命令:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ccode\u003erpm -ivh pptpd*.x86_64.rpm\u003c/code\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e32位系统安装命令:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003erpm -ivh pptpd*.i386.rpm …\u003c/code\u003e\u003c/pre\u003e"
April 9, 2011
Centos下vpn(pptpd)的部署
"\u003cp\u003e现在大多数VPS服务器都位于国外,因此PPTP服务器可以用来搭建一个比较实用的代理服务器。PPTP服务需要用到特定的Linux内核技术,因此绝大多数OpenVZ架构的VPS都不能配置PPTP(可以用OPENVPN代替),但几乎所有的XEN或KVM架构的VPS都能正常安装。本文将以XEN架构的CentOS系统下安装PPTP服务为例进行讲解。\u003c/p\u003e\n\u003ch3 id=\"1准备环境\"\u003e1、准备环境\u003c/h3\u003e\n\u003cp\u003ePPTPD要求Linux内核支持mppe,一般来说CentOS安装时已经包含了;下面安装ppp与iptables:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eyum install perl ppp iptables\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"2安装pptpd\"\u003e2、安装PPTPD\u003c/h3\u003e\n\u003cp\u003e对于32位CentOS,执行\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ewget http://acelnmp.googlecode.com/files/pptpd-1.3.4-1.rhel5.1.i386.rpm\nrpm -ivh pptpd-1.3.4-1.rhel5.1.i386.rpm\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e对于64位CentOS,执行\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ewget http://acelnmp.googlecode.com/files/pptpd-1.3.4-1.rhel5.1.x86_64.rpm\nrpm -ivh …\u003c/code\u003e\u003c/pre\u003e"
April 8, 2011
centos下配置vsftpd虚拟用户教程[整理]
"\u003cp\u003e点击下载vsftp_install.sh一键安装脚本:\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/04/vsftpd_install.sh_.txt\"\u003evsftpd_install.sh\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e基本配置环境如下:\u003c/p\u003e\n\u003cp\u003e1.ftp用户的home目录:/data/ftp\n2.所有虚拟用户的local_root目录,都放在/data/wwwroot/这里.这里为了方便,目录名和虚拟用户名一样,当然也可以不一样的\n3.允许登录用户文件:/etc/vsftpd/chroot_list\u003c/p\u003e\n\u003cp\u003e==========================================\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.安装vsftpd\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#yum -y install vsftpd\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e可用service vsftpd start 命令查看是否安装成功\u003c/p\u003e\n\u003cp\u003e设置CentOS vsftpd自启动\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#chkconfig –level 35 vsftpd on\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e2.配置vsftpd.conf文件\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#vi /etc/vsftpd/vsftpd.conf\nanonymous_enable=NO 是否允许匿名用户访问\n#chroot_list_enable=YES …\u003c/p\u003e\u003c/blockquote\u003e"
April 7, 2011
PHP Warning: cannot restore segment prot after reloc: Permission denied的解决办法
"\u003cp\u003eFailed loading /usr/local/Zend/lib/Optimizer-3.3.3/php-5.2.x/ZendOptimizer.so: /usr/local/Zend/lib/Optimizer-3.3.3/php-5.2.x/ZendOptimizer.so: cannot restore segment prot after reloc: Permission denied\u003c/p\u003e\n\u003cp\u003e原来这是SELinux搞的鬼,解决办法有如下两个\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1. 使用chcon 命令\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e示例: chcon -t texrel_shlib_t /usr/local/Zend/lib/Optimizer-3.3.3/php-5.2.x/ZendOptimizer.so\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2. 禁止掉SELinux\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e更改/etc/sysconfig/selinux 文件的内容为 SELINUX=disabled\u003c/p\u003e\n\u003cp\u003e这个GD库的问题,在装好后启动apache的时候,还会提示php库的问题,用上面的同样方法处理即可.\u003c/p\u003e"
April 7, 2011
centos下vsftpd 的虚拟用户安装配置
"\u003cp\u003eVsftp 安装配置\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.查看是否安装vsftp\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#rpm –qa|grep vsftpd\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e如果出现 vsftpd-2.0.5-16.el5_5.1 说明已经安装 vsftp\u003c/p\u003e\n\u003cp\u003e如果没有安装的话, 需要先安装vsftp\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eyum -y install vsftpd\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e2.测试 是否安装成功\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(ip 改成自己啊,不要用俺的此次登录为匿名登录 user: anonymous 密码为空 如果成功登录会有下面内容 这说明vsftpd安装成功)\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#service vsftpd start\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e为 vsftpd 启动 vsftpd:[确定]\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#ftp 192.168.1.107\u003c/p\u003e\n\u003cp\u003eConnected to192.168.1.107.\u003c/p\u003e\n\u003cp\u003e220 (vsFTPd 2.0.5)\u003c/p\u003e\n\u003cp\u003e530 Please loginwith USER and PASS.\u003c/p\u003e\n\u003cp\u003e530 Please loginwith USER and PASS.\u003c/p\u003e\n\u003cp\u003eKERBEROS_V4 rejectedas an authentication type\u003c/p\u003e\n\u003cp\u003eName(192.168.1.107:root): anonymous\u003c/p\u003e\n\u003cp\u003e331 …\u003c/p\u003e\u003c/blockquote\u003e"
April 6, 2011
configure: error: newly created file is older than distributed files!
"\u003cp\u003e在linux下安装软件包的时候,有时候提示\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003econfigure: error: newly created file is older than distributed files!\nCheck your system clock\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e出现此编译错误,请检查你的系统时间是否设置有误。。。\u003c/p\u003e\n\u003cp\u003e查看硬件日期时间\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ehwclock -show\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003elinux是每隔一段时间将系统时间写入 硬件bois的 如果刚设置完了就关机,开机后时间还是等于没有设置\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# date -s 991128\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eSun Nov 28 00:00:00 CST 1999\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e实例:设置时间伟2008年8月8号12:00\u003c/p\u003e\n\u003cp\u003e# date -s “2008-08-08 12:00:00″\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e修改完后,记得输入:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eclock -w\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e把系统时间写入CMOS即可\u003c/p\u003e"
April 6, 2011
centos编译安装mysql5.5.9
"\u003cp\u003e环境:\ncentos 5.5 x86_64\nmysqll5.5.9\u003c/p\u003e\n\u003cp\u003e安装开发工具\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eyum groupinstall “Development Tools”\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e安装依赖包\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eyum install ncurses-devel\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e编译安装cmake\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewget \u003ca href=\"http://www.cmake.org/files/v2.8/cmake-2.8.4.tar.gz\"\u003ehttp://www.cmake.org/files/v2.8/cmake-2.8.4.tar.gz\u003c/a\u003e\ntar xvzf cmake-2.8.4.tar.gz\n./configure\nmake\nmake install\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e下载\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewget \u003ca href=\"http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.9.tar.gz/from/http://mysql.mirror.tw/\"\u003ehttp://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.9.tar.gz/from/http://mysql.mirror.tw/\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e编译安装mysql\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ecd mysql5.5.9\nrm CMakeCache.txt\ncmake . \u003cbr\u003e\n-DCMAKE_INSTALL_PREFIX=/usr/local/mysql5.5.9/ \u003cbr\u003e\n-DMYSQL_DATADIR=/usr/local/mysql5.5.9/data …\u003c/p\u003e\u003c/blockquote\u003e"
April 5, 2011
安装Imagick扩展时,提示 unable to load imagick.so运行错误的解决办法
"\u003cblockquote\u003e\n\u003cp\u003ewget \u003ca href=\"ftp://mirror.aarnet.edu.au/pub/imagemagick/ImageMagick-6.5.5-6.tar.gz\"\u003eftp://mirror.aarnet.edu.au/pub/imagemagick/ImageMagick-6.5.5-6.tar.gz\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003etar zxvf ImageMagick-6.5.5-6.tar.gz\u003c/p\u003e\n\u003cp\u003ecd ImageMagick-6.5.5-6\u003c/p\u003e\n\u003cp\u003e./configure\u003c/p\u003e\n\u003cp\u003emake\u003c/p\u003e\n\u003cp\u003emake install\u003c/p\u003e\n\u003cp\u003ecd ..按照以上方法安装ImageMagick后,有可能会遇到PHP加载imagick.so后运行错误,解决方法是在编译ImageMagick时关掉openmp: –-disable-openmp。如果还不行的话,请更换ImageMagick至低版本,比如:6.5.4-2。\u003c/p\u003e"
April 5, 2011
Memcache基础教程
"\u003cp\u003e\u003cstrong\u003eMemcache是什么\u003c/strong\u003e\nMemcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。\n它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。\nMemcache官方网站:http://www.danga.com/memcached,更多详细的信息可以来这里了解 .\u003c/p\u003e\n\u003cp\u003e为什么会有Memcache和memcached两种名称?\n其实Memcache是这个项目的名称,而memcached是它服务器端的主程序文件名,知道我的意思了把~~~~。一个是项目名称,一个是主程序文件名,在网上看到了很多人不明白,于是混用了。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eMemcache的安装\u003c/strong\u003e\n分为两个过程:memcache服务器端的安装和memcached客户端的安装。\n所谓服务器端的安装就是在服务器(一般都是linux系统)上安装Memcache实现数据的存储\n所谓客户端的安装就是指php(或者其他程序,Memcache还有其他不错 …\u003c/p\u003e"
April 5, 2011
Linux环境下PCRE库的使用
"\u003cp\u003e今天下载了PCRE的正则表达式库,应用在Linux环境下的C语言编程中。\u003c/p\u003e\n\u003cp\u003e调用方法:\u003c/p\u003e\n\u003cp\u003e1.下载PCRE库:\u003ca href=\"ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/\"\u003e\u003cstrong\u003eftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/\u003c/strong\u003e\u003c/a\u003e,版本是7.8;\u003c/p\u003e\n\u003cp\u003e2.解压后执行configure,而后make,make install,可配置后动态链接库;\u003c/p\u003e\n\u003cp\u003e3.写了个测试的例子:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e#include\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e#include\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eint main()\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e{\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003epcre *re;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003econst char *error;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eint erroffset;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eint rc;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eint ovector[30];\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ere = pcre_compile(“some”, 0, \u0026amp;error, \u0026amp;erroffset, NULL);\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003erc = pcre_exec(re, NULL, “some string”, 11, 0, 0, ovector, 30);\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eprintf(“%d\\n”, rc);\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ereturn 0;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e4.gcc -o test test.c -lpcre …\u003c/p\u003e"
March 31, 2011
Linux提交命令至后台运行
"\u003cp\u003e我经常在putty里工作,有时候如果一个命令执行太长,不得已,我得开两个窗口,如果事情再多,可能开四个五个,不过有的ssh登陆工具可以开多个窗口,但难免会出点乱子.那么我们可以把命令隐藏再后台执行,使用linux下命令 “\u0026amp;” 这个倒霉的符号.\u003c/p\u003e\n\u003cp\u003e比如我们要执行一个命令,(暂时没想到执行时间N长的命令,假设一个shell) test.sh , 现在提交并隐藏在后台\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e$./test.sh \u0026raquo; test.log \u0026amp;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e意思是,执行test.sh 反馈的结构输送至 test.log , \u0026amp;表示这个命令提交至后台执行.\u003c/p\u003e\n\u003cp\u003e执行后,返回一个进程号,可以用ps来查看.\u003c/p\u003e\n\u003cp\u003e这样,我们可以连续在同一个终端窗口上运行多个持续的命令.\u003c/p\u003e\n\u003cp\u003e然后,问题又来.我们运行这些命令至后台后,如果想退出终端窗口,那么后台的命令也随之中断.我们得想办法让进程持续运行.这里得使用此命令 nohup\u003c/p\u003e\n\u003cp\u003e重新执行上边的操作,那么我们应该这样执行\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e$nohup ./test.sh \u0026raquo; test.log\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e然后敲logout,放心,再登陆试试ps,进程依然存在!\u003c/p\u003e\n\u003cp\u003e对于nohup命令的介绍 …\u003c/p\u003e"
March 31, 2011
iftop来查看linux的即时流量
"\u003cp\u003e\u003cstrong\u003e关于 Iftop\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eiftop 是类似于top的实时流量监控工具。主要用来显示本机网络流量情况及各相互通信的流量集合,如单独同那台机器间的流量大小,非常适合于代理服务器和iptables服务器使用\u003c/p\u003e\n\u003cp\u003e官方网站:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e安装iftop\u003c/strong\u003e\n**安装方法1、编译安装\n**\n如果采用编译安装可以到iftop官网下载最新的源码包。\u003c/p\u003e\n\u003cp\u003e安装前需要已经安装好基本的编译所需的环境,比如make、gcc、autoconf等。安装iftop还需要安装libpcap和libcurses。\u003c/p\u003e\n\u003cp\u003eCentOS上安装所需依赖包:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eyum install flex byacc libpcap ncurses ncurses-devel libpcap-devel\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eDebian上安装所需依赖包:\u003c/p\u003e\n\u003cp\u003eapt-get install flex byacc libpcap0.8 libncurses5\u003c/p\u003e\n\u003cp\u003e下载iftop\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ewget http://www.ex-parrot.com/pdw/iftop/download/iftop-0.17.tar.gz\ntar zxvf iftop-0.17.tar.gz\ncd iftop-0.17 …\u003c/code\u003e\u003c/pre\u003e"
March 31, 2011
在windows下玩apache-php不能不知的几个小设置
"\u003cp\u003e1、PHPIniDir “D:\\PHP5″\u003c/p\u003e\n\u003cp\u003e这样不用每次都把php.ini拷贝到C:\\Windows下\u003c/p\u003e\n\u003cp\u003e2、set Path=D:\\PHP5;D:\\PHP5\\ext;%Path%\u003c/p\u003e\n\u003cp\u003e这样不用每次把那些dll拷贝到C:\\Windows\\system32下\u003c/p\u003e"
March 30, 2011
linux下svn命令大全
"\u003cp\u003esvn(subversion)是近年来崛起的版本管理工具,svn服务器有2种运行方式:独立服务器和借助apache。2种方式各有利弊。不管是那种方式,都需要使用各种命令来实现。在本文中,haohtml为我们整理出来了Linux下的常用和不常用的svn命令。\u003c/p\u003e\n\u003cp\u003e**1、**将文件checkout到本地目录\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003esvn checkout\u003c/strong\u003e path(path是服务器上的目录)\u003c/p\u003e\n\u003cp\u003e例如:svn checkout svn://192.168.1.1/pro/domain\u003c/p\u003e\n\u003cp\u003e简写:svn co\u003c/p\u003e\n\u003cp\u003e**2、**往版本库中添加新的文件\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003esvn\u003c/strong\u003e \u003cstrong\u003eadd\u003c/strong\u003e file\u003c/p\u003e\n\u003cp\u003e例如:svn add test.php(添加test.php)\u003c/p\u003e\n\u003cp\u003esvn add *.php(添加当前目录下所有的php文件)\u003c/p\u003e\n\u003cp\u003e**3、**将改动的文件提交到版本库\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003esvn commit\u003c/strong\u003e -m “LogMessage“ [-N] [–no-unlock] PATH…(如果选择了保持锁,就使用–no-unlock开关)\u003c/p\u003e\n\u003cp\u003e例如:svn commit -m “add test file for my test“ test.php\u003c/p\u003e\n\u003cp\u003e简写:svn ci\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e4、\u003c/strong\u003e 加锁/解 …\u003c/p\u003e"
March 28, 2011
Apache带宽流量控制模块安装 mod_bw 配置说明
"\u003cp\u003e注:这个模块在win32平台下好像不是太稳定的,有的文件可以限制,而有的文件则不行.用的是windows2003操作系统,如果有同样的问题的请,请在这里留言,请注明一下系统类型.\u003c/p\u003e\n\u003cp\u003e官方网站:http://modules.apache.org,在里面找到一个 Bandwidth Module 的 module,模块说明文档, \u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/03/mod_bw-0.9.txt\"\u003e点击查看mod_bw-0.说明文档9.0\u003c/a\u003e作者的官方网站 \u003ca href=\"http://ivn.cl/apache/\"\u003ehttp://ivn.cl/apache/\u003c/a\u003e(Win32: \u003ca href=\"http://ivn.cl/files/dlls/mod_bw-0.91-2.2.14/mod_bw.dll\"\u003ehttp://ivn.cl/files/dlls/mod_bw-0.91-2.2.14/mod_bw.dll\u003c/a\u003e 可以下载到。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eInstalling step:\u003c/strong\u003e\n1. 将 mod_bw.dll 放到安装 apache 资料夹下的 modules\n2. 编辑 httpd.conf,将 LoadModule bw_module modules/mod_bw.dll 加入\n3. 重开 apache\n4. 查看 phpinfo() 里是否有mod_bw\u003c/p\u003e\n\u003cp\u003eConfiguration Directives:\n\u003cstrong\u003e1 – BandWidthModule …\u003c/strong\u003e\u003c/p\u003e"
March 28, 2011
使用apache的rewrite功能来防迅雷
"\u003cp\u003e不知道为什么,本来不受重视的L’Yun,却一直多灾多难,前几天空间呗停掉了,一个很以为的原因,每天将近9G的流量,晕死了,最多的一天才只有6个IP,但竟然有这么大的流量。后来查看了下日志,竟然是两首MP3引起的,每一秒钟都有人在下载。刚开始以为是百度干的,但是后来看了下在百度的位置,还不至于达到那么大的流量,然后自然而然的就想到迅雷了,看看别人的文章,可以肯定下,迅雷是个流氓!\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e解决方案:\u003c/strong\u003e\n1、对服务器的攻击屏蔽后,不用理会,不会造成太大影响。\n2、被百度收录的是一部分MP3,因为不希望不访问网站就直接从后台下载网站的mp3,于是增加搜索引擎访问限制。在网站根目录下放置robots.txt,内容如下:\nUser-agent: Baiduspider\nDisallow: /****\n*表示不允许百度搜索引擎收录的路径。相对于百度,雅虎、MSN和Google的搜索引擎机器人没有那么流氓,所以不需要屏蔽。\u003c/p\u003e\n\u003cp\u003e3、对付迅雷。\n相对于有些流氓的百度搜索引擎来说,迅雷就是恶霸了。\n对于小网站站长来说,迅雷的分布式下载几乎是一种灾难。尽管迅雷给广大普通用户带来快捷方便,但给小服务器的负载带来严重灾难。 …\u003c/p\u003e"
March 28, 2011
windows 服务器 Apache 防止ddos攻击模块
"\u003cp\u003e为了防HTTP DoS或DDos攻击,我们可能会对服务器添加很多种防护产品,可能会购买专业的DDoS硬件防火墙,当然,目前并没有一种很成熟的技术能完全封锁住DDoS攻击。但如果对于小型网站服务器来说,Apache的evasive模块是比较简单的处理方法,原理也很简单,判断一段时间内,某个IP访问的次数是否过快,如果过快,就返回403错误。\u003c/p\u003e\n\u003cp\u003e但是官方的evasive模块发布的是源代码和linux下的RPM压缩包,虽然可以在windows使用源代码编译出这个模块来,但是由于windows系统本身的原因,几乎不会在默认的情况下安装C语言的编译环境,如果需要安装这个编译环境要安装非常多而繁杂的软件,操作起来非常不便。但是在LINUX系统下编译好的文件却不能在WINDOWS下使用,这是两个系统核心的区别,肯定不能使用。\u003c/p\u003e\n\u003cp\u003e我在别的网站找到了WINDOWS下用的编译好的DLL文件,方便使用WINDOWS系统,同时又是Apache 2.2服务器软件的站长们使用。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e安装方法:\u003c/strong\u003e\n1、下载附件中的压缩包,解压并拷贝mod_dosevasive22.dll到Apache安装目录下的modules目录(当然也可 …\u003c/p\u003e"
March 23, 2011
windows环境下memcache服务器使用经验
"\u003cp\u003e将memcache服务器安装包解压到C:\\memcached文件夹后,使用cmd命令窗口安装。\u003c/p\u003e\n\u003cp\u003e1\u0026gt;开始\u0026gt;运行:CMD(确定)\u003c/p\u003e\n\u003cp\u003e2\u0026gt;cd C:\\memcached(回车)\u003c/p\u003e\n\u003cp\u003e3\u0026gt;memcached -d install(回车 这步执行安装)\u003c/p\u003e\n\u003cp\u003e4\u0026gt;memcached -d start(回车 这步执行启动memcache服务器,默认分配64M内存,使用11211端口)\u003c/p\u003e\n\u003cp\u003e此时memcache服务器已经可以正常使用了。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ememcache服务器安全:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eMemcache服务器端都是直接通过客户端连接后直接操作,没有任何的验证过程,这样如果服务器是直接暴露在互联网上的话是比较危险,轻则数据泄 露被其他无关人员查看,重则服务器被入侵,况且里面可能存在一些我们未知的bug或者是缓冲区溢出的情况,这些都是我们未知的,所以危险性是可以预见的。 为了安全起见,做两点建议,能够稍微的防止黑客的入侵或者数据的泄露。\u003c/p\u003e\n\u003cp\u003e现在就关于修改memcache服务器配置的问题说明如下:\u003c/p\u003e\n\u003cp\u003e1\u0026gt;用内网ip的方式提供web应用服务器调用,不允许直接通过外网调用,如将memcache服务器放 …\u003c/p\u003e"
March 23, 2011
freebsd+php+memcache、memcached安装和使用
"\u003cp\u003e来源: \u003ca href=\"http://www.lifecrunch.biz/archives/55\"\u003ehttp://www.lifecrunch.biz/archives/55\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"memcache-介绍\"\u003eMemcache 介绍\u003c/h2\u003e\n\u003cp\u003ememcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图 像、视频、文件以及数据库检索的结果等。Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,最初为了加速 LiveJournal 访问速度而开发的,后来被很多大型的网站采用。目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。起初作 者编写它可能是为了提高动态网页应用,为了减轻数据库检索的压力,来做的这个缓存系统。它的缓存是一种分布式的,也就是可以允许不同主机上的多个用户同时 访问这个缓存系统, 这种方法不仅解决了共享内存只能是单机的弊端,同时也解决了数据库检索的压力,最大的优点是提高了访问获取数据的速度!基于memcache作者对分布式 cache的理解和解决方案。 memcache完全可以用到其他地方 比如分布式数据库, 分布式计算等领域。\u003c/p\u003e\n\u003cp\u003eMemcache官方网站: …\u003c/p\u003e"
March 22, 2011
Windows不重启就使环境变量修改立即生效
"\u003cp\u003e在“我的电脑”-\u0026gt;“属性”-\u0026gt;“高级”-\u0026gt;“环境变量”中增加或修改环境变量后,需重启系统才能使之生效。有没有什么方法可让它即时生效呢?下面介绍一种方法:\u003c/p\u003e\n\u003cp\u003e一.以修改环境变量“PATH”为例,修改完成后,进入DOS命令提示符,输入:set PATH=C: ,关闭DOS窗口。\u003c/p\u003e\n\u003cp\u003e二.再次打开DOS窗口,输入:echo %PATH% ,可以发现“我的电脑”-\u0026gt;“属性”-\u0026gt;“高级”-\u0026gt;“环境变量”中设置的 PATH 值已经生效。\u003c/p\u003e\n\u003cp\u003e不用担心DOS窗口中的修改会影响环境变量的值,DOS窗口中的环境变量只是Windows环境变量的一个副本而已。但是对副本的修改却会引发Windows环境变量的刷新,这正是我们想要的!\u003c/p\u003e"
March 22, 2011
iisapp 命令 弹出 iisschlp.wsc [88,25] 属性值无效 progid
"\u003cp\u003e在执行iisapp.vbs时,可能会提示如下错误:\u003c/p\u003e\n\u003cp\u003eWindows Script Component – file://C:WINDOWSsystem32iisschlp.wsc\n[88,25] 属性值无效 : progid\u003c/p\u003e\n\u003cp\u003e不要汗,解决也挺简单。\u003c/p\u003e\n\u003cp\u003e原因是为了所谓的ASP安全,卸载了 shell.applaction 组件,也就是 wshom.ocx\u003c/p\u003e\n\u003cp\u003e重新注册即可正常运行 iisapp.vbs\u003c/p\u003e\n\u003cp\u003e注册命令:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eregsvr32 wshom.ocx\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e用完以后,可以再把这个组件卸载掉:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eregsvr32 /u /s weboffice.ocx\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e有关iisapp命令的用法请参考:\u003c/p\u003e"
March 21, 2011
redhat6下配置网卡ip地址
"\u003cp\u003e\u003cstrong\u003e①ifconfig命令\u003c/strong\u003e\n用ifconfig命令修改后重起服务配置将会丢失\n给Eth0接口设置IP地址和子网掩码广播地址并激活:ifconfig eth0 192.168.1.155 netmask 255.255.255.0 broadcast 192.168.1.255 UP\n更改Eth0口的MAC地址:ifconfig eth0 hw ehter 00:40:64:c8:03:04\n一个网卡添加多个IP:ifoconfig eht0:1 192.168.1.156 ifconfig eth1:192.168.157\n添加网关:route add default gw 192.168.1.1\n动态获取IP:ifconfig eth0 -dynamic\n\u003cstrong\u003e②netconfig工具\u003c/strong\u003e\nnetconfig命令后 可以选择静态还是动态获取IP,选择静态后\nIP address:IP地址\nnetmask:子网掩码\ndefault gateway (IP):网关\nPrimary nameserver: DNS地址\n如果只想配置某一项\n修改IP是动态还是动态获取netconfig …\u003c/p\u003e"
March 21, 2011
serv-u 无法开始服务器!服务器执行缺少?
"\u003cp\u003e无法开始服务器!服务器执行缺少!\u003c/p\u003e\n\u003cp\u003e点击连接时提示:\u003c/p\u003e\n\u003cp\u003e无法连接到服务器!\u003c/p\u003e\n\u003cp\u003e127.0.0.1端口43958\u003c/p\u003e\n\u003cp\u003e已经在serv-u的文件夹属性里的安全选项卡上加上system(或其它操作用户)的完全控制权限.\u003c/p\u003e\n\u003cp\u003e还是没有用呀?急!! \u003cstrong\u003e解决办法:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e将FTP的目录添加上administrators组权限,就可以了,serv-u的文件夹属性里的安全选项卡上加上system(或其它操作用户)的完全控制权限\u003c/p\u003e"
March 16, 2011
freebsd下修改mysql的默认数据目录datadir
"\u003cp\u003e以前用windows的时候,发现直接修改my.ini文件里的datadir变量就可以了,现在发现在FreeBSD下直接修改这个变量值不行的,进到mysql后,用命令mysql\u0026gt;show variables like ‘datadir’ 查看的时候还是默认的/var/db/mysql这个路径.在网上查了一些资料,正解方法如下.\u003c/p\u003e\n\u003cp\u003e数据目录为:/usr/local/mysql\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e运行/usr/local/bin/mysql_install_db –datadir=/usr/local/mysql –user=mysql\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003evi /etc/rc.conf,加入 mysql_enable=”YES”\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003emysql_dbdir=”/usr/local/mysql”\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e启动myql,现在原来账户的信息全部丢失.(不知道如果把原来的数据全部复制到这里行不行的,没有测试!)\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/usr/local/bin/mysqladmin -u root password ‘密码’\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e#mysql -u root -p\u003c/p\u003e\n\u003cp\u003e进入看一下\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eshow variables like “datadir”\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eOK, 出 …\u003c/p\u003e"
March 4, 2011
Linux下cache内存释放
"\u003cp\u003e/proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段.也就是说可以通过修改/proc中的文 件,来对当前kernel的行为做出调整.那么我们可以通过调整/proc/sys/vm/drop_caches来释放内存.操作如下:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[root@server test]# cat /proc/sys/vm/drop_caches\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e首先,/proc/sys /vm/drop_caches的值,默认为0\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[root@server test]# sync\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e手动执行sync命令(描述:sync 命令运行 sync 子例程。如果必须停止系统,则运行 sync 命令以确保文件系统的完整性。sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件)\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[root@server test]# echo 3 \u0026gt; /proc/sys/vm/drop_caches\n[root@server test]# cat /proc/sys/vm/drop_caches\n3\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e …\u003c/p\u003e"
March 1, 2011
Proftpd配置文件参数详细解释
"\u003cp\u003e1、Proftpd如何限速和设置发呆退出?\u003c/p\u003e\n\u003cp\u003e可以使用:\nRateReadBPS RateReadFreeBytes\nRateWriteBPS RateWriteFreeBytes\n来限制下载和上载速度:\nRateReadBPS和RateWriteBPS限制下载和上载的速率\nRateReadFreeBytes和RateWriteFreeBytes限制当用户现在这么多数据量以后再进行限速,这样可以实现对于小文件不限速,而大文件限速。\nTimeoutIdle — 设置空闲连接超时时钟\nTimeoutLogin — 设置空闲登陆超时时钟\nTimeoutNoTransfer — 设置当没有数据传输时的超时时钟\nTimeoutStalled — 设置被阻塞的下载的超时时钟\u003c/p\u003e\n\u003cp\u003e2、proftpd如何实现磁盘限额\u003c/p\u003e\n\u003cp\u003e首先编译的时候指定–with-modules的时候要包含mod_quota。\u003c/p\u003e\n\u003cp\u003e然后在配置文件中使用:\nQuotas on\nQuotaCalc on\nDefaultQuota 8000\nQuotaBlockSize 1024\nQuotaBlockName kb\n就可以实现磁盘限额。其 …\u003c/p\u003e"
March 1, 2011
[教程]FreeBSD下安装proftpd带匿名登陆和使用MySQL用户验证的Quota磁盘限额安装教程
"\u003cp\u003e配置文件是根据原来版本的基础上修改的,所以有些指令可能默认配置文件里没有了,但并不影响使用。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一.安装MySQL\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e安装教程请参考:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二.安装proftpd\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#cd /usr/ports/ftp/proftpd-mysql\n#make install clean\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/03/proftpd-mysql-quota.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/proftpd-mysql-quota.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e安装的时候会要求选择proftpd要安装的模块,选择好mysql和quota,其他的根据情况选择.这里系统默认安装的是proftpd-1.3.3d.tar.bz2.\u003c/p\u003e\n\u003cp\u003e配置系统自启动proftpd服务,用vi编辑/etc/rc.conf配置文件,在末尾加入一行:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eproftpd_enable=”YES”\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e三、创建ftp用户、用户组和目录设置\u003c/strong\u003e\n1、创建proftpd服务运行的用户和用户组(用于虚拟主机网站ftp用户)\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#pw groupadd FTPGRP -g 2001\n#pw adduser FTPUSR -u 2001 -g 2001 -d /var/ftp/haohtml -s /sbin/nologin\n#mkdir /var/ftp/haohtml\n#chown -R FTPUSR:FTPGRP …\u003c/p\u003e\u003c/blockquote\u003e"
February 26, 2011
解决vsftpd虚拟用户没有chmod权限的问题
"\u003cp\u003e参考(已经修正),在下面搞了个ftp,结果发现vsftpd的虚拟用户无法获得chmod权限,后来找了找,解决办法如下:\u003c/p\u003e\n\u003cp\u003e修改配置文件\u003c/p\u003e\n\u003cp\u003e#让虚用户获得本地用户权限\nvirtual_use_local_privs=YES\n#开启chmod命令\nchmod_enable=YES\u003c/p\u003e"
February 14, 2011
CentOS 5.5 防火墙开启、关闭以及开放指定端口
"\u003cp\u003e之前有讲过公司新买的服务器使用的是CentOS 5.5,部署好Tomcat之后却发现输入114.80.\u003cem\u003e.\u003c/em\u003e:8080(即ip:8080)却无法显示Tomcat默认的首页。因为以前部署在Win Server的VPS,Linux开发时也只用到localhost,所以就有点头大。\u003c/p\u003e\n\u003cp\u003e好吧,G一下网上有说是防火墙的问题,敲入\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e/etc/init.d/iptables stop\u003c/strong\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e关闭之后再次查看114.80.\u003cem\u003e.\u003c/em\u003e:8080(即ip:8080)发现果然成功。但是貌似安全隐患大大增加……使用\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e/etc/init.d/iptables status\u003c/strong\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e查看防火墙信息,可以看到打开的端口。那么我们把需要使用的端口打开应该是一个比较可行的办法了,命令如下:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e/sbin/iptables -I INPUT -p tcp –dport 8080 -j ACCEPT\u003c/strong\u003e #8080为指定端口\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e/etc/init.d/iptables restart\u003c/strong\u003e #重启防火墙以便改动生效,当然如果不觉得麻烦也可重启系统(命令:reboot)\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e/etc/rc.d/init.d/iptables save\u003c/strong\u003e #将更改进行保存\u003c/p\u003e\n\u003cp\u003e当然了,还 …\u003c/p\u003e"
January 16, 2011
nginx和apache下对域名进行301重定向-优化篇
"\u003cp\u003e一般网站为了将网站的权重从yoursite.com自动转向到www.yoursite.com,这里我们在nginx下来实现永久跳转.\u003c/p\u003e\n\u003cp\u003e将不带WWW的主域名重定向到带WWW的二级域名,实现两个域名合并,方法如下:\u003c/p\u003e\n\u003cp\u003eNginx配置方法:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e方法1:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eserver {\u003c/p\u003e\n\u003cp\u003eserver_name \u003ca href=\"https://www.yoursite.com\"\u003ewww.yoursite.com\u003c/a\u003e yoursite.com;\u003c/p\u003e\n\u003cp\u003eif ($host != ‘www.yoursite.com’ ) {\u003c/p\u003e\n\u003cp\u003erewrite ^/(.*)$ \u003ca href=\"http://www.yoursite.com/$1\"\u003ehttp://www.yoursite.com/$1\u003c/a\u003e permanent;\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003e…\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e方法2:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e类似apache,单独给yoursite.com做一个虚拟主机\u003c/p\u003e\n\u003cp\u003eserver {\u003c/p\u003e\n\u003cp\u003eserver_name yoursite.com;\u003c/p\u003e\n\u003cp\u003erewrite ^(.*) \u003ca href=\"http://www.yoursite.com\"\u003ehttp://www.yoursite.com\u003c/a\u003e$1 permanent;\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003eApache虚拟主机配置:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eDocumentRoot /data/www/www.yoursite.com\u003c/p\u003e\n\u003cp\u003eServerName \u003ca href=\"https://www.yoursite.com\"\u003ewww.yoursite.com\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eDirectoryIndex …\u003c/p\u003e\u003c/blockquote\u003e"
January 15, 2011
linux下which、whereis、locate、find 命令的区别
"\u003cp\u003e我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索。这些是从网上找到的资料,因为有时很长时间不会用到,当要用的时候经常弄混了,所以放到这里方便使用。\nwhich 查看可执行文件的位置\nwhereis 查看文件的位置\nlocate 配 合数据库查看文件位置\nfind 实际搜寻硬盘查询文件名称\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1、which\u003c/strong\u003e\n语法:\n[root@redhat ~]# which 可执行文件名称\n例如:\n[root@redhat ~]# which passwd\n/usr/bin/passwd\nwhich是通过 PATH环境变量到该路径内查找可执行文件,所以基本的功能是寻找可执行文件\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2、whereis\u003c/strong\u003e\n语法:\n[root@redhat ~]# whereis [-bmsu] 文件或者目录名称\n参数说 明:\n-b : 只找二进制文件\n-m: 只找在说明文件manual路径下的文件\n-s : 只找source源文件\n-u : 没有说明文档的文件\n例如:\n[root@redhat ~]# whereis passwd …\u003c/p\u003e"
January 11, 2011
apache突然出现Too many errors in select loop. Child process exiting的解决办法
"\u003cp\u003e[Fri Mar 13 19:30:08 2009] [notice] Child 2012: Acquired the start mutex.\u003c/p\u003e\n\u003cp\u003e[Fri Mar 13 19:30:08 2009] [notice] Child 2012: Starting 250 worker threads.\u003c/p\u003e\n\u003cp\u003e[Fri Mar 13 19:30:08 2009] [notice] Child 2012: Listening on port 80.\u003c/p\u003e\n\u003cp\u003e[Fri Mar 13 19:30:08 2009] [error] (OS 10038)An operation was attempted on something that is not a socket. : Too many errors in select loop. Child process exiting.\u003c/p\u003e\n\u003cp\u003e[Fri Mar 13 19:30:08 2009] [notice] Child 2012: Exit event signaled. Child process is ending.\u003c/p\u003e"
January 11, 2011
CentOS(RedHat)安装Adobe Flash Player插件 For firefox全过程
"\u003cp\u003e随便打开一个带Flash的网站,提示需要安装插件,使用firefox自带功能安装失败(图1所示)。\n浏览器默认下载安装的插件失败之后,点“手动安装”会自动跳转到Adobe Flash Player下载页面:\u003c/p\u003e\n\u003cp\u003e或者直接先打开Adobe Flash Player下载页面:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash\"\u003ehttp://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e选择”.rpm For Linux“ 显示并下载:\u003c/p\u003e\n\u003cp\u003e下载完后执行安装:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[root@CentOS Desktop]# rpm -ivh flash-plugin-9.0.124.0-release.i386.rpm\u003c/p\u003e\n\u003cp\u003ePreparing…########################################### [100%]\u003c/p\u003e\n\u003cp\u003e1:flash-plugin ########################################### [100%]\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e[root@CentOS Desktop]#\u003c/p\u003e\n\u003cp\u003e安装成功后重新重动系统既可。\u003c/p\u003e"
January 11, 2011
Linux对象存储文件系统的技术架构研究
"\u003cp\u003e随着高性能计算由传统的主机方式向网络化集群演变,传统的基于主机的存储架构已逐渐向网络化存储发展,计算和存储分离的趋势越来越明显。针对 SAN 和 NAS 的不足,国际上已开展针对 Linux 集群的新型文件系统――对象存储文件系统的研究,本文重点论述了存储对象文件系统的架构、技术特点,并针对Lustre 对象存储文件系统进行了初步测试,结果表明对象存储文件系统在可扩展性、性能、易用性等方面都有显著提高,随着网络化存储技术的不断成熟,对象存储文件系统将成为重要的发展方向。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、引言\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e高性能计算已由传统的主机方式逐渐向集群方式演变,如TOP500中,1998年只有2台系统是集群方式,而到2003年已有208台为集群系统。随着高性能计算体系结构的发展变化,传统的基于主机的存储架构已成为新的瓶颈,不能满足集群系统的需求。集群的存储系统必须有效解决两个主要问题:(1)提供共享访问数据,便于集群应用程序的编写和存储的负载均衡;(2)提供高性能的存储,在I/O级和数据吞吐率方面能满足成百上千台规模的Linux集群服务器聚合访问的需求。目前,网络化存储已成为解决集群系统高性能存储的有效技术途径。\u003c/p\u003e\n\u003cp\u003e国际 …\u003c/p\u003e"
January 2, 2011
使用 Portmaster 升级 Ports
"\u003cp\u003e\u003cstrong\u003ePortmaster\u003c/strong\u003e 是另外一个用来升级已安装的 ports 的工具。 \u003cstrong\u003ePortmaster\u003c/strong\u003e 被设计成尽可能使用 “基本” 系统中能找到的工具 (它不依赖于其他的 ports) 和 \u003ccode\u003e/var/db/pkg/\u003c/code\u003e 中的信息来检测出需要升级的 ports。你可以在 \u003ca href=\"http://www.freebsd.org/cgi/url.cgi?ports/ports-mgmt/portmaster/pkg-descr\"\u003e \u003ccode\u003eports-mgmt/portmaster\u003c/code\u003e\u003c/a\u003e 找到它:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# cd /usr/ports/ports-mgmt/portmaster\n# make install clean\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003ePortmaster\u003c/strong\u003e groups ports into four categories:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePortmaster\u003c/strong\u003e 把 ports 分成4类:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eRoot ports (不依赖其他的 ports,也不被依赖)\u003c/li\u003e\n\u003cli\u003eTrunk ports (不依赖其他的 ports,但是被其他的 ports 依赖)\u003c/li\u003e\n\u003cli\u003eBranch ports (依赖于其他的 ports,同时也被依赖)\u003c/li\u003e\n\u003cli\u003eLeaf ports (依赖于其他的 ports,但不被依赖)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e你可以使用 \u003ccode\u003e-L\u003c/code\u003e 选项列出所有已安装的 ports 和查找存在更新的 ports:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# portmaster -L …\u003c/code\u003e\u003c/pre\u003e"
January 2, 2011
/usr was not properly dismounted 解决办法
"\u003cp\u003e今日安装好freebsd系统后,就改了一下/etc/rc.conf文件,然后输入reboot重启\n重启后发现一个问题,我的用户都无法通过ttyv0-8登陆,无论什么用户,然后没办法,再重启进入单用户模式,df 发现很多区没挂上去,mount -a 挂上/etc/fstab中默认的分区,提示出来了。\n/usr was not properly dismounted\n/tmp was not properly dismounted\n/var was not properly dismounted\u003c/p\u003e\n\u003cp\u003e然后按照平时的习惯\nfsck\nfsck -y\nfsck -p\n结果问题依旧,唉!汗啊!!\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e于是上网找方法,找到了这个:\u003c/strong\u003e\n学习的BSD的教材上,作者明确指出不要用reboot和halt执行重启和关机动作,那样系统不会执行rc.shutdown脚本导致不能在文件系统上设立“清除”标记,下次开机时系统会自动调用FSCK来检查文件系统一的。\n呵呵,reboot halt -p 都不让用呵呵。没办法。只有这样用了\n\u003cstrong\u003eWARNING: / was not properly dismounted\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e我的机器只有 …\u003c/p\u003e"
December 30, 2010
怎么检查windows下apache加载的mpm模块是什么?
"\u003cp\u003e现在有很多php运行环境都apache等都用在windows主机上了,但是性能和linux上的应该有些差。于是有很多优化windows下apache性能。优化apache加载mpm是必不可少的一环。\u003c/p\u003e\n\u003cp\u003e怎么检查自己的windows服务器中apache加载的mpm模块是什么呢?\u003c/p\u003e\n\u003cp\u003e其实很简单:\u003c/p\u003e\n\u003cp\u003e“开始-运行-cmd” 打开命令提示符\u003c/p\u003e\n\u003cp\u003e执行”httpd -l”就可以了。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/12/windows_apache_modules.gif\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/12/windows_apache_modules.gif\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e"
December 28, 2010
linux下vsftpd用户和apche用户目录权限的问题
"\u003cp\u003e比如我的网站的目录在/var/www/demo下,其中网站根目录下有个upload文件夹是专门用来上传图片的。\u003c/p\u003e\n\u003cp\u003e所以我把这个目录的权限设置为了 777 ,然后通过php程序自动在upload目录下建立了一个文件夹090602,并在090602下通过程序上传一个1.jpg到这个目录下,这样出现了问题一:我通过客户端的flashfxp连接上去之后不能删除090602这个目录及其下的1.jpg,原因是这个090602和1.jpg的所有者是apache系统下的daemon组的daemon 。\u003c/p\u003e\n\u003cp\u003e问题二:我现在通过flashfxp以newuser(它是属于我新建的一个组flashfxp)登录vsftpd并在网站的upload目录下建立一个090603目录,但这样到了09年6月3号的时候php程序却不能在090603这个目录下上传文件了 。\u003c/p\u003e\n\u003cp\u003e请问有什么好的方法让upload目录下的所有目录及文件同时属于flashfxp组的newuser用户和apache系统下的daemon组的daemon用户呢?或者大家有什么更好的方法呢?\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e呵呵,解决了,方法如下:\n把 newuser 和 daemon 这两个用 …\u003c/p\u003e\u003c/blockquote\u003e"
December 28, 2010
FreeBSD学习笔记整理(内容取自chinaunix)
"\u003cp\u003e\u003cstrong\u003e1、查看 CPU:\u003c/strong\u003e\nsysctlhw.modelhw.ncpu\ndmesg|grep”CPU:”\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2、查看内存:\u003c/strong\u003e\ndmesg|grep “real memory”|awk -F ‘[()]’ ‘{print$2,$4,$7,$8}’\n查看 swap:\ntop|grep”Swap:”|awk\u0026rsquo;{print$1,$2}’\n\u003cstrong\u003e3、查看硬盘:\u003c/strong\u003e\ndiskinfo‐vt/dev/ad0\ndisklable/dev/ad0s2#查看分区信息\n看硬盘大小:\ndmesg|grep”sector”|awk\u0026rsquo;{print$1,$2}’\ndiskinfo‐v/dev/da0|grep”inbytes”|awk‐F\u0026rsquo;[()]”{print$2}’\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e4、查看服务器品牌:\u003c/strong\u003e\ndmesg|grep”ACPIAPIC”\n\u003cstrong\u003e5、挂载文件系统:\u003c/strong\u003e\nfat32:mount_msdosfs‐Lzh_CN.eucCN/dev/ad0s1/mnt\nntfs:mount_ntfs‐CeucCn/dev/ad0s1/mnt\ncdrom:mount_cd9660/dev/acd0/mnt\n注:ntfs …\u003c/p\u003e"
December 28, 2010
增加FreeBSD服务器的swap交换分区
"\u003cp\u003e**** ****\u003cstrong\u003e晚上有客户反映服务器无法访问了,我好不容易蹭了附近邻居的一个无线网络,连上服务器后发现了很多异常链接,swap交换空间占用99%左右,日志中发现如下记录\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eJul 27 23:52:19 freebsd1 kernel: pid 49901 (httpd), uid 1002, was killed: out of swap space\u003c/p\u003e\n\u003cp\u003e立即重启了apache后,swapinfo显示占用情况很快从5%迅速上升到64%直到99%\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e在 FreeBSD 中创建交换文件\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e确认您的内核配置包含虚拟磁盘(Memory disk)驱动 (md(4))。它在 GENERIC 内核中是默认的。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003edevice md # Memory \u0026#34;disks\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003col start=\"2\"\u003e\n\u003cli\u003e创建一个交换文件 \u003cstrong\u003e64M\u003c/strong\u003e(/usr/swap0):\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# dd if=/dev/zero of=/usr/swap0 bs=1024k count=64\n\u003c/code\u003e\u003c/pre\u003e\u003col start=\"3\"\u003e\n\u003cli\u003e赋予它(/usr/swap0)一个适当的权限:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# chmod 0600 /usr/swap0\n\u003c/code\u003e\u003c/pre\u003e\u003col start=\"4\"\u003e\n\u003cli\u003e在 /etc/rc.conf 中启用交换文件: …\u003c/li\u003e\u003c/ol\u003e"
December 28, 2010
[freebsd切换]pw usermod -n name -s csh
"\u003cp\u003e\u003cstrong\u003e1、让Freebsd终端也支持彩色\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003els -G就会显示彩色\ncsh在.cshrc文件中,添加:alias ls=”ls -G”\nsh在.profile文件中,添加:alias ls=”ls -G”\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2、更改用户登陆shell\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e默认安装是使用sh登陆的,sh不支持TAB键\n要切换到csh,直接运行csh即可\u003c/p\u003e\n\u003cp\u003e如果需要一劳永逸,那么用下面这个命令\nname:是指你登陆的名称\npw usermod -n name -s csh\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3、更换提示符\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eset prompt = ” \u003ca href=\"mailto:yztgx@hotmail.com\"\u003eyztgx@hotmail.com\u003c/a\u003e # ”\n也可以将这句话加到.cshrc或者.profile配置文件中\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e4、Freebsd下支持dir\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ealias dir “ls”\n也可以将这句话加到.cshrc或者.profile配置文件中\u003c/p\u003e\n\u003cp\u003ealias类似Dos下的doskey\u003c/p\u003e\n\u003cp\u003eLinux下的修改方法参见:\u003c/p\u003e"
December 28, 2010
linux修改用户主目录的方法
"\u003cp\u003e我有两种办法,仅供参考。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e第一:修改/etc/passwd文件\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003evi /etc/passwd\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e找到要修改的用户那几行,修改掉即可。此法很暴力,建议慎用。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e第二:usermod命令\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eusermod -d /usr/newfolder -u uid\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e-u后面一定要接uid啊,不是username附:usermod详细参数\u003c/p\u003e\n\u003cp\u003e**语 法:**usermod [-LU][-c \u0026lt;备注\u0026gt;][-d \u0026lt;登入目录\u0026gt;][-e \u0026lt;有效期限\u0026gt;][- f \u0026lt;缓冲天数\u0026gt;][-g \u0026lt;群组\u0026gt;][-G \u0026lt;群组\u0026gt;][-l \u0026lt;帐号名称\u0026gt;][-s ][-u ] [用户帐号]\u003c/p\u003e\n\u003cp\u003e**补充说明:**usermod可用来修改用户帐号的各项设定。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e参 数:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e-c\u0026lt;备注\u0026gt; 修改用户帐号的备注文字。\n-d登入目录\u0026gt; 修改用户登入时的目录。\n-e\u0026lt;有效期限\u0026gt; 修改帐号的有效期限。\n-f\u0026lt;缓冲天数\u0026gt; 修改在密码过期后多少天即关闭该帐号。\n-g\u0026lt;群组\u0026gt; 修改用户所属的群组。\n-G\u0026lt;群 …\u003c/p\u003e\u003c/blockquote\u003e"
December 27, 2010
web服务器做301重定向优化设置(apache,nginx,iis)
"\u003cp\u003e做网站优化的时候,网站301重定向是一个非常重要的操作方式。这样能够把多个域名的权重集中到一个域名,例如:www.haohtml.com和 haohtml.com,我们把haohtml.com重定向到www.haohtml.com,搜索引擎在搜索的时候,会把搜索结果或者Google评级的时候都集 中到www.haohtml.com。但是,在设置301的时候,会根据服务器的不同,有不同的设置。\u003c/p\u003e\n\u003cp\u003e一般情况下,网站301重定向可以分为IIS、Apache、Nginx三种,接下来我说明一下在虚拟主机下如何实现301重定向。\u003c/p\u003e\n\u003cp\u003eIIS:如果使用ASP的网站程序,可以使用asp脚本实现301重定向:写入header.asp或者其他头部文件。\n这种方法最为简单,当然空间支持ISAPI 可以在网站根目录新建一个httpd.ini\n将haohtml.com转移到www.haohtml.com上\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[ISAPI_Rewrite]\n# 3600 = 1 hour\nCacheClockRate 3600\nRepeatLimit 32\nRewriteCond Host: ^haohtml.com.com$ …\u003c/p\u003e\u003c/blockquote\u003e"
December 27, 2010
Linux下配置vsftpd若干问题集锦
"\u003cp\u003edebian上配置vsftpd若干问题集锦\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.debian上如何安装vsftpd\u003c/strong\u003e\n很简单apt-get install vsftpd\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2.vsftpd的去除匿名用户登录问题\u003c/strong\u003e\nvi /etc/vsftpd.conf\nanonymous_enable=YES\n修改为\nanonymous_enable=NO\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3.如何更改vsftpd的默认端口\u003c/strong\u003e\nvi /etc/vsftpd.conf\n新增一行\nlisten_port=2010\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e4.如何允许本地用户登录\u003c/strong\u003e\n#local_enable=YES前面的#去掉\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e5.如何允许用户可以上传文件\u003c/strong\u003e\n#write_enable=YES前面的#去掉\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e6.如何添加一个新用户\u003c/strong\u003e\n由于我是用本地用于登录的模式,所以确定你的local_enable=YES已经开启,再做下面的工作\n首先添加一个用户组\ngroupadd ftpgroup\n然后添加用户\nuseradd blogguy_cn –g ftpgroup –d /home/blogguy.cn –s /bin/bash\npasswd blogguy_cn\n输入新密码,即可生效\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e7.如何限制新添加的用户不能使用bash登 …\u003c/strong\u003e\u003c/p\u003e"
December 27, 2010
centos5下vsftpd的设置(虚拟用户)–转
"\u003ch3 id=\"本地用户经过设置后可以进行ftp访问而匿名用户的访问经过了转换在系统中匿名用户的用户名为ftp-系统将其属性设置为-根目录-varftp-禁止控制台登陆也就是该用户只能进行ftp访问\"\u003e本地用户经过设置后可以进行\u003cstrong\u003eftp\u003c/strong\u003e访问。而匿名用户的访问经过了转换,在系统中。匿名用户的用户名为ftp, 系统将其属性设置为 根目录 /var/ftp/, 禁止控制台登陆,也就是,该用户只能进行ftp访问。\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eCentOS\u003c/strong\u003e下\u003cstrong\u003evsftpd\u003c/strong\u003e 的执行程序为 /etc/vsftpd,修改 /etc/vsftpd/vsftpd.conf文件中的listen要设置为YES.\u003c/p\u003e\n\u003cp\u003eVSFTPD有两种开机自启动模式: inet模式和standalone模式,推荐使用standalone模式。\u003c/p\u003e\n\u003cp\u003e在CentOS中已集成了VSFTPD软件。VSFTPD是一个安全高效的FTP服务软件,得到了广泛的应用。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、vsftpd 安装\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在服务中查看是否已安装VSFTPD服务。如没有,下载并安装:\u003c/p\u003e\n\u003cp\u003erpm -ivh vsftpd-2.0.5-12.el5.i386.rpm\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二、设置vsftpd自启动\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003echkconfig –level 35 vsftpd on\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e三、vsftpd配置\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1 打开 /etc/vsftpd/vsftpd.conf文件。将anonymous_enable=YES,改为anonymous_enable=NO …\u003c/p\u003e"
December 27, 2010
/etc/group 详解
"\u003cp\u003e具有某种共同特征的用户集合起来就是用户组(Group)。用户组(Group)配置文件主要有 /etc/group和/etc/gshadow,其中/etc/gshadow是/etc/group的加密信息文件;在本标题下,您还能了解到什么是GID ; ****\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1、/etc/group 解说;\u003c/strong\u003e\n/etc/group 文件是用户组的配置文件,内容包括用户和用户组,并且能显示出用户是归属哪个用户组或哪几个用户组,因为一个用户可以归属一个或多个不同的用户组;同一用 户组的用户之间具有相似的特征。比如我们把某一用户加入到root用户组,那么这个用户就可以浏览root用户家目录的文件,如果root用户把某个文件 的读写执行权限开放,root用户组的所有用户都可以修改此文件,如果是可执行的文件(比如脚本),root用户组的用户也是可以执行的; 用户组的特性在系统管理中为系统管理员提供了极大的方便,但安全性也是值得关注的,如某个用户下有对系统管理有最重要的内容,最好让用户拥有独立的用户 组,或者是把用户下的文件的权限设置为完全私有;另外root用户组一般不要轻易把普通用户加入进去. …\u003c/p\u003e"
December 27, 2010
passwd 详解
"\u003cp\u003epasswd,一种计算机命令、文件的名称。passwd命令用来更改使用者的密码,passwd文件通常在Linux系统中,用户的关键信息被存放在系统的/etc/passwd文件中\u003c/p\u003e\n\u003ch3 id=\"简介\"\u003e简介\u003c/h3\u003e\n\u003cp\u003e名称:passwd\n使用权限:所有使用者\n使用方式:passwd [-k] [-l] [-u [-f]] [-d] [-S] [username]\n说明:用来更改使用者的密码\u003c/p\u003e\n\u003ch3 id=\"参数\"\u003e参数\u003c/h3\u003e\n\u003cp\u003e-k\n-l 关闭账号密码。效果相当于usermod -L,只有root才有权使用此项。\n-u 恢复账号密码。效果相当于usermod -U,同样只有root才有权使用。\n-g 修改组密码。gpasswd的等效命令。\u003c/p\u003e\n\u003cp\u003e-f\n-d 关闭使用者的密码认证功能, 使用者在登入时将可以不用输入密码, 只有具备 root 权限的使用者方可使用.\n-S 显示指定使用者的密码认证种类, 只有具备 root 权限的使用者方可使用.\n[username] 指定帐号名称\u003c/p\u003e\n\u003ch3 id=\"简介-1\"\u003e\u003cstrong\u003e简介\u003c/strong\u003e\u003c/h3\u003e\n\u003cp\u003e通常在Linux系统中,用户的关键信息被存放在系统的/etc/passwd文件中,系统的每一个合法用户账号对应于该文件中的一行记录。这行记录定义了每个用户账号的属性。\u003c/p\u003e\n\u003ch3 id=\"示例\"\u003e示例\u003c/h3\u003e\n\u003cp\u003e …\u003c/p\u003e"
December 27, 2010
修改Nginx的header伪装服务器
"\u003cp\u003e有时候为了伪装自己的真实服务器环境.\u003c/p\u003e\n\u003cp\u003e不像让对方知道自己的webserver真实环境,就不得不修改我们的webserer软件了!\u003c/p\u003e\n\u003cp\u003e今天看了一下baidu.com的webserver感觉像是nginx修改的.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eC:curl-7.18.0\u0026gt;curl.exe -I \u003ca href=\"https://www.baidu.com\"\u003ewww.baidu.com\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHTTP/1.1 200 OK\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eDate: Tue, 11 Mar 2008 05:00:39 GMT\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eServer: BWS/1.0\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eContent-Length: 3022\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eContent-Type: text/html\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eCache-Control: private\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eExpires: Tue, 11 Mar 2008 05:00:39 GMT\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSet-Cookie: BAIDUID=41BB2845D3E8BC1AEE99D4CECB90C50A:FG=1; expires=Tue, 11-\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e8 05:00:39 GMT; path=/; domain=.baidu.com\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eP3P: CP=” OTI DSP COR IVA …\u003c/p\u003e\u003c/blockquote\u003e"
December 27, 2010
nginx上如何支持.htaccess伪静态转向
"\u003cp\u003e我们知道在apache上有一个常用的功能.htaccess转向,只要apache编译的时候指明支持rewrite模块就可以了。\u003c/p\u003e\n\u003cp\u003e但是换到nginx上方法会有一点不一样,网上很多人说把.htaccess转向规则写到nginx的配置文件里面,这个办法是官方提供的方法之一,肯定是可行的。但是这个方法有一个缺陷:不方便,下次你要更改一个伪静态转向规则的时候还得去nginx的配置文件或者nginx的虚拟网站的配置文件里面去改,相比apache直接在目录下放置.htaccess文件,nginx的这个办法显然很原始。\u003c/p\u003e\n\u003cp\u003e不过不要紧,其实是有办法的,在nginx的配置文件中 \u003cstrong\u003einclude .htaccess\u003c/strong\u003e 文件就可以实现相同的功能了。\u003c/p\u003e\n\u003cp\u003e举个例子,我现在要把www.blogguy.cn的.htaccess从apache上迁移到nginx上,可以需要以下几个步骤:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e第一步:修改.htaccess文件\u003c/strong\u003e,因为apache的rewrite转向规则跟nginx的转向规则还是有一些不一样的,典型的不一样有nginx的根目录需要写在每行转向的地址前,每行规则必须以分号(;)结束,301或者404等跳转使用不同的格 …\u003c/p\u003e"
December 26, 2010
Freebsd下Vsftpd配置虚拟用户
"\u003cp\u003e注意:教程中的英文词组的首字母应该为小写才对.\u003c/p\u003e\n\u003cp\u003e很久没有发新篇了,其实是很久没上来看了,前段时间实在太忙,还经常加班,现在终于可以喘口气了。北京的天气,近期真是春光明媚啊,呵呵,是时候外出活动了。上上周末打了词羽毛球,这周末也有计划,嘿嘿,要是身体允许的话周日去爬山吧,香山 或者 邻居推荐的鹫峰。\u003c/p\u003e\n\u003cp\u003e前段时间主要忙于我的系统下的sebsd的策略设置,但是首先就需要熟悉各种服务本身的配置,有关NAMED的比较简单,但是关于VSFTPD的还比较麻烦,写了份文档,贴在这里,也算留个纪念吧。\u003c/p\u003e\n\u003cp\u003eFREEBSD 的 VSFTPD设置\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e说明\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eVSFTPD是一个安全高效的FTP服务软件,得到了广泛的应用。\u003c/p\u003e\n\u003cp\u003e本地用户经过设置后可以进行ftp访问。而匿名用户的访问经过了转换,在系统中。匿名用户的用户名为ftp, 系统将其属性设置为 根目录 /var/ftp/, 禁止控制台登陆,也就是,该用户只能进行ftp访问。\u003c/p\u003e\n\u003cp\u003eFreeBSD下vsftpd 的执行程序为 /usr/local/libexec/vsftpd, 一般情况下调用 /usr.local/libexec/vsftpd \u0026amp; 即可启 …\u003c/p\u003e"
December 26, 2010
为VSFTPD配置虚拟用户(文本方式)
"\u003cp\u003e创建虚拟与用户数据库\u003c/p\u003e\n\u003cp\u003e**1. 创建loguser.txt,**格式如下:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003euserid\npass\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e比如我创建两个用户:tony 密码为tonypass,etony密码为etonypass 则loguser.txt的内容如下:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003etony\ntonypass\netony\netonypass\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e2. 安装数据库生成工具:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# aptitude install libdb3-util\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e3. 生成数据库:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# db_load -T -t hash -f loguser.txt /etc/vsftpd_login.db\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e4. 设置数据库文件的访问权限:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# chmod 600 /etc/vsftpd_login.db\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e配置PAM文件\u003c/p\u003e\n\u003cp\u003e修改/etc/pam.d/vsftpd 内容如下:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eauth required /lib/security/pam_userdb.so db=/etc/vsftpd_login\naccount required /lib/security/pam_userdb.so db=/etc/vsftpd_login\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e为虚拟用户创建本地系统用户\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003euseradd -d …\u003c/p\u003e\u003c/blockquote\u003e"
December 26, 2010
[教程]FreeBSD vsftpd+pam虚拟用户方案配置
"\u003cp\u003e\u003cstrong\u003e1. vsftpd安装\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e****cd /usr/ports/ftp/vsftpd\nmake install clean\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e2. vsftpd的配置文件与启动文件\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e****(1)配置文件的位置 /usr/local/etc/vsftpd.conf\n(2)启动文件的位置 /usr/local/libexec/vsftpd\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e3. vsftpd虚拟用户的配置\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003evi /usr/local/etc/vsftpd.conf\u003c/p\u003e\n\u003cp\u003eanonymous_enable=NO\nlocal_enable=YES\nwrite_enable=YES\nlocal_umask=022\u003c/p\u003e\n\u003cp\u003eanon_upload_enable=NO\nanon_mkdir_write_enable=NO\u003c/p\u003e\n\u003cp\u003e#限制本地用户在自己的目录里,这里将chroot_list_enable=YES 和chroot_list_file=/任意路径/vsftpd.chroot_list 注释掉(切记:以后添加新ftp账户的时候,需要在此文件里也添加一行,来对用户进行锁定在自己的目录里,否则是非常的危险的)\nchroot_local_user=YES …\u003c/p\u003e\u003c/blockquote\u003e"
December 26, 2010
FreeBSD下的重装系统方法
"\u003cp\u003e都知道windows下系统挂了.从新装C盘.D.E.F其他盘的数据不会受影响.\u003c/p\u003e\n\u003cp\u003eFreebsd也可以.系统挂了从新安装的时候.只需要从新定义一下分区就可以了.\u003cstrong\u003e注意:\u003c/strong\u003e 这里的分区是在第一次安装系统的时候,手动分的/tmp,/usr/,/var分区,并非在/分区里面.否则无法使用此方法!!!先将安装光盘放入cd中. 登录系统后输入df查看分区.如果怕记性不好可以保存一张抓图.用IP命名保存好.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/12/freebsd_df.gif\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/12/freebsd_df.gif\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e系统挂了从新安装的时候.Fdisk直接Q跳过.不用做任何更改.到Label的时候需要注意了.\n重装系统时.默认的分区状态会显示如下\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/12/freebsd_label_disk.gif\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/12/freebsd_label_disk.gif\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e关于下面的这几个参数.我来简单的介绍一下.翻译技术不高.理解就行.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/12/freebsd_label_command.gif\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/12/freebsd_label_command.gif\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eCCreate// 创建DDelete// 删除MMount pt// 挂载WWrite// 写入NNewfs opts// 修改分区的文件系统QFinish// 完成SToggle softupdates// 启用/停用 SoftUpdates 模式ZCustom newfs// 常用的文件系统TToggle newfs// 是否格式化分区UUndo// 撤销先前所有操作AAuto …\u003c/p\u003e"
December 26, 2010
Error:/etc/fstab:Read-only file system错误的解决办法
"\u003cp\u003e在单用户模式下,修改/etc/fstab的时候出现这个错误:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eError:/etc/fstab:Read-only file system\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eRead-only file system 的原因很多。先重启一下的,看看能否解决的,如果重启还是解决不了,用命令:\u003c/p\u003e\n\u003cp\u003e修改挂载点/的权限为可读取模式:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003emount -o rw /dev/ad0s1a /\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e此时可用mount查看\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#mount\n/dev/ad0s1a on / (ufs, local)\ndevfs on /dev(devfs, local, multilabel)\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e然后再编辑/etc/fstab,保存即可.\u003c/p\u003e\n\u003cp\u003e或者用这个命令:\u003c/p\u003e\n\u003cp\u003e或者用\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#fsck -fy /\n#mount -u /\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e自己没有测试过,网上找的。\u003c/p\u003e\n\u003cp\u003e相关文档:\u003c/p\u003e"
December 26, 2010
合并分区时,出现kern.geom.debugflags=16 提示信息的解决办法
"\u003cp\u003e在用sysinstall将原来一个硬盘的两个分区要合并在一个分区的时候,按W进行保存的时候,提示信息 “kern.geom.debugflags=16…”之类的信息,此时退出sysinstall模式,回到命令行状态下,扫行以下命令:\u003c/p\u003e\n\u003cp\u003e# sysctl kern.geom.debugflags=16\nkern.geom.debugflags: 0-\u0026gt;16\u003c/p\u003e\n\u003cp\u003e再用sysinstall命令里的label合并分区即可.\u003c/p\u003e"
December 26, 2010
Snapshot appears to have been created more than one day into the future!
"\u003cp\u003e本地刚装完freebsd7.0,连上ssh,portsnap fetch extract一下,提示:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSnapshot appears to have been created more than one day into the future!\n(Is the system clock correct?)\nCowardly refusing to proceed any further.\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e原来是安装时系统时间不正确\n执行代码:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003entpdate pool.ntp.org\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e然后再执行portsnap fetch即可.\u003c/p\u003e"
December 25, 2010
FreeBSD下添加新硬盘
"\u003cp\u003e\u003ca href=\"http://cnsnap.cn.freebsd.org/doc/zh_CN.GB2312/books/handbook/disks-adding.html\"\u003ehttp://cnsnap.cn.freebsd.org/doc/zh_CN.GB2312/books/handbook/disks-adding.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003esysinstall的方法:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1.切换到 \u003cstrong\u003eroot\u003c/strong\u003e 用户。运行 ** \u003ccode\u003esysinstall\u003c/code\u003e** ,然后选择 \u003ccode\u003eConfigure\u003c/code\u003e 菜单。在 \u003ccode\u003eFreeBSD Configuration Menu\u003c/code\u003e 下,上下滚动, 选择 \u003ccode\u003eFdisk\u003c/code\u003e 条目。\u003c/p\u003e\n\u003cp\u003e2.进入 \u003cstrong\u003efdisk\u003c/strong\u003e 分区编辑器后,选择 \u003ccode\u003eA\u003c/code\u003e ,FreeBSD 将使用全部的磁盘。当被告知 “remain cooperative with any future possible operating systems”时,回答 \u003ccode\u003eYES\u003c/code\u003e。使用 \u003cstrong\u003eW\u003c/strong\u003e 保存刚才的修改。现在使用 \u003cstrong\u003eQ\u003c/strong\u003e 退出 FDISK 编辑器。下面会看到有关 “主引导区” 的信息。 现在您已经在运行的系统上添加了一个磁盘, 因此应该选择 ** \u003ccode\u003eNone\u003c/code\u003e**。\u003c/p\u003e\n\u003cp\u003e这里只是选择了硬盘,下面的第3才是真正的开始对磁盘进行分区.\u003c/p\u003e\n\u003cp\u003e3.接下来,您应该退出 \u003cstrong\u003esysinstall\u003c/strong\u003e 并且再次启动它(一些配置需要应用),并按照上面的步骤直接进入 \u003ccode\u003eLabel\u003c/code\u003e 选项。 …\u003c/p\u003e"
December 25, 2010
FreeBSD中的磁盘组织
"\u003ch1 id=\"35-磁盘组织\"\u003e3.5 磁盘组织\u003c/h1\u003e\n\u003cp\u003eFreeBSD 查找文件的最小单位是文件名。 而文件名区分大小写,这就意味着 readme.txt 和 README.TXT 是两个不相同的文件。 FreeBSD 不凭文件扩展名 (.txt) 去识别这个文件是 程序、 文档, 或是其他格式的数据。\u003c/p\u003e\n\u003cp\u003e各种文件存放在目录里。 一个目录可以为空, 也可以含有多个的文件。一个目录同样可以包含其他的目录, 允许您在一个目录里建立多个不同层次的目录。 这将帮助您轻松地组织您的数据。\u003c/p\u003e\n\u003cp\u003e文件或目录是由文件名或目录名,加上斜线符号 /, 再根据需要在目录名后面加上其他目录的名称。 如果您有一个名为 foo 的目录, 它包含另一个目录 bar, 后者包括一个叫 readme.txt 的文件, 则全名, 或者说到文件的 \u003cem\u003e路径\u003c/em\u003e 就是 foo/bar/readme.txt。\u003c/p\u003e\n\u003cp\u003e在文件系统里目录和文件的作用是存储数据。 每一个文件系统都有且只有一个顶级目录 \u003cem\u003e根目录\u003c/em\u003e, 这个根目录则可以容纳其他目录。\u003c/p\u003e\n\u003cp\u003e您也许在其他的一些操作系统碰到类似这里的情况, 当然也有不同的情况。 举些例子, MS-DOS® 是用 \\ 分隔文件名或目录名, 而 Mac OS® …\u003c/p\u003e"
December 24, 2010
kern.maxfiles limit exceeded by uid 80,please see tuning(7)的解决办法
"\u003cp\u003e# sysctl kern.maxfiles\nkern.maxfiles: 3912\u003c/p\u003e\n\u003cp\u003e这个值太小了,需要修改一下\u003c/p\u003e\n\u003cp\u003e通过#sysctl 命令可以查看所有内核配置的信息\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.51docs.net/FreeBSD-Manual/kernelconfig.html\"\u003e配置FreeBSD的内核 http://www.51docs.net/FreeBSD-Manual/kernelconfig.html\u003c/a\u003e\u003c/p\u003e"
December 21, 2010
nginx下实现浏览目录的功能
"\u003cp\u003enginx默认是不允许列出整个目录的。如需此功能,需要修改nginx的配置文件.方法如下:\n打开nginx.conf文件,在location server 或 http段中加入\n\u003cstrong\u003eautoindex on\u003c/strong\u003e;\n另外两个参数最好也加上去:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eautoindex_exact_size off;\n默认为on,显示出文件的确切大小,单位是bytes。\n改为off后,显示出文件的大概大小,单位是kB或者MB或者GB\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eautoindex_localtime on;\n默认为off,显示的文件时间为GMT时间。\n改为on后,显示的文件时间为文件的服务器时间\u003c/p\u003e\n\u003cp\u003e详细参照: \u003ca href=\"http://wiki.nginx.org/NginxChsHttpAutoindexModule\"\u003ehttp://wiki.nginx.org/NginxChsHttpAutoindexModule\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e如果想希望目录列表支持header,footer则可以安装三方插件:\n\u003ca href=\"http://wiki.nginx.org/NginxNgxFancyIndex\"\u003ehttp://wiki.nginx.org/NginxNgxFancyIndex\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e或者直接修改nginx源码,如\n\u003ca href=\"http://docs.linuxtone.org/\"\u003ehttp://docs.linuxtone.org\u003c/a\u003e 即为简单修改NGINX源码得到的效果.\u003c/p\u003e\n\u003cp\u003e来源: …\u003c/p\u003e"
December 20, 2010
Nginx中文件缓存设置
"\u003cp\u003e\u003cstrong\u003e十三 Nginx Cache 服务配置\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e如果需要将文件缓存到本地,则需要增加如下几个子参数:\u003c/p\u003e\n\u003cp\u003eproxy_store on 用来启用缓存到本地的功能\u003c/p\u003e\n\u003cp\u003eproxy_store_access user:rw group:rw all:rw;\u003c/p\u003e\n\u003cp\u003eproxy_temp_path 缓存目录;\u003c/p\u003e\n\u003cp\u003e在经过上一步配置之后,虽然文件被缓存到本地磁盘上,但每次请求仍会向远端拉取文件,为了避免去远端拉取文件,必须修改proxy_pass代码:\u003c/p\u003e\n\u003cp\u003eif ( ! -e $request_file) {\u003c/p\u003e\n\u003cp\u003eproxy_pass http://freeke;\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003e即修改为有条件地去执行proxy_pass,这个条件就是当的文件在本地的proxy_temp_path指定的目录下不存在时,再向后端拉取.\u003c/p\u003e\n\u003cp\u003e摘自:Nginx指南\u003c/p\u003e"
December 20, 2010
[教程]FreeBSD+nginx下Awstats安装(原创)
"\u003cp\u003e\u003cstrong\u003e一.安装\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e注:我安装的时候为7.0的,这篇文章本人没有进行测试\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#cd /usr/ports/www/awstats #make install\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e跟 Apache HTTP Server(以下称 Apache)不同的是,Apache 可以将日志输出通过管道的方式进行重新定向,依此来进行自动的日志切割。Nginx 在现今版本上还没能跟 Apache 一样,通过%YY等参数按日期分批创建日志,但是通过给 nginx 进程发送一个特定的信号,可以使 nginx 重新生成日志文件。我们可以定期执行一个 Shell 脚本来切换日志,重新命名或转移,具体的脚本如下:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# mv /opt/nginx/logs/access.log /opt/nginx/logs/access_`date +%Y%m%d`.log\n# killall –s USR1 nginx\t#使用USR1参数通知Nginx进程切换日志文件\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e将以上脚本内容保存为文件名为 logcron.sh 存到自定的目录中,例如 /usr/local/etc/nginx/logcron.sh 使用 Crontab …\u003c/p\u003e"
December 20, 2010
使用 awstats 分析 Nginx 的访问日志
"\u003cp\u003eauth_basic “admin”; #用户名\u003c/p\u003e\n\u003cp\u003eauth_basic_user_file /opt/ngx/conf/admin.pass; #密码包路径\u003c/p\u003e\n\u003cp\u003e这篇文章内容部分有问题的,大家用的时候注意一下.特别是nginx的虚拟主机采用apache密码认证那一块的\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eauth_basic \u0026#34;admin\u0026#34;; #用户名\n/opt/ngx/conf/admin.pass; #密码包路径\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e正解的格式应该为:\n\u003c/code\u003e\u003c/pre\u003e\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eauth_basic \u0026#34;admin\u0026#34;; #用户名\nauth_basic_user_file /opt/ngx/conf/admin.pass; #密码包路径\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e**主要目录有三个:**\u003cstrong\u003e1./data/web\u003c/strong\u003e #虚拟主机根目录 \u003cstrong\u003e2./data/webroot/awstats\u003c/strong\u003e #开始统计分析Awstats 日志(分析前需要将运行日志切割脚本 logcron.sh),\u003c/p\u003e\n\u003cp\u003e分析脚本为:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#/usr/local/awstats/wwwroot/cgi-bin/awstats.pl -update -config=www.moabc.net …\u003c/p\u003e\u003c/blockquote\u003e"
December 20, 2010
php中is_file和file_exists效率的比较
"\u003cp\u003e下面是测试代码,分别循环10000次:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e$start_time = get_microtime();\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003efor($i=0;$i\u0026lt;10000;$i++)\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e{\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eif(is_file(‘url.txt’)) {\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e//do nothing;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e}\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e}\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eecho ‘is_file耗时–\u0026gt;’.(get_microtime() – $start_time).'\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e’;\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e$start_time = get_microtime();\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003efor($i=0;$i\u0026lt;10000;$i++)\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e{\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eif(file_exists(‘url.txt’)) {\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e//do nothing;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e}\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e}\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eecho ‘file_exits–\u0026gt;’.(get_microtime() – $start_time).'\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e’;\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003efunction get_microtime()//时间\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e{\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003elist($usec, $sec) = explode(‘ ‘, microtime()); …\u003c/p\u003e\u003c/blockquote\u003e"
December 18, 2010
FreeBSD系统时间调整
"\u003cp\u003e先设置时区:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# tzsetup\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e再与国家授时中心服务器对时:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# ntpdate 210.72.145.44\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e以后自动同步:\u003c/p\u003e\n\u003cp\u003e首先修改 /etc/rc.conf 添加\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003entpd_enable=”YES”\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e到最后一行。\u003c/p\u003e\n\u003cp\u003e然后配置对时服务器:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# vi /etc/ntp.conf\u003c/p\u003e\n\u003cp\u003eserver 210.72.145.44 prefer\nserver 159.226.154.47\nserver 127.127.1.0\nfudge 127.127.0.1 stratum 5\nrestrict default ignore\nrestrict 127.0.0.0 mask 255.0.0.0\nrestrict 192.168.0.0 mask 255.255.255.0 noquery nopeer notrust\nrestrict 210.72.145.44 noquery\nrestrict 159.226.154.47 noquery\ndriftfile /var/db/ntpd.drift\u003c/p\u003e\n\u003cp\u003e#/var/run/xntpd.pid\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e参考:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://hi.baidu.com/hisbox/blog/item/e1a831a443be88f79152eee4.html\"\u003eFreeBSD系统时间调整\u003c/a\u003e\u003ca href=\"http://www.oklinux.cn/html/other/unix/20070423/22119.html\"\u003e让FreeBSD使 …\u003c/a\u003e\u003c/p\u003e"
December 17, 2010
PS 命令详解
"\u003cp\u003e/bin/ps\u003c/p\u003e\n\u003cp\u003eps 是显示瞬间行程的状态,并不动态连续;如果想对进程运行时间监控,应该用 top 工具。\u003c/p\u003e\n\u003cp\u003ekill 用于杀死进程。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eps 的参数说明\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003el 长格式输出;\u003c/p\u003e\n\u003cp\u003eu 按用户名和启动时间的顺序来显示进程;\u003c/p\u003e\n\u003cp\u003ej 用任务格式来显示进程;\u003c/p\u003e\n\u003cp\u003ef 用树形格式来显示进程;\u003c/p\u003e\n\u003cp\u003ea 显示所有用户的所有进程(包括其它用户);\u003c/p\u003e\n\u003cp\u003ex 显示无控制终端的进程;\u003c/p\u003e\n\u003cp\u003er 显示运行中的进程;\u003c/p\u003e\n\u003cp\u003eww 避免详细参数被截断;\u003c/p\u003e\n\u003cp\u003e-A 列出所有的行程\n-w 显示加宽可以显示较多的资讯\n-au 显示较详细的资讯\n-aux 显示所有包含其他使用者的行程\u003c/p\u003e\n\u003cp\u003e-e 显示所有进程,环境变量\n-f 全格式\n-h 不显示标题\n-l 长格式\n-w 宽输出\na 显示终端上地所有进程,包括其他用户地进程\nr 只显示正在运行地进程\nx 显示没有控制终端地进程\u003c/p\u003e\n\u003cp\u003e我们常用的选项是组合是 aux 或 lax,还有参数 f 的应用。\u003c/p\u003e\n\u003cp\u003eO[+|-] k1 [,[+|-] k2 [,…]] 根据SHORT KEYS、k1、k2中快捷键指定地多级排序顺序显示进程列表.\n对于ps地不同格式都存在着默认地顺序指定.这些默认顺序可以被用户地指定所覆盖.在这 …\u003c/p\u003e"
December 17, 2010
linux中关于crontab的日志存放
"\u003cp\u003e默认情况下,crontab中执行的日志写在/var/log下,如:\u003c/p\u003e\n\u003cp\u003e#ls /var/log/cron*\u003c/p\u003e\n\u003cp\u003e/var/log/cron /var/log/cron.1 /var/log/cron.2 /var/log/cron.3 /var/log/cron.4\u003c/p\u003e\n\u003cp\u003ecrontab的日志,当crond执行任务失败时会给用户发一封邮件.如果在服务器上发现一个任务没有正常执行,而crond发邮件也失败.通过看mail的日志,看是否是磁盘空间不够造成的\u003c/p\u003e\n\u003cp\u003e将cornd错误输出和标准输出日志都指向自定义的日志文件:\u003c/p\u003e\n\u003cp\u003e0 6 * * * $HOME/fro_crontab/createTomorrowTables\u0026raquo;$HOME/for_crontab/mylog.log 2 \u0026gt;\u0026amp;1\u003c/p\u003e\n\u003cp\u003eFreeBSD下cron日志文件为 /var/log/cron.\u003c/p\u003e\n\u003cp\u003e对于crontab的详细介绍请参考:\u003c/p\u003e"
December 17, 2010
FreeBSD下安装 VMware Tools
"\u003cp\u003eInstall VMware Tools in a FreeBSD Guest\u003c/p\u003e\n\u003cp\u003eBefore you begin, make sure the virtual machine is powered on and the guest operating system is running.\u003c/p\u003e\n\u003cp\u003eTo install VMware Tools in a FreeBSD guest\u003c/p\u003e\n\u003cp\u003e1\u003c/p\u003e\n\u003cp\u003eOn the host, select VM \u0026gt; Install VMware Tools.\u003c/p\u003e\n\u003cp\u003eIf an earlier version of VMware Tools is installed, the menu item is Update VMware Tools. If the current version is installed, the menu item is Reinstall VMware Tools.\u003c/p\u003e"
December 17, 2010
freeBSD 安装php扩展:iconv
"\u003cp\u003e对于Linux下安装php扩展的教程,请参考这里:\u003c/p\u003e\n\u003cp\u003eFreeBSD上默认安装php的时候不会带iconv扩展,因此不会有iconv这个函数。\n利用port方式安装(如果系统上没有port树,参考 \u003ca href=\"http://blog.haohtml.com/index.php/archives/830\"\u003efreeBSD 利用portsnap更新port\u003c/a\u003e,利用portsnap获取一份最新的port树),过程如下:\n\u003cstrong\u003e获取php5源文件包\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e****#cd /usr/ports/lang/php5\n#make fetch\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e默认情况下,源码包会下载到/usr/ports/distfiles/目录下\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e安装iconv\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e****#cd ../../distfiles/\n#tar -xjvf php-5.2.11.tar.bz2\n#cd php-5.2.11/ext/iconv\n#phpize\n#./configure\n#make\n#make install\nInstalling shared extensions: /usr/local/lib/php/20060613/\nInstalling header files: /usr/local/include/php/\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e将扩展模块 …\u003c/strong\u003e\u003c/p\u003e"
December 17, 2010
FreeBSD中sysctl命令的使用
"\u003cp\u003e纪录尝试向你的机器要求你机器未有的服务的connection记录\n若你的机器没有跑named 而对方想要向您要求DNS的服务你会看到…\u003c/p\u003e\n\u003cp\u003e$tail -10 /var/log/message\u003c/p\u003e\n\u003cp\u003eohaha /kernel: Connection attempt to TCP 你的IP位置:53 from 对方IP位置:2731\u003c/p\u003e\n\u003cp\u003e其中2731 乃是只某一个高於1024的high port …\u003c/p\u003e\n\u003cp\u003e命令:\n# sysctl -w net.inet.tcp.log_in_vain=1\n# sysctl -w net.inet.udp.log_in_vain=1\u003c/p\u003e\n\u003cp\u003e不过这样只有短暂的 重开机就没有了….\n所以我们把他写成一个档案放到rc.d 之中…\u003c/p\u003e\n\u003cp\u003e自动执行:\n1.建立档案\n/usr/local/etc/rc.d/# vi logstart.sh\n(自己取一个格式为*.sh的档案)\n内容只有两行…\nsysctl -w net.inet.tcp.log_in_vain=1\nsysctl -w net.inet.udp.log_in_vain=1\u003c/p\u003e\n\u003cp\u003e2.更改权限\nchmod 700 logstart.sh …\u003c/p\u003e"
December 17, 2010
sysctl命令简介
"\u003cp\u003esysctl配置和显示在/proc/sys目录中的内核参数.能够用sysctl来配置或重新配置连网功能,如IP转发、IP碎片去除连同源路由检查等。用户只需要编辑/etc/sysctl.conf文档,即可手工或自动执行由sysctl控制的功能。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e命令格式:\u003c/strong\u003e\nsysctl [-n] [-e] -w variable=value\nsysctl [-n] [-e] -p (default /etc/sysctl.conf)\nsysctl [-n] [-e] -a\n\u003cstrong\u003e常用参数的意义:\u003c/strong\u003e\n-w 临时改变某个指定参数的值,如\nsysctl -w net.ipv4.ip_forward=1\u003c/p\u003e\n\u003cp\u003e-a 显示任何的系统参数\n-p 从指定的文档加载系统参数,如不指定即从/etc/sysctl.conf中加载\n-e Use this option to ignore errors about unknown keys\n假如仅仅是想临时改变某个系统参数的值,能够用两种方法来实现,例如想启用IP路由转发功能:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e#echo 1 \u0026gt; /proc/sys/net/ipv4/ip_forward …\u003c/li\u003e\u003c/ol\u003e"
December 17, 2010
freebsd /usr 如何加空间
"\u003cp\u003eln -s /usr/tmpbak /tmp这样你的/tmp目录就可以使用/usr分区的空间。\u003c/p\u003e\n\u003cp\u003e1.找到不用的分區或者硬盘\n2.newfs /dev/“你的分区或者硬盘”\n3.mount /dev/“你的分区或者硬盘” /mnt\n4.cd “你要扩大空间的目录”\n5.tar cf – * |(cd /mnt ; tar xf -)\n6.修改/etc/fstable ,挂載到你要擴展的目錄。\n7.reboot\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e在添加物理硬盘后操作:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e/stand/sysinstall\u003c/p\u003e\n\u003cp\u003e选择configure–\u0026gt;进入下一级菜单\u003c/p\u003e\n\u003cp\u003e选择FDisk–\u0026gt;进入下一级菜单\u003c/p\u003e\n\u003cp\u003e选择要分区的硬盘;进而磁盘分片界面;\n进行分片(create slice)操作;并保存W(write);\n系统提示选择磁盘加载模式,选择”standard”\u003c/p\u003e\n\u003cp\u003e选择Disklabel–\u0026gt;进而磁盘分区界面;\nC(Create)创建分区;\nM (M = Mount pt.)定义分区的加载点; #这步非常关键!\nW (write);存盘 #根据提示选择Yes,系统会调用Newfs进行 …\u003c/p\u003e"
December 17, 2010
FreeBSD交换分区大小的重要性
"\u003cp\u003e查看交换分区大小:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#swapinfo -m\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e前天给数据库服务器添加完内存,发现系统运行不太正常,效率比较低下,vmstat 中 faults 的 system call 比较高,有点怀疑是交换分区比物理内存少的缘故(交换分区还是原来的6G内存的大小)。再次温习 \u003ca href=\"http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/configtuning-initial.html\"\u003e手册\u003c/a\u003e:\u003c/p\u003e\n\u003cp\u003eThe kernel’s VM paging algorithms are tuned to perform best when the swap partition is at least two times the size of main memory. Configuring too little swap can lead to inefficiencies in the VM page scanning code and might create issues later if more memory is added.\u003c/p\u003e\n\u003cp\u003e后将交换区增加到物理内存的两倍,虽然效率没有完全恢复,但目前看来还是好了很多。(由于是现有系统,只能通过添加 \u003ca href=\"http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/adding-swap-space.html\"\u003eSwapfiles\u003c/a\u003e 的方式增加交换分区,但基于 Swapfiles 方式对性 …\u003c/p\u003e"
December 17, 2010
FreeBSD下添加交换分区大小
"\u003cp\u003e\u003cstrong\u003e11.14 添加交换空间\u003c/strong\u003e\n不管您计划得如何好,有时候系统并不像您所期待的那样运行。 如果您发现需要更多的交换空间,添加它很简单。 有三种方法增加交换空间:添加一块新的硬盘驱动器、通过 NFS 使用交换空间和在一个现有的分区上创建一个交换文件。\u003c/p\u003e\n\u003cp\u003e要了解关于如何加密交换区, 相关配置, 以及为什么要这样做, 请参阅手册的 \u003ca href=\"http://cnsnap.cn.freebsd.org/doc/zh_CN.GB2312/books/handbook/swap-encrypting.html\"\u003e第 18.17 节\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e11.14.1 在新的硬盘驱动器上使用交换空间\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e这是添加交换空间最好的方法, 当然为了达到这个目的需要添加一块硬盘。 毕竟您总是可以使用另一块磁盘。如果能这么做, 重新阅读一下手册中关于交换空间的 \u003ca href=\"http://cnsnap.cn.freebsd.org/doc/zh_CN.GB2312/books/handbook/configtuning-initial.html\"\u003e第 11.2 节\u003c/a\u003e 来了解如何最优地安排交换空间。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e11.14.2 通过 NFS 交换\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e除非没有可以用作交换空间的本地硬盘时, 否则不推荐您使用 NFS 来作为交换空间使用。 NFS 交换会受到可用网络带宽限制并且增加 NFS 服务器的负担。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e11.14.3 交换文件\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e您可以创建一个指定大小的文件用来当作交换文件。 在我们的例子中我们将会使用叫做 /usr/swap0 的 64MB 大小的文件。当然您也可以使用任何您所希望的名字。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e例 11-1. …\u003c/strong\u003e\u003c/p\u003e"
December 17, 2010
freebsd下用growfs 动态增加UFS 分区大小
"\u003cp\u003e/data 不够用了,咋办?\u003c/p\u003e\n\u003cp\u003e[root@mercury8] ~# /usr/local/etc/rc.d/nginx stop\u003c/p\u003e\n\u003cp\u003e代码:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eStopping nginx.\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e[root@mercury8] ~# umount /data\u003c/p\u003e\n\u003cp\u003e[root@mercury8] ~# fdisk -BI da1\u003c/p\u003e\n\u003cp\u003e代码:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e******* Working on device /dev/da1 ******* fdisk: Class not found\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e用sysinstall 的 fdisk 察看能扩展到哪个扇区:超出没关系,会提示你正确的最大值。\u003c/p\u003e\n\u003cp\u003e引用:\u003c/p\u003e\n\u003cp\u003eDisk name: da1 FDISK Partition Editor\u003c/p\u003e\n\u003cp\u003eDISK Geometry: 5874 cyls/255 heads/63 sectors = 94365810 sectors (46077MB)\u003c/p\u003e\n\u003cp\u003eOffset Size(ST) End Name PType Desc Subtype Flags\u003c/p\u003e\n\u003cp\u003e0 63 62 – 12 unused 0\u003c/p\u003e\n\u003cp\u003e63 94365747 94365809 da1s1 8 freebsd 165 …\u003c/p\u003e"
December 17, 2010
如何调整Linux磁盘分区的大小
"\u003cp\u003e在使用linux的过程中, 有时会出现因为安装系统时分区不当导致有的分区空间不足,而有的分区空间过剩的情况.比如: 我在安装系统时给/usr/local分配器了5G的空间,但使用一段过程後发现, /usr/local最多只用到了1G.这样可以将/usr/local大小调整为1G. 空出4G留作他用.本文归纳了在不破快文件系统数据的前提下对文件系统大小进行调整的方法.这里采用的是”拆东墙, 补西墙”的方法.\u003c/p\u003e\n\u003cp\u003e当然, 如果你的磁盘中有未分区的空闲空间, 你就不用减小某个分区的空间了.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e准备工作\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(一) 备份\u003c/p\u003e\n\u003cp\u003e首先组好备份要更改的分区中的文件. 对磁盘的操作也许会导致数据的丢失. 开始工作之前最好将重要的数据保存到別的分区.\u003c/p\u003e\n\u003cp\u003e(二) 获取相关信息.\u003c/p\u003e\n\u003cp\u003e1, 运行 $ df , 查看文件系统信息. 记下你想要调整的分区对應的挂载点和设备文件.\u003c/p\u003e\n\u003cp\u003e这一步是为了查看/usr/local对應/dev/中的哪个设备文件. 本文以/dev/hda7为例.\u003c/p\u003e\n\u003cp\u003e2, 运行 # sudo fdisk /dev/sda . 进入fdisk , 按下p, 查看磁盘分区信息. 记下/dev/sda8的起始柱面号, 终止柱 …\u003c/p\u003e"
December 16, 2010
linux ulimit调优
"\u003cp\u003e1,说明:\nulimit用于shell启动进程所占用的资源.\n2,类别:\nshell内建命令\n3,语法格式:\nulimit [-acdfHlmnpsStvw] [size]\n\u003cstrong\u003e4,参数介绍:\u003c/strong\u003e\n-H 设置硬件资源限制.\n-S 设置软件资源限制.\n-a 显示当前所有的资源限制.\n-c size:设置core文件的最大值.单位:blocks\n-d size:设置数据段的最大值.单位:kbytes\n-f size:设置创建文件的最大值.单位:blocks\n-l size:设置在内存中锁定进程的最大值.单位:kbytes\u003c/p\u003e\n\u003cp\u003e-m size:设置可以使用的常驻内存的最大值.单位:kbytes\n-n size:设置内核可以同时打开的文件描述符的最大值.单位:n\n-p size:设置管道缓冲区的最大值.单位:kbytes\n-s size:设置堆栈的最大值.单位:kbytes\n-t size:设置CPU使用时间的最大上限.单位:seconds\n-v size:设置虚拟内存的最大值.单位:kbytes\n5.举例\n在Linux下写程序的时候,如果程序比较大,经常会遇到“段错误” (segmentation …\u003c/p\u003e"
December 16, 2010
[推荐]nginx配置文件的优化-关于nginx的一些优化
"\u003cp\u003e总结的很好的,推荐大家看看,非常有用的.\u003c/p\u003e\n\u003cp\u003e一般来说nginx配置文件中对优化比较有作用的为以下几项:\u003c/p\u003e\n\u003cp\u003eworker_processes 8;\u003c/p\u003e\n\u003cp\u003enginx进程数,建议按照cpu数目来指定,一般为它的倍数。\u003c/p\u003e\n\u003cp\u003eworker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;\u003c/p\u003e\n\u003cp\u003e为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu。\u003c/p\u003e\n\u003cp\u003eworker_rlimit_nofile 102400;\u003c/p\u003e\n\u003cp\u003e这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。\u003c/p\u003e\n\u003cp\u003euse epoll;\u003c/p\u003e\n\u003cp\u003e使用epoll的I/O模型,这个不用说了吧。\u003c/p\u003e\n\u003cp\u003eworker_connections 102400;\u003c/p\u003e\n\u003cp\u003e每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数 …\u003c/p\u003e"
December 16, 2010
Freebsd下安装bash
"\u003cp\u003eFreeBSD下默认的shell为CSH,可以通过命令\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eecho $SHELL\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e来查看系统默认的shell是哪一个的。\u003c/p\u003e\n\u003cp\u003e想知道FreeBSD都支持哪些shell,可以用下面的命令进行查看的\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#cat /etc/shells\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e默认只支持\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/bin/sh\u003c/p\u003e\n\u003cp\u003e/bin/csh\u003c/p\u003e\n\u003cp\u003e/bin/tcsh\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这三种shell的,平时我们经常用bash 来写shell脚本,特别是对于那些从linux转过来的用户来说,bash可能说无所不在的.但freebsd默认情况下并不支持bash的,我们可以手动安装一下bash的,命令如下:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.安装bash\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ecd /usr/ports/shells/bash\u003c/p\u003e\n\u003cp\u003emake install clean\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e2. 在/bin目录下面做一个符号连接。\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eln -s /usr/local/bin/bash /bin/bash\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e3.加入bash\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eecho ‘/bin/bash’ \u0026raquo; /etc/shells\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e4.更改用户shell\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003echsh -s /bin/bash root\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e5.配置\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003evi ~/.profile\u003c/p\u003e\n\u003cp\u003ealias ls=’ls -G’ # …\u003c/p\u003e\u003c/blockquote\u003e"
December 16, 2010
nginx中stub_status模块的功能
"\u003cp\u003eNginx中的stub_status模块主要用于查看Nginx的一些状态信息.\u003c/p\u003e\n\u003cp\u003e本模块默认是不会编译进Nginx的,如果你要使用该模块,则要在编译安装Nginx时指定:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e./configure –with-http_stub_status_module\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e配置示例如代码:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eserver\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e{\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003elistent 80;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eserver_name status.yourdomain.com;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003elocation / {\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003estub_status on;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eaccess_log off;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eallow 192.168.0.1.2;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003edeny all;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e}\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e}\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e======================================\u003c/p\u003e\n\u003cp\u003e语法: \u003cstrong\u003estub_status on\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e默认值:None\u003c/p\u003e\n\u003cp\u003e使用环境:location\u003c/p\u003e\n\u003cp\u003e该指令用于开启Nginx状态信息\u003c/p\u003e\n\u003cp\u003e访问以上示例中配置的 \u003ca href=\"http://status.yourdomain.com/\"\u003ehttp://status.yourdomain.com/\u003c/a\u003e,则显示的Nginx状态信息如下:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/12/nginx_stub_status.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/12/nginx_stub_status.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eActive connections:\u003c/strong\u003e 对后端发起的活动连接数. …\u003c/p\u003e"
December 15, 2010
php-fpm配置
"\u003cp\u003e`\u003c/p\u003e\n\u003cp\u003eAll relative paths in this config are relative to php\u0026rsquo;s install prefix\u003c/p\u003e\n\u003cp\u003ePid file\u003c/p\u003e\n\u003cp\u003e/usr/local/logs/php-fpm.pid\u003c/p\u003e\n\u003cp\u003eError log file\u003c/p\u003e\n\u003cp\u003e/usr/local/logs/php-fpm.log\u003c/p\u003e\n\u003cp\u003eLog level\u003c/p\u003e\n\u003cp\u003enotice\u003c/p\u003e\n\u003cp\u003eWhen this amount of php processes exited with SIGSEGV or SIGBUS \u0026hellip;\u003c/p\u003e\n\u003cp\u003e10\u003c/p\u003e\n\u003cp\u003e\u0026hellip; in a less than this interval of time, a graceful restart will be initiated.\u003c/p\u003e\n\u003cp\u003eUseful to work around accidental curruptions in accelerator\u0026rsquo;s shared memory.\u003c/p\u003e\n\u003cp\u003e1m\u003c/p\u003e\n\u003cp\u003eTime limit on waiting child\u0026rsquo;s reaction on signals from master\u003c/p\u003e"
December 15, 2010
彻底关闭FreeBSD中的sendmail服务
"\u003cp\u003eFreeBSD系统中的sendmail一直默认启动,而且不容易关闭。必须修改配置文件rc.conf,并一关闭几个相关进程才行。\u003c/p\u003e\n\u003cp\u003e在/etc/rc.conf文件中加入下面几行:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003esendmail_enable=”NO”\u003c/p\u003e\n\u003cp\u003esendmail_submit_enable=NO\u003c/p\u003e\n\u003cp\u003esendmail_outbound_enable=NO\u003c/p\u003e\n\u003cp\u003esendmail_msp_queue_enable=NO\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e重新启动系统。sendmail进程不再启动了。\u003c/p\u003e\n\u003cp\u003e试了一下,只要加一行,sendmail也不会启动了\u003c/p\u003e\n\u003cp\u003e在 /etc/rc.conf中加入\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003esendmail_enable=”NONE”\u003c/p\u003e\u003c/blockquote\u003e"
December 14, 2010
Nginx禁止通过IP,未绑定域名访问服务器
"\u003cp\u003e今天要在\u003ca href=\"http://wiki.nginx.org/NginxChs\"\u003eNginx\u003c/a\u003e上设置禁止通过IP访问服务器,只能通过域名访问,这样做是为了避免别人把未备案的域名解析到自己的服务器IP而导致服务器被断网,从网络上搜到以下解决方案:\u003c/p\u003e\n\u003cp\u003e==============================\nnginx的默认虚拟主机在用户通过IP访问,或者通过未设置的域名访问(比如有人把他自己的域名指向了你的ip)的时候生效\u003c/p\u003e\n\u003cp\u003e最关键的一点是,在server的设置里面添加这一行:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003elisten 80 default;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e后面的default参数表示这个是默认虚拟主机。\u003c/p\u003e\n\u003cp\u003e这个设置非常有用。\n比如别人通过ip或者未知域名访问你的网站的时候,你希望禁止显示任何有效内容,可以给他返回500.\u003c/p\u003e\n\u003cp\u003e目前国内很多机房都要求网站主关闭空主机头,防止未备案的域名指向过来造成麻烦。就可以这样设置:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eserver {\nlisten 80 default;\nreturn 500;\n}\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e也可以把这些流量收集起来,导入到自己的网站,只要做以下跳转设置就可以:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eserver {\nlisten 80 default;\nrewrite ^(.*) \u003ca href=\"http://www.mydomain.com\"\u003ehttp://www.mydomain.com …\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e"
December 13, 2010
CentOS5下XEN虚拟机的安装和配置
"\u003cp\u003e官方教程:\u003c/p\u003e\n\u003cp\u003e说明:使用均为CentOS5的原始安装介质,软件包均使用没有经过升级的版本,所有文件全部是安装DVD自带。初始安装为最小化安装,软件包管理使用yum的方式,已经在本地做了yum库。本文默认使用root用户权限执行安装和配置。\n有关命令参数的含义请使用—help的方式查看,对应参数请修改至合适自己的,主要是名字、网络和文件等参数。\n\u003cstrong\u003e一、安装xen\u003c/strong\u003e\n# yum –y install xen*\n安装XEN需要的服务\n# yum -y install kernel-xen*\n安装XEN的相关内核\n\u003cstrong\u003e二、检查启动选项是否使用xen内核启动\u003c/strong\u003e\n1、检查xen内核文件\n安装是否正常:文件位于/boot\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# ls –lh /boot\ntotal 9.5M\n-rw-r–r– 1 root root 61K Mar 16 08:19 config-2.6.18-8.el5\n-rw-r–r– 1 root root 60K Mar 16 09:27 config-2.6.18-8.el5xen\ndrwxr-xr-x 2 root root 1.0K Aug 15 14:47 grub\n-rw——- …\u003c/p\u003e\u003c/blockquote\u003e"
December 10, 2010
cat /proc/loadavg 命令详解
"\u003cp\u003e/proc文件系统是一个虚拟的文件系统,不占用磁盘空间,它反映了当前操作系统在内存中的运行情况,查看/proc下的文件可以聊寄到系统的运行状态。\u003c/p\u003e\n\u003cp\u003ecat /proc/loadavg是查看系统平均负载的命令,输出结果:\n0.18 0.26 0.25 2/251 20320\u003c/p\u003e\n\u003cp\u003e前三个数字是1、5、15分钟内的平均进程数(有人认为是系统负荷的百分比,其实不然,有些时候可以看到200甚至更多)。\u003c/p\u003e\n\u003cp\u003e第四个值的分子是正在运行的进程数,分母是进程总数,最后一个是最近运行的进程ID号。\u003c/p\u003e\n\u003cp\u003e这里的平均负载也就是可运行的进程的平均数。\u003c/p\u003e\n\u003cp\u003efrom proc(5) manual page:\u003c/p\u003e\n\u003cp\u003e/proc/loadavg\nThe first three fields in this file are load average figures giving the number of jobs in the run queue (state R) or waiting\nfor disk I/O …\u003c/p\u003e"
December 2, 2010
Linux服务器安装后的优化
"\u003cp\u003e我们的服务器并不是安装完成后就可直接托管到机房了,而是需要进行一系列的优化配置和安全配置等\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1,关闭不需要的服务\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e这个应该很容易理解的,凡是我们的系统不需要的服务,一概关闭,这样一个好处是减少内存和CPU时间的占用,另一个好处相对可以提高安全性那么哪些服务是肯定要保留的呢?\n在linux机器上通常有四项服务是必须保留的\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eiptables\u003c/code\u003e\nlinux下强大的防火墙,只要机器需要连到网上,哪里离得开它\n\u003ccode\u003enetwork\u003c/code\u003e\nlinux机器的网络,如果不上网可以关闭,只要上网当然要打开它\n\u003ccode\u003esshd\u003c/code\u003e\n这是openssh server,如果你的机器不是本地操作,而是托管到IDC机房,\n那么访问机器时需要通过这个sshd服务进行\n\u003ccode\u003esyslog\u003c/code\u003e\n这是linux系统的日志系统,必须要有,否则机器出现问题时会找不到原因\u003c/p\u003e\n\u003cp\u003e除了这四项必需的服务之外,其他的服务需要保留哪些呢?\n这时就可以根据系统的用途而定,比如:数据库服务器,就需要启用mysqld(或oracle)\nweb服务器,就需要启用apache\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2,关闭不需要的tty\u003c/strong\u003e\n请编辑你的/etc/inittab\n找到如下一段: …\u003c/p\u003e"
December 2, 2010
Linux常用信息查看命令
"\u003cp\u003e\u003cstrong\u003e系统\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# uname -a # 查看内核/操作系统/CPU信息\n# head -n 1 /etc/issue # 查看操作系统版本\n# cat /proc/cpuinfo # 查看CPU信息\n# hostname # 查看计算机名\n# lspci -tv # 列出所有PCI设备\n# lsusb -tv # 列出所有USB设备\n# lsmod # 列出加载的内核模块\n# env # 查看环境变量\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e资源\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# free -m # 查看内存使用量和交换区使用量\n# df -h # 查看各分区使用情况\n# du -sh \u0026lt;目录名\u0026gt; # 查看指定目录的大小\n# grep MemTotal /proc/meminfo # 查看内存总量\n# grep MemFree /proc/meminfo # …\u003c/code\u003e\u003c/pre\u003e"
December 2, 2010
Linux网管必备的几个命令
"\u003cp\u003e\u003cstrong\u003e一、uptime\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e**\n** **** Uptime命令的显示结果包括服务器已经运行了多长时间,有多少登陆用户和对服务器性能的总体评估(load average)。load average值分别记录了上个1分钟,5分钟和15分钟间隔的负载情况,load average不是一个百分比,而是在队列中等待执行的进程的数量。如果进程要求CPU时间被阻塞(意味着CPU没有时间处理它),load average值将增加。另一方面,如果每个进程都可以立刻得到访问CPU的时间,这个值将减少。\u003c/p\u003e\n\u003cp\u003eUP kernel下的load average的最佳值是1,这说明每个进程都可以立刻被CPU处理,当然,更低不会有问题,只说明浪费了一部分的资源。但在不同的系统间这个值也是不同的,例如一个单CPU的工作站,load average为1或者2都是可以接受的, \u003cstrong\u003e而在一个多CPU的系统中这个值应除以物理CPU的个数\u003c/strong\u003e,假设CPU个数为4,而load average为8或者10,那结果也是在2多点而已。 \u003ca href=\"http://blog.licess.org/uploads/200904/0.jpg\"\u003e\u003cimg src=\"http://blog.licess.org/uploads/200904/0.jpg\" alt=\"点击在新窗口中浏览此图片\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e你可以使用uptime判断一个性能问题是出现在服务器上还是网络上。例如,如果一个网络应用运行性能不理想,运 …\u003c/p\u003e"
December 2, 2010
CentOS上DirectAdmin安装教程
"\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/12/directadmin.gif\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/12/directadmin.gif\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eDirectAdmin是一款付费的虚拟主机管理软件,通常简称为DA,DA比Cpanel功能上简单,但是内存占用也更少些,更重要的是价格也更便宜,一般自己用或者搞合租DA算是很合适的。\u003c/p\u003e\n\u003cp\u003e安装前首先确保已经购买了DirectAdmin的授权,购买授权后会有Client ID,License ID,也需要在DA官网上或者DA销售商那里提交你的VPS或者服务器的IP和系统信息。\u003c/p\u003e\n\u003cp\u003e1、安装CentOS的相关组件的命令如下:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eyum update -y\nyum install gcc-c++ gcc make automake wget flex -y\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e2、安装DirectAdmin需要干净的系统,所以在装之前要卸载掉httpd、php、mysql。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eyum remove httpd* php* mysql* -y\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e3、下载DirectAdmin安装脚本文件,执行命令:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewget \u003ca href=\"http://directadmin.com/setup.sh\"\u003ehttp://directadmin.com/setup.sh\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e4、为DirectAdmin安装脚本文件添加执行权限,执行命令:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003echmod +x setup.sh\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e5、执行DirectAdmin安装脚本文件: …\u003c/p\u003e"
December 2, 2010
正确理解Linux内存占用过高的问题
"\u003cp\u003e最近有个月经问题,老有人问为何开机后,还没有其他服务,mem就被用完了?是不是内存泄露?是否要重启服务?只能说不要看现象,要看本质才能找到问题的根源。\n往往给出这样的结果,怀疑内存用了90%:\nMem: 4146788k total, 3825536k used, 321252k free, 213488k buffers\nSwap: 2650684k total, 80k used, 2650604k free, 3006404k cached\u003c/p\u003e\n\u003cp\u003e这样怀疑很普遍,因为很多人用惯了Windows。Windows下,可以使用任务管理器查看当前进程对于内存的消耗情况。在我看来,Windows物理内存总是留下一定的空间,就算此时物理内存有空闲时,也会让某些程序去使用虚拟内存,目的是在Windows下启动新程序时,直接分配空闲的物理内存,这样子新程序启动速度就较快,而Linux则不然。\u003c/p\u003e\n\u003cp\u003e而在Linux下,使用top命令看到内存占用情况:\u003c/p\u003e\n\u003cp\u003eMem: 4146788k total, 3825536k used, 321252k free, 213488k buffers\nSwap: 2650684k …\u003c/p\u003e"
December 2, 2010
Linux VPS禁止某个IP访问
"\u003cp\u003e今天在查看 \u003ca href=\"http://www.vpser.net/\"\u003eVPS侦探\u003c/a\u003e 的 \u003ca href=\"http://www.diavps.cn/client/aff.php?aff=002\"\u003eVPS\u003c/a\u003e 的SSH登录记录吓了一跳,居然与几个IP连续登录SSH字典猜root密码,我很生气,后果很严重,GFW掉他们,现公布他们的名单:\u003c/p\u003e\n\u003cp\u003e62.75.214.93 gera125.server4you.de 德国/德国鬼子\u003c/p\u003e\n\u003cp\u003e203.215.252.189 香港特别行政区/无语。。。。\u003c/p\u003e\n\u003cp\u003e219.143.200.169 北京市电信 /在党中央还做坏事。。。。\u003c/p\u003e\n\u003cp\u003e60.12.193.134 浙江省湖州市网通 /\u003c/p\u003e\n\u003cp\u003ec953dc2c.virtua.com.br 201.83.220.44 巴西 /就你最多。。。。\u003c/p\u003e\n\u003cp\u003e其中几个还搭建了Nginx的环境,都没做站。\u003c/p\u003e\n\u003cp\u003e/etc/hosts.allow和/etc/hosts.deny两个文件是控制远程访问设置的,通过他可以允许或者拒绝某个ip或者ip段的客户访问linux的某项服务。\u003cimg src=\"http://www.vpser.net/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e如果请求访问的主机名或IP不包含在/etc/hosts.allow中,那么tcpd进程就检查/etc/hosts.deny。看请求访问的主机名或IP有没有包含在hosts.deny文件中。如果包含,那么访问就被拒绝;如果既不包含 …\u003c/p\u003e"
December 1, 2010
linux系统中关于文件权限
"\u003cp\u003e文件权限除了r、w、x外还有s、t、i、a权限:\u003c/p\u003e\n\u003cp\u003es:文件属主和组设置SUID和GUID,文件在被设置了s权限后将以root身份执行。在设置s权限时文件属主、属组必须先设置相应的x权 限,否则s权限并不能正真生效(c h m o d命令不进行必要的完整性检查,即使不设置x权限就设置s权限,chmod也不会报错,当我们ls -l时看到rwS,大写S说明s权限未生效)。Linux修改密码的passwd便是个设置了SUID的程序,普通用户无读写/etc/shadow文件 的权限确可以修改自己的密码。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003els -al /usr/bin/passwd\u003c/p\u003e\n\u003cp\u003e-rwsr-xr-x 1 root root 32988 2008-12-08 17:17 /usr/bin/passwd\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e我们可以通过字符模式设置s权限:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003echmod a+s filename\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e也可以使用绝对模式进行设置:\u003c/p\u003e\n\u003cp\u003e设置s u i d:将相应的权限位之前的那一位设置为4;\u003c/p\u003e\n\u003cp\u003e设置g u i d:将相应的权限位之前的那一位设置为2;\u003c/p\u003e\n\u003cp\u003e两者都置位:将相应的权限位之前的那一位设置为4+2=6。\u003c/p\u003e\n\u003cp\u003e如:chmod 4764 filename …\u003c/p\u003e"
November 26, 2010
配置php支持sqlite数据库
"\u003cp\u003ephp5-windows默认已经包含了sqlite模块,但没有启用\u003c/p\u003e\n\u003cp\u003e如果需要支持sqlite,则修改php.ini\u003c/p\u003e\n\u003cp\u003e启用三个扩展语句\u003c/p\u003e\n\u003cp\u003eextension=php_pdo.dll\u003c/p\u003e\n\u003cp\u003eextension=php_pdo_sqlite.dll\u003c/p\u003e\n\u003cp\u003eextension=php_sqlite.dll (可能不是必须的,但最好一起啦)\u003c/p\u003e\n\u003cp\u003e我第一次只开了下面两个,因此始终无法启用,测试程序会报错\u003c/p\u003e\n\u003cp\u003eFatal error: Call to undefined function sqlite_open()\u003c/p\u003e\n\u003cp\u003e也就是sqlite没有成功启动\u003c/p\u003e"
November 22, 2010
lighttpd启动,停止,重启命令
"\u003cblockquote\u003e\n\u003cp\u003e“/etc/init.d/lighttpd start”\n“/etc/init.d/lighttpd stop”\n“/etc/init.d/lighttpd restart”\u003c/p\u003e\u003c/blockquote\u003e"
November 19, 2010
centos 使用rz指令
"\u003cp\u003e在linux下安装rz很方便,使用\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eyum install lrzsz就可以安装,正常使用rz和sz命令。**下面对sz和rz命令的一点介绍:**一般来说,linux服务器大多是通过ssh客户端来进行远程的登陆和管理的,使用ssh登陆linux主机以后,如何能够快速的和本地机器进行文件的交互呢,也就是上传和下载文件到服务器和本地;**与ssh有关的两个命令可以提供很方便的操作:**sz:将选定的文件发送(send)到本地机器,即下载rz:运行该命令会弹出一个文件选择窗口,从本地选择文件上传到服务器(receive),即上传\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e发送文件到客户端:sz filename 第一次使用sz,会提示你放置的目录。\u003c/p\u003e\n\u003cp\u003ezmodem接收可以自行启动.\u003c/p\u003e\n\u003cp\u003e从客户端上传文件到linux服务端:\u003c/p\u003e\n\u003cp\u003e只要服务端执行 : rz\u003c/p\u003e\n\u003cp\u003e然后在 SecureCRT 里选文件发送,协议 zmodem\u003c/p\u003e\n\u003cp\u003e简单吧,如果你以前一直使用ssh,而又没有对外开放ftp服务,你就直接使用这种方式来传输你的文件 。\u003c/p\u003e"
November 18, 2010
FreeBSD系统下普通用户切换root用户,提示su:sorry的解决办法
"\u003cp\u003eFreeBSD系统下su:sorry的解决办法\n在FreeBSD上要使用su命令成为root用户,不但要知道root的口令,还需要经过特别设置,否则就不能成功使用这个命令。这是因为 FreeBSD对执行su命令的用户进行了更严格的限制,能使用su命令的用户必须属于wheel组(root的基本属组,组ID为0),否则就不能通过 这个命令成为root用户。因此需要编辑组设置文件/etc/group,将需要超级用户权力的管理成员加入到wheel组中。\n可以使用如下命令给普通用户su – root的权力:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003epw groupmod wheel -m\npw user mod -g wheel\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e或者直接修改/etc/group文件,把相应的用户加到wheell组就可以\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewheel:*:0:root,\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eFreeBSD系统下默认是不允许root用户直接通过ssh连接到服务器的,在安装FreeBSD系统时要创建一个额外的用户,切忌一定要把这个用户加入到wheel组中(如果不加入到这个组中的话就无法ssh),也可以安装完系统后创建用户,并把这个用户加入wheel组。\u003c/p\u003e"
November 18, 2010
linux的head命令及tail命令介绍
"\u003cp\u003e当需要查看一个文本文件的头部或尾部时,head 命令及tail 命令可以非常方便的完成该操作。head 命令用于查看一个文本文件的开头部分;而tail 命令则用于显示文本文件的末尾几行。这两个命令举例如下:\nhead example.txt 显示文件 example.txt 的前十行内容;\nhead -n 20 example.txt 显示文件 example.txt 的前二十行内容;\ntail example.txt 显示文件 example.txt 的后十行内容;\ntail -n 20 example.txt 显示文件 example.txt 的后二十行内容;\ntail -f example.txt 显示文件 example.txt 的后十行内容并在文件内容增加后,自动显示新增的文件内容。\n注意:\n最后一条命令非常有用,尤其在监控日志文件时,可以在屏幕上一直显示新增的日志信息。\u003c/p\u003e"
November 16, 2010
shell test操作运算符
"\u003cp\u003e\u003cstrong\u003e4.4 控制结构\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在shell脚本中,使用控制结构就可以控制Linux命令的执行。使用控制结构,可以重复执行命令,或者选择特定的命令。控制结构包含两个主要的组件:测试操作(test)和命令。如果测试操作成功,则命令就会执行。这样的话,就可以使用控制结构来决定是否执行选定的命令。\u003c/p\u003e\n\u003cp\u003e存在两种不同类型的控制结构:循环和条件。循环结构会重复执行命令,而条件结构会在特定条件满足时执行命令。\u003c/p\u003e\n\u003cp\u003eBASH Shell有三种循环控制结构:while、for和for-in,两种条件控制结构:if和case。控制结构把Linux命令执行结果作为测试。\u003c/p\u003e\n\u003cp\u003e所有的Linux命令在执行结束后都会返回一个退出状态。如果某命令成功执行,退出状态将是0。如果因为某种原因该命令执行失败,则退出状态是表示失败类型的一个正值。控制结构会检查Linux命令的退出状态是0,还是其他值。对于if和while控制结构,如果退出状态是0,则说明该命令被成功执行,控制结构会继续。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e4.4.1 test操作\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e借助于test命令,可以比较\u003cstrong\u003e整数\u003c/strong\u003e、\u003cstrong\u003e字符串\u003c/strong\u003e,甚至执行\u003cstrong\u003e逻辑操作\u003c/strong\u003e。命令由关键字test,以及被比较值组成;被比较数值之间使用一个选项分隔开, …\u003c/p\u003e"
November 16, 2010
grep用法详解:grep与正则表达式
"\u003cp\u003e**首先要记住的是: 正则表达式与通配符不一样,它们表示的含义并不相同!**正则表达式只是一种表示法,只要工具支持这种表示法, 那么该工具就可以处理正则表达式的字符串。vim、grep、awk 、sed 都支持正则表达式,也正是因为由于它们支持正则,才显得它们强大;\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1基础正则表达式\u003c/strong\u003egrep 工具,以前介绍过。\u003c/p\u003e\n\u003cp\u003egrep -[acinv] ‘搜索内容串‘ filename\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e-a 以文本文件方式搜索\n-c 计算找到的符合行的次数\n-i 忽略大小写\n-n 顺便输出行号\n-v 反向选择,即显示不包含匹配文本的所有行\n-h 查询多文件时不显示文件名。\n-l 查询多文件时只输出包含匹配字符的文件名。\n-s 不显示不存在或无匹配文本的错误信息。\ngrep命令加- E参数,这一扩展允许使用扩展模式匹配。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e**其中搜索串可以是正则表达式!**grep: 要用好grep这个工具,其实就是要写好正则表达式,所以这里不对grep的所有功能进行实例讲解,只列几个例子,讲解一个正则表达式的写法。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e$ ls -l | grep ‘^a’\u003c/strong\u003e 通过管道过滤ls -l输出的内容,只显示以a开头的行。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e$ …\u003c/strong\u003e\u003c/p\u003e"
November 12, 2010
nginx location基础
"\u003cp\u003e\u003cstrong\u003e基本语法\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003elocation [=|\u003cdel\u003e|\u003c/del\u003e*|^~] /uri/ { … }\u003c/p\u003e\n\u003cp\u003e= 严格匹配。如果这个查询匹配,那么将停止搜索并立即处理此请求。\u003c/p\u003e\n\u003cp\u003e~ 为区分大小写匹配\u003c/p\u003e\n\u003cp\u003e~* 为不区分大小写匹配\u003c/p\u003e\n\u003cp\u003e!\u003cdel\u003e和!\u003c/del\u003e*分别为区分大小写不匹配及不区分大小写不匹配\u003c/p\u003e\n\u003cp\u003e^~ 如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不测试正则表达式。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e例如:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003elocation = / { # 只匹配 / 查询。\u003c/p\u003e\n\u003cp\u003elocation / { # 匹配任何查询,因为所有请求都已 / 开头。但正则表达式规则和长的块规则将被优先和查询匹配。\u003c/p\u003e\n\u003cp\u003elocation ^~ /images/ { # 匹配任何已 /images/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。\u003c/p\u003e\n\u003cp\u003elocation ~* .(gif|jpg|jpeg)$ { # 匹配任何以 gif、jpg 或 jpeg 结尾的请求。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e++ 文件及目录匹配\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e-f和!-f用来判断是否存在文件\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e-d和!-d用来判断是否存在目录\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e-e和!-e用来判断是否存在文件或目录\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e-x和!-x用来判断文件是否可执行\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e++ 一些可用的全局变量\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e$args …\u003c/p\u003e"
November 12, 2010
nginx配置文件中的location中文详解
"\u003cp\u003e\u003cstrong\u003elocation\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e语法:location [=|\u003cdel\u003e|\u003c/del\u003e*|^~] /uri/ { … }\n默认:否\u003c/p\u003e\n\u003cp\u003e上下文:server\u003c/p\u003e\n\u003cp\u003e这个指令随URL不同而接受不同的结构。你可以配置使用常规字符串和正则表达式。如果使用正则表达式,你必须使用 ~* 前缀选择不区分大小写的匹配或者 ~ 选择区分大小写的匹配。\u003c/p\u003e\n\u003cp\u003e确定 哪个location 指令匹配一个特定指令,常规字符串第一个测试。常规字符串匹配请求的开始部分并且区分大小写,最明确的匹配将会被使用(查看下文明白 nginx 怎么确定它)。然后正则表达式按照配置文件里的顺序测试。找到第一个比配的正则表达式将停止搜索。如果没有找到匹配的正则表达式,使用常规字符串的结果。\u003c/p\u003e\n\u003cp\u003e有两个方法修改这个行为。第一个方法是使用 “=”前缀,将只执行严格匹配。如果这个查询匹配,那么将停止搜索并立即处理这个请求。例子:如果经常发生”/”请求,那么使用 “location = /” 将加速处理这个请求。\u003c/p\u003e\n\u003cp\u003e第二个是使用 ^~ 前缀。如果把这个前缀用于一个常规字符串那么告诉nginx 如果路径匹配那么不测试正则表达式。\u003c/p\u003e\n\u003cp\u003e而且它重要在于 NGINX 做比较没有 URL 编码,所以如果你有 …\u003c/p\u003e"
November 12, 2010
nginx下禁止目录运行php脚本
"\u003cp\u003e为了安全起见,我们一般会对上传目录禁止运行php脚本\u003c/p\u003e\n\u003cp\u003e在 \u003cstrong\u003eapache\u003c/strong\u003e 下面我们可以通过:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003ephp_flag engine off\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e的方式来来禁用目录下文件php执行权限。\u003c/p\u003e\n\u003cp\u003e那么在 \u003cstrong\u003enginx\u003c/strong\u003e 里面同样可以实现这种方法,那就是location的优先匹配,关于location可以参考我之前的一批文章http://226617.cn/archives/392.htm\u003c/p\u003e\n\u003cp\u003e这里简单就举个例子\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003elocation ^~ /attachments/\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e{\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eaccess_log off;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e}\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这样 attachments这个目录 就不会再去跳转给fastcgi去执行php了.这里利用了nginx下location指令的处理顺序优先级特点.\u003c/p\u003e\n\u003cp\u003e但上面的方法只能算一种技巧,一般不这样设置,正确的方法为:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003elocation /upload/ {\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003elocation ~ .*.(php)?$\u003c/p\u003e\n\u003cp\u003e{\u003c/p\u003e\n\u003cp\u003edeny all;\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e而对于多个目录的话,可以一起进行限定:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003elocation ~* …\u003c/p\u003e\u003c/blockquote\u003e"
November 11, 2010
linux挂载新硬盘,开机自动挂载
"\u003cp\u003e\u003cstrong\u003eLinux的硬盘识别:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e2.6 kernel以后,linux会将识别到的硬件设备,在/dev/下建立相应的设备文件.如:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003esda 表示第1块SCSI硬盘.# V, z b, }2 F7 u’ |\u003c/p\u003e\n\u003cp\u003ehda 表示第1块IDE硬盘(即连接在第1个IDE接口的Master口上)\u003c/p\u003e\n\u003cp\u003escd0 表示第1个USB光驱.\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e当添加了新硬盘后,在/dev目录下会有相应的设备文件产生.cciss的硬盘是个例外,它的设备文件在/dev/cciss/目录下.一般使用”fdisk -l”命令可以列出系统中当前连接的硬盘设备和分区信息.新硬盘没有分区信息,则只显示硬盘大小信息.\u003c/p\u003e\n\u003cp\u003e1.关闭服务器加上新硬盘\u003c/p\u003e\n\u003cp\u003e2.启动服务器,以root用户登录\u003c/p\u003e\n\u003cp\u003e3.查看硬盘信息\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#fdisk -l\u003c/p\u003e\n\u003cp\u003eDisk /dev/sda: 146.1 GB, 146163105792 bytes\u003c/p\u003e\n\u003cp\u003e255 heads, 63 sectors/track, 17769 cylinders\u003c/p\u003e\n\u003cp\u003eUnits = cylinders of 16065 * 512 = 8225280 bytes\u003c/p\u003e\n\u003cp\u003eDevice …\u003c/p\u003e\u003c/blockquote\u003e"
November 9, 2010
Nginx中的upstream
"\u003cp\u003eNginx中upstream有以下几种方式:\u003c/p\u003e\n\u003cp\u003e1、轮询(weight=1)\n默认选项,当weight不指定时,各服务器weight相同,\n每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。\u003c/p\u003e\n\u003cp\u003e[shell]upstream bakend {\nserver 192.168.1.10;\nserver 192.168.1.11;\n}\n[/shell]\u003c/p\u003e\n\u003cp\u003e2、weight\n指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。\n如果后端服务器down掉,能自动剔除。\n比如下面配置,则1.11服务器的访问量为1.10服务器的两倍。\u003c/p\u003e\n\u003cp\u003e[shell]upstream bakend {\nserver 192.168.1.10 weight=1;\nserver 192.168.1.11 weight=2;\n}[/shell]\u003c/p\u003e\n\u003cp\u003e3、ip_hash\n每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session不能跨服务器的问题。\n如果后端服务器down掉,要手工down掉。\u003c/p\u003e\n\u003cp\u003e[shell]upstream …\u003c/p\u003e"
November 8, 2010
1>/dev/null 2>&1的含义
"\u003cp\u003eshell中可能经常能看到:\u0026gt;/dev/null 2\u0026gt;\u0026amp;1\u003c/p\u003e\n\u003cp\u003e命令的结果可以通过%\u0026gt;的形式来定义输出\u003c/p\u003e\n\u003cp\u003e/dev/null 代表空设备文件\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e代表重定向到哪里,例如:echo “123” \u0026gt; /home/123.txt\n1 表示stdout标准输出,系统默认值是1,所以”\u0026gt;/dev/null”等同于”1\u0026gt;/dev/null”\n2 表示stderr标准错误\n\u0026amp; 表示等同于的意思,2\u0026gt;\u0026amp;1,表示2的输出重定向等同于1\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e那么本文标题的语句:\n1\u0026gt;/dev/null 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。\n2\u0026gt;\u0026amp;1 接着,标准错误输出重定向等同于标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。\u003c/p\u003e\n\u003cp\u003e另一篇相关文章:\u003c/p\u003e"
November 6, 2010
谷歌发布apache加速模块可提速50%
"\u003cp\u003e 大多人浏览网页如果超过3秒打不开就会离开,Google为此推出了一款Apache加速模块:mod_pagespeed,该模块可以有效将网页加载速度提高50%。网页提速的问题是一个复杂多样的问题,有很多解决方法,往往关系到网站系统程序,服务器硬件,网络传输速度等方面,而Google这款加速模块简单的解决了许多复情况的问题:\u003c/p\u003e\n\u003cp\u003e ◆如果你的网站采用Apache构建服务器,不需要对网站CMS系统进行处理即可应用;\u003c/p\u003e\n\u003cp\u003e ◆加速模块可以自行对网络传输的HTML字节优化及对图象,CSS进入压缩优化传输;\u003c/p\u003e\n\u003cp\u003e ◆智能缓存是一大亮点,它可以自动智能缓存,加速下载。\u003c/p\u003e\n\u003cp\u003e 下面介绍一下所有特点功能:\u003c/p\u003e\n\u003cp\u003e ◆优化缓存\u003c/p\u003e\n\u003cp\u003e ◆缓存扩展\u003c/p\u003e\n\u003cp\u003e ◆压缩处理CSS\u003c/p\u003e\n\u003cp\u003e ◆优化JavaScript最大限度的减少重复请求\u003c/p\u003e\n\u003cp\u003e ◆自动缓存CSS\u003c/p\u003e\n\u003cp\u003e ◆JavaScript内嵌技术\u003c/p\u003e\n\u003cp\u003e ◆有效载荷尺寸最小化\u003c/p\u003e\n\u003cp\u003e ◆压缩空白\u003c/p\u003e\n\u003cp\u003e ◆合并头信息\u003c/p\u003e\n\u003cp\u003e ◆附加属性\u003c/p\u003e\n\u003cp\u003e ◆内建核心JavaScript\u003c/p\u003e\n\u003cp\u003e ◆优化图像下载\u003c/p\u003e\n\u003cp\u003e ◆跳地非法字符\u003c/p\u003e\n\u003cp\u003e ◆重写优化CSS\u003c/p\u003e\n\u003cp\u003e Google官方文档说明: …\u003c/p\u003e"
October 29, 2010
FreeBSD 单网卡绑定多个IP
"\u003cp\u003e假设网卡lnc0原IP地址为192.168.0.2,现在为它绑定另一个IP:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# ifconfig lnc0 192.168.0.3 netmask 255.255.255.255 alias\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e解释:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e如果别名IP地址和网卡原IP地址在同一个子网上,就需要设置掩码为255.255.255.255\u003c/p\u003e\n\u003cp\u003e如果位于不同的子网,就直接使用相应子网的正常网络掩码\u003c/p\u003e\n\u003cp\u003e从TCP/IP的角度来看,这样做意味着什么呢?\u003c/p\u003e\n\u003cp\u003e网络掩码的所有位都设置成1,就会保证ICP/IP栈这样来看待包:\u003c/p\u003e\n\u003cp\u003e只要包的目标地址匹配所有位,就把该包看成本地子网上的包;它创建了只有一个地址的“子网”。\u003c/p\u003e\n\u003cp\u003e所有发送给该地址的包以及该地址接受的包都会发送给路由器,而不会发送到LAN上。\u003c/p\u003e\n\u003cp\u003e如果多个别名使用了同一个网络掩码,这些别名的广播地址也应该相同,而这样却导致了TCP/IP栈的混乱。\u003c/p\u003e\n\u003cp\u003e使用全1的网络掩码,才能骗过ifconfig,让该命令允许单个接口卡上有多个IP地址。\u003c/p\u003e\n\u003cp\u003e要在/etc/rc.conf中设置别名,应该使用 ifconfig_xxx#_alias# 关键字,该关键字的使用形式类似于 ifconfig_xxx#: …\u003c/p\u003e"
October 28, 2010
centos下快速同步时间
"\u003cp\u003e安装ntpdate\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eyum -y install ntp\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003evi /etc/crontab\u003c/strong\u003e 添加下面这行\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e30 21 * * * root /usr/sbin/ntpdate cn.pool.ntp.org \u0026amp;\u0026amp; /sbin/hwclock -w\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e:wq (保存退出)\n手动更新时间方法:ntpdate cn.pool.ntp.org\nhwclock -w 这里是更新ROM的时间\u003c/p\u003e\n\u003cp\u003e文件格式为:分钟(0-59) 小时(0-23) 日期(1-31) 月份(1-12) 周(0-7) user command\n意思是:root用户 在每天21:30 分执行ntpdate comamnd 同步到 cn.pool.ntp.org 这个时间池,并且将更新的时间写入到 ROM里保存。\u003c/p\u003e\n\u003cp\u003e备注:不要忘记开启服务啊!\nchkconfig ntpd –list (查看0~6个runlevel 是否按照阁下意愿开启或关闭 ntpd服务)\nchkconfig ntpd –level 35 on (开启runlevel 3和5的ntpd服务)\nchkconfig …\u003c/p\u003e"
October 26, 2010
linux route 命令
"\u003cp\u003e懂得网络配置命令是一般技术人员必备的技术,经过一段时间的研究和学习,总结了一些常用的命令和示例以便日后查阅.\n传统的在1–3点,ip高级路由命令在4–12点,两者部分可以通用,并达到同样的目的,但ip的功能更强大,可以实现更多的配置目的.\n首先,先了解传统的网络配置命令:\n**1. 使用ifconfig命令配置并查看网络接口情况\n** 示例1: 配置eth0的IP,同时激活设备:\n# ifconfig eth0 192.168.4.1 netmask 255.255.255.0 up\n示例2: 配置eth0别名设备 eth0:1 的IP,并添加路由\u003c/p\u003e\n\u003cp\u003e# ifconfig eth0:1 192.168.4.2\n# route add –host 192.168.4.2 dev eth0:1\n示例3:激活(禁用)设备\n# ifconfig eth0:1 up(down)\n示例4:查看所有(指定)网络接口配置\n# ifconfig (eth0)\n\u003cstrong\u003e2. 使用route 命令配置路由表\u003c/strong\u003e\n示例1:添加到主机路由\n# route add –host 192.168.4.2 dev eth0:1\n# …\u003c/p\u003e"
October 26, 2010
CentOS升级内核及KVM安装
"\u003cp\u003e由于CentOS 默认内核为2.6.18,故需要升级内核\u003c/p\u003e\n\u003cp\u003e升级内核到2.6.27,很容易,但升级到2.6.28后的版本折腾了我很久\u003c/p\u003e\n\u003cp\u003e升级到2.6.27\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewget\ntar zxvf linux-2.6.27.tar.gz -C /usr/src\ncd /usr/src/linux-2.6.27\nmake menuconfig\nmake\nmake modules_install\ncp arch/i386/boot/bzImage /boot/vmlinuz-2.6.27-root (注意:目录i386是根据你的系统类型, 如果是64位系统, 那就很可能是x86_64)\ncp System.map /boot/System.map-2.6.27-root\nmkinitrd /boot/initrd-2.6.27-root.img 2.6.27\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003evi /etc/grub.conf\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003etitle CentOS (2.6.27)\nroot (hd0,6)\nkernel /vmlinuz-2.6.27-root ro root=/dev/VolGroup00/LogVol00 rhgb quiet …\u003c/p\u003e\u003c/blockquote\u003e"
October 19, 2010
iptables命令
"\u003cp\u003e详细教程参考: \u003ca href=\"https://blog.haohtml.com/archives/13649\"\u003ehttps://blog.haohtml.com/archives/13649\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e语法\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eiptables [-t 要操作的表]\u003c/p\u003e\n\u003cp\u003e\u0026lt;操作命令\u0026gt;\u003c/p\u003e\n\u003cp\u003e[要操作的链]\u003c/p\u003e\n\u003cp\u003e[规则号码]\u003c/p\u003e\n\u003cp\u003e[匹配条件]\u003c/p\u003e\n\u003cp\u003e[-j 匹配到以后的动作]\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e操作命令(-A、-I、-D、-R、-P、-F)\u003c/p\u003e\n\u003cp\u003e查看命令(-[vnx]L)\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e如以下命令,其中-t filter为可选项,一般情况下省略不写:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eiptables\u003c/strong\u003e-t filter-AINPUT-j DROP\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003eiptables命令参数\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e-A 添加规则到规则链表 iptables -A INPUT\u003c/p\u003e\n\u003cp\u003e-D 从规则链表中删除规则,可是完整规则,也可以是规则编号\u003c/p\u003e\n\u003cp\u003e-R 取代现行规则,不改变在链中的顺序如:iptables -R INPUT 1 -s 193.168.0.1 -j DROP\u003c/p\u003e\n\u003cp\u003e-I 插入一条规则 如:iptables -I INPUT 1 –dport 80 -j DROP\u003c/p\u003e\n\u003cp\u003e-L 列出某规则链中所有规则\u003c/p\u003e\n\u003cp\u003e-F 删除某规则链中所有规则\u003c/p\u003e\n\u003cp\u003e-Z 将封包计数器清零\u003c/p\u003e\n\u003cp\u003e-N 定义新的规则链\u003c/p\u003e\n\u003cp\u003e-X 删除某个规则链\u003c/p\u003e\n\u003cp\u003e-P 定义过滤政策\u003c/p\u003e\n\u003cp\u003e-E 修改自定义规则链名 …\u003c/p\u003e"
October 19, 2010
LINUX下iptables的命令应用
"\u003cp\u003e手册:\u003c/p\u003e\n\u003cp\u003eiptables命令\n\u003cstrong\u003e维护规则表的命令:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e(-N)创建一个新规则表\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e(-X)删除一个空规则表\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e(-P)改变内建规则表的默认策略\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e(-L)列出规则表中的规则\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e(-F)清空规则表中的规则\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e(-Z)将规则表计数器清零\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003e管理规则表中的规则:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e(-A)添加新规则到规则表\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e(-I)插入新规则到规则表的某个位置\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e(-R)替换规则表中的规则\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e(-D)删除规则表中的某条规则\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e在调试iptables规则时,你也许需要反复修改你的脚本来实现某些特定的功能,这时建议在你的脚本里添加这样几行,以防止重复设置规则:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e# 清除所有规则\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eiptables -F -t filter\u003c/p\u003e\n\u003cp\u003eiptables -X -t filter\u003c/p\u003e\n\u003cp\u003eiptables -Z -t filter\u003c/p\u003e\n\u003cp\u003eiptables -F -t nat\u003c/p\u003e\n\u003cp\u003eiptables -X -t nat\u003c/p\u003e\n\u003cp\u003eiptables -Z -t nat\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e# 设置内建规则表的默认策略\u003c/strong\u003e\niptables -P INPUT ACCEPT\u003c/p\u003e\n\u003cp\u003eiptables -P OUTPUT ACCEPT\u003c/p\u003e\n\u003cp\u003eiptables -P FORWARD ACCEPT …\u003c/p\u003e"
October 19, 2010
Linux软链接和硬链接的区别
"\u003cp\u003e\u003cstrong\u003e一. 链接文件\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e链接有两种方式,软链接和硬链接。\u003c/p\u003e\n\u003cp\u003e1 软链接文件\u003c/p\u003e\n\u003cp\u003e软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。\n链接文件甚至可以链接不存在的文件,这就产生一般称之为”断链”的问题(或曰“现象”),链接文件甚至可以循环链接自己。类似于编程语言中的递归。\n用ln -s 命令可以生成一个软连接,如下:\n[root@linux236 test]# ln -s source_file softlink_file\n在对符号文件进行读或写操作的时候,系统会自动把该操作转换为对源文件的操作,但删除链接文件时,系统仅仅删除链接文件,而不删除源文件本身。\n2 硬链接文件\ninfo ln 命令告诉您,硬链接是已存在文件的另一个名字(A “hard link” is another name for an existing file),这多少有些令人困惑。硬连接的命令是\nln -d existfile newfile\n硬链接文件有两个限制\u003c/p\u003e\n\u003cp\u003e1)、不允许给目录创建硬链接;\n2)、只有在同一文件系统中的文件之间才能创建链接。\n对硬链接文件进行读写和删除操 …\u003c/p\u003e"
October 18, 2010
Nginx优化配置(转)
"\u003cp\u003e这里主要讲的是Nginx的优化方法,同时还需要优化php-fpm配置,方法请参考:.\u003c/p\u003e\n\u003cp\u003e优化前:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/10/nginx-fpm-youhua1.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/10/nginx-fpm-youhua1.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e优化后:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/10/nginx-fpm-youhua2.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/10/nginx-fpm-youhua2.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e看得出差距还是特别的大的.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一般来说nginx配置文件中对优化比较有作用的为以下几项:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eworker_processes 8;\u003c/p\u003e\n\u003cp\u003enginx进程数,建议按照cpu数目来指定,一般为它的倍数,平时设置为2倍。\u003c/p\u003e\n\u003cp\u003ecpu个数查看方法参考: 和 worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;\n为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu。对worker_cu_affinity参数的优化参考:\u003ca href=\"http://blog.haohtml.com/archives/14835\"\u003ehttp://blog.haohtml.com/archives/14835\u003c/a\u003eworker_rlimit_nofile 102400;\u003c/p\u003e\n\u003cp\u003e这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好 …\u003c/p\u003e"
October 18, 2010
[推荐]用include指令实现nginx多虚拟主机配置
"\u003cp\u003e\u003cstrong\u003e1.nginx.conf内容如下:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e程序代码\u003c/p\u003e\n\u003cp\u003eworker_processes 1;\u003c/p\u003e\n\u003cp\u003eerror_log /host/nginx/logs/error.log crit;\u003c/p\u003e\n\u003cp\u003epid /host/nginx/logs/nginx.pid;\u003c/p\u003e\n\u003cp\u003eevents {\u003c/p\u003e\n\u003cp\u003e#使用的网络I/)模型,Linux系统推荐采用epoll模型,FreeBSD系统推荐采用kqueue模型\u003c/p\u003e\n\u003cp\u003euse epoll;\u003c/p\u003e\n\u003cp\u003eworker_connections 64;\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003ehttp {\u003c/p\u003e\n\u003cp\u003einclude /host/nginx/conf/mime.types;\u003c/p\u003e\n\u003cp\u003edefault_type application/octet-stream;\u003c/p\u003e\n\u003cp\u003e#charset gb2312;\u003c/p\u003e\n\u003cp\u003eserver_names_hash_bucket_size 128;\u003c/p\u003e\n\u003cp\u003eclient_header_buffer_size 32k;\u003c/p\u003e\n\u003cp\u003elarge_client_header_buffers 4 32k;\u003c/p\u003e\n\u003cp\u003ekeepalive_timeout 60;\u003c/p\u003e\n\u003cp\u003efastcgi_connect_timeout 300; …\u003c/p\u003e"
October 18, 2010
[教程]常用CentOS vsftpd安装设置讲解
"\u003cp\u003eCentOS vsftpd还是比较常用的,于是我研究了一下CentOS vsftpd,在这里拿出来和大家分享一下,希望对大家有用。这里讲解介绍centos vsftpd的设置。CentOS Linux与RHEL产品有着严格的版本对应关系,例如使用RHEL 4源代码重新编译发布的是CentOS Linux 4.0,与RHEL 5对应的是CentOS Linux 5.0。\u003c/p\u003e\n\u003cp\u003e本地用户经过设置后可以进行ftp访问。而匿名用户的访问经过了转换,在系统中。匿名用户的用户名为ftp, 系统将其属性设置为 根目录 /var/ftp/, 禁止控制台登陆,也就是,该用户只能进行ftp访问。CentOS vsftpd 的执行程序为 /etc/vsftpd,修改 /etc/vsftpd/vsftpd.conf文件中的listen要设置为YES.\u003c/p\u003e\n\u003cp\u003eCentOS vsftpd有两种开机自启动模式: inet模式和standalone模式,推荐使用standalone模式。\n在CentOS中已集成了CentOS vsftpd软件。CentOS vsftpd是一个安全高效的FTP服务软件,得到了广泛的应用。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e …\u003c/strong\u003e\u003c/p\u003e"
October 16, 2010
centos下安装vsfptd架设ftp服务器
"\u003cp\u003e\u003cstrong\u003e1.安装vsftp\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在这里,我们架设的是虚拟用户,所谓虚拟用户就是没有使用真实的帐户,只是通过某种手段达到映射帐户和设置权限的目的。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eyum install vsftpd\ntouch /var/log/vsftpd.log #创建vsftp的日志文件\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e在CentOS中,这样就可以完成了一个简单的匿名FTP的搭建。你可以通过访问ftp://yourip来进行,不过这个FTP没有任何权限。\n\u003cstrong\u003e2.启动/重启/关闭vsftpd服务器\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e****[root@localhost ftp]# /sbin/service vsftpd restart\nShutting down vsftpd: [ OK ]\nStarting vsftpd for vsftpd: [ OK ]\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eOK表示重启成功了.\n启动和关闭分别把restart改为start/stop即可.\u003c/p\u003e\n\u003cp\u003e如果是源码安装的,到安装文件夹下找到start.sh和shutdown.sh文件,执行它们就可以了.\n\u003cstrong\u003e3.与vsftpd服务器有关的文件和文件夹\u003c/strong\u003e\nvsftpd服务器的配置文件的是: /etc/vsftpd/vsftpd.conf\nvsftpd服 …\u003c/p\u003e"
October 16, 2010
网站压力测试工具webbench简介、安装、使用
"\u003cp\u003e一直在寻找一款有效的网站压力测试”的文章”\u0026gt;网站压力测试工具,今天试用了webbench之后,感觉非常满意,特地于大家分享。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、webbench简介\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eWebbench是有名的网站压力测试工具,它是由Lionbridge公司()开发。它的帮助文件和文档请到:www.webbench.com上查看。\nWebbech能测试处在相同硬件上,不同服务的性能以及不同硬件上同一个服务的运行状况。webBech的标准测试可以向我们展示服务器的两项 内容:每秒钟相应请求数和每秒钟传输数据量。webbench不但能具有便准静态页面的测试能力,还能对动态页面(ASP,PHP,JAVA,CGI)进 行测试的能力。还有就是他支持对含有SSL的安全网站例如电子商务网站进行静态或动态的性能测试。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二、webbench安装\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(1)在FreeBSD下的用Ports安装方法:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#cd /usr/ports/benchmarks/webbench\n#make install clean\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e记得安装成功以后运行一下rehash命令,刷新一下系统命令\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#rehash\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e(2)RedHat/CentOS下的编译安装\u003c/p\u003e\n\u003cp\u003e下 …\u003c/p\u003e"
October 15, 2010
Linux下 XCache 编译安装方法
"\u003cp\u003e大部分的人都说XCache的加速效果比eaccelerator好,这里说说编译安装,\u003c/p\u003e\n\u003cp\u003e这里选择的是稳定版本的1.2.2版本,2.0版本的不稳定。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewget \u003ca href=\"http://xcache.lighttpd.net/pub/Releases/1.2.2/xcache-1.2.2.tar.gz\"\u003ehttp://xcache.lighttpd.net/pub/Releases/1.2.2/xcache-1.2.2.tar.gz\u003c/a\u003e (下载)\u003c/p\u003e\n\u003cp\u003etar -zxf xcache-1.2.2.tar.gz\ncd xcache-1.2.2\u003c/p\u003e\n\u003cp\u003e/usr/local/php/bin/phpize\n./configure –enable-xcache –with-php-config=/usr/local/php/bin/php-config\nmake\nmake install\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e记录下xcache的安装目录。\u003c/p\u003e\n\u003cp\u003e编辑php.ini文件,加入Xcache,作为Zend扩展。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[xcache-common]\n;; install as zend extension (recommended), normally “$extension_dir/xcache.so”\nzend_extension = /路径/xcache.so\n;; or …\u003c/p\u003e\u003c/blockquote\u003e"
October 15, 2010
linux下用phpize给PHP动态添加扩展
"\u003cp\u003e相关教程: \u003ca href=\"http://blog.haohtml.com/index.php/archives/7001\"\u003eFreeBSD下安装php扩展\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e使用php的常见问题是编译php时忘记添加某扩展,后来想添加扩展,但是因为安装php后又装了一些东西如PEAR等,不想删除目录重装,这里就需要用到phpize了。\u003c/p\u003e\n\u003cp\u003e如我想增加bcmath扩展的支持,这是一个支持大整数计算的扩展。windows自带而且内置,linux“本类函数仅在 PHP 编译时配置了 –enable-bcmath 时可用”(引号内是手册中的话)\u003c/p\u003e\n\u003cp\u003e注意,有些扩展需要和php的版本保持一致才可以的.\u003c/p\u003e\n\u003cp\u003e解压bcmath包,进入里面的ext/bcmath目录,然后执行/usr/local/php/bin/phpize,phpize在php安装完以后会有这个命令的, 会发现当前目录下多了一些configure文件,然后再执行./configure命令即可.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#/usr/local/php/bin/phpize\n#./configure –with-php-config=/usr/local/php/bin/php-config\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e注意要先确保**/usr/local/php/bin/php-config**存在。 (如果你的php安装 …\u003c/p\u003e"
October 15, 2010
ESXi 与 ESX 在管理功能上有何差别?
"\u003cp\u003eVMware ESXi 仅需短短数分钟即可安装完毕,启动虚拟机,VMware ESXi 即为您提供无与伦比的性能、可靠性和安全性。VMware ESXi 采用与 VMware ESX 相同的久经考验的构建技术,因而具有强大的功能,即使是最占用资源的应用程序也可以轻松运行,在关键部署中值得您的信赖。VMware ESXi 具备以下优点:安装方便可靠性无与伦比性能和整合率出类拔萃管理简单**VMware ESXi 与 VMware Infrastructure 有何不同?**VMware 免费提供独立 ESXi 虚拟机管理程序,目的是帮助各种规模的公司体验虚拟化的好处。ESXi 具有新颖的体系结构、简单的设置功能,以及很高的性能,客户对此已经显示出浓厚的兴趣。由于消除了获得 ESXi 的成本障碍,因此所有 IT 管理员都能访问 VMware 的数据中心技术,在自己的公司中证明这一技术的价值。我是否可以在 VMware ESXi 上运行由 Microsoft Virtual Server、Microsoft Virtual PC 或 VMware Server 创建的虚拟机?可以。您可以使用 …\u003c/p\u003e"
October 14, 2010
安装VMware ESXi出现0.0.0.0 (STATIC)情况
"\u003cp\u003e看过了《ESXServer 3i Installable》,信心满满的安装,倒也顺利,谁知道安装好了,发现不能修改ip地址。\u003c/p\u003e\n\u003cp\u003e首先是“Download tools to manage this host from (static)”这个肯定很奇怪丫。然后F2进入系统选择 “Configure Management Network ” 修改网络 ,发现根本无法修改地址。重装了也不行。\u003c/p\u003e\n\u003cp\u003e直到看到了 《ESX Server 3i Installable Setup Guide》 看到这段\u003c/p\u003e\n\u003cp\u003eOne or more of the following Ethernet controllers.\u003c/p\u003e\n\u003cp\u003eBroadcom NetXtreme 570x gigabit controllers\u003c/p\u003e\n\u003cp\u003eIntel PRO/1000 adapters\u003c/p\u003e\n\u003cp\u003e唉。是网卡不识别。\u003c/p\u003e\n\u003cp\u003e还是要先做好功课,再动手安装。\u003c/p\u003e"
October 14, 2010
VMware ESX常用命令 和 IP 地址修改
"\u003cp\u003e一. VMware ESX Command\u003c/p\u003e\n\u003cp\u003e1. 看你的esx版本\u003c/p\u003e\n\u003cp\u003evmware –v\u003c/p\u003e\n\u003cp\u003e2. 查看显示ESX硬件,内核,存储,网络等信息\u003c/p\u003e\n\u003cp\u003eesxcfg-info -a(显示所有相关的信息)\u003c/p\u003e\n\u003cp\u003eesxcfg-info -w(显示esx上硬件信息)\u003c/p\u003e\n\u003cp\u003e3. 列出esx里知道的服务\u003c/p\u003e\n\u003cp\u003eesxcfg-firewall –s\u003c/p\u003e\n\u003cp\u003e4. 查看具体服务的情况\u003c/p\u003e\n\u003cp\u003eesxcfg-firewall -q sshclinet\u003c/p\u003e\n\u003cp\u003e5. 重新启动vmware服务\u003c/p\u003e\n\u003cp\u003eservice mgmt-vmware restart\u003c/p\u003e\n\u003cp\u003e6. 修改root的密码\u003c/p\u003e\n\u003cp\u003epasswd root\u003c/p\u003e\n\u003cp\u003e7. 设置kernel高级选项\u003c/p\u003e\n\u003cp\u003eesxcfg-advcfg -d(将系统内核恢复默认值)\u003c/p\u003e\n\u003cp\u003e8. 管理资源组\u003c/p\u003e\n\u003cp\u003eesxcfg-resgrp -l(显示所有资源组)\u003c/p\u003e\n\u003cp\u003e9. 列出你当前的虚拟交换机\u003c/p\u003e\n\u003cp\u003eesxcfg-vswitch -l\u003c/p\u003e\n\u003cp\u003eesxcfg-vswitch -v 10 -p “Service Console” vSwitch0 (将vSwitch0上的Service Console划分到vLan 10上,如果vLan号为0则不设置vLan)\u003c/p\u003e\n\u003cp\u003e10. 查看控制台的设 …\u003c/p\u003e"
October 14, 2010
vi 撤销重做于前进后退
"\u003cp\u003e在vi中按u可以撤销一次操作\u003c/p\u003e\n\u003cp\u003eu 撤销上一步的操作\nCtrl+r 恢复上一步被撤销的操作\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e注意:\u003c/strong\u003e\n如果你输入“u”两次,你的文本恢复原样,那应该是你的Vim被配置在Vi兼容模式了。\n重做\n如果你撤销得太多,你可以输入CTRL-R(redo)回退前一个命令。换句话说,它撤销一个撤销。要看执行的例子,输入CTRL-R两次。字符A和它后面的空格就出现了:\nyoung intelligent turtle\n有一个特殊版本的撤销命令:“U”(行撤销)。行撤销命令撤销所有在前一个编辑行\n上的操作。 输入这些命令两次取消前一个“U”:\nA very intelligent turtle\u003c/p\u003e\n\u003cp\u003exxxx 删除very\nA intelligent turtle\nxxxxxx 删除turtle\nA intelligent\n用“U”恢复行\nA very intelligent turtle\n用“u”撤销“U”\nA intelligent\n“U”命令自己改变自己,“u”命令撤销操作,CTRL-R命令重做操作。这有点乱,但不用\n担心,用“u”和CTRL-R命令你可以切换到任何状态。\u003c/p\u003e\n\u003cp\u003e流行的文本编辑器通常都有前进和 …\u003c/p\u003e"
October 14, 2010
[教程]CentOS平台安装lemp
"\u003ch3 id=\"_mcePaste\"\u003e教程最新版本为:Centos下安装lnmp教程(最新版2012-02-05) \u003ca href=\"http://blog.haohtml.com/archives/12473\"\u003ehttp://blog.haohtml.com/archives/12473\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e点击下载本教程使用的批处理shell安装脚本: \u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/10/webserver_install.sh_.txt\"\u003ewebserver_install.sh\u003c/a\u003e.本shell脚本不适合x64的系统.有些库文件需要从/usr/lib64/目录里的文件复制到/usr/lib/目录才可以.\u003c/p\u003e\n\u003cp\u003e本教程已经在Centos5.5, Centos6.0下测试通过.测试:2011-07-12\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCentos6.0下需要注意事项:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e1.对于ImageMagick,要使用 ftp://mirror.aarnet.edu.au/pub/imagemagick/ImageMagick-6.7.1-0.tar.gz 版本.\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e2.对于imagick,要使用wget \u003ca href=\"http://pecl.php.net/get/imagick-3.0.1.tgz\"\u003ehttp://pecl.php.net/get/imagick-3.0.1.tgz\u003c/a\u003e 版本\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这里是以php-fpm这个php补丁的形式运行php的.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e第一步,准备\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eyum -y install wget make zip unzip\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eyum -y …\u003c/p\u003e\u003c/blockquote\u003e"
October 13, 2010
编译php时make ZEND_EXTRA_LIBS=’-liconv’这句命令的作用
"\u003cp\u003e#make \u003cem\u003eZEND_EXTRA_LIBS\u003c/em\u003e=’-liconv’\u003c/p\u003e\n\u003cp\u003e#make install\u003c/p\u003e\n\u003cp\u003e可能是因为机器没有安装libiconv之类的库,怕编译出错,所以不为php加入iconv模块吧。\u003c/p\u003e"
October 13, 2010
yum指令
"\u003cp\u003e\u003cstrong\u003e一、什么是yum及其作用\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eyum(Yellow dog Updater, Modified)它的作用就是自动化地升级,安装/移除rpm包,收集rpm包的相关信息,检查依赖性并自动提示用户解决\u003c/p\u003e\n\u003cp\u003eyum 的理念是使用一个中心仓库(repository)管理一部分甚至一个 distribution 的应用程序相互关系,根据计算出来的软件依赖关系进行相关的升级、安装、删除等等操作,减少了 Linux 用户一直头痛的dependencies 的问题。这一点上,yum 和 apt 相同。apt 原为 debian 的 deb 类型软件管理所使用,但是现在也能用到 RH 门下的rpm\u003c/p\u003e\n\u003cp\u003e一般这类软件通过一个或者多个配置文件描述对应的 repository 的网络地址,通过 http 或者 ftp 协议在需要的时候从 repository 获得必要的信息,下载相关的软件包。这样,本地用户通过建立不同的 repository 的描述说明,在有 Internet 连接时就能方便进行系统的升级维护工作。另外,如果需要使用代理,可以用http_proxy 和 ftp_proxy 这些 shell 里面标准环境变 …\u003c/p\u003e"
October 13, 2010
CentOS常用命令
"\u003cp\u003e在电脑常用操作中,我们经常会用到CentOS常用命令。所以,我们对一些经常使用又很重要的CentOS常用命令进行了全面的整理。下面,就给大家介绍这些CentOS常用命令。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一:使用CentOS常用命令查看cpu\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003emore /proc/cpuinfo | grep “model name”\ngrep “model name” /proc/cpuinfo\n[root@localhost /]# grep “CPU” /proc/cpuinfo\nmodel name : Intel(R) Pentium(R) Dual CPU E2180 @ 2.00GHz\nmodel name : Intel(R) Pentium(R) Dual CPU E2180 @ 2.00GHz\n如果觉得需要看的更加舒服\ngrep “model name” /proc/cpuinfo | cut -f2 -d:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二:使用CentOS常用命令查看内存\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003egrep MemTotal /proc/meminfo grep MemTotal /proc/meminfo | cut -f2 -d: …\u003c/p\u003e"
October 13, 2010
CentOS配置SSH证书登录验证
"\u003cp\u003e\u003cstrong\u003e操作步骤:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e————————–\n1)先添加一个维护账号:msa\u003c/p\u003e\n\u003cp\u003e2)然后su – msa\u003c/p\u003e\n\u003cp\u003e3)ssh-keygen -t rsa\n指定密钥路径和输入口令之后,即在/home/msa/.ssh/中生成公钥和私钥:id_rsa id_rsa.pub\u003c/p\u003e\n\u003cp\u003e4)cat id_rsa.pub \u0026raquo; authorized_keys\n至于为什么要生成这个文件,因为sshd_config里面写的就是这个。\n然后chmod 400 authorized_keys,稍微保护一下。\u003c/p\u003e\n\u003cp\u003e5)用psftp把把id_rsa拉回本地,然后把服务器上的id_rsa和id_rsa.pub干掉\u003c/p\u003e\n\u003cp\u003e6)配置/etc/ssh/sshd_config\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eProtocol 22\nServerKeyBits 1024\nPermitRootLogin no #禁止root登录而已,与本文无关,加上安全些\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e#以下三行没什么要改的,把默认的#注释去掉就行了\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eRSAAuthentication yes\nPubkeyAuthentication yes\nAuthorizedKeysFile …\u003c/p\u003e\u003c/blockquote\u003e"
October 13, 2010
Linux实现从Ext2到Ext3文件系统的转换
"\u003cp\u003e日志文档系统ext3具备ext2所不具备的特点和优势。顺利完成从ext2到ext3的转换,是实现ext3优势的必经之路。ext3文档系统是ext2文档系统的更高一级版本,他有一个其他同类日志文档系统所不具备的独特优势――完全兼容ext2文档系统,因而ext3能充分利用ext2中已有的操作和应用,而且比ext2更有效、更易用。他在ext2的基础上加入了记录元数据的日志功能,是个支持异步的日志。Red Hat 7.2和SuSE 7.3已率先发行了包含ext3文档系统的Linux。通过使用Linux最新安装版本和e2fsprogs Linux公用程式,可将ext3文档系统编译到系统的内核中。这里介绍的是ext2到ext3系统转换的一些基本方法,并为用户提供修正的参考建议。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eext3日志文档系统\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1.日志文档系统\u003c/p\u003e\n\u003cp\u003e日志文档系统的设计思想是跟踪文档系统的变化而不是文档系统的内容。他用单独的日志文档跟踪磁盘内容的变化,就像关系型数据库(RDBMS),因而比传统的文档系统安全。日志文档系统能够用事务处理的方式,提交或撤消文档系统的变化。当系统非正常关闭,处于写入磁盘过程中的文档系统被非正常卸载,文档 …\u003c/p\u003e"
October 13, 2010
Linux 查看文件系统及分区格式!
"\u003cblockquote\u003e\n\u003cp\u003e可以用df -T /df -Th /df -TH\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e今天读到新一代 Linux 文件系统 btrfs 简介 感觉写的很好,纠正了我对ext2/3的几个错误理解,并且让我明白了为什么很多人在论坛或者聚合上总是在问Linux 什么时间支持ZFS 真是期待Btrfs的出现呀!不过在LinuxTOY上看到说MeeGo将采用btrfs做为默认文件系统。\u003c/p\u003e\n\u003cp\u003eext3比ext2读写小文件要快,才想到我的很多系统貌似手工做成了ext2格式的想统计一下,于是乎就产生了这个标题。\u003c/p\u003e\n\u003cp\u003e两个文件 /etc/fstab 和 /etc/mtab (至于这两个文件后便介绍)可以看到分区的格式信息,另外运行一条命令也可以 df -T 不过他读取的是 /etc/mtab中的信息,貌似这样不挂载的分区信息将无法展现出来。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e另外 fdisk 可以查看磁盘的分区的类型,这个类型不是格式 是指是哪类文件系统。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e例如:fdisk -l 可以列出分区信息里边有一个ID列,这个就是分区的类型ID.可以到 fdisk 里用l命令查看具体分类!\u003c/p\u003e\n\u003cp\u003e/etc/fstab是个配置文件,而/etc/mtab则显示的是已经被挂载的fs的清单文件,关 …\u003c/p\u003e"
October 13, 2010
ldconfig命令作用
"\u003cp\u003eldconfig是一个动态链接库管理命令\u003c/p\u003e\n\u003cp\u003e为了让动态链接库为系统所共享,还需运行动态链接库的管理命令–ldconfig\u003c/p\u003e\n\u003cp\u003eldconfig 命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态 链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表.\u003c/p\u003e\n\u003cp\u003eldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eldconfig命令行用法如下:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eldconfig [-v|–verbose] [-n] [-N] [-X] [-f CONF] [-C CACHE] [-r ROOT] [-l] [-p|–print-cache]\u003c/p\u003e\n\u003cp\u003e[-c FORMAT] [–format=FORMAT] [-V] [-?|–help|–usage] path…\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eldconfig可用的选项说明如下:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(1) -v或–verbose : 用此选项 …\u003c/p\u003e"
October 13, 2010
转:Yum使用
"\u003cp\u003eyum(Yellow dog Updater, Modified)是redhat系列(包括CentOS、SUSE、Fedora等发行版本)操作系统特有的软件管理工具,类似FreeBSD的port和Debian的apt-get,当然yum有着更强大的功能,无论是图形还是文字界面上的。\u003c/p\u003e\n\u003ch2 id=\"目录\"\u003e目录\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#Yum.E4.BD.BF.E7.94.A8\"\u003e1 Yum使用\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#.E7.9B.AE.E7.9A.84\"\u003e1.1 目的\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#yum.E4.BB.8B.E7.BB.8D\"\u003e1.2 yum介绍\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#yum.E5.B8.B8.E7.94.A8.E5.91.BD.E4.BB.A4\"\u003e1.3 yum常用命令\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#yum.E6.9C.8D.E5.8A.A1.E5.99.A8\"\u003e2 yum服务器\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#rpm.E8.BD.AF.E4.BB.B6.E5.8C.85.E6.94.BE.E7.BD.AE.E7.9A.84.E4.B8.80.E7.82.B9.E5.B0.8F.E7.9F.A5.E8.AF.86\"\u003e2.1 rpm软件包放置的一点小知识\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#rpm.E8.BD.AF.E4.BB.B6.E5.8C.85.E5.91.BD.E5.90.8D\"\u003e2.2 rpm软件包命名\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#rpm.E8.BD.AF.E4.BB.B6.E5.8C.85.E7.9B.AE.E5.BD.95.E6.94.BE.E7.BD.AE\"\u003e2.3 rpm软件包目录放置\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#.E6.9C.8D.E5.8A.A1.E5.99.A8.E4.B8.8Arepo.E7.9A.84.E6.9B.B4.E6.96.B0\"\u003e2.4 服务器上repo的更新\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#yum.E5.AE.A2.E6.88.B7.E7.AB.AF\"\u003e3 yum客户端\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#.E5.AE.A2.E6.88.B7.E7.AB.AF.E9.85.8D.E7.BD.AE\"\u003e3.1 客户端配置\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#.E5.AE.A2.E6.88.B7.E7.AB.AFrepo.E9.85.8D.E7.BD.AE\"\u003e3.2 客户端repo配置\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"yum使用\"\u003eYum使用\u003c/h2\u003e\n\u003ch3 id=\"目的\"\u003e目的\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e如何使用yum软件管理工具;\u003c/li\u003e\n\u003cli\u003e如何将rpm包放置到yum服务器上;\u003c/li\u003e\n\u003cli\u003e配置好客户端的yum源;\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"yum介绍\"\u003eyum介绍\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eyum(Yellow dog Updater, Modified)是redhat系列(包括CentOS、SUSE、Fedora等发行版本)操作系统特有的软件管理工具,类似FreeBSD的port和Debian的apt-get,当然yum有着更强大的功能,无论是图形还是文字界面上的。 …\u003c/li\u003e\u003c/ul\u003e"
October 12, 2010
MySQL /bin/rm: cannot remove `libtoolT’: No such file or directory的解决办法
"\u003cp\u003e在 CentOS 5.5 下编译安装MySQL时出错:\u003c/p\u003e\n\u003cp\u003e/bin/rm: cannot remove `\u003ca href=\"http://www.yanghengfei.com/tag/libtoolt/\"\u003elibtoolt\u003c/a\u003e‘: No such file or directory\u003c/p\u003e\n\u003cp\u003econfig.status: executing depfiles commands\nconfig.status: executing libtool commands\n/bin/rm: cannot remove `libtoolT’: No such file or directory\nconfig.status: executing default commands\nconfigure: WARNING: unrecognized options: –with-low-mymory\u003c/p\u003e\n\u003cp\u003eThank you for choosing MySQL!\u003c/p\u003e\n\u003cp\u003eRemember to check the platform specific part of the reference manual\nfor hints about installing MySQL on your platform.\nAlso have a …\u003c/p\u003e"
October 12, 2010
(总结)Nginx 502 Bad Gateway错误问题收集
"\u003cp\u003enginx和lighttpd的文档真的很少,更不用说中文文档了,所以收集一些和502有关的错误在这里。\u003c/p\u003e\n\u003cp\u003e502是FastCGI出现问题,所以从FastCGI配置入手。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.请检查你的FastCGI进程是否启动\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2.FastCGI进程不够使用\u003c/strong\u003e\n请通过执行 netstat -anpo | grep “php-cgi” | wc -l 判断,是否接近你启动的FastCGI进程,接近你的设置,表示进程不够\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3.执行超时\u003c/strong\u003e\n请把\nfastcgi_connect_timeout 300;\nfastcgi_send_timeout 300;\nfastcgi_read_timeout 300;\n这几项的值调高\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e4.FastCGI缓冲不够\u003c/strong\u003e\nnginx和apache一样,有前端缓冲限制\n请把\nfastcgi_buffer_size 32k;\nfastcgi_buffers 8 32k;\n这几项的值调高\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e5.Proxy缓冲不够\u003c/strong\u003e\n如果你使用了Proxying,请把\nproxy_buffer_size 16k;\nproxy_buffers 4 16k;\n这几项的值调高\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e6.https转发配置错误\u003c/strong\u003e\n正确 …\u003c/p\u003e"
October 12, 2010
Linux下patch打补丁命令实例详解
"\u003cp\u003e\u003cstrong\u003elinux下patch命令使用详解—linux打补丁命令\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e功能说明:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e****修补文件。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e语 法:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e\u003cstrong\u003e\u003cstrong\u003ep\u003c/strong\u003e\u003c/strong\u003eatch\u003c/strong\u003e [-bceEflnNRstTuvZ][-B \u0026lt;备份字首字符串\u0026gt;][-d \u0026lt;工作目录\u0026gt;][-D \u0026lt;标示符号\u0026gt;][-F \u0026lt;监别列数\u0026gt;][-g \u0026lt;控制数值\u0026gt;][-i \u0026lt;修补文件\u0026gt;][-o \u0026lt;输出文件\u0026gt;][-p \u0026lt;剥离层级\u0026gt;][-r \u0026lt;拒绝文件\u0026gt;][-V \u0026lt;备份方式\u0026gt;][-Y \u0026lt;备份字首字符串\u0026gt;][-z \u0026lt;备份字尾字符串\u0026gt;][–backup-if -mismatch][–binary][–help][–nobackup-if-mismatch][–verbose][原始文件 \u0026lt;修补文件\u0026gt;] 或 patch [-p \u0026lt;剥离层级\u0026gt;] \u0026lt; [修补文件]\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e补充说明:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e****\u003cstrong\u003epatch\u003c/strong\u003e指令让用户利用设置修补文件的方式,修改,更新原始文件。倘若一次仅修改一个文件,可直接在指令列中下达指令依序执行。如果配合修补文件的方 …\u003c/p\u003e"
October 12, 2010
CentOS 5 VPS的nginx+php+mysql解决方案之一
"\u003cp\u003e在CentOS5 VPS下的nginx+php+mysql的解决方案有多个,本文介绍其中的解决方案之一。\u003c/p\u003e\n\u003cp\u003e本文基于64位的CentOS 5 VPS,如果是32位的VPS,请在相应部分做修改。\u003c/p\u003e\n\u003cp\u003e本解决方案使用\u003ca href=\"http://rashost.com/blog/centos5-build-nginx-rpm\"\u003e瑞豪开源自己编译的最新稳定版本的Nginx\u003c/a\u003e,\u003ca href=\"http://rashost.com/blog/spawn-fcgi-release-from-lighttpd\"\u003efastcgi进程管理使用spawn-fcgi\u003c/a\u003e,还有CentOS 5自带的5.0.45版本的MySQL和5.1.6版本的php。\u003c/p\u003e\n\u003ch2 id=\"优缺点\"\u003e优缺点\u003c/h2\u003e\n\u003cp\u003e本方案的优点是使用CentOS5自带的php和mysql,扩展性好,php的各种扩展yum库里面都有,都可以直接使用;另外,由于使用系统自带的php和mysql,安全性要好一些,如果有什么漏洞都可以直接升级为centos官方的最新版本。由于使用spawn-fcgi,所以无须重新编译php。\u003c/p\u003e\n\u003cp\u003e本方案的缺点有:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003ephp和mysql都是centos自带的版本,不是最新版本,万一用到php最新版本的某些特性则就不行了。\u003c/li\u003e\n\u003cli\u003espawn-fcgi的性能不如php-fpm,如果想用php-fpm,请参考\u003ca href=\"http://rashost.com/blog/centos5-vps-nginx-solution2\" title=\"http://rashost.com/blog/centos5-vps-nginx-solution2\"\u003ehttp://rashost.com/blog/centos5-vps-nginx-solution2\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"安装nginx\"\u003e安 …\u003c/h2\u003e"
October 11, 2010
关闭VMware的PC喇叭
"\u003cp\u003e在VMWare中运行一些Linux上的软件如vi,出错时PC喇叭会不停地叫,很烦人。其实只要在 c:\\Documents and Settings\\用户名\\Application Data\\VMware\\config.ini (如不存在请自行建立)中加入这样一行:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emks.noBeep = \u0026#34;TRUE\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e就可以从虚拟硬件上关闭VMWare的PC喇叭。\u003c/p\u003e\n\u003cp\u003e我用的VMware是 VMware Workstation 5.5.1版。\u003c/p\u003e\n\u003cp\u003e原始链接以及本声明。\u003c/p\u003e"
October 11, 2010
在FreeBSD下用NTP进行服务器的时钟同步
"\u003cp\u003e使用Network Time Protocol (NTP)来同步服务器的时间的方法如下:\u003c/p\u003e\n\u003cp\u003e首先在服务器启动的时候需要使用ntpdate一次性的把系统时钟同步过来。在/etc/rc.conf里面加上ntpdate_enable=”YES”就可以在系统启动的时候调用ntpdate进行一次时间同步了。\n在rc.conf里面如果没有指定ntpdate_hosts参数的话,ntpdate就会读取/etc/ntp.conf文件里面的server设置。\u003c/p\u003e\n\u003cp\u003e使用ntpdate同步了时钟以后,还需要通过ntpd来不断监视和调整时钟的正确性。\n启动ntpd的方法是在/etc/rc.conf里面加上\u003cstrong\u003entpd_enable=”YES”\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003entpdate和ntpd都需要读取/etc/ntp.conf里面的配置信息。最简单的ntp.conf配置文件如下:\u003c/p\u003e\n\u003cp\u003eserver 0.asia.pool.ntp.org\nserver 1.asia.pool.ntp.org\nserver 2.asia.pool.ntp.org\nserver 3.asia.pool.ntp.org\u003c/p\u003e\n\u003cp\u003edriftfile …\u003c/p\u003e"
October 8, 2010
nginx配置支持php的pathinfo模式配置方法
"\u003cp\u003enginx模式不支持pathinfo模式,类似info.php/hello形式的url会被提示找不到页面。下面的通过正则找出实际文件路径和pathinfo部分的方法,让nginx支持pathinfo。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003elocation ~ \\.php$ {\nroot html;\nfastcgi_pass 127.0.0.1:9000;\nfastcgi_index index.php;\n\n##通过设置模拟出pathinfo\nset $path_info “”;\nset $real_script_name $fastcgi_script_name;\nif ($fastcgi_script_name ~ “^(.+?\\.php)(/.+)$”) {\n set $real_script_name $1;\n set $path_info $2;\n}\nfastcgi_param SCRIPT_FILENAME $document_root$real_script_name;\nfastcgi_param SCRIPT_NAME $real_script_name; …\u003c/code\u003e\u003c/pre\u003e"
October 6, 2010
FreeBSD 8.0 Firefox 安装 Flash 插件
"\u003cp\u003e# cd /usr/ports/www/nspluginwrapper \u0026amp;\u0026amp; make install clean\n如果没有加载Linux核心模块,会出错,请加载Linux后重新安装\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# kldload linux\n# echo ‘linux_enable=”YES”‘ \u0026raquo; /etc/rc.conf\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e# cd /usr/ports/www/linux-f10-flashplugin10 \u0026amp;\u0026amp; make install clean\n# mkdir /usr/local/lib/browser_plugins\n# ln -s /usr/local/lib/npapi/linux-f10-flashplugin/libflashplayer.so /usr/local/lib/browser_plugins/\u003c/p\u003e\n\u003cp\u003e按照 FreeBSD 版本, 在安装了正确的 Flash port 之后, \u003cstrong\u003e插件必须由每个用户运行 nspluginwrapper 安装\u003c/strong\u003e:\n% nspluginwrapper -v -a -i\u003c/p\u003e\n\u003cp\u003e# mount -t linprocfs …\u003c/p\u003e"
September 28, 2010
Squid for Windows 安装简介-最新版本
"\u003cp\u003e大家也许不知道,Squid有一个for Windows的版本,下载地址为: \u003ca href=\"http://www.acmeconsulting.it/pagine/opensource/squid/SquidNT.htm\"\u003ehttp://www.acmeconsulting.it/pagine/opensource/squid/SquidNT.htm\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e先来说一下Squid for Windows的安装,需求:你要拥有一台可联网的、运行着Windows NT/2000/XP/Server 2003的计算机,还要有Squid\u003c/p\u003e\n\u003cp\u003efor windows的软件包。从网上下载的Squid for windows的二进制文件是压缩到zip文件里的,首先来解压缩这个文件,加压后会生成一个Squid的文件夹,将此文件夹拷贝到C:,至此Squid for Windows算是被“安装”到你的Windows计算机了。(备注:Squid for windows的默认安装是在C:squid下,当然,可以把Squid放到其他的路径,但是需要大量的配置squid配置文件中的路径信息,那样会比较 麻烦)\u003c/p\u003e\n\u003cp\u003eUnix Like的操作系统下的大部分软件都是基于命令行的,使用文本文件进行配置,这样虽说对一些用惯了Windows下软件的朋友们会有些复杂的感觉,但是这 样的软 …\u003c/p\u003e"
September 28, 2010
win下的ps -aux | grep xxx
"\u003cp\u003ewin上的tasklist.exe,可惜只有XP以上才有\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003etasklist | findstr /I xxx\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eTASKLIST [/S system [/U username [/P [password]]]]\n[/M [module] | /SVC | /V] [/FI filter] [/FO format] [/NH]\u003c/p\u003e\n\u003cp\u003e描述:\n该工具显示在本地或远程机器上当前运行的进程列表。\u003c/p\u003e\n\u003cp\u003e参数列表:\n/S system 指定连接到的远程系统。\u003c/p\u003e\n\u003cp\u003e/U [domain\\]user 指定应该在哪个用户上下文执行这个命令。\u003c/p\u003e\n\u003cp\u003e/P [password] 为提供的用户上下文指定密码。如果忽略,提示\n输入。\u003c/p\u003e\n\u003cp\u003e/M [module] 列出当前使用所给 exe/dll 名称的所有任务。\n如果没有指定模块名称,显示所有加载的模块。\u003c/p\u003e\n\u003cp\u003e/SVC 显示每个进程中主持的服务。\u003c/p\u003e\n\u003cp\u003e/V 显示详述任务信息。\u003c/p\u003e\n\u003cp\u003e/FI filter 显示一系列符合筛选器指定的标准的任务。\u003c/p\u003e\n\u003cp\u003e/FO format …\u003c/p\u003e"
September 26, 2010
MooseFS分布式文件系统安装向导
"\u003cp\u003e中文版下载: \u003ca href=\"/wp-content/uploads/2010/09/moosefs-step-by-step-tutorial-cn-v.1.1.rar\"\u003eoosefs-step-by-step-tutorial-cn-v.1.1.rar\u003c/a\u003e\u003c/p\u003e"
September 25, 2010
Linux下使用screen工作How-to
"\u003cp\u003e通过ssh在Linux终端下工作,有一个很烦的事情就是,如果需要执行一个长时间的命令(例如拷贝一个大文件,或者做DDL)时,如果终端意外断开(网络或者别的原因),一般命令就会终止,当然你可以使用nohup命令,这里提供另一个办法:使用\u003ca href=\"http://www.gnu.org/software/screen/\"\u003escreen\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e一般,我们创建一个screen会话,然后连接会话并在会话下工作,这时候,我们可以随时挂起会话,去做别的事情,而且这个挂起的会话会一直在后台执行。而后又可以重新连接会话。下面是一个简单的How-to:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eHow-to\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e1.1 创建一个screen会话\u003c/p\u003e\n\u003cp\u003escreen -dmS supu\u003c/p\u003e\n\u003cp\u003e该命令,创建一个名为supu的会话,当时并不立刻进入会话。\u003c/p\u003e\n\u003cp\u003e1.2 连入会话\u003c/p\u003e\n\u003cp\u003escreen -r supu\u003c/p\u003e\n\u003cp\u003e连入会话后,就可以做任何想做的工作了。\u003c/p\u003e\n\u003cp\u003e1.3 挂起该终端\u003c/p\u003e\n\u003cp\u003e如果你在会话中,做了某个需要等很久的操作,或者你需要离开一段时间,这时就需要执行挂起操作了:\u003c/p\u003e\n\u003cp\u003e(ctrl+a) + D 先按下Ctr+a然后按D键(screen捕获ctrl+a,后面跟一个命令键D,可以通过ctrl+a ?查看更多)\u003c/p\u003e\n\u003cp\u003e1.4 其他相关\u003c/p\u003e\n\u003cp\u003e而后,可以重新使用-r参数回到会话;在会话 …\u003c/p\u003e"
September 23, 2010
ImageMagick及PHP的imagick扩展的安装及配置
"\u003cp\u003e在看在 ”\n\u003ca href=\"http://blog.haohtml.com/index.php/archives/5791\"\u003e基于CentOS 5.5 搭建nginx +php +php-fpm+mysql高性能php平台\u003c/a\u003e“的1.7的时候,发现以下两个包,\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewget \u003ca href=\"http://blog.s135.com/soft/linux/nginx_php/imagick/ImageMagick.tar.gz\"\u003ehttp://blog.s135.com/soft/linux/nginx_php/imagick/ImageMagick.tar.gz\u003c/a\u003e\nwget \u003ca href=\"http://pecl.php.net/get/imagick-2.3.0.tgz\"\u003ehttp://pecl.php.net/get/imagick-2.3.0.tgz\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e不太清楚两个包的区别是什么的,在网上查了一下,注意区别如下:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://pecl.php.net/package/imagick\"\u003eimagick\u003c/a\u003e 是一个 \u003ca href=\"http://www.php.net/\"\u003ePHP\u003c/a\u003e 的扩展,用 \u003ca href=\"http://www.imagemagick.org/\"\u003eImageMagick\u003c/a\u003e 提供的API来进行图片的创建与修改,不过这些操作已经包装到扩展imagick中去了,最终调用的是ImageMagick提供的API.\u003c/p\u003e\n\u003cp\u003eImageMagick是一套软件系列,主要用于图片的创建、编辑以及转换等,详细的解释见ImageMagick的官方网站 \u003ca href=\"http://www.imagemagick.org/\"\u003ehttp://www.imagemagick.org/\u003c/a\u003e,ImageMagick与GD的性能要高很多,如果是在处理大量的图片时更加能体现ImageMagick的性能。\u003c/p\u003e\n\u003cp\u003e英文原文介绍如下:\u003c/p\u003e\n\u003cp\u003eimagick is a native …\u003c/p\u003e"
September 20, 2010
在Centos中yum安装和卸载软件的使用方法
"\u003cp\u003eYum(全 称为 Yellow dog Updater, Modified)是一个在Fedora,Redhat,CentOS中的Shell前端软件包办理器.基於RPM包办理,可以或许从指定的服务器AUTO下载 RPM包而且安装,可以AUTO处理依赖性关系,而且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e安装一个软件时\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eyum -y install httpd\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e安装多个相类似的软件时\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eyum -y install httpd*\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e安装多个非类似软件时\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eyum -y install httpd php php-gd mysql\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e卸载一个软件时\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eyum -y remove httpd\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e卸载多个相类似的软件\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eyum -y remove httpd*\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e卸载多个非类似软件时\u003c/strong\u003e\u003c/p\u003e\n\u003ch1 id=\"yum--y-remove-httpd-php-php-gd-mysql\"\u003eyum -y remove httpd php php-gd mysql\u003c/h1\u003e\n\u003cp\u003e别的还有一个非常棒的用法\u003c/p\u003e\n\u003cp\u003e假如我要执行\u003cstrong\u003eiostat\u003c/strong\u003e这个命令来查看CPU与 存储设备状态,可是执行却发现没有这个命令\u003c/p\u003e\n\u003cp\u003e于是执行yum install \u003cstrong\u003eiostat\u003c/strong\u003e,结果说找不到该软件,使用下面的措施可以解决\u003c/p\u003e\n\u003cp\u003eyum search \u003cstrong\u003eiostat\u003c/strong\u003e就能 …\u003c/p\u003e"
September 19, 2010
How to install PHP-fpm + Nginx on CentOS 5.3
"\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/archives/9294\"\u003ephp-fpm文档中文翻译[转]:http://blog.haohtml.com/archives/9294\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eIn this tutorial i will try to install php-fpm with nginx on centos 5.3. But first:\u003c/p\u003e\n\u003ch2 id=\"what-is-php-fpm-\"\u003eWhat is PHP-FPM ?\u003c/h2\u003e\n\u003cp\u003ePHP-FPM is a patch for PHP4/5 to greatly improve PHP’s FastCGI SAPI capabilities and administration. This means that you don’t install php through your distribution’s package manager, but rather download the package from the PHP-website, and the patch from another site. You patch up the sourcecode, compile things, and get it started.\u003c/p\u003e"
September 18, 2010
[教程]Centos5安装nginx教程及遇到的rewrite和HTTP cache错误解决办法
"\u003cp\u003e有时候,我们需要单独安装nginx,来处理大量的下载请求。单独在Centos5安装nginx遇到的rewrite和HTTP cache错误解决办法:\u003c/p\u003e\n\u003cp\u003ewget \u003ca href=\"http://nginx.org/download/nginx-0.8.33.tar.gz\"\u003ehttp://nginx.org/download/nginx-0.8.33.tar.gz\u003c/a\u003e\ntar -zxvf nginx-0.8.33.tar.gz\ncd nginx-0.8.33\n./configure –prefix=/usr/local/nginx\u003c/p\u003e\n\u003cp\u003e安装Nginx时报错\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e./configure: error: the HTTP rewrite module requires the PCRE library.\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e安装pcre-devel解决问题\nyum -y install pcre-devel\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e错误提示:./configure: error: the HTTP cache module requires md5 functions from OpenSSL library. You can either disable the module by using\u003c/p\u003e\n\u003cp\u003e–without-http-cache option, …\u003c/p\u003e"
September 18, 2010
为centos添加EPEL软件仓库
"\u003cp\u003e想用Red Hat Enterprise Linux,但苦于囊中羞涩(欢迎 \u003ca href=\"http://filteroff.com/index.php?q=uggcf%3A%2F%2Fjjj.erqung.pbz%2Fjnccf%2Ffgber%2F\" title=\"购买 RHEL AS Subscription\"\u003e购买 RHEL AS Subscription\u003c/a\u003e:US$1,499 / year),好在还有centos可选,但总感觉它的包少了点。\u003c/p\u003e\n\u003cp\u003e好在现在可以使用Fedora Project 推出的 EPEL(Extra Packages for Enterprise Linux),EPEL是RHEL 的 Fedora 软件仓库,把它添上,你就可以获得 RHEL AS 的高质量、高性能、高可靠性,又需要方便易用(关键是免费)的软件包更新功能。\u003c/p\u003e\n\u003cp\u003eEPEL( \u003ca href=\"http://fedoraproject.org/wiki/EPEL\" title=\"http://fedoraproject.org/wiki/EPEL\"\u003ehttp://fedoraproject.org/wiki/EPEL\u003c/a\u003e) 是由 Fedora 社区打造,为 RHEL 及衍生发行版如 CentOS、Scientific Linux 等提供高质量软件包的项目。装上了 EPEL,就像在 Fedora 上一样,可以通过 yum install package-name,随意安装软件。\n安装 EPEL 非常简单:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eRHEL 4(centos 4):\u003c/li\u003e\n\u003c/ul\u003e\n\u003cblockquote\u003e\n\u003cp\u003esu -c ‘rpm -Uvh …\u003c/p\u003e\u003c/blockquote\u003e"
September 18, 2010
[原创]使用Centos-DVD作为YUM源安装系统
"\u003cp\u003e使用Centos DVD作为软件yum源来安装软件\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.挂载CDROM\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003emkdir /mnt/cdrom\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003emount -t auto /dev/cdrom /mnt/cdrom\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e有关mount的用法请参考: \u003ca href=\"http://blog.haohtml.com/archives/9583\"\u003ehttp://blog.haohtml.com/archives/9583\u003c/a\u003e,可以将上面的两行写到一个文件set_yum_dvd.sh里.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2.修改配置文件\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e默认情况下是以网络的方式来安装的,如果网络无法连接话,再从本地YUM源安装,对于网络方式配置文件为etc/yum.repos.d/CentOS-Base.repo,而本地yum源配置文件为/etc/yum.repos.d/CentOS-Media.repo,所以为了让使用本地yum源,只有把CentOS-Base.repo改为名字即可。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003ecd /etc/yum.repos.d/\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003emv CentOS-Base.repo CentOS-Base.repo.bak\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003evi CentOS-Media.repo\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e把以下三行的后两行删除\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003ebaseurl=file:///media/CentOS/ …\u003c/p\u003e\u003c/blockquote\u003e"
September 18, 2010
CentOS CDROM挂载使用mount命令
"\u003cp\u003eCentOS CDROM挂载还是比较常用的,于是我研究了一下CentOS CDROM挂载,在这里拿出来和大家分享一下,希望CentOS CDROM挂载对大家有用。使用mount命令CentOS CDROM挂载学习目的是能访问CentOS CDROM挂载中的数据。\u003c/p\u003e\n\u003cp\u003eLinux显示所有的目录都在一个目录树下,而于他们位于哪一个驱动器/硬件无关。在Linux下的磁盘内容作为子目录形式出现的。可移动介质的内容不会自动出现在这些自目录的,我们必须通过挂载驱动器来实现。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e用mount命令来挂载CentOS CDROM挂载.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e命令:mount -t auto /dev/cdrom /mnt/cdrom\u003c/p\u003e\n\u003cp\u003e这命令就是把CentOS CDROM挂载在/mnt/cdrom目录中,这里我就可以访问里面的内容了。\u003c/p\u003e\n\u003cp\u003e学习操作过程:\u003c/p\u003e\n\u003cp\u003e[OK_008@CentOS4 ~]$ mount -t auto /dev/cdrom /mnt/cdrommount: only root can do that\u003c/p\u003e\n\u003cp\u003e–一般用户无法挂载cdrom,只有root用户才可以操作。\u003c/p\u003e\n\u003cp\u003e[OK_008@CentOS4 ~]$ –切换用户操作: …\u003c/p\u003e"
September 18, 2010
CentOS下安装lnmp(Nginx+PHP+MySQL)fpm
"\u003cp\u003ePHP 5.3.1\u003c/p\u003e\n\u003cp\u003eMySQL 5.0.89\u003c/p\u003e\n\u003cp\u003eNginx 0.8.33 或 0.7.65 (可选)\u003c/p\u003e\n\u003cp\u003e这个可比网上流传的什么一键安装包要好得多,强烈推荐此法安装,适合所有菜鸟和高手。我服务器上全用的源代码编译安装,也好不到哪去,还很费劲。我这个装完已经包含 php 的一些常用扩展, PDO,eaccelerator,memcache,tidy等等。\u003c/p\u003e\n\u003cp\u003eCentOS 最小化安装,然后先新建一个 repo\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1 id=\"vi-etcyumreposdcentos21andycomrepo\"\u003evi /etc/yum.repos.d/centos.21andy.com.repo\u003c/h1\u003e\u003c/blockquote\u003e\n\u003cp\u003e放入如下内容\u003c/p\u003e\n\u003cp\u003e[21Andy.com]\u003c/p\u003e\n\u003cp\u003ename=21Andy.com Packages for Enterprise Linux 5 – $basearch\u003c/p\u003e\n\u003cp\u003ebaseurl=http://www.21andy.com/centos/5/$basearch/\u003c/p\u003e\n\u003cp\u003eenabled=1\u003c/p\u003e\n\u003cp\u003egpgcheck=0\u003c/p\u003e\n\u003cp\u003eprotect=1\u003c/p\u003e\n\u003cp\u003e或者使用中国科技大学的yum源:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#cd /etc/yum.repos.d\u003c/p\u003e\n\u003cp\u003e#mv CentOS-Base.repo CentOS-Base.repo.save\u003c/p\u003e\n\u003cp\u003e#wget …\u003c/p\u003e\u003c/blockquote\u003e"
September 18, 2010
取消Windows2003关机事件跟踪
"\u003cp\u003e\u003cstrong\u003e法一(推荐):通过组策略对该信息进行设置。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e方法为,通过任务栏的“开始→运行→gpedit.msc启动组策略→计算机配置→管理模板→系统→显示关机事件跟踪→禁用”即可。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e法二:修改注册表\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e第一步:在桌面上建立一个文本文件,例如起名为Softer.txt。\n第二步:将以下内容填写到该批处理文件中:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eWindows Registry Editor Version 5.00\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\ Microsoft\\Windows NT\\Reliability]\n\u0026#34;ShutdownReasonOn\u0026#34;=dword:00000000\n\u0026#34;ShutdownReasonUI\u0026#34;=dword:00000000\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e第三步:将该文件另存为Softer.reg注册表文件,并双击该文件导入注册表,这样关机时的跟踪就被我们轻松取消了。\u003c/p\u003e\n\u003cp\u003e但是在我们非法关机后进入系统时,还会出现一个非法关机的事件填写窗口。我们同样可以通过编辑注册表文件的方法解决这个问题,注册表文件内容如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eWindows Registry Editor …\u003c/code\u003e\u003c/pre\u003e"
September 15, 2010
centos下安装php-json
"\u003cp\u003ecentos5下面yum源中没有json,只能通过编译了。\u003c/p\u003e\n\u003cp\u003e#cd /usr/local/src\n1.下载源文件包:\nwget\u003c/p\u003e\n\u003cp\u003e2.解压\ntar xvjf php-json-ext-1.2.0.tar.bz2\n使用tar命令解压一定要确认已经安装过bzip2,否则会提示 “tar: bzip2: Cannot exec: No such file or directory” 错误.\u003c/p\u003e\n\u003cp\u003e3.进入目录\ncd php-json-ext-1.2.0\n4.初始化PHP环境\nphpize\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e如果报错了:phpize commend not found\u003c/p\u003e\n\u003cp\u003e需要安装phpize\n这个可以在yum中安装\nyum -y install php-devel\u003c/p\u003e\n\u003cp\u003e如果还不行,说明你的编译工具有问题,安装一下就可以了\nyum -y install autoconf\nyum -y install automake\nyum -y install libtool\n运行phpize\n(成功了)\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e5../configure\u003c/p\u003e\n\u003cp\u003e6.make\u003c/p\u003e\n\u003cp\u003e7.makeinstall\u003c/p\u003e\n\u003cp\u003e8.查看有没有安装成功\nfind / -name …\u003c/p\u003e"
September 15, 2010
更改centos yum 成中国镜像加快yum速度
"\u003cp\u003e163的开源镜像地址 \u003ca href=\"http://mirrors.163.com/.help/CentOS-Base-163.repo\"\u003ehttp://mirrors.163.com/.help/CentOS-Base-163.repo\u003c/a\u003e 不同版本见 \u003ca href=\"http://mirrors.163.com/.help/centos.html\"\u003ehttp://mirrors.163.com/.help/centos.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003esohu的开源镜像地址 \u003ca href=\"http://mirrors.sohu.com/help/CentOS-Base-sohu.repo\"\u003ehttp://mirrors.sohu.com/help/CentOS-Base-sohu.repo\u003c/a\u003e 不同版本见 \u003ca href=\"http://mirrors.sohu.com/help/centos.html\"\u003ehttp://mirrors.sohu.com/help/centos.html\u003c/a\u003e (只支持4, 5版本)\u003c/p\u003e\n\u003cp\u003e中国科技大学 \u003ca href=\"http://lug.ustc.edu.cn/wiki/_export/code/mirrors/help/centos?codeblock=2\"\u003ehttp://lug.ustc.edu.cn/wiki/_export/code/mirrors/help/centos?codeblock=2\u003c/a\u003e 不同版本见 \u003ca href=\"http://lug.ustc.edu.cn/wiki/mirrors/help/centos\"\u003ehttp://lug.ustc.edu.cn/wiki/mirrors/help/centos\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e如果使用上面YUM源的话,最好把里面的 \u003cstrong\u003emirrorlist\u003c/strong\u003e 注释掉,否则系统会启动 \u003cstrong\u003efastesmirror\u003c/strong\u003e 插件自动检查的,并不一定会使用这个yum源的.\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e我用的是中国科技大学的速度不错。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e法一:直接下载源文件\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eCentOS USTC mirror 这个镜像不错, …\u003c/p\u003e\u003c/blockquote\u003e"
September 13, 2010
用Tomcat绑定多域名
"\u003cp\u003e\u003cstrong\u003e一、首先将端口改为80端口\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e打开server.xml文件\u003c/p\u003e\n\u003cp\u003e将其中的8080端口改为80,即:\u003c/p\u003e\n\u003cp\u003emaxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″\u003c/p\u003e\n\u003cp\u003eenableLookups=”false” redirectPort=”8443″ acceptCount=”100″\u003c/p\u003e\n\u003cp\u003econnectionTimeout=”20000″ disableUploadTimeout=”true” /\u0026gt;\u003c/p\u003e\n\u003cp\u003e改为:\u003c/p\u003e\n\u003cp\u003emaxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″\u003c/p\u003e\n\u003cp\u003eenableLookups=”false” redirectPort=”8443″ acceptCount=”100″\u003c/p\u003e\n\u003cp\u003econnectionTimeout=”20000″ disableUploadTimeout=”true” /\u0026gt;\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二、然后更改默认访问站点:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e即\u003c/p\u003e\n\u003cp\u003e默认的是localhost\u003c/p\u003e\n\u003cp\u003e现在将其改为任意本机上绑定域名,如改为:\u003c/p\u003e\n\u003cp\u003e这样做是为了防止进入Tomcat的默认管理页面!\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e三、最后配置,即在前加入以下代 …\u003c/strong\u003e\u003c/p\u003e"
September 9, 2010
Nginx常用Rewrite(伪静态规则)
"\u003cp\u003e信现在大部分用Linux VPS的朋友都在使用这个迅速传播的 \u003ca href=\"http://nginx.me/\"\u003eNginx\u003c/a\u003e,今天就整理一下最常见的PHP程序的Rewrite(伪静态规则)。\u003c/p\u003e\n\u003cp\u003eWordPress:\u003c/p\u003e\n\u003cp\u003elocation / {\nindex index.html index.php;\nif (-f $request_filename/index.html){\nrewrite (.\u003cem\u003e) $1/index.html break;\n}\nif (-f $request_filename/index.php){\nrewrite (.\u003c/em\u003e) $1/index.php;\n}\nif (!-f $request_filename){\nrewrite (.*) /index.php;\n}\n}\u003c/p\u003e\n\u003cp\u003ePHPCMS:\u003c/p\u003e\n\u003cp\u003elocation / {\n###以下为PHPCMS 伪静态化rewrite规则\nrewrite ^(.\u003cem\u003e)show-([0-9]+)-([0-9]+).html$ $1/show.php?itemid=$2\u0026amp;page=$3;\nrewrite ^(.\u003c/em\u003e)list-([0-9]+)-([0-9]+).html$ …\u003c/p\u003e"
September 9, 2010
nginx rewrite规则和参考
"\u003cp\u003e推荐参考地址:\nMailing list ARChives 官方讨论区\u003c/p\u003e\n\u003cp\u003eNginx 常见应用技术指南[Nginx Tips]\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e本日志内容来自互联网和平日使用经验,整理一下方便日后参考。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e正则表达式匹配,其中:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cul\u003e\n\u003cli\u003e~ 为区分大小写匹配\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cul\u003e\n\u003cli\u003e~* 为不区分大小写匹配\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cul\u003e\n\u003cli\u003e!\u003cdel\u003e和!\u003c/del\u003e*分别为区分大小写不匹配及不区分大小写不匹配\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003e文件及目录匹配,其中:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cul\u003e\n\u003cli\u003e-f和!-f用来判断是否存在文件\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cul\u003e\n\u003cli\u003e-d和!-d用来判断是否存在目录\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cul\u003e\n\u003cli\u003e-e和!-e用来判断是否存在文件或目录\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cul\u003e\n\u003cli\u003e-x和!-x用来判断文件是否可执行\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eflag标记有:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cul\u003e\n\u003cli\u003elast 相当于Apache里的[L]标记,表示完成rewrite\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cul\u003e\n\u003cli\u003ebreak 终止匹配, 不再匹配后面的规则\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cul\u003e\n\u003cli\u003eredirect 返回302临时重定向 地址栏会显示跳转后的地址\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cul\u003e\n\u003cli\u003epermanent 返回301永久重定向 地址栏会显示跳转后的地址\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003e一些可用的全局变量有,可以用做条件判断(待补全)\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e$args\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e$content_length\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e$content_type …\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e"
September 9, 2010
nginx 虚拟目录的配置
"\u003cp\u003enginx貌似没有虚拟目录的说法,因为它本来就是完完全全根据目录来设计并工作的。\u003c/p\u003e\n\u003cp\u003e如果非要给nginx安上一个虚拟目录的说法,那就只有alias标签比较“像”,干脆来说说alias标签和root标签的区别吧。\u003c/p\u003e\n\u003cp\u003e最基本的区别:alias指定的目录是准确的,root是指定目录的上级目录,并且该上级目录要含有location指定名称的同名目录。另外,根据前文所述,使用alias标签的目录块中不能使用rewrite的break。\u003c/p\u003e\n\u003cp\u003e说不明白,看下配置:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003elocation /abc/ {\nalias /home/html/abc/;\n}\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e在这段配置下,http://test/abc/a.html就指定的是/home/html/abc/a.html。这段配置亦可改成\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003elocation /abc/ {\nroot /home/html/;\n}\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这样,nginx就会去找/home/html/目录下的abc目录了,得到的结果是相同的。\u003c/p\u003e\n\u003cp\u003e但是,如果我把alias的配置改成:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003elocation /abc/ {\nalias /home/html/def/;\n}\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e那么nginx将会 …\u003c/p\u003e"
September 8, 2010
[原创教程]在FreeBSD下安装BIND,提供dns服务
"\u003cp\u003e\u003cstrong\u003e一.用ports方式安装bind9\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#/usr/ports/dns/bind9\n#make install clean\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e并在/etc/rc.conf文件里添加一行:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003enamed_enable=”YES”\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e作为系统服务启动.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二.配置BIND\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1.编辑/etc/namedb/named.conf 文件,在最下面以下两部分\u003c/p\u003e\n\u003cp\u003e#正向解析配置文件\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ezone “haohtml.com” {\ntype master;\nfile “master/haohtml.com”;\n};\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e#反向解析配置文件\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ezone “0.168.192.in-addr.arpa” {\ntype master;\nfile “master/0.168.192.in-addr.arpa”;\n};\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e然后编辑 listen-on {127.0.0.1;}; 的后面添加监听ip地址,如下:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003elisten-on {127.0.0.1; 192.168.0.222;};\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e第个ip后面加一个”;”符号.\u003c/p\u003e\n\u003cp\u003e对于转发一部分,我们暂不进行配置,这里用不到的.\u003c/p\u003e\n\u003cp\u003e============================\n2. …\u003c/p\u003e"
September 8, 2010
Linux中cp总是提示覆盖文件的解决办法
"\u003cp\u003e把a目录下的文件复制到b目录\ncp –r a/* b\n执行上面的命令时,b存在的每个文件都会提示是否覆盖;\ncp –r –f a/* b\n执行上面的命令时,b存在的每个文件都不再会提示;\n这是我们希望的理想状态,但是有时加了 -f了,怎么还会有提示呢?原来一些服务器会默认增加别名 alias cp =’cp -i’,当你执行cp 时, 其实执行的是cp –i。\n在终端执行alias就可以看出来了。\n[root@devdb ~]# alias\nalias cp =’cp -i’\n可以这样解决\n[root@devdb ~]# vi ~/.bashrc\n在alias cp =’cp -i’前加上”#”注释掉这行,:wq!保存退出!\u003c/p\u003e\n\u003cp\u003e然后重新登陆就可以了。\u003c/p\u003e\n\u003cp\u003e如:\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e\u003cem\u003ecp -R -f /home/priceangels/\u003c/em\u003e /usr/ROOT/\u003c/em\u003e*\u003c/p\u003e"
September 8, 2010
原创:解决 cp: omitting directory
"\u003cp\u003elinux下面执行cp命令时提示如下信息:\u003c/p\u003e\n\u003cp\u003ecp: omitting directory\u003c/p\u003e\n\u003cp\u003e可以用下面的办法来解决\u003c/p\u003e\n\u003cp\u003ecp -r orginal_file new_file\u003c/p\u003e"
September 6, 2010
FORCE_PKG_REGISTER参数
"\u003cp\u003e更新ports到最新,然后直接重新 (make install) 编辑安装PHP时提示出错。升级之前就想到这个问题,因为没有卸载旧版本的PHP,新版本的可能没有办法正常安装。但是卸载的话相关的几个包也都要重新安装,很麻烦也很浪费时间。google了一圈也没有结果就只能自己试了。\u003c/p\u003e\n\u003cp\u003e提示是这样的:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e===\u0026gt; php5-5.2.6 is already installed\n You may wish to ``make deinstall\u0026#39;\u0026#39; and install this port again\n by ``make reinstall\u0026#39;\u0026#39; to upgrade it properly.\n If you really wish to overwrite the old port of lang/php5\n without deleting it first, set the variable \u0026#34;FORCE_PKG_REGISTER\u0026#34;\n in your environment or …\u003c/code\u003e\u003c/pre\u003e"
September 6, 2010
[教程]FreeBSD下使用ports安装Nginx + PHP5.2.6 + Php-fpm
"\u003cp\u003e钟情FreeBSD的其中一个原因就是它的方便快捷的ports软件包管理,本文在安装Nginx、PHP、Php-fpm的时候也采用ports方式安装。ports是一个非常优秀的软件包管理器,如果不希望编译安装的话,使用ports安装,几个命令就能全部搞定,这对初学者来说是很有帮助的。\u003c/p\u003e\n\u003cp\u003e事实上,Nginx 和 PHP已经在FreeBSD的ports系统里了,只是Php-fpm没有,不过,简单几个命令就能把Php-fpm添加到FreeBSD的ports中去。下面我们来看看具体的操作步骤:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1. 安装nginx\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e# cd /usr/ports/www/nginx\u003c/p\u003e\n\u003cp\u003e# make install\u003c/p\u003e\n\u003cp\u003e安装过程中要选择安装模块,这里我选择如下几个模块做示范\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eHTTP_MODULE\u003c/li\u003e\n\u003cli\u003eHTTP_REWRITE_MODULE\u003c/li\u003e\n\u003cli\u003eHTTP_SSL_MODULE\u003c/li\u003e\n\u003cli\u003eHTTP_STATUS_MODULE\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eFreeBSD下的ports安装实在是太简单、方便了,没什么可多说的,下面直接安装php。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2. 安装php\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e# cd /usr/ports/lang/php5\n# make install\u003c/p\u003e\n\u003cp\u003e安装过程中,选择如下模 …\u003c/p\u003e"
September 3, 2010
vmware中freebsd系统同步时间
"\u003cp\u003e先设置时区:\u003c/p\u003e\n\u003cp\u003e# \u003cstrong\u003etzsetup\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e再与国家授时中心服务器对时:\n\u003cstrong\u003e# ntpdate 210.72.145.44\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e以后自动同步:\u003c/p\u003e\n\u003cp\u003e首先修改/etc/rc.conf添加**ntpd_enable=”YES”**到最后一行。\u003c/p\u003e\n\u003cp\u003e然后配置对时服务器:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e# vi /etc/ntp.conf\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eserver 210.72.145.44 prefer\nserver 159.226.154.47\nserver 127.127.1.0\nfudge 127.127.0.1 stratum 5\nrestrict default ignore\nrestrict 127.0.0.0 mask 255.0.0.0\nrestrict 192.168.0.0 mask 255.255.255.0 noquery nopeer notrust\nrestrict 210.72.145.44 noquery\nrestrict 159.226.154.47 noquery\ndriftfile /var/db/ntpd.drift\u003c/p\u003e\n\u003cp\u003e/var/run/xntpd.pid\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e# ntpd -p /var/run/ntpd.pid\n# …\u003c/strong\u003e\u003c/p\u003e"
September 3, 2010
Freebsd 如何_打开_关闭_查看防火墙
"\u003cp\u003e在FreeBSD服务器上调试ipfw防火墙规则的时候,有时候需要临时关闭ipfw防火墙,可以使用如下命令来进行操作:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1)停止ipfw防火墙:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eipfw disable firewall\u003c/p\u003e\n\u003cp\u003e/etc/rc.d/ipfw stop\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e2)开启ipfw防火墙:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eipfw enable firewall\u003c/p\u003e\n\u003cp\u003e/etc/rc.d/ipfw start\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e随机器启动自动启用防火墙方法需要修改/etc/rc.conf文件,参考:第三步.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3)如何查看ipfw是否在运行\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e方法一:通过ipfw -a list 不断的去看包的数量\u003c/p\u003e\n\u003cp\u003e方法二:sysctl -a | grep net.inet.ip.fw.enable\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e如果状态是1表示是开启,0为关闭.\u003c/p\u003e\n\u003cp\u003eipfw中文手册pdf: \u003ca href=\"http://docs.haohtml.com/download/freebsd/ipfw_zh.pdf\"\u003ehttp://docs.haohtml.com/download/freebsd/ipfw_zh.pdf\u003c/a\u003e\u003c/p\u003e"
September 2, 2010
php spawn-fcgi和php-fpm
"\u003cp\u003espawn-fcgi是一个通用的FastCGI管理服务器\u003c/p\u003e\n\u003cp\u003e她是lighttpd中的一部份,但目前已经单独成为一个项目,最新的lighttpd没有这一块(),但可以在以前版本中找到她\u003c/p\u003e\n\u003cp\u003e在lighttpd-1.4.15( \u003ca href=\"http://www.lighttpd.net/download/lighttpd-1.4.15.tar.gz\"\u003ehttp://www.lighttpd.net/download/lighttpd-1.4.15.tar.gz\u003c/a\u003e )中就有她\u003c/p\u003e\n\u003cp\u003eNote注:最新的spawn-fcgi可以到lighttpd.net网站搜索“spawn-fcgi”找到她的最新版本发布地址\u003c/p\u003e\n\u003cp\u003e目前她的下载地址是http://redmine.lighttpd.net/news/2 最新版本是http://www.lighttpd.net/download/spawn-fcgi-1.6.0.tar.gz\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003etar -zxvf lighttpd-1.4.15.tar.gz\ncd lighttpd-1.4.15\n./configure #编译\nmake #因为我不需要安装lighttp而是只需要他其中的某个文件,所以只make就可以了,不需要make install\ncp src/spawn-fcgi …\u003c/p\u003e\u003c/blockquote\u003e"
September 2, 2010
Ubuntu下apt-get 命令参数
"\u003cp\u003e常用的APT命令参数\u003c/p\u003e\n\u003cp\u003eapt-cache search package 搜索包\u003c/p\u003e\n\u003cp\u003eapt-cache show package 获取包的相关信息,如说明、大小、版本等\u003c/p\u003e\n\u003cp\u003esudo apt-get install package 安装包\u003c/p\u003e\n\u003cp\u003esudo apt-get install package – – reinstall 重新安装包\u003c/p\u003e\n\u003cp\u003esudo apt-get -f install 修复安装”-f = ――fix-missing”\u003c/p\u003e\n\u003cp\u003esudo apt-get remove package 删除包\u003c/p\u003e\n\u003cp\u003esudo apt-get remove package – – purge 删除包,包括删除配置文件等\u003c/p\u003e\n\u003cp\u003esudo apt-get update 更新源\u003c/p\u003e\n\u003cp\u003esudo apt-get upgrade 更新已安装的包\u003c/p\u003e\n\u003cp\u003esudo apt-get dist-upgrade 升级系统\u003c/p\u003e\n\u003cp\u003esudo apt-get dselect-upgrade 使用 dselect 升级\u003c/p\u003e\n\u003cp\u003eapt-cache depends package 了解使用依赖\u003c/p\u003e\n\u003cp\u003eapt-cache rdepends package …\u003c/p\u003e"
September 2, 2010
FreeBSD 如何从普通用户切换到root下
"\u003cp\u003eOS:freebsd 7.2\u003c/p\u003e\n\u003cp\u003e在FreeBSD 7.2下,通过ssh客户端连接到FreeBSD端,用普通的用户登录,执行下列命令报错:\u003c/p\u003e\n\u003cp\u003e$ su –\nsu: Sorry\n$ su\nsu: Sorry\u003c/p\u003e\n\u003cp\u003e原因:在FreeBSD上要使用 su命令成为root用户,不但要知道root的口令,还需要经过特别设置,否则就不能成功使用这个命令。这是因为 FreeBSD对执行su命令的用户进行了更严格的限制,能使用su命令的用户必须属于wheel组(root的基本属组,组ID为0),否则就不能通过这个命令成为root用户。\u003c/p\u003e\n\u003cp\u003e因此需要编辑组设置文件/etc/group,将需要超级用户权力的管理成员加入到wheel组中。\u003c/p\u003e\n\u003cp\u003e用 root用户登录,修改/etc/group文件,在wheel组中添加普通用户,操作如下:\u003c/p\u003e\n\u003cp\u003e#ee /etc/group\u003c/p\u003e\n\u003cp\u003e#wheel:*:0:root,pup (在wheel组中,增加pup用户)\u003c/p\u003e\n\u003cp\u003e按ESC,选择a)leave editor—-\u0026gt;选择a)save changes,保存退出!\u003c/p\u003e\n\u003cp\u003e使用pup用户ssh登录\u003c/p\u003e\n\u003cp\u003e$ su –\nPassword:\u003c/p\u003e\n\u003ch1\u003e\u003c/h1\u003e\n\u003cp\u003e成功切换到root权限!\u003c/p\u003e\n\u003cp\u003e …\u003c/p\u003e"
September 2, 2010
linux,unix为什么要编译内核?
"\u003cp\u003e今天看的内容是有关书上第六章编译内核的问题:\u003c/p\u003e\n\u003cp\u003e首先为什么要编译内核?\u003c/p\u003e\n\u003cp\u003e它最大的好处就是可以调整linux系统,以便其更合理地安装到计算机中。linux集成套件通常包括多种目\u003c/p\u003e\n\u003cp\u003e标内核,能够处理各种机器。除此之外,还可以通过重新编译内核以便在你的计算机上实现一些功能,\u003c/p\u003e\n\u003cp\u003e例如:将linux系统设置为一个临时路由器,使之拥有内置的路由功能,或者作为放火墙,添加一个新的外部设备(如SCSI卡等)\u003c/p\u003e\n\u003cp\u003e创建自己的内核的最好理由就是使全世界内核设计者所提供的各种为改进性能而设计的内核得到充分利用。创建内核的过程不是很困难,只是要花费一些时间,并且系统越老或运行越慢,在创建时所花费的时间就越长,而且要特别注意一些关键的驱动程序或者其特性时,那会带来不少麻烦的\u003c/p\u003e\n\u003cp\u003e这个内核将针对机器的处理器进行优化,并且只提供需要的驱动和特征。另一个原因是为内核增加新的支持特性,有些特性在发行商提供的内核中有可能没有包括进来,或让硬件工作得更好。\u003c/p\u003e\n\u003cp\u003e最终结果是建立一个更小的,更快的,打上所有最新最稳定的补丁和增强特性的内核。\u003c/p\u003e"
September 1, 2010
浅谈Linux优化及安全配置的个人体会
"\u003cp\u003e\u003cstrong\u003e前言:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e很久没有写过文章了,最近收到不少朋友来信,提及了有关优化配置和一些新的安全问题,在此我想和大家浅显讨论一下这些问题,有什么不准确和有更好的方式,请给我来信共同讨论提高。\u003c/p\u003e\n\u003cp\u003e在网上看到不少有关linux优化方面的好文章,在此我也不赘述这些文章了,我只想从我自己的体会来谈谈这方面的问题。\u003c/p\u003e\n\u003cp\u003e作为一个系统管理员,我下面说的都是基于服务器应用的linux来谈的,由于个人电脑上使用linux也许不是像服务器上一样,优先追求安全和稳定,因此个人电脑使用的朋友只做个参考吧。\u003c/p\u003e\n\u003cp\u003e本文提及的系统,如没有特别声明,均采用redhat公司的redhat linux系统。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e关于优化\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e说起优化,其实最好的优化就是提升硬件的配置,例如提高cpu的运算能力,提高内存的容量,个人认为如果你考虑升级硬件的话,建议优先提高内存的容量,因为一般服务器应用,对内存的消耗使用要求是最高的。当然这都是题外话了。\u003c/p\u003e\n\u003cp\u003e这里我们首要讨论的,是在同等硬件配置下(同一台服务器,不提升硬件的情况下)对你的系统进行优化。\u003c/p\u003e\n\u003cp\u003e作为系统管理员,我认为,首先我们要明确一个观点:在服务器上作任何操作,升级和修改任何配置文件或软件,都必须首要考虑安全性, …\u003c/p\u003e"
August 28, 2010
[教程]freebsd8.0下安装coreseek
"\u003cp\u003e一**、安装coreseek**\u003c/p\u003e\n\u003cp\u003eA、安装环境配置,为安装coreseek做准备\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#pkg_add -r autoconf262 automake110 libtool mysql50-client libxml2 expat\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eB、下载整个安装包(内含mmseg,coreseek):\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#fetch \u003ca href=\"http://www.coreseek.cn/uploads/csft/3.2/coreseek-3.2.13.tar.gz\"\u003ehttp://www.coreseek.cn/uploads/csft/3.2/coreseek-3.2.13.tar.gz\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#tar xzvf coreseek-3.2.13.tar.gz\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#cd coreseek-3.2.13\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e======================================\u003c/p\u003e\n\u003cp\u003eC \u003cstrong\u003e、\u003c/strong\u003e 安装coreseek开发的mmseg,为coreseek提供中文分词功能\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#cd mmseg-3.2.13\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#./bootstrap\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#./configure –prefix=/usr/local/mmseg3\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#make\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#make install\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e至此,mmseg已经安装完成,下面进入csft-3.2.13目录里进行安装coreseek …\u003c/p\u003e"
August 23, 2010
centos IP网络配置
"\u003cp\u003e\u003cstrong\u003e一、修改IP地址\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e修改对应网卡的IP地址的配置文件\u003c/p\u003e\n\u003cp\u003e[root@centos]# vi /etc/sysconfig/network-scripts/ifcfg-eth0\u003c/p\u003e\n\u003cp\u003e修改以下内容\u003c/p\u003e\n\u003cp\u003eDEVICE=eth0(描述网卡对应的设备别名,例如ifcfg-eth0的文件中它为eth0)\u003c/p\u003e\n\u003cp\u003eBOOTPROTO=static(设置网卡获得ip地址的方式,可能的选项为static,dhcp或bootp,分别对应静态指定的ip地址,通过dhcp协议获得的ip地址,通过bootp协议获得的ip地址)\u003c/p\u003e\n\u003cp\u003eBROADCAST=192.168.0.255(对应的子网广播地址)\u003c/p\u003e\n\u003cp\u003eHWADDR=00:07:E9:05:E8:B4 (对应的网卡物理地址)\u003c/p\u003e\n\u003cp\u003eIPADDR=192.168.1.2(如果设置网卡获得ip地址的方式为静态指定,此字段就指定了网卡对应的ip地址)\u003c/p\u003e\n\u003cp\u003eIPV6INIT=no\u003c/p\u003e\n\u003cp\u003eIPV6_AUTOCONF=no\u003c/p\u003e\n\u003cp\u003eNETMASK=255.255.255.0(网卡对应的网络掩码)\u003c/p\u003e\n\u003cp\u003eNETWORK=192.168.1.0(网卡对应的网络地址)\u003c/p\u003e\n\u003cp\u003eONBOOT=yes(系统启动时是否设置此网络接口,设置为yes …\u003c/p\u003e"
August 22, 2010
Fedora 7配置用yum使用iso DVD镜像源安装软件
"\u003cp\u003e\u003cstrong\u003e1、先把光盘挂上\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e#monut /dev/cdrom /mnt/cdrom 光盘将挂载到/mnt/cdrom 现在我们来检查光盘是否挂载成功(如果没有此目录,先创建)\u003c/p\u003e\n\u003cp\u003e#ls /mnt/cdrom 有内容则表示挂载成功。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2、理解个道理\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eCentOS有两个yum源,它们在/etc/yum.repos.d/下面有两个文件:CentOS-Base.repo和CentOS-Media.repo。但这两个源不是同时使用的,默认使用的是采用互联网升级的CentOS-Base.repo源(这文件里都是网址,你可以自己看看),除非我们手动修改让系统使用Media源,而Media源就是指计算机本地的源,就包含我们方才挂上的本地光盘。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3、开始操作\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e首先,把CentOS-Base.repo文件改名,让系统找不到该文件,从而不能使用互联网的更新方式:\u003c/p\u003e\n\u003cp\u003e#mv CentOS-Base.repo CentOS-Base.repo.bak\u003c/p\u003e\n\u003cp\u003e然后,vi CentOS-Media.repo\u003c/p\u003e\n\u003cp\u003e把以下三行的后两行删除\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ebaseurl=file:///media/CentOS/ …\u003c/code\u003e\u003c/pre\u003e"
August 22, 2010
CentOs 5 安装Zend Optimizer
"\u003cp\u003e一,下载\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecd /usr/local/src\n\nwget http://downloads.zend.com/optimizer/3.3.3/ZendOptimizer-3.3.3-linux-glibc23-i386.tar.gz\n\ntar -xzvf ZendOptimizer-3.3.3-linux-glibc23-i386.tar.gz\n\n./ZendOptimizer-3.3.3-linux-glibc23-i386/install.sh\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e二,安装\n1,php.ini配置文件目录是:/etc\n2,注意Host5156_Vps使用的是lighttpd,而非apache。\u003c/p\u003e\n\u003cp\u003e三,配置域名目录下php.ini文件\n1,/etc/php.ini是总的配置文件。还有一个具体的配置文件位于:/home/httpd/domain.com/php.ini,这个文件也要设置下。\n2,把php.ini文件下的[zend]段落复制下来,再添加到/home/httpd/domain.com/php.ini文件中。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[Zend] …\u003c/code\u003e\u003c/pre\u003e"
August 22, 2010
CentOS 防火墙配置 80端口
"\u003cp\u003e在虚拟机的CENTOS装好APACHE不能用,郁闷,解决方法如下\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/sbin/iptables -I INPUT -p tcp –dport 80 -j ACCEPT\n/sbin/iptables -I INPUT -p tcp –dport 22 -j ACCEPT\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e然后保存:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/etc/rc.d/init.d/iptables save\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这样重启计算机后,防火墙默认已经开放了80和22端口\u003c/p\u003e\n\u003cp\u003e这里应该也可以不重启计算机:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/etc/init.d/iptables restart\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e防火墙的关闭,关闭其服务即可:\u003c/p\u003e\n\u003cp\u003e查看防火墙信息:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/etc/init.d/iptables status\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e关闭防火墙服务:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/etc/init.d/iptables stop\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e永久关闭?不知道怎么个永久法:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003echkconfig –level 35 iptables off\u003c/p\u003e\u003c/blockquote\u003e"
August 22, 2010
Linux中Iptables命令详解
"\u003cp\u003e手册:\u003c/p\u003e\n\u003cp\u003e用iptables -ADC 来指定链的规则,-A添加 -D删除 -C 修改\u003c/p\u003e\n\u003cp\u003eiptables – [RI] chain rule num rule-specification[option]\n用iptables – RI 通过规则的顺序指定\u003c/p\u003e\n\u003cp\u003eiptables -D chain rule num[option]\n删除指定规则\u003c/p\u003e\n\u003cp\u003eiptables -[LFZ] [chain][option]\n用iptables -LFZ 链名 [选项]\u003c/p\u003e\n\u003cp\u003eiptables -[NX] chain\n用 -NX 指定链\u003c/p\u003e\n\u003cp\u003eiptables -P chain target[options]\n指定链的默认目标\u003c/p\u003e\n\u003cp\u003eiptables -E old-chain-name new-chain-name\n-E 旧的链名 新的链名\u003c/p\u003e\n\u003cp\u003e用新的链名取代旧的链名\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e说明\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eIptalbes 是用来设置、维护和检查Linux内核的IP包过滤规则的。\u003c/p\u003e\n\u003cp\u003e可以定义不同的表,每个表都包含几个内部的链,也能包含用户定义的链。每个链都是一个规则列表,对对应的包进行匹配:每条规则指定应当如何处理与之相匹配的包。这被称作’target’(目标),也可以 …\u003c/p\u003e"
August 22, 2010
一行命令 Ping 网段所有 IP
"\u003cp\u003e按住 win键+r键 跳出cmd窗口,将下面的代码粘贴到该窗口,\n@for /l %i in (1,1,255) do @ping -n 1 -w 40 192.168.1.%i \u0026amp; if errorlevel 1 (echo 192.168.1.%i\u0026raquo;na.txt) else (echo 192.168.1.%i\u0026raquo;act.txt)\n回车,将自动探测192.168.1.X网段的ip响应情况. 现在是假设你的电脑属于192.168.1.X网段某一部.\n存活的保存在 act.txt,不通的在 na.txt;\n根据实际改改 -n 1 -w 40 的参数,以达到精准。\n还有个高级应用:\n@for /l %i in (1,1,65535) do @ping -n 1 -w 40 192.168.%i \u0026amp; if errorlevel 1 (echo 192.168.%i\u0026raquo;na.txt) else (echo 192.168.%i\u0026raquo;act.txt)\u003c/p\u003e"
August 20, 2010
在FreeBSD上安装Squid
"\u003cp\u003e\u003cstrong\u003eSquid 2.5下载 \u0026amp; 安装\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003esquid的2.5最新版本是squid-2.5.STABLE7,先下载安装包,再安装:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e #cd /tmp\n #mkdir squidinstall\n #cd squidinstall\n #fetch http://www.squid-cache.org/Versions/v2/2.5/squid-2.5.STABLE7.tar.gz\n #tar xzvf squid-2.5.STABLE7.tar.gz\n #cd squid-2.5.STABLE7\n #./configure –prefix=/usr/local/squid\n #make\n #make install\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e看到类似于下图的提示,并且没有出现 Error Code :1 之类的错误提示,证明Squid已经安装完成了!\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e/usr/local/squid/sbin/squid -z\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e/usr/local/squid/sbin/squid\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cstrong\u003e配置Squid.conf\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e好,接下来要做的仅仅是配置Squid.conf.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#ee …\u003c/p\u003e\u003c/blockquote\u003e"
August 17, 2010
[教程]freebsd下SVN服务器配置
"\u003cp\u003e**注意:**这里主要介绍使用svnserver服务器这种方式,在安装的时候使用的是ipv4,所以最好如果没有必要的话,尽量将ipv6的一些选项给取消.\u003c/p\u003e\n\u003cp\u003e安装svn服务器软件.由于要通过Web访问SVN所以要加载mod_dav模块,所以在安装apche的时候要添加一些参数:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#cd /usr/ports/devel/subversion\n#make WITH_MOD_DAV_SVN=yes WITHOUT_BDB=yes install clean\n#rehash\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e下边介绍两种使用方式:\u003c/strong\u003e\n\u003cstrong\u003e第一种方式:使用svnserve服务器\u003c/strong\u003e,自己的协议和客户端,在freebsd我在/usr/local/www/apache22/data下用FTP上传了一个blog目录\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#cd /usr/local/www/apache22/data\u003c/p\u003e\n\u003cp\u003e#svnadmin create myblog\n#svn import blog -m “init”\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e上面第三条命令是将blog文件夹里的内容,导入到svn项目中,这种原来的文件就会在 …\u003c/p\u003e"
August 16, 2010
如何设置服务器之间时间同步
"\u003cp\u003eHP-UX系统的服务器之间的时间需要同步,利用自带的NTPD可以很好的达到目的。\u003c/p\u003e\n\u003cp\u003e假设我们要host1作时间服务器,host2定期去跟host1的系统时间同步,那么需要作以下设置,全部用root用户执行。\u003c/p\u003e\n\u003cp\u003e1。设置host1机器\n编辑/etc/rc.config.d/netdaemons,修改下面行\nexport NTPDATE_SERVER= \u003cstrong\u003e–因为这台机器将作为服务器,所以这个参数保持为空值即可\u003c/strong\u003e\nexport XNTPD=1 \u003cstrong\u003e–默认是0,改为1表示ntp进程将随系统启动自动启动\u003c/strong\u003e\nexport XNTPD_ARGS=\u003c/p\u003e\n\u003cp\u003e编辑/etc/ntp.conf,添加下面行\n这个文件默认是全部注释的,可以当成ntp的文档来阅读,我们只需要在最后添加,表示将用本地系统时间作为服务器时间\nserver 127.127.1.1\nfudge 127.127.1.1 stratum 10\u003c/p\u003e\n\u003cp\u003e启动ntp守护进程\n/sbin/init.d/xntpd start\u003c/p\u003e\n\u003cp\u003e检查进程情况\nntpq -p\u003c/p\u003e\n\u003cp\u003e2。设置host2机器\n编辑/etc/rc.config.d/netdaemons,修改下面行\nexport …\u003c/p\u003e"
August 16, 2010
ntpdate linux时间同步命令
"\u003cp\u003entpdate linux时间同步命令\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e名称\u003c/strong\u003e\nntpdate – 通过NTP 设置日期和时间\n\u003cstrong\u003e概要\u003c/strong\u003e\nntpdate [ -Bbdpqsuv ] [ -a key# ] [ -e authdelay ] [ -k keyfile ]\n[ -o version ] [ -p samples ] [ -t timeout ] server[ … ]\n\u003cstrong\u003e说明\u003c/strong\u003e\nntpdate 通过轮询指定为服务器参数的网络时间协议(NTP) 服务器来设置本地日期和时间,从而确定正确的时间。它必须以根用户身份在本地主机上运行。从每个指定的服务器中可获取大量的示例,并且还应用了NTP 时钟过滤器和选择算法的子集,以选择最佳的算法。请注意, ntpdate 的准确性和可靠性取决于服务器的数量、每次运行它时的轮询数以及运行之间的时间间隔。\u003c/p\u003e\n\u003cp\u003entpdate 根据需要可以手动运行来设置主机时钟,也可以从主机启动脚本中运行,在引导时设置时钟。某些情况下,它可用于在启动NTP 守护程序xntpd 之前对时钟进行初始设置。\u003c/p\u003e\n\u003cp\u003e也可以从cron 脚本中运行ntpdate 。但是务必要注意,包含人为产生的cron 脚本的ntpdate …\u003c/p\u003e"
August 13, 2010
Apache禁止目录访问方法介绍
"\u003cp\u003e在PHP网站开发中,基于WEB服务器和PHP网站程序代码的安全考虑,我们需要对相关的目录或者文件访问权限进行控制,以防止意外情况的发 生,那么我们如何来实现这种功能呢?我们可以通过Apache来实现禁止目录访问(禁止游览列出的目录或文件列表)、禁止或允许IP与域名访问目录的功 能。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e环境说明\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e我使用的是DedeCMS DedeAmpz的PHP运行环境,PHP版本5.2.4,Apache版本2.2.4\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e在Apache中配置禁止目录访问,即禁止游览列出的目录/文件列表的方法\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e访问网站目录时Apache默认配置为可列出目录/文件列表,即当你访问http://localhost时会列出相关的目录和文件列表,我们可以通过修改Apache配置文件httpd.conf来实现禁止列出目录/文件列表,方法如下:\u003c/p\u003e\n\u003cp\u003e1、打开apache配置文件httpd.conf\u003c/p\u003e\n\u003cp\u003e2、找到\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eOptions Indexes\nAllowOverride None\nOrder allow,deny\nAllow from all\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e只需要\u003cstrong\u003e修改Options Indexes为Options None\u003c/strong\u003e即可,\u003cstrong\u003e注\u003c/strong\u003e:根据\u003ca href=\"http://www.leapsoul.cn/?tag=php%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE\" title=\"PHP环境配置\"\u003ePHP运行环境\u003c/a\u003e安装包的 …\u003c/p\u003e"
August 7, 2010
FreeBSD+Rsync文件同步
"\u003cp\u003e\u003cstrong\u003e一.服务端和客户端安装一样\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewoody-207#cd /usr/ports/net/rsync\nwoody-207#make install\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e二.配置rsync服务端\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e****woody207# vi /usr/local/etc/rsyncd.conf\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e添加以下内容\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[www]\ncomment = web server backup\npath = /www\nauth users = woody\nuid = nobody\ngid = nogroup\nsecrets file = /usr/local/etc/rsyncd.secrets\nread\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e启动rsync的daemon模式\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003evi /usr/local/etc/rc.d/rsyncd\n修改这一行内容,使用IPV4协议\ncommand_args=”-4 –daemon”\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e系统服务配置\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e****#echo ‘rsyncd_enable=”YES”’ \u0026raquo; /etc/rc.conf\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e启动服务\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e****woody-207# /usr/local/etc/rc.d/rsyncd start\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e检查Rsync daemon …\u003c/strong\u003e\u003c/p\u003e"
August 7, 2010
[教程]freebsd中使用rsync同步文件
"\u003cp\u003ersync是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync\n它的特性如下:\n可以镜像保存整个目录树和文件系统。\n可以很容易做到保持原来文件的权限、时间、软硬链接等等。\n无须特殊权限即可安装。\n优化的流程,文件传输效率高。\n可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接。\n支持匿名传输,以方便进行网站镜象。\u003c/p\u003e\n\u003cp\u003e测试环境freebsd6.3 server:192.168.1.3 client:192.168.1.4\n\u003cstrong\u003e1、server端配置(备份源服务器)\u003c/strong\u003e\n安装rsync\n#cd /usr/ports/net/rsync\n#make install clean\n安装成功后编辑rsync的配置文件\n#vi /usr/local/etc/rsyncd.conf\n加入以下内容\u003c/p\u003e\n\u003cp\u003e[test] #rsync区段的设定名称\ncomment = test rsync backup #注释\npath = /var/www/htdocs/ #需要同步的数据所在路径\nauth users …\u003c/p\u003e"
August 7, 2010
rsync从linux到linux的文件同步备份
"\u003cp\u003e\u003cstrong\u003e一、环境\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e需要备份文件的服务器(服务器端):192.168.1.201 (RHEL 5)\u003c/p\u003e\n\u003cp\u003e接收备份文件的服务器(客户端):192.168.1.202 (CENTOS 5)\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二、安装配置\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1.服务器端的配置\u003c/p\u003e\n\u003cp\u003eA、采用系统默认安装的rsync 编辑/etc/rsyncd.conf文件,如果没有则新建一个。 vi /etc/rsyncd.conf #[globale] strict modes= yes #check passwd file port= 873 #default port logfile= /var/log/rsyncd.log pidfile= /var/run/rsyncd.pid max connections= 4 #[modules] [testlink] #备份模块 uid= root gid= root path= /usr/local/apache/htdocs/testlink/upload_area #要备份的目录 read only= no host allow= * auth users= wwyhy secrets file= …\u003c/p\u003e"
August 7, 2010
Linux/FreeBSD下配置Subversion同步Web文件夹手记
"\u003cp\u003e\u003cstrong\u003e下载安装subversion-1.6.9.tar.gz\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1\u0026gt; svnserve配置\u003c/p\u003e\n\u003cp\u003e1.1 创建仓库存放目录\u003c/p\u003e\n\u003cp\u003emkdir -p /opt/svn/repos\u003c/p\u003e\n\u003cp\u003echown -R svn:svn /opt/svn/\u003c/p\u003e\n\u003cp\u003e2\u0026gt; 启动svn\u003c/p\u003e\n\u003cp\u003esvnserve -d –listen-host=0.0.0.0 –listen-port=3190 -r /data/repos\u003c/p\u003e\n\u003cp\u003e3\u0026gt; 创建SVN仓库\u003c/p\u003e\n\u003cp\u003esvnadmin create /opt/svn/repos/abc\u003c/p\u003e\n\u003cp\u003evim /opt/svn/repos/abc/conf/passwd\u003c/p\u003e\n\u003cp\u003e4\u0026gt; 新增访问用户名和密码\u003c/p\u003e\n\u003cp\u003e格式如下\u003c/p\u003e\n\u003cp\u003e[users]\u003c/p\u003e\n\u003cp\u003eroger=123456#用户名=密码\u003c/p\u003e\n\u003cp\u003e5\u0026gt; 修改 svnserve.conf\u003c/p\u003e\n\u003cp\u003e#vi /opt/svn/repos/abc/conf/svnserve.conf\u003c/p\u003e\n\u003cp\u003e#password-db = passwd为password-db = passwd //使用密码文件\u003c/p\u003e\n\u003cp\u003e#anon-access = read 为 anon-access = read //匿名可以读取,如果设置必须输入密码才能 …\u003c/p\u003e"
July 30, 2010
snmpwalk常用语法
"\u003cp\u003e在日常监控中,经常会用到snmp服务,而snmpwalk命令则是测试系统各种信息最有效的方法,现总结一些常用的方法如下:\u003c/p\u003e\n\u003cp\u003e1、snmpwalk -c public -v 1 -m ALL 192.168.30.49.1.3.6.1.2.1.25.1 得到取得windows端的系统进程用户数等\u003c/p\u003e\n\u003cp\u003e2、snmpwalk -c public -v 1 -mALL 192.168.30.49 .1.3.6.1.2.1.25.2.2 取得系统总内存\u003c/p\u003e\n\u003cp\u003e3、snmpwalk -c public -v 1-m ALL 192.168.30.49 hrSystemNumUsers\u003c/p\u003e\n\u003cp\u003e4、snmpwalk -c public -v 1 -m ALL192.168.30.49 .1.3.6.1.2.1.4.20 取得IP信息\u003c/p\u003e\n\u003cp\u003e5、snmpwalk -v 2c -c public192.168.30.49 system 查看系统信息\u003c/p\u003e\n\u003cp\u003e6、snmpwalk -v 1 192.168.30.49 -c public ifDescr1、snmpwalk -v 2c -c public …\u003c/p\u003e"
July 27, 2010
FreeBSD7.0安装cacti监控
"\u003cp\u003eFreeBSD 7.0-RELEASE-i386\u003c/p\u003e\n\u003cp\u003e# cd /usr/ports/net-mgmt/net-snmp \u0026amp;\u0026amp; make install clean\n# cd /usr/ports/net-mgmt/cacti \u0026amp;\u0026amp; make install clean\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eucd-snmp不选\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e# make pretty-print-run-depends-list\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis port requires package(s) “mysql-client-5.0.67_1” to run.\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e# cd /usr/ports/databases/mysql50-server \u0026amp;\u0026amp; make install clean\n# echo ‘mysql_enable=”YES”‘ \u0026raquo; /etc/rc.conf\n# /usr/local/etc/rc.d/mysql-server start\n# mysqladmin –user=root create cacti\n# echo “GRANT ALL ON cacti.* TO …\u003c/p\u003e"
July 26, 2010
[教程]freebsd下安装cacti教程
"\u003cp\u003e\u003cstrong\u003e一、安装mysql51-server\u003c/strong\u003e\ncd /usr/ports/database/mysql51-server\u003c/p\u003e\n\u003cp\u003emake with-debug=no with-client-ldflags=-all-static with-mysqld-ldflags=-all-static witch-assembler=yes with-pthread=yes enable-thread-safe-client=yes install clean\nmake install clean\u003c/p\u003e\n\u003cp\u003ecp /usr/local/share/mysql/my-small.cnf /usr/local/etc/my.cnf\u003c/p\u003e\n\u003cp\u003ecd /\nmkdir mysql\nchmod 777 /mysql\nee /usr/local/etc/my.cnf\u003c/p\u003e\n\u003cp\u003e[client]\nport = 3389\nsock = /mysql/mysql.sock\ndefault-character-set = utf8\n[mysqld]\nport = 3389\nsock = /mysql/mysql.sock …\u003c/p\u003e"
July 20, 2010
学会使用Linux性能分析工具
"\u003cp\u003eLinux在具有高稳定性、可靠性的同时,具有很好的可伸缩性和扩展性,能够针对不同的应用和硬件环境调整,优化出满足当前应用需要的最佳性能。因此企业在维护Linux系统、进行系统调优时,了解系统性能分析工具是至关重要的。\n在Linux下有很多系统性能分析工具,比较常见的有top、free、ps、time、timex、uptime等。下文将介绍几个较为重要的性能分析工具vmstat、iostat和sar及其使用。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e用vmstat监视内存使用情况\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003evmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监视。它是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。\u003c/p\u003e\n\u003cp\u003evmstat的语法如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e vmstat [-V] [-n] [delay [count]]\n\u003c/code\u003e\u003c/pre\u003e\u003cblockquote\u003e\n\u003cp\u003e其中,\n-V表示打印出版本信息;\n-n表示在周期性循环输出时,输出的头部信息仅显示一次;\ndelay是两次输出之间的延迟时间;\ncount是指按照这个时间间隔统计的次数。\n对于vmstat输出各字段的含义,可运行man vmstat查看。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e …\u003c/strong\u003e\u003c/p\u003e"
July 19, 2010
基于Ubuntu平台的nagios快速指南
"\u003ch3 id=\"461介绍\"\u003e4.6.1. 介绍\u003c/h3\u003e\n\u003cp\u003e本指南试图让你通过简单的指令以在20分钟内在Ubuntu平台上通过对Nagios的源程序的安装来监控本地主机。没有讨论更高级的设置项-只是一些基本操作,但这足以使95%的用户启动Nagios。\u003c/p\u003e\n\u003cp\u003e这些指令在基于Ubuntu6.10(桌面版)的系统下写成的。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhat You’ll End Up With\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e如果按照本指南安装,最后将是这样结果:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eNagios和插件将安装到/usr/local/nagios\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNagios将被配置为监控本地系统的几个主要服务(CPU负荷、磁盘利用率等)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNagios的Web接口是URL是http://localhost/nagios/\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"462所需软件包\"\u003e4.6.2. 所需软件包\u003c/h3\u003e\n\u003cp\u003e确认你安装好的系统上已经安装如下软件包再继续。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eApache2\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGCC编译器与开发库\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGD库与开发库\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e可以用\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eapt-get\u003c/strong\u003e 命令来安装这些软件包,键入命令:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo apt-get install apache2\nsudo apt-get install build-essential\nsudo apt-get install libgd2-dev …\u003c/code\u003e\u003c/pre\u003e"
July 16, 2010
Linux中cp直接覆盖不提示的方法
"\u003cp\u003eLinux中cp直接覆盖不提示的方法\u003c/p\u003e\n\u003cp\u003e新做了服务器,cp覆盖时,无论加什么参数-f之类的还是提示是否覆盖,这在大量cp覆盖操作的时候是不能忍受的。。。\u003c/p\u003e\n\u003cp\u003e把a目录下的文件复制到b目录\u003c/p\u003e\n\u003cp\u003ecp –r a/* b\u003c/p\u003e\n\u003cp\u003e执行上面的命令时,b存在的每个文件都会提示是否覆盖;\u003c/p\u003e\n\u003cp\u003ecp –r –f a/* b\u003c/p\u003e\n\u003cp\u003e执行上面的命令时,b存在的每个文件都不再会提示;\u003c/p\u003e\n\u003cp\u003e这是我们希望的理想状态,但是有时加了-f了,怎么还会有提示呢?原来一些服务器会默认增加别名 alias cp=’cp -i’,当你执行cp时,其实执行的是cp –i。\u003c/p\u003e\n\u003cp\u003e在终端执行alias就可以看出来了。\u003c/p\u003e\n\u003cp\u003e[root@devdb ~]# alias\u003c/p\u003e\n\u003cp\u003ealias cp=’cp -i’\u003c/p\u003e\n\u003cp\u003e可以这样解决\u003c/p\u003e\n\u003cp\u003e[root@devdb ~]# vi ~/.bashrc\u003c/p\u003e\n\u003cp\u003e在alias cp=’cp -i’前加上”#”注释掉这行,:wq!保存推出,然后重新登陆就可以了。\u003c/p\u003e"
July 16, 2010
Linux上查看目录大小
"\u003cp\u003e查看目录大小du\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003edu -sh dirname\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e-s 仅显示总计\n-h 以k、m、g为单位,提高信息的可读性。kb、mb、gb是以1024为换算单 位, -h以1000为换算单位\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e以下是刚装好的RH9.0(全部) Linux目录大小参考:\n/usr 4.5G\n/usr/share 2.2G\n/usr/src 189M\n/usr/games 3.9M\n/usr/X11R6 173M\n/usr/lib 1.5G\n/usr/include 91M\n/usr/bin 258M\n/var 250M\n/var/www 130M\u003c/p\u003e"
July 15, 2010
Centos系统mysql相关命令
"\u003cp\u003e\u003cstrong\u003eCentos系统mysql 忘记root用户的密码:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e第一步:(停掉正在运行的mysql)\u003c/p\u003e\n\u003cp\u003e[root@CentOs5 ~]# service mysqld stop\u003c/p\u003e\n\u003cp\u003eStopping MySQL: [ OK ]\u003c/p\u003e\n\u003cp\u003e第二步:使用 “–skip-grant-tables”参数重新启动mysql\u003c/p\u003e\n\u003cp\u003e[root@CentOs5 ~]# mysqld_safe –skip-grant-tables \u0026amp;\u003c/p\u003e\n\u003cp\u003e[1] 23810\u003c/p\u003e\n\u003cp\u003e[root@CentOs5 ~]# Starting mysqld daemon with databases from /var/lib/mysql\u003c/p\u003e\n\u003cp\u003e第三步:用帐号登录mysql\u003c/p\u003e\n\u003cp\u003e[root@CentOs5 ~]# mysql -u root\u003c/p\u003e\n\u003cp\u003eWelcome to the MySQL monitor. Commands end with ; or \\g.\u003c/p\u003e\n\u003cp\u003eYour MySQL connection id is 1\u003c/p\u003e\n\u003cp\u003eServer version: 5.0.77 Source distribution\u003c/p\u003e\n\u003cp\u003eType ‘help;’ or ‘\\h’ for help. Type …\u003c/p\u003e"
July 15, 2010
FreeBSD中top命令参数说明
"\u003cp\u003e\u003cstrong\u003etop监控命令在FreeBSD上的使用\u003c/strong\u003e\ntop监控工具可以显示CPU占用率为前几位的进程,并提供CPU的实时活动情况\u003c/p\u003e\n\u003cp\u003e语法:top [-s time] [-d count] [-q] [-h] [-n number] [-f filename] [-o field][-U usename]\n\u003cstrong\u003e-S\u003c/strong\u003e 将系统进程信息也显示到屏幕上,默认情况下,top不显示系统进程的信息\n\u003cstrong\u003e-b\u003c/strong\u003e 使用”batch”方式运行top。在此种方式下,所有来自终端的输入都将被忽略,但交互键(比如^C and ^)\n依然起使用。这是运行top输出到哑终端或输到非终端的默认运行方式\n\u003cstrong\u003e-i\u003c/strong\u003e 使用交互运行top程序,在此种方式下,命令会被进程立即被处理。不管命令是不是能被top所理解执行,\n屏幕都将立即更新。这是top的默认运行方式。\n\u003cstrong\u003e-I\u003c/strong\u003e 不显示空闲进程,在默认情况下,top连同空闲进程的信息一同输出。\n\u003cstrong\u003e-t\u003c/strong\u003e 不显示top进程自己\n\u003cstrong\u003e-n\u003c/strong\u003e 不以交互方式使用top命令,作用同”batch”方式。\n\u003cstrong\u003e-s\u003c/strong\u003e time 设置屏幕刷新的延时,单位为秒,默认值5秒\n\u003cstrong\u003e-d\u003c/strong\u003e count 设置屏幕刷新的次数,刷新显示完count次后退出\n\u003cstrong\u003e-q\u003c/strong\u003e 如 …\u003c/p\u003e"
July 15, 2010
Apache最大连接数性能测试
"\u003cp\u003eApache最大连接数性能测试。\u003c/p\u003e\n\u003cp\u003e这天工作没什么事情,翻开看资料,再次学习一下apache的性能优化,以下就说说我的设置及测试。\u003c/p\u003e\n\u003cp\u003e先说一下我的测试机硬件及软件配置环境:\u003c/p\u003e\n\u003cp\u003e硬件:一台比较古老的机器,cpu: P42.0 ,内存256,其他的就不多说了。\u003c/p\u003e\n\u003cp\u003e软件:linux as 4 , apache2.0.59。\u003c/p\u003e\n\u003cp\u003e先说一下这次安装及配置就是测试apache的性能,如果你打算看其他方面的,那就不要看了,因为偶也没有写,嘿嘿嘿……\u003c/p\u003e\n\u003cp\u003e./configure –prefix=/usr/local/apache2 –with-mpm=worker –enable-so\u003c/p\u003e\n\u003cp\u003e说明:\u003c/p\u003e\n\u003cp\u003eMPM={beos|worker|prefork|mpmt_os2| perchild|leader|threadpool}\u003c/p\u003e\n\u003cp\u003e我这里mpm使用的是worker,以下说明一下mpm个参数;\u003c/p\u003e\n\u003cp\u003eMPM的引入是Apache 2.x最重要的变化,影响apache2.x 性能的最核心特性,\u003c/p\u003e\n\u003cp\u003eMPM(Multi -Processing Modules,多道处理模块),运行在一种多进程与多线程相混合的模式下,增强部分配置的可扩充性能。相比 …\u003c/p\u003e"
July 14, 2010
apache你必须知道的一些知识
"\u003cp\u003e一下是网管的一些面试题的,大部分和apache 有关,所以记下来供学习参考之用.\u003c/p\u003e\n\u003cp\u003e1,你认为组成web站点体系有哪些元素?\u003c/p\u003e\n\u003cp\u003e2,这样的配置,在apache起来后会有几个子进程? (别把这个问题想的简单化)\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eStartServers 5\nMinSpareServers 50\nMaxSpareServers 100\nMaxClients 150\nMaxRequestsPerChild 0\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e3,在apache的worker MPM中,为什么ServerLimit要放到配置段最前面?\u003c/p\u003e\n\u003cp\u003e4,千兆网卡的极限pps是多少?是如何算出来的?\u003c/p\u003e\n\u003cp\u003e5,为什么lighttpd,nginx的并发性能比apache要高?\u003c/p\u003e\n\u003cp\u003e6,top命令里running的值表示什么意思?这个值和CPU数有什么关系?\u003c/p\u003e\n\u003cp\u003e7,在http header头里看到的:Last-Modified,Expires,max-age,etag这四者有什么关系?\u003c/p\u003e\n\u003cp\u003e8,一个web站点,如何计算所需要的带宽?公式是什么?\u003c/p\u003e\n\u003cp\u003e9,如何看http的并发连接数的?\u003c/p\u003e\n\u003cp\u003e10,FIN_WAIT2是在什么状 …\u003c/p\u003e"
July 14, 2010
Windows下 Apache 性能优化
"\u003cp\u003e一般来说,WinNT系统下使用IIS,而Apache在Linux下应用的比较多,但是依然有很多人在WinNT系统下使用Apache而非IIS,可能是基于对Windows系统的熟悉吧。今天就来说一下在Windows系统下如果优化Apache的性能。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003empm_winnt.c\u003c/strong\u003e是专门针对Windows NT优化的MPM(多路处理模块),它使用一个单独的父进程产生一个单独的子进程,在这个子进程中轮流产生多个线程来处理请求。也就是说 mpm_winnt只能启动父子两个进程, 不能像Linux下那样同时启动多个进程。\u003c/p\u003e\n\u003cp\u003empm_winnt主要通过ThreadsPerChild和MaxRequestsPerChild两个参数来优化Apache,下面详细来说明一下。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eThreadsPerChild\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e这个参数用于设置每个进程的线程数, 子进程在启动时建立这些线程后就不再建立新的线程了. 一方面因为mpm_winnt不能启动多个进程, 所以这个数值要足够大,以便可以处理可能的请求高峰; 另一方面该参数以服务器的响应速度为准的, 数目太大的反而会变慢。因此需要综合均衡一个合理的数值。\nmpm_winnt上的默认 …\u003c/p\u003e"
July 14, 2010
apache工作方式
"\u003cp\u003e\u003cstrong\u003e1\u003c/strong\u003e \u003cstrong\u003e、prefork.c模块(一个非线程型的、预派生的MPM)\u003c/strong\u003e prefork MPM 使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接。在大多数平台上,Prefork MPM在效率上要比Worker MPM要高,但是内存使用大得多。prefork的无线程设计在某些情况下将比worker更有优势:它可以使用那些没有处理好线程安全的第三方模块,并且对于那些线程调试困难的平台而言,它也更容易调试一些。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eServerLimit\u003c/strong\u003e 20000\u003c/p\u003e\n\u003cp\u003eStartServers 5\u003c/p\u003e\n\u003cp\u003eMinSpareServers 5\u003c/p\u003e\n\u003cp\u003eMaxSpareServers 10\u003c/p\u003e\n\u003cp\u003eMaxClients 1000\u003c/p\u003e\n\u003cp\u003eMaxRequestsPerChild 0\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eServerLimit\u003c/strong\u003e 2000\u003c/p\u003e\n\u003cp\u003e//默认的MaxClient最大是256个线程,如果想设置更大的值,就的加上 \u003cstrong\u003eServerLimit\u003c/strong\u003e 这个参数。20000是 \u003cstrong\u003eServerLimit\u003c/strong\u003e 这个参数的最大值。如果需要更大,则必须编译 \u003cstrong\u003eapache\u003c/strong\u003e,此前都是不需要重新编译 \u003cstrong\u003eApache\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e生效前提: …\u003c/p\u003e"
July 14, 2010
apache prefork优化及压力测试
"\u003cp\u003e优化apache prefork模式的参数, (384M内存openvz 的vps环境下面)\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026lt;IfModule mpm_prefork_module\u0026gt;\nStartServers 12\nMinSpareServers 12\nMaxSpareServers 12\nMaxClients 12\nMaxRequestsPerChild 100\n\u0026lt;/IfModule\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eStartServers是启动的进程数,Min和Max是最小最大进程数, MaxClients是最大可连接的客户端,MaxRequestPerChild是一个进程的生命周期内处理的请求数量,一旦达到设定的这个值,就回收进程。\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这里的vps环境是内存384M最大可用,openvz的vps.其它优化设置可以参考\u003c/p\u003e\n\u003cp\u003e测试一千个客户端并发时的压力,可以用apache自带的ab.exe。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eab -n 1000 -c 1000 \u003ca href=\"http://www.netroby.com/index.php\"\u003ehttp://www.netroby.com/index.php\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e测试结果:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eServer Software: …\u003c/code\u003e\u003c/pre\u003e"
July 11, 2010
[教程]freebsd下nagios安装教程
"\u003cp\u003e一、安装apache\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ecd /usr/ports/www/apache2\nmake install clean\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e二、安装nagios和 Nagios-plugin\u003c/p\u003e\n\u003cp\u003e1.安装nagios主程序\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ecd /usr/ports/net-mgmt/nagios\nmake install clean\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e在安装的过程中会自动安装nagios-plugin插件.常用的脚本这时会被安装在” \u003cstrong\u003e/usr/local/libexec/nagios/\u003c/strong\u003e“路径在resource.cfg里面有定义的,即常量 $USER1$的值目录里.\u003c/p\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003eNRpe 下载地址为: \u003ca href=\"http://www.nagios.org/download/addons\"\u003ehttp://www.nagios.org/download/addons\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e//如果所要监控的服务器中有linux,不要直接使用ports 安装,因为ports安装过后,其格式为check_nrpe2, 但是linux 采用源码安装的为check_nrpe. 从而导致两者之间不能通信\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#cd /usr/local\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e#fetch …\u003c/p\u003e"
July 11, 2010
FreeBSD利用poptop架设vpn指南
"\u003cp\u003e安装poptop\ncd /usr/ports/net/poptop\nmake install clean\n===\u0026gt; SECURITY REPORT:\nThis port has installed the following files which may act as network\nservers and may therefore pose a remote security risk to the system.\n/usr/local/sbin/pptpd\u003c/p\u003e\n\u003cp\u003eThis port has installed the following startup scripts which may cause\nthese network services to be started at boot time.\n/usr/local/etc/rc.d/pptpd\u003c/p\u003e\n\u003cp\u003ecd /usr/local/etc\ncp pptpd.conf.sample pptpd.conf\nvi pptpd.conf\ncd /usr/ports/net/poptop\nmake install clean\u003c/p\u003e\n\u003cp\u003e三、设 …\u003c/p\u003e"
July 11, 2010
centos下安装Nagios服务器监控软件
"\u003cp\u003enagios可以对服务器进行全面的监控,包括服务(apache、mysql、ntp、dns、disk、qmail和sshd等等)的状态,服务器的状态(up、down等\u003c/p\u003e\n\u003cp\u003e等)。它是一个完全GPL协议的开源软件包,包含有nagios主程序和它的各个插件,配置非常灵活,可以监视的项目很多,可以自定义shell脚\u003c/p\u003e\n\u003cp\u003e本进行监控服务,非常适合大型网络。\u003c/p\u003e\n\u003cp\u003enagios的包含主动监控和被动监控。\u003c/p\u003e\n\u003cp\u003e主动检查是通过监控中心的主机发出请求,让运行在远程主机上的nrpe守护进程收集信息,然后报告它,它通过web接口把数据显示在页面上。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e它的工作原理如下:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e被动监控是当远程被监控主机处于防火墙之内的时候,只有远程主机可以访问到监控中心,防火墙之内可以设置另外一个监控中心,远程监控\u003c/p\u003e\n\u003cp\u003e中心的nagios收集服务器信息以后,和nsca报告,由naca客户端报告naca的服务器端,然后报告监控中心的nagios,通过web接口显示监控结果。\u003c/p\u003e\n\u003cp\u003eNagios是一个监视系统和网络的应用程序。它监视你所指定主机和服务,当监视的内容变好或者变坏时发出警告。Nagios最初是被设计在Linux\u003c/p\u003e\n\u003cp\u003e平台上运行的,然而现在在其他平台上也 …\u003c/p\u003e"
July 8, 2010
Linux命令:ifconfig
"\u003ch2 id=\"linux命令ifconfig\"\u003eLinux命令:ifconfig\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e功能说明\u003c/strong\u003e:显示或设置网络设备\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e英文说明:\u003cstrong\u003enetwork \u003cstrong\u003ei\u003c/strong\u003enter\u003c/strong\u003ef\u003c/strong\u003eaces \u003cstrong\u003econfig\u003c/strong\u003euring\u003c/p\u003e\n\u003ch3 id=\"语法\"\u003e语法\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003e语 法\u003c/strong\u003e:ifconfig [网络设备][down up -allmulti -arp -promisc][add\u0026lt;地址\u0026gt;][del\u0026lt;地址\u0026gt;][\u0026lt;硬件地址\u0026gt;] [media\u0026lt;网络媒介类型\u0026gt;][mem_start\u0026lt;内存地址\u0026gt;][metric\u0026lt;数目\u0026gt;][mtu\u0026lt;字节\u0026gt;][netmask\u0026lt;子网掩码\u0026gt;][tunnel\u0026lt;地址\u0026gt;][-broadcast\u0026lt;地址\u0026gt;] [-pointopoint\u0026lt;地址\u0026gt;]\u003c/p\u003e\n\u003ch3 id=\"补充说明\"\u003e补充说明\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003e补充说明\u003c/strong\u003e:ifconfig可设置网络设备的状态,或是显示目前的设置。\u003c/p\u003e\n\u003ch3 id=\"参数\"\u003e参数\u003c/h3\u003e\n\u003cp\u003e[网络设备] 网络设备的名称。\u003c/p\u003e\n\u003cp\u003edown 关闭指定的网络设备。\u003c/p\u003e\n\u003cp\u003eup 启动指定的网络设备。\u003c/p\u003e\n\u003cp\u003e-arp 打开或关闭指定接口上使用的ARP协议。前面加上一个负号用于关闭该选项。\u003c/p\u003e\n\u003cp\u003e-allmuti 关闭或启动指定接口的无区别模式。前面加上一个负号用于关闭该 …\u003c/p\u003e"
July 8, 2010
ubuntu关机命令
"\u003cp\u003e\u003cstrong\u003e1. 关机命令 shutdown\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e好像ubuntu的终端中默认的是当前用户的命令,只是普通用户,因此在终端器中可以使用sudo -sh 转换到管理员root用户下执行命令。\u003c/p\u003e\n\u003cp\u003e1)shutdown –help\u003c/p\u003e\n\u003cp\u003e可以查看shutdown命令如何使用,当然也可以使用man shutdown命令。\u003c/p\u003e\n\u003cp\u003e2) shutdown -h now 现在立即关机\u003c/p\u003e\n\u003cp\u003e3)shutdown -r now 现在立即重启\u003c/p\u003e\n\u003cp\u003e4)shutdown -r +3 三分钟后重启\u003c/p\u003e\n\u003cp\u003e5)shutdown -h +3 “The System will shutdown after 3 minutes” 提示使用者将在三分钟后关机\u003c/p\u003e\n\u003cp\u003e6)shutdown -r 20:23 在20:23时将重启计算机\u003c/p\u003e\n\u003cp\u003e7)shutdown -r 20:23 \u0026amp; 可以将在20:23时重启的任务放到后台去,用户可以继续操作终端\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2. 中断命令\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1)执行完命令后(若没有转到后台),可以使用CTRL+C来中止命令\u003c/p\u003e\n\u003cp\u003e2)kill 程序编码\u003c/p\u003e\n\u003cp\u003e当命令在后台执行时系统会返回一个程序编码,例如:在使用 shutdown -r 20:23 \u0026amp; 系统返回系统编 …\u003c/p\u003e"
July 8, 2010
ubuntu查看内核版本和发行版本
"\u003cp\u003e查看 \u003cstrong\u003e内核\u003c/strong\u003e 版本:\u003c/p\u003e\n\u003cp\u003e方法一:uname -r\n输出:\n2.6.32-23-generic\n方法二:cat /proc/version\n输出:\nLinux version 2.6.32-23-generic (buildd@rothera) (gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) ) #37-Ubuntu SMP Fri Jun 11 07:54:58 UTC 2010\u003c/p\u003e\n\u003cp\u003e查看 \u003cstrong\u003e发行\u003c/strong\u003e 版本:`\u003c/p\u003e\n\u003cp\u003e方法一:cat /etc/issue`\n输出:\nUbuntu 8.04 \\n \\l\n方法二:lsb_release -a\n输出:\nNo LSB modules are available.\nDistributor ID: Ubuntu\nDescription: Ubuntu 10.04 LTS\nRelease: 10.04\nCodename: lucid\u003c/p\u003e"
July 8, 2010
ubuntu手动设置IP/DNS地址的方法
"\u003cp\u003eUbuntu的网络参数保存在文件 /etc/network/interfaces中,默认设置使用dhcp,内容如下:\u003c/p\u003e\n\u003cp\u003e# The primary network interface\nauto eth0\niface eth0 inet dhcp\u003c/p\u003e\n\u003cp\u003e设置静态ip的方法如下:\n1) 编辑 /etc/network/interfaces\n1.1)将dhcp 一行屏蔽\n# The primary network interface\nauto eth0\n#iface eth0 inet dhcp\n1.2)添加和静态ip有关的参数\u003c/p\u003e\n\u003cp\u003e# The primary network interface\niface eth0 inet static\naddress 192.168.0.10\nnetmask 255.255.255.0\ngateway 192.168.0.1\u003c/p\u003e\n\u003cp\u003e2)编辑 /etc/resolv.conf,设置dns\nnameserver 202.96.134.133\nnameserver 202.106.0.20\u003c/p\u003e\n\u003cp\u003e3)执行下面两个命令,启用新设置\n\u003cstrong\u003e$sudo ifdown eth0\n$sudo …\u003c/strong\u003e\u003c/p\u003e"
July 8, 2010
ubuntu开启SSH服务
"\u003cp\u003e网上有很多介绍在Ubuntu下开启SSH服务的文章,但大多数介绍的方法测试后都不太理想,均不能实现远程登录到Ubuntu上,最后分析原因是都没有真正开启ssh-server服务。最终成功的方法如下:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003esudo apt-get install openssh-server\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eUbuntu缺省安装了openssh-client,所以在这里就不安装了,如果你的系统没有安装的话,再用apt-get安装上即可。\u003c/p\u003e\n\u003cp\u003e然后确认sshserver是否启动了:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eps -e |grep ssh\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e如果只有ssh-agent那ssh-server还没有启动,需要/etc/init.d/ssh start,如果看到sshd那说明ssh-server已经启动了。\u003c/p\u003e\n\u003cp\u003essh-server配置文件位于/ etc/ssh/sshd_config,在这里可以定义SSH的服务端口,默认端口是22,你可以自己定义成其他端口号,如222。然后重启SSH服务:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003esudo /etc/init.d/ssh resar\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003essh连接:ssh \u003ca href=\"mailto:xjtu129@202.117.15.165\"\u003exjtu129@202.117.15.165\u003c/a\u003e\u003c/p\u003e"
July 7, 2010
vmstat查看FreeBSD服务器的内存使用情况
"\u003cp\u003e在FreeBSD里运行vmstat命令执行结果如下:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# vmstat\nprocs memory page disk faults cpu\nr b w avm fre flt re pi po fr sr ad0 in sy cs us sy id\n0 2 1 270512 20316 30 0 0 0 26 5 1223 1589 98 593 1 1 99\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e当然,仅执行一次vmstat命令是无法反映真正的系统情况的。最好使用vmstat t [n]命令,例如 vmstat 5 5,表示在T(5)秒时间内进行N(5)次采样,或者干脆vmstat 1让系统每秒钟执行一次。\u003c/p\u003e\n\u003cp\u003e下面是对各个参数的详细解释\u003c/p\u003e\n\u003cp\u003eprocs:\nr–\u0026gt;在运行的进程数\nb–\u0026gt;在等待io的进程数(等待i/o,paging等等)\nw–\u0026gt;可以进入运行队列但被替换的进程\nmemoy(以k为单位,包括虚拟内存和真实内存,正在运行或最近20秒在运行的进程所用的虚拟内存将被视为active)\navm–\u0026gt;活动的虚拟内存\nfree–\u0026gt;空闲的内存\u003c/p\u003e\n\u003cp\u003epages(统计错误页和活动页,每5秒平均一下,以秒为单位给 …\u003c/p\u003e"
July 7, 2010
linux中查看系统资源占用情况的命令
"\u003cp\u003e\u003cstrong\u003etop:\u003c/strong\u003e\n主要参数\nd:指定更新的间隔,以秒计算。\nq:没有任何延迟的更新。如果使用者有超级用户,则top命令将会以最高的优先序执行。\nc:显示进程完整的路径与名称。\nS:累积模式,会将己完成或消失的子行程的CPU时间累积起来。\ns:安全模式。\ni:不显示任何闲置(Idle)或无用(Zombie)的行程。\nn:显示更新的次数,完成后将会退出to\n显示参数:\nPID(Process ID):进程标示号。\nUSER:进程所有者的用户名。\nPR:进程的优先级别。\nNI:进程的优先级别数值。\nVIRT:进程占用的虚拟内存值。\nRES:进程占用的物理内存值。\nSHR:进程使用的共享内存值。\u003c/p\u003e\n\u003cp\u003eS:进程的状态,其中S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值是负数。\n%CPU:该进程占用的CPU使用率。\n%MEM:该进程占用的物理内存和总内存的百分比。\nTIME+:该进程启动后占用的总的CPU时间。\nCommand:进程启动的启动命令名称,如果这一行显示不下,进程会有一个完整的命令行。\ntop命令使用过程中,还可以使用一些交互的命令来完成其它参数的功能。这些命令是通过快捷键启动的。 …\u003c/p\u003e"
July 7, 2010
freebsd下启动、停止 MySQL命令
"\u003cp\u003e\u003cstrong\u003e启动、停止 MySQL\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e要启动 MySQL 的方法:(以本文将 MySQL 安装在 /usr/local/mysql 为例)\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# /usr/local/mysql/share/mysql.server start\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e如果安装目录使用的是默认的话,请使用\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e /usr/local/etc/rc.d/mysql-server start|stop|restart\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e注意在第一次执行前,须将 mysql.server 设成可执行(chmod 744 mysql.server),另外可将这行指令加在 /etc/rc.d/rc.local 档中,让 MySQL 在开机时自动启动。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e要停止 MySQL 的方法:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# /usr/local/mysql/bin/mysqladmin shutdown\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e如果你为 MySQL Administrator root 帐号(非作业系统的 root)设了密码,要停止 MySQL 则必须像下列这样做,MySQL 会询问你 root 的密码後才会执行 shutdown 的工作:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# /usr/local/mysql/bin/mysqladmin -u root …\u003c/p\u003e\u003c/blockquote\u003e"
July 5, 2010
linux scp 命令
"\u003cp\u003e在 linux 之间复制 文件\u003c/p\u003e\n\u003cp\u003e安装方法:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eyum -y install openssh-clients\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003elinux 的 scp 命令 可以 在 linux 之间复制 文件 和 目录;\u003c/p\u003e\n\u003ch1 id=\"scp-命令\"\u003e==================\n\u003cstrong\u003escp 命令\u003c/strong\u003e\u003c/h1\u003e\n\u003cp\u003escp 可以在 2个 linux 主机间复制文件;\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e命令基本格式:\u003c/strong\u003e\nscp [可选参数] file_source file_target\u003c/p\u003e\n\u003ch1 id=\"从-本地-复制到-远程\"\u003e======\n从 本地 复制到 远程\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e复制文件:\u003c/li\u003e\n\u003cli\u003e命令格式:\nscp local_file remote_username@remote_ip:remote_folder\n或者\nscp local_file remote_username@remote_ip:remote_file\n或者\nscp local_file remote_ip:remote_folder\n或者\nscp local_file remote_ip:remote_file\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e第1,2个指定了用户名,命令执行后需要再输入密码,第1个仅指定了远程的目录,文件名字不变,第2个指定了文件名;\n第3,4个没有指定用户名,命令执行后需要输入用户名和密码, …\u003c/p\u003e"
July 3, 2010
FreeBSD 修改默认SHELL
"\u003cp\u003eFreeBSD下默认的shell为CSH,可以通过命令 echo $SHELL来查看系统默认的shell是哪一个的。\u003c/p\u003e\n\u003cp\u003e显示自己所使用的SHEEL命令:\nps或echo $SHELL\n修改默认SHELL为csh\nname:是指你登陆的名称\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003epw usermod -n name -s csh\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e查看所有支持的shell\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003efreebsd# cat /etc/shells\n/bin/sh\n/bin/csh\n/bin/tcsh\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e到于bash的安装请参考:\u003c/p\u003e"
June 29, 2010
分享FreeBSD 8.0的十四条优化策略
"\u003cp\u003e【51CTO独家特稿】笔者目前是一位外企linux/unix系统工程师与项目实施工程师,而FreeBSD一直作为我们企业内部的开发服务器,具有稳定和高效的特点。本文根据笔者经验总结了十四条FreeBSD的优化策略。如无其它,以下所指FreeBSD均指FreeBSD 8.0_release。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、提高ports安装速度\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eFreeBSD中的ports安装工具默认工具是用fetch,下载时经常出现龟速现象。为了提高ports安装速度,我推荐axel工具。相关make.conf文件配置步骤如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\n\n cd /usr/ports/ftp/axel\n\n\n\n\n make install\n\n\n\n\n #修改/et/make.conf\n\n\n\n\n vi /etc/make.conf\n\n\n\n\n #加入以下内容\n\n\n\n\n FETCH_CMD=axel\n\n\n\n\n FETCH_BEFORE_ARGS= -n 10 -a\n\n\n\n\n FETCH_AFTER_ARGS=\n\n\n\n\n DISABLE_SIZE=yes …\u003c/code\u003e\u003c/pre\u003e"
June 26, 2010
LVS & MySQL NDB Cluster
"\u003cp\u003e章文嵩博士(LVS开源项目创始人)进入淘宝好几个月了,今天是他第一次讲解LVS的实现原理。作为DBA的一员,终于近距离膜拜了大牛。\n讲解的内容就不具体介绍了,在\u003ca href=\"http://www.linuxvirtualserver.org/whatis.html\"\u003eLVS 官方网站\u003c/a\u003e上面可以找到。PPT的内容和网站上基本上一样,只是讲解人是章博士本人。我在这整理一下自己的理解,不对请大家指正。 ^_^\u003c/p\u003e\n\u003cp\u003e组成LVS最重要的部分有三个:请求分发服务器、处理服务器、共享存储。\u003c/p\u003e\n\u003cp\u003e典型的Web集群并不需要共享存储,只有请求分发服务器和处理服务器,如下图所示:\n[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/LVS_WEB-300x245.jpg\" alt=\"\"\u003e][2]\n如果完成请求需要基于数据,那么共享存储就是LVS必须的组件了。LVS邮件服务器集群如下所示:\n[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/LVS_MAIL.jpg\" alt=\"\"\u003e][3]\n目前能应用于LVS的MySQL集群只能是NDB Cluster,因为MySQL众多的存储引擎中,只有NDB Cluster实现了共享存储的功能。\n在NDB Cluster中,SQL Node相当于处理服务器,Data Node相当于共享存储。LVS可以让应用程序的开发更加简单,开发人员并不需要知道执行SQL的数据库服务器到底是哪一个,但是可以获得自己想要的数 据。而NDB Cluster提供的数据拆分和扩容功能,保证了数据库的可扩 …\u003c/p\u003e"
June 24, 2010
FreeBSD portupgrade升级你的FreeBSD软件
"\u003cp\u003e\u003cstrong\u003eportupgrade\u003c/strong\u003e 是一个软件,用于快捷便利地升级软件,安装办法:\u003c/p\u003e\n\u003cp\u003e#cd /usr/ports/sysutils/portupgrade\u003c/p\u003e\n\u003cp\u003e#make install clean\u003c/p\u003e\n\u003cp\u003e然后用cvsup更新ports树,最后运行:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e#portupgrade -r\u003c/strong\u003e pkg_name 升级单个软件和与其相关的,其中 pkg_name 是 pkg_info 中显示的名字\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eportupgrade\u003c/strong\u003e -ar 就会自动更新全部了。\u003c/p\u003e\n\u003cp\u003e如果加上 P 参数,则先看是否有已经编译好的 pkg 下载,直接从 pkg 升级,省去自己编译。\u003c/p\u003e\n\u003cp\u003e下载站点可以通过修改 /usr/local/etc/pkgtools.conf 更改。\u003c/p\u003e\n\u003cp\u003eportupgrade -arR 升级所有已经安装的软件,并且检查依赖关系。\u003c/p\u003e"
June 17, 2010
lighttpd配置DiscuzX伪静态规则详细图文教程
"\u003cp\u003eVPS下lighttpd配置DiscuzX伪静态规则\u003c/p\u003e\n\u003cp\u003e第一步:进入Kloxo VPS控制面板点击域名选项.\n第二步:进入域名选项后,选中你所要配置lighttpd的DiscuzX伪静态规则的域名, 这里所需要配置的域名为找iPad论坛 \u003ca href=\"http://www.cn0393.com\"\u003ewww.cn0393.com\u003c/a\u003e , 点击它,进入站点选项列表.\n第三步:点击lighttpd地址重写规则按纽,进入lighttpd配置界面.\n第四步:把由找ipad论坛提供的lighttpd的DiscuzX伪静态规则文件粘贴进空白框中.\n第五步:然后点击Update按纽,应用并使lighttpd生效.\n 注:lighttpd会自动重启可以不用像IIS那样需要手工重启。\n第六步:进入DiscuzX管理中心,点击–》全局–》优化设置–》URL静态化\n 把箭头所指的勾全选中–》点提交\n最后一步,就是更新一下缓存就OK了,超简单。哥你懂的,就不截图了。自已看效果吧!\u003c/p\u003e"
June 7, 2010
FreeBSD下用mrtg监控本机流量、内存、cpu使用率、整网流量
"\u003cp\u003e经常看到说mrtg的,说论坛里面的资料不对,其实不是不对,是有些说的不详细而已,我刚开始作的时候也是费了不少时间的,整理一下,发到这里吧,希望能 为后来的兄弟们省下时间\n前言:我实验的机器是FreeBSD4.10,其他版本的应该也一样,其他unix like系统估计也是可以的,因为我只用过FreeBSD,不敢 肯定。另外我这篇文章的前提是你的机器上已经安装了apache,并能正常使用,如果没有请参考网上其他文 章安装,本文就不再赘述。\u003c/p\u003e\n\u003cp\u003e一:先介绍如何用mrtg来监控本机的流量\n1:安装 snmp\u003c/p\u003e\n\u003cp\u003ecd /usr/ports/net-mgmt/p5-SNMP(好像没有这个目录的,可以用路径:/usr/ports/net-mgmt/net-snmp/”这)\nmake install clean\n当中会叫你填写你的email、操作系统等等,直接回车即可。\u003c/p\u003e\n\u003cp\u003e可以用以下命令启动snmp,/usr/local/etc/rc.d/snmpd.sh start\u003c/p\u003e\n\u003cp\u003e2:安装 mrtg\u003c/p\u003e\n\u003cp\u003ecd /usr/ports/net-mgmt/mrtg\nmake install clean\u003c/p\u003e\n\u003cp\u003e3:配置 index.cfg …\u003c/p\u003e"
May 30, 2010
配置ETags–网站速度优化技巧法则13 – [网站速度优化]
"\u003cp\u003e法则13 配置ETags\u003c/p\u003e\n\u003cp\u003e实体标签(ETags)是用于确定浏览器缓存中元素 与原Web 服务器中的元素是否相匹配的机制(实体是“元素”的另外一个称谓:如图片、脚本、样式 表等),它提供 了比last-modified 时间更为灵活的元素验证机制。每一个ETag,都是唯一的字符串,用于标识特定版本的元素,它需被包括在引号中。原Web 服务器在响应信息头中用Etag来标识元素,如:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026gt; HTTP/1.1 200 OK\n\u0026gt;\n\u0026gt; Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT\n\u0026gt;\n\u0026gt; ETag: “10c24bc-4ab-457e1c1f”\n\u0026gt;\n\u0026gt; Content-Length: 12195\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e之后,如果浏览器需验证某元 素,它在信息头中用If-None-Match传回ETag给原Web 服务器,若ETag匹配,则服务器返回304代码而不是上例中的12195字节,从而节省了下载响应时间。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026gt; GET /i/yahoo.gif HTTP/1.1\n\u0026gt;\n\u0026gt; Host: us.yimg.com …\u003c/code\u003e\u003c/pre\u003e"
May 29, 2010
如何用Squid Windows版架设二级代理服务器
"\u003cp\u003e一、Windows版Squid的下载与安装\u003c/p\u003e\n\u003cp\u003e下载windwosNT版本的squid下载地址:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://squid.acmeconsulting.it/download/squid-2.6.STABLE13-bin.zip\"\u003ehttp://squid.acmeconsulting.it/download/squid-2.6.STABLE13-bin.zip\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e1.把squid-2.6.STABLE13-bin.zip解压缩,把里面的squid文件夹拷到c:\\下(squid默认的是c: \\squid)\u003c/p\u003e\n\u003cp\u003e2.squid\\etc目录下把\u003c/p\u003e\n\u003cp\u003esquid.conf.default拷贝一份重新命名为 squid.conf\u003c/p\u003e\n\u003cp\u003ecachemgr.conf.default拷贝一份重新命名为cachemgr.conf\u003c/p\u003e\n\u003cp\u003emime.conf.default 拷贝一份重新命名为mime.conf\u003c/p\u003e\n\u003cp\u003e3.用文本编辑器打开squid.conf,需要修改的地方:\u003c/p\u003e\n\u003cp\u003e找到 http_port 3128在后面增加一行\u003c/p\u003e\n\u003cp\u003ehttp_port 80 transparent\u003c/p\u003e\n\u003cp\u003e找 到#cache_peer sib2.foo.net sibling 3128 3130 [proxy-only]在后面增加一行\u003c/p\u003e\n\u003cp\u003ecache_peer 192.168.1.8 parent …\u003c/p\u003e"
May 26, 2010
智能DNS配置
"\u003cp\u003e智能DNS配置\u003c/p\u003e\n\u003cp\u003e智能DNS可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,达到互联互通的效果。\n以下配置:网通用户使用网通web服务,其他使用电信服务\n主DNS服务器 202.93.111.100\n次DNS服务器 202.93.111.101\n网通WEB 202.93.111.102\n电信WEB 202.93.111.103\n邮件服务器 202.93.111.104\u003c/p\u003e\n\u003cp\u003e一、DNS服务器安装\n安装bind-9.4.2\n#emerge -v bind\u003c/p\u003e\n\u003cp\u003e配置主机名:\nnano -w /etc/hosts 增加:\n\u003cstrong\u003e202.93.111.100 ns1.myddz.com ns1\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e配置dns本机器查找\nnano -w /etc/resolv.conf 增加:\n\u003cstrong\u003edomain myddz.com\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e二、 named.conf的配置\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003enano -w /etc/bind/named.conf\u003c/li\u003e\n\u003cli\u003eoptions {\u003c/li\u003e\n\u003cli\u003edirectory “/var/bind”;\u003c/li\u003e\n\u003cli\u003elisten-on-v6 { none; }; …\u003c/li\u003e\u003c/ol\u003e"
May 26, 2010
新浪网易百度等各大门户网站的CDN架构设计分析
"\u003cp\u003e1、 新浪\u003c/p\u003e\n\u003cp\u003e新浪采用了ChinaCache做的CDN系统,ChinaCache在全国分布了四十多个 点,同时采用基于动态DNS分配的全球服务器负载均衡技术。\u003c/p\u003e\n\u003cp\u003e从新浪的站点结构可 以看出:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e \u003ca href=\"http://www.sina.com.cn/\"\u003ewww.sina.com.cn\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eServer: UnKnown\u003c/p\u003e\n\u003cp\u003eAddress: 192.168.1.254\u003c/p\u003e\n\u003cp\u003eNon-authoritative answer:\u003c/p\u003e\n\u003cp\u003eName: libra.sina.com.cn\u003c/p\u003e\n\u003cp\u003eAddresses: 61.135.152.71, 61.135.152.72, 61.135.152.73, 61.135.152.74 61.135.152.75, 61.135.152.76, 61.135.153.181, 61.135.153.182, 61.135.53.183, 61.135.153.184, 61.135.152.65, 61.135.152.66, 61.135.152.67, 61.135.12.68, 61.135.152.69, 61.135.152.70\u003c/p\u003e\n\u003cp\u003eAliases: \u003ca href=\"http://www.sina.com.cn/\"\u003ewww.sina.com.cn\u003c/a\u003e, jupiter.sina.com.cn\u003c/p\u003e\n\u003cp\u003e在北 …\u003c/p\u003e"
May 18, 2010
windows2003+iis6.0 的cacti系统的安装
"\u003cp\u003e官方教程:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e一、所需软件及下载链接:\u003c/p\u003e\n\u003cp\u003e1、Cacti\n下载地址: \u003ca href=\"http://www.cacti.net/downloads/\"\u003ehttp://www.cacti.net/downloads/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e(这个是Cacti的网页显示程序,是用PHP做的,完成之后你要把放他放在你的WEB目录里。)\n2、Cactid\n下载地址: \u003ca href=\"http://www.cacti.net/downloads/cactid/packages/Windows/\"\u003ehttp://www.cacti.net/downloads/cactid/packages/Windows/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e(这个是cacti从RRDtool那里得到的图形生成图形的程序。)\u003c/p\u003e\n\u003cp\u003eSpine这个是Cactid的新版。0.8.6版之后就用这个做为生成图形与网页的接口了\n3、RRDTool\n下载地址: \u003ca href=\"http://www.cacti.net/downloads/rrdtool/win32/\"\u003ehttp://www.cacti.net/downloads/rrdtool/win32/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e(这个就是生成图形的程序了,这个要用到cmd.exe程序。当然你要把你的cmd.exe加上USER权限)\n4、PHP 4.3.6或5.x\n下载地址: \u003ca href=\"http://www.php.net/downloads.php\"\u003ehttp://www.php.net/downloads.php\u003c/a\u003e\n5、MySQL 4.x或MySQL 5.x\n下载地址: \u003ca href=\"http://dev.mysql.com/downloads/\"\u003ehttp://dev.mysql.com/downloads/\u003c/a\u003e\n6、(非必要) …\u003c/p\u003e"
May 18, 2010
Cacti在Windows下的安装
"\u003cp\u003e官方教程:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e该安装文档是我参照 \u003ca href=\"http://www.cacti.net/\"\u003ewww.cacti.net\u003c/a\u003e 上的官方文档进行安装后,总结出来的。平台是winxp或win2k。我把涉及到的软件制作了个安装包,忽略了版本号,这样可以让大家正确选择,少走很多 我弯路,http://www.bgctv.cn/cacti.rar安装手册内的很多细节是针对新手的,希望更多的人可以使用)\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1、安装mysql.(版本mysql-3.23.52)\u003c/strong\u003e\n安装包内的mysql.rar解压缩,正常安装到c盘的mysql目录;安装后需要手动执行C:\\MYSQL\\BIN \\winmysqladmin.exe文件,其实就是找到他,双击一下就可以了,他会启动mysql要求你设置mysql的用户名密码,我设置的是用户 名:root 密码:cacti 这个用户名和密码会用到几次,请记清楚\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2、安装apache(版本apache_2.0.49-win32-x86)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e正常安装包内的版本,约定一下,我们把软件安装到C:\\APACHE2目录下,正常情况下,你在浏览器里打 \u003ca href=\"http://127.0.0.1/\"\u003ehttp://127.0.0.1\u003c/a\u003e\n就可以看到apache正常启动了,屏幕右下脚会有个小标志(红色的羽毛), …\u003c/p\u003e"
May 18, 2010
Windows下快速安装CACTI流量监控
"\u003cp\u003e独家:公司最近要对几台上架的服务器进行远程监控,需要提出解决方案。前一段时间曾经在CU上见人们都在讨论CACTI,所以就对照网上的教程进行 了CACTI安装调试,但是可能是自己太菜了,在这个过程中遇到了许多问题,在这里把这个过程记录下来,给像我一样的菜鸟。\u003c/p\u003e\n\u003cp\u003eCACTI是一套PHP程序,它利用SNMPGET采集数据,使用RRDTOOL绘图引擎绘图,RRDTOOL是MRTG的替代者,它们的作者 是一个人。由于RRDTOOL功能过于强大,所以使用起来命令过于复杂,而CACTI就在这时出现了,它是图形界面,使用简单,使不用直接和 RRDTOOL接触。但是它是以SNMP和RRDTOOL为基础的,所以最好深入学习一下NET-SNMP和RRDTOOL的使用。\u003c/p\u003e\n\u003cp\u003e好了,废话不多说了,我们来看看在Windows下如何安装CACTI吧。正如我前面说的那样,CACTI是一套PHP系统,所以如果说是安装 调试的话最主要的还的PHP环境的建立。其它的RRDTOOL和Net-Snmp简单应用的话只要安装上就可以,不用做太多的设置。\u003c/p\u003e\n\u003cp\u003ePHP是一套强大的脚本语言,最初只能应用于Linux下面,随着它的发展,已经能够 …\u003c/p\u003e"
May 18, 2010
服务器系统监控CACTI在windows和linux下安装配置
"\u003cp\u003e\u003cstrong\u003eWindows下Cacti安装\u003c/strong\u003e\n声明:本系列文档出自 \u003ca href=\"http://blog.sina.com.cn/5istone\"\u003e石头记\u003c/a\u003e,如若转载请注明出处,本人保留文档的所有权,并欢迎转载。\u003c/p\u003e\n\u003cp\u003e本系列文档的其他部分链接如下:\n一、 \u003ca href=\"http://blog.sina.com.cn/s/blog_4e424e2101000b5x.html\"\u003e概述及Cacti的工作流程\u003c/a\u003e\n二、 \u003ca href=\"http://blog.sina.com.cn/s/blog_4e424e2101000b5y.html\"\u003eCacti安装\u003c/a\u003e\n\u003cstrong\u003e(Linux)\u003c/strong\u003e\n三、 \u003ca href=\"http://blog.sina.com.cn/s/blog_4e424e2101000b6o.html\"\u003eCacti的使用\u003c/a\u003e\n四、 \u003ca href=\"http://blog.sina.com.cn/s/blog_4e424e2101000b77.html\"\u003eCacti脚本及模板\u003c/a\u003e\n五、 \u003ca href=\"http://blog.sina.com.cn/s/blog_4e424e2101000b7j.html\"\u003eCacti插件\u003c/a\u003e\n六、 \u003ca href=\"http://blog.sina.com.cn/s/blog_4e424e2101000bb7.html\"\u003eCacti高级应用–打造自己的Cacti模板\u003c/a\u003e\n七、 \u003ca href=\"http://blog.sina.com.cn/s/blog_4e424e2101000blp.html\"\u003eCacti安装\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e(Windows)\u003c/strong\u003e\n一、软件需求\n1、 操作系统:Windows Server 2003企业版(或其他NT系统)。\n2、 安装Apache,当然也可以使用IIS。\n3、 安装MySQL,下载MySQL的Windows版本并安装到c:/mysql文件夹下。\n4、 安装PHP,从www.php.net 下载PHP 5.X并安装到c:/php文件夹下。\n5、 安装RRDTool,从www.cacti.net下载Cygwin版RRDTool并安装到c:/cacti文件夹下。\n6、 安装Net-SNMP,下载Net-SNMP并安装到c:/net-snmp文件夹下。\n7、 安装Cacti,将下载的Cacti 压缩文件解压 …\u003c/p\u003e"
May 18, 2010
cacti添加apache状态信息
"\u003cp\u003e对Apache Server Status的启用状态信息\n对Apache的状态管理的模块是LoadModule status_module modules/mod_status.so,所以需要在配置文件httpd.conf里启用这个模块,所前面的#去掉.然后将”#Include conf/extra/httpd-info.conf“前面的#也去掉,打开\u003cstrong\u003eextra/httpd-info.conf\u003c/strong\u003e文件,启用\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eExtendedStatus On\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e配置Apache Server Status的权限\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSetHandler server-status\nOrder Deny,Allow\nDeny from all\nAllow from 10.0.10.22\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e下载CACTI模板和脚本\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://forums.cacti.net/about25227.html\u0026amp;highlight=apachestats\"\u003ehttp://forums.cacti.net/about25227.html\u0026amp;highlight=apachestats\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e在上面的地址下载一个叫 \u003cstrong\u003eApacheStats08.zip\u003c/strong\u003e 的,中间有二个文件,一个处理脚本php的,另一个是xml的文件.\u003c/p\u003e\n\u003cp\u003e1.其中的ss_apache_stats.php是脚本文件, …\u003c/p\u003e"
May 18, 2010
有关Apache Server Status和Cacti对Apache的监控
"\u003cp\u003e我们平时使用apache常常了解他的性能只能使用ps aux|grep httpd|wc -l查看有多少个进程,但处理了多少http的请求我们不清楚,进程是不是在工作,还是在等都不是很明白,要了解apache的性能,我们需要使用 Apache Server Status的模块来详细了解apache工作的怎么样.下面我还介绍使用cacti来监控它.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一.对Apache Server Status的启用\u003c/strong\u003e\n对Apache的状态管理的模块是LoadModule status_module modules/mod_status.so,所以这个需要有\n然后打开下面的配置\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eExtendedStatus On\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e配置Apache Server Status的权限\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026lt;location /server-status\u0026gt;\n SetHandler server-status\n Order Deny,Allow\n Deny from all\n Allow from 60.60.60.60\n\u0026lt;/location\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003c/blockquote\u003e\n\u003cp\u003e打开查看的 …\u003c/p\u003e"
May 14, 2010
tar命令详解
"\u003cp\u003e\u003cstrong\u003e经常使用:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003esudo tar zxvf lumaqq_2005-linux_gtk2_x86_with_jre.tar.gz -C /usr/share/\u003c/p\u003e\n\u003cp\u003e 功能:备份文件;\u003c/p\u003e\n\u003cp\u003e tar cvf 备份文件.tar 备份文件或目录;\u003c/p\u003e\n\u003cp\u003e tar czvf 备份文件.tar.gz 备份文件或目录;\u003c/p\u003e\n\u003cp\u003e tar xzvf 备份文件.tar.gz 备份文件或目录 -C 解压到的目录;\u003c/p\u003e\n\u003cp\u003e c:(create)建立新的备份文件;\u003c/p\u003e\n\u003cp\u003e v:(verbose)显示指令的执行过程;\u003c/p\u003e\n\u003cp\u003e f:(file)置顶备份文件;\u003c/p\u003e\n\u003cp\u003e z:(gzip或ungzip)通过gzip指令处理备份文件;\u003c/p\u003e\n\u003cp\u003e x:从备份文件中还原文件;\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003etar命令详解:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e功能说明:备份文件。\u003c/p\u003e\n\u003cp\u003e语 法:tar [-ABcdgGhiklmMoOpPrRsStuUvwWxzZ][-b\u003c/p\u003e\n\u003cp\u003e][-C …\u003c/p\u003e"
May 7, 2010
unable to find a supported device to write the vmware esx server ESXi 3.5 image to 的解决办法
"\u003cp\u003e使用sata 320G硬盘安装vmware esx3.5,在按f11接受许可协议后总是出现 “unable to find a supported device to write the VMware ESXi 3.5 image to .”的错误提示,如图\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/05/vmware-esxi-3.5.jpg\" alt=\"vmware-esxi-3.5\"\u003e][1]\u003c/p\u003e\n\u003cp\u003e解决办法:\u003c/p\u003e\n\u003cp\u003e1、在此界面按ALT+ F1键进入控制台,用户名\u003cstrong\u003eroot\u003c/strong\u003e,密码为空\u003c/p\u003e\n\u003cp\u003e2、\u003cstrong\u003evi /usr/lib/vmware/installer/Core/TargetFilter.py\u003c/strong\u003e\n找到 return interface.GetInterfaceType() == ScsiInterface.SCSI_IFACE_TYPE_\u003cstrong\u003eIDE\u003c/strong\u003e这一行,改为return interface.GetInterfaceType() == ScsiInterface.SCSI_IFACE_TYPE_\u003cstrong\u003eISCSI\u003c/strong\u003e保存退出3、输入install命令重新安装。4、当回到原来的错误界面后,再按\u003cstrong\u003eALT+ F1键\u003c/strong\u003e,按照提示进行安装就不会再出错误提示了。\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/05/Install_start_screen.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/Install_start_screen.jpg\" alt=\"\"\u003e\u003c/a\u003e5) Press F11 on the next screen and you should then …\u003c/p\u003e"
May 5, 2010
用VM启动时出现的提示The CPU has been disabled by the guest…..的解决办法
"\u003cp\u003e虚拟机在安装linux操作系统时出现:The CPU has been disabled by the guest operating system……..\u003c/p\u003e\n\u003cp\u003e解决方法是*.vmx文件的最后添加两行:\u003c/p\u003e\n\u003cp\u003emonitor_control.restrict_backdoor = TRUE\u003c/p\u003e\n\u003cp\u003emonitor_control.enable_svm = TRUE\u003c/p\u003e\n\u003cp\u003e就OK了\u003c/p\u003e"
May 5, 2010
windows下配置jdk环境[原创]
"\u003cp\u003e我个人安装的为jdk1.6.0_14版本,安装在d:盘的program fiiles目录里了,直接在安装的时候把c:修改成d:就可以了,呵呵\u003c/p\u003e\n\u003cp\u003e**第一步:**下载JDK6,从官网下载(),如果下载的版不是1.6.0.14版本的,请根据情况修改下面的路径,这里提供另一个版本的下载地址: \u003ca href=\"http://www.newhua.com/softdown/61003_2.htm\"\u003ehttp://www.newhua.com/softdown/61003_2.htm\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/jdk_install.jpg\" alt=\"\"\u003e][1]\u003c/p\u003e\n\u003cp\u003e**第二步:**安装JDK6,修改默认盘符C:为D:,具体按步骤进行就OK了\u003c/p\u003e\n\u003cp\u003e**第三步:**配置环境变量,主要是三个:JAVA_HOME、PATH、CLASSPATH。\u003c/p\u003e\n\u003cp\u003e以下几个变量为系统变量,默认的PATH变量已经存在,所以只需要新建JAVA_HOME和CLASSPATH两个变量就可以了\nJAVA_HOME: **d:\\Program Files\\Java\\jdk1.6.0_14\n** CLASSPATH变量值为 **.;%JAVA_HOME%\\lib;%JAVA_HOME%\\lib\\tools.jar;\n** 修改PATH:变量值为 \u003cstrong\u003e;%JAVA_HOME%\\bin;\u003c/strong\u003e //此变量已经存在,直接编辑在最后 …\u003c/p\u003e"
May 5, 2010
Windows 2000/XP/2003下让APACHE支持ASP
"\u003cp\u003easp程序还是使用IIS来驱动比较好,怎么说都asp和IIS都是微软的产物,各方面的支持都可以得到保证;而且IASP是JAVA程序,速度会比IIS慢,这里之所以介绍Apache+JDK+IASP支持*.asp,是为大家多提供一条路参考而已!\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1、安装JDK组件支持IASP(如果你的Windows系统中已经安装了JDK,那么可以省略安装JDK)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eJDK6官方下载地址:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.java.net/download/jdk6/6u10/promoted/b32/binaries/jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008.exe\"\u003ehttp://www.java.net/download/jdk6/6u10/promoted/b32/binaries/jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008.exe\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eJDK6 API CHM中文参考下载:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://chinesedocument.com/upimg/soft/JDK6API%E4%B8%AD%E6%96%87%E5%8F%82%E8%80%83070114.rar\"\u003ehttp://chinesedocument.com/upimg/soft/JDK6API中文参考070114.rar\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2、安装iASP2.1.01.exe\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eiASP2.1.01.exe下载地址:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.china-microsoft.com/html/xitongruanjian/200806/05-53779.html\"\u003ehttp://www.china-microsoft.com/html/xitongruanjian/200806/05-53779.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e按照安装提示做即可。我 …\u003c/p\u003e"
May 4, 2010
windows下实战VPS虚拟服务器架设教程(二)
"\u003cp\u003e\u003cstrong\u003e一,创建\u003c/strong\u003e:\n1.打开桌面VMware Workstation新建个虚拟机\n2.选择模式,熟悉的话!可以选择高级模式安装!\n我这选 默认,下面可以自行配置,选哪个都没关系\n3.选择虚拟机用的光驱或者ISO文件,其中ISO文件在虚拟中会模拟成光驱,.支持DVD格式的 ISO!上面已经叫大家准备了的虚拟机的安装光盘,现在要用到了!\n第一项是选择光驱.实体或者虚拟都可以!\n第二项选ISO的文件路径\n第 三项以后配置\n自己根据需要选择\n4,设置安装序列号和管理员帐号:随便添下就行了!用GHOST的就更不用管了\n5.虚拟机的名字和 文件存放路径\n6.虚拟机的磁盘大小,设置大小随便你!这个大小就是虚拟机的硬盘大小!我这里选40G.\n7.点完成.1个虚拟机就创建完成 了!\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二 设置:\u003c/strong\u003e\n1.选择刚建立的虚拟机点设置\n2.可以根据需要进行调节内存大小,和硬件设备!\n其中网卡选项选择桥接,把 虚拟出来的主机当作现实存在的独立主机,后面要用到!\n3.全部配置完成了\n二 安装设置虚拟机系统\n1.点上面工具拦的绿色按纽启动 虚拟机!\n2.启动的时候按F2.进入BOSS选项,选择光驱启动.方向键是选择,+和-是改 …\u003c/p\u003e"
May 1, 2010
Linux下常见文件格式的压缩、解压小结
"\u003cp\u003e\u003cstrong\u003e.tar\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e解包:tar xvf FileName.tar\u003c/p\u003e\n\u003cp\u003e打包:tar cvf FileName.tar DirName\u003c/p\u003e\n\u003cp\u003e(注:tar是打包,不是压缩)\u003c/p\u003e\n\u003cp\u003e如果要过滤某个文件夹的话,使用参数 –excludetar -czvf www_web.tar.gz www_web/ –exclude=”./web/logs”\u003c/p\u003e\n\u003cp\u003e———————————————\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e.gz\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e解压 1:gunzip FileName.gz\u003c/p\u003e\n\u003cp\u003e解压2:gzip -d FileName.gz\u003c/p\u003e\n\u003cp\u003e压缩:gzip FileName\u003c/p\u003e\n\u003cp\u003e.tar.gz 和 .tgz\u003c/p\u003e\n\u003cp\u003e解压:tar zxvf FileName.tar.gz\u003c/p\u003e\n\u003cp\u003e压缩:tar zcvf FileName.tar.gz DirName\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e参数:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e-c :create 建立压缩档案的参数;\u003c/p\u003e\n\u003cp\u003e-x : 解压缩压缩档案的参数;\u003c/p\u003e\n\u003cp\u003e-z : 是否需要用gzip压缩;\u003c/p\u003e\n\u003cp\u003e-v: 压缩的过程中显示档案;\u003c/p\u003e\n\u003cp\u003e-f: 置顶文档名,在f后面立即接文件名,不能再加参数\u003c/p\u003e\n\u003cp\u003e举例: 一,将整个/home/www/images 目录下的文件全部打包为 /home/www/images.tar …\u003c/p\u003e\u003c/blockquote\u003e"
May 1, 2010
Kloxog下开通新站点
"\u003cp\u003e1.首先打开登录地址,如http://www.xxx.com:7778,请注意端口为7778,输入管理用户名和密码.\u003c/p\u003e\n\u003cp\u003e2.在管理后台,左侧会显示一系列的管理菜单(一些普通用户,每个普通用户下面也可以绑定很多域名)。\u003c/p\u003e\n\u003cp\u003e在左侧菜单中点击\u003cstrong\u003edomains\u003c/strong\u003e即可进入添加域名的界面,假设我们要添加的域名是 haohtml.com ,那么在该界面中Domain Name部分就填写\u003cstrong\u003ehaohtml.com\u003c/strong\u003e;Document Root是域名的文件所在的目录,通常也填写为域名;其他部分不用填写,点击\u003cstrong\u003eAdd\u003c/strong\u003e即可。\u003c/p\u003e\n\u003cp\u003e当用户绑定了一个域名之后,系统会自动创建一个FTP用户,\u003cstrong\u003eFTP用户的名字和域名是相同的,FTP密码就是当前用户的密码。\u003c/strong\u003e\u003c/p\u003e"
May 1, 2010
Kloxo(原名LxAdmin)控制面板 使用指南
"\u003cp\u003eKloxo是一个优秀的Web控制面板,有商业版本和免费版本。免费版本的Kloxo允许绑定40个域名,对普通客户来讲40个域名也足够用了。瑞豪开源的VPS提供了预装免费版Kloxo的Linux系统。本文介绍Kloxo控制面板的基本使用方法。\u003c/p\u003e\n\u003cp\u003eVPS安装好之后,我们会告诉客户Kloxo的登录地址以及admin用户的密码,登录之后就可以开始配置了。\u003c/p\u003e\n\u003ch2 id=\"升级kloxo到最新版本\"\u003e升级Kloxo到最新版本\u003c/h2\u003e\n\u003cp\u003e进入Kloxo后要做的第一件事情就是升级Kloxo到最新版本,这是非常必要的,因为老版本可能有bug存在,这些bug有可能导致Kloxo被入侵,而最新版本往往修复了这些bug。\u003c/p\u003e\n\u003cp\u003e在首页中间的Administration部分,点击Update Home然后就会看到当前的Kloxo是否是最新版本,如果不是最新版本,就点击下面的Update Now按钮进行升级。\u003c/p\u003e\n\u003ch2 id=\"添加dns模板\"\u003e添加DNS模板\u003c/h2\u003e\n\u003cp\u003e添加DNS模板是必要的,如果不添加DNS模板,将无法添加域名,无法添加新用户。\u003c/p\u003e\n\u003cp\u003e添加DNS模板,首先点击左侧菜单中的:Resources –\u0026gt; DNS Templates 或者首页中部的Resources –\u0026gt; DNS Templates, …\u003c/p\u003e"
May 1, 2010
第 6 章 – Ubuntu 软件包管理
"\u003cp\u003e\u003ca href=\"http://www.phpx.com/man/Ubuntu/UbuntuManual.htm\"\u003e\u003cstrong\u003e回 首页\u003c/strong\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e高级包管理工具 aptitude 是目前首选的字符界面的 APT 前端程序。 它会记住哪些包是你安装的,哪些是为了满足依赖关系而安装的;在不被已安装包需要的情况下aptitude 会自动卸载后者。它内建一套高级的包过滤器,但是比较难上手。 synaptic 是目前首选的基于 GTK 的图形化 APT 前端程序。它的包过滤器比 aptitude 的好用多了。它包含了对 \u003ca href=\"http://debtags.alioth.debian.org/\"\u003eDebian Package Tags\u003c/a\u003e 的实验性支持。 为了减少 Ubuntu 仓库的网络负担和加快你下载的速度,你应该从 Ubuntu 镜像下载。 如 果你需要在你本地网络的许多台机器上安装相同的包。在使用 APT 下载包的时候,请考虑使用 squid 来设置本地 HTTP 代理。必要的话,可以设置环境变量 http_proxy 或者在 /etc/apt/apt.conf 里面设置 http 的值。 尽 管 apt_preferences(5) 中描述的 APT 的 pinning 功能非常强大,但造成的影响是难以察觉和管理的。你应该把它作为一个高级功能来看待。\u003c/p\u003e\n\u003cp\u003e在 \u003ca href=\"http://www.phpx.com/man/Ubuntu/ch-tips.zh-cn.html#s-chroot\"\u003echroot, 第 8.6.35 节\u003c/a\u003e 中描 …\u003c/p\u003e"
May 1, 2010
Linux ftp服务启动方法
"\u003cp\u003e来源:http://www.linuxidc.com/Linux/2007-03/2430.htm\nLinux ftp服务启动方法\u003c/p\u003e\n\u003cp\u003eLinux ftp\u003c/p\u003e\n\u003cp\u003e服务启动步骤\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e#setup\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e//进入图形界面的System services查看是否有 vsftpd项,如果没有转到2.,保存后退出\u003c/p\u003e\n\u003cp\u003e2.用redhat第三张盘 安装此服务(开始–删除/增加程序),200K左右\u003c/p\u003e\n\u003cp\u003e3.#setup\u003c/p\u003e\n\u003cp\u003e此时能看到vsftpd项,此时选中此services项,保存后退出.\u003c/p\u003e\n\u003cp\u003e4.# service vsftpd start //启动ftp服务\u003c/p\u003e\n\u003cp\u003e5.# service vsftpd stop //停止ftp服务\u003c/p\u003e\n\u003cp\u003eOK.\u003c/p\u003e\n\u003cp\u003e---------------\u003c/p\u003e\n\u003cp\u003e#service vsftpd start //linux默认服务的启动方式\u003c/p\u003e\n\u003cp\u003e#apachectl start //linux第三方服务的启动方式\u003c/p\u003e\n\u003cp\u003e#lsnrctl\u003c/p\u003e\n\u003cp\u003e#setup的东西,会自动加载的services\u003c/p\u003e"
May 1, 2010
在ubuntu下安装中文输入法
"\u003cp\u003e来源:http://forum.ubuntu.org.cn/viewtopic.php?f=86\u0026amp;t=30537\u0026amp; view=next\u003c/p\u003e\n\u003cp\u003e终于装好中文输入法了(辛酸的历程)\u003c/p\u003e\n\u003cp\u003e几天来,或者说是装好了ubuntu以来的二三周以来吧,一直都在尝试装个中文输入法,中国人嘛,没有中文输入,你可以做个啥??而且又不会 English。这段日子,真是…………\u003c/p\u003e\n\u003cp\u003e装好了系统,又不熟手的,当然先是走遍各个论坛了。尤其是ubuntu中文论坛,更是搜索了又搜索。总算找到了不少资料,自认为可以动手了,便开始--装 个中文输入法(不要认为可笑、简单,我却历经了磨难和艰辛)。\u003c/p\u003e\n\u003cp\u003e从论坛上比较了各方认识,决定装Fcitx,试了几次,还是装不了…………\u003c/p\u003e\n\u003cp\u003e第一次,先更新了源,然后“sudo apt-get install fcitx im-switch ”,可结果总是“找不到fcitx”或“fcitx不可用”。\n第二次再来,下载了fcitx_3.2-051010_i386.deb,双击安装,安装成功!!!可是,调不出来用,是不是出了什么问题?还是还要装什 么运行环境?我也弄不清,反正等于没装——只好删了。\n然 …\u003c/p\u003e"
May 1, 2010
ubuntu软件安装命令
"\u003cp\u003e在ubuntu下基本上只要apt- get 就可以了,但是有时候要尝鲜就得去另外下了,这时就要了解一些linux下安软件的知识了,所以在网上找了这篇文章\u003c/p\u003e\n\u003cp\u003e在Windows下安装软件时,只需用鼠标双击软件的安装程序,或者用Zip等解压缩软件解压缩即可安装。\u003cstrong\u003e在 Linux下安装软件\u003c/strong\u003e对初学者来说,难度高于Windows下软件安装。下面我就详细讲解Linux下如何安装软件。\u003c/p\u003e\n\u003cp\u003e先来看看Linux软件扩展名。软件后缀为.rpm最初是Red Hat Linux提供的一种包封装格式,现在许多Linux发行版本都使用;后缀为.deb是Debain Linux提供的一种包封装格式;后缀为.tar.gz、tar.Z、tar.bz2或.tgz是使用Unix系统打包工具tar打包的;后缀为.bin 的一般是一些商业软件。通过扩展名可以了解软件格式,进而了解软件安装。RPM格式软件包的安装\u003c/p\u003e\n\u003cp\u003e1.简介\n几乎所有的Linux发行版本都使用某种形式的软件包 管理安装、更新和卸载软件。与直接从源代码安装相比,软件包管理易于安装和卸载;易于更新已安装的软件包;易于保护配置文件;易于跟踪已安装文件。\u003c/p\u003e\n\u003cp\u003eRPM全称是Red …\u003c/p\u003e"
May 1, 2010
Linux下的虚拟主机管理软件kloxo 控制面板的安装
"\u003cp\u003e官方网站:\u003c/p\u003e\n\u003cp\u003e安装教程:\u003c/p\u003e\n\u003cp\u003e64位:\u003c/p\u003e\n\u003cp\u003e============================================================================\u003c/p\u003e\n\u003cp\u003e安装Kloxo/Lxadmin控制面板首先要确保安装的CentOS 32bit的Linux发行版(64位问题比较多),再使用putty登录Linux,如果不会可以查看: \u003ca href=\"http://www.vpser.net/uncategorized/putty-ssh-linux-vps.html\" title=\"到《如何使用Putty远程(SSH)管理Linux VPS》的永久链接\"\u003e如何使用Putty远程(SSH)管理Linux VPS\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e执行如下命令:\nwget \u003ca href=\"http://download.lxcenter.org/download/kloxo/production/kloxo-installer.sh\"\u003ehttp://download.lxcenter.org/download/kloxo/production/kloxo-installer.sh\u003c/a\u003e\nsh ./kloxo-installer.sh –type=master\u003c/p\u003e\n\u003cp\u003e先按提示,然任意建开始安装,后面会有提示,一般输入y,回车就行。\u003c/p\u003e\n\u003cp\u003e国内主机可能安装要慢点了,因为是在线安装(更新源在国外),使用美国主机的朋友们很快就能安装完了。\n安装完后你除了安好Kloxo/Lxadmin,同时也基本安好了Apache、Lighttpd、MySQL、Xcache、Bind、Djbdns等一系列服务器软件。\u003c/p\u003e\n\u003cp\u003eyum …\u003c/p\u003e"
April 19, 2010
魔法引用函数 magic_quotes_gpc和magic_quotes_runtime的区别和用法
"\u003cp\u003ePHP基础002: 魔法引用函数magic_quotes_gpc和magic_quotes_runtime的区别和用法\u003c/p\u003e\n\u003cp\u003ePHP提供两个方便我们引用数据的魔法引用函数magic_quotes_gpc和magic_quotes_runtime,这两个函数如果在 php.ini设置为ON的时候,就会为我们引用的数据碰到单引号’和双引号”以及反斜线 \\ 是自动加上反斜线,帮我们自动转译符号,确保数据操作的正确运行,可是我们在php不同的版本或者不同的服务器配置下,有的 magic_quotes_gpc和magic_quotes_runtime设置为on,有的又是off,所以我们写的程序必须符合on和off两种情 况。那么magic_quotes_gpc和magic_quotes_runtime两个函数有什么区别呢?看下面的说明:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emagic_quotes_gpc\u003c/strong\u003e\n作用范围是:WEB客户服务端;\n作用时间:请求开始是,例如当脚本运行时.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emagic_quotes_runtime\u003c/strong\u003e\n作用范围:从文件中读取的数据或执行exec()的结果或是从SQL查询中得到的;\n作用时间:每次当脚本访问运行状态中产生 …\u003c/p\u003e"
April 19, 2010
windows下apache+php平台,虚拟主机安全设置
"\u003cp\u003e先按这里的文档对服务器系统安全做设置: \u003ca href=\"http://blog.haohtml.com/index.php/archives/3438\"\u003ehttp://blog.haohtml.com/index.php/archives/3438\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e对于php.ini的设置有:\n1.修改为安全\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003esafe_mode = true\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e2.禁用一些系统函数\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003edisable_functions = passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e3.禁用com组件调用\u003c/p\u003e\n\u003cp\u003e将 ;com.allow_dcom = true 修改为 com.allow_dcom = false 启用并禁用\n4.指定上传文件的临时目录\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eupload_tmp_dir = “d:\\php\\upload_tmp”\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e5.启用特别字符转义功能\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003emagic_quotes_gpc = On\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e6.关闭 …\u003c/p\u003e"
April 19, 2010
服务器安全设置.卸载极其危险的 Wscript.Shell 和 shell.application 组件
"\u003cp\u003e载极其危险的 Wscript.Shell 和 shell.application 组件,这2 个组件的主要作用是asp调用exe程序。\u003c/p\u003e\n\u003cp\u003e几乎所有正常的网站都用不到,而要黑服务器却几乎都需要调用这个组件来执行操作\u003c/p\u003e\n\u003cp\u003e运 行:regsvr32 /u c:\\winnt\\system32\\wshom.ocx 即可卸载 Wscript.Shell\u003c/p\u003e\n\u003cp\u003e运 行:regsvr32 /u c:\\winnt\\system32\\shell32.dll 即可卸载 shell.application\u003c/p\u003e\n\u003cp\u003e如果是window2000/20003则将winnt改为windows再运行即可\u003c/p\u003e"
April 17, 2010
vi显示行号
"\u003cp\u003e在VI的命令模式下输入“:set nu”\u003c/p\u003e\n\u003cp\u003e或者修改vi配置文件“vi ~/.vimrc”,在其中添加“set nu”\u003c/p\u003e\n\u003cp\u003e在VI的命令模式下输入“:set nu”,就有行号了。\u003c/p\u003e\n\u003cp\u003e但是想将这个设置写进VI的配置文件,就\u003c/p\u003e\n\u003ch1 id=\"vi-vimrc\"\u003evi ~/.vimrc\u003c/h1\u003e\n\u003cp\u003e在这个文件中,添加\u003c/p\u003e\n\u003cp\u003eset nu\u003c/p\u003e\n\u003cp\u003e就行了\u003c/p\u003e\n\u003cp\u003eset nu — to display line no\u003c/p\u003e\n\u003cp\u003eset nonu — not to display line no\u003c/p\u003e\n\u003cp\u003ectrl + g 可以知道cursor的那一行的行数\u003c/p\u003e\n\u003cp\u003eshift+g可以到最后一行。在:下输入行号,可到达对应行\u003c/p\u003e"
April 15, 2010
IIS中的上传目录权限设置问题
"\u003cp\u003e虽然 Apache 的名声可能比 IIS 好,但我相信用 IIS 来做 Web 服务器的人一定也不少。说实话,我觉得 IIS 还是不错的,尤其是 Windows 2003 的 IIS 6(马上 Longhorn Server 的 IIS 7 也就要来了,相信会更好),性能和稳定性都相当不错。但是我发现许多用 IIS 的人不太会设置 Web 服务器的权限,因此,出现漏洞被人黑掉也就不足为奇了。但我们不应该把这归咎于 IIS 的不安全。如果对站点的每个目录都配以正确的权限,出现漏洞被人黑掉的机会还是很小的(Web 应用程序本身有问题和通过其它方式入侵黑掉服务器的除外)。下面是我在配置过程中总结的一些经验,希望对大家有所帮助。IIS Web 服务器的权限设置有两个地方,一个是 NTFS 文件系统本身的权限设置,另一个是 IIS 下网站-\u0026gt;站点-\u0026gt;属性-\u0026gt;主目录(或站点下目录-\u0026gt;属性-\u0026gt;目录)面板上。这两个地方是密切相关的。下面我会以实例的方式来讲解如何设置权限。\u003c/p\u003e\n\u003cp\u003eIIS 下网站-\u0026gt;站点-\u0026gt;属性-\u0026gt;主目录(或站点下目录-\u0026gt;属性-\u0026gt;目 …\u003c/p\u003e"
April 12, 2010
让虚拟机实现开机自动后台运行
"\u003cp\u003e1.从http://code.google.com/p/apploader/下载AppLoader并安装。\n2.运行AppLoader Configure。\n\u003ca href=\"http://images.cnblogs.com/cnblogs_com/rapidhorse/172985/o_2009-1-16%209-09-35.png\"\u003e\u003cimg src=\"http://images.cnblogs.com/cnblogs_com/rapidhorse/172985/o_2009-1-16%209-09-35.png\" alt=\"点击在新窗口中浏览此图片\"\u003e\u003c/a\u003e\n3.在Application File Name选择C:\\Program Files\\VMware\\VMware Workstation\\vmware.exe。\n4.在Args输入 -x “D:\\VM backup\\Windows XP Professional\\Windows XP Professional.vmx”。(引号内是虚拟文件名,自行修改)。\u003c/p\u003e\n\u003cp\u003e5.保存。\n6.在services中重启RapidHorse Apploader的服务进行测试,以后关机重启时都将启动vmware。其他应用程序也如此处理。\n\u003ca href=\"http://images.cnblogs.com/cnblogs_com/rapidhorse/172985/o_2009-1-16%209-18-01.png\"\u003e\u003cimg src=\"http://images.cnblogs.com/cnblogs_com/rapidhorse/172985/o_2009-1-16%209-18-01.png\" alt=\"点击在新窗口中浏览此图片\"\u003e\u003c/a\u003e\n7.注:vmware启动时会询问一些问题,一般都选择“下次不再出现”,另外为了防止启动时出现更新提示,preferences中的check for updates设置为never。\u003c/p\u003e\n\u003cp\u003e方法2\n第一步\u003c/p\u003e\n\u003cp\u003e首先 打开虚拟机的主窗口 编辑 参数\n同时勾上以下两个选项\n在关闭后在后台运行电源已打开的虚拟机\n虚拟机电源打开时显示托盘图 …\u003c/p\u003e"
April 7, 2010
为Apache配置mod_deflat压缩输出[已测试]
"\u003cp\u003e1、如果未安装Apache。编译时,加上–enable-deflate,例如:(仅针对Linux版,Windows版无须此步骤)\n./configure –prefix=/usr/local/apache –enable-rewrite –enable-so –enable-deflate\u003c/p\u003e\n\u003cp\u003e2、如果已安装Apache。添加mod_deflate模块,例如:(仅针对Linux版,Windows版无须此步骤)\n/usr/local/apache/bin/apxs -i -a -c /home/zhangyan/software/httpd-2.0.59/modules/filters/mod_deflate.c\n注:/home/zhangyan/software/httpd-2.0.59/为Apache源码路径。\u003c/p\u003e\n\u003cp\u003e3、进行以上步骤后,会在httpd.conf中自动加入一行:(Windows版请将下行最前面的#号去掉)\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eLoadModule deflate_module modules/mod_deflate.so\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e4、 编辑httpd.conf,增加:\nLinux版: …\u003c/p\u003e"
April 7, 2010
Apache 网站访问速度提升优化
"\u003cp\u003e在 [Yahoo][1] \u003cstrong\u003e开 发者\u003c/strong\u003e网站上,Yahoo 提出了 \u003ca href=\"http://developer.yahoo.com/performance/rules.html\"\u003e优 化网站性能的N条规则(Best Practices for Speeding Up Your Web Site)\u003c/a\u003e。这些规则是:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e尽可能的减少 HTTP 的请求数(Minimize HTTP Requests) —— Tag: content\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e使用 CDN(Use a Content Delivery Network) —— Tag: server\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e添加 Expires 头(或者 Cache-control ) (Add an Expires or a Cache-Control Header) —— Tag: server\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGzip 组件(Gzip Components) —— Tag: server\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e将 CSS 样式放在页面的上方 (Put Stylesheets at the Top) —— Tag: css\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e将脚本移动到底部(包括内联的)(Put Scripts at the Bottom) —— Tag: javascript\u003c/p\u003e"
April 7, 2010
apache中对设置网页的Expires头-seo篇
"\u003cp\u003e平时我用一般用Yslow这个ff下的插件来检查网页的好坏,其中有一项为添加文件过期头.\u003c/p\u003e\n\u003cp\u003e实施这一方法将节省你难以置信数额的带宽,极大地加快你的网站为你的网站访客。基本上,对于图片,CSS , JavaScript以及其他文件可以通过优化更快的下载,告诉你的网站访问者快取记忆体,为他们在某一段时间内。默认的行为是每一次请求检查文件的 last-modified 和/或者 Etag headers。\n所以一个用户去/home/index.html,及浏览器缓存所有图象和文件。然后用户离开网站稍后回来,与浏览器发送If-Modified- Since 有条件的GET 请求为每一个缓存的项目时,基本上看,如果文件已被改变和他们必须更新他们的缓存。\u003c/p\u003e\n\u003cp\u003e当你执行在这篇文章中所述的缓存方法,你可以指定某文件或扩展名被缓存为某一特定数额的时间。这些文件然后缓存在你的网站访客和他们不发送If- Modified-Since头直到设置的缓存时间已经到了。\n#================================================= …\u003c/p\u003e"
April 6, 2010
FreeBSD 配置知识点
"\u003cp\u003e**1、/boot/**\u003cstrong\u003eloader.conf 配置内容\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eautoboot_delay = “2” 设置启动等待时间\u003c/p\u003e\n\u003cp\u003ebeastie_disable=“YES” 关闭小恶魔图像启动菜单\u003c/p\u003e\n\u003cp\u003esplash_bmp_load = “NO” 启动图像\u003c/p\u003e\n\u003cp\u003esplash_pcx_olad = “NO”\u003c/p\u003e\n\u003cp\u003evesa_load = “NO”\u003c/p\u003e\n\u003cp\u003ebitmap_load = “NO”\u003c/p\u003e\n\u003cp\u003ebitmap_name = “splash.bmp”\u003c/p\u003e\n\u003cp\u003ebitmap_type = “splash_image_data”\u003c/p\u003e\n\u003cp\u003escreensave_load = “NO” 屏幕保护\u003c/p\u003e\n\u003cp\u003escreensave_name = “green_saver”\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2、rc.conf配置内容\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003esendmail_enable = “NONE” 关闭sendmail服务\u003c/p\u003e\n\u003cp\u003esendmail_submit_enable = “NO”\u003c/p\u003e\n\u003cp\u003esendmail_outbound_enable = “NO”\u003c/p\u003e\n\u003cp\u003esendmail_msp_queue_enable = “NO”\u003c/p\u003e\n\u003cp\u003eclear_tmp_enable = “YES” 按时清除/var/tmp …\u003c/p\u003e"
April 6, 2010
关闭freebsd系统里的启动菜单
"\u003cp\u003eSet follow setting in /boot/loader.conf file:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e代码:\u003c/strong\u003e\nbeastie_disable=”YES”\u003c/p\u003e\n\u003cp\u003e更多详细请参考 \u003ca href=\"http://blog.haohtml.com/index.php/archives/3292\"\u003ehttp://blog.haohtml.com/index.php/archives/3292\u003c/a\u003e\u003c/p\u003e"
April 6, 2010
自动检测系统服务状态,如失败则自动重启
"\u003cp\u003e服务器上安装了一个服务,但总是时不时的出现问题,服务就自动自闭了,需要手动重启才可以的,可以通过下面的设置解决此问题,打开”管理工具”里的”服务”项,查看”属性”里的”恢复”顶,按照下面设置一下就可以了:\n如图所示设置即可。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2010/04/windows_services_restart.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/04/windows_services_restart.jpg\" alt=\"windows_services_restart\"\u003e\u003c/a\u003e\u003c/p\u003e"
April 3, 2010
IBM X335 RAID1-IBM服务器做RAID备份
"\u003cp\u003e如何使用LSI配置RAID1\nX服务器中有一些集成LSI SCSI控制器的机型,在开机自检时按CTRL C可以配置两个硬盘的镜像。但是当升级BIOS之后,CTRL C中的一些设置发生了变化,配置方法也较以前的版本有些差异。\n新版本的配置步骤:\u003c/p\u003e\n\u003cp\u003e1.启动服务器,在自检过程中按CTRL C键,进入到菜单(双通道LSI控制器)\u003c/p\u003e\n\u003cp\u003e2.选择硬盘所在SCSI通道回车\u003c/p\u003e\n\u003cp\u003e3.选择,回车。\u003c/p\u003e\n\u003cp\u003e4.发现两个硬盘,选择一个为主盘,在按减号。\u003c/p\u003e\n\u003cp\u003e5.系统提示按F3保存磁盘的数据,按Delete删除磁盘上的数据。如果这个磁盘上有操作系统,一定要选择F3.完成之后下面的[No]变成[Yes].\u003c/p\u003e\n\u003col start=\"6\"\u003e\n\u003cli\u003e在第二个磁盘上[No]的位置按减号:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e7.系统警告这个磁盘上的信息会丢失,按DELETE删除这个磁盘上的所有数据,或者按任意键取消。按DELETE,第二个磁盘的[No]也会变成[Yes],重启系统,开始同步磁盘。\n旧版本\u003c/p\u003e\n\u003cp\u003e1) 重启主机 按 CTRL-C 进入配置菜单 ,光标放在第一个通道上,按继续\u003c/p\u003e\n\u003cp\u003e2) 选择 DEVICE PROPERTIES 可发现硬盘,按回到前一菜单\u003c/p\u003e\n\u003cp\u003e3) 选择 MIRRORING …\u003c/p\u003e"
April 2, 2010
FreeBSD7.0安装JDK1.6的方法
"\u003cp\u003e开始到sun公司的网站上去看,sun只提供Linux和windows的JDK下载。\u003c/p\u003e\n\u003cp\u003e在网上搜索freebsd和jdk大多是让freebsd开启linux软件的支持,然后安装linux下jdk,毕竟freebsd与Linux 还是去区别\u003c/p\u003e\n\u003cp\u003e后来,只好从http://www.freebsdfoundation.org/downloads/java.shtml下载diablo-caffe-freebsd6-i386-1.5.0_07-b01.tar.bz2\n放到 /usr/ports/distfiles目录下\u003c/p\u003e\n\u003cp\u003e然后\u003c/p\u003e\n\u003cp\u003ecd /usr/ports/java/diablo-jdk16\nmake config //取消选项要不通不过\nmake install clean ; rehash\u003c/p\u003e\n\u003cp\u003e改一下目录名\u003c/p\u003e\n\u003cp\u003ecd /usr/local\nmv diablo-jdk1.6.0 jdk1.6\u003c/p\u003e\n\u003cp\u003e设置环境变量\u003c/p\u003e\n\u003cp\u003esetenv JAVA_HOME /usr/local/jdk16\nsetenv path $JAVA_HOME/bin\u003c/p\u003e"
April 2, 2010
ttl expired in transit
"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e1)TTL值太小!TTL值小于你和对方主机之间经过的路由器数目。\n\n2)路由器数量太多,经过路由器的数量大于TTL值\n\n3)网络存在环路\n\n用 TRACERT命令查看所经过的路由\n\n#tracert 域名或者ip\n\u003c/code\u003e\u003c/pre\u003e"
April 2, 2010
网站压力测试工具webbench简介、安装、使用【原创】
"\u003cp\u003e本文作者原创,版权归查看有关“集思博客”的文章”\u0026gt;集思博客所有,转载请注明链接: \u003ca href=\"http://gisblogs.net/article/09-05/266.html\"\u003ehttp://gisblogs.net/article/09-05/266.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e一直在寻找一款有效的网站压力测试”的文章”\u0026gt;网站压力测试工具,今天试用了webbench之 后,感觉非常满意,特地于大家分享。\u003c/p\u003e\n\u003cp\u003e一、webbench简介\u003c/p\u003e\n\u003cp\u003eWebbench是有名的网站压力测试工具,它是由 Lionbridge公司( \u003ca href=\"http://www.lionbridge.com\"\u003ehttp://www.lionbridge.com\u003c/a\u003e)开发。它的帮助文件和文档请到: \u003ca href=\"www.webbench.com\"\u003ewww.webbench.com\u003c/a\u003e 上查看。\nWebbech能测试处在相同硬件上,不同服务的性能以及不同硬件上同一个服务的运行状况。webBech的标准测试可以向我们展示服务器的 两项 内容:每秒钟相应请求数和每秒钟传输数据量。webbench不但能具有便准静态页面的测试能力,还能对动态页面(ASP,PHP,JAVA,CGI)进 行测试的能力。还有就是他支持对含有SSL的安全网站例如电子商务网站进行静态或动态的性能测试。\u003c/p\u003e\n\u003cp\u003e二、webbench安装\u003c/p\u003e\n\u003cp\u003e(1) 在FreeBSD下的用Ports安装方法: …\u003c/p\u003e"
April 2, 2010
在FreeBSD下安装cUrl
"\u003cp\u003eBefore we download the ports collection lets install \u003cstrong\u003ecurl\u003c/strong\u003e, a very useful tool that will help us download the ports archive itself. We do this using the \u003cstrong\u003epkg_add\u003c/strong\u003e command.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# pkg_add -r curl\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eAs simple as that. The previous command should download the packages from the remote repo (the -r option stands for “remote”) and install them. If everything goes according to plan you should output that resembles the following:\u003c/p\u003e"
April 2, 2010
curl使用简介
"\u003cp\u003e\u003cstrong\u003ecurl网站开发指南\u003c/strong\u003e:\u003c/p\u003e\n\u003cp\u003eCurl是一个很强大的http命令行工具,其功能十分强大。\u003c/p\u003e\n\u003cp\u003e在FreeBSD下的安装教程参考这里: \u003ca href=\"http://blog.haohtml.com/index.php/archives/3242\"\u003ehttp://blog.haohtml.com/index.php/archives/3242\u003c/a\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e二话不说,先从这里开始吧!\n$ curl \u003ca href=\"http://www.yahoo.com\"\u003ehttp://www.yahoo.com\u003c/a\u003e\n回车之后,www.yahoo.com 的html就稀里哗啦地显示在屏幕上了 ~\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e嗯,要想把读过来页面存下来,是不是要这样呢?\n$ curl \u003ca href=\"http://www.yahoo.com\"\u003ehttp://www.yahoo.com\u003c/a\u003e \u0026gt; page.html\n当然可以,但不用这么麻烦的!\n用curl的内置option就好,存下http的结果,用这个option: -o\n$ curl -o page.html \u003ca href=\"http://www.yahoo.com\"\u003ehttp://www.yahoo.com\u003c/a\u003e\n这样,你就可以看到屏幕上出现一个下载页面进度指示。等进展到100%,自然就 OK咯\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e什么什么?!访问不到?肯定是你的proxy没有设定了。\n使用curl的时候,用这个option可以指定http访问所使用的proxy服务器及其端口: -x\n$ curl -x …\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e"
April 2, 2010
使用Nginx作为Web服务器的国内网站[原创]
"\u003cp\u003e[文章作者:张宴 本文版本:v1.1 最后修改:2008.06.19 转载请注明原文链接: \u003ca href=\"http://blog.s135.com/post/352/\"\u003ehttp://blog.s135.com/post/352/\u003c/a\u003e]\u003c/p\u003e\n\u003cp\u003eNginx \u003ca href=\"http://blog.s135.com/read.php/351.htm\"\u003e超越Apache的高性能和稳定性\u003c/a\u003e,使得国内使用 Nginx 作为 Web 服务器的网站也越来越多,其中有新浪、网易、腾讯等门户网站,六间房、酷6等视频分享网站,Discuz!、水木社区等知名论坛,豆瓣、YUPOO等新兴Web 2.0网站。\u003c/p\u003e\n\u003cp\u003eNginx 在国内的应用正在不断发展壮大!\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、使用 Nginx 运行 PHP(FastCGI) 程序的网站:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1、六间房视频( \u003ca href=\"http://www.6.cn/\"\u003ehttp://www.6.cn/\u003c/a\u003e):nginx/0.6.14 + PHP\u003c/p\u003e\n\u003cp\u003e[root@new-host ~]# curl –head \u003ca href=\"http://6.cn/reg.php\"\u003ehttp://6.cn/reg.php\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eHTTP/1.0 200 OK\u003c/p\u003e\n\u003cp\u003eServer: nginx/0.6.14\u003c/p\u003e\n\u003cp\u003eDate: Wed, 18 Jun 2008 00:58:20 GMT\u003c/p\u003e\n\u003cp\u003eContent-Type: text/html\u003c/p\u003e\n\u003cp\u003eVary: Accept-Encoding\u003c/p\u003e\n\u003cp\u003eX-Cache: MISS from …\u003c/p\u003e"
April 1, 2010
找到一款不错的网站压力测试工具webbench[原创]
"\u003cp\u003ewebbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好,安装使用也特别方便。\u003c/p\u003e\n\u003cp\u003e1、适用系统:Linux\u003c/p\u003e\n\u003cp\u003e2、编译安装:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewget \u003ca href=\"http://blog.s135.com/soft/linux/webbench/webbench-1.5.tar.gz\"\u003ehttp://blog.s135.com/soft/linux/webbench/webbench-1.5.tar.gz\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003etar zxvf webbench-1.5.tar.gz\u003c/p\u003e\n\u003cp\u003ecd webbench-1.5\u003c/p\u003e\n\u003cp\u003emake \u0026amp;\u0026amp; make install\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e3、使用:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewebbench -c 500 -t 30 \u003ca href=\"http://127.0.0.1/test.jpg\"\u003ehttp://127.0.0.1/test.jpg\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e参数说明:-c表示并发数,-t表示时间(秒)\u003c/p\u003e\n\u003cp\u003e4、测试结果示例:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWebbench – Simple Web Benchmark 1.5\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eCopyright (c) Radim Kolar 1997-2004, GPL Open Source Software.Benchmarking: GET \u003ca href=\"http://127.0.0.1/test.jpg\"\u003ehttp://127.0.0.1/test.jpg\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e500 clients, running 30 sec. …\u003c/p\u003e"
April 1, 2010
我所熟悉的网站负载均衡技术[原创]
"\u003cp\u003e\u003cstrong\u003eDNS轮循\u003c/strong\u003e\nDNS轮循是指将相同的域名解释到不同的IP,随机使用其中某台主机的技术。但其具有明显 的缺点:一旦某个服务器出现故障,即使及时修改了DNS设置,还是要等待足够的时间(刷新时间)才能发挥作用,在此期间,保存了故障服务器地址的客户计算 机将不能正常访问服务器。DNS负载均衡采用的是简单的轮循负载算法,不能区分服务器的差异,不能反映服务器的当前运行状态,不能做到为性能较好的服务器 多分配请求,甚至会出现客户请求集中在某一台服务器上的情况。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eF5 BIG-IP\u003c/strong\u003e\n\u003ca href=\"http://blog.s135.com/attachment/200711/f5-big-ip.jpg\"\u003e\u003cimg src=\"http://blog.s135.com/attachment/200711/f5-big-ip.jpg\" alt=\"点击在新窗口中浏览此图片\"\u003e\u003c/a\u003e 简介:F5 Networks 公司的著名硬件负载均衡交换机。支持硬件四层、七层交换。不同的型号性能不同,BIG-IP 6400可以支持800万条并发连接,低一点型号的可以支持400万条以上的并发连接。性能极高,但价格也不菲。\n价格:BIG-IP 6400的价格在16万元人民币左右。\n网址: \u003ca href=\"http://www.f5.com.cn/\"\u003ehttp://www.f5.com.cn/\u003c/a\u003e(中国) \u003ca href=\"http://www.f5.com/\"\u003ehttp://www.f5.com/\u003c/a\u003e(全球)\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eLVS(Linux Virtual Server)\u003c/strong\u003e\n简介:软件四层交换。LVS是在Linux内核中 作四层交换,只花128个字节记录一个连 …\u003c/p\u003e"
April 1, 2010
Linux服务器系统监控框架与MSN、E-mail、手机短信报警的实现[原创]
"\u003cp\u003e[文章作者:张宴 本文版本:v1.0 最后修改:2008.06.25 转载请注明原文链接: \u003ca href=\"http://blog.s135.com/read.php/354.htm\"\u003ehttp://blog.s135.com/read.php/354.htm\u003c/a\u003e]\u003c/p\u003e\n\u003cp\u003e最近,在我原有的“Linux服务器系统监控程序”基础上,完善了HTTP、TCP、MySQL主动监控与MSN、E-mail、手机短信报警。监控程 序以shell和PHP程序编写,以下为主要框架与部分代码:\u003c/p\u003e\n\u003cp\u003e一、系统监控接口程序(interface.php)具有的报警方式\n1、MSN实时报警\n①、监控程序每次检测到故障存在、或者故障恢复,都会发送短消息到管理员的MSN。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.s135.com/attachment/200806/server_monitor1.png\"\u003e\u003cimg src=\"http://blog.s135.com/attachment/200806/server_monitor1.png\" alt=\"点击在新窗口中浏览此图片\"\u003e\u003c/a\u003e\u003ca href=\"http://blog.s135.com/attachment/200806/server_monitor2.png\"\u003e\u003cimg src=\"http://blog.s135.com/attachment/200806/server_monitor2.png\" alt=\"点击在新窗口中浏览此图片\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e发送MSN短消息用了一个PHP类: \u003ca href=\"http://www.fanatic.net.nz/2005/02/15/send-a-message-using-php/\"\u003esendMsg\u003c/a\u003e,使用该PHP类发消息,必须将发送、接收双方的MSN加为联系人,发送中文时,先用iconv 将字符集转为UTF-8:\u003c/p\u003e\n\u003cp\u003e引用\u003c/p\u003e\n\u003cp\u003e$sendMsg-\u0026gt;sendMessage(iconv(“GBK”, “UTF-8”, $message), ‘Times New Roman’, ‘008000’);\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e2、 手机短信报警\n①、工作日早上10点之前,晚上6点之后,以及周六、周日,监控程序检测到故障,会调用手机 …\u003c/p\u003e"
April 1, 2010
使用Nginx轻松实现开源负载均衡──9 月20日在ChinaUnix技术沙龙上的演讲PPT[原创]
"\u003cp\u003e[文章作者:张宴 本文版本:v1.0 最后修改:2008.09.21 转载请注明原文链接: \u003ca href=\"http://blog.s135.com/post/369/\"\u003ehttp://blog.s135.com/post/369/\u003c/a\u003e]\u003c/p\u003e\n\u003cp\u003e9月20日下午,我应邀参加了 \u003ca href=\"http://www.chinaunix.net/\"\u003eChinaUnix\u003c/a\u003e 举办的以“如何搞定服务器负载均衡?”为主题的技术沙龙( \u003ca href=\"http://linux.chinaunix.net/bbs/thread-1019366-1-1.html\"\u003ehttp://linux.chinaunix.net/bbs/thread-1019366-1-1.html\u003c/a\u003e), 很高兴能够跟诸多业界精英一起探讨交流,很荣幸能够与Unix资深系统工程师──田逸、HonestQiao,以及F5资深技术工程师──杨明非,同台演 讲。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/04/chinaunix.gif\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/04/chinaunix.gif\" alt=\"chinaunix\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e《使用Nginx轻松实现开源负载均衡》是我的演讲PPT(PowerPiont),现提供下载。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePPT分为四个 部分:\u003c/strong\u003e\n1、介绍Nginx的基本特征,以及使用Nginx做负载均衡器的理由。\u003c/p\u003e\n\u003cp\u003e2、用实例,来介绍 Nginx负载均衡在大型网站的典型应用。\u003c/p\u003e\n\u003cp\u003e3、以实现网站动静分离为原型,对NetScaler硬件七层负载均衡和Nginx软件负 载均衡做一个对比。\u003c/p\u003e\n\u003cp\u003e①、NetScaler负载均衡交换机动静分离系统架构图\n\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/04/netscaler_lb.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/04/netscaler_lb.png\" alt=\"netscaler_lb\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e②、Nginx …\u003c/p\u003e"
April 1, 2010
Nginx 简单的负载均衡配置示例[原创]
"\u003cp\u003e\u003ca href=\"http://www.s135.com/\"\u003ewww.s135.com\u003c/a\u003e 和 blog.s135.com 域名均指向 Nginx 所在的服务器IP。\u003c/p\u003e\n\u003cp\u003e用户访问 \u003ca href=\"http://www.s135.com/\"\u003ehttp://www.s135.com\u003c/a\u003e,将其负载均 衡到192.168.1.2:80、192.168.1.3:80、192.168.1.4:80、192.168.1.5:80四台服务器。\u003c/p\u003e\n\u003cp\u003e用户访问 \u003ca href=\"http://blog.s135.com/\"\u003ehttp://blog.s135.com\u003c/a\u003e, 将其负载均衡到192.168.1.7服务器的8080、8081、8082端口。\u003c/p\u003e\n\u003cp\u003e以下为配置文件nginx.conf:\u003c/p\u003e\n\u003cp\u003e引用\u003c/p\u003e\n\u003cp\u003euser www www;\u003c/p\u003e\n\u003cp\u003eworker_processes 10;\u003c/p\u003e\n\u003cp\u003e#error_log logs/error.log;\u003c/p\u003e\n\u003cp\u003e#error_log logs/error.log notice;\u003c/p\u003e\n\u003cp\u003e#error_log logs/error.log info;\u003c/p\u003e\n\u003cp\u003e#pid logs/nginx.pid;\u003c/p\u003e\n\u003cp\u003e#最大文件描述 符\u003c/p\u003e\n\u003cp\u003eworker_rlimit_nofile 51200;\u003c/p\u003e\n\u003cp\u003eevents\u003c/p\u003e\n\u003cp\u003e{\u003c/p\u003e\n\u003cp\u003euse epoll;\u003c/p\u003e\n\u003cp\u003eworker_connections 51200;\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003ehttp\u003c/p\u003e\n\u003cp\u003e{ …\u003c/p\u003e"
April 1, 2010
Nginx+PHP+MySQL双机互备、全自动切换方案 [原创]
"\u003cp\u003e[文章作者:张宴 本文版本:v1.0 最后修改:2008.11.19 转载请注明原文链接: \u003ca href=\"http://blog.s135.com/post/379/\"\u003ehttp://blog.s135.com/post/379/\u003c/a\u003e]\u003c/p\u003e\n\u003cp\u003e在生产应用中,某台“Nginx+PHP+MySQL”接口数据服务器,扮演的角色十分重要,如果服务器硬件或Nginx、MySQL发生故障,而短时 间内无法恢复,后果将非常严重。为了避免单点故障,我设计了此套方案,编写了failover.sh脚本,实现了双机互备、全自动切换,故障转移时间只需 几十秒。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、双机互备、全自动切换方案:\u003c/strong\u003e\n\u003cstrong\u003e1、拓扑图:\u003c/strong\u003e\n\u003ca href=\"http://blog.s135.com/attachment/200811/nginx_php_mysql_ha.png\"\u003e\u003cimg src=\"http://blog.s135.com/attachment/200811/nginx_php_mysql_ha.png\" alt=\"点击在新窗口中浏览此图片\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2、解释:\u003c/strong\u003e\n(1)、假设外网域名blog.s135.com解析到外网虚拟IP 72.249.146.214上,内网hosts设置db10对应内网虚拟IP 192.168.146.214\u003c/p\u003e\n\u003cp\u003e(2)、默认情况 下,由主机绑定内、外网虚拟IP,备机作为备份,当主机的MySQL、Nginx或服务器出现故障无法访问时,备机会自动接管内、外网虚拟IP。两台服务 器都启动负责监控、自动切换虚拟IP的守护进程/usr/bin/nohup /bin/sh …\u003c/p\u003e"
April 1, 2010
修改phpMyAdmin使其能够管理多台远程MySQL 服务器[转载]
"\u003cp\u003e[文章作者:张宴 本文版本:v1.2 最后修改:2007.07.09 转载请注明出处: \u003ca href=\"http://blog.s135.com/\"\u003ehttp://blog.s135.com\u003c/a\u003e]\u003c/p\u003e\n\u003cp\u003e需 求背景:\nphpMyAdmin是一款不错的MySQL在线管理工具,但phpMyAdmin的cookie登录方式只能输入MySQL数据库 的用户名和密码,而想更改MySQL服务器地址和端口则须修改其配置文件config.default.php。当拥有多台数据库服务器,每台服务器又在 不同端口启动了多个MySQL服务,每次都修改配置文件就显得很麻烦,因此需要能够在登录界面直接输入MySQL服务器地址和端口的功能。\u003c/p\u003e\n\u003cp\u003e功 能要求:\n假设phpMyAdmin的访问网址为 \u003ca href=\"http://192.168.1.25/phpmyadmin/\"\u003ehttp://192.168.1.25/phpmyadmin/\u003c/a\u003e,能够通过输入MySQL服务器地址、端口、 用户名、密码登录远程MySQL服务器,对远程数据库进行管理。\u003c/p\u003e\n\u003cp\u003e修改后的phpMyAdmin登录入口截图:\n\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/04/phpmyadmin2.10_index.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/04/phpmyadmin2.10_index.jpg\" alt=\"phpmyadmin2.10_index\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e下 载地址: \u003ca href=\"http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=1848024\"\u003ehttp://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=1848024\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e实 现步骤:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1、打开“路 …\u003c/strong\u003e\u003c/p\u003e"
April 1, 2010
MySQL数据库服务器在Flickr、Fotolog、 Wkipedia、Facebook等国际知名网站中的使用数量
"\u003cp\u003e2008年4月18日,在Alexa安排的一次“ \u003ca href=\"http://venublog.com/2008/04/16/notes-from-scaling-mysql-up-or-out/\"\u003eScaling MySQL — Up or Out?\u003c/a\u003e”的小组辩论中,MySQL、Sun、 Flickr、Fotolog、Wkipedia、Facebook、YouTube等国际知名网站的DBA们,对其网站MySQL数据库服务器、Web 服务器、缓存服务器的数量,MySQL版本,编程语言类型,操作系统类型等问题进行了回答。 \u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/04/mysql_number.gif\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/04/mysql_number.gif\" alt=\"mysql_number\"\u003e\u003c/a\u003e\u003c/p\u003e"
April 1, 2010
查看Apache并发请求数及其TCP连接状态[原创]
"\u003cp\u003e[文章作者:张宴 本文版本:v1.1 最后修改:2007.07.27 转载请注明出处: \u003ca href=\"http://blog.s135.com/\"\u003ehttp://blog.s135.com\u003c/a\u003e]\u003c/p\u003e\n\u003cp\u003e这两天搭建了一组Apache服务器,每台服务器4G内存,采用的是prefork模式,一开始设置的连接数太少了,需要较长的时间去响应用户的请求, 后来修改了一下Apache 2.0.59的配置文件httpd.conf:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1 id=\"prefork-mpm\"\u003eprefork MPM\u003c/h1\u003e\n\u003ch1 id=\"startservers-number-of-server-processes-to-start\"\u003eStartServers: number of server processes to start\u003c/h1\u003e\n\u003ch1 id=\"minspareservers-minimum-number-of-server-processes-which-are-kept-spare\"\u003eMinSpareServers: minimum number of server processes which are kept spare\u003c/h1\u003e\n\u003ch1 id=\"maxspareservers-maximum-number-of-server-processes-which-are-kept-spare\"\u003eMaxSpareServers: maximum number of server processes which are kept spare\u003c/h1\u003e\n\u003ch1 id=\"maxclients-maximum-number-of-server-processes-allowed-to-start\"\u003eMaxClients: maximum number of server processes allowed to start\u003c/h1\u003e\n\u003ch1 id=\"maxrequestsperchild-maximum-number-of-requests-a-server-process-servesstartservers-----10\"\u003eMaxRequestsPerChild: maximum number of requests a …\u003c/h1\u003e\u003c/blockquote\u003e"
April 1, 2010
清除指定squid缓存文件的脚本[原创]
"\u003cp\u003e官方教程:\u003c/p\u003e\n\u003cp\u003e[文章作者:张宴 本文版本:v1.0 最后修改:2007.08.02 转载请注明出处: \u003ca href=\"http://blog.s135.com/\"\u003ehttp://blog.s135.com\u003c/a\u003e]\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.squid-cache.org/\"\u003eSquid\u003c/a\u003e web缓存加速软件目前已经是新浪、搜狐、网易等各大网站广泛应用。Squid会在设置的缓存目录下建立多个目录,每一个目录下又建立多个目录,然后才在 最里层的目录中存放缓存文件(object)。squid会根据用户请求网页的URL进行哈希,生成缓存文件,存放在某一个目录中。squid启动之后, 将在内存中建立一个哈希表,记录硬盘中缓存文件配置的情形。\u003c/p\u003e\n\u003cp\u003e对于类似 \u003ca href=\"http://you.video.sina.com.cn/index.html\"\u003ehttp://you.video.sina.com.cn/index.html\u003c/a\u003e 之 类的网页,squid只会生成一个缓存文件。可以用squid附带的squidclient工具清除:\u003c/p\u003e\n\u003cp\u003e引用\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003esquidclient -m PURGE -p 80 “http://you.video.sina.com.cn/index.html”\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e而对于带有参数的网页,例如新浪播客的Flash …\u003c/p\u003e"
April 1, 2010
新浪发起的UNIX开源软件项目
"\u003cp\u003e\u003cstrong\u003eMemcachedb\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e协议: \u003ca href=\"http://www.opensource.org/licenses/bsd-license.php\"\u003eNew BSD License\u003c/a\u003e\n作者:stvchu, gary.caokai, forever.sky81\n团队:新浪互动社区事业部──博客产品\n网址: \u003ca href=\"http://www.memcachedb.org/\"\u003ehttp://www.memcachedb.org/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eMemcachedb = memcache + Berkeley DB\u003c/p\u003e\n\u003cp\u003eMemcachedb是一款支持高并发的分布式持久存储 系统,对任何原有memcached客户端来讲,它仍旧是个memcached,但是,它的数据是可以持久存储的。\n前端:memcached 的网络层\n后端:Berkeley DB存储\u003c/p\u003e\n\u003cp\u003e写速度:从本地服务器通过memcache客户端(libmemcache) set 2亿条16字节长的key,10字节长的Value的记录,耗时16572秒,平均速度12000条记录/秒。\n读速度:从本地服务 器通过memcache客户端(libmemcache) get 100万条16字节长的key,10字节长的Value的记录,耗时103秒,平均速度10000条记录/秒。\u003c/p\u003e\n\u003cp\u003e• 支持的memcache命令\nget, set, add, replace …\u003c/p\u003e"
April 1, 2010
dbcached──“分布式 key-value 数据库内存缓存系统”发布[原创]
"\u003cp\u003e前言:dbcached 1.0 beta* 在 Memcached 1.2.4 的基础上编写而成,也是我的第一个开源C项目。编写 dbcached 的目的是为了最大限度的发挥 Memcached 内存缓存的优势,便捷地维护 Memcached 服务器节点哈希列表,智能地支持 Memcached 故障转移,同时保证数据的持久化存储。\u003c/p\u003e\n\u003cp\u003edbcached\u003c/p\u003e\n\u003cp\u003e协议: \u003ca href=\"http://www.opensource.org/licenses/bsd-license.php\"\u003eNew BSD License\u003c/a\u003e\n作者:张宴\n网址: \u003ca href=\"http://code.google.com/p/dbcached/\"\u003ehttp://code.google.com/p/dbcached/\u003c/a\u003e \u003cstrong\u003edbcached 是什么?\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e● dbcached 是一款基于 Memcached 和 NMDB 的分布式 key-value 数据库内存缓存系统。\u003c/p\u003e\n\u003cp\u003e● \u003cstrong\u003edbcached = Memcached + 持久化存储管理器 + NMDB 客户端接口\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e● Memcached 是一款高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。\u003c/p\u003e\n\u003cp\u003e● NMDB 是一款多协议网络数据库(dbm类)管理器,它由内存缓存和磁盘存储两部分构成,使用 QDBM 或 Berkeley DB 作为后端数据库。\u003c/p\u003e\n\u003cp\u003e● …\u003c/p\u003e"
April 1, 2010
百度、新浪、Mixi、Apache社区赞助的开源 key-value分布式存储系统[原创]
"\u003cp\u003e[文章作者:张宴 本文版本:v1.0 最后修改:2009.01.21 转载请注明原文链接: \u003ca href=\"http://blog.s135.com/post/394/\"\u003ehttp://blog.s135.com/post/394/\u003c/a\u003e]\u003c/p\u003e\n\u003cp\u003ekey-value分布式存储系统查询速度快、存放数据量大、支持高并发,非常适合通过主键进行查询,但不能进行复杂的条件查询。如果辅以Real- Time Search Engine(实时搜索引擎)进行复杂条件检索、全文检索,就可以替代并发性能较低的MySQL等关系型数据库,达到高并发、高性能,节省几十倍服务器数 量的目的。以MemcacheDB、Tokyo Tyrant为代表的key-value分布式存储,在上万并发连接下,轻松地完成高速查询。而MySQL,在几百个并发连接下,就基本上崩溃了。\u003c/p\u003e\n\u003cp\u003e虽然key-value分布式存储具有极高的性能,但是只能做类似于MySQL的SELECT * FROM table WHERE id = 123;简单主键查询。\u003c/p\u003e\n\u003cp\u003e“搜索索引引擎+key-value分布式存储”能够实现高并发的复杂条件查询、全文检索与数据显示。但是, 由于索引更新需要时间,目前还不能实现完全意义上的Real-Time …\u003c/p\u003e"
April 1, 2010
使用Nginx的proxy_cache缓存功能取代Squid[转载]
"\u003cp\u003e[文章作者:张宴 本文版本:v1.2 最后修改:2009.01.12 转载请注明原文链接: \u003ca href=\"http://blog.s135.com/nginx_cache/\"\u003ehttp://blog.s135.com/nginx_cache/\u003c/a\u003e]\u003c/p\u003e\n\u003cp\u003eNginx从0.7.48版本开始,支持了类似Squid的缓存功能。这个缓存是把URL及相关组合当作Key,用md5编码哈希后保存在硬盘上,所以 它可以支持任意URL链接,同时也支持404/301/302这样的非200状态码。虽然目前官方的Nginx Web缓存服务只能为指定URL或状态码设置过期时间,不支持类似Squid的PURGE指令,手动清除指定缓存页面,但是,通过一个第三方的Nginx 模块,可以清除指定URL的缓存。\u003c/p\u003e\n\u003cp\u003eNginx的Web缓存服务主要由proxy_cache相关指令集和fastcgi_cache 相关指令集构成,前者用于反向代理时,对后端内容源服务器进行缓存,后者主要用于对FastCGI的动态程序进行缓存。两者的功能基本上一样。\u003c/p\u003e\n\u003cp\u003e最新的Nginx 0.8.32版本,proxy_cache和fastcgi_cache已经比较完善,加上第三方的ngx_cache_purge模块(用于清除指定 URL的缓存), …\u003c/p\u003e"
April 1, 2010
《Squid中文权威手册》
"\u003cp\u003eSquid是一个缓存Internet数据的高性能代理服务器软件。当一个用户想要访问一个网页或下载一个文件时,会首先向Squid发出访问请求, 由Squid代替其进行网页或文件下载,Squid在把该网页或文件传给用户的同时会在本机保留一个缓存备份。当别的用户访问同样的网页时,Squid会 把保存的网页备份立即传给用户,使用户觉得速度相当快,同时也降低了后端数据来源Web服务器的压力。Squid可以代理HTTP、FTP、 GOPHER、SSL和WAIS协议,暂不能代理POP3、NNTP等协议。Squid可以工作在很多操作系统中,如AIX、Digital、Unix、 FreeBSD、HP-UX、Irix、Linux、NetBSD、Nextstep、SCO、Solaris、OS/2等。\u003c/p\u003e\n\u003cp\u003e目前 Squid已经在新浪、搜狐、网易、腾讯等各大门户网站广泛使用,成为必不可少的服务器软件之一。\u003c/p\u003e\n\u003cp\u003e《Squid中文权威手册》由 Squid创始人 Duane Wessels 所著的英文版《Squid: The Definitive Guide》翻译而来,其译者曾在新浪、网易工作过。\u003c/p\u003e\n\u003cp\u003e在线版: …\u003c/p\u003e"
March 31, 2010
apache下启用二级域名泛解析,实现博客功能
"\u003cp\u003ehttpd_vhosts.conf文件内容\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eDocumentRoot “d:/site/papake.cn”\nDirectoryIndex index.htm index.php\u003c/p\u003e\n\u003cp\u003eOptions Indexes MultiViews\nAllowOverride None\norder allow,deny\nAllow from all\nOptions FollowSymLinks Includes\u003c/p\u003e\n\u003cp\u003eRewriteEngine on\nRewriteLog logs/re.log\nRewriteLogLevel 1\nRewriteCond %{HTTP_HOST} ^[a-zA-Z0-9-]+.papake.cn$\nRewriteCond %{HTTP_HOST} !^(www).papake.cn$\nRewriteRule ^/?$ /%{HTTP_HOST} [NC]\nRewriteRule ^/([a-zA-Z0-9-]+).papake.cn/?$ \u003ca href=\"http://www.papake.cn/$1\"\u003ehttp://www.papake.cn/$1\u003c/a\u003e [P,L]\u003c/p\u003e\n\u003cp\u003eRewriteLog …\u003c/p\u003e\u003c/blockquote\u003e"
March 27, 2010
PHP安全配置详解
"\u003cp\u003ePHP勿庸置疑是非常强大的服务器端脚本语言,但是强大的功能总是伴随着重大的危险, 在这章里,你将学习到使用PHP的安全模式来阻止一些PHP潜在的危险因素。\n【 安全模式 】\u003c/p\u003e\n\u003cp\u003ePHP的安全模式提供一个基本安全的共享环境,在一个有多个用户帐户存在的PHP开放的Web服务器上。当一个Web服务器上运行的PHP打开了安全模 式,那么一些函数将被完全的禁止,并且会限制一些可用的功能。\u003c/p\u003e\n\u003cp\u003e[ 使用安全模式来强制限制 ]\n在安全模式下,一些尝试访问文 件系统的函数功能将被限制。运行Web服务器用户ID,如果想要操作某个文件,则必须拥有该文件读取或者写入的访问权限,实现这个限制功能对于PHP来说 是没有问题的。\u003c/p\u003e\n\u003cp\u003e在 安全模式开启的时候,尝试读取或者写入一个本地文件的时候,PHP将检查当前访问用户是否是该目标文件的所有者。如 果不是所有者,则该操作会被禁止。(写 入权限:在较低级别的文件访问权限下,可能会允许读取或者写入系统操作系统的文件,通过PHP的安全模式实现了防止你操作 另外一个用户文件的操作。当然, 一个Web服务器可能能够访问一个具有全局写入权限的任意文件。)\u003c/p\u003e\n\u003cp\u003e当安全模式打开的时候,以下函数列 …\u003c/p\u003e"
March 23, 2010
把不带前缀的域名转向到www.域名的Apache 301转向配置样例
"\u003cp\u003e各种不同的域名地址对于搜索引擎的除重(deduplication)来说是一个负担,有没有”/”和首页的文件连接,一个域名首页就可以有6个地址:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.haohtml.com/\"\u003ewww.haohtml.com/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003ehaohtml.com/\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.haohtml.com\"\u003ewww.haohtml.com\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003ehaohtml.com\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.haohtml.com/index.php\"\u003ewww.haohtml.com/index.php\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003ehaohtml.com/index.php\u003c/p\u003e\n\u003cp\u003e如果加上一些参数,比如用于来源跟踪等还会有更多无穷无尽的地址。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.haohtml.com/?source=foobar\"\u003ewww.haohtml.com/?source=foobar\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e所以搜索引擎鼓励发布者 \u003ca href=\"http://www.googlechinawebmaster.com/2007/11/seourl.html\"\u003e把URL标准化\u003c/a\u003e(归一化)。首先就是域名的归一化,原先我的设置为: \u003ca href=\"https://www.haohtml.com\"\u003ewww.haohtml.com\u003c/a\u003e / haohtml.com为别名。现在改为haohtml.com 301转向到www.haohtml.com\u003c/p\u003e\n\u003cp\u003eServerName haohtml.com\u003c/p\u003e\n\u003cp\u003eRewriteEngine on\u003c/p\u003e\n\u003cp\u003eRewriteRule ^(.*)$ \u003ca href=\"http://www.haohtml.com\"\u003ehttp://www.haohtml.com\u003c/a\u003e$1 [R=301,L]\u003c/p\u003e\n\u003cp\u003e如果没有mod_rewrite也可以设置mod_alias:\u003c/p\u003e\n\u003cp\u003eRedirectMatch 301 …\u003c/p\u003e"
March 17, 2010
windows 2003自带的FTP的设置?
"\u003cp\u003ewindows 2003自带的FTP(iis里)如何设置?打开 \u003cstrong\u003eInternet信息服务(IIS)管理器\u003c/strong\u003e (如下图)\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/ms_ftp_1.gif\" alt=\"ms_ftp_1\"\u003e][1]\u003c/p\u003e\n\u003cp\u003e可以看到 \u003cstrong\u003eInternet信息服务(IIS)管理器\u003c/strong\u003e 中已经出现了 \u003cstrong\u003eFTP站点\u003c/strong\u003e 菜单(如下图)\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/ms_ftp_2.gif\" alt=\"ms_ftp_2\"\u003e][2]\u003c/p\u003e\n\u003cp\u003e单击 \u003cstrong\u003eFTP站点\u003c/strong\u003e ,右边呈现的是 相关数据和参数(如下图)\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/ms_ftp_31.gif\" alt=\"ms_ftp_3\"\u003e][3]\u003c/p\u003e\n\u003cp\u003e接着,我们来打开它的属性栏 ,右键单击它,单击\u003cstrong\u003e属性\u003c/strong\u003e(如下图)\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/ms_ftp_41.gif\" alt=\"ms_ftp_4\"\u003e][4]\u003c/p\u003e\n\u003cp\u003e选项卡 \u003cstrong\u003eFTP站点\u003c/strong\u003e 下,列出来相关参数,默认的FTP的TCP连接端口是21,这个一般不改它(如下图)\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/ms_ftp_5.gif\" alt=\"ms_ftp_5\"\u003e][5]\u003c/p\u003e\n\u003cp\u003e单击 \u003cstrong\u003e安全账户\u003c/strong\u003e 选项卡,下面可以勾选匿名,也可以添加用户账号,我们这里只是演示,所以不改它(如下图)\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/ms_ftp_6.gif\" alt=\"ms_ftp_6\"\u003e][6]\u003c/p\u003e\n\u003cp\u003e接下来,单击 \u003cstrong\u003e主目录\u003c/strong\u003e 设置修改我们这个ftp的指向访问目录,我们这里指向 F盘(如下图)\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/ms_ftp_7.gif\" alt=\"ms_ftp_7\"\u003e][7]\u003c/p\u003e\n\u003cp\u003e选择后,再单击\u003cstrong\u003e下一步(N)\u0026gt;\u003c/strong\u003e (如下图)\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/ms_ftp_8.gif\" alt=\"ms_ftp_8\"\u003e][8]\u003c/p\u003e\n\u003cp\u003e设置访问权限,读取 就是只能看里面内容,能下载,但不能上传;写入,就是可以看,下载,还有上传(如下图)\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/ms_ftp_9.gif\" alt=\"ms_ftp_9\"\u003e][9]\u003c/p\u003e\n\u003cp\u003e在你的电脑上打开FTP客户端软件,输入IP,您windows远程桌面的用户名和密码,就可以登录FTP了。 \u003c/p\u003e"
January 20, 2010
windows下合并分区-Acronis Partition Expert
"\u003cp\u003eAcronis Partition Expert ,使用软件的安装很简单,第一次安装之后,一般会提示重新启动电脑。重新启动后,桌面上会有一个快捷图标,运行Acronis Partition Expert ,初次使用,会提示使用的模式,一般我们推荐使用 manual模式,就是手动模式。\u003c/p\u003e\n\u003cp\u003e分区调整大小:这个软件调整分区大小是非常非常简单的。\u003c/p\u003e\n\u003cp\u003e第 一步:点击菜单Wizard(向导)下面的Increase Free Space(扩充硬盘空间),或者软件左上角有个Wizard板块,点击里面的Increase Free Space 。会出来一个向导窗口。如果你要增加C盘分区大小,你就选择C,总之,想增加哪个硬盘分区的大小,就选择哪个。\u003c/p\u003e\n\u003cp\u003e第二步,点击Next,然后出来一个图片,让你选择想从那个硬盘分区分出来空间,分给上一步选择要扩充分区容量的那个盘。当然,这一步,你要选择一个剩余空间大的硬盘。选择d或者e或者其他之后,被选中的就要分出空间了。点击下一步。\u003c/p\u003e\n\u003cp\u003e第三步,你可以随意调整C盘(第一步里面你要扩充的那个盘)的大小了,当然前提是能分出来那么多空间。\u003c/p\u003e\n\u003cp\u003e以 上步骤完成后,软件工具栏的那个小旗子图标,就 …\u003c/p\u003e"
January 20, 2010
chmod命令实例
"\u003cp\u003echown 修改文件和文件夹的用户和用户组属性\n1。要修改文件hh.c的所有者.修改为sakia的这个用户所有\nchown sakia hh.c\n这样就把hh.c的用户访问权限应用到sakia作为所有者\n2。将目录 /tmp/sco 这个目录的所有者和组改为sakia和组net\nchown -R sakia:net /tmp/sco\u003c/p\u003e\n\u003cp\u003echmod 修改文件和文件夹读写执行属性\n1。把hh.c文件修改为可写可读可执行\nchmod 777 hh.c\n要修改某目录下所有的文件属性为可写可读可执行\nchmod 777 *.*\n把文件夹名称与后缀名用*来代替就可以了。\n同理若是要修改所有htm文件的属性\nchmod 777 \u003cem\u003e.htm\n2。把目录 /tmp/sco修改为可写可读可执行\nchmod 777 /tmp/sco\n要修改某目录下所有的文件夹属性为可写可读可执行\nchmod 777 *\n把文件夹名称用\u003c/em\u003e来代替就可以了\n要修改/tmp/sco下所有的文件和文件夹及其子文件夹属性为可写可读可执行\nchmod -R 777 /tmp/sco\n可写 w=4\n可读 r=2\n可执行 x=1\n777就是拥有全 …\u003c/p\u003e"
January 20, 2010
用freebsd-update命令升级freebsd系统
"\u003cp\u003efreebsd-update — fetch and install binary updates to FreeBSD\u003c/p\u003e\n\u003cp\u003e描述:\nfreebsd-update 是FreeBSD系统用来撷取, 安装及取得binary update 的工具。要注意的是,这些update仅止于FreeBSD Release Engineering Team维护的版本.\n诸如: FreeBSD 6.1-RELEASE 或 FreeBSD 6.2-RC1 而非 FreeBSD 6.2-STABLE\nor FreeBSD 7.0-CURRENT 之类的版本.\n补充: FreeBSD 6.2-RELEASE版本后才有此指令\u003c/p\u003e\n\u003cp\u003e语法:\nfreebsd-update [-b basedir] [-d workdir] [-f conffile] [-k KEY]\n[-r newrelease] [-s server] [-t address] command\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e参数:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e-b basedir 指定系统挂载的最基本路径 (预设: / )\u003c/p\u003e\n\u003cp\u003e-d workdir 档案暂存数据夹 (预设: …\u003c/p\u003e\u003c/blockquote\u003e"
January 13, 2010
freebsd挂载硬盘
"\u003cp\u003e\u003cstrong\u003e第一种方法:使用 sysinstall\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在使用 sysinstall 来设定新的硬盘之前,请先确定您是以 root 身份执行。接下来,您就可以依照下列步骤来新增硬盘:\u003c/p\u003e\n\u003cp\u003e进入 sysinstall\u003c/p\u003e\n\u003cp\u003e进入 sysinstall 的主选单后,首先请选择 [Configure],进入后,再选择 [Fdisk] 项目以进入 Fdisk 选单。第一次进入 Fdisk 时,sysinstall 会要求您选择所要设定的硬盘,请选择 ad1。\u003c/p\u003e\n\u003cp\u003e使用 Fdisk\u003c/p\u003e\n\u003cp\u003e相信您对于 Fdisk 的画面应该很熟悉,我们在安装 FreeBSD 时就使用过它。如果您要让 FreeBSD 使用整个硬盘,请按 [A],接下来请按 [W] 以将设定写入硬盘。在按了 [W] 后,会出现一个确认的窗口,选 [Yes] 即可。最后会出现要您选择所要使用的 Boot Manager,因为这一个硬盘不是要用来开机用的,所以我们选 [None]。写入后,请按 [Q] 离开 Fdisk 的画面,并回到 Configure 画面。接着请离开 sysinstall,再重新执行 sysinstall 以让 sysinstall 重新侦测硬盘设 …\u003c/p\u003e"
January 7, 2010
查看域名是否做反向解析的命令
"\u003cp\u003e查看反向解析是否成功,可用如下命令:nslookup –qt=ptr yourIP,从返回的信息中您可以看到反向解析的结果。\u003c/p\u003e\n\u003cp\u003enslookup –qt=ptr yourIP\u003c/p\u003e\n\u003cp\u003e比如我的域名是mailcenter.com.cn\n我的邮件服务器地址是: 61.144.222.5\n邮箱用户名称格式为username@mailcenter.com.cn\n在邮件服务器上设置邮件系统的HELO为:smtp.mailcenter.com.cn\u003c/p\u003e\n\u003cp\u003e邮件服务器IP为 :61.144.222.5\n找当地电信做61.144.222.这个IP反解析到smtp.mailcenter.com.cn\n在Windows系统中,在运行命令下 输入 cmd 再在打开的窗口输入 nslookup –qt=ptr 61.144.222.5\u003c/p\u003e\n\u003cp\u003e返回信息如下:\nC:\\Documents and Settings\\user\u0026gt;nslookup –qt=ptr 61.144.222.5\nServer: smtp.mailcenter.com.cn\nAddress: 61.144.222.5\u003c/p\u003e\n\u003cp\u003e说明这个IP的反向解析就是成功了。\u003c/p\u003e\n\u003cp\u003e返回信息 …\u003c/p\u003e"
December 24, 2009
windows下简单配置squid反向代理服务…
"\u003cp\u003e下载windwosNT版本的squid下载地址:\n\u003ca href=\"http://squid.acmeconsulting.it/download/squid-2.6.STABLE13-bin.zip\"\u003ehttp://squid.acmeconsulting.it/download/squid-2.6.STABLE13-bin.zip\u003c/a\u003e\n1.把squid-2.6.STABLE13-bin.zip解压缩,把里面的squid文件夹拷到c:\\下(squid默认的是c:\\squid)\n2.squid\\etc目录下把\nsquid.conf.default拷贝一份重新命名为squid.conf\ncachemgr.conf.default拷贝一份重新命名为cachemgr.conf\nmime.conf.default拷贝一份重新命名为mime.conf\n3.用文本编辑器打开squid.conf,需要修改的地方:\n找到http_port 3128在后面增加一行\nhttp_port 80 transparent\n找到#cache_peer sib2.foo.net sibling 3128 3130 [proxy-only]在后面增加一行\ncache_peer 192.168.1.8 parent 7001 0 no-query originserver\n …\u003c/p\u003e"
December 11, 2009
portaudit-Ports软件安全检测工具
"\u003cp\u003e简介:portaudit根据发布的安全数据库,来检测安装的ports是否存在安全漏洞。当把它安装上后,可以自动更新安全数据库,并且在每天的安全检测中输出相应报告。 可以检测安装的ports是否存在安全漏洞.\u003c/p\u003e\n\u003cp\u003e官方网站:http://people.freebsd.org/~eik/portaudit/\u003c/p\u003e\n\u003cp\u003eFreebsd上的Ports信息:\nPort: portaudit-0.5.9\u003c/p\u003e\n\u003cp\u003ePath: /usr/ports/security/portaudit\u003c/p\u003e\n\u003cp\u003eInfo: Checks installed ports against a list of security vulnerabilities\u003c/p\u003e\n\u003cp\u003eMaint: simon@FreeBSD.org\u003c/p\u003e\n\u003cp\u003eB-deps:\u003c/p\u003e\n\u003cp\u003eR-deps:\u003c/p\u003e\n\u003cp\u003eWWW: \u003ca href=\"http://people.freebsd.org/~eik/portaudit/\"\u003ehttp://people.freebsd.org/~eik/portaudit/\u003c/a\u003e\u003c/p\u003e"
December 11, 2009
portupgrade和portconf配合升级软件
"\u003cp\u003eportupgrade是不带参数的(可能有带参数的办法?我不知道),带参数编译ports我习惯\u003c/p\u003e\n\u003cp\u003ecd /usr/ports/ports-mgmt/portconfBSD\nmake install cleanBSD\u003c/p\u003e\n\u003cp\u003e然后在 /usr/local/etc/ports.conf 加入\u003c/p\u003e\n\u003cp\u003edatabases/mysql50*: WITH_XCHARSET=all | BUILD_OPTIMIZED=yes | WITHOUT_INNODB=yes\u003c/p\u003e\n\u003cp\u003e这样不管是直接在ports中make或者还是portupgrade都会取这里面的参数\n\u0011\n这样管理升级ports就很方便了\u003c/p\u003e"
December 11, 2009
如何通过ssh修改ip
"\u003cp\u003eQ:有些时候我们需要修改服务器的ip,但服务器又不在本地,只能ssh连接,这个时候怎么办哪?\u003c/p\u003e\n\u003cp\u003eA:/etc/rc.d/netif restart \u0026amp;\u0026amp; /etc/rc.d/routing restart\u003c/p\u003e\n\u003cp\u003e以下是freebsd下的相关命令:\u003c/p\u003e\n\u003cp\u003e#关闭网卡\nifconfig network-interface down\n#启动网卡\nifconfig network-interface up\n#查看尚未启动的网卡\nifconfig -d\n#查看已启动网卡\n#重启路由\n/etc/rc.d/routing restart\u003c/p\u003e"
December 11, 2009
Freebsd限定特定IP来使用ssh登录
"\u003cp\u003e法1.\u003c/p\u003e\n\u003cp\u003e#ee /etc/hosts.allow\u003c/p\u003e\n\u003cp\u003e在ALL : ALL : allow的前面加上\u003c/p\u003e\n\u003cp\u003esshd : your IP : allow\u003c/p\u003e\n\u003cp\u003esshd : ALL : deny\u003c/p\u003e\n\u003cp\u003e就OK了。\u003c/p\u003e\n\u003cp\u003e法2.\u003c/p\u003e\n\u003cp\u003e修改/etc/ssh/sshd_config\u003c/p\u003e\n\u003cp\u003e加入\u003c/p\u003e\n\u003cp\u003eAllowusers \u003ca href=\"mailto:admin@172.16.2.188\"\u003eadmin@172.16.2.188\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e意思为\u003c/p\u003e\n\u003cp\u003e只允许admin从172.16.2.188登陆\u003c/p\u003e\n\u003cp\u003e法3.\u003c/p\u003e\n\u003cp\u003e防火墙\u003c/p\u003e"
December 10, 2009
NTOP中文手册
"\u003cp\u003entop\n\u003cstrong\u003e参数s:\u003c/strong\u003e\n[@filename]\n[-a|–access-log-file ]\n[-b|–disable-decoders]\n[-c|–sticky-hosts]\n[-e|–max-table-rows]\n[-f|–traffic-dump-file file\u0026gt;]\n[-g|–track-local-hosts]\n[-h|–help]\n[-j|–create-other-packets]\n[-l|–pcap-log ]\n[-m|–local-subnets ]\n[-n|–numeric-ip-addresses]\n[-o|–no-mac]\n[-p|–protocols ]\n[-q|–create-suspicious-packets]\n[-r|–refresh-time ]\n[-s|–no-promiscuous]\n[-t|–trace-level ]\n[-x ]\n[-w|–http-server ]\n[-z|–disable-sessions]\n[-A|–set-admin-password password]\n[-B|–filter-expression …\u003c/p\u003e"
December 10, 2009
FreeBSD上的网络监控软件ntop安装运行
"\u003cp\u003e\u003cimg src=\"/wp-content/uploads/2009/12/freebsd-ntop.gif\" alt=\"freebsd-ntop\"\u003e\u003c/p\u003e\n\u003cp\u003eFreeBSD上的网络监控软件ntop的安装步骤如下:\u003c/p\u003e\n\u003cp\u003e1、将相关的ports升级。(cvsup或其他方式如Sub….等);\u003c/p\u003e\n\u003cp\u003e2、安装ntop\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003ch1 id=\"cd-usrportsnetntop\"\u003e\u003cstrong\u003ecd /usr/ports/net/ntop\u003c/strong\u003e\u003c/h1\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003ch1 id=\"make-install-clean\"\u003e\u003cstrong\u003emake install clean\u003c/strong\u003e\u003c/h1\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e#rehash\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e3、安装完成后,可以手工启动 ntop。即输入ntop,运行即可。\u003c/p\u003e\n\u003cp\u003e如果是第一次启动ntop,系统会提示,输入admin的口令;\u003c/p\u003e\n\u003cp\u003e或在/etc/rc.conf文件中加入 \u003cstrong\u003entop_enable=”YES”\u003c/strong\u003e 自动启动ntop;\u003c/p\u003e\n\u003cp\u003e4 、设置密码\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/usr/local/bin/ntop -u nobody -A\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e输入查看密码\u003c/p\u003e\n\u003cp\u003e以进程服务形式启用ntop\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/usr/local/bin/ntop -u nobody -d\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e5、此时可以用netstat -an 或 \u003cstrong\u003enetstat -an |grep 3000\u003c/strong\u003e 查看3000的端口在监听;\u003c/p\u003e\n\u003cp\u003e6、在浏览器中,输入http://\u003cem\u003e.\u003c/em\u003e.\u003cem\u003e.\u003c/em\u003e :3000既可以进入相应的ntop网络管理监控界面。\u003c/p\u003e"
December 10, 2009
利用g4u备份与恢复UNIX系统
"\u003cp\u003e这里使用的vm的网桥联网方便的.以下为参考方法,已经测试过,只作为参考.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e准备FTP服务器\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e如果你打算使用G4U为虚拟机创建镜像,将需要一个可用的FTP服务器。你也需要在FTP服务器上创建一个帐号,以便有权限创建和写入文件。\u003c/p\u003e\n\u003cp\u003e如果你寻找快速的FTP应用,不妨考虑Cerberus FTP。这款软件对个人免费开放,商业版本需要59.99美元。有了FTP服务器设置和叫做安装的帐号,就可以对源虚拟机创建镜像了。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e克隆源虚拟机\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e使用以下步骤克隆源虚拟机硬盘镜像:\u003c/p\u003e\n\u003cp\u003e1.从 \u003ca href=\"http://www.feyrer.de/g4u/\"\u003ehttp://www.feyrer.de/g4u/\u003c/a\u003e 站点下载G4U CD-ROM ISO镜像并保存在源虚拟机主机系统上。\u003c/p\u003e\n\u003cp\u003e2.使用所下载的g4u-2.2.iso文件配置虚拟机的虚拟CD-ROM。\u003c/p\u003e\n\u003cp\u003e3.在虚拟机开始启动时按下ESC键。将出现虚拟机的启动菜单,然后选择CD-ROM驱动。\u003c/p\u003e\n\u003cp\u003e4.默认下,虚拟机将通过DHCP试图获取一个IP地址。如果没有可用的DHCP服务器,通过以下步骤为虚拟机设置一个静态IP地址:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e运行ifconfig –a命令给网络接口命名。\u003c/li\u003e\n\u003cli\u003e现 在运行ifconfig netmask 命令设置IP地址。例如,为 …\u003c/li\u003e\u003c/ol\u003e"
December 10, 2009
VMWare的三种工作模式
"\u003cp\u003e如果你想利用VMWare在局域网中新建一个独立的虚拟服务器,为局域网用户提供网络服务;或者想创建一个与网内其他机器相隔离的虚拟系统,进行特殊 的调试工作。此时,对虚拟系统工作模式的选择就非常重要了。如果你选择的工作模式不正确,就无法实现上述目的,也就不能充分发挥VMWare在网络管理和 维护中的作用。现在,让我们一起走近VMWare的三种工作模式。\n理解三种工作模式\nVMWare提供了三种工作模式,它们是bridged(桥接模式)、NAT(网络地址转换模式)和host-only(主机模式)。要想在网络管理和维护中合理应用它们,你就应该先了解一下这三种工作模式。\u003c/p\u003e\n\u003ch1 id=\"1bridged桥接模式\"\u003e1.bridged(桥接模式)\u003c/h1\u003e\n\u003cp\u003e在这种模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机,它可以访问网内任何一台机器。在桥接模式下,你需要手工为虚拟系统配置 IP地址、子网掩码,而且还要和宿主机器处于同一网段,这样虚拟系统才能和宿主机器进行通信。同时,由于这个虚拟系统是局域网中的一个独立的主机系统,那 么就可以手工配置它的TCP/IP配置信息,以实现通过局域网的网关或路由器访问互联网。\n使用桥接模式的虚拟系统和 …\u003c/p\u003e"
December 10, 2009
重启nginx服务的简单命令
"\u003cp\u003e目前的版本基本上不需要用下面的命令了,直接 nginx -s reload 就可以了。\u003c/p\u003e\n\u003cp\u003e用root权限\u003c/p\u003e\n\u003cp\u003e#killall nginx\u003c/p\u003e\n\u003cp\u003e#nginx\u003c/p\u003e\n\u003cp\u003e其它相关命令:\u003c/p\u003e\n\u003cp\u003e1.显示nginx进行id\n\u003cstrong\u003e#ps -aux | grep nginx\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e2.结果nginx的master进行pid\n\u003cstrong\u003e#kill -HUP 635\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e3.重启ngnix\n\u003cstrong\u003e#nginx\u003c/strong\u003e\u003c/p\u003e"
December 10, 2009
nginx虚拟主机及ftp权限应用问题
"\u003cp\u003e平时给一个目录执行一个\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e#chown -R blog:ftp /www/blog\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e命令,如果再通过ftp上传文件的话,发现文件属性为600,访问的时候总是提示”Access Denies!”,提示权限不够,此时可以在系统里执行一下命令进行解决,\n\u003cstrong\u003e#chown -R blog:ftp /wwww/blog\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e#chmod -R 777 /www/blog\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e命令中的-R选项用来让子目录继承父目录的权限,\u003c/p\u003e\n\u003cp\u003e注意:vsftpd.conf 里的local_umask=066(或者是022),\u003c/p\u003e\n\u003cp\u003e其中最有效的方法就是将vsftpd.conf配置文件里的local_umask的值修改为000就可以了,本人已经测试无误!\u003c/p\u003e\n\u003cp\u003e1,文件权限算法\n我们知道系统默认权限炎:\u003c/p\u003e\n\u003cp\u003e目录的初始权限是 \u003cstrong\u003e777\u003c/strong\u003e\n文件的初始权限是 \u003cstrong\u003e666\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e此时上传文件权限计算方法:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e用初始的权限 – 权限umask的权限 = 新建目录或文件的权限\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e:新建目录的权限就是777-022=755 , 新建文件的权根就是666-022=644\u003c/p\u003e\n\u003cp\u003e2,修改 /etc/vsftpd/vsftpd.conf 文件设置\nlocal_umask=066 …\u003c/p\u003e"
December 10, 2009
Nginx下WordPress的永久链接实现
"\u003cp\u003e经过多番测试,终于在nginx下实现了rewrite的功能,WrodPress的永久链接终于生效了。\u003c/p\u003e\n\u003cp\u003e其实也是很简单的方法,修改nginx.conf文件,加入以下内容:\u003c/p\u003e\n\u003cp\u003e`location / {\u003c/p\u003e\n\u003cp\u003eif (-f $request_filename/index.html){\u003c/p\u003e\n\u003cp\u003erewrite (.*) $1/index.html break;\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003eif (-f $request_filename/index.php){\u003c/p\u003e\n\u003cp\u003erewrite (.*) $1/index.php;\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003eif (!-f $request_filename){\u003c/p\u003e\n\u003cp\u003erewrite (.*) /index.php;\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003e`\u003c/p\u003e\n\u003cp\u003e重启nginx就可以了。\u003c/p\u003e\n\u003cp\u003e#killall nginx\u003c/p\u003e\n\u003cp\u003e#nginx\u003c/p\u003e"
November 20, 2009
利用WINPE恢复安装GHOST镜像文件
"\u003cp\u003e首先,启动WINPE,进入PE系统,至于进入PE系统的方法,可以将下载好的PE映像,刻录成光盘,再用光驱启动运行,也可以用U盘启动运行,具体方法,可见: 利用老毛桃WinPE制作启动U盘安装系统:启动到PE后,点开始→程序→克隆工具→诺顿GHOST32 V11,如图\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/winpe_1.jpg\" alt=\"\"\u003e][1]\u003c/p\u003e\n\u003cp\u003e这样,ghost程序被运行,如图,点OK\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/winpe_2.jpg\" alt=\"\"\u003e][2]\u003c/p\u003e\n\u003cp\u003e选择local-partition-from image ,如图,也就是从上往下数1-2-3 ,一定注意选择不要搞错了,搞错了会很麻烦的。操作很简单,要细心检查以避免不必要的麻烦。\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/winpe_3.jpg\" alt=\"\"\u003e][3]\u003c/p\u003e\n\u003cp\u003e用鼠标点击浏览选择盘符和路径\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2009/11/winpe_41.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/winpe_41.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e找到GHOST镜像文件*.GHO\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/winpe_5.jpg\" alt=\"\"\u003e][4]\u003c/p\u003e\n\u003cp\u003e点OPEN打开,弹出如下界面,继续OK\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/winpe_6.jpg\" alt=\"\"\u003e][5]\u003c/p\u003e\n\u003cp\u003e选择要恢复到的磁盘驱动器,在这里,有两个磁盘,一个是U盘,别一个大的是硬盘,选择硬盘\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/winpe_7.jpg\" alt=\"\"\u003e][6]\u003c/p\u003e\n\u003cp\u003e选择恢复到系统分区C盘\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/winpe_8.jpg\" alt=\"\"\u003e][7]\u003c/p\u003e\n\u003cp\u003e点击OK,出现提示分区将被重写覆盖。\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/winpe_9.jpg\" alt=\"\"\u003e][8]\u003c/p\u003e\n\u003cp\u003e点击YES 开始恢复,恢复完成后重启计算机,完成剩余恢复安装,不用你碰一下电脑,便可自动完成安装。\u003c/p\u003e"
November 15, 2009
移动硬盘WINPE启动盘安装系统图解
"\u003cp\u003e系统要求:要制作移动硬盘启动盘,把WINPE安装到移动硬盘上,首先要确认主板支持USB-HDD ,内存大于256兆。最新老九WinPE 老毛桃修改 撒手不管版(Build 070911) 结构简单,安装更方便。\u003c/p\u003e\n\u003cp\u003e下载地址 http://www.quick8.cn/down/00153.htm\u003c/p\u003e\n\u003cp\u003e1、检查将移动硬盘分好区,设置第一分区为主分区并激活为活动状态。插上移动硬盘,点击我的电脑,右击选择管理,点击磁盘管理,显示状态磁盘1如图。\u003c/p\u003e\n\u003cp\u003e2、打开资源管理器,找到下载下来的WINPE文件,右击选择用WINRAR解压缩如图\u003c/p\u003e\n\u003cp\u003e3、点击移动硬盘第一个盘符H,右击运行格式化如图,本机实验FAT32,NTFS格式均可。\u003c/p\u003e\n\u003cp\u003e4、点击打开WINPE解压缩以后文件夹,把WINNT.XPE复制到移动硬盘,打开WXPE文件夹,把NTDETECT.COM和SETUPLDR.BIN复制到移动硬盘,并把SETUPLDR.BIN文件改名为ntldr ,注意去掉扩展名。再把MINIPE文件夹复制到移动硬盘上如图。\u003c/p\u003e\n\u003cp\u003e5、重新启动计算机,开机按DELETE,进入BIOS,设置第一启动为USB-HDD ,保存退出,WINPE启动后 …\u003c/p\u003e"
November 11, 2009
在FreeBSD上建立一个功能完整的邮件服务器(POSTFIX)
"\u003cp\u003e第二部分:防病毒、垃圾邮件:clamav+amavisd-new+spam\u003c/p\u003e\n\u003cp\u003e欢迎大家转贴这个文章,但要保留下面的版权信息:\u003c/p\u003e\n\u003cp\u003e作者:llzqq\n出处:www.chinaunix.net\n联系:llzqq@126.com\u003c/p\u003e\n\u003cp\u003e1.0 安装clamav:\u003c/p\u003e\n\u003cp\u003e# cd /usr/ports/security/clamav\n# make install\n# make clean\u003c/p\u003e\n\u003cp\u003e# vi /usr/local/etc/clamav.conf\n===============================clamav.conf============================\n# Comment or remove the line below.\n# Example\nLogFile /var/log/clamav/clamd.log\nLogFileMaxSize 1M\nLogTime\nLogVerbose\nPidFile /var/run/clamav/clamd.pid\nDataDirectory /usr/local/share/clamav\nLocalSocket /tmp/clamd …\u003c/p\u003e"
November 11, 2009
Freebsd中用last命令查看上次重启日期时间
"\u003cp\u003e\u003cstrong\u003e#last\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ereboot ~ Mon Feb 7 15:00\nshutdown ~ Mon Feb 7 15:00\nreboot ~ Mon Feb 7 12:22\nshutdown ~ Mon Feb 7 12:22\nreboot ~ Mon Feb 7 09:59\nshutdown ~ Mon Feb 7 09:59\nreboot ~ Mon Feb 7 09:26\nshutdown ~ Mon Feb 7 09:25\nreboot …\u003c/p\u003e"
November 11, 2009
freebsd查看网卡流量
"\u003cp\u003e\u003cstrong\u003e一. iftop\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ecd /usr/ports/net-mgmt/iftop\nmake install\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e安装完成后直接用 iftop -i eth0 -n 就可以看到eth0网卡的流量状况\u003c/p\u003e\n\u003cp\u003eiftop -n -N -B -i ether0\u003c/p\u003e\n\u003cp\u003e-n 不查询hostname\n-N 不解析端口对应的服务名\n-i interface 网卡名称\n-B 显示bytes/sec 而不是bits/sec\u003c/p\u003e\n\u003cp\u003e界面里面按s键切换显示/不显示源ip地址\n按t键切换发送/接收数据的单行/双行显示\n按h键是帮助,自己看帮助。\n\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2009/11/iftop.bmp\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2009/11/iftop.bmp\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二. systat\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003esystat -if 1\u003c/p\u003e\n\u003cp\u003esystat 是一个在FreeBSD中帮助你查看、观察系统状况的命令,并且显示在屏幕。\nsystat — display system statistics on a crt\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e使用方法:\u003c/strong\u003e\nsystat [-display] [更新-时间]\n示范:\nsystat -vmstat 1\u003c/p\u003e\n\u003cp\u003e可用指令:\nicmp, icmp6,ifstat, iostat, ip, ip6, mbufs, netstat, pigs, swap, tcp, vmstat …\u003c/p\u003e"
November 11, 2009
freebsd下用mail命令查看邮件内容
"\u003cp\u003e先输入#mail 命令,然后命令提示符会变成 $ ,这此输入邮件最左侧一列的邮件编号,就可以查看邮件的内容了.\u003c/p\u003e"
November 11, 2009
freebsd中升级命令freebsd-update详解
"\u003cp\u003e描述:\u003c/p\u003e\n\u003cp\u003efreebsd-update 是FreeBSD系统用来撷取, 安装及取得binary update 的工具。要注意的是,这些update仅止于FreeBSD Release Engineering Team维护的版本.\u003c/p\u003e\n\u003cp\u003e诸如: FreeBSD 6.1-RELEASE 或 FreeBSD 6.2-RC1 而非 FreeBSD 6.2-STABLE\u003c/p\u003e\n\u003cp\u003eor FreeBSD 7.0-CURRENT 之类的版本.\u003c/p\u003e\n\u003cp\u003e补充: FreeBSD 6.2-RELEASE版本后才有此指令\u003c/p\u003e\n\u003cp\u003e语法:\u003c/p\u003e\n\u003cp\u003efreebsd-update [-b basedir] [-d workdir] [-f conffile] [-k KEY]\u003c/p\u003e\n\u003cp\u003e[-r newrelease] [-s server] [-t address] command\u003c/p\u003e\n\u003cp\u003e参数:\u003c/p\u003e\n\u003cp\u003e-b basedir 指定系统挂载的最基本路径 (预设: / )\u003c/p\u003e\n\u003cp\u003e-d workdir 档案暂存数据夹 (预设: /var/db/freebsd-update/ ),\u003c/p\u003e\n\u003cp\u003e-f conffile 设定文件位置 (预设: …\u003c/p\u003e"
November 11, 2009
如何在FreeBSD下查看CPU信息【FreeBSD CPU Information】
"\u003cp\u003e推荐使用: \u003cem\u003e# \u003cstrong\u003esystat -vm\u003c/strong\u003e 命令\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eHow do I get more information about CPU under FreeBSD such as CPU Speed and model?\u003c/p\u003e\n\u003cp\u003eA. You can use the dmesg utility displays the contents of the system message buffer when FreeBSD comes up. For accuracy I recommend querying /var/run/dmesg.boot file. Usually a snapshot of the buffer contents taken soon after file systems are mounted at startup time and dumped to /var/run/dmesg.boot file.\u003c/p\u003e\n\u003ch2 id=\"check-cpu-speed-in-freebsd\"\u003eCheck CPU Speed in FreeBSD\u003c/h2\u003e\n\u003cp\u003eType the command at a shell prompt:\n\u003ccode\u003e# sysctl -a | egrep -i …\u003c/code\u003e\u003c/p\u003e"
November 5, 2009
硬盘分区变为RAW文件系统后的解决办法
"\u003cp\u003eRAW意思为R and W,原因是因为所在分区权限里,所有者缺失,所以任何帐户均不能访问。\n产生RAW文件系统的原因可能是C盘原先为FAT32,后重装XP系统时被改为NTFS,结果原先是NTFS的F盘成为RAW,无法识别,而原本是FAT32的D、E盘正常。\u003c/p\u003e\n\u003cp\u003e例子一,二,三中的办法非常简单,安全,例子四中操作相对繁琐。\u003c/p\u003e\n\u003cp\u003e例子一:\u003c/p\u003e\n\u003cp\u003e一块移动硬盘,文件系统显示为RAW文件系统,总共字节为0,可用字节为0。\u003c/p\u003e\n\u003cp\u003e假设移动硬盘接入系统时为F盘,那么进入CMD命令提示符,执行CHKDSK F: /F即可。\u003c/p\u003e\n\u003cp\u003e(有关CHKDSK的描述,可在CMD命令提示符下,执行help CHKDSK)\u003c/p\u003e\n\u003cp\u003e唯一的问题就是修复的时间取决于这块硬盘的大小,80GB的话,5分钟左右。\u003c/p\u003e\n\u003cp\u003e例子二:\u003c/p\u003e\n\u003cp\u003e今天重装系统之后我的F:盘突然变成了RAW模式,双击不能打开,提示错误。里面的全是些重要的资料,决不能格式化。。。\u003c/p\u003e\n\u003cp\u003e第一步:首先进入“控制面板”并切换到经典视图,找到“管理工具”,双击打开,再双击打开“本地安全策略”,单击“本地策略”前面的加号,再单击“安全选项”,在右面窗口中找到“网络访问:本地帐户的共享和安全模式”项,然后将其后面的安 …\u003c/p\u003e"
October 22, 2009
[教程]coreseek sphinx在FreeBSD 7.0安装教程
"\u003cp\u003e感谢为中文全文检索做出贡献的所有同学。\u003c/p\u003e\n\u003cp\u003e1、源码安装LibMMSeg 。 先在这里下载压缩包\n\u003cstrong\u003e# fetch \u003ca href=\"http://www.coreseek.com/opensource/mmseg/\"\u003ehttp://www.coreseek.com/opensource/mmseg/\u003c/a\u003e\u003c/strong\u003e\n\u003cstrong\u003e# tar zxvf mmseg-0.7.3.tar.gz\n# cd mmseg-0.7.3\u003c/strong\u003e\n\u003cstrong\u003e# vim src/css/SegmentPkg.cpp\u003c/strong\u003e 修改第27行, 将 #include 改为 \u003cstrong\u003e#include\n# ./configure \u0026amp;\u0026amp; make \u0026amp;\u0026amp; make install\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e2、测试 mmseg\n\u003cstrong\u003e# cd mmseg-0.7.3/data\u003c/strong\u003e 你会看到一个准备好的UTF-8编码的字典文件 unigram.txt\n\u003cstrong\u003e# mmseg -u unigram.txt\u003c/strong\u003e 该命令执行后,将会产生一个名为unigram.txt.uni的文件,将该文件改名为uni.lib,完成词典的构造。 你也可以进行分词测试。详见 \u003ca href=\"http://www.coreseek.com/opensource/mmseg/\"\u003ehttp://www.coreseek.com/opensource/mmseg/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e3、ports安装 gawk\n\u003cstrong\u003e# cd …\u003c/strong\u003e\u003c/p\u003e"
October 15, 2009
在windows生产环境搭建sphinx的注意事项
"\u003cp\u003e\u003cstrong\u003e1、以服务的方式运行sphinx\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在开发环境中,只要执行”\u003cem\u003erake ultrasphinx:daemon:start\u003c/em\u003e“,就可以启动一台sphinx服务器。但如果在生产环境还能这么做么?把sphinx安装为服务无疑是个靠谱的办法,这样它可以像mongrel、apache一样随系统启动。sphinx自带了安装为windows服务的命令:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003esearchd –-install -–config xxxx.conf\u003c/p\u003e\n\u003cp\u003e相应的删除服务命令为:\u003c/p\u003e\n\u003cp\u003esearchd –delete\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e不妨把这个加入到rake命令中,于是我hack了一下ultrasphinx插件的任务列表,加入了一个”\u003cem\u003erake ultrasphinx:daemon:install\u003c/em\u003e“命令。名为ultrasphinx.rake的文件我将稍后提供。\n如果在启用服务的时候提示”发生系统错误1067″的话,则需要在安装服务的时候指定配置文件的路径,参考:\u003ca href=\"http://blog.haohtml.com/index.php/archives/2593\"\u003esphinx在windows下无法启动的解决办法\u003c/a\u003e 如: d:\\csft3.1\\bin\u0026gt;searchd –install –config d:\\csft3.1\\bin\\www.conf\u003c/p\u003e\n\u003cp\u003e既然 …\u003c/p\u003e"
October 15, 2009
Sphinx增量索引实例
"\u003cp\u003e在实际应用中往往有这么一种情况,数据库数据很大,比如我们的歌曲表,如果我们每次都去更新整个表的索引,对系统得开销将非常大,显然这是不合适,这时我 们会发现,每天我们需要更新的数据相比较而言较少,在这种情况下我们就需要使用“主索引+增量索引”的模式来实现实时更新的功能。\u003c/p\u003e\n\u003cp\u003e这个模式实现的基本原理是设置两个数据源和两个索引,为那些基本不更新的数据建立主索引,而对于那些新增的数据建立增量索引。主索引的更新频率我们 可以设置的长一些(可以设置在每天的午夜进行更新),而增量索引的更新频率,我们可以将时间设置的很短(几分钟左右),这样在用户搜索的时候,我们可以同 时查询这两个索引的数据。\u003c/p\u003e\n\u003cp\u003e下面,我们通过一个简单的例子来描述一下怎样实现这种模式\u003c/p\u003e\n\u003cp\u003e以sphinx.conf中默认的数据为例:\u003c/p\u003e\n\u003cp\u003e1.先在mysql中插入一个计数表和两个索引表\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eCREATETABLEsph_counter(\u003c/li\u003e\n\u003cli\u003ecounter_idINTEGERPRIMARYKEYNOTNULL,\u003c/li\u003e\n\u003cli\u003emax_doc_idINTEGERNOTNULL\u003c/li\u003e\n\u003cli\u003e);\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e//主索引使用(确认之前是否已经建立过该表,如果已经建立,这里就不需要重新建了) …\u003c/p\u003e"
October 15, 2009
sphinx实现主索引+增量索引
"\u003cp\u003e装了几次没把sphinx集成到mysql中去(SphinxSE),只好放弃,使用其自带的api(sphinx.php)来试试。\n官方的sphinx0.98不支持索引GBK的数据,后装了Coreseek提供的版本,几经测试后,终于搞定GBK的数据索引。\n然后调用sphinx.php写了个搜索测试程序,终于试出来,也蛮好用的。\u003c/p\u003e\n\u003cp\u003e主要按照Coreseek整理的 \u003ca href=\"http://down.itlearner.com/soft/2420.shtml\"\u003eSphinx0.98中文参考手册\u003c/a\u003e 中的内容,这里记录一下。\u003c/p\u003e\n\u003cp\u003e创建主索引:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ebin/indexer –config etc/sphinx.conf hx_9enjoy –rotate\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e创建增量索引:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ebin/indexer –config etc/sphinx.conf delta –rotate\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e合并主索引和增量索引:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ebin/indexer –config etc/sphinx.conf –merge hx_9enjoy delta –merge-dst-range deleted 0 0 –rotate\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e–rotate参数可以在不停searchd的情况下索引,不然的话会有类似如下的提示:\nFATAL: failed to …\u003c/p\u003e"
October 15, 2009
FreeBSD中portsnap与csup,cvsup方法更新ports的不同
"\u003cp\u003e从6.0开始,freebsd升级ports就不再需要cvsup了,而是用portsnap,\u003c/p\u003e\n\u003cp\u003e一、portsnap与cvsup的区别在于\u003c/p\u003e\n\u003cp\u003e:\u003c/p\u003e\n\u003cp\u003e1、portsnap有数字签名,较安全,cvsup没有。\u003c/p\u003e\n\u003cp\u003e2、portsnap是打包压缩下载,所以会比cvsup快一些,当然除了第一次使用。\u003c/p\u003e\n\u003cp\u003e二、使用方法是:\u003c/p\u003e\n\u003cp\u003e第一次使用:portsnap fetch extract\u003c/p\u003e\n\u003cp\u003e以后再用:portsnap fetch update\u003c/p\u003e\n\u003cp\u003e还可以放在cron里定时升级:portsnap cron update\u003c/p\u003e\n\u003cp\u003e需要注意的是不要portsnap和cvsup混合使用。\u003c/p\u003e\n\u003cp\u003e第一次使用输入portsnap fetch extract回车即可,因为有几十兆的文件需要下载,需要等待一段时间。\u003c/p\u003e\n\u003cp\u003e如果用户没有安装ports,这个命令是无效的,需要通过sysinstall来安装ports\u003c/p\u003e\n\u003cp\u003e修改更新服务器地址的方法:\u003c/p\u003e\n\u003cp\u003e/etc/portsnap.conf 里面更改\u003c/p\u003e\n\u003cp\u003eSERVERNAME=portsnap.hshh.org\u003c/p\u003e\n\u003cp\u003e提供几个postsnap更新的服务器地址\u003c/p\u003e\n\u003cp\u003eportsnap.hshh.org\u003c/p\u003e\n\u003cp\u003eportsnap2.hshh.org …\u003c/p\u003e"
October 15, 2009
Sphinx速成指南
"\u003cp\u003e版权 ? 2008 Dony,,版权所有,转载请声明来源与作者\u003c/p\u003e\n\u003cp\u003e2008-01-17\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e目录\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eSphinx简介\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e1.1. 什么是全文检索\u003c/p\u003e\n\u003cp\u003e1.2. 介绍\u003c/p\u003e\n\u003cp\u003e1.3. Sphinx的特性\u003c/p\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003eSphinx安装(For MySQL)\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e2.1. Windows下安装\u003c/p\u003e\n\u003cp\u003e2.2. Linux下安装 3. 实例说明\u003c/p\u003e\n\u003col start=\"4\"\u003e\n\u003cli\u003e\n\u003cp\u003eSphinx配置\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e运行Sphinx\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e搜索(翻译)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e6.1. 匹配模式\u003c/p\u003e\n\u003cp\u003e6.2. 布尔查询语法(Boolean query syntax)\u003c/p\u003e\n\u003cp\u003e6.3. 扩展查询语法(Extended query syntax)\u003c/p\u003e\n\u003cp\u003e6.4. 权重(匹配度,Weight)\u003c/p\u003e\n\u003col start=\"7\"\u003e\n\u003cli\u003e\n\u003cp\u003e如何调用Sphinx\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSphinxSE的SQL查询例子演练\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e如何自动重建索引\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e相关资源\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003e1. Sphinx简介\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1.1. 什么是全文检索\u003c/p\u003e\n\u003cp\u003e全文检索是指以文档的全部文本信息作为检索对象的一种信息检索技术。检索的对象有可能是文章的标题,也有可能是文章的作者,也有可能是文章摘要或内容。\u003c/p\u003e\n\u003cp\u003e1.2. 介绍\u003c/p\u003e\n\u003cp\u003eSphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据 …\u003c/p\u003e"
October 14, 2009
windows平台下gbk编码数据库的sphinx的设置
"\u003cp\u003esql_query_pre = SET NAMES GBK\u003c/p\u003e\n\u003cp\u003echarset_type = zh_cn.gbk #sbcs\u003c/p\u003e\n\u003cp\u003echarset_dictpath = D:\\csft3.1\\data\u003c/p\u003e"
October 14, 2009
Sphinx在Windows下安装使用[支持中文全文检索]
"\u003cp\u003e前一阵子尝试使用 了一下Sphinx,一个能够被各种语言(PHP/Python/Ruby/etc)方便调用的全文检索系统。网上的资料大多是在linux环境下的安装 使用,当然,作为生产环境很有必要部署在*nix环境下,作为学习测试,还是windows环境比较方便些。\u003c/p\u003e\n\u003cp\u003e本文旨在提供一种便捷的方式让Sphinx在windows下安装配置以支持中文全文检索,配置部分在linux下通用。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、关于Sphinx\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eSphinx 是一个在GPLv2 下发布的一个全文检索引擎,商业授权(例如, 嵌入到其他程序中)需要联系作者(Sphinxsearch.com)以获得商业授权。\u003c/p\u003e\n\u003cp\u003e一般而言,Sphinx是一个独立的搜索引擎,意图为其他应用提供高速、低空间占用、高结果相关度的全文搜索功能。Sphinx可以非常容易的与SQL数据库和脚本语言集成。\u003c/p\u003e\n\u003cp\u003e当前系统内置MySQL和PostgreSQL 数据库数据源的支持,也支持从标准输入读取特定格式的XML数据。通过修改源代码,用户可以自行增加新的数据源(例如:其他类型的DBMS的原生支持)。\u003c/p\u003e\n\u003cp\u003e搜索API支持PHP、Python、Perl、Rudy和Java,并且也可 …\u003c/p\u003e"
October 14, 2009
sphinx+MySQL的安装使用(重新整理)
"\u003cp\u003e一、MySQL+Sphinx+SphinxSE安装步骤:\n1、安装python支持(以下针对CentOS系统,其他Linux系统请使用相应的方法安装)\nyum install -y python python-devel\u003c/p\u003e\n\u003cp\u003e2、编译安装LibMMSeg(LibMMSeg是为Sphinx全文搜索引擎设计的中文分词软件包,其在GPL协议下发行的中文分词法,采用Chih-Hao Tsai的MMSEG算法。LibMMSeg在本文中用来生成中文分词词库。)\u003c/p\u003e\n\u003cp\u003e以下压缩包“sphinx-0.9.8-rc2-chinese.zip”中包含mmseg-0.7.3.tar.gz、sphinx-0.9.8-rc2.tar.gz以及中文分词补丁。\u003c/p\u003e\n\u003cp\u003ewget \u003ca href=\"http://www.coreseek.com/uploads/sources/csft3_0b2.tar.gz\"\u003ehttp://www.coreseek.com/uploads/sources/csft3_0b2.tar.gz\u003c/a\u003e\nwget \u003ca href=\"http://www.coreseek.com/uploads/sources/mmseg3_0b2.tar.gz\"\u003ehttp://www.coreseek.com/uploads/sources/mmseg3_0b2.tar.gz\u003c/a\u003e\nunzip sphinx-0.9.8-rc2-chinese.zip\ntar zxvf …\u003c/p\u003e"
October 3, 2009
Sphinx全文索引安装教程
"\u003cp\u003e首先了解一下sphinx全文索引的相关知识\u003c/p\u003e\n\u003cp\u003e官方网站: \u003ca href=\"http://www.sphinxsearch.com/\"\u003ehttp://www.sphinxsearch.com/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e官方文档: \u003ca href=\"http://www.sphinxsearch.com/docs/\"\u003ehttp://www.sphinxsearch.com/docs/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e中文支持: \u003ca href=\"http://www.coreseek.cn/\"\u003ehttp://www.coreseek.cn/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e中文使用手册下载: \u003ca href=\"http://www.coreseek.cn/uploads/pdf/sphinx_doc_zhcn_0.9.pdf\"\u003ehttp://www.coreseek.cn/uploads/pdf/sphinx_doc_zhcn_0.9.pdf\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e基本上看看上面的官方教程和中文使用手册,你应该会安装和使用Sphix全文索引,当然,还有一些细节,需要不断的google和baidu,那为了节省大家的时间,就出一个完整的Sphinx安装教程和结合PHPWIND程序的使用教程(PHPWIND7.5版本支持)。\u003c/p\u003e\n\u003cp\u003e接下来开始Sphinx的技术之旅吧!\u003c/p\u003e\n\u003cp\u003e考虑到Sphinx全文索引使用的实际需要,主要介绍Sphinx全文索引中文方面的支持。\n这里需要感谢\u003cstrong\u003e李沫南\u003c/strong\u003e同学对Sphinx全文索引中文支持的贡献!\n**\n一,Windows下安装Sphinx**\n1,开始前的准备工作\n来源: \u003ca href=\"http://www.coreseek.cn/products/ft_down/\"\u003ehttp://www.coreseek.cn/products/ft_down/\u003c/a\u003e\n …\u003c/p\u003e"
October 3, 2009
IBM 机做 READ1
"\u003cp\u003e如何使用LSI配置RAID1\nX服务器中有一些集成LSI SCSI控制器的机型,在开机自检时按CTRL C可以配置两个硬盘的镜像。但是当升级BIOS之后,CTRL C中的一些设置发生了变化,配置方法也较以前的版本有些差异。\u003c/p\u003e\n\u003cp\u003e新版本的配置步骤:\n1.启动服务器,在自检过程中按CTRL C键,进入到菜单(双通道LSI控制器)\n2.选择硬盘所在SCSI通道回车\n3.选择,回车。\n4.发现两个硬盘,选择一个为主盘,在按减号。\n5.系统提示按F3保存磁盘的数据,按Delete删除磁盘上的数据。如果这个磁盘上有操作系统,一定要选择F3.完成之后下面的[No]变成[Yes].\n6. 在第二个磁盘上[No]的位置按减号:\n7.系统警告这个磁盘上的信息会丢失,按DELETE删除这个磁盘上的所有数据,或者按任意键取消。按DELETE,第二个磁盘的[No]也会变成[Yes],重启系统,开始同步磁盘。\u003c/p\u003e\n\u003cp\u003e旧版本\n1) 重启主机 按 CTRL-C 进入配置菜单 ,光标放在第一个通道上,按继续\n2) 选择 DEVICE PROPERTIES 可发现硬盘,按回到前一菜单\n3) 选择 MIRRORING …\u003c/p\u003e"
September 24, 2009
windows2003下的分区工具软件
"\u003cp\u003eAcronis PartitionExpert 2003是一个易用强大的分区管理程序,它支持常用的FAT16/FAT32,NTFS,Linux Ext2/Ext3,Linux Swap,ReiserFS格式的分区。它可以让你的硬盘使用的更好,可以帮你分区,改变分区的大小,复制分区,分区格式变换(FAT16,FAT32之间,Linux Ext2格式和Ext3格式之间的数据无损转换)等等。如果你对这些不熟悉,软件提供自动模式给使用者,对高级的使用者,软件提供了专家模式,软件的运行速度快于比现在的其他分区管理程序。软件支持大于180G的硬盘。\u003c/p\u003e\n\u003cp\u003e前些时候换了硬盘,由于分区不够合理,使用一段时间后,非Linux分区空间告急,看来需要向Linux分区要点空间了。鉴于笔者的硬盘上的分区类型太多,笔者找到了一款号称完全支持众多分区格式的无损分区软件——Acronis PartitionExpert,决定用它来试一下。\u003c/p\u003e\n\u003cp\u003e分区工具\u003c/p\u003e\n\u003cp\u003e软件名称:Acronis PartitionExpert\u003c/p\u003e\n\u003cp\u003e软件大小:11.5MB\u003c/p\u003e\n\u003cp\u003e软件类型:共享软件\u003c/p\u003e\n\u003cp\u003e下载地址:http://www.acronis.com\u003c/p\u003e\n\u003cp\u003e它的安装非常简单, …\u003c/p\u003e"
September 14, 2009
ServU和ServU-Plus结合对ftp用户进行数据库(Mysql)验证
"\u003cp\u003e基本步骤:\n1.\u003c/p\u003e\n\u003cp\u003e下载Mysql for windows的版本,目前最新的为mysql-4.0.20d-win。下载并安装启动。\u003c/p\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003e\n\u003cp\u003e 在mysql.com网站下载对应的mysql-odbc驱动程序,安装在windows 2000/NT/advance server操作系统.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e 在操作系统中,点击控制面板->管理工具->数据源(ODBC),添加对MySQL ODBC的支持。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e 使用servU-Plus插件程序,ServUPlus是Serv-U的一个插件,其主要功能就是捕捉Serv-U的事件,然后做适当的功能增强、扩展。解压后出现目录结构如下:\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e[]根目录\u003c/p\u003e\n\u003cp\u003eReadme.txt 自述文件\u003c/p\u003e\n\u003cp\u003eMySQL_SQL.txt MySQL的数据结构\u003c/p\u003e\n\u003cp\u003eMSSQL_SQL.txt MSSQL的数据结构\u003c/p\u003e\n\u003cp\u003eUpdate.txt 升级说明\u003c/p\u003e\n\u003cp\u003e[\\ServU]目录\u003c/p\u003e\n\u003cp\u003edbexpmysql.dll 访问MySQL的DLL(可选)\u003c/p\u003e\n\u003cp\u003edbexpmss.dll 访问MSSQL的DLL(可选) …\u003c/p\u003e"
September 12, 2009
FreeBSD中忘记root密码的解决办法
"\u003cp\u003e重新启动FreeBSD 过往单用户更改密码\u003c/p\u003e\n\u003cp\u003eFreeBSD 4.x 或之前的版本\u003c/p\u003e\n\u003cp\u003e在系统启动所示以下信息时按 spacebar\u003c/p\u003e\n\u003cp\u003eHit [Enter] to boot immediately, or any other key for command prompt.\u003c/p\u003e\n\u003cp\u003eBooting [kernel] in 10 seconds…接着在所示以下信息时输入 boot -s\u003c/p\u003e\n\u003cp\u003eType ‘?’ for a list of commands, or ‘help’ for more detailed help.\u003c/p\u003e\n\u003cp\u003eok\u003c/p\u003e\n\u003cp\u003e按 Enter 后系统会进行至所示以下信息\u003c/p\u003e\n\u003cp\u003eEnter full pathname of shell or RETURN for /bin/sh:\u003c/p\u003e\n\u003cp\u003e再按 Enter 进入单用户模式,所示 #\u003c/p\u003e\n\u003cp\u003e挂载档案系统,输入\u003c/p\u003e\n\u003ch1 id=\"fsck--p-文件档案检查\"\u003efsck -p \\文件档案检查\u003c/h1\u003e\n\u003ch1 id=\"mount--u--挂载\"\u003emount -u / \\挂载\u003c/h1\u003e\n\u003ch1 id=\"mount--t-ufs--a-挂载所有文件档案\"\u003emount -t ufs -a \\挂载所有文件档案\u003c/h1\u003e\n\u003cp\u003e更改密码\u003c/p\u003e\n\u003ch1 id=\"passwd-更改密码\"\u003epasswd \\更改密码\u003c/h1\u003e\n\u003cp\u003eNew password:_\u003c/p\u003e"
August 26, 2009
nginx 502 bad gateway 解决办法
"\u003cp\u003eNGINX 502 Bad Gateway错误是FastCGI有问题,造成NGINX 502错误的可能性比较多。将网上找到的一些和502 Bad Gateway错误有关的问题和排查方法列一下,先从FastCGI配置入手:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.FastCGI进程是否已经启动\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2.FastCGI worker进程数是否不够\u003c/strong\u003e\n运行 netstat -anpo | grep “php-cgi” | wc -l 判断是否接近FastCGI进程,接近配置文件中设置的数值,表明worker进程数设置太少\n通过命令查看服务器上一共开了多少的 php-cgi 进程\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eps -fe |grep “php” | grep -v “grep” | wc -l\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e使用如下命令查看已经有多少个php-cgi进程用来处理tcp请求\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003enetstat -anop | grep “php” | grep -v “grep” | wc -l\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e接近配置文件中设置的数值,表明worker进程数设置太少\n参见: \u003ca href=\"http://blog.s135.com/post/361.htm\"\u003ehttp://blog.s135.com/post/361.htm\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3.FastCGI …\u003c/strong\u003e\u003c/p\u003e"
July 2, 2009
Mysql Master/Slave模式实战
"\u003cp\u003e**1.master上授权给slave\n** mysql\u0026gt;grant all on *.* to repadmin@’218.6.67.75′ identified by ‘backup’;\nmysql\u0026gt;flush privileges;\nmysql\u0026gt;use abs;\nmysql\u0026gt;create table mysqlslave (status char(8));\nmysql\u0026gt;insert into mysqlslave values (‘aaaa’);\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2.shutdown master\u003c/strong\u003e\nmysqladmin -u root shutdown\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3.拷贝数据文件\u003c/strong\u003e\n直接把数据文件夹打包拷贝到slave去。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e4.修改Master的my.cnf文件,在[mysqld]处增加\u003c/strong\u003e\nmaster /etc/my.cnf:\nlog-bin\nserver-id = 1\nsql-bin-update-same\nbinlog-do-db = abs\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e5.修改Slave的my.cnf文件\u003c/strong\u003e\nserver-id = 2\nmaster-host = …\u003c/p\u003e"
June 23, 2009
用mrtg监控网络设备端口流量
"\u003cp\u003e被监控设备必须支持snmp协议,因为mrtg就是通过snmp协议来获取该设备的端口流量信息。如何在一个网络设备上启用snmp协议呢?\u003c/p\u003e\n\u003cp\u003e在配置模式下执行如下命令:3550(config)#snmp-server community public ro,启用snmp协议。启用后才能使用mrtg进行监控。\u003c/p\u003e\n\u003cp\u003e我中心用一台linux服务器监控三台网络设备的流量,其服务器地址为10.66.100.100/16,三台交换机的任一VLAN地址分别为 192.168.3.253,172.19.96.2,10.70.0.1。现为了叙述方便,仅选取10网段的交换机为例进行说明。其他设备方法相同,不 再赘述。\u003c/p\u003e\n\u003cp\u003e在执行mrtg的各步操作前,linux系统中必须先安装apache服务,用于网页发布。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eI、Apache服务的安装\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e因为mrtg是以网页的形式来显示被监测设备的端口流量信息的,所以必须先安装apache服务。现将安装过程中的几个问题描述如下:\u003c/p\u003e\n\u003cp\u003e下载apache-2.0.44-2.i586.rpm软件包,安装时系统显示”libssl.so.0 is needed by …\u003c/p\u003e"
June 23, 2009
使用FreeBSD的SNMP+MRTG网络流量分析
"\u003cp\u003e、 安装SNMP\n一般版本的FreeBSD系统SNMP存放在/usr/ports/net/net-snmp下面,但是有的版本不是。有些版本 在安装Package的时候,除了要安装Net之外,还要安装Net-mgmt里面的SNMP,安装好之后,SNMP就存放在/usr/ports /net-mgmt/net-snmp下面了。下面就是安装过程:\n# cd /usr/ports/net-mgmt/net-snmp #snmp的存放路径\n# make install clean #安装snmp\n# ee /etc/rc.conf\nsnmpd_enable=”YES”\nsnmpd_flags=”-p /var/run/snmpd.pid”\n# /etc/netstart\n# ee /usr/local/share/snmp/snmpd.conf\nrocommunity public\n# /usr/local/etc/rc.d/snmpd.sh start #启动snmp\u003c/p\u003e\n\u003cp\u003e2、 安装mrtg\nmrtg根据不同的版本存放的位置不同,一般存放在/usr/ports/net/net-snmp下面,这里介 …\u003c/p\u003e"
June 23, 2009
MRTG FOR WINDOWS 安装指南
"\u003cp\u003eMRTG(Multi Router Traffic Grapher),通常讲是一个监控网络链路流量负载的开源软件,它可以从所有运行SNMP协议的设备上(包括服务器、路由器、交换机等)抓取信息。事实上它不仅可以监控网络设备,任何其它的支持SNMP协议的设备都可以做为MRTG的监控对象,并自动生成包含PNG图形格式的HTML文档,通过HTTP 方式显示给用户。\u003c/p\u003e\n\u003cp\u003e官方的安装指导:http://mrtg.cs.pu.edu.tw/doc/mrtg-nt-guide.en.html\u003c/p\u003e\n\u003cp\u003e准备安装环境\u003c/p\u003e\n\u003cp\u003e安装之前,除了MRTG安装程序外,还要下载几个辅助软件。这些软件全部是免费的。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e下载MRTG\n\u003ca href=\"http://www.mrtg.org\"\u003ehttp://www.mrtg.org\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e下载ActivePerl\n\u003ca href=\"http://www.activestate.com/Products/Download/Download.plex?id=ActivePerl\"\u003ehttp://www.activestate.com/Products/Download/Download.plex?id=ActivePerl\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e下载Windows服务安装工具:SERANY.exe 和 INSTSRV.exe\n\u003ca href=\"http://www.electrasoft.com/srvany/srvany.htm\"\u003ehttp://www.electrasoft.com/srvany/srvany.htm\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e安装MRTG\u003c/p\u003e\n\u003cp\u003e …\u003c/p\u003e"
June 21, 2009
Nginx常见应用技术-Tips
"\u003cp\u003e目 录\u003c/p\u003e\n\u003cp\u003e一、 Nginx 基础知识\u003c/p\u003e\n\u003cp\u003e二、 Nginx 安装及调试\u003c/p\u003e\n\u003cp\u003e三、 Nginx Rewrite\u003c/p\u003e\n\u003cp\u003e四、 Nginx Redirect\u003c/p\u003e\n\u003cp\u003e五、 Nginx 目录自动加斜线:\u003c/p\u003e\n\u003cp\u003e六、 Nginx Location\u003c/p\u003e\n\u003cp\u003e七、 Nginx expires\u003c/p\u003e\n\u003cp\u003e八、 Nginx 防盗链\u003c/p\u003e\n\u003cp\u003e九、 Nginx 访问控制\u003c/p\u003e\n\u003cp\u003e十、 Nginx 日志处理\u003c/p\u003e\n\u003cp\u003e十一、 Nginx Cache\u003c/p\u003e\n\u003cp\u003e十二、 Nginx 负载均衡\u003c/p\u003e\n\u003cp\u003e十三、 Nginx 简单优化\u003c/p\u003e\n\u003cp\u003e十四、 如何构建高性能的 LEMP 环境\u003c/p\u003e\n\u003cp\u003e十五、 Nginx 服务监控\u003c/p\u003e\n\u003cp\u003e十六、 常见问题与错误处理.\u003c/p\u003e\n\u003cp\u003e十七、 相关资源下载\u003c/p\u003e\n\u003cp\u003e作者:NetSeek\u003c/p\u003e\n\u003cp\u003e欢迎转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明.\u003c/p\u003e\n\u003cp\u003e首发时间: 2008-11-25\u003c/p\u003e\n\u003cp\u003e转帖NetSeek的Nginx Tips 希望对广大Cuer有用!\u003c/p\u003e\n\u003cp\u003e附件pdf: \u003ca href=\"/wp-content/uploads/2009/06/20090615_5e83f7a0addbb093df4fjp2nchwhwggc.pdf\"\u003eNginx常见应用技术-Tips.pdf\u003c/a\u003e\u003c/p\u003e"
June 10, 2009
如何查看文件的创建时间?
"\u003cp\u003e刚刚去开了一台pc,真实环境!\u003c/p\u003e\n\u003cp\u003e一步步地做完!验证完成,楼上所言,正确!\u003c/p\u003e\n\u003cp\u003e当修改文件后,\n$ls -Ul file\u003c/p\u003e\n\u003cp\u003e和\u003c/p\u003e\n\u003cp\u003e$stat -s file\u003c/p\u003e\n\u003cp\u003e中 st_birthtime=number ,需要执行$date -r number ;\u003c/p\u003e\n\u003cp\u003e比较后,结果一致,得到最初创建文件的时间值!\u003c/p\u003e\n\u003cp\u003e注:以上命令可能在虚拟机上执行不起作用的.\u003c/p\u003e"
June 10, 2009
FreeBSD传真服务器(FreeBSD+HylaFax+Apache+php+Mysql+AvantFax)
"\u003cp\u003e\u003ca href=\"http://bbs3.chinaunix.net/thread-1456005-1-1.html\"\u003ehttp://bbs3.chinaunix.net/thread-1456005-1-1.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eFreeBSD安装选择Minimal+Ports\n域名:fax.test.org IP:192.168.1.203 新建用户:vincent 属于wheel组\u003c/p\u003e\n\u003cp\u003eHandbook\n\u003ca href=\"http://cnsnap.cn.freebsd.org/doc/zh_CN.GB2312/books/handbook/install.html\"\u003ehttp://cnsnap.cn.freebsd.org/doc … ndbook/install.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e开启FTP服务\u003c/p\u003e\n\u003cp\u003e编辑/etc/inetd.conf文件去掉ftp前的注释’#’。\u003c/p\u003e\n\u003cp\u003e#vi /etc/inetd.conf\nftp stream tcp nowait root /usr/libexec/ftpd ftpd -l\u003c/p\u003e\n\u003cp\u003e启动inetd程序\n#/etc/rc.d/inetd start\u003c/p\u003e\n\u003cp\u003e添加vincent用户,用于FTP登录上传文件\n#pw useradd vincent -s /bin/csh -d /home/vincent -m -g wheel -h 0\u003c/p\u003e\n\u003cp\u003e—————————————————————————-\u003c/p\u003e\n\u003cp\u003e使用wget加快ports软件下载\u003c/p\u003e\n\u003cp\u003e安 …\u003c/p\u003e"
May 27, 2009
把FreeBSD5.3升级到5.4版本
"\u003cp\u003e本来系统装的是FreeBSD5.3,但是新版的FreeBSD5.4 Release发布了,而且改动不小,呵呵,赶紧升级吧。\u003c/p\u003e\n\u003cp\u003e先更新源码结构:\n# cd /usr/share/examples/cvsup\n修改一下 standard-supfile 文件:\n# vi standard-supfile\n把主机和版本修改掉:\n把*default host=CHANGE_THIS.FreeBSD.org\n改为:*default host=cvsup.jp.freebsd.org或者cvsup.freebsdchina.org,呵呵,其实日本的服务器也不慢。\n把:*default release=cvs tag=RELENG_5_3\n改为:*default release=cvs tag=RELENG_5_4\u003c/p\u003e\n\u003cp\u003e:wq 保存退出。\n开始更新,如果没有cvsup命令,就自己去ports一个回来。\n# cvsup -g -L2 standard-supfile\n等一段时间,多久根据你的网速和机器配置有关。\u003c/p\u003e\n\u003cp\u003e更新回来之后,现在正式开始安装内核。先进入源代码目录:\n# cd /usr/src\n开始编译,这 …\u003c/p\u003e"
May 23, 2009
FreeBSD 挂载U盘
"\u003cp\u003e确保内核中有如下项\ndevice scbus\ndevice da\ndevice cd\u003c/p\u003e\n\u003cp\u003e在GENERIC中默认都有,如果没有,请编译内核。\u003c/p\u003e\n\u003cp\u003e大多数U盘用的是FAT 文件系统,所以用\nmount -t msdos /dev/da0 /mnt\u003c/p\u003e\n\u003ch1 id=\"freebsd-umount-devda0\"\u003eFreeBSD# mount -t msdos /dev/da0 /mnt/Mp4/\nFreeBSD# cd /mnt/Mp4/\nFreeBSD# ls\n??.mp3 My love.mp3\n????.mp3 boulevard of broken dreams.mp3\n?????.mp3 data\n?????.mp3 someday.mp3\nBE-Girls Hold the line .mp3 take me to your heart.mp3\nBeautiful World.mp3 thats why you go away.mp3\nBlue Bird.mp3 you took my heart away.mp3\nI lay my love on you.mp3\nFreeBSD# cp *.mp3 /home/music/\nFreeBSD# …\u003c/h1\u003e"
May 22, 2009
FreeBSD常用命令110条
"\u003cp\u003e\u003cstrong\u003e01.查看网络流量\u003c/strong\u003e\na.systat -if 1 (1表示1s刷新屏幕一次)\nb.netstat 1\n# Traffic 流量 peak 峰值 average 平均值\n\u003cstrong\u003e02.查看硬盘信息\u003c/strong\u003e\ndiskinfo -vt /dev/ad0\ndisklable /dev/ad0 (分区信息)\ndisklable /dev/ad0s2\n\u003cstrong\u003e03.查看核心信息\u003c/strong\u003e\nvmstat 1\n**04.查看进程\n** top ps auxww ps -ef |grep xxx\n\u003cstrong\u003e05.查看硬盘详细分区信息&读写状况\u003c/strong\u003e\ngstat\n\u003cstrong\u003e06.sysctl sysctl -a 查看所有变量(/etc/sysctl.conf)\u003c/strong\u003e\nsysctl kern.maxproc 查看特定变量\nsysctl kern.maxfiles=5000 设置变量\n\u003cstrong\u003e07.查看磁盘空间使用情形 df 和 du\u003c/strong\u003e\n指令df用来查看整个档案系统的使用情形,\n如果您需要知道某个目录的使用情形用指令du。\ndf -h\ndu -h /etc\ndu -sh /etc\n-s 参数来省略指定目录下的子目录\n-h 表示使用GB、MB等易读的格式\n\u003cstrong\u003e08. …\u003c/strong\u003e\u003c/p\u003e"
May 22, 2009
FreeBSD中使用QUOTA(磁盘配额)来限制用户空间
"\u003cp\u003e虚拟主机中经常要限制用户空间的大小和文件的数量。这些限制在linux和FreeBSD中都是用QUOTA来实现的。这里我说下在FreeBSD下实现的方法;\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e开启\u003c/strong\u003e \u003cstrong\u003eQUOTA\u003c/strong\u003e \u003cstrong\u003e支持\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e首先需要修改内核加入对quota的支持\u003c/p\u003e\n\u003cp\u003emachine i386\u003c/p\u003e\n\u003cp\u003ecpu I686_CPU\u003c/p\u003e\n\u003cp\u003e#ident GENERIC\u003c/p\u003e\n\u003cp\u003eident CNOSvhost\u003c/p\u003e\n\u003cp\u003emaxusers 0\u003c/p\u003e\n\u003cp\u003eoptions QUOTA #就是这行了。\u003c/p\u003e\n\u003cp\u003e修改好后重新编译内核。\u003c/p\u003e\n\u003cp\u003e然后在/etc/rc.conf里加入:\u003c/p\u003e\n\u003cp\u003eenable_quotas=”YES”\u003c/p\u003e\n\u003cp\u003echeck_quotas=”YES”\u003c/p\u003e\n\u003cp\u003e这样你的系统就起用QUOTA了,你应当通过编辑/etc/fstab的某个文件系统的属性,加入QUOTA的支持。\u003c/p\u003e\n\u003cp\u003e下面的fstab文件就设置了在/pub文件系统上起用用户配额和组配额\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# See the fstab(5) manual page for important information on automatic mounts\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# of network filesystems before modifying this file.\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# Device …\u003c/code\u003e\u003c/pre\u003e"
May 19, 2009
Apache 的信息查看模块——Server-Status
"\u003cp\u003e前提:启用httpd.conf配置文件里的两个模块:|\n\u003cstrong\u003eLoadModule status_module modules/mod_status.so\nLoadModule info_module modules/mod_info.so\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e本文我们将讨论使用 mod_status 和 mod_info to 来告诉你目前服务器的工作情况\n\u003cstrong\u003e我可以得到什么样的信息?\u003c/strong\u003e\n使用 mod_status,你可以知道谁在你的服务器上看些什么东西,以及有多少人连在Web 服务器上。还有其他可能你的客户不关心的信息,但是对于你,一个站点管理员来说,却是十分有用的信息。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e客户喜欢这些资料\u003c/strong\u003e\n我不知道你的客户都是怎样的人物,但是我的客户喜欢我提供的信息。每天一次的信息还不够,因为到一天结束时才知道就太晚了。所以他们喜欢知道现在正在发生的事情。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emod_info 和 mod_status\u003c/strong\u003e\n这两个模块可以提供十分有用的信息,而且十分方便。\nmod_status 能准确地告诉你,你的服务器正在“想”什么。你可以知道有哪些人在浏览您的网站,有多少子进程在运行,以及这些进程在干吗。\u003c/p\u003e\n\u003cp\u003e如果你使用缺省方法安装的 Apache 的 …\u003c/p\u003e"
May 19, 2009
解决win环境下Apache占用大量内存的问题
"\u003cp\u003e我有个服务是在windows下的Apache2提供的。访问量不是很大,隔4、5天竟然停止服务,调查发现Apache2的进程httpd.exe占用内存达到了1.5G。在网上找到如下解决办法。\u003c/p\u003e\n\u003cp\u003e用记事本打开apache2\\conf\\httpd.conf,查找MaxRequestsPerChild,将MaxRequestsPerChild 0改成MaxRequestsPerChild 50即可。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e原因是:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e 通常在“Windows任务管理器-进程”中可以看到两个apache.exe进程,一个是父进程、一个是子进程,父进程接到访问请求后,将请 求交由子进程处理。MaxRequestsPerChild这个指令设定一个独立的子进程将能处理的请求数量。在处理 “MaxRequestsPerChild 数字”个请求之后,子进程将会被父进程终止,这时候子进程占用的内存就会释放,如果再有访问请求,父进程会重新产生子进程进行处理。\u003c/p\u003e\n\u003cp\u003e 如果MaxRequestsPerChild缺省设为0(无限)或较大的数字(例如10000以上)可以使每个子进程处理更多的请求,不会因为 不断终止、启动子进程降低访问效率, …\u003c/p\u003e"
May 19, 2009
windows下nginx-0.7.10+php-5.2.6+fastcgi安装日志
"\u003cp\u003e最近心里有点痒,打算怀下旧,搞个php玩玩。找了几台服务器想装个php,虽然是举手之劳,但是总觉得有点不方便。另外家里的宽带总被占线,所以在服务器上做测试那也比较痛苦。\u003c/p\u003e\n\u003cp\u003e所以就想在本机弄个,记得以前有个apache php mysql的整合安装版,这可是个好东西,如果有人问我怎么在windows装php啊,我顺口就告诉他找这个,的确可以省不少力气。\u003c/p\u003e\n\u003cp\u003e不过今天我就不想用这古老的玩意装机了,虽然这东西装得是快,不过我已经不怎么记得起apache的配置怎么写,甚至有点厌恶写那配置。\u003c/p\u003e\n\u003cp\u003e于是我下了个nginx的windows版,然后再找个php的windows版,在http://www.kevinworthington.com/category/computers/nginx/,下完后先装nginx,没什么复杂,启动,在浏览器输入http://127.0.0.1,没有反应,看一下netstat -an,发现貌似80端口存在,估计这个端口不是nginx占用的,于是关掉所有开启的程序,再启动,再刷新,就可以看到有一个测试页出现了。\u003c/p\u003e\n\u003cp\u003e这样算是弄完了一个东西,接下来装php吧,先把它解压到d盘,放 …\u003c/p\u003e"
May 13, 2009
利用 squid 反向代理提高网站性能
"\u003cp\u003e级别: 初级\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"#author\"\u003e李明慧\u003c/a\u003e ([limhui@cn.ibm.com][2]), 软件测试工程师, IBM\u003c/p\u003e\n\u003cp\u003e2009 年 4 月 02 日\u003c/p\u003e\n\u003cp\u003e本文在介绍 squid 反向代理的工作原理的基础上,指出反向代理技术在提高网站访问速度,增强网站可用性、安全性方面有很好的用途。作者在具体的实验环境下,利用 DNS 轮询和 Squid 反向代理技术,实现了网站的负载均衡,从而提高了网站的可用性和可靠性。\u003c/p\u003e\n\u003cp\u003e现在有许多大型的门户网站如 SINA 都采用 squid 反向代理技术来加速网站的访问速度,可将不同的 URL 请求分发到后台不同的 WEB 服务器上,同时互联网用户只能看到反向代理服务器的地址,加强了网站的访问安全。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e反向代理的概念\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e反向代理服务器又称为 WEB 加速服务器,它位于 WEB 服务器的前端,充当 WEB 服\u003c/p\u003e\n\u003cp\u003e务器的内容缓存器。其系统结构如图 1\u003c/p\u003e\n\u003cp\u003e [\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/image001.jpg\" alt=\"\"\u003e][3]\u003c/p\u003e\n\u003cp\u003e反向代理服务器是针对 WEB 服务器设置的,后台 WEB 服务器对互联网用户是透明的,用户只能看到反向代理服务器的地址,不清楚后台 WEB 服务器是如何组织架构的。当互联网用户请求 WEB 服务时,DNS 将请求的域名解析为反向代理服 …\u003c/p\u003e"
May 13, 2009
反向代理简介
"\u003cp\u003e 代理服务器是使用非常普遍的一种将局域网主机联入互联网的一种方式,使用代理上网可以节约紧缺的IP地址资源,而且可以阻断外部主机对内部主机的访问,使 内部网主机免受外部网主机的攻击。但是,如果想让互联网上的主机访问内部网的主机资源(例如:Web站点),又想使内部网主机免受外部网主机攻击,一般的 代理服务是不能实现的,需要使用反向代理来实现。\u003c/p\u003e\n\u003cp\u003e本文将详细介绍反向代理服务的概念以及如何利用反向代理服务器提高WEB服务器的性能和安全性。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一.反向代理的概念\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e什么是反向代理呢?其实,反向代理也就是通常所说的WEB服务器加速,它是一种通过在繁忙的WEB服务器和Internet之间增加一个高速的WEB缓冲服务器(即:WEB反向代理服务器)来降低实际的WEB服务器的负载。典型的结构如下图所示:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2009/05/1057141.jpg\"\u003e\u003cimg src=\"http://blogx.haohtml.com/wp-content/uploads/2009/05/1057141.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eWeb服务器加速(反向代理)是针对Web服务器提供加速功能的。它作为代理Cache,但并不针对浏 览器用户,而针对一台或多台特定Web服务器(这也是反向代理名称的由来)。实施反向代理(如上图所示),只要将Reverse Proxy Cache设备放置在一台或多台Web服务器前端即可。当互联网用户访问某 …\u003c/p\u003e"
May 7, 2009
便于管理的nginx配置[2009-03-18 01:15:05]
"\u003cp\u003e我目前的nginx配置是拆散的,这样可以便于在很多个虚拟主机和目录里重用部分配置。\u003c/p\u003e\n\u003cp\u003e总体是划分为这样一个结构:\u003c/p\u003e\n\u003cp\u003econf/\nconf/nginx.conf\nconf/proxy.conf\nconf/rewrite.conf\nconf/location.conf\nconf/port.conf\nconf/upstream.conf\nconf/servers/\nconf/servers/www.sudone.com\nconf/servers/www.163.com\u003c/p\u003e\n\u003cp\u003e1、nginx.conf\u003c/p\u003e\n\u003cp\u003e这就是nginx读取的主文件,没特殊情况是通用的\u003c/p\u003e\n\u003cp\u003e2、proxy.conf\u003c/p\u003e\n\u003cp\u003e代理的选项配置,也是通用的\u003c/p\u003e\n\u003cp\u003e3、rewrite.conf\u003c/p\u003e\n\u003cp\u003e所有主机的根目录公用的rewrite规则,默认是空文件,可以不使用。\u003c/p\u003e\n\u003cp\u003e4、location.conf\u003c/p\u003e\n\u003cp\u003e所有主机都会用到的location目录结构,默认是空文件,可以不使用。\u003c/p\u003e\n\u003cp\u003e5、port.conf\u003c/p\u003e\n\u003cp\u003e配置服务器绑定ip和端口,因为nginx如果各个主机ip端口配置有不同会有bug,所以最好是统一设定。\u003c/p\u003e\n\u003cp\u003e6、upstream.conf\u003c/p\u003e\n\u003cp\u003eupstream写在这里面,和业务分开,易 …\u003c/p\u003e"
May 7, 2009
Nginx 简单的负载均衡配置示例
"\u003cp\u003e\u003ca href=\"http://www.haohtml.com\"\u003ewww.haohtml.com\u003c/a\u003e 和 blog.haohtml.com 域名均指向 Nginx 所在的服务器IP。\u003c/p\u003e\n\u003cp\u003e用户访问,将其负载均衡到192.168.1.2:80、192.168.1.3:80、192.168.1.4:80、192.168.1.5:80四台服务器。\u003c/p\u003e\n\u003cp\u003e用户访问,将其负载均衡到192.168.1.7服务器的8080、8081、8082端口。\u003c/p\u003e\n\u003cp\u003e以下为配置文件nginx.conf:\n引用\nuser www www;\u003c/p\u003e\n\u003cp\u003eworker_processes 10;\u003c/p\u003e\n\u003cp\u003e#error_log logs/error.log;\n#error_log logs/error.log notice;\n#error_log logs/error.log info;\u003c/p\u003e\n\u003cp\u003e#pid logs/nginx.pid;\u003c/p\u003e\n\u003cp\u003e#最大文件描述符\nworker_rlimit_nofile 51200;\u003c/p\u003e\n\u003cp\u003eevents\n{\nuse epoll;\u003c/p\u003e\n\u003cp\u003eworker_connections 51200;\n}\u003c/p\u003e\n\u003cp\u003ehttp\n{\ninclude conf/mime.types;\ndefault_type …\u003c/p\u003e"
April 25, 2009
FreeBSD用户邮件转发
"\u003cp\u003e在FreeBSD里,root以及普通用户都有邮件通知,每次需要登录终端查看,比较烦人;\u003c/p\u003e\n\u003cp\u003e查了手册以后发现,其实可以把邮件转发到其他邮箱里,比如Gmail,然后就不用登录服务器去查看系统邮件了;\u003c/p\u003e\n\u003cp\u003e具体做法是:在用户home目录下创建 .forward 文件,写上转发地址,保存,就ok了。\u003c/p\u003e"
April 25, 2009
FreeBSD好工具:Screen
"\u003cp\u003e非常非常爽的一个工具,看了书之后研究了一下,非常爽\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e# screen\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e//以下^A表示同按“Ctrl + A”键\u003c/p\u003e\n\u003ch1 id=\"a-c-create开出新的-window\"\u003e^A c //Create,开出新的 window\u003c/h1\u003e\n\u003ch1 id=\"a-n-next切换到下个-window\"\u003e^A n //Next,切换到下个 window\u003c/h1\u003e\n\u003ch1 id=\"a-p-previous前一个-window\"\u003e^A p //Previous,前一个 window\u003c/h1\u003e\n\u003ch1 id=\"a-a-在两个-window-间切换\"\u003e^A ^A //在两个 window 间切换\u003c/h1\u003e\n\u003ch1 id=\"a-w-windows列出已开启的-windows-有那些\"\u003e^A w //Windows,列出已开启的 windows 有那些\u003c/h1\u003e\n\u003ch1 id=\"a-09-切换到第-09-个-window\"\u003e^A 0…9 //切换到第 0..9 个 window\u003c/h1\u003e\n\u003ch1 id=\"a-t-time显示目前的时间与系统的-load\"\u003e^A t //Time,显示目前的时间,与系统的 load\u003c/h1\u003e\n\u003ch1 id=\"a-k-kill-window强制关掉目前的-window\"\u003e^A K //kill window,强制关掉目前的 window\u003c/h1\u003e\n\u003ch1 id=\"a--help显示简单说明\"\u003e^A ? //Help,显示简单说明\u003c/h1\u003e\n\u003ch1 id=\"a-d-detach将目前的-screen-session-可能含有多个-windows-丢到背景执行\"\u003e^A d //detach,将目前的 screen session (可能含有多个 windows) 丢到背景执行\u003c/h1\u003e\n\u003cp\u003e\u003cem\u003e当\u003c/em\u003e \u003cem\u003e按了 ^A d\u003c/em\u003e \u003cem\u003e把 screen session detach\u003c/em\u003e \u003cem\u003e掉后,会回到还没进 screen\u003c/em\u003e \u003cem\u003e时的状态,此时在 screen session ?\u003c/em\u003e \u003cem\u003e每个 window\u003c/em\u003e \u003cem\u003e内跑的 process (\u003c/em\u003e \u003cem\u003e无论是前景/\u003c/em\u003e \u003cem\u003e背景)\u003c/em\u003e \u003cem\u003e都在继续执行,即使 logout\u003c/em\u003e \u003cem\u003e也不影响。\u003c/em\u003e\u003c/p\u003e"
April 18, 2009
FREEBSD操作系统更新更改系统时间 date
"\u003cp\u003e修改FreeBSD的系统时间\u003c/p\u003e\n\u003cp\u003e必须有root权限\u003c/p\u003e\n\u003ch1 id=\"date-yymmddhhmm\"\u003edate YYMMDDHHMM\u003c/h1\u003e\n\u003cp\u003e比如要修改时间为2007年4月15日7点52\u003c/p\u003e\n\u003ch1 id=\"date-0704150752\"\u003edate 0704150752\u003c/h1\u003e\n\u003cp\u003e只改时间的话\u003c/p\u003e\n\u003ch1 id=\"date-hhmm\"\u003edate HHMM\u003c/h1\u003e\n\u003cp\u003e使用NTP服务器更新本地时间\u003c/p\u003e\n\u003ch1 id=\"ntpdate-timenistgov\"\u003entpdate time.nist.gov\u003c/h1\u003e\n\u003cp\u003e常用的NTP服务器\u003c/p\u003e\n\u003cp\u003etime.nist.gov\u003c/p\u003e\n\u003cp\u003etime.windows.com\u003c/p\u003e\n\u003cp\u003echime.utoronto.ca\u003c/p\u003e\n\u003cp\u003entp.pipex.net\u003c/p\u003e"
April 18, 2009
用wget加快ports下载
"\u003cp\u003e1.安装wget\u003c/p\u003e\n\u003cp\u003e#cd /usr/ports/ftp/wget/\u003c/p\u003e\n\u003cp\u003e#make install clean\u003c/p\u003e\n\u003cp\u003e2.修改/etc/make.conf\u003c/p\u003e\n\u003cp\u003eFETCH_CMD=wget -c -t 1\u003c/p\u003e\n\u003cp\u003eDISABLE_SIZE=yes #这行是必要的,否则…\u003c/p\u003e\n\u003cp\u003e如果你要wget穿透代理服务器,请加上下面两行\u003c/p\u003e\n\u003cp\u003eFETCH_ENV=http_proxy=http://proxy2.zsu.edu.cn:3128\u003c/p\u003e\n\u003cp\u003eFETCH_ENV=ftp_proxy=http://proxy2.zsu.edu.cn:3128\u003c/p\u003e\n\u003cp\u003e或者使用其他的穿越代理工具例如proxychains 或者socks5(runsocks)\u003c/p\u003e\n\u003cp\u003e则FETCH_CMD=proxychains wget或者runsocks wget\u003c/p\u003e"
April 5, 2009
vi 命令大全
"\u003cp\u003e\u003cstrong\u003e进入vi的命令\u003c/strong\u003e\nvi filename :打开或新建文件,并将光标置于第一行首\nvi +n filename :打开文件,并将光标置于第n行首\nvi + filename :打开文件,并将光标置于最后一行首\nvi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处\nvi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename\nvi filename….filename :打开多个文件,依次编辑\n\u003cstrong\u003e移动光标类命令\u003c/strong\u003e\nh :光标左移一个字符\nl :光标右移一个字符\nspace:光标右移一个字符\nBackspace:光标左移一个字符\nk或Ctrl+p:光标上移一行\nj或Ctrl+n :光标下移一行\nEnter :光标下移一行\nw或W :光标右移一个字至字首\nb或B :光标左移一个字至字首\ne或E :光标右移一个字j至字尾\n) :光标移至句尾\n( :光标移至句首\n}:光标移至段落开头\n{:光标移至段落结尾\nnG:光标移至第n行首\nn+:光标下移n行\nn-:光标上移n行\nn$:光标移至第n行尾\nH :光标移至屏幕顶行\nM :光标移至 …\u003c/p\u003e"
March 28, 2009
FreeBSD 7.0 安装Nginx
"\u003cp\u003e来源: \u003ca href=\"http://bbs.chinaunix.net/viewthread.php?tid=1039563\u0026amp;extra=\u0026amp;page=1\"\u003ehttp://bbs.chinaunix.net/viewthread.php?tid=1039563\u0026amp;extra=\u0026amp;page=1\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e#/usr/ports/www/nginx\u003c/p\u003e\n\u003cp\u003e#make config\u003c/p\u003e\n\u003cp\u003elqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk\u003c/p\u003e\n\u003cp\u003ex Options for nginx 0.5.34 x\u003c/p\u003e\n\u003cp\u003ex lqqqqq^(-)qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk x\u003c/p\u003e\n\u003cp\u003ex x [X] HTTP_ADDITION_MODULE Enable http_addition module x x\u003c/p\u003e\n\u003cp\u003ex x [X] HTTP_DAV_MODULE Enable http_webdav module x x\u003c/p\u003e\n\u003cp\u003ex x [X] HTTP_FLV_MODULE …\u003c/p\u003e"
March 28, 2009
freebsd中查看文件夹/目录大小的方法/命令
"\u003cp\u003edu、df,freebsd/linux du,df(磁盘空间信息)命令详解\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003edf和du命令详解df命令详细用法\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ea:显示全部的档案系统和各分割区的磁盘使用情形\u003c/p\u003e\n\u003cp\u003ei:显示i -nodes的使用量\u003c/p\u003e\n\u003cp\u003ek:大小用k来表示 (默认值)\u003c/p\u003e\n\u003cp\u003et:显示某一个档案系统的所有分割区磁盘使用量\u003c/p\u003e\n\u003cp\u003ex:显示不是某一个档案系统的所有分割区磁盘使用量\u003c/p\u003e\n\u003cp\u003eT:显示每个分割区所属的档案系统名称\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e常用命令:df -hi\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003edu:查询档案或目录的磁盘使用空间\u003c/p\u003e\n\u003cp\u003ea:显示全部目录和其次目录下的每个档案所占的磁盘空间\u003c/p\u003e\n\u003cp\u003eb:大小用bytes来表示 (默认值为k bytes)\u003c/p\u003e\n\u003cp\u003ec:最后再加上总计 (默认值)\u003c/p\u003e\n\u003cp\u003es:只显示各档案大小的总合\u003c/p\u003e\n\u003cp\u003ex:只计算同属同一个档案系统的档案\u003c/p\u003e\n\u003cp\u003eL:计算所有的档案大小\u003c/p\u003e\n\u003cp\u003e常用命令:du -a\u003c/p\u003e"
March 28, 2009
[教程]FreeBSD下nginx+fast-cgi+mysql+zend的实现(php-fpm和spawn-fcgi)
"\u003cp\u003e另一篇文章是用php-fpm方式安装的,用的人也比较的多,推荐使用,这里介绍的是用fastcgi方式安装的.\u003c/p\u003e\n\u003cp\u003e首先在安装所有软件之前新系统ports,然后 再进行下面的工作\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1)安装mysql\u003c/strong\u003e**#cd /usr/ports/databases/mysql51-server**\u003c/p\u003e\n\u003cp\u003e**#make WITH_CHARSET=gbk WITH_XCHARSET=all ** \u003cstrong\u003e\u003cstrong\u003eWITH_PROC_SCOPE_PTH=yes SKIP_DNS_CHECK=yes BUILD_OPTIMIZED=yes\u003c/strong\u003e install clean\u003c/strong\u003e //(utf8我选择了这个,情况自己定)\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e#cp /usr/local/share/mysql/my-medium.cnf /etc/my.cnf\n#rehash\u003c/strong\u003e\n!!!—–WITH_CHARSET=utf8(我选择了这个,情况自己定,可以使用gbk)\n\u003cstrong\u003e# mysql_install_db\u003c/strong\u003e ##初始化mysql,如果在命令行后面添加上 –user=mysql 的话,会失败,不清楚什么原因\u003c/p\u003e\n\u003cp\u003e#\u003cstrong\u003echown -R mysql:mysql /var/db/mysql\u003c/strong\u003e ##目录权 …\u003c/p\u003e"
March 27, 2009
FreeBSD7.1-RELEAES提前发布了
"\u003cp\u003e\u003ca href=\"/wp-content/uploads/2009/03/freebsd71_beastie.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2009/03/freebsd71_beastie.png\" alt=\"\"\u003e\u003c/a\u003e官网还没有正式发布新闻,不过在其主FTP站点上已经可以下载光盘映像了, \u003ca href=\"ftp://ftp.freebsd.org/pub/FreeBSD/ISO-IMAGES-amd64/7.1/\"\u003eftp://ftp.freebsd.org/pub/FreeBSD/ISO-IMAGES-amd64/7.1/\u003c/a\u003e 算是新年的礼物啊。\u003c/p\u003e\n\u003cp\u003e详细改进及声明: \u003ca href=\"http://www.freebsd.org/releases/7.1R/relnotes.html\"\u003ehttp://www.freebsd.org/releases/7.1R/relnotes.html\u003c/a\u003e 官方下载同样是3CD或1DVD.当然对于做服务器来说第一张盘就足够了。\n这里还有附图啊!喜不喜欢这样的红色小魔鬼呢?\u003ca href=\"/wp-content/uploads/2009/03/fb_35533831ab.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2009/03/fb_35533831ab.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e"
March 16, 2009
FreeBSD+Nginx+Mysql+PHP安装记
"\u003cp\u003e折腾了一个晚上,基本上都是用packages安装,php用ports安装,由于PHP只用了FastCGI模式,所以phpmyadmin提示缺少模块而无法安装,最后下载的源码安装。整个过程中,竟然发现最耗费时间的PHP的那些模块!\n其实安装完成后再回过头来看,步骤熟练后,加上编译时间,半个小时足够!\u003c/p\u003e\n\u003cp\u003e先做个规划,操作步骤分三块,分别用三个帖子来写,分别是:软件的安装,软件的设置,启动调试及遇到错误说明。\u003c/p\u003e\n\u003cp\u003e主要思路:用php-fpm来管理FastCGI。在网上的大多数资料都是用lighttp来安装管理,但是据说php-fpm比那个要强,所以就赶了一回时髦,用了一下php-fpm。\u003c/p\u003e\n\u003cp\u003e先列一下安装的东西,其实由安装的软件列表,就可以看出用做的过程,今天晚了,明天写步骤:\nQUOTE:\nautoconf-2.62 Automatically configure source code on many Un*x platforms\nautoconf-wrapper-20071109 Wrapper script for GNU autoconf …\u003c/p\u003e"
March 16, 2009
nginx支持泛域名解析的方法
"\u003cp\u003e要使用Nginx下的泛域名支持,必须在编译 Nginx的时候加上\u003c/p\u003e\n\u003cp\u003e–with-http_sub_module\u003c/p\u003e\n\u003cp\u003efreebsd下ports安装的时候有提示的,选上即可。方法我google了半天,网上的好多我照做都是不行的,例如这个:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003elisten 80;\u003c/p\u003e\n\u003cp\u003eserver_name \u003ca href=\"http://www.yourdomain.com/\"\u003ewww.yourdomain.com\u003c/a\u003e *.yourdomain.com;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这个会提示:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1 id=\"nginx--t\"\u003e\u003cstrong\u003enginx\u003c/strong\u003e -t\u003c/h1\u003e\n\u003cp\u003e2009/01/04 13:22:56 [emerg] 63944#0: conflicting parameter “*.bsdlover.cn” in www.conf:14\u003c/p\u003e\n\u003cp\u003e2009/01/04 13:22:56 [emerg] 63944#0: the configuration file \u003cstrong\u003enginx\u003c/strong\u003e.conf test failed\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e还有些文章里面说的是:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eserver_name .yourdomain.com;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这个也是不行的,经过我的实验,正确的做法是:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003elisten 80;\u003c/p\u003e\n\u003cp\u003eserver_name _;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这样就可以了,留个笔记,呵呵\u003c/p\u003e\n\u003cp\u003e来 …\u003c/p\u003e"
March 16, 2009
Apache和Nginx下禁止访问*.txt文件
"\u003cp\u003e大家是否测试Apache做了目录禁止浏览后,目录下面的txt文件还是可以显示里面的内容的。(我的是这样的)\u003c/p\u003e\n\u003cp\u003e例如: \u003ca href=\"http://www.domain.com/test/\"\u003ehttp://www.domain.com/test/\u003c/a\u003e 此访问会报403错误,但是如果test下有很多txt,你访问该txt时;\u003c/p\u003e\n\u003cp\u003e例如: \u003ca href=\"http://www.domain.com/test/a.txt\"\u003ehttp://www.domain.com/test/a.txt\u003c/a\u003e,此时a.txt里的内容会全部暴露在外面了(有时这个txt是很机密的文件),这样以来问题就来了。\u003c/p\u003e\n\u003cp\u003e同样:我在Nginx配置后后也存在这样的问题,Apache下此问题的解决多谢NetSeek帮助。\u003c/p\u003e\n\u003cp\u003e如下是关于Apache和Nginx 限制该类事情办法:\u003c/p\u003e\n\u003cp\u003eApache:解决办法;\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eOptions -Indexes FollowSymLinks\n\nAllowOverride All\n\n Order allow,deny\n\n Deny from all\n\nNginx:解决办法;\n\nlocation ~* .(txt|doc)$ {\n\n if (-f $request_filename) { …\u003c/code\u003e\u003c/pre\u003e"
March 16, 2009
freebsd+mysql+nginx+php组合安装
"\u003cp\u003e\u003cstrong\u003e安装mysql\u003c/strong\u003e\n#cd/usr/ports/databases/mysql51-server\n#make WITH_CHARSET=gbk WITH_XCHARSET=all WITH_PROC_SCOPE_PTH=yes BUILD_OPTIMIZED=yes BUILD_STATIC=yes SKIP_DNS_CHECK=yes WITHOUT_INNODB=yes install clean\n#cp /usr/local/share/mysql/my-small.cnf /etc/my.cnf\n#rehash\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e初始化表\u003c/strong\u003e\n#/usr/local/bin/mysql_install_db –user=mysql#一定要运行此步,否将下面设定权限将会出现错误,因为这句命令会将生在/usr/local/mysql下面将生var及以下目录,是下面的前提条件.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e安装php\u003c/strong\u003e\n# cd /usr/ports/lang/php5\n# make config\n[X] CLI Build CLI version\n[X] CGI Build CGI version\n[ ] APACHE Build …\u003c/p\u003e"
February 26, 2009
FreeBSD中使用QUOTA磁盘配额来限制用户空间
"\u003cp\u003e虚拟主机中经常要限制用户空间的大小和文件的数量。这些限制在linux和FreeBSD中都是用QUOTA来实现的。这里我说下在FreeBSD下实现的方法;\n开启QUOTA支持\n首先需要修改内核加入对quota的支持\nmachine i386\ncpu I686_CPU\n#ident GENERIC\nident CNOSvhost\nmaxusers 0\noptions QUOTA #就是这行了。\n修改好后重新编译内核。\n然后在/etc/rc.conf里加入:\nenable_quotas=\u003cem\u003e“\u003cem\u003eYES\u003c/em\u003e“\u003c/em\u003e\ncheck_quotas=\u003cem\u003e“\u003cem\u003eYES\u003c/em\u003e“\u003c/em\u003e\n这样你的系统就起用QUOTA了,你应当通过编辑/etc/fstab的某个文件系统的属性,加入QUOTA的支持。\n下面的fstab文件就设置了在/pub文件系统上起用用户配额和组配额\n# See the fstab(5) manual page for important information on automatic mounts\n# of network filesystems before modifying this file.\n# Device …\u003c/em\u003e\u003c/em\u003e\u003c/em\u003e\u003c/em\u003e\u003c/p\u003e"
February 4, 2009
ports中的make命令的可用参数
"\u003cp\u003e我们经常使用ports来安装程序,ports中的make命令还可以有很多的功能:\u003c/p\u003e\n\u003cp\u003e引用\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003efetch\u003c/strong\u003e – Retrieves ${DISTFILES} (and ${PATCHFILES} if defined) into ${DISTDIR} as necessary.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003efetch-list\u003c/strong\u003e – Show list of files that would be retrieved by fetch.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003efetch-recursive\u003c/strong\u003e – Retrieves ${DISTFILES} (and ${PATCHFILES} if defined), for port and dependencies into ${DISTDIR} as necessary.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003efetch-recursive-list\u003c/strong\u003e – Show list of files that would be retrieved by fetch-recursive.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003efetch-required\u003c/strong\u003e– Retrieves ${DISTFILES} (and ${PATCHFILES} if defined), for port and …\u003c/p\u003e"
January 12, 2009
APACHE优化之apache的内存使用
"\u003cp\u003eApache是运行在Linux操作系统上的头号Web服务器。很多小地方都可以用来调整Apache的性能,并降低它对系统资源的影响。其中一个就是调整内存使用率,当然达到这一目的可能还是需要花点功夫的。\n例如,通过ps来确定httpd线程的内存使用率,可以输入下面的命令:\n# ps -U apache -u apache u\u003c/p\u003e\n\u003cp\u003eUSERPID %CPU %MEMVSZRSS TTYSTAT START TIME COMMAND\napache130670.05.3 149704 54504 ?SOct071:53 /usr/sbin/httpd -f /etc/httpd/conf/httpd.conf -DAPACHE2\n…\u003c/p\u003e\n\u003cp\u003e上面这段输出显示了单个httpd进程使用了50 MB的RSS(驻留集大小)内存(或者非交换物理内存),以及149 MB的VSZ(虚拟)内存。这当然在很大程度上取决于你在Apache里加载和运行的模块数量。这决不是一个固定的数字。由于这个数字里还包含了共享库包,所以不是100%的准确。我们可以认为RSS数字的一半是httpd线程真正使用的内存数,这可能还有点保守,但是离我 …\u003c/p\u003e"
January 12, 2009
5、VSFTPD的设置选项 详解
"\u003cp\u003e**5、VSFTPD的设置选项\n**\nVSFTPD的配置文件/etc/vsftpd/vsftpd.conf是个文本文件。以“#”字符开始的行是注释行。每个选项设置为一行,格式为“option=value”,注意“=”号两边不能留空白符。除了这个主配置文件外,还可以给特定用户设定个人配置文件,具体介绍见后。\nVSFTPD包中所带的vsftpd.conf文件配置比较简单,而且非常偏执狂的(文档自称:-))。我们可以根据实际情况对其进行一些设置,以使得VSFTPD更加可用。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e5.1、连接选项\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e本部分主要是一些与建立FTP链接相关的选项。\u003c/p\u003e\n\u003cp\u003e5.1.1、监听地址与控制端口\u003c/p\u003e\n\u003cp\u003elisten_address=ip address\n此参数在VSFTPD使用单独(standalone)模式下有效。此参数定义了在主机的哪个IP地址上监听FTP请求,即在哪个IP地址上提供FTP服务。对于只有一个IP地址的主机,不需要使用此参数。对于多址主机,不设置此参数,则监听所有IP地址。默认值为无。\u003c/p\u003e\n\u003cp\u003elisten_port=port_value\n指定FTP服务器监听的端口号(控制端口),默认值为21。此选项 …\u003c/p\u003e"
January 12, 2009
ls命令选项详解
"\u003cp\u003els 命令可以说是Linux下最常用的命令之一。它有众多的选项,其中有很多是很有用的,你是否熟悉呢?下面列出了 ls 命令的绝大多数选项。\u003c/p\u003e\n\u003cp\u003e-a 列出目录下的所有文件,包括以 . 开头的隐含文件。\n-b 把文件名中不可输出的字符用反斜杠加字符编号(就象在C语言里一样)的形式列出。\n-c 输出文件的 i 节点的修改时间,并以此排序。\n-d 将目录象文件一样显示,而不是显示其下的文件。\n-e 输出时间的全部信息,而不是输出简略信息。\n-f -U 对输出的文件不排序。\n-g 无用。\n-i 输出文件的 i 节点的索引信息。\n-k 以 k 字节的形式表示文件的大小。\n-l 列出文件的详细信息。\n-m 横向输出文件名,并以“,”作分格符。\n-n 用数字的 UID,GID 代替名称。\n-o 显示文件的除组信息外的详细信息。\n-p -F 在每个文件名后附上一个字符以说明该文件的类型,“*”表示可执行的普通\n文件;“/”表示目录;“@”表示符号链接;“|”表示FIFOs;“=”表示套\n接字(sockets)。\n-q 用?代替不可输出的字符。\n-r 对目录反向排序。\n-s 在每个文件名后输出该文件的大小。 …\u003c/p\u003e"
January 10, 2009
linux/unix命令备忘:ln -s 建立文档连结
"\u003cp\u003e1 . \u003cstrong\u003e使用方式\u003c/strong\u003e :\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eln [option] source_file \u003cstrong\u003edist_file_link_name\u003c/strong\u003e (source_file是待建立链接文件的源文件,dist_file是新创建的链接文件)\n-f 建立时,将同档案名删除.\n-i 删除前进行询问.\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e两个参数的位置经常记错,只需要记住命令和显示结果的位置正好相反。\n写 ln 命令时第一个参数就是一个普通的文件名,第二个参数是链接名\n而使用 ls -al 命令查看时,则是 链接名在前,实际文件名在后,中间用 -\u0026gt; 连接(硬连接也是一个文件嘛,肯定按普通文件名来显示了)\u003c/p\u003e\n\u003cp\u003e例如建立一个 abc.txt 文件的的软连接,并取名为 abc-link.txt\n# ln -s abc.txt abc-link.txt\n# ls -al\nlrwxrwxrwx 1 sxf sxf 7 4月 12 14:14 abc-link.txt -\u0026gt; abc.txt\n-rw-rw-r– 1 sxf sxf 4 4月 12 14:14 abc.txt\u003c/p\u003e\n\u003cp\u003e如果这里删除了原来物理文件名 abc.txt, 则对应的软链接文件名虽然用ls可以看到,但其 …\u003c/p\u003e"
January 3, 2009
在Freebsd中安装CVSup
"\u003cp\u003e在首次运行 \u003cstrong\u003eCVSup\u003c/strong\u003e 之前, 务必确认 \u003ccode\u003e/usr/ports\u003c/code\u003e 是空的! 如果您之前已经用其他地方安装了一份 Ports 套件,则 \u003cstrong\u003eCVSup\u003c/strong\u003e 可能不会自动删除已经在上游服务器上删除掉的补丁文件。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e安装 \u003ca href=\"http://www.freebsd.org/cgi/url.cgi?ports/net/cvsup-without-gui/pkg-descr\"\u003e\u003ccode\u003enet/cvsup-without-gui\u003c/code\u003e\u003c/a\u003e 软件包:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# pkg_add -r cvsup-without-gui\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e请参见 \u003ca href=\"cvsup.html#CVSUP-INSTALL\"\u003e如何安装 CVSup\u003c/a\u003e ( \u003ca href=\"cvsup.html#CVSUP-INSTALL\"\u003e第 A.5.2 节\u003c/a\u003e) 以了解更多细节。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e运行 \u003ccode\u003ecvsup\u003c/code\u003e:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# cvsup -L 2 -h cvsup.FreeBSD.org /usr/share/examples/cvsup/ports-supfile\n以上参数请见这里\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e将 \u003ccode\u003ecvsup.FreeBSD.org\u003c/code\u003e 改为离您较近的 \u003cstrong\u003eCVSup\u003c/strong\u003e 服务器。 请参见 \u003ca href=\"cvsup.html#CVSUP-MIRRORS\"\u003eCVSup 镜像\u003c/a\u003e ( \u003ca href=\"cvsup.html#CVSUP-MIRRORS\"\u003e第 A.5.7 节\u003c/a\u003e) 中的镜像站点完整列表。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e注意:\u003c/strong\u003e 有时可能希望使用自己的 \u003ccode\u003eports-supfile\u003c/code\u003e, 比如说,不想每次都通过命令行来指定所使用的 \u003cstrong\u003eCVSup\u003c/strong\u003e 服务器。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e这种情况下, 需要以 \u003ccode\u003eroot\u003c/code\u003e 身份将 \u003ccode\u003e/usr/share/examples/cvsup/ports-supfile\u003c/code\u003e 复制 …\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/blockquote\u003e\u003c/li\u003e\u003c/ol\u003e"
January 3, 2009
在FreeBSD中运行 CVSup
"\u003cp\u003e您现在准备尝试升级了。命令很简单:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# cvsup supfile\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003esupfile\u003c/code\u003e 的位置当然就是您刚刚创建的 \u003ccode\u003esupfile\u003c/code\u003e 文件名啦。 如果您在 X11 下面运行, \u003ccode\u003ecvsup\u003c/code\u003e 会显示一个有一些可以做平常事情的按钮的 GUI 窗口。 按 go 按钮,然后看着它运行。\u003c/p\u003e\n\u003cp\u003e现在好像用csup这个命令的比较的多,速度比用cvsup要快,语法基本差不多,把命令关键字替换就可以了\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003ecsup -g -L2 -h cvsup4.freebsdchina.org /usr/share/examples/cvsup/ports-supfile\u003c/strong\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e在这个例子里您将要升级您目前的 \u003ccode\u003e/usr/src\u003c/code\u003e 树,您将需要 用 \u003ccode\u003eroot\u003c/code\u003e 来运行程序,这样 \u003ccode\u003ecvsup\u003c/code\u003e 有需要的权限来更新您的文件。 刚刚创建了您的配置文件,又从来没有使用过这个程序,紧张不安是可以理解的。有一个简单的方法不改变您当前的文件来做一次试验性的运行。只要在方便的地方创建一个空目录,并在命令行上作为一个额外的参数说明:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# mkdir /var/tmp/dest\n# cvsup supfile /var/tmp/dest\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e您指定的目录会作为所有文 …\u003c/p\u003e"
January 1, 2009
freebsd ssh 服务器登录失败问题的解决
"\u003cp\u003e编辑/etc/ssh/sshd_config 保证设置以下参数:\u003c/p\u003e\n\u003cp\u003ePermitRootLogin yes\nPasswordAuthentication yes\nUseDNS no\nLoginGraceTime 0\u003c/p\u003e"
January 1, 2009
FreeBSD下SSH配置
"\u003cp\u003esshd的配置文件一般位于/etc/ssh/sshd_config。\u003c/p\u003e\n\u003cp\u003e终端下:#ee /etc/ssh/sshd_config\u003c/p\u003e\n\u003cp\u003e———————————————\u003c/p\u003e\n\u003cp\u003e#Protocol 2,1\u003c/p\u003e\n\u003cp\u003e修改为:\u003c/p\u003e\n\u003cp\u003eProtocol 2\u003c/p\u003e\n\u003cp\u003e#ListenAddress 0.0.0.0\u003c/p\u003e\n\u003cp\u003e修改为:\u003c/p\u003e\n\u003cp\u003eListenAddress 0.0.0.0\u003c/p\u003e\n\u003cp\u003e#PermitRootLogin yes\u003c/p\u003e\n\u003cp\u003e修改为\u003c/p\u003e\n\u003cp\u003ePermitRootLogin yes\u003c/p\u003e\n\u003cp\u003e另把\u003c/p\u003e\n\u003cp\u003e#PasswordAuthenticationno\u003c/p\u003e\n\u003cp\u003ePasswordAuthentication yes\u003c/p\u003e\n\u003cp\u003e即可.\u003c/p\u003e\n\u003cp\u003e(Linux上默认允许root用户登录,此处可不修改。)\u003c/p\u003e\n\u003cp\u003e编辑**/etc/rc.conf**\n最后加入:\u003cstrong\u003esshd_enable=”yes”\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e修改完成后重启sshd:\u003c/p\u003e\n\u003cp\u003e/etc/rc.d/sshd restart\u003c/p\u003e\n\u003cp\u003e——————————-\u003c/p\u003e\n\u003cp\u003e现在即可ssh登陆.\u003c/p\u003e"
January 1, 2009
FreeBSD下如何开启SSH
"\u003cp\u003e首先vi编辑/etc/inetd.conf,去掉ssh前的#,保存退出\u003c/p\u003e\n\u003cp\u003e编辑/etc/rc.conf\u003c/p\u003e\n\u003cp\u003e最后加入:sshd_enable=”yes”即可\u003c/p\u003e\n\u003cp\u003e激活sshd服务:\u003c/p\u003e\n\u003cp\u003etecho#/etc/rc.d/sshd start\u003c/p\u003e\n\u003cp\u003e用下面命令检查服务是否启动,在22端口应该有监听。\u003c/p\u003e\n\u003cp\u003e#netstat -an ## check port number 22\u003c/p\u003e\n\u003cp\u003e最后\u003c/p\u003e\n\u003cp\u003evi /etc/ssh/sshd_config,\u003c/p\u003e\n\u003cp\u003e下面是我的配置文件:(/etc/ssh/sshd_config)\n####################################################\u003c/p\u003e\n\u003cp\u003e# $OpenBSD: sshd_config,v 1.72 2005/07/25 11:59:40 markus Exp $\n# $FreeBSD: src/crypto/openssh/sshd_config,v 1.42.2.1 2005/09/11 16:50:35 des Exp $\u003c/p\u003e\n\u003cp\u003e# This is the sshd server system-wide configuration file. See …\u003c/p\u003e"
January 1, 2009
升级FreeBSD的ports
"\u003cp\u003eXinsoft-BSD# cp /usr/share/examples/cvsup/ports-supfile /root\u003c/p\u003e\n\u003cp\u003eXinsoft-BSD# vi /etc/make.conf\u003c/p\u003e\n\u003ch1 id=\"added-by-root-xinoft-2006-02-05-035211\"\u003eadded by root [Xinoft] 2006-02-05 03:52:11\u003c/h1\u003e\n\u003ch1 id=\"for-cvsup\"\u003efor cvsup\u003c/h1\u003e\n\u003ch1 id=\"block_cvsup--beginsup_update-yes\"\u003eBlock_CVSUP :: beginSUP_UPDATE= yes\u003c/h1\u003e\n\u003cp\u003eSUP= /usr/local/bin/cvsup\u003c/p\u003e\n\u003cp\u003eSUPFLAGS= -g -L 2# cvsup[1-9].tw.FreeBSD.org\u003c/p\u003e\n\u003cp\u003eSUPHOST= \u003ca href=\"ftp://ftp.freebsdchina.org/\"\u003eftp.freebsdchina.org\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eSUPFILE= /usr/share/examples/cvsup/stable-supfile\u003c/p\u003e\n\u003cp\u003ePORTSSUPFILE= /root/ports-supfile\u003c/p\u003e\n\u003cp\u003eDOCSUPFILE= /usr/share/examples/cvsup/doc-supfileMASTER_SITE_BACKUP?= …\u003c/p\u003e"
December 5, 2008
apache ab压力测试
"\u003cp\u003e以前安装好APACHE总是不知道该如何测试APACHE的性能,现在总算找到一个测试工具了。就是APACHE自带的测试工具AB(apache benchmark).在APACHE的bin目录下。\n格式:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e./ab [options] [http://]hostname[:port]/path\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e参数:\n-n requests Number of requests to perform\n//在测试会话中所执行的请求个数。默认时,仅执行一个请求\n-c concurrency Number of multiple requests to make\n//一次产生的请求个数。默认是一次一个(测试次数=n/c,所以此值要小于上面参数n的值)。\n-t timelimit Seconds to max. wait for responses\n//测试所进行的最大秒数。其内部隐含值是-n 50000。它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。\u003c/p\u003e\n\u003cp\u003e-p postfile File containing data to POST\n//包含了需要POST的数据的 …\u003c/p\u003e"
December 5, 2008
Apache实现图片防盗链
"\u003cp\u003eApache实现图片防盗链以及,显示一张“禁止盗链”的图片,我们可以用mod_rewrite 来实现。\u003c/p\u003e\n\u003cp\u003e假设充许连结图片的主机域名为:tech.ddvip.com\u003c/p\u003e\n\u003cp\u003e修改httpd.conf\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSetEnvIfNoCase Referer “^” local_ref=1\u003c/p\u003e\n\u003cp\u003eOrder Allow,Deny\u003c/p\u003e\n\u003cp\u003eAllow from env=local_ref\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这个简单的应用不光可以解决图片盗链的问题,稍加修改还可以防止任意文件盗链下载的问题。\u003c/p\u003e\n\u003cp\u003e使用以上的方法当从非指定的主机连结图片时,图片将无法显示。\u003c/p\u003e\n\u003cp\u003e如果希望显示一张“禁止盗链”的图片,我们可以用mod_rewrite 来实现。\u003c/p\u003e\n\u003cp\u003e首先在安装 apache 时要加上 –enable-rewrite 参数加载 mod_rewrite 模组。\u003c/p\u003e\n\u003cp\u003e假设“禁止盗链”的图片为abc.gif,我们在 httpd.conf 中可以这样配置:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eRewriteEngine on\u003c/p\u003e\n\u003cp\u003eRewriteCond %{HTTP_REFERER} !^$\u003c/p\u003e\n\u003cp\u003eRewriteCond %{HTTP_REFERER} !^http://(tech.)?ddvip.com /.*$ …\u003c/p\u003e\u003c/blockquote\u003e"
December 4, 2008
Apache的目录安全措施
"\u003cp\u003eApache Server 允许使用 .htaccess 做目录安全保护,欲读取这保护的目录需要先键入正确用户帐号与密码。\u003c/p\u003e\n\u003cp\u003e可做为系统管理者的专用管理网页存放的目录或做为专区,例如教师专区或行政专区使用。\u003c/p\u003e\n\u003cp\u003e方法为:在你要保护的目录放置一个档案,档名为.htaccss\n内容为:\u003c/p\u003e\n\u003cp\u003eAuthName “行政专区”\nAuthType “Basic”\nAuthUserFile “/var/tmp/xxx.pw” (把密码档放在网站外)\n(一定要大写)\nrequire valid-user\u003c/p\u003e\n\u003cp\u003e到apache/bin目录,开始建密码档\u003c/p\u003e\n\u003cp\u003e% ./htpasswd -c /var/tmp/xxx.pw username1\n(输入两次密码,第一次建档要用参数-c\u003c/p\u003e\n\u003cp\u003e% ./htpasswd /var/tmp/xxx.pw username2\n(输入两次密码)\u003c/p\u003e\n\u003cp\u003e如此一来,当要连结置於此保护目录内的网页时,就非得要是合法用户不可了.此法简单,保护能力极强,是Apache内附的模组,应善加使用。\n如果你们想修改密码,可以如下\u003c/p\u003e\n\u003cp\u003ehtpasswd -m .htpasswd webadmin\u003c/p\u003e\n\u003cp\u003e第5步:\u003c/p\u003e\n\u003cp\u003eok,重 …\u003c/p\u003e"
December 4, 2008
安装awstats来分析apache的访问日志
"\u003cp\u003e\u003cstrong\u003eAWStats: Advanced Web Statistics\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://awstats.sourceforge.net/\"\u003eAWStats\u003c/a\u003e是在\u003ca href=\"http://sourceforge.net/\"\u003eSourceforge\u003c/a\u003e上发展很快的一个基于Perl的WEB日志分析工具。相对于另外一个非常优秀的开放源代码的日志分析工具\u003ca href=\"http://www.webalizer.org/\"\u003eWebalizer\u003c/a\u003e,AWStats的优势在于:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e界面友好:可以根据浏览器直接调用相应语言界面(有简体中文版)\n\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2008/12/16144229358.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2008/12/16144229358.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e基于Perl:并且很好的解决了跨平台问题,系统本身可以运行在GNU/Linux上或Windows上(安装了\u003ca href=\"http://www.activestate.com/\"\u003eActivePerl\u003c/a\u003e后);分析的日志直接支持Apache格式 (combined)和IIS格式(需要修改)。Webalizer虽然也有\u003ca href=\"http://linux1.netconx.de/klaus/webalizer/\"\u003eWindows平台版\u003c/a\u003e,但目前已经缺乏维护;\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eAWStats完全可以实现用一套系统完成对自身站点不同WEB服务器:GNU/Linux/Apache和Windows/IIS服务器的统一统计。\n3. 效率比较高:AWStats输出统计项目比Webalizer丰富了很多,速度仍可以达到Webalizer的1/3左右,对于一个日访问量百万级的站点,这个速度都是足够的;\n4. 配置/定制方便:系统提供了足够灵活但缺省也很合理的配置规则,需要修改的缺 …\u003c/p\u003e"
December 4, 2008
Apache配置文件里各种权限的含义
"\u003cp\u003e/etc/apache/httpd.conf :\u003c/p\u003e\n\u003cp\u003eServerRoot “/usr”\u003c/p\u003e\n\u003cp\u003e#因为安装到/usr下,所以ServerRoot是/usr。在以下配置中,以相对路径写的就是对于相对/usr\u003c/p\u003e\n\u003cp\u003ePidFile /var/run/httpd.pid\u003c/p\u003e\n\u003cp\u003e#httpd启动时的pid存放位置,用于start/stop apache\u003c/p\u003e\n\u003cp\u003eTimeout 300\u003c/p\u003e\n\u003cp\u003e#连接超时时间\u003c/p\u003e\n\u003cp\u003eKeepAlive On\u003c/p\u003e\n\u003cp\u003e#允许持续连接,一个连接多个请求.\u003c/p\u003e\n\u003cp\u003eMaxKeepAliveRequests 200\u003c/p\u003e\n\u003cp\u003e#持续连接中最大连接数,推荐大一些获得最佳性能\u003c/p\u003e\n\u003cp\u003eKeepAliveTimeout 15\u003c/p\u003e\n\u003cp\u003e#Client 在15秒内没有下次请求则断线\u003c/p\u003e\n\u003cp\u003eMinSpareServers 5\u003c/p\u003e\n\u003cp\u003eMaxSpareServers 10\u003c/p\u003e\n\u003cp\u003ehttpd服务进程的数量,ps aux 可以看到\u003c/p\u003e\n\u003cp\u003eMaxClients 150\u003c/p\u003e\n\u003cp\u003e最大连接人数\u003c/p\u003e\n\u003cp\u003eListen 80\u003c/p\u003e\n\u003cp\u003e#监听端口\u003c/p\u003e\n\u003cp\u003e#ExtendedStatus On\u003c/p\u003e\n\u003cp\u003e#使用/server-status查询服务器状态时给予完全信息(ON)或基本信息(OFF) 默认为OFF\u003c/p\u003e\n\u003cp\u003eUser …\u003c/p\u003e"
December 3, 2008
配置apache服务器支持shtml
"\u003cp\u003e服务器采用shtml速度会比html慢,比php快。\u003c/p\u003e\n\u003cp\u003eshtml的特点就是能够进行页面包含,能够局部更新页面包含部分。广泛采用可以很容易解决网页中的广告问题,不需要更新全面静态页面。而只需更新一个包含页面即可。\u003c/p\u003e\n\u003cp\u003eapache下配置服务器支持shtml\u003c/p\u003e\n\u003cp\u003e打开文件:httpd.conf\u003c/p\u003e\n\u003cp\u003e去掉前面的 #LoadModule include_module modules/mod_include.so\u003c/p\u003e\n\u003cp\u003eOptions Indexes FollowSymLinks Includes\u003c/p\u003e\n\u003cp\u003eAllowOverride Options FileInfo\nOrder allow,deny\nAllow from all\u003c/p\u003e\n\u003cp\u003e找到下面两句,去掉前面的#\u003c/p\u003e\n\u003cp\u003eAddType text/html .shtml\nAddOutputFilter INCLUDES .shtml\u003c/p\u003e\n\u003cp\u003e重启apache即可。\u003c/p\u003e\n\u003cp\u003e建立页面:\u003c/p\u003e\n\u003cp\u003e测试\u003c/p\u003e\n\u003cp\u003efile为相对于当前文档的路径。\u003c/p\u003e\n\u003cp\u003evirtual为相对于虚拟目录的路径。\n如果需要让所有的html文件支持shtml.只需要修改上面一句。\u003c/p\u003e\n\u003cp\u003eAddOutputFilter INCLUDES .html\u003c/p\u003e"
November 29, 2008
windows下rsync的安装配置【数据同步】
"\u003cp\u003e 之前有转载了一篇 \u003ca href=\"http://www.indang.net/yinyou/2008/92.html\"\u003e《rsync中文手册,使用rsync实现网站镜像和备份》\u003c/a\u003e,介绍的是Linux下的安装配置,不过使用流程还是一样的。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ersync的配置环境\u003c/strong\u003e\n软件平台:windows2003\n软件版本:cwRsync_2.0.10_Installer cwRsync_Server_2.0.10_Installer\n硬件平台:dell2950 cpu1.6G*4 内存:4G 硬盘:1G*6 RAID5\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e===安装===\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在WINDOWS环境下安装rsync要安装服务端和客户端\u003c/p\u003e\n\u003cp\u003e服务器端安装:运行cwRsync_Server_2.0.10_Installer\n客户端安装:运行cwRsync _2.0.10_Installe\u003c/p\u003e\n\u003cp\u003e安装步骤和安装服务器端是一样的这里就不详细描述\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e===配置===\u003c/strong\u003e\n配置和我们在linux下面的配置一样,在安装目录中找到rsync.conf文件进行配置:\u003c/p\u003e\n\u003cp\u003eRsync.conf文件:\u003c/p\u003e\n\u003cp\u003epid file = /var/run/rsyncd.pid\u003c/p\u003e\n\u003cp\u003elock file = /var/run/rsync.lock\u003c/p\u003e\n\u003cp\u003elog file = …\u003c/p\u003e"
November 29, 2008
windosws2003 文件夹、文件拒绝访问、无法访问的终极解决方法
"\u003cp\u003ewindosws2003 文件夹 文件 拒绝访问 无法访问 终极解决方法\n您无权查看或编辑目前 200801 的权限设置;但是,您可以取得所有权或更改审核设置\u003c/p\u003e\n\u003cp\u003e详情:系统是raid1环境,期间覆盖过一次系统,自此以后很多站点目录下的目录的Administrator权限没了,有的可以打开,有的打不开直接提示:无法访问 * 拒绝访问,然后查看这个文件或文件夹的权限,点“安全”时提示:您无权查看或编辑目前 200705 的权限设置;但是,您可以取得所有权或更改审核设置。\u003c/p\u003e\n\u003cp\u003e解决方法:在站点根目录上右击--》属性--》安全--》下边有个高级--》所有者(选中“替换子容器及对象的所有者”然后点“应用”)--》切换到审核--》选中“口 许父项的继承审核项目传播到该对象和所有子对象,包括那些在此明确定义的项目”“口 用在此显示的那些可以应用到子对象的项目替代所有子对象的权限项目”点应用。--》关闭所有刚才打开的窗口--》看下是否成功,不出意外的话一般都会成功。\u003c/p\u003e"
November 29, 2008
rsync同步服务器 windows下的架设
"\u003cp\u003esync是linux下优秀的服务器同步备份软件,是个开源项目,用起来感觉非常的好,现在也有很多服务器是windows的,好在rsync也有windows下的版本,否则很多人将无法享受这么好的软件了。\u003c/p\u003e\n\u003cp\u003e下面讲下windows下rsync的架设步骤。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ersync特性简介\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ersync是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync。它的特性如下:\u003c/p\u003e\n\u003cp\u003e1、可以镜像保存整个目录树和文件系统。\n2、可以很容易做到保持原来文件的权限、时间、软硬链接等等。\n3、无须特殊权限即可安装。\n4、优化的流程,文件传输效率高。\n5、可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接。\n6、支持匿名传输。\n2. 安装\n**rsync的配置环境\n** 软件平台:windows2003\n软件版本:cwRsync_2.0.10_Installer cwRsync_Server_2.0.10_Installer\n硬件平台:dell2950 cpu1.6G*4 内存:4G 硬盘:1G*6 RAID5\u003c/p\u003e\n\u003cp\u003e2. 安装\u003c/p\u003e\n\u003cp\u003e在WINDOWS环境下安装rsync要安装服 …\u003c/p\u003e"
November 29, 2008
用Rsync从Linux到Windows远程备份
"\u003cp\u003ersync是Linux系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync。rsync支持大多数的类Unix系统,无论是Linux、Solaris还是BSD上都经过了良好的测试。rsync的最新版本可以从http://rsync.samba.org/rsync/获得。它的特性如下:\n1、可以镜像保存整个目录树和文件系统。\n2、可以很容易做到保持原来文件的权限、时间、软硬链接等等。\n3、无须特殊权限即可安装。\n4、优化的流程,文件传输效率高。\n5、可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接。\n本文介绍了如何使用rsync服务从Linux到Windows进行远程备份。\n一、配置服务器端\n首先我们需要配置rsync,打开配置文件/etc/xinetd.d/rsyncd.conf(如果没有请创建它),修改相应的配置项,并增加以下内容:\nuid = nobody # 备份以什么身份进行,用户ID\ngid = nobody # 备份以什么身份进行,组ID\n#注意这个用户ID和组ID,如果要方便的话,可以设置成root,这样rsync几乎 …\u003c/p\u003e"
November 29, 2008
rsync在windows与windows服务器之间的同步设置
"\u003cp\u003e一、windows与windows同步\u003c/p\u003e\n\u003cp\u003e1.准备两台机器:\u003c/p\u003e\n\u003cp\u003eserver—–192.168.0.201\u003c/p\u003e\n\u003cp\u003eclient—–192.168.0.202\u003c/p\u003e\n\u003cp\u003e2.下载windows版的rsync工具\u003c/p\u003e\n\u003cp\u003e具体软件下载链接我也忘了,不过在google应该可以搜索到。\u003c/p\u003e\n\u003cp\u003e我也将它上传到CU上……\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://blog.chinaunix.net/fileicon/zip.gif\" alt=\"\"\u003e\n文件:\u003c/p\u003e\n\u003cp\u003ecwRsync_2.0.10_Installer.zip\u003c/p\u003e\n\u003cp\u003e大小:\u003c/p\u003e\n\u003cp\u003e2953KB\u003c/p\u003e\n\u003cp\u003e下载:\n\u003ca href=\"http://blogimg.chinaunix.net/blog/upfile/070917224721.zip\"\u003e下载\u003c/a\u003e\u003cimg src=\"http://blog.chinaunix.net/fileicon/zip.gif\" alt=\"\"\u003e\n文件:\u003c/p\u003e\n\u003cp\u003ecwRsync_Server_2.0.10_Installer.zip\u003c/p\u003e\n\u003cp\u003e大小:\u003c/p\u003e\n\u003cp\u003e2821KB\u003c/p\u003e\n\u003cp\u003e下载:\n\u003ca href=\"http://blogimg.chinaunix.net/blog/upfile/070917224837.zip\"\u003e下载\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eserver端:cwRsync_Server_2.0.10_Installer.zip\u003c/p\u003e\n\u003cp\u003eclient端:cwRsync_2.0.10_Installer.zip\u003c/p\u003e\n\u003cp\u003e3.安装 与配置\u003c/p\u003e\n\u003cp\u003eSERVER:\u003c/p\u003e\n\u003cp\u003e(1)安装cwRsync_Server_2.0.10_Installer.zip\u003c/p\u003e\n\u003cp\u003e在开始程序中打开“start a unix bash shell”程序:\u003c/p\u003e\n\u003cp\u003e进入一个类似cmd的终端,输入如下命令:\u003c/p\u003e\n\u003cp\u003e$/bin/activate-user.sh\u003c/p\u003e\n\u003cp\u003e输入l\u003c/p\u003e\n\u003cp\u003e输入administrator …\u003c/p\u003e"
November 12, 2008
国内网站 WebServer 和所用 Cache 类型统计
"\u003cp\u003e综合类,从结果上来看 Apache 还是主流:\u003c/p\u003e\n\u003cp\u003eSite\nWebServer\nCache\n\u003ca href=\"http://www.baidu.com/\"\u003ewww.baidu.com\u003c/a\u003e\nBWS/1.0\u003c/p\u003e\n\u003cp\u003eN/A\n\u003ca href=\"http://www.qq.com/\"\u003ewww.qq.com\u003c/a\u003e\nApache\u003c/p\u003e\n\u003cp\u003esquid/2.6.STABLE5\n\u003ca href=\"http://www.sina.com.cn/\"\u003ewww.sina.com.cn\u003c/a\u003e\nApache/2.0.54 (Unix)\u003c/p\u003e\n\u003cp\u003eN/A\n\u003ca href=\"http://www.sohu.com/\"\u003ewww.sohu.com\u003c/a\u003e\nApache/1.3.37 (Unix) mod_gzip/1.3.26.1a\u003c/p\u003e\n\u003cp\u003esquid\n\u003ca href=\"http://www.163.com/\"\u003ewww.163.com\u003c/a\u003e\nApache/2.2.6 (Unix)\u003c/p\u003e\n\u003cp\u003eN/A\n\u003ca href=\"http://www.taobao.com/\"\u003ewww.taobao.com\u003c/a\u003e\nApache\u003c/p\u003e\n\u003cp\u003eN/A\n\u003ca href=\"http://www.google.cn/\"\u003ewww.google.cn\u003c/a\u003e\ngws\u003c/p\u003e\n\u003cp\u003eN/A\n\u003ca href=\"http://www.tom.com/\"\u003ewww.tom.com\u003c/a\u003e\nApache\u003c/p\u003e\n\u003cp\u003eNetCache NetApp/6.1.1D4\n\u003ca href=\"http://www.soso.com/\"\u003ewww.soso.com\u003c/a\u003e\nApache\u003c/p\u003e\n\u003cp\u003eN/A\n\u003ca href=\"http://www.youku.com/\"\u003ewww.youku.com\u003c/a\u003e\nApache\u003c/p\u003e\n\u003cp\u003eN/A\n\u003ca href=\"http://www.xunlei.com/\"\u003ewww.xunlei.com\u003c/a\u003e\nApache/2.2.8 (Unix)\u003c/p\u003e\n\u003cp\u003eN/A\n\u003ca href=\"http://www.eastmoney.com/\"\u003ewww.eastmoney.com\u003c/a\u003e\nMicrosoft-IIS/6.0\u003c/p\u003e\n\u003cp\u003eN/A\n\u003ca href=\"http://www.56.com/\"\u003ewww.56.com\u003c/a\u003e\nnginx/0.5.33 …\u003c/p\u003e"
November 12, 2008
卸载windows服务
"\u003cp\u003e 与“服务控制器”和已安装设备进行通讯。SC.exe 检索和设置有关服务的控制信息。可以使用 SC.exe 来测试和调试服务程序。可以设置存储在注册表中的服务属性来控制如何在启动时和作为后台程序运行时启动服务应用程序。SC.exe 的参数可以配置指定的服务,检索当前服务的状态,也可以停止和启动服务。可以生成批处理文件来调用不同的 SC.exe 命令以自动启动或关闭服务序列。SC.exe 提供的功能类似于“控制面板”中“管理工具”项中的“服务”。\u003c/p\u003e\n\u003cp\u003e 打开CMD后,运行SC命令得到如下help信息:\u003c/p\u003e\n\u003cp\u003e描述:\n SC 是用于与服务控制管理器通信的命令行程序。\n用法:\n sc [command] [service name] …\n 选项 的格式为 “\u003ca href=\"file://%20%20ServerName/\"\u003e\\ServerName\u003c/a\u003e”\n 可以键入 “sc [command]”以获得命令的进一步帮助\n 命令:\n query———–查询服务的状态,\n 或枚举服务类型的状态。 …\u003c/p\u003e"
November 11, 2008
apache 中控制虚拟主机的php功能
"\u003cp\u003e使用情况分以下两种:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一,在httpd.conf中配置了全局使用php脚本,则使用下面的方法\u003c/strong\u003e\n在虚拟主机的设置小节中添加php_flag engine on/off 字串7\u003c/p\u003e\n\u003cp\u003e如: 字串9\nServerName xxxxxx.com\nphp_flag engine off\nserveralias \u003ca href=\"https://www.xxxxxx.com\"\u003ewww.xxxxxx.com\u003c/a\u003e\nServerAdmin \u003ca href=\"mailto:webmaster@hanxiao2000.com\"\u003ewebmaster@hanxiao2000.com\u003c/a\u003e\nDocumentRoot “/home/xxxxxx/htdocs”\nhaohtml.com\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二.没有在httpd.conf中配置执行php脚本功能\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在虚拟主机配置中这样改:\u003c/p\u003e\n\u003cp\u003e 把 AddType application/x-httpd-php .php 这句话放到需要运行php的虚拟主机的配置中\u003c/p\u003e\n\u003cp\u003e #这个虚拟主机不能运行php\u003c/p\u003e\n\u003cp\u003e ServerAdmin \u003ca href=\"mailto:sc@lin.net.cn\"\u003esc@lin.net.cn\u003c/a\u003e\n DocumentRoot d:/www.haohtml.com/\n ServerName \u003ca href=\"http://www.haohtml.com/\"\u003ewww.haohtml.com\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e # …\u003c/p\u003e"
November 7, 2008
搭建一个大型网站架构的实验环境(Squid缓存服务器篇)
"\u003cp\u003e六、squid缓存服务器的配置\nsquid缓存服务器在这个实验环境中有两台(192.168.10.30,192.168.10.31)做成squid集群,我们首先安装一台,然后复制一台,再做配置,这样省事,哈!\nsquid01服务器网络配置\n# ee /etc/rc.conf\nifconfig_lnc0=”inet 192.168.10.30 netmask 255.255.255.0″\ndefaultrouter=”192.168.10.10″\nhostname=”squid01.rd.bj”\u003c/p\u003e\n\u003cp\u003e# ee /etc/hosts\n192.168.10.30 squid01.rd.bj # ee /etc/resolv.conf\nnameserver 192.168.10.40\u003c/p\u003e\n\u003cp\u003e网络配置好后,我们开始安装squid,先把的藏身处找到:\n# whereis squid30\nsquid30: /usr/ports/www/squid30\n# cd /usr/ports/www/squid30\n# make config #配置安装选项\n\u003ca href=\"/wp-content/uploads/2008/11/a.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/y1p7KaqJhsBYWiIJs9vizLd9gLTa-9GQEXfT3JxNOiO-0JPTQFirWsqM_NWAtZWWSHEZgzHqyfFbJTSm5zK4psu5pLQ42U6Kuiz.jpeg\" alt=\"sq_1\"\u003e\u003c/a\u003e\n# make showconfig # …\u003c/p\u003e"
November 2, 2008
Ubuntu下设置常见网络服务指南
"\u003cp\u003e基本DNS服务\u003c/p\u003e\n\u003cp\u003e主域名服务设置\u003c/p\u003e\n\u003cp\u003e从域名服务设置\u003c/p\u003e\n\u003cp\u003e缓存域名服务设置\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://forum.ubuntu.org.cn/viewtopic.php?t=3110\"\u003ehttp://forum.ubuntu.org.cn/viewtopic.php?t=3110\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e高级DNS服务\u003c/p\u003e\n\u003cp\u003e多重DNS解析服务(DNS服务器上相同域名根据内外网的不同解析成不同的IP地址) \u003ca href=\"http://forum.ubuntu.org.cn/viewtopic.php?t=453\"\u003ehttp://forum.ubuntu.org.cn/viewtopic.php?t=453\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e基本邮件服务\u003c/p\u003e\n\u003cp\u003e高级邮件服务\u003c/p\u003e\n\u003cp\u003e防垃圾邮件服务\u003c/p\u003e\n\u003cp\u003e安全邮件网关服务(防黑防毒)\u003c/p\u003e\n\u003cp\u003e具有Web操作界面\u003c/p\u003e\n\u003cp\u003e基本Web服务\u003c/p\u003e\n\u003cp\u003eApache2: \u003ca href=\"http://forum.ubuntu.org.cn/viewtopic.php?t=2143\"\u003ehttp://forum.ubuntu.org.cn/viewtopic.php?t=2143\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eZope/Plone: \u003ca href=\"http://forum.ubuntu.org.cn/viewtopic.php?t=5828\"\u003ehttp://forum.ubuntu.org.cn/viewtopic.php?t=5828\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e高级Web服务\u003c/p\u003e\n\u003cp\u003e虚拟域名服务 \u003ca href=\"http://forum.ubuntu.org.cn/viewtopic.php?t=10344\"\u003ehttp://forum.ubuntu.org.cn/viewtopic.php?t=10344\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eChroot环境设立 \u003ca href=\"http://forum.ubuntu.org.cn/viewtopic.php?t=2144\"\u003ehttp://forum.ubuntu.org.cn/viewtopic.php?t=2144\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003ePHP …\u003c/p\u003e"
October 30, 2008
Freebsd常用命令
"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003evi sshd_config\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# rar a all *.jpg\n这条命令是将任何.jpg的文档压缩成一个rar包,名为all.rar,该程式会将.rar 扩展名将自动附加到包名后。\n# unrar x all.rar\n这条命令是将all.rar中的任何文档解压出来\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eunrar x参数是指定用绝对路径解压缩文件,解压缩出来的路径和压缩文件里面的路径相同!\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e重启 SSHD 服务usr/ports/archivers/rar\n\nmake install clean\n\n#cd /usr/ports/archivers/unrar\n\n#make install clean\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e命令 /etc/rc.c/sshd restart\n光区挂载命令 mount /cdrom 卸载 UMOUNT /CDROM\n/usr/local/mysql/bin/mysqld_safe --user=mysql \u0026amp; mysql 启动命令\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e很多人都不知道freebsd下如何重启mysql.现在我把命令放到下面,希望对大家有些帮忙。\n/usr/local/etc/rc.d/mysql-server …\u003c/code\u003e\u003c/pre\u003e"
October 30, 2008
freebsd 添加、删除用户!
"\u003cp\u003e\u003cstrong\u003e2、更改用户登陆shell\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e默认安装是使用sh登陆的,sh不支持TAB键\n要切换到csh,直接运行csh即可\u003c/p\u003e\n\u003cp\u003e如果需要一劳永逸,那么用下面这个命令\nname:是指你登陆的名称\npw usermod -n name -s csh\u003c/p\u003e\n\u003cp\u003e======================================\n添加用户\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# pw groupadd vsftpd –g 1001\n# pw useradd test –g 1001–d /home/test –s /sbin/nologin\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e或者\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e#adduser\u003c/strong\u003e\nUsername:用户名\nFull name:全名\nUid (Leave empty for default) :要求输入UID值。通常按Enter即可。\nLogin group [xxxx]:要求输入用户的所属群组。可以输入一个现有的群组,如果保持空白,系统会新建一个与用户名一样的群组。\nLogin class:登入等級。通常按Enter即可。\nShell (sh csh tcsh zsh ksh bash nologin) [sh]:用户使用的shell,通常按Enter即可。 …\u003c/p\u003e"
October 29, 2008
500 OOPS: vsftpd: refusing to run with writable anonymous root
"\u003cp\u003e\u003cstrong\u003e500 OOPS: vsftpd: refusing to run with writable anonymous root\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e如果我们已经把vsFTPd服务器启动好了,但登录测试是会出现类似下面的提示;\u003c/p\u003e\n\u003cp\u003e500 OOPS: vsftpd: refusing to run with writable anonymous root\u003c/p\u003e\n\u003cp\u003e这表示ftp用户的家目录的权限不对,应该改过才对;\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e[root@localhost ~]# more /etc/passwd |grep ftp\u0026lt;br /\u0026gt; ftp:x:1000:1000:FTP User:/var/ftp:/sbin/nologin\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e我们发现ftp用户的家目录在/var/ftp,就是这个/var/ftp的权限不对所致,这个目录的权限是不能打开所有权限的;是您运行了chmod 777 /var/ftp所致;如果没有ftp用户这个家目录,当然您要自己建一个;\u003c/p\u003e\n\u003cp\u003e如下FTP用户的家目录是不能针对所有用户、用户组、其它用户组完全开放;\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e[root@localhost ~]# ls -ld /var/ftp\u0026lt;br /\u0026gt; …\u003c/code\u003e\u003c/p\u003e"
October 29, 2008
FREEBSD:VSFTP的安装和配置(packages方式)
"\u003cp\u003e一、预备工作:\n1.新建目录\nmkdir /usr/share/empty\nmkdir /var/ftp\n2.改变目录所有者和权限\nchown root:wheel /var/ftp(如果是Linux用chown root:root /var/ftp)\nchmod og-w /var/ftp (此命令是取消其他用户的写权限)\n二、安装VSFTP\n1.用tar包安装\ntar zvf vsftpd-2.0.1.gz.tar\ncd vsfpd-2.0.1\nmake\nmake install\n2.用ports安装(只适合FREEBSD,而且必须是可以上网的用户,对Linux用户不适用)\ncd /usr/ports/ftp/vsftpd\nmake\nmake install\n安装的时候会弹出一个对话框,\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2009/01/vsftp1.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/vsftp1.jpg\" alt=\"\"\u003e\u003c/a\u003e\n选中第一个选项项\n三、配置\n1.配置VSFTP\n打开/etc/vsftpd.conf,(如果用ports安装的话是在/usr/local/etc/vsftpd.conf),,相关参数说明如下:\n===个别使用者设定===================\nchroot_list_enable\n用 …\u003c/p\u003e"
October 29, 2008
freebsd 7.0 vsftpd如何启动!!
"\u003cp\u003e在etc/rc.conf中添加\nvsftpd_enable=”YES”\u003c/p\u003e\n\u003cp\u003e/usr/local/etc/vsftpd.conf中添加\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003elisten=YES\nbackground=YES\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e就可以了,还真是挺复杂,每个软件安装了都要修改配置文件才能启动!!\n如果出现错误\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e500 OOPS: vsftpd: cannot locate user specified in ‘ftp_username’:ftp\u003c/strong\u003e在vsftpd.conf中加入了ftp_username=xxx(用户)\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e以下命令可以用来重启vsftpd服务\u003c/strong\u003e\n# /usr/local/etc/rc.d/vsftpd restart\u003c/p\u003e"
October 29, 2008
[教程]FreeBSD下vsftp安装配置详解(ports方式)
"\u003cp\u003eFreeBSD功能强大,ftp服务器只是它其中的很基础的一种服务,但是作为日常的服务器运作ftp服务却是必不可少,本篇是本人自己在学习FreeBSD的服务器设置过程中的一些积累,因为自己也曾是由菜鸟入门,走了不少弯路,现在把自己的一些经验总结出来,供大家参考,希望对新人能有所帮助,不足之处还请大家多多指点.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1、安装\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e通过ports安装,这个方式比较简单。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# cd /usr/ports/ftp/vsftpd\n# make install\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2009/01/vsftp1.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/vsftp1-20230904193104456.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003ca href=\"/wp-content/uploads/2009/01/vsftp.jpg\"\u003e\n\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e安装过程中会弹出一个对话框架,选中第一个选项,我以前没有选中,结果安装完以后,在/usr/local/etc/rc.d/目录里没有vsftpd这个命令,导致启动的时候出现以下错误信息:\n\u003cstrong\u003e”500 OOPS: vsftpd: cannot open config file:start”\u003c/strong\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e**2、配置\n**\u003c/p\u003e\n\u003cp\u003e/usr/local/etc/vsftpd.conf文件一般按以下配置就差不多了:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eanonymous_enable=NO\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003elocal_enable=YES\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ewrite_enable=YES\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003elocal_umask=022 …\u003c/strong\u003e\u003c/p\u003e\u003c/blockquote\u003e"
October 15, 2008
PHP 危险函数解释
"\u003cp\u003e*** 在编译 PHP 时,如无特殊需要,一定禁止编译生成 CLI 命令行模式的 PHP 解析支持。\n可在编译时使用 –disable-cli。一旦编译生成 CLI 模式的 PHP,则可能会被入侵者\n利用该程序建立一个 WEBShell 后门进程或通过 PHP 执行任意代码!\u003c/p\u003e\n\u003cp\u003ephpinfo()\n功能描述:输出 PHP 环境信息以及相关的模块、WEB 环境等信息。\n危险等级:中\u003c/p\u003e\n\u003cp\u003epassthru()\n功能描述:允许执行一个外部程序并回显输出,类似于 exec()。\n危险等级:高\u003c/p\u003e\n\u003cp\u003eexec()\n功能描述:允许执行一个外部程序(如 UNIX Shell 或 CMD 命令等)。\n危险等级:高\u003c/p\u003e\n\u003cp\u003esystem()\n功能描述:允许执行一个外部程序并回显输出,类似于 passthru()。\n危险等级:高\u003c/p\u003e\n\u003cp\u003echroot()\n功能描述:可改变当前 PHP 进程的工作根目录,仅当系统支持 CLI 模式\nPHP 时才能工作,且该函数不适用于 Windows” onclick=”tagshow(event)” class=”t_tag”\u0026gt;Windows 系统。\n危险等级:高\u003c/p\u003e\n\u003cp\u003escandir()\n功能描 …\u003c/p\u003e"
October 15, 2008
Linux必学的60个命令
"\u003cp\u003eLinux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作、文件存取、目录操作、进程管理、文件权限设定等。所以,在Linux系统上工作离不开使用系统提供的命令。要想真正理解Linux系统,就必须从Linux命令学起,通过基础的命令学习可以进一步理解Linux系统。不同Linux发行版的命令数量不一样,但Linux发行版本最少的命令也有200多个。这里笔者把比较重要和使用频率最多的命令,按照它们在系统中的作用分成下面六个部分一一介绍。\u003c/p\u003e\n\u003cp\u003e◆ 安装和登录命令:login、shutdown、halt、reboot、install、mount、umount、chsh、exit、last;\n◆ 文件处理命令:file、mkdir、grep、dd、find、mv、ls、diff、cat、ln;\n◆ 系统管理相关命令:df、top、free、quota、at、lp、adduser、groupadd、kill、crontab;\n◆ 网络操作命令:ifconfig、ip、ping、netstat、telnet、ftp、route、rlogin、rcp、finger、mail、 …\u003c/p\u003e"
October 6, 2008
[精典] FreeBSD下安装MySQL+Apache+PHP新手指南
"\u003cp\u003e作者: heiyeluren\nQQ群: 5415735 (Linux/BSD安装维护群)\n日期: 2004/8/18\n— 特别感谢QQ群好友阿南,本文在他的耐心指导下才产生 —\u003c/p\u003e\n\u003cp\u003e看到朋友们在Unix/Linux上装mysql有点麻烦,我也好不容易装完了,所以就来讲件,也许能帮帮大家的忙. 我使用的操作系统是FreeBSD5.2.1,如果别的操作系统安装方法也许不一样,请酌情处理.\n安装FreeBSD就不讲了,只要稍微定制一下就可以了,过程我就不说了,我用的FreeBSD版本是5.2.1,应该是现在比较新的版本,以后就不知道了 🙂 .\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一. 安装MySQL\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e我使用的的Mysql是4.0.20,源代码版,你也可以使用RPM包或者二进制版,安装方法可能不一样,请参考其它文章.\n先下载Mysql2.0.20的源代码版,地址: \u003ca href=\"http://dev.mysql.com/downloads/mysql/4.0.html\"\u003ehttp://dev.mysql.com/downloads/mysql/4.0.html\u003c/a\u003e\n把它下到/usr/local/src目录下,如果没有该目录,就自己建一个.下载回来的包名字叫 mysql-4.0.20.tar.gz,然后我们把它解压出来:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e# tar -zxvf …\u003c/strong\u003e\u003c/p\u003e"
October 2, 2008
[精典教程]freebsd下安装mysql,apache,php,phpmyadmin记录
"\u003cp\u003e第一次在FREEBSD下配置环境,感觉好爽,安装的时候也参考了别人的介绍,在此表示感谢。\u003c/p\u003e\n\u003cp\u003e为了方便以后的操作,现在记录写下来。\u003c/p\u003e\n\u003cp\u003e**安装MYSQL时要注意:\n** mysql默认数据库放在/var分区里,如果你的数据库很大,那么你需要在前面分区的时候把/var分区分到足够大,\n如果你想改变它的安装目录,例如安装到:/usr/db.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e#cd /usr/ports/databases/mysql51-server\n\u003c/strong\u003e \u003cstrong\u003e#make WITH_CHARSET=utf8\u003c/strong\u003e \u003cstrong\u003eWITH_XCHARSET=all\u003c/strong\u003e \u003cstrong\u003eWITH_PROC_SCOPE_PTH=yes SKIP_DNS_CHECK=yes BUILD_OPTIMIZED=yes install clean\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e#cp /usr/local/share/mysql/my-large.cnf /etc/my.cnf\u003c/strong\u003e\n\u003cstrong\u003e#/usr/local/bin/mysql_install_db\n#chown -R mysql:mysql /var/db/mysql\n#/usr/local/bin/mysqld_safe \u0026amp; //启动mysql …\u003c/strong\u003e\u003c/p\u003e\u003c/blockquote\u003e"
October 2, 2008
Freebsd7.0下安装APACHP22服务器
"\u003cp\u003e(1)最小化安装FREEBSD7.0-RELEASE\n(2)安装APACHE22\nb2sun.com#cd /usr/ports/www\n这个目录下会有apache22这个目录.安装它就OK了.\nb2sun.com#setenv PACKAGESITE \u003ca href=\"ftp://ftp.freebsdchina.org/pub/FreeBSD/ports/i386/packages-7.0-release/Latest/\"\u003eftp://ftp.freebsdchina.org/pub/FreeBSD/ports/i386/packages-7.0-release/Latest/\u003c/a\u003e\n\u003cstrong\u003eb2sun.con#pkg_add -f -r apache22\u003c/strong\u003e\n这时系统会自动下载文件并安装\n\u003cstrong\u003eapache22_enable=”YES”\u003c/strong\u003e 这行加入/etc/rc.conf中.系统会自动启动这个服务.\n安装完成后您需要在/usr/local/www/apache22下面建立一个data的目录及一个index.html文件.这样就可正常启动apache22 并在其它客户端中访问您建立的服务器.\n**(b2sun.com#apachectl start(stop restart))**这个非常关键.\n最好 安装完后重新启动您的FreeBSD7操作系统.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eFAMP架构的建立\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eLAMP架构 …\u003c/p\u003e"
September 24, 2008
[教程]memcached for win32的安装
"\u003cp\u003ememcached是由livejournal团队(danga.com)制作的开源缓存软件,是缓存机制的一种实现,用它之所以高效,是因为它是利用了内存,使用好了能够大大加快页面或者是其它程序的执行速度。要注意的是一旦服务器停止,内存中的缓存数据会被清空。\u003c/p\u003e\n\u003cp\u003ewin32下,需要启动memcached服务,首先下载相关的memcached文件(用于启动服务的windows.rar在附件中),解压后可以自己选择,这里我选择的是2.1版本的,将其中的memcached.exe和memcached.ini(里面也就这俩文件)拷贝到某路径下(如:E:javamemcached2.1),然后通过cmd命令窗口,先转入到该路径,然后按如下步骤输入:\u003c/p\u003e\n\u003cp\u003e1、memcached.exe -d install\u003c/p\u003e\n\u003cp\u003e2、memcached.exe -d start\u003c/p\u003e\n\u003cp\u003e这里第一步是用于安装服务,第二步是用于启动服务,有些默认参数的值是通过memcached.ini里的相关元素的设置值而定的。\u003c/p\u003e\n\u003cp\u003e如果要停止服务和卸载服务可以用入下命令:\u003c/p\u003e\n\u003cp\u003e3、memcached.exe -d stop 或 memcached.exe -d …\u003c/p\u003e"
September 24, 2008
Windows下的Memcache安装
"\u003ch2 id=\"windows下的memcache安装\"\u003eWindows下的Memcache安装\u003c/h2\u003e\n\u003cp\u003e不用说了,这便是 \u003ca href=\"http://www.oschina.net/project/355\"\u003ememcached\u003c/a\u003e 在Windows系统下的版本。\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2008/09/memcached_win.zip\"\u003e(点击这里下载memcached for win32)\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWindows下的Memcache安装\u003c/strong\u003e:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e下载 \u003ca href=\"http://jehiah.cz/projects/memcached-win32\"\u003ememcache\u003c/a\u003e 的windows稳定版,解压放某个盘下面,比如在c:\\memcached\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e在终端(也即cmd命令界面)下输入 ‘c:\\memcached\\memcached.exe -d install’ 安装\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e再输入: ‘c:\\memcached\\memcached.exe -d start’ 启动。NOTE: 以后memcached将作为windows的一个服务每次开机时自动启动。这样服务器端已经安装完毕了。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e4.下载 \u003ca href=\"http://pecl4win.php.net/list.php\"\u003ephp_memcache.dll\u003c/a\u003e,请自己查找对应的php版本的文件\u003c/p\u003e\n\u003col start=\"5\"\u003e\n\u003cli\u003e在C:\\windows\\php.ini 加入一行 ‘extension=php_memcache.dll’\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e6.重新启动Apache,然后查看一下phpinfo,如果有memcache,那么就说明安装成功!\u003c/p\u003e\n\u003cp\u003e7.如果要卸载的话,可以执 …\u003c/p\u003e"
September 24, 2008
memcached与memcache的区别
"\u003cp\u003ememcached 像是一个后台服务器(也有客户端的memcached),memcache是php的一个模块,需要编译,像是一个客户端,memcached 和 memcache 是紧密结合的两个东西。\u003c/p\u003e\n\u003cp\u003e另外memcached也是一个客户端的.这点可以参考php手册得知.两者的区别也可以参考:\u003c/p\u003e\n\u003cp\u003e有关linux下memcache和memcached的安装方法请参考:\u003c/p\u003e\n\u003cp\u003e================================\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e说法一:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e两个不同版本的php的memcached的客户端\u003c/p\u003e\n\u003cp\u003enew memcache是pecl扩展库版本\nnew memcached是libmemcached版本\n功能差不多.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e说法二:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eMemcache是什么?\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eMemcache是一个自由和开放源代码、高性能、分配的内存对象缓存系统。用于加速动态web应用程序,减轻数据库负载。\n它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。\nMemcached是简单而强大的。它简单的设计促进迅速部署,易于发展 …\u003c/p\u003e"
September 24, 2008
memcached配置
"\u003cp\u003e\u003cstrong\u003e一、memcached 简介\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在很多场合,我们都会听到 \u003ca href=\"http://www.danga.com/memcached/\"\u003ememcached\u003c/a\u003e 这个名字,但很多同学只是听过,并没有用过或实际了解过,只知道它是一个很不错的东东。这里简单介绍一下,memcached 是高效、快速的分布式内存对象缓存系统,主要用于加速 WEB 动态应用程序。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二、memcached 安装\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e首先是下载 memcached 了,目前最新版本是 1.1.12,直接从官方网站即可下载到 \u003ca href=\"http://www.danga.com/memcached/dist/memcached-1.1.12.tar.gz\"\u003ememcached-1.1.12.tar.gz\u003c/a\u003e。除此之外,memcached 用到了 \u003ca href=\"http://monkey.org/~provos/libevent/\"\u003elibevent\u003c/a\u003e,我\u003ca href=\"http://monkey.org/~provos/libevent-1.1a.tar.gz\"\u003e下载的是 libevent-1.1a.tar.gz\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e接下来是分别将 libevent-1.1a.tar.gz 和 memcached-1.1.12.tar.gz 解开包、编译、安装:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# tar -xzf libevent-1.1a.tar.gz\n# cd libevent-1.1a\n# ./configure --prefix=/usr\n# make\n# make install\n# cd ..\n# tar -xzf memcached-1.1.12.tar.gz\n# cd …\u003c/code\u003e\u003c/pre\u003e"
March 28, 2008
解决Apache日志文件ACCESS.LOG日益膨胀的一个办法:
"\u003cp\u003e将httpd.conf中CustomLog logs/access.log common 改成\u003c/p\u003e\n\u003cp\u003eCustomLog “|c:/apache/bin/rotatelogs c:/apache/logs/%Y_%m_%d.access.log 86400 480” common\u003c/p\u003e\n\u003cp\u003e重启Apache\u003c/p\u003e\n\u003cp\u003e其中c:/apache/是你安装apache的路径\n这样每一天生成一个日志文件\u003c/p\u003e"
March 4, 2008
用3389连接远程服务器出现“没有终端许可证”
"\u003cp\u003e 用过windows server 2003做服务器的人都知道 windows2003的性能安全性比以前的windows版本高出很多,但是也带来很多麻烦。其中服务器最重要的远程管理“终端服务”居然要求授权,要许可证,否则120天过期。其实这个问题很好解决按照一下方法就可以。\u003c/p\u003e\n\u003cp\u003e操作步骤:\u003c/p\u003e\n\u003cp\u003e1,如果你服务器上已经开着终端服务,控制面板→添加删除程序→添加/删除windows组件→删除终端服务和终端授权服务。\u003c/p\u003e\n\u003cp\u003e这个时候回提示你重新启动计算机,请千万记住一定要点“否”,否则就麻烦了。\u003c/p\u003e\n\u003cp\u003e2、点我的电脑属性→远程→远程桌面→在启用这台计算机的远程桌面上打对勾→之后会得到提示,点确定就行→应用。\u003c/p\u003e\n\u003cp\u003e3、重新启动计算机大功搞成,不用任何破解软件,轻松加愉快。\u003c/p\u003e\n\u003cp\u003e其实这个服务在WINDOWS2003安装完就有,大家可以注意2003在添加/删除服务的时候经常不用从安装盘的I386里读东西,嘿嘿…………\u003c/p\u003e"
January 7, 2008
Apache基本配置指南
"\u003cp\u003e1、如果找不到文件的具体位置,在Linux下可以用类似locate httpd.conf的指令来搜索文件的位置。如果搜索不到,可以先用updatedb指令更新索引数据库再用locate搜索。\u003c/p\u003e\n\u003cp\u003e2、apachectl configtest或apachectl –t检查配置文件是否合法。apachectl一般位于安装目录的bin目录下(如:/usr/local/apache2/bin)。不要直接调用httpd。\u003c/p\u003e\n\u003cp\u003e3、配置文件是httpd.conf;在Linux系统中,它可能存在于系统配置目录(如:/etc/httpd/conf/),也可能存在于Apache的安装目录(如:/usr/local/apache2/conf)。\u003c/p\u003e\n\u003cp\u003e4、配置文件中,一行包含一个指令,但行尾可以用表示续行。与下一行之间不能有其它任何字符,包括空白字符。\n#表示这一行是注释。\u003c/p\u003e\n\u003cp\u003e5、指令对大小写不敏感,但是参数对大小定敏感,在Linux系统下,路径也要注意大小写。路径后不必加/。\u003c/p\u003e\n\u003cp\u003e6、类似于表示一个配置段。大多数配置段中的指令仅针对配置段所匹配的请求有效。但诸如 、、之类,是在Apache启动时,如果条件成立才有效,并且对 …\u003c/p\u003e"
January 7, 2008
20种让你的Apache配置更安全的方法
"\u003cp\u003e声明:关于安全的事情没有保证的或者绝对的。这些建议可以让你的服务器更安全,但不要认为遵循这些建议后你的服务器就理所当然是安全的。\u003c/p\u003e\n\u003cp\u003e另外,在这些建议中有的建议可能会降低服务器性能或者因为你的环境引起问题。我建议所作的任何改变是否适合你的需求完全由你决定。换句话说,那是你的风险。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、确保你安装的是最新的补丁\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e如果门是敞开的话,在窗户上加锁就毫无意义。同样道理,如果你没有打补丁,继续下面的操作就没有什么必要。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二、隐藏Apache的版本号及其它敏感信息\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e默认情况下,很多Apache安装时会显示版本号及操作系统版本,甚至会显示服务器上安装的是什么样的Apache模块。这些信息可以为黑客所用,并且黑客还可以从中得知你所配置的服务器上的很多设置都是默认状态。\u003c/p\u003e\n\u003cp\u003e这里有两条语句,你需要添加到你的httpd.conf文件中:\u003c/p\u003e\n\u003cp\u003eServerSignature Off\u003c/p\u003e\n\u003cp\u003eServerTokens Prod\u003c/p\u003e\n\u003cp\u003eServerSignature出现在Apache所产生的像404页面、目录列表等页面的底部。ServerTokens目录被用来判断Apache会在Server HTTP响应包的头部填充什么信息。如果 …\u003c/p\u003e"
January 5, 2008
让mysql能够远程连接
"\u003cp\u003e在远程连接mysql的时候发生的这个错误\u003c/p\u003e\n\u003cp\u003eERROR 1130: Host *\\\u003cem\u003e*.***.***.**\u003c/em\u003e is not allowed to connect to this MySQL server\u003c/p\u003e\n\u003cp\u003e**1。 改表法\n** 一:首先确认3306远程端口开启。\u003c/p\u003e\n\u003cp\u003e二:mysql默认不支持远连.必须设置。\u003c/p\u003e\n\u003cp\u003e如下:\u003c/p\u003e\n\u003cp\u003eroot权限进入\u003c/p\u003e\n\u003cp\u003emysql -u root -p密码\u003c/p\u003e\n\u003cp\u003euse mysql;\u003c/p\u003e\n\u003cp\u003eupdate db set host = ‘%’ where user = ‘用户名’;\u003c/p\u003e\n\u003cp\u003eFLUSH PRIVILEGES;\u003c/p\u003e\n\u003cp\u003e退出.然后重启mysql. 上面的那个用户即可远连你的mysql了.\u003c/p\u003e\n\u003cp\u003e记得为了安全一定要有个where条件。\u003c/p\u003e\n\u003cp\u003e三:host:%表示你的数据库接受任何一个IP的访问,而如果明确访问方机器的IP,可以设置host:访问方IP,所以在网络物理连接的前提下,限制是否能连接到你的数据库跟你自身的IP地址无关。\u003c/p\u003e\n\u003cp\u003e**2. 授权法。\n** 例如,你想myuser使用mypassword从任何主机连接到mysql服务器的话。\u003c/p\u003e\n\u003cp\u003eGRANT ALL PRIVILEGES ON *.* TO …\u003c/p\u003e"
October 28, 2007
windows下两个很有用的dns刷新命令
"\u003cp\u003e首先过往command提示符下:\u003c/p\u003e\n\u003cp\u003e先运行:ipconfig/displaydns这个命令,查看一下本机已经缓存了那些的dns信息的,然后输入下面的命令\u003c/p\u003e\n\u003cp\u003eipconfig/flushdns\u003c/p\u003e\n\u003cp\u003e这时本机的dns缓存信息已经清空了,我们可以再次输入第一次输入的命令来看一下,\u003c/p\u003e\n\u003cp\u003eipconfig/displaydns\u003c/p\u003e"
September 27, 2007
unix 查找文件
"\u003cp\u003e 如果你用的是linux,首先可以考虑用locate方法,一般够用了,而且速度很快,当然在用这个命令之前要生成文件数据库[execute updatedb in console],下面的是关于find的用法,具有通用性,在unix下也可以用\n每一种操作系统都是由成千上万个不同种类的文件所组成的。其中有系统本身自带的文件,用户自己的文件,还有共享文件等等。我们有时候经常忘记某份文件放在硬盘中的哪个地方。在微软的WINDOWS操作系统中要查找一份文件是相当简单的事情,只要在桌面上点击“开始”-“搜索”中就能按照各种方式在本地硬盘上,局域网络,甚至在INTERNET上查找各种文件,文档。\u003c/p\u003e\n\u003cp\u003e 可是使用Linux的用户就没有那么幸运了,在Linux上查找某个文件确实是一件比较麻烦的事情。毕竟在Linux中需要我们使用专用的“查找”命令来寻找在硬盘上的文件。Linux下的文件表达格式非常复杂,不象WINDOWS,DOS下都是统一的AAAAAAA.BBB格式那么方便查找,在WINDOWS中,只要知道要查找的文件的文件名或者后缀就非常容易查找到。Linux中查找文件的命令通 …\u003c/p\u003e"
September 27, 2007
freebsd6.2的gnome2桌面安装配置手记
"\u003cp\u003e1、安装\u003ca href=\"/?tag=freebsd\"\u003efreebsd\u003c/a\u003e6.2。\n这里我选择的是最小化安装。\u003c/p\u003e\n\u003cp\u003e2、安装xorg。\npkg_add -r xorg\u003c/p\u003e\n\u003cp\u003e3、安装gnome2。\npkg_add -r gnome2\u003c/p\u003e\n\u003cp\u003e4、生成、测试相关的配置文件\u003c/p\u003e\n\u003cp\u003eXorg -configure\n将生成xorg.conf.new文件在/root/目录下。\nXorg -configure /root/xorg.conf.new(6.2做这步时似乎必须加上/root/)\n这里测试下生成的配置文件,会出现1个布满小格子的大方框,并且应该有一个鼠标箭头。\n然后ctrl+alt+backspace返回文字符界面。\n然后编辑一下xorg.conf.new文件,然后拷贝至/etc/X11/xorg.conf\u003c/p\u003e\n\u003cp\u003e5、配置窗口管理器\n在/etc/rc.conf里加入gdm_enable=”YES”\n然后重新启动,就可以自动进入GUI界面了。\u003c/p\u003e"
September 27, 2007
在FreeBsd中安装ports
"\u003cp\u003e在\u003ca href=\"/?tag=freebsd\"\u003eFreeBsd\u003c/a\u003e中安装ports\n一.首先进入要安装的port的目录\n#cd /usr/ports/www/apache22\n二.执行make命令进行编译\n#make\n会出现一些提示信息,一旦编译完,就会回到命令行,下一步是安装port,只要在make后面添加一个单词install即可.\n三.安装port\n#make install\n会出现一些提示信息,完毕后会回到提示符,您就可以运行您安装的程序了\n四.清除安装时产生的一些临时信息:\n#make clean\n清理工作目录是个好注意,这个目录中包含了全部在编译过程中用到的临时文件,这些文件不公会占用宝贵的磁盘空间,而且可能给升级port时带来麻烦.\u003c/p\u003e\n\u003cp\u003e至此,安装ports的步骤基本已经完成.\u003c/p\u003e\n\u003cp\u003e注:以上三个命令make,make install,make clean可以使用组合命令make install clean来代替.\u003c/p\u003e"
August 31, 2007
在windows2003系统里的administrator账号禁用后的解决方法
"\u003cp\u003e在windows2003里!administrator账号禁用了,如何启用此账户呢,就只有这一个用户的,其实方法很简单的,我们可能通过重新启动服务器,按下F8键,在出现的dos菜单时,我们选择进入到安全模式下,用原来的用户名和密码登陆(在安全模式下被禁用的账户可以照常登陆的)。我们进去后,把账户重新启用即可。\u003c/p\u003e"
August 31, 2007
LINUX下加载U盘的方法
"\u003cp\u003e 首先,进入 ROOT 方式(指当前用户采用非root用户登陆时):\n 敲击命令 su root\n 成功后\n 显示 PASSWORD: 这时应该键入 用户 root 的登陆密码.\u003c/p\u003e\n\u003cp\u003e 第二步,确定在 目录 /mnt 下建立了 文件夹 /usb,如果未建立可键入一下命令:\n md /mnt/usb\n 成功后进行下一步。\u003c/p\u003e\n\u003cp\u003e 第三步, 载入 u 盘,需键入以下命令:\n mount /dev/sda1 /mnt/usb\n 成功后,即可使用 u 盘了\n u 盘里的文件 就在目录 /mnt/usb 下。\u003c/p\u003e\n\u003cp\u003e 第四步,卸载u盘\n 在使用完u盘后,在拔出前需要先键入卸载U盘命令\n 命令如下:\n umount /mnt/usb\u003c/p\u003e"
August 30, 2007
IIS5.0 IIS5.1 IIS6.0 IIS安装包 系列下载
"\u003cp\u003e\u003cstrong\u003e\u003ca href=\"/?tag=iis\"\u003eIIS\u003c/a\u003e5.1 windows xp用\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e我感觉大家用到IIS安装包也都在网吧吧, 网吧一般都是xp吧,所以说IIS5.1才是最实用的 下载地址1 \u003ca href=\"http://www.softhy.net/softhy.net\"\u003ehttp://www.softhy.net/softhy.net\u003c/a\u003e_down/softhy.net_iis51.rar\n下载地址2\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003eIIS5.0 windows 2000用\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e下载地址1 \u003ca href=\"http://cq.down.chinaz.com/soft11/iis5.rar\"\u003ehttp://cq.down.chinaz.com/soft11/iis5.rar\u003c/a\u003e\n下载地址2 \u003ca href=\"http://sc.down.cnzzz.com/vvdcnzzz/soft11/iis5.rar\"\u003ehttp://sc.down.cnzzz.com/vvdcnzzz/soft11/iis5.rar\u003c/a\u003e\n下载地址3http://down21.codefans.com/server/IIS5.rar\n下载地址4http://down21.codes.com.cn/server/IIS5.rar\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003eIIS6.0 windows 2003用\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e下载地址1\n下载地址2\u003ca href=\"http://ftpa.xiaoshen.cn:2121/2005/09/IIS6.0.rar\"\u003ehttp://ftpa.xiaoshen.cn:2121/2005/09/IIS6.0.rar\n\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e"
August 3, 2007
Pagefile.sys是什么文件?
"\u003cp\u003e 是系统页面文件,跟你的休眠有关系,一般等于你的内促农大小或者虚拟内存大小,可以在别的操作系统下删除,但是你下次登陆,它又自动生成。\n 默认是在系统盘的 只要你没有更改 用Winrar打开系统盘就能看到 修改的话可以用下面的方法找到所在磁盘以及修改\n Windows 9x的虚拟内存分页位置,其实就是保存在C盘根目录下的一个虚拟内存文件(也称为交换文件)Win386.swp,它的存放位置可以是任何一个分区,如果系统盘C容量有限,我们可以把Win386.swp调到别的分区中,方法是在记事本中打开System.ini(C:\\Windows下)文件,在[386Enh]小节中,将“PagingDrive=C:WindowsWin386.swp”,改为其他分区的路径,如将交换文件放在D:中,则改为“PagingDrive=D:Win386.swp”,如没有上述语句可以直接键入即可。\n 而对于使用Windows 2000和Windows XP的,可以选择“控制面板→系统→高级→性能”中的“设置→高级→更改”,打开虚拟内存设置窗口,在驱动器[卷标]中默认选择的是 …\u003c/p\u003e"
July 23, 2007
请求资源正在使用中
"\u003cp\u003e昨天上海服务器中了arp病毒了,没有办法,机房非得让重新做系统不可了,真郁闷呀,上次做了系统以后,正正好好才一个星期,今天又要做,客户非得气死不可了.\u003c/p\u003e\n\u003cp\u003e重新开通iis后,发现asp文件无法运行.显示HTTP500错误,把服务器里的IE选项里的”显示友好HTTP错误信息“取消,再浏览,请求的资源在使用中。”,真晕了,看了其它配置都没有问题的,后来才百度一百度了一下,找了下面的解决办法.\u003c/p\u003e\n\u003cp\u003e 后来仔细看了看,发现:只要打开单机版杀毒的脚本监控IIS6.0就会不正常。这就说明这可能和脚本的出错有关。运行regsvr32 jscript.dll(命令功能:修复Java动态链接库) 和 regsvr32 vbscript.dll(命令功能:修复VB动态链接库) 重新注册JAVA脚本和VB脚本的动态链接库后一切正常。\u003c/p\u003e\n\u003cp\u003e方法一:可能和脚本的出错有关,运行regsvr32 jscript.dll和 regsvr32 vbscript.dll重新注册JAVA脚本和VB脚本的动态链接库\u003c/p\u003e\n\u003cp\u003e方法二:在IIS中删除原来的网站,再删除原来的应用池。然后重新建应用池,重新建网站。就解决了。\u003c/p\u003e\n\u003cp\u003e出现这个情况,可能是 …\u003c/p\u003e"
July 19, 2007
日志文件分析工具—AWStats在IIS中的配置
"\u003cp\u003e\u003ca href=\"http://sourceforge.net/projects/awstats/\"\u003eAWStats\u003c/a\u003e 是sourceforge.net上很有名的Web/Mail/FTP服务器日志文件分析工具,可以运行在windows系统上分析IIS日志文件,本文讲的是AWStats在windows下的安装及配置。\u003c/p\u003e\n\u003cp\u003e运行环境说明:\u003c/p\u003e\n\u003cp\u003e操作系统Microsoft Windows Server 2003 SP2简体中文企业版\u003c/p\u003e\n\u003cp\u003eWeb服务器IIS 6.0\u003c/p\u003e\n\u003cp\u003ePerl:ActivePerl 5.8.8.820\u003c/p\u003e\n\u003cp\u003eAWStats 6.7\u003c/p\u003e\n\u003ch4 id=\"一iis配置\"\u003e一、IIS配置\u003c/h4\u003e\n\u003cp\u003e1.启用IIS日志记录:打开windows运行对话框(Windows+R),输入inetmgr,打开Internet 信息服务(IIS)管理器控制台界面,在控制台左边“网站”项目上点击鼠标右键,打开“网站属性”设置窗口,在“网站”标签中,将“启用日志记录”前的复选框选中,再点击“应用”按钮,使设置生效。\u003c/p\u003e\n\u003cp\u003e2.日志格式设置:活动日志格式选择“W3C扩展日志文件格式,再点击“属性”按钮,进入日志记录属性配置界面,新日志计划选择“每天”,勾选“文件名和创建使用当地时间”,日志文件目录默认为C:WINDOWSsystem32LogFiles,由于Web服务器的长 …\u003c/p\u003e"
Category: Nosql
August 3, 2018
redis list数据类型 不同编码ziplist 和 linkedlist的区别
"\u003cp\u003e\u003ca href=\"https://my.oschina.net/justfairytale/blog/393830\"\u003ehttps://my.oschina.net/justfairytale/blog/393830\u003c/a\u003e\u003c/p\u003e"
August 1, 2018
Redis单线程架构
"\u003ch3 id=\"1-单线程模型\"\u003e1 单线程模型\u003c/h3\u003e\n\u003cp\u003eRedis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程。其中执行命令阶段,由于Redis是单线程来处理命令的,所有每一条到达服务端的命令不会立刻执行,所有的命令都会进入一个队列中,然后逐个被执行。并且多个客户端发送的命令的执行顺序是不确定的。但是可以确定的是不会有两条命令被同时执行,不会产生并发问题,这就是Redis的单线程基本模型。\u003c/p\u003e\n\u003ch3 id=\"2-单线程模型每秒万级别处理能力的原因\"\u003e2 单线程模型每秒万级别处理能力的原因\u003c/h3\u003e\n\u003cp\u003e(1)纯内存访问。数据存放在内存中,内存的响应时间大约是100纳秒,这是Redis每秒万亿级别访问的重要基础。\u003c/p\u003e\n\u003cp\u003e(2)非阻塞I/O,Redis采用epoll做为I/O多路复用技术的实现,再加上Redis自身的事件处理模型将epoll中的连接,读写,关闭都转换为了时间,不在I/O上浪费过多的时间。\u003c/p\u003e\n\u003cp\u003e(3)单线程避免了线程切换和竞态产生的消耗。\u003c/p\u003e\n\u003cp\u003e(4)Redis采用单线程模型,每条命令执行如果占用大量时间,会造成其他线程阻塞,对于Redis这种高性能服务是致命的,所以Redis是面向高速执行的数据库。\u003c/p\u003e\n\u003cp\u003eredis为什么要设计成单线程: …\u003c/p\u003e"
August 1, 2018
Redis中的锁
"\u003cp\u003e单Redis实例锁: \u003ca href=\"http://www.redis.cn/commands/setnx.html\"\u003ehttp://www.redis.cn/commands/setnx.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e分布式锁: \u003ca href=\"http://redis.cn/topics/distlock.html\"\u003ehttp://redis.cn/topics/distlock.html\u003c/a\u003e(提供各种开发语言提供的库)\u003c/p\u003e"
April 13, 2017
MongoDB中字段的添加与删除
"\u003cp\u003emongoDB添加和删除表中一个字段\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e使用update命令\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eupdate命令格式:\u003c/p\u003e\n\u003cp\u003edb.collection.update(criteria,objNew,upsert,multi)\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e参数说明:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ecriteria:查询条件\u003c/p\u003e\n\u003cp\u003eobjNew:update对象和一些更新操作符\u003c/p\u003e\n\u003cp\u003eupsert:如果不存在update的记录,是否插入objNew这个新的文档,true为插入,默认为false,不插入。\u003c/p\u003e\n\u003cp\u003emulti:默认是false,只更新找到的第一条记录。如果为true,把按条件查询出来的记录全部更新。\u003c/p\u003e\n\u003cp\u003e//例如要把User表中address字段删除\ndb.User.update({},{$unset:{‘address’:”}},false, true)\u003c/p\u003e\n\u003cp\u003e参考: \u003ca href=\"https://docs.mongodb.com/manual/reference/method/db.collection.update/#update-parameter\"\u003ehttps://docs.mongodb.com/manual/reference/method/db.collection.update/#update-parameter\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e==================\u003c/p\u003e\n\u003cp\u003e添加一列 $set\u003c/p\u003e\n\u003cp\u003e//字符类型\ndb.User.update({},{$set:{‘app_id’:’1′}}, …\u003c/p\u003e"
May 25, 2012
从PHP客户端看MongoDB通信协议
"\u003cp\u003eMongoDB的 PHP 客户端有一个 MongoCursor 类,它是用于获取一次查询结果集的句柄(或者叫游标),这个简单的取数据操作,内部实现其实不是那么简单。本文就通过对 MongoCursor 类一些操作进行分析,向大家揭开 MongoDB 客户端服务器通信的一些内部细节。\u003c/p\u003e\n\u003ch3 id=\"getnext与网络请求\"\u003egetNext与网络请求\u003c/h3\u003e\n\u003cp\u003e通常来说,每一次find操作都会返回一个MongoCursor对象,在这个对象上调用getNext方法,就能够获得一条结果数据。循环调用getNext方法就能获取多条数据。下面我们就来看看其内部取数据的具体逻辑。\u003c/p\u003e\n\u003cp\u003e首先我们用最简单的方法来生成一个MongoCursor对象:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$m = new Mongo();\n$collection = $m-\u0026gt;demoDb-\u0026gt;demoCollection;\n$cursor = $collection-\u0026gt;find();\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e当我们调用 find 方法的时候,会生成一个 MongoCursor 对象,而这时候只是生成一个内存中的对象而已,并不会把我们的 find 查询发送到服务端,因为在生成 MongoCursor 对象后,我们还可能对 …\u003c/p\u003e"
May 12, 2012
MongoDB 客户端 MongoVue
"\u003cp\u003e今天在同事那里看到了一个很不错的MongoDB的客户端工具MongoVue,地址是\u003ca href=\"http://www.mongovue.com/\" title=\"http://www.mongovue.com/\"\u003ehttp://www.mongovue.com/\u003c/a\u003e。做的不错,1.0版本的开始收费了,费用也不贵才35$。真正需要的同学可以掏点钱买个吧,也算是支持这个工具,如果只是学习研究用的话我这里还有一个0.9.7版本,虽然比起1.0版来说有些bug,平常使用也够了,需要的同学可以单独联系我。\u003c/p\u003e\n\u003cp\u003e1.0版之后超过15天后功能受限。可以通过删除以下注册表项来解除限制:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[HKEY_CURRENT_USER\\Software\\Classes\\CLSID{B1159E65-821C3-21C5-CE21-34A484D54444}\\4FF78130]\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e把这个项下的值全删掉就可以了。\u003c/p\u003e\n\u003cp\u003e下面上图给大家感受下强大的MongoVue,可以提高你使用MongoDB的幸福指数好几十点,上图是王道:\u003c/p\u003e\n\u003cp\u003e1、配置连接\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://images.cnblogs.com/cnblogs_com/shanyou/201105/201105202156379291.png\"\u003e\u003cimg src=\"http://images.cnblogs.com/cnblogs_com/shanyou/201105/201105202156425175.png\" alt=\"image\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e2、试下新建一个名为AccessLog的Collection :\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://images.cnblogs.com/cnblogs_com/shanyou/201105/201105202156459404.png\"\u003e\u003cimg src=\"http://images.cnblogs.com/cnblogs_com/shanyou/201105/20110520215648644.png\" alt=\"image\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://images.cnblogs.com/cnblogs_com/shanyou/201105/201105202156514807.png\"\u003e\u003cimg src=\"http://images.cnblogs.com/cnblogs_com/shanyou/201105/201105202156569851.png\" alt=\"image\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e3、插入一个Document\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://images.cnblogs.com/cnblogs_com/shanyou/201105/201105202157028144.png\"\u003e\u003cimg src=\"http://images.cnblogs.com/cnblogs_com/shanyou/201105/201105202157041435.png\" alt=\"image\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e4、查看我们插入的数据,数据可以通过多种方式展示(树形、表格、文本)\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://images.cnblogs.com/cnblogs_com/shanyou/201105/201105202157089643.png\"\u003e\u003cimg src=\"http://images.cnblogs.com/cnblogs_com/shanyou/201105/201105202157113806.png\" alt=\"image\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e上面我们都是通过图形界面的操作的吧,下面有一个窗口 …\u003c/p\u003e"
May 10, 2012
Mongodb 与mysql 语法比较
"\u003cp\u003emongodb与mysql命令对比\u003c/p\u003e\n\u003cp\u003e传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由**数据库(database)、集合(collection)、文档对象(document)**三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eMySQL\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eMongoDB\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e说明\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003emysqld\u003c/p\u003e\n\u003cp\u003emongod\u003c/p\u003e\n\u003cp\u003e服务器守护进程\u003c/p\u003e\n\u003cp\u003emysql\u003c/p\u003e\n\u003cp\u003emongo\u003c/p\u003e\n\u003cp\u003e客户端工具\u003c/p\u003e\n\u003cp\u003emysqldump\u003c/p\u003e\n\u003cp\u003emongodump\u003c/p\u003e\n\u003cp\u003e逻辑备份工具\u003c/p\u003e\n\u003cp\u003emysql\u003c/p\u003e\n\u003cp\u003emongorestore\u003c/p\u003e\n\u003cp\u003e逻辑恢复工具\u003c/p\u003e\n\u003cp\u003edb.repairDatabase()\u003c/p\u003e\n\u003cp\u003e修复数据库\u003c/p\u003e\n\u003cp\u003emysqldump\u003c/p\u003e\n\u003cp\u003emongoexport\u003c/p\u003e\n\u003cp\u003e数据导出工具\u003c/p\u003e\n\u003cp\u003esource\u003c/p\u003e\n\u003cp\u003emongoimport\u003c/p\u003e\n\u003cp\u003e数据导入工具\u003c/p\u003e\n\u003cp\u003egrant * privileges on \u003cem\u003e.\u003c/em\u003e to …\u003c/p\u003e\n\u003cp\u003eDb.addUser()\u003c/p\u003e\n\u003cp\u003eDb.auth()\u003c/p\u003e\n\u003cp\u003e新建用户并权限\u003c/p\u003e\n\u003cp\u003eshow databases\u003c/p\u003e\n\u003cp\u003eshow dbs\u003c/p\u003e\n\u003cp\u003e显示库列表\u003c/p\u003e\n\u003cp\u003eShow tables\u003c/p\u003e\n\u003cp\u003eShow collections …\u003c/p\u003e"
May 10, 2012
MongoDB数据库优化:Mongo Database Profiler
"\u003cp\u003e在MySQL中,慢查询日志是经常作为我们优化数据库的依据,那在MongoDB中是否有类似的功能呢?答案是肯定的,那就是Mongo Database Profiler.不仅有,而且还有一些比MySQL的Slow Query Log更详细的信息。它就是我们这篇文章的主题。\u003c/p\u003e\n\u003cp\u003e** 开启 Profiling 功能**\u003c/p\u003e\n\u003cp\u003e有两种方式可以控制 Profiling 的开关和级别,第一种是直接在启动参数里直接进行设置。\u003c/p\u003e\n\u003cp\u003e启动MongoDB时加上–profile=级别 即可。\u003c/p\u003e\n\u003cp\u003e也可以在客户端调用db.setProfilingLevel(级别) 命令来实时配置。可以通过db.getProfilingLevel()命令来获取当前的Profile级别。\n \u0026gt; db.setProfilingLevel(2);\u003c/p\u003e\n\u003cp\u003e{“was” : 0 , “ok” : 1}\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e db.getProfilingLevel()\n 上面斜体的级别可以取0,1,2 三个值,他们表示的意义如下:\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e0 – 不开启\u003c/p\u003e\n\u003cp\u003e1 – 记录慢命令 (默认为\u0026gt;100ms)\u003c/p\u003e\n\u003cp\u003e2 – 记录所有命令\u003c/p\u003e\n\u003cp\u003eProfile 记录在级别1时会记录慢命令,那么这 …\u003c/p\u003e"
May 7, 2012
Mongodb亿级数据量的性能测试
"\u003cp\u003e进行了一下Mongodb亿级数据量的性能测试,分别测试如下几个项目:\u003c/p\u003e\n\u003cp\u003e(所有插入都是单线程进行,所有读取都是多线程进行)\u003c/p\u003e\n\u003cp\u003e1) 普通插入性能 (插入的数据每条大约在1KB左右)\u003c/p\u003e\n\u003cp\u003e2) 批量插入性能 (使用的是官方C#客户端的InsertBatch),这个测的是批量插入性能能有多少提高\u003c/p\u003e\n\u003cp\u003e3) 安全插入功能 (确保插入成功,使用的是SafeMode.True开关),这个测的是安全插入性能会差多少\u003c/p\u003e\n\u003cp\u003e4) 查询一个索引后的数字列,返回10条记录(也就是10KB)的性能,这个测的是索引查询的性能\u003c/p\u003e\n\u003cp\u003e5) 查询两个索引后的数字列,返回10条记录(每条记录只返回20字节左右的2个小字段)的性能,这个测的是返回小数据量以及多一个查询条件对性能的影响\u003c/p\u003e\n\u003cp\u003e6) 查询一个索引后的数字列,按照另一个索引的日期字段排序(索引建立的时候是倒序,排序也是倒序),并且Skip100条记录后返回10条记录的性能,这个测的是Skip和Order对性能的影响\u003c/p\u003e\n\u003cp\u003e7) 查询100条记录(也就是100KB)的性能(没有排序,没有条件),这个测的是大数据量的查询结果对性能的影响\u003c/p\u003e\n\u003cp\u003e8) 统计随着测试的进行,总磁盘占用,索引磁盘占用以及数 …\u003c/p\u003e"
May 7, 2012
mongodb索引讲解与性能调优
"\u003cp\u003emongodb索引规则基本上与传统的关系库一样,大部分优化MySQL/Oracle/SQLite索引的技巧也适用于mongodb。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、 为什么用索引:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e当查询中用到某些条件时,可以对该键建立索引,以提高查询速度。\u003c/p\u003e\n\u003cp\u003e如果数据量很多且查询多于更新时,可以用索引提高查询的速度。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二、 索引管理:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ea) 查询索引:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e查询已有索引的明细:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e查询索引很简单,比如说需要查询mailaccess数据库中的Mail collection上的索引时:\u003c/p\u003e\n\u003cp\u003emongo 进入mongo\u003c/p\u003e\n\u003cp\u003eMongoDB shell version: 1.8.1\u003c/p\u003e\n\u003cp\u003econnecting to: test\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003euse mailaccess 进入mailaccess database\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eswitched to db mailaccess\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003edb.Mail.getIndexes() 查询索引明细\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e[\u003c/p\u003e\n\u003cp\u003e{\u003c/p\u003e\n\u003cp\u003e“name” : “_id_”,\u003c/p\u003e\n\u003cp\u003e“ns” : “mailaccess.Mail”,\u003c/p\u003e\n\u003cp\u003e“key” : { …\u003c/p\u003e"
May 7, 2012
MongoDB 索引数据类型优化,节省60%内存
"\u003cp\u003e最近trunk.ly的工程师通过mongostat发现了大量的page fault,然后通过检查发现,他们的索引已经超出内存限制了(没有\u003ca href=\"http://blog.boxedice.com/2010/12/13/mongodb-monitoring-keep-in-it-ram/\"\u003ekeep all index in RAM\u003c/a\u003e)。于是他们决定开始减小索引大小,通过测试得出了如下的数据,不同的数据类型的索引大小有2到3倍的差距。\u003c/p\u003e\n\u003cp\u003e虽然能够想像得到,但是直观的数据图可能让我们更深刻的认识到。他们的测试再一次告诉我们:给索引定一个好的数据结构是多么重要。\u003c/p\u003e\n\u003cp\u003e这是测试结果图,分别是用int、MongoDB的ObjectID、base64和md5的字符串做索引产生的索引大小:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2012/05/mongodb_indexes_optimize.jpeg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2012/05/mongodb_indexes_optimize.jpeg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e测试过程也非常简单,首先用下面脚本将各种不同数据结构的数据写入到不同的collection里:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#!/usr/bin/env python\n\nimport pymongo\nimport bson\nfrom pymongo import Connection\n\ndb = connection.test_database\n\nprint(\u0026#39;ObjectID\u0026#39;)\nfor i in range(1, 1000000): …\u003c/code\u003e\u003c/pre\u003e"
May 7, 2012
mongodb的监控与性能优化
"\u003cp\u003e\u003cstrong\u003e一.mongodb的监控\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003emongostat是mongdb自带的状态检测工具,在命令行下使用。它会间隔固定时间获取mongodb的当前运行状态,并输出。如果你发现数据库突然变慢或者有其他问题的话,你第一手的操作就考虑采用mongostat来查看mongo的状态。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://photo.l99.com/bigger/30/1332836385675_ii0c6z.png\" alt=\"立方图片分享\"\u003e\u003c/p\u003e\n\u003cp\u003e它的输出有以下几列:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003einserts/s 每秒插入次数\u003c/li\u003e\n\u003cli\u003equery/s 每秒查询次数\u003c/li\u003e\n\u003cli\u003eupdate/s 每秒更新次数\u003c/li\u003e\n\u003cli\u003edelete/s 每秒删除次数\u003c/li\u003e\n\u003cli\u003egetmore/s 每秒执行getmore次数\u003c/li\u003e\n\u003cli\u003ecommand/s 每秒的命令数,比以上插入、查找、更新、删除的综合还多,还统计了别的命令\u003c/li\u003e\n\u003cli\u003eflushs/s 每秒执行fsync将数据写入硬盘的次数。\u003c/li\u003e\n\u003cli\u003emapped/s 所有的被mmap的数据量,单位是MB,\u003c/li\u003e\n\u003cli\u003evsize 虚拟内存使用量,单位MB\u003c/li\u003e\n\u003cli\u003eres 物理内存使用量,单位MB\u003c/li\u003e\n\u003cli\u003efaults/s 每秒访问失败数(只有Linux有),数据被交换出物理内存,放到swap。不要超过100,否则就是机器内存太小,造成频繁swap写入。此时要升级内存或者扩展\u003c/li\u003e\n\u003cli\u003elocked % 被锁的时间百分比,尽量控制在50%以下吧\u003c/li\u003e\n\u003cli\u003eidx miss …\u003c/li\u003e\u003c/ul\u003e"
May 7, 2012
Mongdb监控 (MMS)
"\u003cp\u003eMMS (MongoDB Monitoring Service) is a hosted application created by \u003ca href=\"http://10gen.com/\"\u003e10gen\u003c/a\u003e for monitoring MongoDB deployments. MMS Collects statistics on all key server and hardware indicators and presents this data through an intuitive web interface\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e先简单说下原理:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1、在mms服务器上添加mongodb服务器的ip,端口,user,password.\n2、在mongodb服务器所在的内网空闲机器上安装定制的agent脚本。\n3、agent脚本从mms获取你的服务器Ip及端口等信息,然后连接到mongodb服务器获取必要的监控数据。\n4、agent脚本将监控信息上传到mms服务器,我们登陆后就可以查看到相应的信息了。\u003c/p\u003e\n\u003cp\u003e主页地址如下\u003c/p\u003e\n\u003cp\u003e1. \u003ca href=\"https://mms.10gen.com/help/install.html\"\u003ehttps://mms.10gen.com/help/install.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e在Hosts项上点击添加,此处hostname填写内 …\u003c/p\u003e"
May 3, 2012
三招解决MongoDB的磁盘IO问题
"\u003cp\u003e有点标题党的意思,不过下面三招确实比较实用,内容来自Conversocial公司的VP Colin Howe在London MongoDB用户组的一个分享。\n申请:下面几点并非放四海皆准的法则,具体是否能够使用,还需要根据自己的应用场景和数据特点来决定。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.使用组合式的大文档\u003c/strong\u003e\n我们知道MongoDB是一个文档数据库,其每一条记录都是一个JSON格式的文档。比如像下面的例子,每一天会生成一条这样的统计数据:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e{ metric: “content_count”, client: 5, value: 51, date: ISODate(“2012-04-01 13:00”) }\n{ metric: “content_count”, client: 5, value: 49, date: ISODate(“2012-04-02 13:00”) }\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e而如果采用组合式大文档的话,就可以这样将一个月的数据全部存到一条记录里:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e{ metric: “content_count”, client: 5, month: “2012-04”, 1: 51, 2: 49, … }\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e通过上面两种方式存储, …\u003c/p\u003e"
April 27, 2012
[教程]mongodb常用维护命令
"\u003cp\u003e\u003cstrong\u003e1.客户端常用命令\n** #mongo\u003c/strong\u003e\n** \u0026gt;help //列出帮助**\n** \u0026gt;db.help() //db级别的帮助**\n** \u0026gt;db.mycollection.help() //collection 级别的帮助\u003c/p\u003e\n\u003cp\u003e \u003cstrong\u003e常用命令:\u003c/strong\u003e\n \u0026gt;show dbs //show database names\n \u0026gt;show collections //show collections in current database\n \u0026gt;use //set current database\n \u0026gt;db.foo.find() //list objects in collection foo\n \u0026gt;db.foo.find({a:1}) //list objects in foo where a == 1\n \u0026gt;db.createCollection(name, { size : …, capped : …, max : … } ) //创建collection …\u003c/p\u003e"
April 27, 2012
MongoDB之导入和导出
"\u003cp\u003e在上文中,我们了解了 \u003ca href=\"http://database.51cto.com/art/201105/263921.htm\"\u003e教你如何利用MySQL学习MongoDB之授权和权限\u003c/a\u003e,本文中我们继续我们的学习之旅,学习两者的\u003cstrong\u003e导入和导出\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1、MySQL导入和导出\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e(1)、mysqlimport\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e此工具位于mysql/bin目录中,是MySQL的一个载入(或者说导入)数据的一个非常有效的工具。这是一个命令行工具。有两个参数以及大量的选项可供选择。这个工具把一个文本文件(text file)导入到你指定的数据库和表中。比方说我们要从文件student.txt中把数据导入到数据库class中的表 student中:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003emysqlimport\u003c/strong\u003e class.student student.txt\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e(2)、load data infile\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e这个命令与mysqlimport非常相似,但这个方法可以在MySQL命令行中使用。 如mysqlimport工具一样,这个命令也有一些可以选择的参数。比如您需要把自己的电脑上的数据导入到远程的数据库服务器中,您可以使用下面的命令:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eLoad data local infile “d:\\student.txt” into table student;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e上面的local …\u003c/p\u003e"
April 27, 2012
MongoDB非正常关闭后修复记录 mongod –repair
"\u003cp\u003emongod没有后台执行,在终端连接非正常断开后,再次执行mongod报错,如下所示:\u003c/p\u003e\n\u003cp\u003e[root@localhost mongodb]# ./bin/mongod\n./bin/mongod –help for help and startup options\nThu Nov 17 22:42:49\nThu Nov 17 22:42:49 warning: 32-bit servers don’t have journaling enabled by default. Please use –journal if you want durability.\nThu Nov 17 22:42:49\nThu Nov 17 22:42:49 [initandlisten] MongoDB starting : pid=3257 port=27017 dbpath=/data/db/ 32-bit host=localhost\nThu Nov 17 22:42:49 [initandlisten]\nThu Nov 17 22:42:49 [initandlisten] ** NOTE: when …\u003c/p\u003e"
April 9, 2012
MongoDB update数据语法
"\u003cp\u003e在前面的文章“ \u003ca href=\"http://hi.baidu.com/farmerluo/blog/item/2d15e95027aa86501138c27a.html\"\u003emongodb 查询的语法\u003c/a\u003e”里,我介绍了Mongodb的常用查询语法,Mongodb的update操作也有点复杂,我结合自己的使用经验,在这里介绍一下,给用mongodb的朋友看看,也方便以后自己用到的时候查阅:\u003c/p\u003e\n\u003cp\u003e注:在这篇文章及上篇文章内讲的语法介绍都是在mongodb shell环境内的,和真正运用语言编程(如java,php等)使用时,在使用方法上会有一些差别,但语法(如查询条件,$in,$inc等)是一样的。\u003c/p\u003e\n\u003cp\u003e本文是参考官方文档来介绍的,之所以有官方文档还要在这介绍,一方面是就当翻译,毕竟每次要用时去看英文文档比较累,第二是官方文档讲解比较简单,有时光看官方文档不好理解,我在实际操作的情况下可以做些补充。\u003c/p\u003e\n\u003cp\u003e好了,不多说了,下面正式开始:\u003c/p\u003e\n\u003cp\u003emongodb更新有两个命令:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1).update()命令\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003edb.collection.update( criteria, objNew, upsert, multi )\u003c/p\u003e\n\u003cp\u003ecriteria : update的查询条件,类似sql update查询内where后面的\nobjNew : update的对象和一些更新的操作符( …\u003c/p\u003e"
April 9, 2012
教你如何利用MySQL学习MongoDB之授权和权限
"\u003cp\u003e在上文中,我们了解了 \u003ca href=\"http://database.51cto.com/art/201105/263901.htm\"\u003e教你如何利用MySQL学习MongoDB之SQL语法\u003c/a\u003e,本文中我们继续我们的学习之旅,学习两者的授权和权限。\u003c/p\u003e\n\u003cp\u003e数据库的安全性是每一个DBA重点关注的部分,在数据库建立之后,数据的安全就显得尤为重要。\u003c/p\u003e\n\u003cp\u003e对于一个数据库管理员来说,安全性就意味着他必须保证那些具有特殊数据访问权限的用户能够登录到数据库服务器,并且能够访问数据以及对数据库对象实施各种权限范围内的操作;同时,DBA还要防止所有的非授权用户的非法操作。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1、MySQL授权和权限\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eMySQL中有两种级别的权限:管理和用户。所有权限都可分别使用 GRANT 和 REVOKE 语句授予和收回。可以授予用户create、select、update、delete、insert、execute、index 等权限,也可授予alter、drop和shutdown等系统权限。根用户root在默认情况下具有所有权限。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2、MongoDB授权和权限\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e官方文档开启MongoDB 服务时不添加任何参数时,可以对数据库任意操作,而且可以远程访问数据库,所以推荐只是在开发是才这样不设置任何参数。如果启动的时候指定–auth参数,可以从阻止 …\u003c/p\u003e"
April 9, 2012
MongoDB的安全和授权机制
"\u003cp\u003e先把官方文档的地址贴上来,所有的内容都来自这里:\u003c/p\u003e\n\u003cp\u003e最近项目需要mongodb,简单试了下,一直都没找到安全验证的机制,在linux下很简单就用mongo命令登进去了,也没有指定用户名和密码,也没有host和port,直接就进去了。当时还感觉蛮方便的,但是事后想想,完全没有安全机制和验证的,还是有点不放心啊。后来仔细看了下文档,原来还是有的,只是不太好找而已。\u003c/p\u003e\n\u003cp\u003e官方文档的说法是:目前mongodb的安全机制还是比较简陋的,主要是表现在权限方面,一个用户只要被授权了,那么他就直接拥有了全部的读写权限。mongodb也可以创建只读用户,只有读取的权限。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e授权需求的开启\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e默认的mongodb进程启动之后是不需要授权验证的,需要手动打开,做法是在启动命令中添加–auth参数。\u003c/p\u003e\n\u003cp\u003edebian下的默认启动参数是:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/usr/bin/mongod –dbpath /var/lib/mongodb –logpath /var/log/mongodb/mongodb.log –config /etc/mongodb.conf run\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e我们需要做的是编辑/etc/init.d/mongodb, …\u003c/p\u003e"
December 15, 2011
新浪微博开放平台Redis实践(PPT+视频)
"\u003cp\u003e新浪微博对Redis的大量应用已经是业界闻名,说是全球最大的使用者可能也没什么问题。下面PPT的作者是新浪微博负责Redis使用工程师唐福林同学。为大家解答了微博为何要使用Redis,又是如何使用Redis的。\u003c/p\u003e\n\u003cp\u003eppt文档pdf版见:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"http://www.slideshare.net/mysqlops/redis-9806617\" title=\"新浪微博开放平台Redis实战\"\u003e新浪微博开放平台Redis实战\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eView more \u003ca href=\"http://www.slideshare.net/\"\u003epresentations\u003c/a\u003e from \u003ca href=\"http://www.slideshare.net/mysqlops\"\u003emysqlops\u003c/a\u003e\u003c/p\u003e"
November 29, 2011
memcached 集群单点故障解决方案
"\u003cp\u003emagent是一款开源的Memcached代理服务器软件,其项目网址为: \u003ca href=\"http://code.google.com/p/memagent/\"\u003ehttp://code.google.com/p/memagent/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、安装步骤:\u003c/strong\u003e\n1、编译安装libevent:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ewget http://monkey.org/~provos/libevent-1.4.9-stable.tar.gz\ntar zxvf libevent-1.4.9-stable.tar.gz\ncd libevent-1.4.9-stable/\n./configure --prefix=/usr\nmake \u0026amp;\u0026amp; make install\ncd ../\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e2、编译安装Memcached:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ewget http://danga.com/memcached/dist/memcached-1.2.6.tar.gz\ntar zxvf memcached-1.2.6.tar.gz\ncd memcached-1.2.6/\n./configure --with-libevent=/usr\nmake \u0026amp;\u0026amp; make install\ncd ../\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e3、编译安装magent:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emkdir …\u003c/code\u003e\u003c/pre\u003e"
October 19, 2011
遍历memcache中的key和value
"\u003cp\u003e\u003cstrong\u003e什么是\u003c/strong\u003e \u003cstrong\u003ememcache\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ememcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,最初为了加速 LiveJournal 访问速度而开发的,后来被很多大型的网站采用。目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e为什么要遍历\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e目前,用到memcache的公司和网站也越来越多。Memcache的客户端操作一般都只提供了get,set等简单的操作,这些操作都是非常高效的。 虽然memcache是个key-value存储的系统,但是在某些时候,我们可能需要遍历memcache的数据。\u003c/p\u003e\n\u003cp\u003e通过使用memcache 内置方法Memcache::getExtendedStats,首先获得items信息。\u003c/p\u003e\n\u003cp\u003e最后得到的解决类似与\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026lt;php\n$memcache = new Memcache();\n$all_items = …\u003c/code\u003e\u003c/pre\u003e"
September 27, 2011
五步优化你的MongoDB
"\u003cp\u003e下面PPT和视频的作者是MongoDB的开发工程师 \u003ca href=\"http://jaredrosoff.com/\"\u003eJared Rosoff\u003c/a\u003e,他从下面几个方面对MongoDB的几个优化点进行了讲解和描述。这些优化实际上也适用于很多其它的数据库。\u003c/p\u003e\n\u003ch3 id=\"1查询优化\"\u003e1.查询优化\u003c/h3\u003e\n\u003cp\u003e确认你的查询是否充分利用到了索引,用explain命令查看一下查询执行的情况,添加必要的索引,避免扫表操作。\u003c/p\u003e\n\u003ch3 id=\"2搞清你的热数据大小\"\u003e2.搞清你的热数据大小\u003c/h3\u003e\n\u003cp\u003e可能你的数据集非常大,但是这并不那么重要,重要的是你的热数据集有多大,你经常访问的数据有多大(包括经常访问的数据和所有索引数据)。使用MongoDB,你最好保证你的热数据在你机器的内存大小之下,保证内存能容纳所有热数据。\u003c/p\u003e\n\u003ch3 id=\"3选择正确的文件系统\"\u003e3.选择正确的文件系统\u003c/h3\u003e\n\u003cp\u003eMongoDB的数据文件是采用的预分配模式,并且在Replication里面,Master和Replica Sets的非Arbiter节点都是会预先创建足够的空文件用以存储操作日志。这些文件分配操作在一些文件系统上可能会非常慢,导致进程被Block。所 以我们应该选择那些空间分配快速的文件系统。这里的结论是尽量不要用ext3,用ext4或者xfs。\u003c/p\u003e\n\u003ch3 id=\"4选择合适的硬盘\"\u003e4.选择合适的硬盘\u003c/h3\u003e\n\u003cp\u003e这里的选择包括了对磁盘RAID的选择,也包括了磁盘 …\u003c/p\u003e"
September 27, 2011
Redis系统性介绍
"\u003cp\u003e虽然Redis已经很火了,相信还是有很多同学对Redis只是有所听闻或者了解并不全面,下面是一个比较系统的Redis介绍,对Redis的特性及各种数据类型及操作进行了介绍。是一个很不错的Redis入门教程。\u003c/p\u003e\n\u003ch3 id=\"1介绍\"\u003e1.介绍\u003c/h3\u003e\n\u003ch4 id=\"11-redis是什么\"\u003e1.1 Redis是什么\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003eRE\u003c/strong\u003emote \u003cstrong\u003eDI\u003c/strong\u003ectionary \u003cstrong\u003eS\u003c/strong\u003eerver(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。Redis提供了一些丰富的数据结构,包括 lists, sets, ordered sets 以及 hashes ,当然还有和Memcached一样的 strings结构.Redis当然还包括了对这些数据结构的丰富操作。\u003c/p\u003e\n\u003ch4 id=\"12-redis的优点\"\u003e1.2 Redis的优点\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e性能极高 – Redis能支持超过 100K+ 每秒的读写频率。\u003c/li\u003e\n\u003cli\u003e丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。\u003c/li\u003e\n\u003cli\u003e原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。\u003c/li\u003e\n\u003cli\u003e丰富的特性 – Redis …\u003c/li\u003e\u003c/ul\u003e"
July 28, 2011
mongodb中实现自定义自增ID
"\u003cp\u003ePHP代码:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003efunction get_autoincre_id($name, $db){\n\t$update = array(\u0026#39;$inc\u0026#39;=\u0026gt;array(\u0026#34;id\u0026#34;=\u0026gt;1));\n\t$query = array(\u0026#39;table_name\u0026#39; =\u0026gt; $name);\n\t$command = array(\n\t\t\u0026#39;findandmodify\u0026#39;=\u0026gt;\u0026#39;autoincre_system\u0026#39;, \u0026#39;update\u0026#39;=\u0026gt;$update,\n\t\t\u0026#39;query\u0026#39;=\u0026gt;$query, \u0026#39;new\u0026#39;=\u0026gt;true, \u0026#39;upsert\u0026#39;=\u0026gt;true\n\t);\n\t$id = $db-\u0026gt;command($command);\n\treturn $id[\u0026#39;value\u0026#39;][\u0026#39;id\u0026#39;];\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e其中上面的table_name可以用来区别多个表,这样可以灵活实现单独的几个表的自增ID值.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e$conn = new Mongo(); …\u003c/p\u003e\u003c/blockquote\u003e"
July 27, 2011
MongoDB的ObjectId
"\u003cp\u003e前段时间有个朋友问我,分布式主键生成策略在我们这边是怎么实现的,当时我给的答案是sequence,当然这在不高并发的情况下是没有任何问题,实际上,我们的主键生成是可控的,但如果是在分布式高并发的情况下,那肯定是有问题的。\u003c/p\u003e\n\u003cp\u003e突然想起mongodb的objectid,记得以前看过文档,objectid是一种轻量型的,不同的机器都能用全局唯一的同种方法轻量的生成它,而不是采用传统的自增的主键策略,因为在多台服务器上同步自动增加主键既费力又费时,不得不佩服,mongodb从开始设计就被定义为分布式数据库。\u003c/p\u003e\n\u003cp\u003e下面深入一点来翻翻这个Objectid的底细,在mongodb集合中的每个document中都必须有一个”_id”建,这个键的值可以是任何类型的,在默认的情况下是个Objectid对象。\u003c/p\u003e\n\u003cp\u003e当我们让一个collection中插入一条不带_id的记录,系统会自动地生成一个_id的key\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e db.t_test.insert({“name”:”cyz”})\u003c/p\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e db.t_test.findOne({“name”:”cyz”})\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e{ “_id” : …\u003c/p\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e"
June 30, 2011
redis入门教程
"\u003cp\u003ewindow平台下的redis dll文件下载: \u003ca href=\"https://github.com/char101/phpredis/downloads\"\u003ehttps://github.com/char101/phpredis/downloads\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eRedis 根据 5 种不同的数据类型来操作数据对象:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eString(字符串)\nSets(集合)\nzsets( 排序后的sets集合)\nList(列表)\nhash(哈稀)\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"操作-string-类型的值\"\u003e操作 String 类型的值:\u003c/h2\u003e\n\u003cp\u003eCommand\u003c/p\u003e\n\u003cp\u003eParameters\u003c/p\u003e\n\u003cp\u003eDescription\u003c/p\u003e\n\u003cp\u003eSET\u003c/p\u003e\n\u003cp\u003ekey value\u003c/p\u003e\n\u003cp\u003eSet a key to a string value\u003c/p\u003e\n\u003cp\u003eGET\u003c/p\u003e\n\u003cp\u003ekey\u003c/p\u003e\n\u003cp\u003eReturn the string value of the key\u003c/p\u003e\n\u003cp\u003eGETSET\u003c/p\u003e\n\u003cp\u003ekey value\u003c/p\u003e\n\u003cp\u003eSet a key to a string returning the old value of the key\u003c/p\u003e\n\u003cp\u003eMGET\u003c/p\u003e\n\u003cp\u003ekey1 key2 … keyN\u003c/p\u003e\n\u003cp\u003eMulti-get, return the strings values of the keys\u003c/p\u003e\n\u003cp\u003eSETNX\u003c/p\u003e\n\u003cp\u003ekey\u003c/p\u003e\n\u003cp\u003evalue Set a key to a string value if the key does not …\u003c/p\u003e"
June 24, 2011
Mongodb相关学习资料
"\u003cp\u003e\u003ca href=\"/wp-content/uploads/2011/06/Mongo_share.ppt\"\u003eMongo资料分享.ppt\u003c/a\u003e \u003ca href=\"/wp-content/uploads/2011/06/01-MongoDB.ppt\"\u003e认识MongoDB.ppt\u003c/a\u003e \u003ca href=\"/wp-content/uploads/2011/06/MongoDB222.ppt\"\u003eMongoDB技术交流.ppt\u003c/a\u003e \u003ca href=\"/wp-content/uploads/2011/06/SQL-to-MongoDB.pdf\"\u003eSQL-to-MongoDB.pdf\u003c/a\u003e \u003ca href=\"http://blog.nosqlfan.com/html/1595.html\"\u003eQCon北京2011大会之:MongoDB开发应用实践\u003c/a\u003e \u003ca href=\"http://www.mysqlops.com/2011/06/13/nosql-cassandra-architecture.html\"\u003eNoSQL应用场景及Cassandra架构分析\u003c/a\u003e \u003ca href=\"/wp-content/uploads/2011/06/MongoDB-Tools.rar\"\u003eWindows下MongoDB管理工具(启用和服务)\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/06/mongodb_insert.bmp\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/06/mongodb_insert.bmp\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/06/mongodb_objectid.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/06/mongodb_objectid.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/06/mongodb_field.bmp\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/06/mongodb_field.bmp\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/06/mongodb_query.bmp\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/06/mongodb_query.bmp\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/06/mongodb_in_count_or.bmp\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/06/mongodb_in_count_or.bmp\" alt=\"\"\u003e\u003c/a\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/06/mongodb_index.bmp\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/06/mongodb_index.bmp\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/06/mongodb_update.bmp\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/06/mongodb_update.bmp\" alt=\"\"\u003e\u003c/a\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/06/mongodb_aggregation.bmp\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/06/mongodb_aggregation.bmp\" alt=\"\"\u003e\u003c/a\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/06/mongodb_datetype.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/06/mongodb_datetype.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html\"\u003emongoDB 入门指南、示例\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eNoSQl存储模型\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/06/nosql-model.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/06/nosql-model.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eMongo与Mysql语法对应关系图\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/06/SQL-to-MongoDB.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/06/SQL-to-MongoDB.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/06/rdbms-mongodb.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/06/rdbms-mongodb.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e数据库\u003c/p\u003e\n\u003cp\u003e表\u003c/p\u003e\n\u003cp\u003e行\u003c/p\u003e\n\u003cp\u003e写入\u003c/p\u003e\n\u003cp\u003e查询\u003c/p\u003e\n\u003cp\u003eMongoDb\u003c/p\u003e\n\u003cp\u003edatabase\u003c/p\u003e\n\u003cp\u003eCollection\u003c/p\u003e\n\u003cp\u003eDocument\u003c/p\u003e\n\u003cp\u003einsert into blog.users values(“user1”,”23))===========\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003euse blogswitched to db blog\u0026gt; u = { name:”user1″, age:23 }\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003edb.users.insert(u)\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e主要用到的查询函数式 find() 和 findOne(),前者返回一个迭代器 cursor,后者返回单个文档。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003edb.users.find({name:”user1″}){\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e“_id” : …\u003c/p\u003e"
June 24, 2011
MongoDB Linux下的安装和启动
"\u003cp\u003e这里用的是64位版本.使用时请检查相应操作系统的版本是32位还是64位.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1\u0026gt;设置mongoDB目录\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ecd /home/apps\nmkdir /home/apps\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e2\u0026gt;下载mongodb\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewget \u003ca href=\"http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-1.6.3.tgz\"\u003ehttp://fastdl.mongodb.org/linux/mongodb-linux-x86_64-1.6.3.tgz\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e3\u0026gt;解压缩文件\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003etar xzf mongodb-linux-x86_64-1.6.3.tgz\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e4\u0026gt;启动服务\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e./mongodb-linux-x86_64-1.6.3/bin/mongod -dbpath=/data/mongodb/db -logpath=/data/mongodb/log\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e5\u0026gt;将mongoDB服务加入随机启动\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003evi /etc/rc.local\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e使用vi编辑器打开配置文件,并在其中加入下面一行代码\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/home/apps/mongodb/bin/mongod –dbpath /data/mongodb/db –port 27017 –logpath /data/mongodb/log –logappend …\u003c/p\u003e\u003c/blockquote\u003e"
March 29, 2011
Redis几个认识误区
"\u003cp\u003e此文的作者是新浪微博平台架构师杨卫华(\u003ca href=\"http://t.sina.com.cn/timyang\"\u003etimyang\u003c/a\u003e)大师,如果关注了新浪一些牛人微博的同学应该知道,timyang前段时间正在对Redis进行一些研究和测试,也分享出了不少成果。下面一篇文章相信是timyang这段时间对Redis研究的一个总结,澄清了一些认识上的误区,值得一读。\u003c/p\u003e\n\u003cp\u003e原文链接:\u003c/p\u003e\n\u003cp\u003e前几天微博发生了一起大的\u003ca href=\"http://tech.sina.com.cn/i/2010-12-01/15324930344.shtml\"\u003e系统故障\u003c/a\u003e,很多技术的朋友都比较关心,其中的原因不会超出James Hamilton在On Designing and Deploying Internet-Scale Service(1)概括的那几个范围,James第一条经验“Design for failure”是所有互联网架构成功的一个关键。互联网系统的工程理论其实非常简单,James paper中内容几乎称不上理论,而是多条实践经验分享,每个公司对这些经验的理解及执行力决定了架构成败。\u003c/p\u003e\n\u003cp\u003e题外话说完,最近又研究了\u003ca href=\"http://code.google.com/p/redis/\"\u003eRedis\u003c/a\u003e。去年曾做过一个\u003ca href=\"http://timyang.net/data/mcdb-tt-redis/\"\u003eMemcacheDB, Tokyo Tyrant, Redis performance test\u003c/a\u003e,到目前为止,这个benchmark结果依然有效。这1年我们经历了很多眼花缭乱的key …\u003c/p\u003e"
March 29, 2011
在浏览器里试用NoSQL产品
"\u003cp\u003e通常要使用某个存储设备,我们可能需要经历下载、安装、配置、启动等多个过程,然后才能开始试验具体的试用。而在我们很多 NoSQL 产品中,提供了一些非常方便的试用途径,可以让你不用安装一个自己的 Server 即可直接试用并学习其功能:\u003c/p\u003e\n\u003ch2 id=\"1try-redis-在浏览器里试用redis\"\u003e1.try redis 在浏览器里试用Redis\u003c/h2\u003e\n\u003cp\u003e地址:\u003c/p\u003e\n\u003cp\u003e直接点击上面地址即可进入下面的界面,按提示即可进行操作。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.nosqlfan.com/wp-content/uploads/2010/12/Try-Redis.png\"\u003e\u003cimg src=\"http://blog.nosqlfan.com/wp-content/uploads/2010/12/Try-Redis.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"2try-mongo-在浏览器中试用mongodb\"\u003e2.try mongo 在浏览器中试用MongoDB\u003c/h2\u003e\n\u003cp\u003e进入\u003ca href=\"http://www.mongodb.org/\"\u003eMongoDB主页\u003c/a\u003e 点击主上方的 TRY IT OUT 导航,就会在本页展开如下图所示的伪shell 界面,和上面Redis的试用方式一样,你可以在这里试用MongoDB的基本操作。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.nosqlfan.com/wp-content/uploads/2010/12/MongoDB.png\"\u003e\u003cimg src=\"http://blog.nosqlfan.com/wp-content/uploads/2010/12/MongoDB.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"3在浏览器中试用-couchdb-mapreduce\"\u003e3.在浏览器中试用 CouchDB MapReduce\u003c/h2\u003e\n\u003cp\u003e下面是 CouchDB 的一个试用界面,点击页面上的 documents 标签即可切换到查看目前集合中的文档,点击下方的add,即可填入 json 对象添加一行数据。\u003c/p\u003e\n\u003cp\u003e地址:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.nosqlfan.com/wp-content/uploads/2010/12/Interactive-CouchDB-Mu-Dynamics.png\"\u003e\u003cimg src=\"http://blog.nosqlfan.com/wp-content/uploads/2010/12/Interactive-CouchDB-Mu-Dynamics.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e在维护完上面的数据集合后,可以再点击documents 右侧的 map/reduce 标签切换到书写 map 和 reduce 函数的界面,在写好 map …\u003c/p\u003e"
November 30, 2010
NOSQL数据库–HBase简介
"\u003cp\u003e最近因为项目原因,研究了Cassandra,Hbase等几个\u003cstrong\u003eNoSQL\u003c/strong\u003e数据库,最终决定采用HBase。在这里,我就向大家分享一下自己对HBase的理解。\u003c/p\u003e\n\u003cp\u003e在说HBase之前,我想再唠叨几句。做互联网应用的哥们儿应该都清楚,互联网应用这东西,你没办法预测你的系统什么时候会被多少人访问,你面临的用户到 底有多少,说不定今天你的用户还少,明天系统用户就变多了,结果您的系统应付不过来了了,不干了,这岂不是咱哥几个的悲哀,说时髦点就叫“杯具啊”。\u003c/p\u003e\n\u003cp\u003e其实说白了,这些就是事先没有认清楚互联网应用什么才是最重要的。从系统架构的角度来说,互联网应用更加看重系统性能以及伸缩性,而传统企业级应用都是比较看重数据完整性和数据安全性。那么我们就来说说互联网应用伸缩性这事儿.对于伸缩性这事儿,哥们儿我也写了几篇博文,想看的兄弟可以参考我以前的博文,对于web server,app server的伸缩性,我在这里先不说了,因为这部分的伸缩性相对来说比较容易一点,我主要来回顾一些一个慢慢变大的互联网应用如何应对数据库这一层的伸缩。\u003c/p\u003e\n\u003cp\u003e首先刚开始,人不多,压力也不大,搞一台数据库服务器就搞定了,此时所有的东东都塞进一 …\u003c/p\u003e"
November 30, 2010
NOSQL中Cassandra与HBase的比较,及我们迁移系统的原因
"\u003cp\u003e原文地址:http://ria101.wordpress.com/2010/02/24/hbase-vs-cassandra-why-we-moved\u003c/p\u003e\n\u003cp\u003eHBase vs Cassandra: why we moved\u003c/p\u003e\n\u003cp\u003e下文中将讨论为何选择Cassandra作为我们的NOSQL方案。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e是否\u003cstrong\u003e\u003cstrong\u003eCassandra\u003c/strong\u003e\u003c/strong\u003e的血统预言了未来?\u003c/strong\u003e****\u003c/p\u003e\n\u003cp\u003e我发现在软件问题上,我们先去考虑上层问题而不是直接深入到细节,可以节约大量时间。在选择HBase还是Cassandra上我也遵循了这一信条。HBase还是Cassandra具有完全不同的血统和基因,这决定了他们在我们应用的可行性。\u003c/p\u003e\n\u003cp\u003eHBase及其支持系统源自Google的GFS和BigTable设计;而最初由Facebook开源出来的Cassandra采用了BigTable的数据模型,确实是用类似Amozon的Dynamo的存储系统(实际上Cassandra最初的开发工作都是由两个原Dynamo工程师开发的)。\u003c/p\u003e\n\u003cp\u003e在我看来,他们的根源决定了HBase更适用于数据仓库和大规模数据处理分析(比如对Web建索引),而Cassandra更适用于实时事务处理和处理交互性 …\u003c/p\u003e"
September 26, 2010
centos 5.4 下面安装mongodb服务端和php客户端扩展…
"\u003cp\u003e\u003cstrong\u003e一、安装服务端\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1.下载MongoDB\u003c/p\u003e\n\u003cp\u003e我下载的是1.6的版本\u003c/p\u003e\n\u003cp\u003e2.解压并把解压包bin目录中的文件全部移到/usr/local/bin目录下面\u003c/p\u003e\n\u003cp\u003e3.运行mongo的服务器端程序\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/usr/local/bin/mongod –port \u0026lt;端口\u0026gt; –bind_ip \u0026lt;本机IP\u0026gt; –dbpath \u0026lt;数据库文件存放的位置\u0026gt;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e如果要求开机就启动就在\u003c/p\u003e\n\u003cp\u003e/usr/local/etc/rc.local中加入下面一行内容\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eusr/local/bin/mongod –port \u0026lt;端口\u0026gt; –bind_ip \u0026lt;本机IP\u0026gt; –dbpath \u0026lt;数据库文件存放的位置\u0026gt; \u0026gt;/dev/null \u0026amp;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e4.测试安装是否成功\u003c/p\u003e\n\u003cp\u003e运行指令\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#/usr/local/bin/mongo –port 4312 –host 127.0.0.1\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e显示\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMongoDB shell version: 1.6.0\u003c/p\u003e\n\u003cp\u003econnecting to: 127.0.0.1:4312/test\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003ehelp\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003edb.help() …\u003c/p\u003e"
September 26, 2010
MongoDB 快速入门及windows平台下的mongodb安装教程
"\u003cp\u003e官方教程(for windows):\u003c/p\u003e\n\u003cp\u003e对 MongoDb 文档数据库感兴趣,要安装认识下。\u003c/p\u003e\n\u003cp\u003e到官方下载 win 版 \u003ca href=\"http://www.mongodb.org/display/DOCS/Downloads\"\u003ehttp://www.mongodb.org/display/DOCS/Downloads\u003c/a\u003e 目前最新稳定版是 1.2.4。解压到 f:/sofr/mongodb-win32-i386-1.2.4。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.启动 mongod 服务端\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eF:\\soft\\mongodb\u0026gt;bin\\mongod.exe –dbpath=f:/mongodb\nMon Mar 08 11:13:17 Mongo DB : starting : pid = 0 port = 27017 dbpath = f:/mongodb master = 0 slave\n= 0 32-bit\u003c/p\u003e\n\u003cp\u003e** NOTE: when using MongoDB 32 bit, you are limited to about 2 gigabytes of data\n** see \u003ca href=\"http://blog.mongodb.org/post/137788967/32-bit-limitations\"\u003ehttp://blog.mongodb.org/post/137788967/32-bit-limitations\u003c/a\u003e for more\u003c/p\u003e\n\u003cp\u003eMon Mar …\u003c/p\u003e\u003c/blockquote\u003e"
Category: 前端设计
March 27, 2018
IE浏览器报Promise错误的解决办法
"\u003cp\u003e说明ie浏览器不支持Promise,可搜索关键字 polyfill,引入以下库即可\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"https://cdn.polyfill.io/v2/polyfill.min.js?features=es6\"\u003ehttps://cdn.polyfill.io/v2/polyfill.min.js?features=es6\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e官方文档: \u003ca href=\"https://cdn.polyfill.io/v2/docs/\"\u003ehttps://cdn.polyfill.io/v2/docs/\u003c/a\u003e\n参考: \u003ca href=\"https://www.cnblogs.com/XHappyness/p/7919610.html\"\u003ehttps://www.cnblogs.com/XHappyness/p/7919610.html\u003c/a\u003e\n参考: \u003ca href=\"https://www.jianshu.com/p/2888a8e204e8\"\u003ehttps://www.jianshu.com/p/2888a8e204e8\u003c/a\u003e\u003c/p\u003e"
December 14, 2017
vux中实现自定义皮肤
"\u003cp\u003e有时候我们需要根据自己的需要对 weui默认的颜色进行修改,如果在每个单面里修改的过过于麻烦,我们可以使用一个less配置文件来实现对默认配置进行重置。\u003c/p\u003e\n\u003cp\u003e修改 webpack.base.conf.js 文件,找到\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emodule.exports = vuxLoader.merge(webpackConfig, {\n plugins: [\u0026#39;vux-ui\u0026#39;, \u0026#39;progress-bar\u0026#39;, \u0026#39;duplicate-style\u0026#39;, ]\n})\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e修改如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emodule.exports = vuxLoader.merge(webpackConfig, {\n plugins: [\u0026#39;vux-ui\u0026#39;, \u0026#39;progress-bar\u0026#39;, \u0026#39;duplicate-style\u0026#39;, {\n name: \u0026#39;less-theme\u0026#39;,\n path: \u0026#39;src/theme.less\u0026#39;\n }]\n})\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e然后在项目的 src 目录里创建文件 theme.less, …\u003c/p\u003e"
December 13, 2017
CSS3 利用@media screen实现网页布局的自适应,样式顺序
"\u003cp\u003e利用@media screen可以适应不同屏幕大小,做出相应的界面调整;\u003c/p\u003e\n\u003cp\u003e在css中@media (min-width: 768px)表示最小是768也就是\u0026gt;=768;\u003c/p\u003e\n\u003cp\u003e@media (min-width: 768px){ //\u0026gt;=768的设备 }\u003c/p\u003e\n\u003cp\u003e@media (min-width: 992px){ //\u0026gt;=992的设备 }\u003c/p\u003e\n\u003cp\u003e@media (min-width: 1200){ //\u0026gt;=1200的设备 }\u003c/p\u003e\n\u003cp\u003e注意下顺序,如果你把@media (min-width: 768px)写在了下面那么很悲剧,\u003c/p\u003e\n\u003cp\u003e@media (min-width: 1200){ //\u0026gt;=1200的设备 }@media (min-width: 992px){ //\u0026gt;=992的设备 }@media (min-width: 768px){ //\u0026gt;=768的设备 }因为如果是1440,由于1440\u0026gt;768那么你的1200就会失效。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e所以我们用min-width时,小的放上面大的在下面,同理如果是用max-width那么就是大的在上面,小的在下面\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e@media …\u003c/p\u003e"
May 18, 2017
pushState + Ajax 技术
"\u003cp\u003e有时间我们要实现动态修改URL地址,同时更新部分页面内容,但不刷新整个页面,这种情况下用就需要用到一些pjax技术了。\u003c/p\u003e\n\u003cp\u003ewindow.history.replaceState 和 window.history.pushState 类似,不同之处在于replaceState不会在window.history里新增历史记录点,其效果类似于window.location.replace(url),都是不会在历史记录点里新增一个记录点的。当你为了响应用户的某些操作,而要更新当前历史记录条目的状态对象或URL时,使用replaceState()方法会特别合适, 两者的参数是完全一样的。\u003c/p\u003e\n\u003cp\u003ewindow.history.replaceState(state, title , url) // “页面标题”目前浏览器暂不支持\u003c/p\u003e\n\u003cp\u003estate:一个与指定网址相关的状态对象{},popstate事件触发时,该对象会传入回调函数。如果不需要这个对象,此处可以填null。\u003c/p\u003e\n\u003cp\u003etitle:新页面的标题,但是所有浏览器目前都忽略这个值,因此这里可以填null。\u003c/p\u003e\n\u003cp\u003eurl:新的网址,必须与当前页面处在同一个域。浏览器的地址栏 …\u003c/p\u003e"
August 15, 2016
highcharts中对”另存为”进行汉化
"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$(function () {\n var chart = new Highcharts.Chart({\n chart: {\n renderTo: \u0026#39;container\u0026#39;\n },\n lang{\n printChart:\u0026#34;打印图表\u0026#34;,\n downloadJPEG: \u0026#34;下载JPEG 图片\u0026#34;\n downloadPDF: \u0026#34;下载PDF文档\u0026#34;\n downloadPNG: \u0026#34;下载PNG 图片\u0026#34;\n downloadSVG: \u0026#34;下载SVG 矢量图\u0026#34;\n exportButtonTitle: \u0026#34;导出图片\u0026#34;\n },\n .....\n })\n})\n\u003c/code\u003e\u003c/pre\u003e"
May 11, 2016
Vue.js学习资料
"\u003cp\u003e在学习vue前,建立先了解一下 webpack \u003ca href=\"https://fakefish.github.io/react-webpack-cookbook/index.html\"\u003ehttps://fakefish.github.io/react-webpack-cookbook/index.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e官方网站(中文版): \u003ca href=\"http://cn.vuejs.org/\"\u003ehttp://cn.vuejs.org/\u003c/a\u003e\n构建大型应用使用组件 Vue-router: \u003ca href=\"https://github.com/vuejs/vue-router\"\u003ehttps://github.com/vuejs/vue-router\u003c/a\u003e\n网络通讯插件Vue-resource: \u003ca href=\"https://github.com/vuejs/vue-resource\"\u003ehttps://github.com/vuejs/vue-resource\u003c/a\u003e\n单元测试karma: \u003ca href=\"http://karma-runner.github.io/0.12/index.html\"\u003ehttp://karma-runner.github.io/0.12/index.html\u003c/a\u003e \u003ca href=\"https://cn.vuejs.org/\"\u003ehttps://cn.vuejs.org/\u003c/a\u003e \u003ca href=\"https://cn.vuejs.org/v2/api/\"\u003ehttps://cn.vuejs.org/v2/api/\u003c/a\u003e \u003ca href=\"https://router.vuejs.org/zh-cn/\"\u003ehttps://router.vuejs.org/zh-cn/\u003c/a\u003e \u003ca href=\"https://vuex.vuejs.org\"\u003ehttps://vuex.vuejs.org\u003c/a\u003e \u003ca href=\"https://vue-loader.vuejs.org/zh-cn/\"\u003ehttps://vue-loader.vuejs.org/zh-cn/\u003c/a\u003e \u003ca href=\"https://ssr.vuejs.org\"\u003ehttps://ssr.vuejs.org …\u003c/a\u003e\u003c/p\u003e"
February 23, 2016
jQuery.extend和jQuery.fn.extend的区别-转
"\u003cp\u003ejQuery.extend和jQuery.fn.extend的区别,其实从这两个办法本身也就可以看出来。很多地方说的也不详细。这里详细说说之间的区别.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e我们先把jQuery看成了一个类,这样好理解一些。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003ejQuery.extend(),是扩展的jQuery这个类。\u003c/p\u003e\n\u003cp\u003e假设我们把jQuery这个类看成是人类,能吃饭能喝水能跑能跳,现在我们用jQuery.extend这个方法给这个类拓展一个能唱歌的技能。这样的话,不论是男人,女人,xx人…..等能继承这个技能(方法)了。\u003c/p\u003e\n\u003cp\u003e可以如下图这样写着:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2016/02/jquery-1.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/jquery-1.png\" alt=\"jquery-1\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003e然后:$.liu();这样就能打印出来”liu“这个字符串\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e代码在下面:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2016/02/jquery-2.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/jquery-2.png\" alt=\"jquery-2\"\u003e\u003c/a\u003e 3. 这说明啥啊,这说明.liu()变成了jQuery这个类本身的方法(object)嘛。他现在能”唱歌“了。但是吧,这个能力啊,只有代表全人类的 jQuery 这个类本身,才能用啊。你个人想用,你张三李四王五麻六,你个小草民能代表全人类嘛?\u003c/p\u003e\n\u003cp\u003e所以啊,这个扩展也就是所谓的静态方法。只跟这个 类 本身有关。跟你具体的实例化对象是没关系滴。\u003c/p\u003e\n\u003cp\u003e我们再看看jQuery.fn.extend()这个方法。\u003c/p\u003e\n\u003cp\u003e从字面理解嘛,这个拓展 …\u003c/p\u003e"
February 15, 2016
JavaScript垃圾回收机制
"\u003cp\u003e\u003cstrong\u003e一、垃圾回收的必要性\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e下面这段话引自《JavaScript权威指南(第四版)》\u003c/p\u003e\n\u003cp\u003e_ 由于字符串、对象和数组没有固定大小,所有当他们的大小已知时,才能对他们进行动态的存储分配。JavaScript程序每次创建字符串、数组或对象时,解释器都必须分配内存来存储那个实体。只要像这样动态地分配了内存,最终都要释放这些内存以便他们能够被再用,否则,JavaScript的解释器将会消耗完系统中所有可用的内存,造成系统崩溃。_\u003c/p\u003e\n\u003cp\u003e这段话解释了为什么需要系统需要垃圾回收,JS不像C/C++,他有自己的一套垃圾回收机制(Garbage Collection)。JavaScript的解释器可以检测到何时程序不再使用一个对象了,当他确定了一个对象是无用的时候,他就知道不再需要这个对象,可以把它所占用的内存释放掉了。例如:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003evar a = \u0026#34;before\u0026#34;;\nvar b = \u0026#34;override a\u0026#34;;\nvar a = b; //重写a\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这段代码运行之后,“before”这个字符串失去了引用(之前是被a引用),系统检测到这个事实之后,就会释放该字符串的存储空间以便这些空间可以被再利 …\u003c/p\u003e"
December 17, 2015
javascript静态类型检测器 flow(facebook)
"\u003cp\u003e\u003ca href=\"http://flowtype.org/\"\u003ehttp://flowtype.org/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e对于flow的介绍可以参考: \u003ca href=\"http://blog.jobbole.com/80364/\"\u003ehttp://blog.jobbole.com/80364/\u003c/a\u003e\u003c/p\u003e"
December 3, 2015
React相关学习资料
"\u003cp\u003eReact 入门实例教程: \u003ca href=\"http://www.ruanyifeng.com/blog/2015/03/react.html\"\u003ehttp://www.ruanyifeng.com/blog/2015/03/react.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eReact 入门实例教程实例: \u003ca href=\"https://github.com/ruanyf/react-demos\"\u003ehttps://github.com/ruanyf/react-demos\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eReact+Babal+WebPack: \u003ca href=\"https://github.com/ruanyf/react-babel-webpack-boilerplate\"\u003ehttps://github.com/ruanyf/react-babel-webpack-boilerplate\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eReact Router 使用教程: \u003ca href=\"http://www.ruanyifeng.com/blog/2016/05/react_router.html\"\u003ehttp://www.ruanyifeng.com/blog/2016/05/react_router.html\u003c/a\u003e \u003ca href=\"https://github.com/reactjs/react-router\"\u003ehttps://github.com/reactjs/react-router\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eReact学习资料: \u003ca href=\"http://www.infoq.com/cn/react1/\"\u003ehttp://www.infoq.com/cn/react1/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eReact中CSS样式模块: \u003ca href=\"https://css-modules.github.io/webpack-demo/\"\u003ehttps://css-modules.github.io/webpack-demo/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e深入浅出React(一):React的设计哲学 – 简单之美 \u003ca href=\"http://www.infoq.com/cn/articles/react-art-of-simplity\"\u003ehttp://www.infoq.com/cn/articles/react-art-of-simplity …\u003c/a\u003e\u003c/p\u003e"
December 2, 2015
React开发中的常见问题
"\u003cp\u003e当你在写react的时候报了类似于这样子的错:\u003cstrong\u003eEach child in an array or iterator should have a unique “key” prop.Check the render method of \u003ccode\u003exxxx\u003c/code\u003e. See \u003ca href=\"https://fb.me/react-warning-keys\"\u003ehttps://fb.me/react-warning-keys\u003c/a\u003e for more information.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e原因是这样子的:\u003cstrong\u003eReact can’t know that your array is static, so you get the warning. The most practical thing to do here is to write something like.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e解决办法只要在循环的每个子项添加一个key就行了,代码如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003evar names = [\u0026#39;Alice\u0026#39;, \u0026#39;Emily\u0026#39;, \u0026#39;Kate\u0026#39;];\n\nReactDOM.render(\n \u0026lt;div\u0026gt;\n {\n names.map(function (name, …\u003c/code\u003e\u003c/pre\u003e"
April 23, 2013
开发jquery插件
"\u003cp\u003ejquery插件开发文档:\u003c/p\u003e\n\u003cp\u003e以下为一简单的实例:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003echajia.js:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-js\" data-lang=\"js\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(\u003cspan style=\"color:#66d9ef\"\u003efunction\u003c/span\u003e(\u003cspan style=\"color:#a6e22e\"\u003e$\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e//录入框点击事件\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e$\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efn\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ealertWhileClick\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efunction\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e).\u003cspan style=\"color:#a6e22e\"\u003eclick\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003efunction\u003c/span\u003e(){\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewindow.\u003cspan style=\"color:#a6e22e\"\u003econsole\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003elog\u003c/span\u003e(\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e‘\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003eexecute\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eclick\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eevent\u003c/span\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e’\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003ealert\u003c/span\u003e(\u003cspan style=\"color:#a6e22e\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e).\u003cspan style=\"color:#a6e22e\"\u003eval\u003c/span\u003e());\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e});\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewindow.\u003cspan style=\"color:#a6e22e\"\u003econsole\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003elog\u003c/span\u003e(\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e‘\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003eok2\u003c/span\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e’\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e//获取页面最大div的最大高度\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e$\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efn\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003emaxHeight\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efunction\u003c/span\u003e(){\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003evar\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003emax\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e0\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eeach\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003efunction\u003c/span\u003e(){\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewindow.\u003cspan style=\"color:#a6e22e\"\u003econsole\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003elog\u003c/span\u003e(\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e‘\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003ea\u003c/span\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e’\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003emax\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e Math.\u003cspan style=\"color:#a6e22e\"\u003emax\u003c/span\u003e(\u003cspan style=\"color:#a6e22e\"\u003emax\u003c/span\u003e, \u003cspan style=\"color:#a6e22e\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e).\u003cspan style=\"color:#a6e22e\"\u003eheight\u003c/span\u003e());\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e});\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003emax\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e})(\u003cspan style=\"color:#a6e22e\"\u003ejQuery\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e//插件用法\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003efunction\u003c/span\u003e(){\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e‘#\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003elogin_username\u003c/span\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e’\u003c/span\u003e).\u003cspan style=\"color:#a6e22e\"\u003ealertWhileClick\u003c/span\u003e();\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003evar\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003etallest\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e‘\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003ediv\u003c/span\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e’\u003c/span\u003e).\u003cspan style=\"color:#a6e22e\"\u003emaxHeight\u003c/span\u003e(); …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
November 18, 2012
高性能JavaScript模板引擎原理解析
"\u003cp\u003e随着 web 发展,前端应用变得越来越复杂,基于后端的 javascript(Node.js) 也开始崭露头角,此时 javascript 被寄予了更大的期望,与此同时 javascript MVC 思想也开始流行起来。javascript 模板引擎作为数据与界面分离工作中最重要一环,越来越受开发者关注,近一年来在开源社区中更是百花齐放,在 Twitter、淘宝网、新浪微博、腾讯QQ空间、腾讯微博等大型网站中均能看到它们的身影。\u003c/p\u003e\n\u003cp\u003e本文将用最简单的示例代码描述现有的 javascript 模板引擎的原理,包括新一代 javascript 模板引擎 artTemplate 的特性实现原理,欢迎共同探讨。\u003c/p\u003e\n\u003ch2 id=\"arttemplate-介绍\"\u003eartTemplate 介绍\u003c/h2\u003e\n\u003cp\u003eartTemplate 是新一代 javascript 模板引擎,它采用预编译方式让性能有了质的飞跃,并且充分利用 javascript 引擎特性,使得其性能无论在前端还是后端都有极其出色的表现。在 chrome 下渲染效率测试中分别是知名引擎 Mustache 与 micro tmpl 的 25 、 32 倍。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://cdc.tencent.com/wp-content/uploads/2012/06/1.png\" alt=\"速度对比\"\u003e\u003c/p\u003e\n\u003cp\u003e除了性能优势外,调试功能也值得一提。模板调试 …\u003c/p\u003e"
November 5, 2012
jquery中validate插件和form插件冲突的解决办法
"\u003cp\u003e如题:用jquery form提交表单,用jquery validate做数据验证 ,现在的问题是分别使用validate有作用,一起使用,则validate不起作用,谁遇到过帮忙解决下。\u003c/p\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003e\n\u003cp\u003e $(document).ready(function() {\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e $(“#inputForm”).validate({\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e …\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e });\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e });\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e function onsubmit(){\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e var options ={\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e …\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e };\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e $(‘#inputForm’).ajaxSubmit(options); //options\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e return false;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e }\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e==================\u003c/p\u003e\n\u003cp\u003e补充一下,这个submitHandler:function(){}方法内可以写任何方法。但最后要有一个form.submit或form.ajaxSubmit\n比如我这个\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e$(document).ready(function(){ …\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e"
August 7, 2012
动态添加input表单元素的js代码
"\u003cp\u003eaddinput.js\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e//======================\n//功能:在表单中input file控件\n//参数:parentID—要插入input file控件的父元素ID\n// inputID—-input file控件的ID,这个一定要和name保持一致的,否则会出问题\n// maxNum — 最大数量 0为不限制\n//======================\nfunction createInput(parentID,inputFileID, maxNum){\u003c/p\u003e\n\u003cp\u003eif (maxNum \u0026gt; 0) {\nx=document.getElementsByName(inputFileID);\ny=x.length;\nif (y \u0026gt;= maxNum) {\nalert(‘最多只允许添加’ + maxNum + ‘个’);\nreturn false;\n}\n}\u003c/p\u003e\n\u003cp\u003evar parent=$G(parentID);//获取父元素\u003c/p\u003e\n\u003cp\u003evar div=document.createElement(“div”);//创建一个div容器用于包含input file\nvar …\u003c/p\u003e\u003c/blockquote\u003e"
August 5, 2012
jQuery Datepicker 中文
"\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2012/08/jquery-ui-datepicker-chinese.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2012/08/jquery-ui-datepicker-chinese.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e以前在使用 js 日历时,没有使用过 \u003ca href=\"http://jqueryui.com/demos/datepicker/\"\u003ejQuery Datepicker\u003c/a\u003e,今天第一次使用发现非常的好用。使用时需要将日历文字显示为中文,打开前边的链接在文章底部就可以看到将 jQuery Datepicker 文字显示为中文的方法,在 \u003ca href=\"http://jquery-ui.googlecode.com/svn/trunk/ui/i18n/\"\u003ehttp://jquery-ui.googlecode.com/svn/trunk/ui/i18n/\u003c/a\u003e 可以看到各种版本的语言,中文文件内容如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ejQuery(function($){\n $.datepicker.regional[\u0026#39;zh-CN\u0026#39;] = {\n closeText: \u0026#39;关闭\u0026#39;,\n prevText: \u0026#39;\u0026lt;上月\u0026#39;,\n nextText: \u0026#39;下月\u0026gt;\u0026#39;,\n currentText: \u0026#39;今天\u0026#39;,\n monthNames: [\u0026#39;一月\u0026#39;,\u0026#39;二月\u0026#39;,\u0026#39;三 …\u003c/code\u003e\u003c/pre\u003e"
August 5, 2012
jQuery mouseover mouseout事件在IE下闪烁的解决方法
"\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$(\u0026#34;#category ul\u0026#34;).find(\u0026#34;li\u0026#34;).each(\n function() {\n $(this).mouseover(\n function() {\n $(\u0026#34;#\u0026#34; + this.id + \u0026#34;_menu\u0026#34;).show();\n $(this).addClass(\u0026#34;a\u0026#34;);\n }\n );\n $(this).mouseout(\n function() {\n $(this).removeClass(\u0026#34;a\u0026#34;);\n $(\u0026#34;#\u0026#34; + this.id + \u0026#34;_menu\u0026#34;).hide();\n }\n );\n }\n);\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e浏览器之间的不兼容一直令前端开发者的头疼,而 IE 更是噩梦。鼠标在下拉菜 …\u003c/p\u003e"
June 17, 2012
FCKeditor + SyntaxHighlighter 让代码高亮着色
"\u003cp\u003eFCKeditor是现在最为流行的开源编辑器,SyntaxHighlighter是一个用JS实现的代码高亮显示插件,可以最小化修改您的程序实现效果,最终效果截图:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2012/06/fckedit_syntaxhighlighter1.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2012/06/fckedit_syntaxhighlighter1.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e演示网页:\u003c/p\u003e\n\u003cp\u003e下载FCKeditor + SyntaxHighlighter插件包:\u003ca href=\"http://tech.cncms.com/UploadFiles/20101001/fck_SyntaxHighlighter.zip\"\u003efck_SyntaxHighlighter.zip\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e下面分步介绍如何在FCKeditor环境中使用SyntaxHighlighter。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e后台FCKeditor编辑器的修改\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1、将包解压后,把 insertcode 文件夹上传到 FCKeditor编辑器的editor\\plugins\\目录下,然后修改FCKeditor编辑器的fckconfig.js此文件,在此文件中 FCKConfig.PluginsPath = FCKConfig.BasePath + ‘plugins/’ ;下面加入以下代码:\nFCKConfig.Plugins.Add(‘insertcode’);\u003c/p\u003e\n\u003cp\u003e2、打开FCKeditor编辑器的editor\\lang文件夹里的zh-cn.js,在DlgDivInlineStyle : “CSS 样式”,(注意这句后面一定要加一个逗 …\u003c/p\u003e"
May 25, 2012
New HTTP status codes
"\u003cp\u003e\u003ca href=\"http://tools.ietf.org/html/rfc6585\"\u003eRFC 6585\u003c/a\u003e has been published quite recently. This document describes 4 new HTTP status codes.\u003c/p\u003e\n\u003cp\u003eSo in case you were wondering, yes.. HTTP is still evolving :), and these new statuses may be quite useful for developing your REST, or otherwise HTTP-based service. This post describes why they are important, and when you should use them.\u003c/p\u003e\n\u003ch3 id=\"428-precondition-required\"\u003e428 Precondition Required\u003c/h3\u003e\n\u003cp\u003eA precondition is something a client can send along with a HTTP request. This condition needs to be met in order for the request to complete.\u003c/p\u003e"
April 23, 2012
jquery.validate remote 和 自定义验证方法
"\u003cp\u003e$(function(){\u003c/p\u003e\n\u003cp\u003evar validator = $(“#enterRegForm”).validate({\ndebug:false, //调试模式取消submit的默认提交功能\n//errorClass: “error”,//默认为错误的样式类为:error\n//validClass: “check”,//验证成功后的样式,默认字符串valid\nfocusInvalid: true,//表单提交时,焦点会指向第一个没有通过验证的域\n//focusCleanup:true;//焦点指向错误域时,隐藏错误信息,不可与focusInvalid一起使用!\nonkeyup: true,\nerrorElement: “div”,\nsubmitHandler: function(form){ //表单提交句柄,为一回调函数,带一个参数:form\nform.submit(); //提交表单\n},\u003c/p\u003e\n\u003cp\u003erules: {\n“enterprise.enName”: {\nrequired: true,\nminlength: 6,\nremote:{\nurl: “/nameServlet”, // …\u003c/p\u003e"
March 30, 2012
Zen Coding – 超快地写网页代码
"\u003cp\u003e上次在北京看到善用佳软的 xBeta 演示 VIM 的时候,@[sfufoet][1] 我就被强烈震撼到了。VIM 的确是个强大的编辑器,它可以折腾出很多种强大的功能。今天看到这个叫 [Zen Coding][2] 的东西,我强烈推荐给经常和 HTML CSS 打交道的朋友。@appinn\u003c/p\u003e\n\u003cp\u003e下面的动态演示图,只是它强大功能的一部分而已。它无视了编辑器的自动提示和自动完成,秒杀了你自定义的各种快捷键或者 AHK 的热字符串,以智能简洁高效的缩短输入,带给你超快速地书写各种复杂而枯燥的 HTML 和 CSS 代码的体验。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2012/03/zen-coding.gif\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2012/03/zen-coding.gif\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e先举一个复杂的例子:zen-coding 可以把这样的代码:div#header\u0026gt;ul.navigation\u0026gt;li*4\u0026gt;a,变成下面的 HTML 代码\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e看到这熟悉的语法结构,会 CSS 的朋友一定会惊声尖叫!最妙的是那个“*4”,直接生成 4 个 li 代码了。没错,[Zen Coding][2] 就是这样牛叉的东西,[Zen Coding][2] 分为 Zen HTML 和 Zen CSS 两部分。这两部分功能是以插件的形式来实现的。 …\u003c/p\u003e"
January 8, 2012
FreeBSD中重新分区提示”ERROR: Unable to write data to disk ad0! To edit the lables on a running system set sysctl kern.geom.debugflags=16 and try again.”的解决办法
"\u003cp\u003e今天将FreeBSD系统重新安装系统的时候.将原来的分区全部删除.进行重新分区,而按下W进行分区保存的时候.提示以下错误:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eERROR: Unable to write data to disk ad0! To edit the lables on a running system set sysctl kern.geom.debugflags=16 and try again.\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e解决办法如下:\u003c/p\u003e\n\u003cp\u003e用root权限运行以下任何一条命令:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e#sysctl -w kern.geom.debugflags=16\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e或者\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e#sysctl kern.geom.debugflags=16\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e你可以用sysctl -a查询你系统的所有内核子系统的配置参数,在具备权限的情况下,你可以修改配置变量,其中有一些只读的属性无法修改,有一些属性只能在开机时设定而不是运行时动态修改的也不能改(这些参数/属性在/boot/loader.conf中调整和修改)\u003c/p\u003e"
October 8, 2011
兼容各浏览器的css透明样式写法
"\u003cp\u003e#snake{\nbackgournd: #666;\nfilter:alpha(opacity=50); /*IE*/\n-moz-opacity:0.5; /*MOZ , FF*/\nopacity:0.5; /\u003cem\u003eCSS3, FF1.5\u003c/em\u003e/\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e"
June 9, 2011
从HTTP状态 301,302,200 来看页面跳转
"\u003cp\u003e\u003cstrong\u003e301和302 Http状态有啥区别?\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e301,302 都是HTTP状态的编码,都代表着某个URL发生了转移,不同之处在于:\u003c/p\u003e\n\u003cp\u003e301 redirect: 301 代表永久性转移(Permanently Moved),\u003c/p\u003e\n\u003cp\u003e302 redirect: 302 代表暂时性转移(Temporarily Moved ),\u003c/p\u003e\n\u003cp\u003e当然 Http 状态 200 标示没有任何问题发生。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e这两种转移在使用的时候有啥好处或者问题?\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e301 重定向是网页更改地址后对搜索引擎友好的最好方法,只要不是暂时搬移的情况,都建议使用301来做转址。\u003c/p\u003e\n\u003cp\u003e302 重定向是临时性转移。\u003c/p\u003e\n\u003cp\u003e在前些年,不少Black Hat SEO曾广泛应用这项技术作弊,目前,各大主要搜索引擎均加强了打击力度,象Google前些年对Business.com以及近来对BMW德国网站的惩 罚。即使网站客观上不是spam,也很容易被搜寻引擎容易误判为spam而遭到惩罚。\u003c/p\u003e\n\u003cp\u003e研究搜索引擎优化(SEO)的人,应该都知道,301,302 使用不当,或者灵活使用会有不错的效果的,比如参看下面文章:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.jzxue.com/Html/google/011117403024005.html\"\u003e302转向与网址劫持\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.chinamyhosting.com/seoblog/2006/04/12/301-redirect/\"\u003e301转向和网址规范化\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.williamlong.info/archives/484.html\"\u003e301 …\u003c/a\u003e\u003c/p\u003e"
May 30, 2011
weebox is a dialog plugin
"\u003cp\u003e使用前需包含以下jquery.js、bgiframe.js、weebox.js、wee.css文件\u003c/p\u003e\n\u003cp\u003e基本用法举例如下:\n$.weeboxs.open(‘#testbox’, {title: ‘hello world’, width:400, height: 200});\u003c/p\u003e\n\u003cp\u003e$.weeboxs.open(‘The operation failed.’,{\nonopen:function(){alert(‘opened!’);},\nonclose:function(){alert(‘closed!’);}, onok:function(){alert(‘ok’);\n$.weeboxs.close();} });\u003c/p\u003e\n\u003cp\u003e$.weeboxs.open(‘/modules/test/testsession.php’, {contentType:’ajax’});\u003c/p\u003e\n\u003cp\u003e$.weeboxs.open(‘hello world’);\u003c/p\u003e\n\u003cp\u003e$.weeboxs.open(‘The operation failed.’,{type:’error’});\u003c/p\u003e\n\u003cp\u003e$.weeboxs.open(‘The operation …\u003c/p\u003e"
April 22, 2011
圆角(border-radius)样式
"\u003cp\u003e建议参考: \u003ca href=\"http://www.css3.info/preview/rounded-border/\"\u003ehttp://www.css3.info/preview/rounded-border/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e圆角样式示例(仅在firefox内核,safari,chrome等内核浏览器下支持,IE内核不支持)\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eborder-*-*-radius:\u003c/strong\u003e [ | \u0026lt;%\u0026gt; ] [ | \u0026lt;%\u0026gt; ]?\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003eCSS3的border-radius规范\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e属性:\nborder-top-right-radius\nborder-bottom-right-radius\nborder-bottom-right-radius\nborder-bottom-right-radius\n值:。它们分别是定义角形状的四分之一椭圆的两个半径。如图:\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e第一个值是水平半径。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e如果第二个值省略,则它等于第一个值,这时这个角就是一个四分之一圆角。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e如果任意一个值为0,则这个角是矩形,不会是圆的。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e值不允许是负值。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e属性:border-radius。它是上面四个属性值的简写。\n值:{1,4} [ / {1,4} ]\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e如果斜线前后的值都存在,那么斜线前的值设置水平半径,且斜线后的值设置垂直半 …\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e"
April 21, 2011
Javascript的兴起是否意味着LAMP的终结?
"\u003cp\u003eMetamarket的CTO Mike Driscoll最近发表了一篇\u003ca href=\"http://metamarketsgroup.com/blog/node-js-and-the-javascript-age/\"\u003e略带煽动性的帖子,讨论了Web应用的架构\u003c/a\u003e。他认为\u003ca href=\"http://www.infoq.com/interviews/node-ryan-dahl\"\u003eNode.js\u003c/a\u003e等\u003ca href=\"http://www.infoq.com/presentations/nodejs\"\u003e框架\u003c/a\u003e预示着\u003ca href=\"http://www.infoq.com/LAMP\"\u003eLAMP\u003c/a\u003e的终结。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e三个月前,我们决定废弃仪表盘选用的框架:Python的Django,并用Node.js(服务器端的Javascript)重新构建了框架。鉴于LAMP堆栈已经死亡,我们才做出了这个决定。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eMike认为Web有三个阶段:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cul\u003e\n\u003cli\u003e1991-1999:HTML时代——这是个文档的时代。\u003c/li\u003e\n\u003cli\u003e2000-2009:LAMP时代——使用数据库的时代。\u003c/li\u003e\n\u003cli\u003e2010-??:Javascript时代。Javascript时代是事件流的时代。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e现代的Web页面已经不再是页面了,它们都是事件驱动的应用,信息会通过这些应用流转。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e他解释道:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eLAMP架构已经死了,因为对于响应里的Mashup,很少有应用愿意把全部的有效负载转移到很小的事件上去;他们只想用Javascript更新DOM的一个片段。AJAX做到了这一点,但如果服务器端的LAMP模板有10%的HTML和90%的Javascript,这么做显然是不对的……\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eMike认为,服务器的主要作用就是带着 …\u003c/p\u003e"
April 18, 2011
自定义jquery validate 插件的默认提示语
"\u003cp\u003e\u003cstrong\u003e法一:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e一、默认校验规则\n(1)required:true 必输字段\n(2)remote:”check.php” 使用ajax方法调用check.php验证输入值\n(3)email:true 必须输入正确格式的电子邮件\n(4)url:true 必须输入正确格式的网址\n(5)date:true 必须输入正确格式的日期\n(6)dateISO:true 必须输入正确格式的日期(ISO),例如:2009-06-23,1998/01/22 只验证格式,不验证有效性\n(7)number:true 必须输入合法的数字(负数,小数)\n(8)digits:true 必须输入整数\n(9)creditcard: 必须输入合法的信用卡号\n(10)equalTo:”#field” 输入值必须和#field相同\n(11)accept: 输入拥有合法后缀名的字符串(上传文件的后缀)\n(12)maxlength:5 输入长度最多是5的字符串(汉字算一个字符)\n(13)minlength:10 输入长度最小是10的字符串(汉字算一个字符)\n(14)rangelength:[5,10] 输入长度必须介于 5 和 10 之 …\u003c/p\u003e"
April 18, 2011
jquery Form 验证 validate插件使用
"\u003cp\u003e不过我们还要在需要验证的INPUT里面class加入required说明是必填项,其他的就是验证相关数据比如email就是验证email的数据结构\u003c/p\u003e\n\u003cp\u003e以下列出validate自带的默认验证\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003erequired: “必选字段”,\u003c/p\u003e\n\u003cp\u003eremote: check.php “使用ajax方法调用check.php验证输入值段”,\u003c/p\u003e\n\u003cp\u003eemail: “请输入正确格式的电子邮件”,\u003c/p\u003e\n\u003cp\u003eurl: “请输入合法的网址”,\u003c/p\u003e\n\u003cp\u003edate: “请输入合法的日期”,\u003c/p\u003e\n\u003cp\u003edateISO: “请输入合法的日期 (ISO).”,\u003c/p\u003e\n\u003cp\u003enumber: “请输入合法的数字”,\u003c/p\u003e\n\u003cp\u003edigits: “只能输入整数”,\u003c/p\u003e\n\u003cp\u003ecreditcard: “请输入合法的信用卡号”,\u003c/p\u003e\n\u003cp\u003eequalTo: “请再次输入相同的值”,\u003c/p\u003e\n\u003cp\u003eaccept: “请输入拥有合法后缀名的字符串”,\u003c/p\u003e\n\u003cp\u003emaxlength: jQuery.format(“请输入一个长度最多是 {0} 的字符串”),\u003c/p\u003e\n\u003cp\u003eminlength: jQuery.format(“请输入一个长度最少是 {0} 的字符串”),\u003c/p\u003e\n\u003cp\u003erangelength: jQuery.format(“请输入一个长度介于 {0} …\u003c/p\u003e\u003c/blockquote\u003e"
April 2, 2011
高性能WEB开发系列
"\u003cp\u003e准备写一系列关于高性能WEB开发的日记,主要是跟前端技术相关的(html,http,js,css等),将自己了解的一些知识做1个总结和记录并分享,希\u003c/p\u003e\n\u003cp\u003e望大家能喜欢,也喜欢自己能坚持写下去。当然因个人技术水平有限,写作能力更是非常差,所以如果有什么地方写得不好的,请大家都指点指点。\u003c/p\u003e\n\u003cp\u003e1、 \u003ca href=\"http://www.blogjava.net/BearRui/archive/2010/01/29/web_performance_server.html\" title=\"HTTP服务器\"\u003eHTTP服务器\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e2、\u003ca href=\"http://www.blogjava.net/BearRui/archive/2010/04/28/web_performance_tools.html\" title=\"性能测试工具推荐\"\u003e性能测试工具推荐\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e3、 \u003ca href=\"http://www.blogjava.net/BearRui/archive/2010/02/22/web_performance_image.html\"\u003e图片篇.\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e4、 \u003ca href=\"http://www.blogjava.net/BearRui/archive/2010/04/08/web_performance_js_where.html\" title=\"如何加载JS,JS应该放在什么位置\"\u003e如何加载JS,JS应该放在什么位置\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e5、 \u003ca href=\"http://www.blogjava.net/BearRui/archive/2010/04/18/reduce_number_of_request.html\" title=\"为什么要减少请求数,如何减少请求数.\"\u003e为什么要减少请求数,如何减少请求数.\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e6、 \u003ca href=\"http://www.blogjava.net/BearRui/archive/2010/04/26/web_performance_reduce_weight.html\" title=\"高性能WEB开发(5) - 减少请求,响应的数据量.\"\u003e减少请求,响应的数据量.\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e7、 \u003ca href=\"http://www.blogjava.net/BearRui/archive/2010/05/04/js_css_merge_compress_cache.html\"\u003eJS、CSS的合并、压缩、缓存管理\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e8、 \u003ca href=\"http://www.blogjava.net/BearRui/archive/2010/05/10/web_performance_repaint_relow.html\"\u003e页面呈现、重绘、回流。\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e9、 \u003ca href=\"http://www.blogjava.net/BearRui/archive/2010/05/12/best_use_google_analytics.html\"\u003e该如何加载google-analytics(或其他第三方)的JS.\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e10、 \u003ca href=\"http://www.blogjava.net/BearRui/archive/2010/05/16/html_compressor.html\"\u003e疯狂的HTML压缩\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e11、 \u003ca href=\"http://www.blogjava.net/BearRui/archive/2010/05/19/flush_chunk_encoding.html\"\u003eflush让页面分块,逐步呈现\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e12、 \u003ca href=\"http://www.blogjava.net/BearRui/archive/2010/06/07/efficient_css.html\"\u003e了解CSS的查找匹配原理,让CSS更简洁、高效\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e[作者]:BearRui(AK-47)\u003c/p\u003e"
April 2, 2011
DynaTrace Ajax Edition:IE浏览器性能分析工具
"\u003cp\u003eDynaTrace AJAX是一个运行在IE浏览器下的免费页面性能分析工具,它可以支持主流的IE6、IE7、IE8浏览器。这款工具正是DynaTrace为进入前端性能分析领域而发布的。您可以利用它来分析页面渲染时间、DOM方法执行时间,甚至可以看到JS代码的解析时间。连JQuery的创始者 John Resig 也鼎力推荐了一把。\u003c/p\u003e\n\u003cp\u003e从John Resig的 \u003ca href=\"http://ejohn.org/blog/deep-tracing-of-internet-explorer/\"\u003eDeep Tracing of Internet Explorer\u003c/a\u003e 了解到了这款刚发布的免费的前端性能分析工具,John Resig对其评价甚高,John Resig对其评价到:“我一般不随便写关于性能分析工具的东西,坦率地说,我感觉它们绝大部分都比较烂,根本不能提供任何有价值的信息和分析结果。不过 dynaTrac提供了一些我以前在任何其他工具上都没见过的东西。”\u003c/p\u003e\n\u003cp\u003eAjax的本事真不是盖的!那么,它到底有啥特别之处呢?“这个工具可以跟踪JavaScript从执行开始,经过本地的XMLHttpRequest、发送网络请求,再到请求返回的全过程。”\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e更多的我这里就不多说了,权威人士们都说过了,这东西我也刚上手没多久,还谈不上有多深入的 …\u003c/strong\u003e\u003c/p\u003e"
April 1, 2011
web高性能开发系列随笔
"\u003cp\u003e在BlogJava里写了一些关于高性能WEB开发的随笔,因为都是跟前端技术相关(html,http,js,css等),所以也贴到博客园来,吸收下人气。\u003c/p\u003e\n\u003cp\u003e1、 \u003ca href=\"http://www.blogjava.net/BearRui/archive/2010/01/29/web_performance_server.html\" title=\"HTTP服务器\"\u003eHTTP服务器\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e2、 \u003ca href=\"http://www.blogjava.net/BearRui/archive/2010/04/28/web_performance_tools.html\" title=\"性能测试工具推荐\"\u003e性能测试工具推荐\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e3、 \u003ca href=\"http://www.blogjava.net/BearRui/archive/2010/02/22/web_performance_image.html\"\u003e图片篇.\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e4、 \u003ca href=\"http://www.blogjava.net/BearRui/archive/2010/04/08/web_performance_js_where.html\" title=\"如何加载JS,JS应该放在什么位置\"\u003e如何加载JS,JS应该放在什么位置\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e5、 \u003ca href=\"http://www.blogjava.net/BearRui/archive/2010/04/18/reduce_number_of_request.html\" title=\"为什么要减少请求数,如何减少请求数.\"\u003e为什么要减少请求数,如何减少请求数.\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e6、 \u003ca href=\"http://www.blogjava.net/BearRui/archive/2010/04/26/web_performance_reduce_weight.html\" title=\"高性能WEB开发(5) - 减少请求,响应的数据量.\"\u003e减少请求,响应的数据量.\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e7、 \u003ca href=\"http://www.blogjava.net/BearRui/archive/2010/05/04/js_css_merge_compress_cache.html\"\u003eJS、CSS的合并、压缩、缓存管理\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e8、 \u003ca href=\"http://www.blogjava.net/BearRui/archive/2010/05/10/web_performance_repaint_relow.html\"\u003e页面呈现、重绘、回流。\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e9、 \u003ca href=\"http://www.cnblogs.com/BearsTaR/archive/2010/05/12/best_use_google_analytics.html\"\u003e该如何加载google-analytics(或其他第三方)的JS.\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e10、 \u003ca href=\"http://www.cnblogs.com/BearsTaR/archive/2010/05/17/html_compressor.html\"\u003e疯狂的HTML压缩.\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e11、 \u003ca href=\"http://www.cnblogs.com/BearsTaR/archive/2010/05/19/flush_chunk_encoding.html\"\u003eflush让页面分块,逐步呈现\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e12、 \u003ca href=\"http://www.cnblogs.com/BearsTaR/archive/2010/06/07/efficient_css.html\"\u003e了解CSS的查找匹配原理,让CSS更简洁、高效\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e[作者]:BearRui(AK-47)\u003c/p\u003e"
April 1, 2011
windows下chrome器安装Speed Tracer
"\u003cp\u003e在上一篇文章( \u003ca href=\"http://blog.haohtml.com/archives/8828\"\u003e15个对Web设计和开发有用的Chrome插件\u003c/a\u003e)我们提到一个\u003cstrong\u003e\u003cstrong\u003eSpeed Tracer 速度追踪\u003c/strong\u003e\u003c/strong\u003e 插件,现在我们就来安装一下,我这里用的是windows的操作系统,chrome的版本为10.0.648.204.目前为最新的版本了.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.安装”Speed Tracer 速度追踪器”插件\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/04/speed-tracer-by-google.bmp\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/speed-tracer-by-google.bmp\" alt=\"\"\u003e\u003c/a\u003e\u003cstrong\u003e2.配置chrome浏览器\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e安装完插件以后,将chorme浏览器关闭,记得要全部关闭.下面直接将官方的安装过程贴出来了,虽然是英文的,不过有图片很容易懂的.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eStart Google Chrome with a flag that enables Speed Tracer to work\u003c/strong\u003e, as described next. The process is different for Windows and Macintosh.\u003cstrong\u003e– Windows\u003c/strong\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eStart Google Chrome with the following flag, either from the command line or by modifying your desktop shortcut for Google …\u003c/p\u003e"
April 1, 2011
15个对Web设计和开发有用的Chrome插件
"\u003cp\u003e在\u003cstrong\u003eWeb设计和开发\u003c/strong\u003e中我们一定会用到不同的浏览器,如Firefox浏览器,IE浏览器,谷歌浏览器等。最近我一直在用谷歌浏览器,发现了一些非常有用的\u003cstrong\u003eChrome插件\u003c/strong\u003e。跟大家分享一下,下面我按字母顺序列出。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1. Aviary Screen Capture 屏幕截图\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eAviary Screen Capture让你能够截取网页的屏幕快照。获得屏幕快照后,用Aviary.com的应用程序在浏览器内编辑那幅快照。基本的图像编辑装置让你能够标记(通过画箭头和长方形)、编辑(裁剪、旋转和调整大小)和获得精确的像素色彩。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2. Chrome SEO 搜索引擎优化\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eChrome SEO为搜索引擎优化工具提供了方便的路径。这些工具帮助你做每日搜索引擎优化工作,比如竞争分析、关键词分析、反向链接检查及网页排名检查等。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3. Chrome Sniffer 嗅探器\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eChrome Sniffer使Web开发人员能够在网站上运行的检查web框架∕CMS和JavaScript库。这个插件通过一个图标,显示已检测到的框架。目前,这个插件最多可检测70个流行的CMS和JavaScript库。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e4. Eye Dropper …\u003c/strong\u003e\u003c/p\u003e"
March 31, 2011
浏览器的加载与页面性能优化
"\u003cp\u003e本文将探讨浏览器渲染的loading过程,主要有2个目的:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e了解浏览器在loading过程中的实现细节,具体都做了什么\u003c/li\u003e\n\u003cli\u003e研究如何根据浏览器的实现原理进行优化,提升页面响应速度\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e由于loading和parsing是相互交织、错综复杂的,这里面有大量的知识点,为了避免过于发散本文将不会对每个细节都深入研究,而是将重点放在开发中容易控制的部分(Web前端和Web Server),同时由于浏览器种类繁多且不同版本间差距很大,本文将侧重一些较新的浏览器特性\u003c/p\u003e\n\u003ch2 id=\"现有知识\"\u003e现有知识\u003c/h2\u003e\n\u003cp\u003e提升页面性能方面已经有很多前人的优秀经验了,如\u003ca href=\"http://developer.yahoo.com/performance/rules.html\"\u003eBest Practices for Speeding Up Your Web Site\u003c/a\u003e和\u003ca href=\"http://code.google.com/speed/page-speed/docs/rules_intro.html\"\u003eWeb Performance Best Practices\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e本文主要专注其中加载部分的优化,总结起来主要有以下几点:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e带宽\u003c/li\u003e\n\u003cli\u003e使用CDN\u003c/li\u003e\n\u003cli\u003e压缩js、css,图片优化\u003c/li\u003e\n\u003cli\u003eHTTP优化\u003c/li\u003e\n\u003cli\u003e减少转向\u003c/li\u003e\n\u003cli\u003e减少请求数\u003c/li\u003e\n\u003cli\u003e缓存\u003c/li\u003e\n\u003cli\u003e尽早Flush\u003c/li\u003e\n\u003cli\u003e使用gzip\u003c/li\u003e\n\u003cli\u003e减少cookie\u003c/li\u003e\n\u003cli\u003e使用GET\u003c/li\u003e\n\u003cli\u003eDNS优化\u003c/li\u003e\n\u003cli\u003e减少域名解析时间\u003c/li\u003e\n\u003cli\u003e增多域名提高并发\u003c/li\u003e\n\u003cli\u003eJavaScript\u003c/li\u003e\n\u003cli\u003e放页面底部\u003c/li\u003e\n\u003cli\u003edefer/async\u003c/li\u003e\n\u003cli\u003eCSS\u003c/li\u003e\n\u003cli\u003e放页面头部\u003c/li\u003e\n\u003cli\u003e避 …\u003c/li\u003e\u003c/ul\u003e"
March 24, 2011
css问题,ie6下有时候边框断断续续bug的解决l办法
"\u003cp\u003ee6.0下面经常会出现border边框断断续续的问题,初学div+css 的一般不会用遇到这个问题,不过等深一步了解了div之后自然会经常碰到这种问题了,因为初学者不会偷懒,等我们觉得用的很熟了,各种浏览器都能很方便的 兼容之后就会出现这种问题,我有很多同事都碰到过这种问题,其实解决办法很简单,我先简单描述一下边框断裂的效果.\u003c/p\u003e\n\u003cp\u003e在浏览器下一刷新边框是全的,再以刷新边框就会有断开,什么原因呢,很懊恼的事情,网上一搜也没有答案,下面我就告诉大家解决的方法,其实他是有原因的, 原因就是你的外层有边框,边框层里面嵌套的层里面有浮动,浮动这个最令人懊恼的东西经常会出问题,由于这个原因会引起ie6下面边框断裂,解决办法就是在 外层加 zoom:1; 或者 heigth:100%; 很容易就解决了这个问题。\u003c/p\u003e\n\u003cp\u003e表现状况:窗口的边框时隐时现。。。\u003c/p\u003e\n\u003cp\u003e发生情况:\u003c/p\u003e\n\u003cp\u003e网上说是在一个容器中有元素浮动时容易出现,自己感觉有时内部元素把容器撑开时也会看不到边框。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e解决办法:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e如果按网上说的是因为浮动的原因的话,那么添加清除浮动则应试可以正常解决。\u003c/p\u003e\n\u003cp\u003e另外网上的解决办法是:给窗口设置{zoom:1} or { …\u003c/p\u003e"
March 14, 2011
如何禁止搜索引擎蜘蛛爬行
"\u003cp\u003e\u003cstrong\u003e方法一、robots Meta标签\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003erobots.txt是放在网站中,文件级的网络蜘蛛授权;而robots Meta标签是放在网页中,一般用于部分网页需要单独设置的情况下。两者的功能是一样的。\nMeta robots标签必须放在和之间,格式:\u003c/p\u003e\n\u003cp\u003econtent中的值决定允许抓取的类型,必须同时包含两个值:是否允许索引(index)和是否跟踪链接(follow,也可以理解为是否允许沿着网页中的超级链接继续抓取)。共有4个参数可选,组成4个组合:\nindex,follow:允许抓取本页,允许跟踪链接。\nindex,nofollow:允许抓取本页,但禁止跟踪链接。\nnoindex,follow:禁止抓取本页,但允许跟踪链接。\nnoindex,nofllow:禁止抓取本页,同时禁止跟踪本页中的链接。\n以上1和4还有另一种写法:\nindex,follow可以写成all,如:\u003c/p\u003e\n\u003cp\u003enoindex,nofollow可以写成none,如:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e方法二、创建robots.txt文本\u003c/strong\u003e\n对于robots.txt文本的相关概念或者是协议我就不提了,主要是直接告诉大家这个文件的写法。\n文件应该同时包含2个 …\u003c/p\u003e"
January 14, 2011
SEO URL的优化方案【转】
"\u003cp\u003e针对搜索引擎优化(SEO),页面URL的布局与呈现是影响排名和网站索引率的重要因素之一。对于搜索引擎而言,URL是它们找到一个网页的入口,URL的好坏会直接影响搜索引擎对一个网站的索引及理解程度。对于用户,URL会直接显示在搜索结果中,从而影响人们的点击意愿。因此一个好的URL结构无论是对搜索引擎,还是用户,都有着非常重要的作用。在本文中,我们将详细探讨针对SEO的URL优化技巧,但同时也想提醒大家,对于一个现有的网站,URL的改动需要谨慎。URL的改动会牵扯到原有URL权重的转移等问题,因此除非在万不得已的情况下,尽量不要改动现有的URL。但如果你是在策划一个新的网站或者生成新的页面,那么就让我们来探讨一下如何得到一个完美的URL吧。\n\u003cstrong\u003e1. URL愈短愈好\u003c/strong\u003e\n无论是搜索引擎,还是浏览者,都喜欢简短的URL。URL的层级不宜过多,尽量控制在4级之内。虽然搜索引擎仍然会抓取四级之后的页面,但页面的权重会大大降低。\u003c/p\u003e\n\u003cp\u003e例如华为中文网站的“移动宽带”( \u003ca href=\"http://www.huawei.com/cn/core\"\u003ehttp://www.huawei.com/cn/core\u003c/a\u003e_network/internet_mobility\n_solutions.do )页 …\u003c/p\u003e"
December 23, 2010
Sitemap的XML格式及注意事项
"\u003cp\u003e这篇文章介绍的比较全的:\u003c/p\u003e\n\u003cp\u003e此文档介绍适用于 Sitemap 协议的 XML 架构。\u003c/p\u003e\n\u003cp\u003eSitemaps 协议格式由 XML 标记组成。Sitemap 的所有数据数值应为实体转义过的。文件本身应为 UTF-8 编码。\u003c/p\u003e\n\u003cp\u003eSitemap 必须:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e以 \u003ccode\u003e\u0026lt; [urlset](http://www.sitemaps.org/zh_CN/protocol.php#urlsetdef) \u0026gt;\u003c/code\u003e 开始标记作为开始,以 `` 结束标记作为结束。\u003c/li\u003e\n\u003cli\u003e在 `` 标记中指定命名空间(协议标准)。\u003c/li\u003e\n\u003cli\u003e每个网址包含一个\u003ccode\u003e\u0026lt; [url](http://www.sitemaps.org/zh_CN/protocol.php#urldef) \u0026gt;\u003c/code\u003e 条目作为 XML 父标记。\u003c/li\u003e\n\u003cli\u003e在每个 `` 父标记中包含一个 \u003ccode\u003e\u0026lt; [loc](http://www.sitemaps.org/zh_CN/protocol.php#locdef) \u0026gt;\u003c/code\u003e 子标记条目。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e其他所有标记均为可选,搜索引擎不同,对可选标记的支持也各不相同。有关详情,请参阅各个搜索引擎的文档。\u003c/p\u003e\n\u003cp\u003e而且,Sitemap 中的所有网址都必须来自于同一个主 …\u003c/p\u003e"
December 23, 2010
站点地图标记定义
"\u003cp\u003e下表简要介绍了站点地图在列举网络网址时所需的标记。要添加关于特定内容类型的更多详情,请参见 \u003ca href=\"http://www.google.com/support/webmasters/bin/answer.py?answer=80471\"\u003e视频\u003c/a\u003e、 \u003ca href=\"http://www.google.com/support/webmasters/bin/answer.py?answer=178636\"\u003e图片\u003c/a\u003e、 \u003ca href=\"http://www.google.com/support/webmasters/bin/answer.py?answer=34627\"\u003e移动\u003c/a\u003e、 \u003ca href=\"http://www.google.com/support/news_pub/bin/answer.py?answer=75717\"\u003e新闻\u003c/a\u003e、 \u003ca href=\"http://www.google.com/support/webmasters/bin/answer.py?answer=75225\"\u003e软件源代码\u003c/a\u003e 以及 \u003ca href=\"http://www.google.com/support/webmasters/bin/answer.py?answer=94554\"\u003e地理 (KML) 信息\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e标记****必需\u003c/strong\u003e?\n\u003cstrong\u003e说明\u003c/strong\u003e\u003ccode\u003e\u0026lt;urlset\u0026gt;\u003c/code\u003e\n必需\u003c/p\u003e\n\u003cp\u003e包含站点地图中网址集的所有相关信息。\n\u003ccode\u003e\u0026lt;url\u0026gt;\u003c/code\u003e\n必需\u003c/p\u003e\n\u003cp\u003e包含特定网址的所有相关信息。\n\u003ccode\u003e\u0026lt;loc\u0026gt;\u003c/code\u003e\n必需\u003c/p\u003e\n\u003cp\u003e指定网址。请指定图片和视频的目标网页(又称播放页、引用页)。必须是具有唯一性的网址。\n\u003ccode\u003e\u0026lt;lastmod\u0026gt;\u003c/code\u003e\n可选\u003c/p\u003e\n\u003cp\u003e网址的最后修改时间,使用 YYYY-MM-DDThh:mmTZD 格式(时间值是可选的)。\n\u003ccode\u003e\u0026lt;changefreq\u0026gt;\u003c/code\u003e\n可选\u003c/p\u003e\n\u003cp\u003e提供关于网页更改频率的提示。有效值为:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ealways\u003c/code\u003e。对于每次访问时都发生更改的网页,请使用该值。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ehourly\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003edaily\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eweekly\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003emonthly\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eyearly\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003enever\u003c/code\u003e。对于已存档的网址,请使用该值。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ccode\u003e\u0026lt;priority\u0026gt;\u003c/code\u003e\n可选\u003c/p\u003e\n\u003cp\u003e说明网站上的某个网址相对于其他所有网址的优先级。此优先级的范围是 1.0(极其重要)到 0.1(一 …\u003c/p\u003e"
November 24, 2010
是用js 实现 图片“另存为” 最后怎样实现的? (FireFox没有测试过)
"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e使用JS实现单击连接保存图片\n2种形式都可以\n\n第一种:\n\u003c/code\u003e\u003c/pre\u003e\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026lt;script\u0026gt;\nfunction SaveAs5(imgURL)\n...{\n var oPop = window.open(imgURL,\u0026#34;\u0026#34;,\u0026#34;width=1, height=1, top=5000, left=5000\u0026#34;);\n for(; oPop.document.readyState != \u0026#34;complete\u0026#34;; )\n ...{\n if (oPop.document.readyState == \u0026#34;complete\u0026#34;)break;\n }\n oPop.document.execCommand(\u0026#34;SaveAs\u0026#34;);\n oPop.close();\n}\n\u0026lt;/script\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026lt;img src=\u0026#34;t_screenshot_17616.jpg\u0026#34; id=\u0026#34;DemoImg\u0026#34; border=\u0026#34;0\u0026#34; …\u003c/code\u003e\u003c/pre\u003e"
November 24, 2010
JS打开图片另存为对话框
"\u003cp\u003e New Document\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003efunction downLoadImage(imagePathURL){\u003c/p\u003e\n\u003cp\u003e//如果中间IFRAME不存在,则添加\nif(!document.getElementById(“_SAVEASIMAGE_TEMP_FRAME”))\njQuery(‘ width=”0″ height=”0″ src=”about:blank”\u0026gt;’).appendTo(“body”);\u003c/p\u003e\n\u003cp\u003eif(document.all._SAVEASIMAGE_TEMP_FRAME.src!=imagePathURL){\n//图片地址发生变化,加载图片\ndocument.all._SAVEASIMAGE_TEMP_FRAME.src = imagePathURL;\n}else{\n//图片地址没有变化,直接另存为\n_doSaveAsImage();\n}\n}\nfunction _doSaveAsImage(){\nif(document.all._SAVEASIMAGE_TEMP_FRAME.src!=”about:blank”) …\u003c/p\u003e\u003c/blockquote\u003e"
November 23, 2010
js里面如何获取网络地址的图片的高度和宽度 (变通办法)
"\u003cp\u003e原图片是 :\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e(function(){\nvar img=document.createElement(‘img’);//创建一个img元素\nimg.src=”http://gg.blueidea.com/2008/blueidea/flash2008.gif”;//指定src\nimg.style.position=”absolute”;//防止正常的内容变形\nimg.style.visibility=’hidden’;//藏起来\nvar inj=document.getElementById(‘box’).appendChild(img);//插入到box中。当然插入到document.body也可以\nalert(‘宽:’+inj.offsetWidth);//然后就可以通过 offset 取得宽和高了\nalert(‘高:’+inj.offsetHeight);\n})();\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e简单地说就是把图片放入一个自动伸缩的DIV中,然后获取DIV的宽和高!\u003c/p\u003e"
November 22, 2010
延迟加载图片的 jQuery 插件:Lazy Load
"\u003cp\u003e网站的速度非常重要,现在有很多网站优化的工具,如 Google 的 \u003ca href=\"http://fairyfish.net/2009/06/08/google-page-speed/\"\u003ePage Speed\u003c/a\u003e,Yahoo 的 YSlow,对于网页图片,Yahoo 还提供 \u003ca href=\"http://fairyfish.net/2009/12/14/smush-it/\"\u003eSmush.it\u003c/a\u003e 这个工具对图片进行批量压缩,但是对于图片非常多的网站,载入网页还是需要比较长的时间,这个时候我们可以使用 Lazy Load 这个 jQuery 插件来延迟加载图片。\u003c/p\u003e\n\u003cp\u003eLazy loader 是一个延迟加载图片的 jQuery 插件,在一些图片非常多的网站中非常有用,在在浏览器可视区域外的图片不会被载入,直到用户将页面滚动到它们所在的位置才加载,这样对于含有很多图片的比 较长的网页来说,可以加载的更快,并且还能节省服务器带宽。\u003c/p\u003e\n\u003cp\u003eLazy Loader 使用也非常简单,首先确保你的页面已经加载 jQuery Javascript 库,然后在加载 Lazy Load 的 Javascript 文件:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026lt;script src=\u0026#34;jquery.js\u0026#34; type=\u0026#34;text/javascript\u0026#34;\u0026gt;\u0026lt;/script\u0026gt;\n\u0026lt;script …\u003c/code\u003e\u003c/pre\u003e"
November 21, 2010
用javascript 怎么判断图片是否加载完成呢
"\u003cp\u003e用javascript 怎么判断图片是否加载完成呢?\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003efunction loadImage(url){\u003c/p\u003e\n\u003cp\u003evar o= new Image();\u003c/p\u003e\n\u003cp\u003eo.src = url;\u003c/p\u003e\n\u003cp\u003eif(o.complete){\u003c/p\u003e\n\u003cp\u003ewindow.alert(‘图片加载完成:’+url);\u003c/p\u003e\n\u003cp\u003e}else{\u003c/p\u003e\n\u003cp\u003eo.onload = function(){\u003c/p\u003e\n\u003cp\u003ewindow.alert(‘图片加载完成:’+url);\u003c/p\u003e\n\u003cp\u003e};\u003c/p\u003e\n\u003cp\u003eo.onerror = function(){\u003c/p\u003e\n\u003cp\u003ewindow.alert(‘图片加载失败:’+url);\u003c/p\u003e\n\u003cp\u003e};\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e如果我要先把这一个图片加载完,之后才显示怎么处理呢.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\n function showImage(url){\n\n var o = document.createElement(\u0026#39;img\u0026#39;);\n\n o.src = url;\n\n document.body.appendChild(o);\n\n }\n\n function loadImage(url){\n var o= new Image();\n o.src = url;\n if(o.complete){ …\u003c/code\u003e\u003c/pre\u003e"
November 10, 2010
用户行为分析-使用JS和_trackPageview函数从时间维度监测页面表现
"\u003cp\u003e\u003cstrong\u003e为什么要从时间维度对页面进行监测?\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://bluewhale.cc/\" title=\"网站分析\"\u003e网站分析\u003c/a\u003e 中有一个重要的指标:Bounce rate。定义是当用户在进入你网站的第一个页面后没有点击任何链接就离开了。假设两个用户同时进入网站的第一个页面后,一个什么都没有看就马上离开了,而另一个在阅读了页面上的内容并在Action按钮上忧郁了半天,最后离开了。那么这两个用户在Bounce rate里看起来没有区别。而实际上第二个用户比第一个用户更有可能被转化。而如果两个用户来自不同的渠道,那么第二个渠道相对第一个渠道更有一些价值。\u003c/p\u003e\n\u003cp\u003e在GA的报告中目前只提供两个时间维度:平均 \u003ca href=\"http://bluewhale.cc/2010-01-24/google-analytics-metrics-timeonpage-timeonsite.html\" title=\"页面停留时间\"\u003e页面停留时间\u003c/a\u003e 和平均 \u003ca href=\"http://bluewhale.cc/2010-01-24/google-analytics-metrics-timeonpage-timeonsite.html\" title=\"网站停留时间\"\u003e网站停留时间\u003c/a\u003e。使用JS事件与_trackPageview函数相配合,我们可以看到网页在时间维度上的表现,并获得更多详细的用户与网站互动的时间数据(被计算在Bounce rate内的非点击行为数据)。\u003c/p\u003e\n\u003ch2 id=\"1通过持续时间判断用户行为的有效性\"\u003e\u003cstrong\u003e1通过持续时间判断用户行为的有效性\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"http://bluewhale.cc/2010-01-12/google-analytics-trackpageview-policy.html\"\u003e上一篇文章\u003c/a\u003e的最后一个策略中提到,可以使用_trackPageview函数与JS的onmouseover事件配合。当用户将鼠标移到某个焦点图或按钮上时进行记录。但有一个问题就是收集到的大部分数据可能是用户无意识的行为(如鼠标划 …\u003c/p\u003e"
October 14, 2010
JS操作JSON总结
"\u003cp\u003eJSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式。同时,JSON是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON数据不需要任何特殊的 API 或工具包。\n本文主要是对JS操作JSON的方法做下总结。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e在JSON中,有两种结构:对象和数组。\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。 名称用引号括起来;值如果是字符串则必须用括号,数值型则不需要。例如:\nvar o={“xlid”:”cxh”,”xldigitid”:123456,”topscore”:2000,”topplaytime”:”2009-08-20″};\u003c/li\u003e\n\u003cli\u003e数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。\n例如:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003evar …\u003c/p\u003e"
September 21, 2010
JS中onpropertychange事件和onchange事件区别
"\u003cp\u003e当一个HTML元素的属性用js改变的时候,都能通过 onpropertychange来捕获。例如一个 对象的value属性被页面的脚本修改的时候,onchange无法捕获到,而onpropertychange却能够捕获。\n也就是说:onpropertychange事件在用键盘每改变一下文本框的值或用js改变其值便会触发一下,而onchange只有在用键盘改变其值,然后在失去焦点(onblur)后才触发,用js改变其值不能触发!onpropertychange和onchange都不管文本框中的实际值有没有变,只要有改的相应操作就可能触发。有时当上面两时间都不能满足需求时,可以考虑只用onblur。\u003c/p\u003e\n\u003cp\u003e还有一点要注意到,当onblur和onchange事件一起用时,onblur会出问题。。。。详见如下\u003c/p\u003e\n\u003cp\u003e测试页面:\u003c/p\u003e\n\u003cp\u003e通过js改变文本框中的值后触发的事件:onpropertychange事件\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e测试onpropertychange事件和onchange事件一起用时:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e测试结果:onpropertychange事件在用键盘每改变一下文本框的值或用js改变其值便会触发一下,而onchange只有在用键 …\u003c/p\u003e"
September 16, 2010
JW player 隐藏视频路径
"\u003cp\u003e咋隐藏了?改代码。\u003c/p\u003e\n\u003cp\u003e先到 官方网站去 \u003ca href=\"http://developer.longtailvideo.com/trac/browser\"\u003e下载\u003c/a\u003e 播放器的源代码,然后打开\u003c/p\u003e\n\u003cp\u003e\\as3\\com\\jeroenwijering\\models\\下的 VideoModel.as\u003c/p\u003e\n\u003cp\u003e找到112行\u003c/p\u003e\n\u003cp\u003estream.play( item[‘file’]);\u003c/p\u003e\n\u003cp\u003e改为\u003c/p\u003e\n\u003cp\u003estream.play(‘http://my.5k.cn/flv/video/v/’+ item[‘file’]);\u003c/p\u003e\n\u003cp\u003e78和109行的 item[‘file’] = item[‘levels’][model.config[‘level’]].url;\u003c/p\u003e\n\u003cp\u003e分别改成 item[‘file’] = ‘http://my.5k.cn/flv/video/v/’+ item[‘levels’][model.config[‘level’]].url;\u003c/p\u003e\n\u003cp\u003e这样改了一下以后,页面显示的视频地址是\u003c/p\u003e\n\u003cp\u003e实际地址则为 \u003ca href=\"http://my.5k.cn/flv/video/v/xp/video.mp4\"\u003ehttp://my.5k.cn/flv/video/v/xp/video.mp4\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e一般人当然是找不到这个视频的真实地址的。可以启到一定的隐藏作用。\u003c/p\u003e\n\u003cp\u003e这里有演示\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://my.5k.cn/flv/readme.html\"\u003ehttp://my.5k.cn/flv/readme.html\u003c/a\u003e\u003c/p\u003e"
September 2, 2010
解决IE6从Nginx服务器下载图片不Cache的Bug
"\u003cp\u003e其实这个Bug是由分两种情况的:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.和Nginx无关,是针对CSS背景图片的。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e一般用户不会碰到,更多的时候是开发者将自己的IE的缓存策略从默认的”自动”改为“每次访问都查询”才发生 的。特点是鼠标一旦浮动到有背景图片的地方,IE会不顾已经缓存的图片,自行去服务器再次获取图片,造成图片短暂消失。这个问题比较简单,可以通过以下脚 本解决。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e1\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e2. 但是实际上更常见的原因是Nginx上打开了Gzip压缩功能。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e这个是IE6 的著名Bug,早在2002年就被人详细讨论过了,在IE7中有所改进,但微软永远也不会去修复IE6了。\u003c/p\u003e\n\u003cp\u003e根本原因是Nginx对于启用了Gzip的http上下文,即使你在之前的配置文件里声明过 gzip_disable “MSIE [1-6].”,Nginx不再对IE6用Gzip压缩了,但是送出的http报头却仍然采用了和Gzip压缩数据包相匹配的Vary: Accept-Encoding。IE6不认识这个报头,IE6对除了Vary: User-Agent的报头外,都不查询缓存,直接去服务器申请。更绝得是,不是使用查询文件是否更新,而是强行要求一份完整文 …\u003c/p\u003e"
September 1, 2010
float margin-left 浮动对象双倍距离
"\u003cp\u003e出现问题是:使用 float: left; 后,在IE显示margin-left:1px;就变成2px的距离。\nIE Bug 的解决方法:\n加一个 display: inline; 就OK了\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#box1{\n\tfloat: left;\n\tbackground: #F2F2F2;\n\twidth: 300px;\n\theight: 200px;\n\tmargin-left: 50px;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#box1{\n\tfloat: left;\n\tbackground: #F2F2F2;\n\twidth: 300px;\n\theight: 200px;\n\tmargin-left: 50px;\n\tdisplay: inline;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003c/blockquote\u003e\n\u003cp\u003emargin在IE6下被解释为双倍距离,出现了Margin与float一起用时,在IE6下,其Margin属性会被解释会双倍的距离,margin产生双倍距离其解决兼容问题的两种方法:\u003c/p\u003e\n\u003cp\u003e1、给当前层增加display: inline;属性。\u003c/p\u003e\n\u003cp\u003e2、取消浮动:Float。\u003c/p\u003e\n\u003cp\u003e熟悉规则的人知道浮动元素自动设置为”block”元素,而不管他们之前是什么。这说明浮动元素上的{display: …\u003c/p\u003e"
July 24, 2010
HTTP 1.1 中Transfer-Encoding chunked编码
"\u003cp\u003e大多数的站点相应用户请求时发送的HTTP Headers中包含Content-Length头.此头信息定义在HTTP1.0协议 \u003ca href=\"http://www.ietf.org/rfc/rfc1945.txt\"\u003e\u003cem\u003eRFC\u003c/em\u003e 1945\u003c/a\u003e 10.4章节中.该信息是用来告知用户代理,通常意义上就是浏览器,服务端发送的文档内容长度.浏览器接受到此信息后,接收完Content-Length中定义的长度字节后开始解析页面.如果服务端有部分数据延迟发送,那么浏览器就会白屏.这样导致比较糟糕的用户体验.\u003c/p\u003e\n\u003cp\u003e解决方法在HTTP1.1协议. \u003ca href=\"http://www.ietf.org/rfc/rfc2616.txt\"\u003e\u003cem\u003eRFC2616\u003c/em\u003e\u003c/a\u003e 中14.41章节中定义的Transfer-Encoding:chunked的头信息.chunked编码定义在3.6.1中.根据此定义浏览器不需要等到内容字节全部下载完成,只要接收到一个chunked块就可解析页面.并且可以下载html中定义的页面内容,包括js,css,image等.采用chunked编码有两种选择,一种是设定Server的IO buffer长度让Server自动flush buffer中的内容,另一种是手动调用IO中的flush函数。不同的语言IO中都有flush功能:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ephp: ob_flush(); …\u003c/li\u003e\u003c/ul\u003e"
July 6, 2010
提高AJAX客户端响应速度
"\u003cp\u003eAJAX的出现极大的改变了Web应用客户端的操作模 式,它使的用户可以在全心工作时不必频繁的忍受那令人厌恶的页面刷新。理论上AJAX技术在很大的程度上可以减少用户操作的等待时间,同时节约网络上的数 据流量。而然,实际情况却并不总是这样。用户时常会抱怨用了AJAX的系统响应速度反而降低了。\n笔者从事AJAX方面的研发多年,参与开发了目前 国内较为成熟的AJAX平台-dorado。根据笔者的经验,导致这种结果的根本原因并不在AJAX。很多时候系统响应速度的降低都是由不够合理的界面设 计和不够高效的编程习惯造成的。下面我们就来分析几个AJAX开发过程中需要时刻注意的环节。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e合理的使用客户端编程和远程过程调用。\u003c/strong\u003e\n客户端的编程主要都是基于JavaScript的。而JavaScript是一种解释型 的编程语言,它的运行效率相对于Java等都要稍逊一筹。同时JavaScript又是运行在浏览器这样一个严格受限的环境当中。因此开发人员对于哪些逻 辑可以在客户端执行应该有一个清醒的认识。\n在实际的应用中究竟应该怎样使用客户端编程,这依赖于开发人员的经验判断。这里很多问题是只可意会的。 由于篇幅有限,在这 …\u003c/p\u003e"
June 26, 2010
框架设计规范的新方向
"\u003cp\u003e微软的\u003ca href=\"http://msdn.microsoft.com/en-us/library/ms229042.aspx\" title=\"框架设计规范\"\u003e框架设计规范\u003c/a\u003e{#h.u8}是 设计的准则,它期望所有的微软类库和独立开发者都能够遵循这一准则。随着每个.NET框架版本的发布,以及在行业内的测试,它们的版本也得到了精化。通过 Cwalina与Abram所著的\u003ca href=\"http://blogs.msdn.com/brada/archive/2008/10/14/framework-design-guidelines-2nd-edition-order-yours-now.aspx\" title=\"《框架设计规范》第二版\"\u003e《框 架设计规范》第二版\u003c/a\u003e{#t.q.}的发布,我们可以看到微软在今后几年的发展方向。\u003c/p\u003e\n\u003cp\u003e或许最令人惊讶的事实是日渐增长的对于测试驱动开发和依赖注入的重视。在可重用框架的场景下,通过测试驱动开发设计出的框架是真实可用的,而不是简 单地推理。他们希望这样可以反过来杜绝某种趋势,那就是过度复杂地设计一些根本不会用到的功能。\u003c/p\u003e\n\u003cp\u003e谈到这一问题,就不得不指出的是微软当前正在推动的一个活动,即针对所有库的第1个版本进行最低限度设计。这不同于在第一次就要试图将所有事情做 对,微软推荐在最开始只需要满足需求中绝对需要的特性。Abrams和Cwalina建议在最初并不需要考虑扩展性,只有到需求变得非常清晰的时候,才在 后一个版本中考虑。从某个方面来讲,这是微软旧有传统的回归,它只会在第三个版本中提供真正完成的应用程序。\u003c/p\u003e\n\u003cp\u003e在其它领域,微软则完全没有改变。他们仍然强调所谓的“基坑成功(Pit of …\u003c/p\u003e"
June 26, 2010
牺牲一致性来换取分布式架构的可伸缩性
"\u003cp\u003e统架构师角色关键的一方面就是衡量相互冲突的需求、决定解决方案,常常要牺牲一个方面来换取另一个方面。随着系统变得越来越大、越来越复杂,越来越多关于 如何构建应用的传统智慧正在受到挑战。比如说,去年3月在伦敦召开的QCon会议上,Dan Pritchard谈论了eBay的架构。他的介绍随后得到了很多的报道,其中一个主要的结论就是eBay不使用事务,用数据一致性上的损失来换取系统整 体伸缩性和性能上相当大的改进。\u003c/p\u003e\n\u003cp\u003eInfoQ接着Dan Pritchard在QCon会议上的谈话与他继续讨论,以获得更多信息:\u003c/p\u003e\n\u003cp\u003e为什么eBay不使用事务,或者为什么可以决定不采取应用级事务?\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e我们并非一概不使用事务。我们只是不使用跨物理资源的事务,因为它会造成多个组件之间出现依赖。组件可以是应用服务器和数据库。(例如在客户端控制 的事务中,)一个客户端的失败会长久地阻塞数据库资源、超出我们的忍受程度。我们也不使用分布式事务,因为让应用依赖于多个数据库会降低客户端实际的可用 性。相反,我们选择缺少事务的设计,并加入失效模式,失效模式可以使客户端甚至在发生数据库可用性问题的时候也能继续进行。\u003c/p\u003e\n\u003cp\u003e应用级事务总是有些问题。 …\u003c/p\u003e\u003c/blockquote\u003e"
June 26, 2010
推荐《构建可扩展的Web站点》- 基于监控的系统调优
"\u003cp\u003e在前一期 \u003ca href=\"http://www.chedong.com/blog/archives/001447.html\"\u003e山寨交流会\u003c/a\u003e 上: \u003ca href=\"http://home.51.com/diary.view.php?user=gusingchen\u0026amp;id=10038668\"\u003e桂 新\u003c/a\u003e 说他会将良好的构架和一套完整的监控系统作为两个非常重要的基础来抓,良好的架构一步到位这点很难做到(对于发展速度并不确定的小公司来说,架 构过大也是一个成本上的风险),但对于后者:一套完整监控系统我是非常认同的。对于目前普遍缺乏测试的Web应用开发过程来说,监控几乎就是测试很重要的 一部分;而系统监控本身,也可以帮助及时发现很多问题并量化优化的效果。而系统的扩展和调优的大部分技巧都可以从《构建可扩展的Web站点》(作者是 Flickr的开发者)一书中看到。为了减少不必要的调优(盲目的调优是危害很大的),建议从这2章开始看起: 第8章《瓶颈》发现和第10章《统计数据,检测和报警》;有了这些瓶颈检查结果和统计监测/报警系统后,再有针对性的看其他章节做系统调优。\u003c/p\u003e\n\u003cp\u003e以下是我在 \u003ca href=\"http://chedong.blogbus.com/logs/29595744.html\"\u003e博客大巴\u003c/a\u003e 开 发中的一些实践小结:\u003c/p\u003e\n\u003cp\u003e1 数据库相关\u003c/p\u003e\n\u003cp\u003e1.1 系统应用层面出问题我一般都习惯性的先去看数据库群的连接数统计:大部分应用最后的瓶颈都在于单表数据量过大后,数据存取慢导致的并发连接数过多的问题,\u003c/p\u003e\n\u003cp\u003e1.2 解决这个问题目前的主要策略就是分片( \u003ca href=\"http://www.dbanotes.net/database/database_sharding.html\"\u003eshare nothing\u003c/a\u003e),单个数 …\u003c/p\u003e"
June 26, 2010
MySpace 系统架构
"\u003cp\u003e在前不久结束的 \u003ca href=\"http://qconsf.com/\"\u003eQCon 2008\u003c/a\u003e 上,MySpace 的首席架构师 \u003ca href=\"http://jaoo.dk/london-2008/speaker/Dan+Farino\"\u003eDan Farino\u003c/a\u003e 做了题为 \u003ca href=\"http://qconsf.com/sf2008/file?path=/qcon-sanfran-2008/slides//DanFarino_Myspace.pdf\"\u003eBehind the Scenes at MySpace.com\u003c/a\u003e (PDF 下载)的技术演讲。\u003c/p\u003e\n\u003ch4 id=\"架构概况\"\u003e架构概况\u003c/h4\u003e\n\u003cp\u003e超过 4,500 台 Web 服务器,配置为 Windows 2003/IIS 6.0/ASP.NET ;超过 1200 台 Cache 服务器,64 位的 Windows 2003,超过 500 台的数据库服务器,配置为 64 位的 Windows 2003,数据库为 SQL Server 2005 。\u003c/p\u003e\n\u003cp\u003e之前曾有一篇 \u003ca href=\"http://www.baselinemag.com/c/a/Projects-Networks-and-Storage/Inside-MySpacecom/\"\u003e揭 秘 MySpace 架构\u003c/a\u003e的文章,也有中文版本《 \u003ca href=\"http://www.kuqin.com/system-analysis/20071230/3238.html\"\u003e亿万用户网站 MySpace的成功秘密\u003c/a\u003e》!\u003c/p\u003e\n\u003ch4 id=\"运维数据收集\"\u003e运维数据收集\u003c/h4\u003e\n\u003cp\u003e其实这个演讲我感觉主要讲的是这个数据收集模块 🙂 MySpace 的方案倒是让我们看到了在超大规模的 Windows 环境下如何进行数据收集的。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/06/1626170.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/1626170.png\" alt=\"myspace系统架构\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e每个客户端通过一个 TCP 连接到收集上服务器。收集的信息包括:Windows 性能计数器 Performance Counters、 WMI 对象(定制后的 WMI 对象)、事件日志、 硬件数据等等。收集器服 …\u003c/p\u003e"
June 26, 2010
手机之家网站架构–对话高春辉
"\u003cp\u003e从老高的近期工作总结中看到:\u003c/p\u003e\n\u003cp\u003e目前的技术状况是基于自行设计的 PHP 框架,跑在 PHP 5.2 + MySQL 5.1 下,PHP 使用 Fastcgi 模式,WebServer 选择了 Nginx。搜索功能基于 Lucene 开发。缓存代理使用 Varnish。\u003c/p\u003e\n\u003cp\u003e对老高进行了一次非正式采访,聊了不少内容,整理了一下和大家分享。(谁是高春辉? 这个不要介绍了吧,请 Google! )\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e历史情况\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eFenng: 原来大约是用什么? 框架用的什么?\n高春辉: 你说老系统?Apache 1.3 , DB 是 MySQL 4.0。新框架是团队自己写的,定制了一些东西吧,主要强调的是性能和方便、简单。另外把针对 YSlow 的优化也做进去了。\nFenng: 单说现在用的框架,大约投入了多少个人/天 ?\n高春辉: 从全年开始考虑写,一直不断的写 — 具体时间不好说。反正是不少了 🙂\nFenng: 看了你 Blog 中的描述,有个小疑惑:没使用面向 DB 的 Cache 层?\n高春辉: 我文中说的 Data accessor 就算是了。目前是拿 PHP 做的,Client+Server 集成在一 …\u003c/p\u003e"
June 26, 2010
图片存储:按时间增加新域名进行扩容的办法
"\u003cp\u003e基于ID的分片机制实现存储的分布化会遇到一个问题:固定存储空间随着时间增加再次达到系统的空间/负载的瓶颈。观察了一下Flickr的图片存储 地址:好像是在定期启用新的集群,各个时期的域名分布如下:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"http://farm1.static.flickr.com\"\u003ehttp://farm1.static.flickr.com\u003c/a\u003e 2006年中以前;\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://farm2.static.flickr.com\"\u003ehttp://farm2.static.flickr.com\u003c/a\u003e 2006年底;\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://farm3.static.flickr.com\"\u003ehttp://farm3.static.flickr.com\u003c/a\u003e 2007年底;\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://farm4.static.flickr.com\"\u003ehttp://farm4.static.flickr.com\u003c/a\u003e 2008年底;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003ca href=\"http://www.kuqin.com/shuping/20081003/20540.html\"\u003e《构建可扩展的Web站点》\u003c/a\u003e 上 没有提到这个策略,猜测Flickr应该是不断在启用新的服务器集群,当地一个集群用到90%的时候,开始启用下一个集群。一个用户的所有图片地址则存储 在数据库中:记录会包含当时的存储所在的集群:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003euser_foo – farm1.static……/20060124_003.jpg\u003c/p\u003e\n\u003cp\u003e\\ farm1.static……/20060324_005.jpg\u003c/p\u003e\n\u003cp\u003e\\ farm1.static……/20060824_021.jpg\u003c/p\u003e\n\u003cp\u003e\\ …\u003c/p\u003e\u003c/blockquote\u003e"
June 26, 2010
Amazon EC2,Google App Engine,Microsoft Azure大比拼
"\u003cp\u003e当Microsoft在PDC2008上携 \u003ca href=\"http://www.kuqin.com/system-analysis/20081030/25061.html\"\u003eAzure平台\u003c/a\u003e 驾 云而来时,天气预测注定将发生改变。将当前市场上分别来自Amazon、Google和Microsoft的三大主流产品作一比较会是一件非常有意思的事 儿。第一眼看上去的印象是它们彼此之间似乎实际上并不存在真正的相互竞争。\u003c/p\u003e\n\u003cp\u003eZiff兄弟投资的副总裁Michael J. Miller \u003ca href=\"http://blogs.pcmag.com/miller/2008/11/cloud_thinking_amazon_microsof.php\"\u003e对云计算的三大角逐者进行了比较\u003c/a\u003e,这是他关于Amazon EC2的发现:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e备受关注的云平台无疑就是\u003ca href=\"http://aws.amazon.com/\"\u003eAmazon Web服务\u003c/a\u003e了,它是多种工具 的集合,大部分都位于相当底层。其中又以Amazon弹性计算云(EC2)最为出众,这一Web服务能你将应用分配给任意多的“计算单元”。简单的说,一 个标准的单一实例包括了一个“虚拟核心”,1.7GB的内存,以及160GB的存储实例(只针对该对话的存储),价格为每小时10美分。在这个服务之上, 你可能会考虑使用该公司提供的“简单存储服务”(S3),对于前50TB的数据,其价格是每GB每月15美分,之后价格递减,同时要收取一定的交易费用。 同时你也可能考虑使用该公司的“Simple DB”数据库,或者是用于存储消息的队列 …\u003c/p\u003e\u003c/blockquote\u003e"
June 26, 2010
扩展Digg和其他的网络应用
"\u003cp\u003e\u003cstrong\u003e前言:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e关于Digg的架构,之前 \u003ca href=\"http://www.dbanotes.net/\"\u003eFenng\u003c/a\u003e 已 经写过一篇 \u003ca href=\"http://www.kuqin.com/system-analysis/20090214/34906.html\"\u003eDigg 网站架构\u003c/a\u003e 的文章,Fenng在文章开头说“\u003cem\u003e越来越发现其实都是自我重复的劳动,后续的信息都是嚼别人剩下的甘蔗。\u003c/em\u003e”,其实是 Fenng过谦了,我就是从 \u003ca href=\"http://www.dbanotes.net/\"\u003eDBA notes\u003c/a\u003e 一点一滴开始学习的。\u003c/p\u003e\n\u003cp\u003e原文在 \u003ca href=\"http://highscalability.com/scaling-digg-and-other-web-applications\"\u003eScaling Digg and Other Web Applications\u003c/a\u003e, \u003ca href=\"http://highscalability.com/\"\u003eTodd Hoff\u003c/a\u003e 总能给我们带来一些有意思的文章。这里既不直译也不全译,保持原文骨干加上肤浅的理解。\u003c/p\u003e\n\u003cp\u003eDigg用户在3000W左右,网站每秒请求数达到13000个,规模算是很大了,Lamp(Linux+Apache+MySQL+PHP)结 构,Web2.0网站中钟情PHP的不少,国外的Facebook、Digg、Flickr…,国内的新浪博客、开心网、51.com等等,扩展的不是编程语言而是网站架构,因为编程语言从来都不会是网站瓶颈,每种语言都有自己适合做和不适合做的事情。喜欢比较语言快慢的可以看看 \u003ca href=\"http://shootout.alioth.debian.org/\"\u003ehttp://shootout.alioth.debian.org/\u003c/a\u003e, 看看而已不要用速度去衡量编程语言的优劣。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eDigg的扩展战略:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e扩 …\u003c/li\u003e\u003c/ul\u003e"
June 26, 2010
Digg 网站架构
"\u003cp\u003e本篇描述一下 \u003ca href=\"http://digg.com/\"\u003eDigg\u003c/a\u003e 的网站架构.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e国庆期间又收集了一些关于网站架构的信息。一直没有进行系统的整理。越来越发现其实都是自我重复的劳动,后续的信息都是嚼别人剩下的甘蔗。--by Fenng\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDigg 工程师采用 LAMP (Linux, Apache, MySQL and PHP) 模式。这个 Alexa 排名在 100 左右的、自我估价 1.5 亿美金的站点目前有超过 100 台的 PC 服务器(足够少了),可以粗略分成三个部分:数据库服务器,Web 服务器,搜索服务器。\u003c/p\u003e\n\u003cp\u003e数据库方面,和其他成功的 Web 2.0 站点一样,也是 MySQL,不过 Digg 稍微”激进”一点,用 MySQL 5,而且号称从 MySQL 4 升级到 5 性能没有什么影响。 OLTP 应用用 InnoDB 引擎, OLAP 用 MyISAM。后端数据库的读比例达到 98%,写只有 2%,实际的读写比例应该高于这个数字,这应该是 Digg 在前端用 \u003ca href=\"http://www.danga.com/memcached/\"\u003eMemcached\u003c/a\u003e 以及 \u003ca href=\"http://php.net/apc\"\u003eAPC PHP accelerator\u003c/a\u003e / MCache 做缓存后的效果。在 IO 上似乎压力并不大。\u003c/p\u003e\n\u003cp\u003e数据库分割用 Sharding …\u003c/p\u003e"
June 26, 2010
再谈 eBay 的扩展性最佳实践
"\u003cp\u003e很多人都觉得 eBay 在 \u003ca href=\"http://www.qconbeijing.com/\"\u003eQCon (北京)\u003c/a\u003e 上的技术\u003ca href=\"http://qconbeijing.com/Speaker.aspx?Id=8\"\u003e讲座\u003c/a\u003e不错,但对我来说,其实 冲击力没那么大了。eBay 一两年前就是这个 PPT 。不过还是比 Amazon 的 Jeff Barr 强了很多,以后要是开个什么会,你把 Jeff Barr 请来还讲那个销售文档,估计自己都不好意思。\u003c/p\u003e\n\u003cp\u003e不过,eBay 这次的PPT 总算还是有点更新的。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1)数据分片(Partition Everything)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e说是分区(Partition),这里不能简单等同于 Oracle 的分区,理解成分片(Sharding)就好啦。可以参考一下我以前写的科普小文: \u003ca href=\"http://www.kuqin.com/database/20080825/15070.html\"\u003e开源数据库 Sharding 技术 (Share Nothing)\u003c/a\u003e。这里要强调一下的是,分片是在数据量的确有规模的时候才适合进行,如果单节点足以应付,那么还是不要冒 进。\u003c/p\u003e\n\u003cp\u003e从分片的模式上,eBay 主要根据功能切分(Functional Segmentation)和水平分割(负载均衡考虑),作为推论,所有会话都是无状态性的。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2)异步处理(Asynchrony Everywhere)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e其实对于任何网站来说,过度追求”同步”化设计还是比较糟糕的做法。以 …\u003c/p\u003e"
June 26, 2010
优酷网(Youku.com)架构经验
"\u003cp\u003e这次 \u003ca href=\"http://www.qconbeijing.com/\"\u003eQCon (北京)会议\u003c/a\u003e网站架构案例分析这个 Track ,虽然话题不多,但课程设计时候考虑覆盖的面还是比较广的。作为视频网站代表,优酷带来了一场包含不少实战经验的技术分享。\u003ca href=\"http://www.qconbeijing.com/Speaker.aspx?Id=29\"\u003e邱丹\u003c/a\u003e(优酷网开发副总裁,核心架 构师)可能公司的事情比较忙,一直到第二天中午才赶到会场。还半开玩笑说,’怎么这么多人,还以为是小型的会议呢’…\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/06/youku.com_.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/youku.com_.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e缓存\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e缓存黄金原则:\u003cstrong\u003e让数据更靠近 CPU\u003c/strong\u003e。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eCPU--\u0026gt;CPU 一级缓存--\u0026gt;二级缓存--\u0026gt;内存--\u0026gt;硬盘--\u0026gt;LAN--\u0026gt;WAN\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e讲到了 Youku 自己的内部项目,针对大文件缓存的。目前开源软件中,Squid 的 write() 用户进程空间有消耗,Lighttpd 1.5 的 AIO(异步I/O) 读取文件到用户内存导致效率也比较低下。Youku 不用内存做缓存(避免内存拷贝,避免内存锁)。值得注意的是,缓存技术容易被滥用,也有副作用,比如接到老大哥通知要把某个视频撤下来,如果在缓存里是比 较麻烦的。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e数据库\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e优酷对数据库 Sharding 做了不少尝试,而且实现效果应该不错。DB 读写分离上有比较丰富的经验。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/06/Youku_Sharding.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/Youku_Sharding.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e为了提升数据 …\u003c/p\u003e"
June 26, 2010
大量小文件的实时同步方案
"\u003cp\u003e传统的文件同步方案有rsync(单向) 和 unison(双向)等,它们需要扫描所有文件后进行比对,差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将非常耗时。而且正在发生变化的 往往是其中很少的一部分,这是非常低效的方式。\u003c/p\u003e\n\u003cp\u003e之前看了\u003ca href=\"http://s3.amazonaws.com/AllThingsDistributed/sosp/amazon-dynamo-sosp2007.pdf\"\u003eAmazon 的Dynamo的设计文档\u003c/a\u003e,它们每个节点的数据是通过Hash Tree来实现同步,既有通过日志来同步的软实时特点(msyql, bdb等),也可以保证最终数据的一致性(rsync, unison等)。Hash Tree的大体思路是将所有数据存储成树状结构,每个节点的Hash是其所有子节点的Hash的Hash,叶子节点的Hash是其内容的Hash。这样一 旦某个节点发生变化,其Hash的变化会迅速传播到根节点。需要同步的系统只需要不断查询跟节点的hash,一旦有变化,顺着树状结构就能够在logN级 别的时间找到发生变化的内容,马上同步。\u003c/p\u003e\n\u003cp\u003e文件系统天然的是树状结构,尽管不是平衡的数。如果文件的修改时间是可靠的,可以表征文件的变化,那就可以用它作为文件的Hash值。另一方面,文 件的修改通常是按顺序执行的,后修改的文件比早修改的文件具有更大 …\u003c/p\u003e"
June 26, 2010
手机之家网站架构的发展和变化
"\u003cp\u003e这次beta沙龙请了\u003ca href=\"http://www.paulgao.com.cn/\"\u003e高春辉\u003c/a\u003e的团队来讲他们的经验。本来我是 希望老高讲,不过他说最近的系统主要是许超前在带人开发,所以实际的演讲人是许超前。\u003c/p\u003e\n\u003cp\u003e国内最早让大家意识到网站的发展阶段的文档大概就是于敦德翻译的LiveJournal发展历程的ppt。这次许超前的演讲非常类似 LiveJournal的那篇。\u003c/p\u003e\n\u003cp\u003e手机之家用了7年时间,发展到1000万以上用户,3000万以上帖子,1.1TB附件,每天780万以上的PV这个规模。这个数字虽然比 不上大型互联网公司,但是对一个只有几个人的技术团队,已经是一个很令人骄傲的数字了。\u003c/p\u003e\n\u003cp\u003eLiveJournal在发展中一边用着开源软件,一边造轮子,最后造出来了memcached这个简单而强大的工具,最终成了这一代网站开发离不 开的东西。\u003c/p\u003e\n\u003cp\u003e这次演讲有意思的部分就是从memcached相关的事情开始的。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一 关于memcached的应用和管理。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ememcached确实是个简单,好用,见效快的东西。不过简单也有简单的问题,程序员各有各的习惯,结果导致key很不规范,用什么方式的都有。 这个问题恐怕用过memcached的人都深有体会。当然,用开发规范来限制程序员的行为是一 …\u003c/p\u003e"
June 26, 2010
Facebook 架构学习
"\u003cp\u003e在 QCon 2008 (旧金山站) 上Facebook 做的这个技术分享有不少值得借鉴的东西。所 以,暂停对 QCon 北京的回顾,临时插播一贴。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e设计原则\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e尽可能的使用开源软件,并且在需要优化的时候进行优化\u003c/li\u003e\n\u003cli\u003eUnix 哲学。包括,模块化原则;整合化原则;清晰化原则等\u003c/li\u003e\n\u003cli\u003e任何组件具备扩展性\u003c/li\u003e\n\u003cli\u003e最小化故障影响\u003c/li\u003e\n\u003cli\u003e简化,简化,简化!\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e架构概览\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eFacebook 是 LAMP 的坚定支持者,也差不多是用 LAMP (或许用 LAM2P 更适合) 实现的最大的动态站点。\u003cimg src=\"http://www.kuqin.com/upimg/allimg/090412/2229360.png\" alt=\"Facebook Arch Overview.png\"\u003e\u003c/p\u003e\n\u003cp\u003e基础组件加上服务,中间用自己实现的一些工具进行粘合。其中关于运维细节的事情基本不会说出来的,这是很多公司的软实力所在。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePHP 经验\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e参见《 \u003ca href=\"http://www.kuqin.com/web/20080410/6398.html\"\u003eFacebook 的 PHP 性能与扩展性\u003c/a\u003e》\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eMySQL 经验\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e主要用于做 Key-Value 类型的存储操作,数据随机分布在多台逻辑实例上,访问多数基于全局 ID 。\u003c/li\u003e\n\u003cli\u003e逻辑实例分散在多台物理主机上(超过1800台),负载均衡在物理层进行。\u003c/li\u003e\n\u003cli\u003e不做读复制。\u003c/li\u003e\n\u003cli\u003e尽量不做逻辑数据迁移(成本太高)。\u003c/li\u003e\n\u003cli\u003e不做 JOIN 操作 ( \u003ca href=\"http://www.kuqin.com/system-analysis/20090411/45329.html\"\u003e豆瓣在 QCon\u003c/a\u003e 上也阐述了这一点)。数据是随机分布的,关联操作反而带 …\u003c/li\u003e\u003c/ul\u003e"
June 26, 2010
经典架构模式简介
"\u003cp\u003e根据Linda Rising的《Pattern Almanac》一书,已知的架构模式有七十多种。这是一个只多不少的统计,其中包括了很多通常认为是设计模式的模式,比如 Bridge,Facade,Interpreter,Mediator等模式通常认为是设计模式,但是在许多情况下,也可以作为架构模式出现,因此也常 常被当作架构模式。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eLayers架构模式\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在收集到用户对软件的要求之后,架构设计就开始了。架构设计一个主要的目的,就是把系统划分成为很多”板块”。划分的方式通常有两种,一种是横向的划分, 一种是纵向划分。\u003c/p\u003e\n\u003cp\u003e横向划分将系统按照商业目的划分。比如一个书店的管理系统可以划分成为进货、销售、库存管理、员工管理等等。\u003c/p\u003e\n\u003cp\u003e纵向划分则不同,它按照抽象层次的高低,将系统划分成”层”,或叫Layer。比如一个公司的内网管理系统通常可以划分成为下面的几个Layer:\u003c/p\u003e\n\u003cp\u003e一、网页,也就是用户界面,负责显示数据、接受用户输入;\u003c/p\u003e\n\u003cp\u003e二、领域层,包括JavaBean或者COM对象、B2B服务等,封装了必要的商业逻辑,负责根据商业逻辑决定显示什么数据、以及如何根据用户输入的数据 进行计算;\u003c/p\u003e\n\u003cp\u003e三、数据库,负责存储数 …\u003c/p\u003e"
June 26, 2010
"\u003cp\u003e切分是最基本,且最多变的思路之一,说基本,是因为在学习程序设计的第一天就应该知道,说多变,是因为在未来的很多年里,你会不停的应用这个方法来 解决问题。不幸的是,切分这个思路并没有得到应有的重视。\u003c/p\u003e\n\u003cp\u003e大概是因为这个词比较土,说起来也比较普通,远不如并行,集群,负载平衡这些词听起来大。所以碰到一个问题的时候,往往被拿出来的解决方案会是以上 3个大词之一,很少有人去认真的考虑切分问题。但事实上,这3个大词所需要的技术,其实也是建立在良好可切分的系统之上的。\u003c/p\u003e\n\u003cp\u003e最近碰到了2个项目,都是典型案例。\u003c/p\u003e\n\u003cp\u003e案例1 ,小公司,发展的不错。一台服务器眼看不够用了,于是就买了第二台,希望能做一个”负载均衡”系统。很多人大概认为负载均衡,是类似自来水一样的技术,只 要打开笼头,清水就汩汩涌出。往往忘记了水龙头后面的水管和自来水公司。\u003c/p\u003e\n\u003cp\u003e一个服务器上放了很多个服务,是很难应用负载均衡这种技术的。必须先要把服务拆开,找到性能薄弱的点,对这个点进行负载均衡,才能得到比较好的效 果。否则很可能用了80%的力气,但是只得到20%的结果。\u003c/p\u003e\n\u003cp\u003e案例2,某外企。之前我们给他们做过咨询,解决了一次问题,上次我们找到了系统最慢的地方,去掉 …\u003c/p\u003e"
June 26, 2010
Web 架构师的能力
"\u003cp\u003e最近和几个朋友在谈到时下流行的Web 2.0,也提到了其中最重要的角色——架构师。多方各有争执,不外乎是因为背景和视角的缘故,包括架构一词,本身就从建筑学借鉴而来,至于架构师,则可以 简单地从建筑学的设计师来引申,不外乎就是设计结构,设计一个大楼的结构。回到软件本身,那就可以简单地理解为负责设计软件框架的人了。\u003c/p\u003e\n\u003cp\u003e我们没有讨论清楚架构师、软件架构师、系统架构师及其Web 架构师这些看似相同却有所区别的角色的关键,本身智者见智,仁者见仁,也不是一时半会能够说清楚的,最后我们讨论作为一个Web 2.0 网站架构师需要的一些基本的知识和能力,既然是个人看法,难免有失偏颇:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e熟知你的业务模式和目标人群\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e这是最重要的,Web 2.0 本质上是以Web 作为平台的业务应用,如果不真正了解你的业务,不了解用户的核心需求,不了解你目标客户的典型行为,是很难做好网站的。从这个角度来讲,一个Web 架构师首先必须是一个出色的产品经理。大多时候,我们只要做到业务技术领先就足够了,一味地追求技术的先进性反倒会深陷泥潭。\u003c/p\u003e\n\u003cp\u003e在技术和业务之间找到一个平衡,也就意味着必须明白整个业务核心的竞争力在哪?目标人群基本诉求在 …\u003c/p\u003e"
June 26, 2010
Twitter,架构的变迁
"\u003cp\u003e\u003ca href=\"http://blog.evanweaver.com/about/\"\u003eEvan Weaver\u003c/a\u003e 是 \u003ca href=\"http://www.kuqin.com/shuoit/Twitter/\"\u003eTwitter\u003c/a\u003e 服务团队的总工程师,他的主要工作是 优化与伸缩性。在 \u003ca href=\"http://qconlondon.com/\"\u003eQCon London 2009\u003c/a\u003e 上,他谈到了Twitter的架构,特别是在过去一年当中为提升Web站点性能所执行的优化。\u003c/p\u003e\n\u003cp\u003eTwitter使用的大部分工具都是开源的。其结构是用Rails作前端,C,Scala和Java组成中间的业务层,使用MySQL存储数据。所 有的东西都保存在RAM里,而数据库只是用作备份。Rails前端处理展现,缓存组织,DB查询以及同步插入。这一前端主要由几部分客户服务粘合而成,大 部分是C写的:MySQL客户端,Memcached客户端,一个JSON端,以及其它。\u003c/p\u003e\n\u003cp\u003e中间件使用了Memcached,Varnish用于页面缓存,一个用Scala写成的MQ,Kestrel和一个Comet服务器也正在规划之 中,该服务器也是用Scala写成,当客户端想要跟踪大量的tweet时它就能派上用场。\u003c/p\u003e\n\u003cp\u003eTwitter是作为一个“内容管理平台而非消息管理平台”开始的,因此从一开始基于聚合读取的模型改变到现在的所有用户都需要更新最新tweet 的消息模型,需要许许多多的优化。这一改动主 …\u003c/p\u003e"
June 26, 2010
校内网CTO:校内网规模架构应用
"\u003cp\u003e从20台服务器到5000台服务器,应该说,校内网的IT基础设施的变迁是与其自身的业务发展成 正比的,而每一次的业务突破实际上也是对数据中心的一个挑战。传统的IT基础建设模式,现在、将来又当如何适应SNS类网站的发展?从Csdn记者此次与 校内网技术总监黄晶的对话中,也许我们可以了解一二。\n\u003cstrong\u003e从20台到5000台服务器\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e作为校内网的CTO,黄晶对过去几年校内网IT基础建设的过程历历在目。\u003c/p\u003e\n\u003cp\u003e“如果要把这个历程分成几个阶段,那么在我看来,校内网的IT基础设施建设目前经历了三个阶段”。\u003c/p\u003e\n\u003cp\u003e黄晶对Csdn记者谈到,第一个阶段是校内网创业的阶段,那时候,校内网的主要推广对象是国内比较好的一些高校,但数量很有限,用户数不太多,访问量也不 大,因此,当时选择了一个IDC并租赁了20台左右的服务器。\u003c/p\u003e\n\u003cp\u003e“随着业务的发展,校内逐渐把业务覆盖到了全国,与此同时,数据量可以呈现几何式的增大,带宽与存储迎来了瓶颈,因此在那时候,公司开始寻找新的IT基础 架构解决方案,并因此而找到了世纪互联做服务器的托管,几年的时间,服务器的数量从几十台上升到了近5000台。”\u003c/p\u003e\n\u003cp\u003e“但问题也随之出现,虽然带宽够大,但是找IDC托管的这种 …\u003c/p\u003e"
June 26, 2010
架构就是关注点分离
"\u003cp\u003e要设计良好的架构,必须做到关注点分离,这样可以产生高内聚、低耦合的系统,这是美丽架构的终极原则。\u003c/p\u003e\n\u003cp\u003e文 / 王海鹏\u003c/p\u003e\n\u003cp\u003e什么是架构? 每个人可能都有自己对架构的定义。我比较喜欢的定义是:“架构是系统的组成部件及其之间的相互关系。”根据观察者的视角不同,架构 又可以分为业务架构和技术架构。一般来说, 功能性需求会对业务架构产生影响, 而非功能性需求会对技术架构产生影响。\u003c/p\u003e\n\u003cp\u003e例如:“注册用户可以向自己的相册上传图片,并与好友分享”。这是一项功能性需求。它告诉了我们在系统的业务架构中,会出现“注册用户”“相册”、 “图片”、“好友”等组成部件,它们之间存在着相互关系。而“系统可以支持10万并发用户,并在需要时可以方便地伸缩,扩展到支持100万到1000万的 并发用户”,则是一项非功能性需求。它告诉了我们系统在性能、负载、吞吐量、可伸缩性方面的特性,目标系统的架构必须对这些特性提供支持。\u003c/p\u003e\n\u003cp\u003e架构体现的是对复杂系统的分解设计。而如何进行分解,则是软件设计领域永恒的话题。实际上,架构体现的是关注点分离的原则和方法。经典的三层架构, 由展现层、业务逻辑层和持久层构成;其中体现了我们对用户界面、业务逻辑和数据持 …\u003c/p\u003e"
June 26, 2010
数据分片(Sharding)设计问题一例
"\u003cp\u003e**Question:**假设一家 C2C 网站,数据库中某表存储买卖双方交易的数据信息,对于一条交易来说,买卖双方数据具有一定程度的耦合性,比如卖家的状态更新对应买家的状态也会更新,对于 一个中大规模的电子商务网站,架构师在设计中如何考虑数据分片的问题(假定该表随着数据的膨胀必须拆分)?\u003c/p\u003e\n\u003cp\u003e**Answer:**对于一个中大规模的电子商务网站,随着网站的不断发展,其相应的数据规模会不断膨胀。 \u003ca href=\"http://www.kuqin.com/database/20080825/15070.html\"\u003e数据分片技术\u003c/a\u003e 是使网站得 于实现可扩展性的一种常用解决方案。对于 C2C 类型的网站,由于交易记录不容易进行水平的数据分割,因此对于这样的应用处理要再进行细分:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e买卖双方交易的信息,具备较高的时效性,即交易全部完成后就不会再有更新,因此这部分数据可以与正在交易中的数据区分开来,并可以单独分 表,定时归纳。具体的做法可以采用水平分割的数据分片技术,比如可以根据用户号码段范围进行切片,把不同的群体划分到不同的 DB 上,这样可以很好的进行横向水平扩展(Scale Out)。它可以很好的突破单节点数据库服务器的 I/O 能力限制,解决数据库扩展性问题。\u003c/li\u003e\n\u003cli\u003e对于正在交易中的数据,主要根据时间进行分表。如果 …\u003c/li\u003e\u003c/ul\u003e"
June 26, 2010
转型:产品团队与架构师——金山WPS架构师手记
"\u003cp\u003e与国外大型软件公司相比,在金山,架构师的发展还处于一个学习阶段,我们也正在实践中摸索适合我们的方法。借此机会,我想和大家分享一下WPS项目 中架构师的发展历程和经验教训,共同探讨适合中国软件业的架构师之路。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWPS项目架构师发展回顾\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eWPS项目架构师的发展是随着V6(内部代号,指WPS Office 2005即后续版本)开始的,在此之前,开发团队并没有明确的架构师角色,开发人员在自发的、简单的模块分工交流之后,即开始各自的编码。从2002年下 半年开始,由包括许式伟在内的一个团队开始V6的前期工作。通过半年的原型开发,确定了模块划分和接口。我觉得,这是我们第一次实施由架构师主导的软件开 发过程。\u003c/p\u003e\n\u003cp\u003e我是在表格组成为架构师的。在此之前,我在表格组作为核心程序员,负责关键模块的开发。大约一年后,随着软件规模不断扩大,项目组成员不断增多,依 靠程序员自发协调的开发模式开始成为项目瓶颈。再加上我自己的兴趣,于是我开始向架构师方向发展。2004 年,系统架构组成立,正式确立了架构师岗位。大致上WPS的架构师与程序员的比例约为1:10,与管理人员相当。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e架构师的定位和职能\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e虽然当前架构师岗位已经非常 …\u003c/p\u003e"
June 26, 2010
软件架构师应该知道的97件事
"\u003cp\u003e软件架构师是个让人羡慕的职业,在市场经济成熟的国家,其薪酬已经达到医生、律师、注册会计师、建筑设计师的水平。但是薪酬高低与职业成熟度没有直 接的关系。重赏之下必有勇夫,高薪往往造成培养机制不健全的行业出现暂时的良莠不齐。目前我们还没有培养软件架构师的成熟机制,架构师大多是程序员自学成 材。程序员擅长和电脑打交道,却不善于处理工作中的人际关系。然而经验表明,除了技术特长,沟通协作的技巧、领导协调的能力、统筹取舍的经验在指挥开发项 目的过程中起着更重要的作用,而这些内容在计算机学院的课本里压根找不到。刚刚升任软件架构师的人,都有一段时间觉得茫然失措,因为有太多非技术问题困扰 着他们。\u003c/p\u003e\n\u003cp\u003e****软件架构师是IT 行业里独一无二的职业,既要精通软件开发技术,又要掌握业务知识,还要周旋于公司不同部门之间,协调各种予盾。做到这些绝非易事, \u003ca href=\"http://blog.csdn.net/bvbook\"\u003e博文视点\u003c/a\u003e 即将翻译出版的新书《软件 架构师应该知道的97 件事》( \u003ca href=\"http://architect.97things.oreilly.com/wiki/index.php/97_Things_Every_Software_Architect_Should_Know_-_The_Book\"\u003e97 Things Every Software Architect Should Know\u003c/a\u003e )探讨的就是这个主题。\u003c/p\u003e\n\u003cp\u003e本书的编辑Richard Monson-Haefel 是畅销书《 …\u003c/p\u003e"
June 26, 2010
MySQL Cluster的常见问题
"\u003cp\u003eMySQL Cluster是MySQL适合于分布式计算环境的高实用、高冗余版本。它采用了NDB Cluster存储引擎,允许在1个Cluster中运行多个MySQL服务器。\u003c/p\u003e\n\u003cp\u003eMySQL Cluster是一种技术,该技术允许在无共享的系统中部署“内存中”数据库的Cluster。通过无共享体系结构,系统能够使用廉价的硬件,而且对软硬 件无特殊要求。此外,由于每个组件有自己的内存和磁盘,不存在单点故障。\u003c/p\u003e\n\u003cp\u003e总结了些移植到MySQL Cluster要注意的常见问题。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e关于连接\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eMySQL集群适合用于高速带宽的环境中,采用TCP/IP方式 连接。它的性能跟主机间的连接速率有直接关系。集群中的最小速率要求是常规的100Mb以太网或者等同的网络。我们建议可能的话就采用G级网络。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e关于内存\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eMySQL集群可以运行在任何启用NDB的平台上。显然,CPU 越快,内存越大,对集群性能提升越明显,64位的CPU也可能比32位的处理器更快。每个作为数据节点的机器都必须有足够的内存来保存共享数据库。\u003c/p\u003e\n\u003cp\u003e在MySQL 5.0中,集群只能基于内存。意思是所有表的数据(包括索引)都保存在内存中。如果你的数据有1GB那么大, …\u003c/p\u003e"
June 25, 2010
MySQL 集群在Server1与Server2上如何安装MySQL
"\u003cp\u003e我们今天主要向大家介绍的是MySQL 集群,其中包括对MySQL 集群的概念介绍,以及如何在Server1与Server2上正确对MySQL进行安装 ,还有对安装与配置管理节点服务器(Server3)的正确操作 ,配置集群服务器并启动MySQL 。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、介绍\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e这篇文档旨在介绍如何安装配置基于2台服务器的MySQL集群。并且实现任意一台服务器出现问题或宕机时MySQL依然能够继续运行。\u003c/p\u003e\n\u003cp\u003e注意!\u003c/p\u003e\n\u003cp\u003e虽然这是基于2台服务器的MySQL集群,但也必须有额外的第三台服务器作为管理节点,但这台服务器可以在集群启动完成后关闭。同时需要注意的是并 不推荐在集群启动完成后关闭作为管理节点的服务器。尽管理论上可以建立基于只有2台服务器的MySQL集群,但是这样的架构,一旦一台服务器宕机之后集群 就无法继续正常工作了,这样也就失去了集群的意义了。出于这个原因,就需要有第三台服务器作为管理节点运行。\u003c/p\u003e\n\u003cp\u003e另外,可能很多朋友都没有3台服务器的实际环境,可以考虑在VMWare或其他虚拟机中进行实验。\u003c/p\u003e\n\u003cp\u003e下面假设这3台服务的情况:\u003c/p\u003e\n\u003cp\u003eServer1: MySQL1.vmtest.net 192.168.0.1 …\u003c/p\u003e"
June 25, 2010
Mysql 集群简介和配置
"\u003cp\u003e1. 先了解一下你是否应该用 mysql 集群。\u003c/p\u003e\n\u003cp\u003e减少数据中心结点压力和大数据量处理,采用把 mysql 分布,一个或多个 application 对应一个 mysql 数据库。把几个 mysql 数据库公用的数据做出共享数据,例如购物车,用户对象等等,存在数据结点里面。 其他不共享的数据还维持在各自分布的 mysql 数据库本身中。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/06/cluster-components-1.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/06/cluster-components-1.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e2. 集群 Mysql 中名称概念 .( 如上图 )\u003c/p\u003e\n\u003cp\u003e1 ) Sql 结点( SQL node– 上图对应为 mysqld ) : 分布式数据库。包括自身数据和查询中心结点数据 .\u003c/p\u003e\n\u003cp\u003e2 )数据结点 (Data node — ndbd): 集群共享数据 ( 内存中 ).\u003c/p\u003e\n\u003cp\u003e3 )管理服务器 (Management Server – ndb_mgmd): 集群管理 SQL node,Data node.\u003c/p\u003e\n\u003cp\u003e3 .配置\u003c/p\u003e\n\u003cp\u003emysql-max 版本,当然现在 mysql 集群系统 windonws 平台上面不被支持 .\u003c/p\u003e\n\u003cp\u003e安装 mysql 就不多说了,网上一打堆,简明扼要。\u003c/p\u003e\n\u003cp\u003eA:192.168.1.251 – Data node 和 Management …\u003c/p\u003e"
June 25, 2010
MySQL Cluster集群配置方案
"\u003cp\u003e在为某证券公司设计其OA架构时,初期客户是30万用户在线;然而在项目实施中,客户又提出50万用户同时在线的需求,而且都有写的需求;这样初始的设计 master-master-slave,读写分离满足不了客户的要求,所以我们打算采用Mysql Cluster方案;MySQL Cluster 是MySQL适合于分布式计算环境的高实用、高冗余版本。它采用了NDB Cluster 存储引擎,允许在1个Cluster中运行多个MySQL服务器。在MyQL 5.0及以上的二进制版本中、以及与最新的Linux版本兼容的RPM中提供了该存储引擎。\u003c/p\u003e\n\u003cp\u003e一、MySQL Cluster概述\u003c/p\u003e\n\u003cp\u003eMySQL Cluster 是一种技术,该技术允许在无共享的系统中部署“内存中”数据库的 Cluster 。通过无共享体系结构,系统能够使用廉价的硬件,而且对软硬件无特殊要求。此外,由于每个组件有自己的内存和磁盘,不存在单点故障。\u003c/p\u003e\n\u003cp\u003eMySQL Cluster 由一组计算机构成,每台计算机上均运行着多种进程,包括MySQL服务器,NDB Cluster 的数据节点,管理服务器,以及(可能)专门的数据访问程序。\u003c/p\u003e\n\u003cp\u003e所有的这些节点 …\u003c/p\u003e"
June 24, 2010
Five Minutes程延辉 介绍开心农场架构
"\u003cp\u003eFive Minutes 公司程延辉(小名康天) 介绍开心农场架构,social game的技术挑战,支持千万级DAU的social game技术架构。这是一个对于开发者来说,非常精彩,非常有实用性指导的一次演讲,详细介绍了很多技术内幕。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.javaeye.com/topics/download/e4f72cf2-2baa-3f4b-9578-d220b6bceea9\"\u003e\u0026raquo;猛击这里下载演讲ppt\u0026laquo;\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eFive Minutes 公司的著名social game 开心农场,目前非常受用户欢迎,包括国外的Facebook,国内的开心网都是如此,是全球最大的social game,台下热烈掌声。呵呵。开心农场这个游戏从介绍看,相当成功,最早是08年9月在xiaonei上线,而后在51等平台推广,包括Facebook。现在已经有1570万游戏用户了,其中包括50万的Facebook用户。\u003c/p\u003e\n\u003cp\u003e开心农场架构主要难点:1。如何存储大规模的用户数据千万级2。如果应对大量访问每天数亿请求量3。如果应对数据的频繁修改,每秒数万次数据修改。\u003c/p\u003e\n\u003cp\u003e解决的方式\u003c/p\u003e\n\u003cp\u003e优化:\u003c/p\u003e\n\u003cp\u003e1。负载均衡,web服务器平行扩展。\u003c/p\u003e\n\u003cp\u003e2。服务器性能优化。\u003c/p\u003e\n\u003cp\u003e3。异步处理,缓存数据接口,Linux内核参数优化,挖掘PHP的效率,用fastcgi模式运行php, …\u003c/p\u003e"
June 20, 2010
开源数据库 Sharding 技术 (Share Nothing)
"\u003cp\u003e注:此文首发于 《程序员》杂志 2008 年 7 月刊。\u003c/p\u003e\n\u003ch4 id=\"从-shard-到-sharding\"\u003e从 Shard 到 Sharding\u003c/h4\u003e\n\u003cp\u003e“Shard” 这个词英文的意思是”碎片”,而作为数据库相关的技术用语,似乎最早见于大型多人在线角色扮演游戏(MMORPG)中。”Sharding” 姑且称之为”分片”。\u003c/p\u003e\n\u003cp\u003eSharding 不是一门新技术,而是一个相对简朴的软件理念。如您所知,MySQL 5 之后才有了数据表分区功能,那么在此之前,很多 MySQL 的潜在用户都对 MySQL 的扩展性有所顾虑,而是否具备分区功能就成了衡量一个数据库可扩展性与否的一个关键指标(当然不是唯一指标)。数据库扩展性是一个永恒的话题,MySQL 的推广者经常会被问到:如在单一数据库上处理应用数据捉襟见肘而需要进行分区化之类的处理,是如何办到的呢? 答案是:Sharding。\u003c/p\u003e\n\u003cp\u003eSharding 不是一个某个特定数据库软件附属的功能,而是在具体技术细节之上的抽象处理,是水平扩展(Scale Out,亦或横向扩展、向外扩展)的解决方案,其主要目的是为突破单节点数据库服务器的 I/O 能力限制,解决数据库扩展性问题。\u003c/p\u003e\n\u003ch4 id=\"事关数据库扩展性\"\u003e事关数据库扩展性\u003c/h4\u003e\n\u003cp\u003e说起数据库扩展性,这是 …\u003c/p\u003e"
June 20, 2010
闲谈 Web 图片服务器
"\u003cp\u003e现在很多中小网站(尤其是 Web 2.0 站点) 都允许用户上传图片,如果前期没有很好的规划,那么随着图片文件的增多,无论是管理还是性能上都带来很多问题。就自己的一点理解,抛砖引玉,以期能引出更具价值的信息。\u003c/p\u003e\n\u003ch4 id=\"事关图片的存储\"\u003e事关图片的存储\u003c/h4\u003e\n\u003cp\u003e把图片存储到什么介质上? 如果有足够的资金购买专用的图片服务器硬件或者 NAS 设备,那么简单的很;如果有能力自己开发单独存储图片的文件系统,那么也不用接着往下看了。\u003c/p\u003e\n\u003cp\u003e如果上述条件不具备,只想在普通的硬盘上存储,首先还是要考虑一下物理硬盘的实际处理能力。是 7200 转的还是 15000 转的,实际表现差别就很大。是选择 ReiserFS 还是 Ext3 ,怎么也要测试一下吧? 创建文件系统的时候 Inode 问题也要加以考虑,选择合适大小的 inode size ,在空间和速度上做取舍,同时防患于未然,注意单个文件系统下文件个数别达到极限。\u003c/p\u003e\n\u003ch4 id=\"独立独立的服务器\"\u003e独立,独立的服务器\u003c/h4\u003e\n\u003cp\u003e无论从管理上,还是从性能上看,只要有可能,尽量部署独立的图片服务器。这几乎成为常识了(不过在我做过面向 Web 的项目之前就这个问题也被人笑话过)。具备独立的图片服务器或者服务器集群后,在 Web 服务器 …\u003c/p\u003e"
June 20, 2010
小规模低性能低流量网站设计原则
"\u003cp\u003e到处都是什么大规模啊,高流量啊,高性能之类的网站架构设计,这类文章一是满足人们好奇心,但看过之后也就看过了,实际收益可能并不大;另外一个副作用是容易让人心潮澎湃,没学走先学跑,在很多条件仍不具备的情况下,\u003cstrong\u003e过度设计、过度扩展\u003c/strong\u003e(高德纳大爷也说过,”过早优化是万恶之源”),所以,这里反弹琵琶,讨论一下\u003cstrong\u003e小规模\u003c/strong\u003e、\u003cstrong\u003e低性能\u003c/strong\u003e、\u003cstrong\u003e低流量\u003c/strong\u003e的网站该如何搞法。\u003c/p\u003e\n\u003cp\u003e如果站点起步阶段可能就是一台机器(或是一台虚拟机,比如 \u003ca href=\"http://jobsdigg.com/\"\u003eJobsDigg.com\u003c/a\u003e ),这个时候,去关注什么数据拆分啊,负载均衡啊,都是没影子的事情。很多大站点的经验绝不能照搬,辩证的参考才是硬道理。\u003c/p\u003e\n\u003ch4 id=\"拥抱熟知的技术\"\u003e拥抱熟知的技术\u003c/h4\u003e\n\u003cp\u003e动手构建站点的时候,不要到处去问别人该用什么,什么熟悉用什么,如果用自己不擅长的技术手段来写网站,等你写完,黄花菜可能都凉了。所以,有现成的软件组件可用,就不要自己重新发明轮子。人家说 Python 牛,但自己只懂 PHP ,那就 PHP 好了,如果熟悉 .net ?,那也不错。用烂技术不是丢人的事情,把好技术用烂才丢人。\u003c/p\u003e\n\u003ch4 id=\"架构层次清晰化\"\u003e架构层次清晰化\u003c/h4\u003e\n\u003cp\u003e起步的阶段应该清楚的确定下来架构的层次。如果都搅和在一起,业务一旦扩增开来,如果原有的一堆东西拆不开就是 …\u003c/p\u003e"
June 5, 2010
Web网游服务器分布式架构设计
"\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/06/%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%9B%86%E7%BE%A4%E5%88%86%E5%B8%83%E5%BC%8F%E6%9E%B6%E6%9E%84.png\"\u003e\u003cimg src=\"http://blogx.haohtml.com/wp-content/uploads/2010/06/%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%9B%86%E7%BE%A4%E5%88%86%E5%B8%83%E5%BC%8F%E6%9E%B6%E6%9E%84.png\" alt=\"服务器集群分布式架构\"\u003e\u003c/a\u003e\u003c/p\u003e"
June 3, 2010
csdn.net的系统架构研究
"\u003cp\u003ecsdn作为国内最大的程序开发社区,影响了足足一代人。它是国内优秀杂志《程序员》的网站,我从前非常喜欢《程序员》这本杂志,里面的文章都非常优秀, 那时只有5元钱的我每个月花10块钱买本这样的杂志,看个三五年,都舍不得丢下。\u003c/p\u003e\n\u003cp\u003e但是今天观察了下csdn站点的架构,发现做的比较简单,看来开发者比较喜欢从程序着手,着重优化代码和数据库,对系统整体架构思考的时间不多。\u003c/p\u003e\n\u003cp\u003e我着重看了几个二级域名:www、news、bbs/community和blog,其中www、news这些静态文件都有通过squid缓存,用的 app_squid架构,然后是dns轮询做分流。\u003c/p\u003e\n\u003cp\u003e在这里顺便讨论下为什么很多大型网站都喜欢用dns轮询来作首页,而不采用lvs或其它负载均衡策略。这是因为负载均衡都是把所有的访问先集中到一个ip 上,因为只有一个ip,所以无意间这个ip的稳定性就关系重大了。ip稳定性会受很多因素影响:n个交换机、线路、机器等等,颇为复杂。而首页很有可能会 用到异地的负载均衡,这么来不用dns,方案就很难设计了。现在的常用浏览器和下载软件,都有对dns的故障处理机制,所以dns也是可以屏蔽掉一些故障 的,虽然 …\u003c/p\u003e"
June 3, 2010
nginx图片服务器的架构方案
"\u003cp\u003e图片服务通常数据容量较大,而且访问也频繁,鉴于此,图片服务就会有两种问题,一是存储问题,二是访问量问题。\u003c/p\u003e\n\u003cp\u003e存储问题就是硬盘容量问题,花钱买硬盘就可以了,看似简单,但着实也是最苦的问题。按目前探索来看,最好的方式是:在任何时刻遇到硬盘空间不够时,买颗硬 盘插上,最多改改配置,就能立刻利用;另外,硬盘要能充分利用,不然图片存储量大再加上备份,很恐怖,最好是每颗硬盘都用上100%的空间。\u003c/p\u003e\n\u003cp\u003e访问量也是个大问题,如果服务不允许防盗链,那么访问量会引起带宽、服务器压力等问题,有钱的话直接扔CDN,没钱或者有更多的钱,就自己做吧。根据垣古 不变的真理“越老的图,访问量也相对较少”这一点,分成两大部分,一边处理最新的图片,一边处理老旧的图片。最新的图片访问量大,但存储量较少;老图片访 问量低,但存储量大。\u003c/p\u003e\n\u003cp\u003e大概分析完了,开始制定方案。\u003c/p\u003e\n\u003cp\u003e一、拟定一个存储目录规则:\u003c/p\u003e\n\u003cp\u003e在现有的/a/b/abcde.jpg这样的hash方式下多加一个日期的目录变成:/200810/16/a/b/abcde.jpg或者/2008 /10/16/a/b/abcde.jpg。按日期制定这个目录规则后,就可以按年月来拆机器了。\u003c/p\u003e\n\u003cp\u003e二、 …\u003c/p\u003e"
June 3, 2010
图片服务器的hash架构
"\u003cp\u003e这是一个最简洁的架构。在这个架构里,负载均衡器都可以省了,用最为廉价的dns来替代,dns的优点就是廉价,不用维护,也不愁性能和稳定,还可以跨机房多用几条带宽作分流。 另外,在图片服务中,可以选择用另一个域名做dns。优点是主站中的任何cookie等header不会带到图片服务中,省了不少上传流量和服务器可能有 的处理时间;缺点是多花了点域名的钱。目前门户都喜欢用这办法,小站用的话,用另一个域名还附带有一个特别的优点:因为部分域名服务商允许添加的二级域名 有限,所以用别的域名可以节约有限的域名资源。dns这一块也可以用泛域名,不过貌似国内的泛域名支持不是特别的稳定,有些网站的泛域名,在linux下 不能解析windows就正常,比较奇怪,我也没法解释。\u003c/p\u003e\n\u003cp\u003e在这个架构里我总共开了36个域名,但是一时没有那么多机器,所以有一些域名指向同一台机器。一般来说,一个刚上线的项目,放一台机也未尝不可,但是链接 (包括域名)一定要固定下来,不然以后调整会非常痛苦。\u003c/p\u003e\n\u003cp\u003e域名的事情还是比较简单的,只要照着填写web表单就完成了,配置四台nginx服务器当然也是非常简单的,因为不需要什么特殊的功能,所以四台机 …\u003c/p\u003e"
June 3, 2010
什么是反向代理,如何利用反向代理提高网站性能
"\u003cp\u003e这几天常看到kangzj在博客里谈论代理, \u003ca href=\"http://www.houkai.com/2009/09/18/micolog-optimization.html\" title=\"Micolog博客主题终极优化篇\"\u003e上篇博文\u003c/a\u003e 也提到过反向代理,有同学对利用绝对路径绕过ghs起到加速作用不是很理解,那就总结一下反向代理的知 识。谈到google ghs时,说绕过ghs反向代理服务器直接使用*.appspot.com起到加速的目的,好像本文标题“利用反向代理提高网站速度”有点矛盾,其实不 然,我们域名下的资源文件绕过一个反向代理服务器,得到的appspot反向代理服务器更直接而且它有负载均衡机制。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1. 什么是正向代理和正向代理服务器?\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e正向代理就是通常所说的代理,是某台电脑通过一台服务器来上Internet网的这种 方式,其中这台电脑就叫客户机,这台服务器就叫正向代理服务器也就是通常所说的代理服务器。在这种方式中,你是主动的,网站是被动的,网站那里不能得到你 的真实ip地址。(通俗讲法)\u003c/p\u003e\n\u003cp\u003e正向代理服务器。它只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器(一般在 IE-Internet选项-连接-局域网设置),并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2. 什么是反向代理和反向代理服务器?\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e反向代理就是网 …\u003c/p\u003e"
June 3, 2010
反向代理登录?
"\u003cp\u003e**反向代理(Reverse Proxy)**方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务 器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。\u003c/p\u003e\n\u003cp\u003e通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务 器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。由于外部网络上的主机并不会配置并使用这个代理服务器,普通代理服务器也被设 计为在Internet上搜寻多个不确定的服务器,而不是针对Internet上多个客户机的请求访问某一个固定的服务器,因此普通的Web代理服务器不 支持外部对内部网络的访问请求。当一个代理服务器能够代理外部网络上的主机,访问内部网络时,这种代理服务的方式称为反向代理服务。此时代理服务器对外就 表现为一个Web服务器,外部网络就可以简单把它当作一个标准的Web服务器而不需要特定的配置。不同之处在于,这个服务器没有保存任何网页的真实数据, 所有的静态网页或者CGI程序,都保存在内部的Web服务器上。因此对反向代理服务器 …\u003c/p\u003e"
June 3, 2010
分布式文件系统研究11:Google File System (1)
"\u003cp\u003eGoogle File System\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e前言\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e没什么好说的,传说中的文件系统,当代网络超大容量分布式文件系统设计的典范,Google的核心竞争力所在。Google的Search、GMail、 video、blog spaces等等都是用这个技术做的。Google目前的中国区总裁李开复就认为学计算机的学生都应该看看Google File System。\u003c/p\u003e\n\u003cp\u003e很佩服Google的开放精神,将GoogleFS的详细设计写成了Paper: The Google File System, ( \u003ca href=\"http://labs.google.com/papers/GoogleFS-sosp2003.pdf\"\u003ehttp://labs.google.com/papers/GoogleFS-sosp2003.pdf\u003c/a\u003e) 作者是Sanjay Ghemawat, Howard Gobioff, and Shun-Tak Leung。该论文长达15页,对Google FS介绍得非常详细,从设计时考虑的因素到详细的解决方案,以及测试和实际运行数据,都做了具体的说明,而不像IBM这么遮遮掩掩,从GPFS、 Storage Tank到TotalStorage SAN File System,一直都是小里小气的样子,生怕别人知道它做了啥。 …\u003c/p\u003e"
June 2, 2010
Hadoop分布式文件系统:架构和设计要点(翻译)
"\u003cp\u003eHadoop分布式文件系统:架构 和设计要点\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、前提和设计目标\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1、硬件错误是常态,而非异常情况,HDFS可能是有成百上千的server组成,任何一个组件都有可能一直失效,因此错误检测和快速、自动的恢复是HDFS的核心架构目标。\u003c/p\u003e\n\u003cp\u003e2、跑在HDFS上的应用与一般的应用不同,它们主要是以流式读为主,做批量处理;比之关注数据访问的低延迟问题,更关键的在于数据访问的高吞吐量。\u003c/p\u003e\n\u003cp\u003e3、HDFS以支持大数据集合为目标,一个存储在上面的典型文件大小一般都在千兆至T字节,一个单一HDFS实例应该能支撑数以千万计的文件。\u003c/p\u003e\n\u003cp\u003e4、HDFS应用对文件要求的是write-one-read-many访问模型。一个文 件经过创建、写,关闭之后就不需要改变。这一假设简化了数据一致性问 题,使高吞吐量的数据访问成为可能。典型的如MapReduce框架,或者一个web crawler应用都很适合这个模型。\u003c/p\u003e\n\u003cp\u003e5、移动计算的代价比之移动数据的代价低。一个应用请求的计算,离它操作的数据越近就越高效,这在数据达到海量级别的时候更是如此。将计算移动到数据附近,比之将数据移动到应用所在显然更好,HDFS提供给应用这样的接口。\u003c/p\u003e\n\u003cp\u003e6、在 …\u003c/p\u003e"
June 2, 2010
网站海量小文件分布式系统架构方案
"\u003cp\u003e网站文件的存储还是要讲究的,如果在网站成立初期,数据量不大就没有注意,随着时间的增长,网站的图片文件等数据肯定会越来越多,如何解决这些文件 存储也成了新的难题。如果把这些文件都完全采用大硬盘存储来解决,并不是一个好主意,因为数据量越大风险就越高,虽然文件能存得下,但是故障率相应会较 高,另外重建耗费时间也比较长。所以最好的办法是尽可能考虑分布式存储,把文件想办法利用网络分散到多个机器上。\u003c/p\u003e\n\u003cp\u003e从我所了解的存储结构来看,分布式存储大致可以分为几种:\u003c/p\u003e\n\u003cp\u003e1、类googlefs的分布式文件系统\u003c/p\u003e\n\u003cp\u003e因为目前googlefs没有开源,所以网上出现的分布式文件系统都是利用google的方案自行实现的。这个方案的优点是可用性比较高,基本上基 于硬盘的应用都可以处理,可用范围就比较广泛。我看了gfs、gfs2、ocfs2、FastDFS、MogileFS的一些相关介绍,大致有一些认识。\u003c/p\u003e\n\u003cp\u003e首先是文档比较少而出现的问题倒不少;然后是目前这些还没有一个能称得上是稳定版本,如果有的话,估计也就是其中一些收费的版本。因为磁盘存储乃是 致关重要,所以目前建议还是不要轻易把这些东西部署到重要的地方。假如非常想使用的话,最好 …\u003c/p\u003e"
May 31, 2010
cookie-free域名提高网页效率-优化网站性能(yslow)
"\u003cp\u003eYSlow给如何提高网页效率和优化网站性能提供了22条建议,其中有一条是关于域名的:Use cookie-free domains。\u003c/p\u003e\n\u003cp\u003e使用 cookie-free domains 有什么好处呢?当用户浏览器发送一个静态文件,如图片image、CSS样式表文件时会同时发送同一个域名(或二级域名)下的cookies,但是网站服 务器对发送过来的cookies完全不予理会,因此这些没用的cookies白白浪费了网站带宽,影响网站加载速度和网页性能表现。YSlow建议为了解 决这个问题,就可以通过使用 cookie-free domains 的方法来做优化,从而提高网页效率。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e使用二级域名作为cookie-free domains\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e通俗地说,所谓的 cookie-free domains 就是在浏览器发送静态内容的请求时不会发送cookies 的域名。YSlow提示可以申请注册一个二级域名专门用来储存这些静态图片、JS、静态CSS文件。\u003c/p\u003e\n\u003cp\u003e在前面泛域名解析设置影响seo和Google PR值这里提到了www开头,形如www.haohtml.com的域名实际上也是属于二级域名。如果你的网站主域名 …\u003c/p\u003e"
May 30, 2010
网页优化-apache中文件有效期的设置-yslow
"\u003cp\u003e前面我用已经启用了网页压缩功能,见 \u003ca href=\"http://blog.haohtml.com/index.php/archives/3723\"\u003ehttp://blog.haohtml.com/index.php/archives/3723\u003c/a\u003e,下面我们来对网页元素有效期进行设置。\u003c/p\u003e\n\u003cp\u003e首先,启用LoadModule expires_module modules/mod_expires.so,只要在httpd.conf中把前面的#号去掉就可以了。然后在httpd.conf最后添加以下几行\u003c/p\u003e\n\u003cp\u003eExpiresActive On\u003c/p\u003e\n\u003cp\u003eExpiresDefault “access plus 10 years”\u003c/p\u003e\n\u003cp\u003e重启apache,可以用firefox浏览器中的yslow插件查看最终效果,此时”add expires haders”项应该为A。表示配置成功.\u003c/p\u003e"
May 30, 2010
网页减肥-apache中启用gzip压缩
"\u003cp\u003e先启用 LoadModule deflate_module modules/mod_deflate.so,只需要把前面的#去掉就可以了。\u003c/p\u003e\n\u003cp\u003e然后在httpd.conf最下面添加以下行:\u003c/p\u003e\n\u003cp\u003eDeflateBufferSize 8096\nDeflateCompressionLevel 1\nDeflateMemLevel 9\nDeflateWindowSize 15\u003c/p\u003e\n\u003cp\u003eDeflateFilterNote Input instream\nDeflateFilterNote Output outstream\nDeflateFilterNote Ratio ratio\nDeflateFilterNote ratio\nLogFormat ‘”%r” %{outstream}n/%{instream}n (%{ratio}n%%)’ deflate\nCustomLog logs/deflate.log deflate\u003c/p\u003e\n\u003cp\u003eSetOutputFilter DEFLATE\u003c/p\u003e\n\u003cp\u003eAddOutputFilterByType DEFLATE text/html text/css application/x-javascript …\u003c/p\u003e"
May 30, 2010
配置ETags–网站速度优化技巧法则13 – [网站速度优化]
"\u003cp\u003e法则13 配置ETags\u003c/p\u003e\n\u003cp\u003e实体标签(ETags)是用于确定浏览器缓存中元素 与原Web 服务器中的元素是否相匹配的机制(实体是“元素”的另外一个称谓:如图片、脚本、样式 表等),它提供 了比last-modified 时间更为灵活的元素验证机制。每一个ETag,都是唯一的字符串,用于标识特定版本的元素,它需被包括在引号中。原Web 服务器在响应信息头中用Etag来标识元素,如:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026gt; HTTP/1.1 200 OK\n\u0026gt;\n\u0026gt; Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT\n\u0026gt;\n\u0026gt; ETag: “10c24bc-4ab-457e1c1f”\n\u0026gt;\n\u0026gt; Content-Length: 12195\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e之后,如果浏览器需验证某元 素,它在信息头中用If-None-Match传回ETag给原Web 服务器,若ETag匹配,则服务器返回304代码而不是上例中的12195字节,从而节省了下载响应时间。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026gt; GET /i/yahoo.gif HTTP/1.1\n\u0026gt;\n\u0026gt; Host: us.yimg.com …\u003c/code\u003e\u003c/pre\u003e"
May 29, 2010
meta http-equiv=”Cache-Control” content=”max-age=0″
"\u003cp\u003e\u003cstrong\u003eCache-Control头域\u003c/strong\u003e\nCache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache- Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、max- stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、 no-store、no-transform、must-revalidate、proxy-revalidate、max-age。各个消息中的指令含 义如下\u003c/p\u003e\n\u003cp\u003ePublic指示响应可被任何缓存区缓存\u003c/p\u003e\n\u003cp\u003ePrivate指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器 仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效\u003c/p\u003e\n\u003cp\u003eno-cache指示请求或响应消息不能缓存\u003c/p\u003e\n\u003cp\u003eno-store用于防止 重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。\u003c/p\u003e\n\u003cp\u003emax-age指示客户机可以接收生存期不大于指定时间(以秒为单 位)的响应\u003c/p\u003e\n\u003cp\u003emin-fresh指示客户机可以 …\u003c/p\u003e"
May 29, 2010
HTTP头的Expires与Cache-control
"\u003cp\u003e\u003cstrong\u003eCache-control\u003c/strong\u003e用于控制HTTP缓存(在HTTP/1.0中可能部分没实现,仅仅实现了 Pragma: no-cache)\u003c/p\u003e\n\u003cp\u003e数据包中的格式:\u003c/p\u003e\n\u003cp\u003eCache-Control: cache-directive\u003c/p\u003e\n\u003cp\u003ecache-directive可以为以下:\u003c/p\u003e\n\u003cp\u003erequest时用到:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e| \u0026#34;no-cache\u0026#34;\n| \u0026#34;no-store\u0026#34;\n| \u0026#34;max-age\u0026#34; \u0026#34;=\u0026#34; delta-seconds\n| \u0026#34;max-stale\u0026#34; [ \u0026#34;=\u0026#34; delta-seconds ]\n| \u0026#34;min-fresh\u0026#34; \u0026#34;=\u0026#34; delta-seconds\n| \u0026#34;no-transform\u0026#34;\n| \u0026#34;only-if-cached\u0026#34;\n| \u0026#34;cache-extension\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eresponse时用到:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e| \u0026#34;public\u0026#34;\n| \u0026#34;private\u0026#34; [ \u0026#34;=\u0026#34; \u0026lt;\u0026#34;\u0026gt; field-name …\u003c/code\u003e\u003c/pre\u003e"
May 29, 2010
高性能网站建设指南——前端工程师技能精粹(电子版中文PDF版)下载
"\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/05/height-web.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/height-web.jpg\" alt=\"height-web\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e本书结合Web 2.0以来Web开发领域的最新形势和特点,介绍了网站性能问题的现状、产生的原因,以及改善或解决性能问题的原则、技术技巧和最佳实践。重点关注网页的行为特征,阐释优化Ajax、CSS、JavaScript、Flash和图片处理等要素的技术,全面涵盖浏览器端性能问题的方方面面。在《高性能网站建设指南》中,作者给出了14条具体的优化原则,每一条原则都配以范例佐证,并提供了在线支持。《高性能网站建设指南》内容丰富,主要包括减少HTTP请求、Edge Computing技术、Expires Header技术、Gzip组件、CSS和JavaScript最佳实践、主页内联、Domain最小化、JavaScript优化、避免重定向的技巧、删除重复JavaScript的技巧、关闭ETags的技巧、Ajax缓存技术和最小化技术等。《高性能网站建设指南》适合Web架构师、信息架构师、 Web开发人员及产品经理阅读和参考。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e下载地址(请使用 \u003cstrong\u003e下载工具下载\u003c/strong\u003e):\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"ftp://210.51.180.68/bbs/tp05/computer/web/%E9%AB%98%E6%80%A7%E8%83%BD%E7%BD%91%E7%AB%99%E5%BB%BA%E8%AE%BE%E6%8C%87%E5%8D%97_CHS%5Bwww.TopSage.com%5D.zip\"\u003e高性能网站建设指南_CHS\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e也可以在网盘下载: \u003ca href=\"http://www.dbank.com/download.action?t=40\u0026amp;k=MjAxMDI4Mg==\u0026amp;pcode=LCwxNDYyNzksMTQ2Mjc5\"\u003e高性能网站建设指南.zip\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e"
April 26, 2010
TBCompressor – JS和CSS压缩工具
"\u003cp\u003e有朋友问到淘宝是怎么压缩js和css的,这里分享下。\u003c/p\u003e\n\u003cp\u003e我们使用的是 \u003ca href=\"http://www.julienlecomte.net/yuicompressor/\"\u003eYUI Compressor\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe YUI Compressor is a JavaScript compressor which, in addition to removing comments and white-spaces, obfuscates local variables using the smallest possible variable name. This obfuscation is safe, even when using constructs such as ‘eval’ or ‘with’ (although the compression is not optimal is those cases) Compared to jsmin, the average savings is around 20%.\u003c/p\u003e\n\u003cp\u003eThe YUI Compressor is also able to safely compress CSS files. The decision on which …\u003c/p\u003e\u003c/blockquote\u003e"
April 24, 2010
JS内存释放问题
"\u003cp\u003e一个内存释放的实例\u003c/p\u003e\n\u003cp\u003eCollectGarbage, 是IE的一个特有属性,用于释放内存的使用方法嘛应该是,将该变量或引用对象,设置为null或delete然后在进行释放动作\n在 做CollectGarbage前,要必需清楚的两个必备条件:\u003c/p\u003e\n\u003cp\u003e引用\u003c/p\u003e\n\u003cp\u003e– 一个对象在其生存的上下文环境之外,即会失效。\u003c/p\u003e\n\u003cp\u003e– 一个全局的对象在没有被执用(引用)的情况下,即会失效。\u003c/p\u003e\n\u003cp\u003e========= 美丽的分割线 =========\u003c/p\u003e\n\u003cp\u003e//———————————————————\n// JavaScript对象何时失效\n//———————————————————\nfunction testObject() {\nvar _obj1 = new Object();\n}\u003c/p\u003e\n\u003cp\u003efunction testObject2() {\nvar _obj2 = new Object();\nreturn _obj2;\n}\u003c/p\u003e\n\u003cp\u003e// 示例1\ntestObject();\u003c/p\u003e\n\u003cp\u003e// 示例2\ntestObject2()\u003c/p\u003e\n\u003cp\u003e// 示例3\nvar obj3 = testObject2();\nobj3 = null;\u003c/p\u003e\n\u003cp\u003e// 示例4\nvar obj4 = …\u003c/p\u003e"
April 23, 2010
js过滤word格式
"\u003cp\u003efunction cleanAndPaste(html) …{\n// Remove all SPAN tags\nhtml = html.replace(/]\u003cem\u003e\u0026gt;/gi, “” );\n// Remove Class attributes\nhtml = html.replace(/\u0026lt;(w[^\u0026gt;]*) class=([^ |\u0026gt;]*)([^\u0026gt;]\u003c/em\u003e)/gi, “\u0026lt;$1$3″) ;\n// Remove Style attributes\nhtml = html.replace(/\u0026lt;(w[^\u0026gt;]*) style=”([^”]*)”([^\u0026gt;]\u003cem\u003e)/gi, “\u0026lt;$1$3”) ;\n// Remove Lang attributes\nhtml = html.replace(/\u0026lt;(w[^\u0026gt;]*) lang=([^ |\u0026gt;]*)([^\u0026gt;]\u003c/em\u003e)/gi, “\u0026lt;$1$3”) ;\n// Remove XML elements and declarations\nhtml = html.replace(/\u0026lt;??xml[^\u0026gt;] …\u003c/p\u003e"
April 15, 2010
FCKeditor2.6.5及后续版本配置及中文上传乱码解决(PHP)
"\u003cp\u003e\u003ca href=\"/wp-content/uploads/2010/04/fckedior_3.1.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/04/fckedior_3.1.png\" alt=\"fckedior_3.1\"\u003e\u003c/a\u003e\n1、首先去官网下载FCKeditor2.6.5 多国语言版。 \u003ca href=\"http://ckeditor.com/download\"\u003ehttp://ckeditor.com/download\u003c/a\u003e,注意: 第一个为最新3.0.1版,第二个才是FCKeditor 2.6.5\u003c/p\u003e\n\u003cp\u003e2、删除不必要的东西:\u003c/p\u003e\n\u003cp\u003e删除/FCKeditor/目录下除 fckconfig.js,fckeditor.js,fckstyles.xml,fcktemplates.xml,fckeditor.php,fckeditor_php5.php,fckeditor_php4.php\n七个文件以外的所有文件;\n删除目录/editor/_source(基本上,所有_开头的文件夹或文件都是可选的);\n删除/editor/filemanager/connectors/下除了php目录的所有目录;\n删除/editor/lang/下的除了 en.js, zh.js, zh-cn.js三个文件的所有文件。\u003c/p\u003e\n\u003cp\u003e3、打开/FCKeditor/fckconfig.js\n修改\nvar FCKConfig.DefaultLanguage = ‘zh-cn’ ;\nvar _FileBrowserLanguage = …\u003c/p\u003e"
April 13, 2010
浅谈品牌的视觉识别
"\u003cp\u003e\u003cimg src=\"http://webteam.tencent.com/wp-content/uploads/2009/6/1151_top.jpg\" alt=\" \"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e什么是品牌的视觉传达\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e品牌,这个熟悉而又陌生的名词,有时总会让人产生误解。品牌很广,广到一个意会颇深的战略发展理念;品牌很小,小到一个清晰可见的图形符号。关于品 牌,这里就不详细介绍了。要提到的是一套服务于品牌推广的手段CI系统(Corporate Identity System),即企业形象识别系统应运而生。CI系统是由理念识别(Mind Identify 简称MI)、行为识别(Behavior Identify简称BI)和视觉识别(Visual Identify 简称 VI)三方面所构成。\u003c/p\u003e\n\u003cp\u003e而今天想讲到的是大家熟悉的品牌的视觉识别 (vI),也就是广义品牌的一个视觉载体,即由视觉感观所接触到的为了区别于其他竞争对手的一套视觉识别系统,它的基本要素部分主要包括企业名称、企业标 志、企业标准字体、标准色彩、象征图案、企业提出的标语、企业吉祥物、专用字体。还有一部分就是应用要素,主要包括办公事物用品、企业内外部建筑环境、交 通工具、服装服饰、广告媒体、产品包装、赠送礼品、陈列展示、印刷出版物。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://webteam.tencent.com/wp-content/uploads/2009/6/1151_1.jpg\" alt=\" \"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e视觉识别的重要性\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e品牌的形象设计在品牌中是至关重要的,而视觉识别设计是最外在、最直接、最具 …\u003c/p\u003e"
April 13, 2010
模式化窗口
"\u003cp\u003e先让我们看一个例子,了解什么是模式化窗口。\u003c/p\u003e\n\u003cp\u003e以下是QQ秀商城在非登录时提示登录的一种状态。当我在非登录状态,通过保存形象的方式买一件衣服时,弹出登录对话窗口提示登录。此时,登录对话窗 口锁定商城页,锁定IE,只有当对登录窗口进行操作后,才能够进行其他操作。譬如:最小化IE、浏览商城等。我们可以说,登录对话窗口就是一种模式化窗 口。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://webteam.tencent.com/wp-content/uploads/2009/4/894_001.jpg\" alt=\"QQ秀商城提示用户登录的模式化窗口\"\u003e\u003c/p\u003e\n\u003cp\u003e模式化窗口常常给人“坏”的印象,为什么“坏”?是因为它“长”成那个样子?还是因为它通常都说些没用的话,所以用户都不看其中的内容?如果换成一 个浮动层DIV,它就变“好”了?就模式化窗口的形式和“好坏”问题,我们进行了讨论。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e为什么大家会认为它“坏”?\u003c/strong\u003e\n西贝:“以前系统弹出对话框,用户看不懂,或者不看,给用户的印象大多是一种警告。因此感觉很坏,对用户来讲,很暴力。”(呵呵,可以引用最近流行的,很 陈,很冠希了。)Eele:“当我在填一些注册信息时,需要从另外一页复制一些内容,这个时候弹出alert无法到另一页。”(这种情况我也遇到 过~~)Hiseven:“以前有一些网站,有bug,弹出‘无数’确定对话框,必须全部确定才能进行下一步的操作,于是开始点击一个又 …\u003c/p\u003e"
April 13, 2010
产品交互原型设计工具分享
"\u003cp\u003e交互设计师的一项重要工作就是进行产品原型设计(Prototype Design)。而产品原型设计最基础的工作,就是画出站点的大体wireframe(框架图)并结合批注、大量的说明以及流程图等,将自己的产品原型完 整而准确的表述给产品、UI、重构/开发工程师等等,并通过沟通反复修改prototype 直至最终确认,然后进入后续的设计开发流程。\u003c/p\u003e\n\u003cp\u003e要完成以上复杂的设计和沟通工作,需要一个好的原型设计工具。这里就目前常用的和比较热门的工具来分享一下:\nWord(产品经理比较常用)\nFireworks(交互组内推广的)\nBalsamiq Mockups(近期曝光率比较高)\nAuxre RP(业界圈子内广为流传)\u003c/p\u003e\n\u003cp\u003e一、优势劣势对比\n\u003cimg src=\"http://webteam.tencent.com/wp-content/uploads/2010/3/1741_002.jpg\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e二、操作界面对比\nWord:基本是通过绘图工具栏的各种线框来画wireframe。\n\u003cimg src=\"http://webteam.tencent.com/wp-content/uploads/2010/3/1741_001.jpg\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003eFireworks:通过公共库的WEB原型组件库画wireframe。\n\u003cimg src=\"http://webteam.tencent.com/wp-content/uploads/2010/3/1741_003.jpg\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003eBalsamiq Mockups:操作类似FW,通过顶部的控件库拉取到工作区域画wireframe。\n\u003cimg src=\"http://webteam.tencent.com/wp-content/uploads/2010/3/1741_004.jpg\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003eAuxre RP:基本操作也和FW,Mockups类似,3是工作区域,从5控件库里拉取到工作区域 …\u003c/p\u003e"
April 13, 2010
IE6局部调用PNG32以上的合并图片
"\u003cp\u003e为满足用户的视觉追求及产品的背景图片的换肤功能,设计师难免在设计上会用到半透明的效果。因此页面重构师基于视觉及产品的需要,采用了PNG32 的半透明图片还原设计稿。\u003c/p\u003e\n\u003cp\u003e但在IE6中遇到png兼容性,及其延伸的种种问题。如:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003epng32的图片上在IE6有兼容性问题,原本的透明显示的背景将会失效。\u003c/li\u003e\n\u003cli\u003e在问题1的基础上,针对IE6采用了CSS滤镜让其透明,但图片不能应用背景坐标定位的方式只能单张使用,这做法不利于带宽流量和请求链接数之余 也不利样式的管理\u003c/li\u003e\n\u003cli\u003e在问题2的基础上,意味着要把png图片单张切割,并单张应用CSS滤镜\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003e针对以上问题重构师的解决办法如下:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e把背景图片如常的合并,利用相似于背景坐标的方式调用局部图片位置。最大区别在于分别定义了两个无意义的标签。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e一个标签作为模拟背景的\u003cstrong\u003e载体标签\u003c/strong\u003e:定义一个作为载体的标签,针对IE6以滤镜的形式导入图片,宽高与背景一 致。\u003c/li\u003e\n\u003cli\u003e另一个标签作为截取背景局部位置的\u003cstrong\u003e截取标签\u003c/strong\u003e:定义此标签宽高与预想调用背景局部位置大小一致,并隐藏其溢出的 部份。\u003c/li\u003e\n\u003cli\u003e最后计算出预想调用背景局部位置的坐标,定义在载体标签中。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eHTML结构如下:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://isd.tencent.com/?p=462#\"\u003eview plain\u003c/a\u003e \u003ca href=\"http://isd.tencent.com/?p=462#\"\u003ecopy …\u003c/a\u003e\u003c/p\u003e"
April 13, 2010
从宜家的家具设计讲模块化
"\u003cp\u003e很久之前就知道 \u003ca href=\"http://www.ikea.com/cn/zh\"\u003e宜家\u003c/a\u003e ,以前在广州的时候也去过一次,给我的印象就是:大、贵、巧。地方很大,东西很贵,设计很巧。现在住的地方离宜家不远,这个月找时间去逛了下,地方还是那 么大,东西还是那么贵,设计还是那么的巧。虽然没有买什么东西,不过也还是有所收获的,通过宜家的家具设计方法,我们可以聊聊模块化。\u003c/p\u003e\n\u003cp\u003e去过宜家的同学应该都有注意到,宜家的家具基本都是组合的,可拆装。模块化的特点也是这样,可以组合,相对独立,在需要的时候可以很方便的加上。那 怎么写可以基本实现这种方式呢?给个简单的例子:\u003c/p\u003e\n\u003cp\u003e`\u003c/p\u003e\n\u003ch3 id=\"模块化demo\"\u003e模块化Demo\u003c/h3\u003e\n\u003cp\u003e模块化结构的例子。\u003c/p\u003e\n\u003cp\u003e`\u003c/p\u003e\n\u003cp\u003e对应的CSS可以这么写:\u003c/p\u003e\n\u003cp\u003e`.mode-a{\u0026hellip;}\u003c/p\u003e\n\u003cp\u003e.mode-a h3{\u0026hellip;}\u003c/p\u003e\n\u003cp\u003e.mode-a p{\u0026hellip;}\u003c/p\u003e\n\u003cp\u003e`\u003c/p\u003e\n\u003cp\u003e其中“mode-a”就是这个模块的名称,表示这是名为“a”的模块,现在这个模块可以被放到你所需要的地方。既然是做模块,就不会只有一个,我们 再加一个“mode-b”:\u003c/p\u003e\n\u003cp\u003e`\u003c/p\u003e\n\u003ch3 id=\"模块化demo-1\"\u003e模块化Demo\u003c/h3\u003e\n\u003ch4 id=\"模块化的特点\"\u003e模块化的特点:\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e相对独立\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e可移植性高\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e`\u003c/p\u003e\n\u003cp\u003e对应的CSS可以这么写:\u003c/p\u003e\n\u003cp\u003e`.mode-b{\u0026hellip;}\u003c/p\u003e\n\u003cp\u003e.mode-b …\u003c/p\u003e"
April 13, 2010
谈CSS书写风格
"\u003cp\u003e随着公司业务的增加,需求变的越来越多,团队也因此在不断的扩大,我们经常会遇到几个人协同工作来完成同一件作品或者维护修改别人作品的时候,那么 是什么最让你最感到困扰呢?我们在实现一个表现复杂的页面的同时,CSS文件就会比较繁琐,众多的选择符、属性让人眼花缭乱,那么如何更快的定位、如何更 高效的编写样式呢?CSS的书写被很多人所忽略。关于书写风格,翻看了一些知名网站的作品,发现横向连排几乎成为各大产品项目的主流,然而,每个人对于 CSS的写法各异,这就导致我们工作效率的降低。为了更好的协同工作,保持团队内CSS书写的一致性,几经波折后达成共识,具体书写方法如下:CSS属性 横排书写,选择符纵排书写,每个”,”(逗号)后必须换行;\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e重构组代码书写规范示例:(其中数字只用做示范,实际应用中不建议用数字命名。)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e.class_name_1 .class_name_1_1,\n.class_name_2 .class_name_2_1 .class_name_2_1_1,\n.class_name_3{style1:value; style2:value; styel3:value; }\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e有人说,好代 …\u003c/p\u003e"
April 13, 2010
你是一个职业的页面重构工作者吗?
"\u003cp\u003e做为一个专职的页面重构者,我们从事的工作简单的说就是“将设计稿转换成WEB页面”,这一过程可以很简单到直接把PSD从PS里导出成网页;也可复杂到需要考虑页面中每个标签的使用,考虑“页面性能”。以“前端工程 师”为目标的同学可能会不愿承认将页面重构这块分出来,但随着工种的细分,加上页面重构本身的专业性,独立为一个职业也不是不可能,至少我现在从事的就是 一个专职的职位。如果你觉得一个前端工程师必须去画设计稿,可以不理会下面的内容。\u003c/p\u003e\n\u003cp\u003e单纯的页面重构,所涉及到的工作内容一般是“分析设计稿=\u0026gt;切图=\u0026gt;写HTML和CSS”,虽然看 起来很少,但要做好这份工作,绝非所想的那么容易。原因很简单:工作内容单一,在时间和工作量上必会很苛刻,往往跟设计师的工作时间是3:1,即设计师给 三天的时间,制作只给一天的时间完成;在这种工作强度下,很多人都是靠着对这份工作的喜爱在维持着,一旦工作热情消失,很容易就会变得枯燥,保持热情也成 了重构工作者(也许是所有参加工作的人)应该具备的能力。\u003c/p\u003e\n\u003cp\u003e跟“前端工程师”所要求的有所不同,“页面重构”虽然也是“前端工程师”的一个范畴,在职业化中,对专职的页面重构者,要 …\u003c/p\u003e"
April 13, 2010
用户研究方法——用户测试法
"\u003cp\u003e“这是什么啊,用不明白,体验太差了!”、“在哪里登录?找不到啊!”、“谁知道这是个按钮可以点啊,像个图片!”在产品体验中,我们经常会听到这 样那样有关产品体验的声音。而主动并客观地去发现这些问题(可用性问题)的方法之一,就是我们今天要介绍的用户研究方法之一——用户测试法。\u003c/p\u003e\n\u003cp\u003e什么是用户测试?通俗地讲,用户测试就是通过给用户制定任务,在用户执行任务的过程中,发现产品设计的不足,并为产品优化提供依据的一种方法。\u003c/p\u003e\n\u003cp\u003e通常情况下,根据目的不同,用户测试可以是定性地发现问题、也可以是定量地比较两个竞品的优劣。根据测试产品特点不同,可以采用边做边说的用户测 试、也可以采用回顾式用户测试、甚至可以采用协同式用户测试等。用户测试可以用于产品设计阶段测试产品低保真原型、也可以用于产品测试阶段在发布前发现重 大的可以优化的可用性问题、还可以用于产品发布以后,为下一个版本的优化提供依据。\u003c/p\u003e\n\u003cp\u003e一般情况下,根据ISD产品特点、时间等条件的限制,在产品测试阶段或者产品发布以后以发现可用性问题为主的边做边说用户测试较为常见。下面将以迷 你屋用户测试为例,来说明如何进行一场简单的以发现问题为主的边说边做法用户测试。\u003c/p\u003e\n\u003cp\u003e迷你屋 …\u003c/p\u003e"
April 13, 2010
关于导航的探讨
"\u003cp\u003e\u003cimg src=\"http://webteam.tencent.com/wp-content/uploads/2008/12/156_001.jpg\" alt=\"图片说明\"\u003e\u003c/p\u003e\n\u003cp\u003e许多网站缺乏针对性和友好的导航设计,难以找到连接到相关网页的路径,也没有提供有助于让访客/用户找到所需信息的帮助,用户体验非常糟糕。这篇文 章,我们尝试就网站导航交互做一些探讨。\u003c/p\u003e\n\u003cp\u003e首先对于WEB交互设计师来说,解决上面遇到的问题,使之简单的方法是设计一套完善的网页导航系统。\u003c/p\u003e\n\u003ch3 id=\"优化网站导航设计的目的\"\u003e优化网站导航设计的目的\u003c/h3\u003e\n\u003cp\u003e一个网站导航设计对提供丰富友好的用户体验有至关重要的地位,简单直观的导航不仅能提高网站易用性,而且在方便用户找到所要的信息后,可有助提高用 户转化率。\n如果把主页比作网站门面,那么导航就是通道,这些通道走向网站的每个角落,导航的设计是否合理对于一个网站是具有非常大意义的。\u003c/p\u003e\n\u003cp\u003e1) 决定用户在网站中穿梭浏览的体验,这一点是最基本的。\n2) 网站导航设计合理,可以将网站的内容和服务最大面积的展现在用户面前。\n3) 合理的导航设计可以增加用户黏性,提高网站的浏览深度,从而提高网站PV值。\n4) 促进用户消费,提高网站盈利。引导用户消费,将用户真正需要的产品和服务展示在他面前,甚至用户想不到的服务你也呈现。\n5) 提高网站广告价值,增加网站广告收益。\n……\u003c/p\u003e\n\u003ch3 id=\"网站导航的常见结构\"\u003e网站导航的常见结构\u003c/h3\u003e\n\u003cp\u003e雅虎的网页设计一直是国 …\u003c/p\u003e"
April 13, 2010
全方位清理浮动
"\u003cp\u003e清除浮动一个凡是做页面的人都会遇到的一个东西,但是是否大家都能够清楚的知道,全方位的了解呢?于是一闲下来了马上写了这样的一篇文章,不能讲面 面俱到,然而基本能将我所知道的倾囊相授了。\u003c/p\u003e\n\u003ch4 id=\"我们粗略的一起来看看清除浮动的办法一共有多少个ie里面用zoom1就不写了下一个专题再写对应的-demo\"\u003e我们粗略的一起来看看清除浮动的办法一共有多少个(IE里面用zoom:1就不写了,下一个专题再写)。对应的 \u003ca href=\"http://webteam.tencent.com/wp-content/uploads/2009/6/20090413_clearfloat.html\"\u003eDEMO\u003c/a\u003e\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e采用伪类:after进行后续空制的高度位零的伪类层清除\u003c/li\u003e\n\u003cli\u003e采用CSS overflow:auto的方式撑高\u003c/li\u003e\n\u003cli\u003e采用CSS overflow:hidden的方式产生怪异适应\u003c/li\u003e\n\u003cli\u003e采用display:table将对象变成table形式\u003c/li\u003e\n\u003cli\u003e采用div标签,以及css的clear属性\u003c/li\u003e\n\u003cli\u003e采用br标签,以及css的clear属性\u003c/li\u003e\n\u003cli\u003e采用br标签,以及其自身HTML的clear属性\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"粗略的看他们都能将问题解决然而他们另外一方面又有着各自的利弊一一对应\"\u003e粗略的看,他们都能将问题解决;然而他们另外一方面又有着各自的利弊。(一一对应)\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003e优点\u003c/strong\u003e结构语义化完全正确,不会产生其余的怪异问题。\n\u003cstrong\u003e缺点\u003c/strong\u003e复用方式不当容易造成代码量急剧增大。\n\u003cstrong\u003e建议\u003c/strong\u003e最外层轻浮动时使用,或清晰模块化复用方式的人使用。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e优点\u003c/strong\u003e结构语义化完全正确,代码量极少。\n\u003cstrong\u003e缺点\u003c/strong\u003e多个嵌套后,点击最外层的轻浮动框会遭成最外层至最内层内容全 …\u003c/li\u003e\u003c/ol\u003e"
April 13, 2010
页面重构中的模块化思维
"\u003cp\u003e最近被“模块化”缠身,又是文章又是PPT的,被逼着想了很多相关的东西。整理下我这段时间对于“模块化”的思考,大多都是我自己从事页面重构这份 工作的经验和理解,在一定程度上存在局限性,也希望自己能温故而知新。\u003c/p\u003e\n\u003cp\u003e“模块化”只是我们对于过去一直使用的技术、方法的一个新潮的称谓,就像“Ajax”。不过做为页面重构发展的一种趋势,越来越被大家重视,不自觉 也满口的“模块化”,只是你真的理解什么是“模块化”吗?\u003c/p\u003e\n\u003ch3 id=\"什么是模块化\"\u003e什么是模块化?\u003c/h3\u003e\n\u003cp\u003e对“模块化”的解释,在 \u003ca href=\"http://www.cnki.net/gycnki/gycnki.htm\"\u003eCNKI\u003c/a\u003e 中就有28种。可见“模块化”思维使用的广泛。最接近页面重构中的“模块化”,现有的解释应该就是软件开发中的解释了。\u003c/p\u003e\n\u003cp\u003e先看一下百度词条是怎么解释“ \u003ca href=\"http://baike.baidu.com/view/182267.htm\"\u003e模块化\u003c/a\u003e ”的:\u003c/p\u003e\n\u003cp\u003e模 块化是指解决一个复杂问题时自顶向下逐层把软件系统划分成若干模块的过程。每个模块完成一个特定的子功能,所有的模块按某种方法组装起来,成为一个整体, 完成整个系统所要求的功能。模块具有以下几种基本属性:接口、功能、逻辑、状态,功能、状态与接口反映模块的外部特性,逻辑反映它的内部特性。在软件的体 系结构中,模块是可组合、分解和更换的单元。\u003c/p\u003e\n\u003cp\u003e相关的书籍也蛮多的,有兴趣的同学可以搜一下。需 …\u003c/p\u003e"
April 13, 2010
用CSS 3将我们带入下一个高度吧!
"\u003cp\u003e\u003cstrong\u003e“\u003c/strong\u003e CSS 3 不是新事物,更不是只是围绕border-radius属性实现的圆角。它正耐心的坐在那里,已经准备好了首次登场,呷着咖啡,等着浏览器来铺上红地毯。 你看,浏览器需要跟上了…… \u003cstrong\u003e”\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e–谨以此文纪录ISD WEBTEAM 09年Q2力作:CSS 3.0 中文参考手册\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e背景\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e苏昱的《样式表中文手册》为代表的 CSS2.0参考资料伴随了国内众多web设计师们走过了近10年的时光,这种影响是深远的,但随着CSS技术的不断发展,设计师们多受传统资料的影响, 不能超脱现有的篱笆,给自己背上了沉重的包袱。你是否已注意到CSS 3已经蓄势待发?你是否渴望开始使用它们却又不知从何下手呢?正当CSS 3新特性备受期待的时候,我们的CSS3.0 中文参考手册就应运而生了……\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e什么是CSS 3?\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eCSS 是 Cascading Style Sheet 的缩写。译作「层叠样式表」。是用于(增强)控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。\u003c/p\u003e\n\u003cp\u003eCSS3.0 则表示下一版本的CSS,3.0是版本号。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCSS 3\u003c/strong\u003e \u003cstrong\u003e给我们带来了什么惊喜?\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eCSS3.0对于我们Web设计人员来说不只 是新奇的技 …\u003c/p\u003e"
April 13, 2010
[译]Efficient, maintainable CSS
"\u003ch4 id=\"翻译自-russ-weakley-的-efficient-maintainable-css\"\u003e翻译自 \u003ca href=\"http://www.maxdesign.com.au/\"\u003eRuss Weakley\u003c/a\u003e 的 \u003ca href=\"http://www.slideshare.net/maxdesign/efficient-maintainable-css-presentation\"\u003eEfficient, maintainable CSS\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003e翻译自Russ大师的一篇关于如何书写高效、可维护、组件化的CSS的演示文档。Enjoy~\u003c/p\u003e"
April 13, 2010
深入 CSS 行高
"\u003cp\u003e翻译自 \u003ca href=\"http://www.maxdesign.com.au/\"\u003eRuss Weakley\u003c/a\u003e 的\u003ca href=\"http://www.slideshare.net/maxdesign/line-height\"\u003eLine Height\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e一个简单的, step-by-step 关于 CSS 行高的演示文档, 涵盖行间距, 如何应用各种类型的行高值, 当然还有 inline box 模型介绍, 希望能满足您\n(但实战应用在中文字体或中英文字体混合,以及IE678,XP win7里,行高规则又有所不同,泪流满面)\u003c/p\u003e"
April 13, 2010
web组件分离
"\u003cp\u003e这里Web组件指Web服务器提供的所有基于URL访问的资源,比如动态内容,图片,Javascript脚本,CSS样式表\u003c/p\u003e\n\u003cp\u003e我们可以从以下几个方面来看这些Web组件的差异\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e文件大小\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e文件数量\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e内容更新频率\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e预计并发用户数\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e是否需要脚本解释器\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e是否涉及大量CPU计算\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e是否访问数据库\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e访问数据库的操作主要是读还是写\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e是否包含远程调用(RPC)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e值得一提的是,即便是同一Web组件,显然也存在特点的差异,比如负责呈现内容的动态网页和负责用户注册的动态网页,可以\u003c/p\u003e\n\u003cp\u003e视为不用的用户组件,再比如由用户上传的大尺寸照片和站点网页的小尺寸修饰图片也存在以上方面的差异,也可以将它们区分对待。\u003c/p\u003e\n\u003cp\u003eweb组件分离的目的是便于采用针对性的方法,使得各种Web组件能够充分利用服务器资源。如何实现web组件分离呢?\u003c/p\u003e\n\u003cp\u003e最常见的做法是拥有不同的域名:\u003c/p\u003e\n\u003cp\u003e如:img.run21.cn\u003c/p\u003e\n\u003cp\u003e存放网页中的图片,指向服务器A\u003c/p\u003e\n\u003cp\u003eupload.run21.cn\u003c/p\u003e\n\u003cp\u003e存放用户上传的照片,指向服务器B\u003c/p\u003e\n\u003cp\u003estatic.run21.cn\u003c/p\u003e\n\u003cp\u003e存放静态化的网页,指向服务器C\u003c/p\u003e\n\u003cp\u003ejs.run21.cn\u003c/p\u003e\n\u003cp\u003e存放javascript …\u003c/p\u003e"
April 13, 2010
如何构建高性能Web站点
"\u003cp\u003e人们评估一个web站点的性能如何,通常先置身于用户的角度,访问该站点的一系列页面,体验等待时间\u003c/p\u003e\n\u003cp\u003e在等待的时间里,大概经历了以下几部分的时间\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e数据在网络上的传输时间\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e站点服务器处理请求并生成回应数据的时间\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e浏览器本地计算和渲染的时间\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e作为web开发人员, 大部份情况下只要从”站点服务器处理请求并生成回应数据的时间”这点去考虑和设计, 尽量的减少在这一过程的时间,针对提高站点性能上的优化大概总结有如下方案.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1. 增加宽带\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2. 减少网页的http请求\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e在不影响美观和功能的情况下,尽量减少图片和脚本\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e将多个图片合并为一个文件,利用CSS背景图片和偏移技术呈现在网页中,避免多个图片的下载\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e合并Javascript或者CSS\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e使用浏览器端的Cache策略,减少重复下载\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e3.加快服务器脚本运算速度\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e脚本语言编写的程序文件需要通过相应的脚本解释器进行解释后生成中间代码,脚本加速就是在这一过程中减少生成中间代码的时间。对于一些拥有较强商业 支持的脚本语言 ,比如Java和ASP.NET,均有内置的优化方案,如解释器对某个脚本程序第一次解释的时候,将中间代码缓存起 …\u003c/p\u003e"
April 7, 2010
YSlow 使用指南_最新2.0使用指南中文版
"\u003cp\u003eYSlow分析网页,并提出如何提高其性能的基础上一套规则,高性能的网页。我搜索一下”Yslow使用说明“,发现都是旧版本Yslow的使用介 绍。于是翻译了一下yahoo官方关于新版Yslow的的使用帮助,希望给初次使用Yslow的朋友一些帮助。\u003c/p\u003e\n\u003cp\u003e注:英文不是很好,对着翻译软件翻译的,有不对的地方,大家指正。\u003c/p\u003e\n\u003ch4 id=\"安装-yslow\"\u003e安装 YSlow\u003c/h4\u003e\n\u003cp\u003e先安装 Firebug \u003ca href=\"https://addons.mozilla.org/en-US/firefox/addon/1843\"\u003ehttps://addons.mozilla.org/en-US/firefox/addon/1843\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eFirebug 帮助文档 \u003ca href=\"http://www.getfirebug.com/docs.html\"\u003ehttp://www.getfirebug.com/docs.html\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e再下载安装 \u003ca href=\"http://developer.yahoo.com/yslow\"\u003ehttp://developer.yahoo.com/yslow\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e使用Yslow\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eYslow是运行在Firebug窗口下,所有要运行Yslow,必须安装Firebug。\u003c/p\u003e\n\u003cp\u003e有两种方法启动Yslow\u003c/p\u003e\n\u003cp\u003e1、打开Firebug窗口,选择Yslow选项。\u003c/p\u003e\n\u003cp\u003e2、直接点击浏览器右下角的Yslow启动按钮。\u003c/p\u003e\n\u003cp\u003e你第一次打开Yslow时,以下图像作为Firebug的一部分被显示在的浏览器窗口。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2010/04/yslow_1.png\" title=\"/wp-content/uploads/2010/04/yslow_1.png\"\u003e\u003cimg src=\"/wp-content/uploads/2010/04/yslow_1.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e点击 \u003cstrong\u003eRun Test\u003c/strong\u003e 运行Yslow, …\u003c/p\u003e"
April 7, 2010
Apache Cache Last-Modified、Expires和Etag相关工作原理
"\u003cp\u003e\u003ca href=\"http://blog.prosight.me/index.php/2009/08/313\"\u003e使用ETag和Expires调优web 服务器性能\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e正确使用Etag和Expires标识处理,可以使得页面更加有效被Cache。\u003c/p\u003e\n\u003cp\u003e在客户端通过浏览器发出第一次请求某一个URL时,根据 HTTP 协议的规定,浏览器会向服务器传送报头(Http Request Header),服务器端响应同时记录相关属性标记(Http Reponse Header),服务器端的返回状态会是200,格式类似如下:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eHTTP/1.1 200 OK\u003c/p\u003e\n\u003cp\u003eDate: Tue, 03 Mar 2009 04:58:40 GMT\u003c/p\u003e\n\u003cp\u003eContent-Type: image/jpeg\u003c/p\u003e\n\u003cp\u003eContent-Length: 83185\u003c/p\u003e\n\u003cp\u003eLast-Modified: Tue, 24 Feb 2009 08:01:04 GMT\u003c/p\u003e\n\u003cp\u003eCache-Control: max-age=2592000\u003c/p\u003e\n\u003cp\u003eExpires: Thu, 02 Apr 2009 05:14:08 GMT\u003c/p\u003e\n\u003cp\u003eEtag: “5d8c72a5edda8d6a:3239″\u003c/p\u003e\n\u003cp\u003e客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送报头(Http Request …\u003c/p\u003e"
December 22, 2009
Firebug 必须掌握的技巧
"\u003cp\u003e\u003cstrong\u003e脚本调试\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e第一步:设置中断(鼠标左键点击)\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/01.jpg\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e第二步:输入中断条件(可选功能,鼠标右键点击红点)\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/02.jpg\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e第三步:触发中断(当符合条件是,中断被触发)\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/03.jpg\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e出现中断后,我们可以看到在右边出现了这样一个选项卡【监控、堆栈、断点】\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/04.jpg\" alt=\"\"\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cstrong\u003e第一个选项卡:监控\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e如过需要查看某个对象的值,可以点击新建监控表达式,例如输入对象的名称:subMenu\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/05.jpg\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e我们就可以看到subMenu的类型是DIV,点击展开内容,是subMenu这个对象的各个属性和方法\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/06.jpg\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e第二个选项卡:堆栈\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e内容显示的是当前中断点程序的调用顺序,在这个例子中是先触发了 onmouseover,然后调用了shownav\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/07.jpg\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e第三个选项卡:断点\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e可以设置多个断点,或者删除断点\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/08.jpg\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCSS调试\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e上面出现了3个index.jsp,说明在这个index.jsp中出现了3处css碎片。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/09-20230904194935166.jpg\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e点击css的值,可以进行修改,即时反映到页面上。点击禁止符号,则可以屏蔽该行CSS。\u003c/p\u003e\n\u003cp\u003e双击空白处,新增CSS规则。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://www.blueidea.com/articleimg/2009/12/7284/10.jpg\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e原文: \u003ca href=\"http://home.blueidea.com/space.php?uid=498022\u0026amp;do=blog\u0026amp;id=16837\"\u003ehttp://home.blueidea.com/space.php?uid=498022\u0026amp;do=blog\u0026amp;id=16837\u003c/a\u003e\u003c/p\u003e"
December 17, 2009
网站开发与UML
"\u003cp\u003e来源: \u003ca href=\"http://hi.baidu.com/hanling8108/blog/item/4579902b0a505d315343c125.html\"\u003ehttp://hi.baidu.com/hanling8108/blog/item/4579902b0a505d315343c125.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、概述\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eWeb网站往往具有复杂与高度动态的特点。为了让Web应用在短时间之内开始运作,开发周期应该尽量地短。许多时候,开发者直接进入编写代码这 一阶段,却不去仔细考虑自己想要构造的是什么样的网站以及准备如何构造:服务器端代码往往是毫无准备的即兴式编写,数据库表也是随需随加,整个应用的体系 有时候呈现一种无规划状态。然而,只要我们运用一些建模技术和软件工程技术,就能够让开发过程更加流畅,确保Web应用将来更容易维护。\u003c/p\u003e\n\u003cp\u003eUML(Unified Modeling Language,统一建模语言)是一种通用的可视化建模语言,用于对软件进行描述、可视化处理、构造和建立软件系统的文档。UML适用于各种软件开发方 法、软件生命周期的各个阶段、各种应用领域以及各种开发工具。UML能够描述系统的静态结构和动态行为:静态结构定义了系统中重要对象的属性和操作以及这 些对象之间的相互关系;动态行为定义了对象的时间特性和对象为完成目标任务而相互进行通信的机 …\u003c/p\u003e"
November 2, 2009
12款Javascript表格控件(DataGrid)
"\u003cp\u003e\u003cstrong\u003e12款 \u003ca href=\"http://paranimage.com/category/dede/javascript/\"\u003eJavaScript\u003c/a\u003e 表格控件\u003c/strong\u003e。 表格控件(DataGrid )允许最终用户阅读和写入到绝大多数数据库的应用程序。DataGrid 控件可以在设计时快速进行配置,只需少量代码或无需代码。当在设计时设置了DataGrid 控件的 DataSource 属性后,就会用数据源的记录集来自动填充该控件,以及自动设置该控件的列标头。然后您就可以编辑该网格的列;删除、重新安排、添加列标头、或者调整任意一 列的宽度。\u003c/p\u003e\n\u003ch4 id=\"1-flexigrid\"\u003e1. \u003ca href=\"http://www.flexigrid.info/\"\u003eFlexigrid\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2009/11/flexigrid.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/flexigrid.jpg\" alt=\"flexigrid\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eFlexigrid是一个类似于Ext Gird,但基于jQuery开发的Grid。它具有的功能包括:可以调整列宽,合并列标题,分页,排序,显示/隐藏表格等。Flexigrid显示的数据能够通过Ajax获取或者从一个普通的表格转换。\u003c/p\u003e\n\u003ch4 id=\"2-yahoo-ui-library-datatable--演示地址\"\u003e2. \u003ca href=\"http://developer.yahoo.com/yui/datatable/\"\u003eYahoo! UI Library: DataTable\u003c/a\u003e ( \u003ca href=\"http://developer.yahoo.com/yui/examples/datatable/index.html\"\u003e演示地址\u003c/a\u003e)\u003c/h4\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2009/11/yahoo-ui-libray-datetable.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/yahoo-ui-libray-datetable.jpg\" alt=\"yahoo-ui-libray-datetable\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e该DataTable控件提供的功能有:排序、列宽调整、分页、inline editing、row selection等。\u003c/p\u003e\n\u003ch4 id=\"3-jqgrid\"\u003e3. \u003ca href=\"http://www.trirand.com/blog/\"\u003ejqGrid\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2009/11/jqgrid.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/jqgrid.jpg\" alt=\"jqgrid\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003ejqGrid是一个Ajaxed jQuery Grid插件。提供分页功能,添加、编辑、删除和搜索表 …\u003c/p\u003e"
October 14, 2009
通过在UL标签应用相关的css类,实现对LI的控制
"\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eaaaaaaaaaaaaaaaaaaaaa\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ebbbbbbbbbbbbbbbbbb\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eaaaaaaaaaaaaaaaaaaaaa\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ebbbbbbbbbbbbbbbbbb\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e"
June 7, 2009
jQuery/Ajax/PHP/Json 的一个综合例子
"\u003cp\u003ejQuery 是一个优秀的 Javascript 框架,对 js 进行了优秀的包装,提供了许多方便的功能。jQuery 对 ajax 的包装也堪称优秀。\u003c/p\u003e\n\u003cp\u003ejQuery 可以以 json 文件传输协议来传输数据(类似 xml,而且大有取代 xml 的趋势),而网站后台代码必须与之配合使用。PHP 是用 json_encode 函数来对返回的数组数据进行编码的,但这个函数只有 PHP5.2版本以上才支持。\u003c/p\u003e\n\u003cp\u003e从网上找到一个 json 的操作类,本人在 PHP4.4.7 版本下测试通过。本人还建了个函数 function my_json_encode($phparr),使代码兼容 PHP5.2 以上版本。\u003c/p\u003e\n\u003cp\u003e示例代码(包括 json 的类包软件)可以在以下网址下载:\u003c/p\u003e\n\u003cp\u003e以下是全部代码:\u003c/p\u003e\n\u003cp\u003ejQuery Ajax 实例演示\u003c/p\u003e\n\u003cp\u003e输入姓名:\u003c/p\u003e\n\u003cp\u003e输入年龄:\u003c/p\u003e\n\u003cp\u003e输入性别:\u003c/p\u003e\n\u003cp\u003e输入工作:\u003c/p\u003e\n\u003cp\u003e提交POST提交GET提交\u003c/p\u003e\n\u003cp\u003ePHP 文件 ajax_json.php:\u003c/p\u003e\n\u003cp\u003eencode($phparr);\n}\n}\n?\u0026gt;\u003c/p\u003e"
June 3, 2009
jquery 轻松实现 双击编辑文本框
"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026lt;script type=\u0026#34;text/javascript\u0026#34;\u0026gt;\n$(document).ready(function(){\n\t$(\u0026#34;.update\u0026#34;).dblclick(function(){\n\t\tid = $(this).attr(\u0026#39;id\u0026#39;);\n\t\ttext = $(this).text();\n\t\t\tif(text){\n\t\t\t$(this).html(\u0026#34;\u0026lt;input type=\u0026#39;text\u0026#39; size=12 name=\u0026#34;+id+\u0026#34; value=\u0026#34;+text+\u0026#34;\u0026gt;\u0026#34;);\n\t\t\t$(\u0026#34;.update \u0026gt; input\u0026#34;).focus().blur(function(){\n\t\t\t\t$.ajax({\n\t\t\t\t type: \u0026#34;POST\u0026#34;,\n\t\t\t\t url: \u0026#34;/data/dbedit\u0026#34;,\n\t\t\t\t data: …\u003c/code\u003e\u003c/pre\u003e"
May 21, 2009
FireFox 3.5+ 已不再支持 -moz-opacity
"\u003cp\u003e安装了FireFox3.5之后,发现以前项目网页中有透明属性的一些DIV都不透明了。于是猜想,FireFox3.5难道不支持它自家的CSS透明属性-moz-opacity了?上网一查,果真如此。\n在 \u003ca href=\"https://developer.mozilla.org/En/CSS:-moz-opacity\"\u003ehttps://developer.mozilla.org/En/CSS:-moz-opacity\u003c/a\u003e 里说得很清楚了:\nNote: Firefox 3.5 and later do not support -moz-opacity. By now, you should be using simply opacity.\n现在都要改用opacity这个属性。\u003c/p\u003e\n\u003cp\u003e于是要设置一下透明度为60%的DIV就应该这样写了:\ndiv.transp { /* make the div translucent */\nopacity: 0.6; /* Firefox, Safari(WebKit), Opera)\nfilter: “alpha(opacity=60)”; /* IE 8 */\nfilter: alpha(opacity=60); /* IE 4-7 */ …\u003c/p\u003e"
May 21, 2009
addEventListener的参数说明
"\u003cp\u003e我想大家对这个函数的前两个参数已经很了解了吧,主要是第三个参数不很好理解。我查了一些资料,弄明白了这个问题,所以记录下来了。下面的内容,基本上是参考别人的。\u003c/p\u003e\n\u003cp\u003e第三个参数叫做useCapture,是一个boolean值,就是true or false,如果是rue的话就是浏览器会使用Capture方式,false的话是Bubbling,只有在特定状况下才会有影响,通常建议是false,而会有影响的情形是目标元素(target element)有父元素(ancestor element),而且也有同样的事件对应函数,我想,看图比较清楚。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2009/05/f781ff0f5563e6386159f31f.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2009/05/f781ff0f5563e6386159f31f.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e像這張圖所顯示的,我的範例有兩層div元素,而且都設定有click事件,一般來說,如果我在內層藍色的元素上click不只會觸發藍色元素的click事件,還會同時觸發紅色元素的click事件,而useCapture這個參數就是在控制這時候兩個click事件的先後順序。如果是false,那就會使用bubbling,他是從內而外的流程,所以會先執行藍色元素的click事件再執行紅色元素的click事件,如果是true,那就是capture,和bubbling相 …\u003c/p\u003e"
May 21, 2009
attachEvent与addEventListener区别
"\u003cp\u003e适应的浏览器版本不同,同时在使用的过程中要注意\nattachEvent方法 按钮onclick\naddEventListener方法 按钮click\u003c/p\u003e\n\u003cp\u003e有关addEventListener函数的相关参数 \u003ca href=\"/index.php/archives/1429\"\u003e请点击这里查看\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e两者使用的原理:可对执行的优先级不一样,下面实例讲解如下:\nattachEvent方法,为某一事件附加其它的处理事件。(不支持Mozilla系列)\u003c/p\u003e\n\u003cp\u003eaddEventListener方法 用于 Mozilla系列\u003c/p\u003e\n\u003cp\u003e举例: document.getElementById(“btn”).onclick = method1;\ndocument.getElementById(“btn”).onclick = method2;\ndocument.getElementById(“btn”).onclick = method3;如果这样写,那么将会只有medhot3被执行\u003c/p\u003e\n\u003cp\u003e写成这样:\nvar btn1Obj = document.getElementById(“btn1”); //object.attachEvent(event,function); …\u003c/p\u003e"
April 16, 2009
firefox不支持window.event的解决办法
"\u003cp\u003e在最前面的javascript加上以下语句:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e//首先,定义一个全局的event\u003c/li\u003e\n\u003cli\u003eif( typeof(window.event)==“undefined” ){\u003c/li\u003e\n\u003cli\u003eeval(“var event = new Object;”);\u003c/li\u003e\n\u003cli\u003e}\u003c/li\u003e\n\u003c/ol\u003e"
December 24, 2008
dreamweaver在onLoad运行RecordsetFind.htm时出错的解决办法
"\u003cp\u003e今天单位的Dreamweaver出错了,折腾了半天,重新装了8.02,出现下面的错误:\n\u003cstrong\u003e在onLoad运行RecordsetFind.htm时\u003c/strong\u003e, \u003cstrong\u003e发生了以下\u003c/strong\u003e JavaScript错误:\u003c/p\u003e\n\u003cp\u003e在文件””RecordsetFind””:\u003c/p\u003e\n\u003cp\u003eReferenceError:findRs is not defined\u003c/p\u003e\n\u003cp\u003e卸载掉了,删除安装目录下的文件夹,清除注册表相应的项目,重装,问题依旧,郁闷!\n再次卸载,装老版的DW 2004, 也出现部分菜单打不开,点击就不停的抱错,汗!再次装8.02,还是不成,网上也搜不到任何解决方法。无意中删除C:Documents and SettingsAdministratorApplication DataMacromedia把Dreamweaver 8 这个文件夹,另外清寒要删除”Common”这个文件夹,重新打开dw ,居然ok了,呵呵,果真是天无绝人之路!\u003c/p\u003e"
December 19, 2008
用YSlow分析我们页面
"\u003cp\u003eYSlow是yahoo美国开发的一个页面评分插件,非常的棒,从中我们可以看出我们页面上的很多不足,并且可以知道我们改怎么却改进和优化。仔细研究了下YSlow跌评分规则。主要有12条:1. \u003ca href=\"http://developer.yahoo.com/performance/rules.html#num_http\"\u003eMake fewer HTTP requests\u003c/a\u003e尽可能少的http请求。。我们有141个请求(其中15个JS请求,3个CSS请求,47个CSS background images请求),多的可怕。思考了下,为什么把这个三种请求过多列为对页面加载的重要不利因素呢,而过多的IMG请求并没有列为不利因素呢?发现原来这些请求都是可以避免的。15个JS和3个CSS完全可以通过特殊的办法进行合并(这个技术部已经帮我们解决了,实在是太感谢了,嘿嘿。),这样合并以后,一般情况下页面上只会出现一个JS和一个CSS(对JS的封装得有一定的要求)。但是47个CSS background images请求改怎么解决呢?为什么页面上的纯IMG请求时合理的,而CSS background images请求过多就是不利因素了呢。这个我想了很久,总算明白,原来是这样的:一般页面上的ICON,栏目背景啊, 图片按钮啊,我们都会用图 …\u003c/p\u003e"
November 26, 2008
jquery下拉菜单特效演示
"\u003cp\u003e出自:http://be.twixt.us/jquery/suckerFish.php\u003c/p\u003e\n\u003ch1 id=\"jquery--suckerfish-style\"\u003e\u003ca href=\"http://blog.haohtml.com/wp-admin/\"\u003ejQuery\u003c/a\u003e » SuckerFish Style\u003c/h1\u003e\n\u003ch2 id=\"purpose\"\u003ePurpose\u003c/h2\u003e\n\u003cp\u003eReplicate Suckerfish Menus.\u003c/p\u003e\n\u003ch3 id=\"original-code\"\u003eOriginal Code\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$(document).ready(function(){\n\t$(\u0026#34;#nav-one li\u0026#34;).hover(\n\t\tfunction(){ $(\u0026#34;ul\u0026#34;, this).fadeIn(\u0026#34;fast\u0026#34;); },\n\t\tfunction() { }\n\t);\n\tif (document.all) {\n\t\t$(\u0026#34;#nav-one li\u0026#34;).hoverClass (\u0026#34;sfHover\u0026#34;);\n\t}\n});\n\n$.fn.hoverClass = function(c) {\n\treturn this.each(function(){\n\t\t$(this).hover(\n\t\t\tfunction() { $(this).addClass(c); },\n\t\t\tfunction() { …\u003c/code\u003e\u003c/pre\u003e"
November 12, 2008
link和@import引用css文件方法的区别
"\u003cp\u003e元素所参考的样式用户可以自由的选择加以改变,而导入的样式表单就自动的与剩下的样式表融合在一起了\u003c/p\u003e\n\u003cp\u003eCSS与HTML文档结合的4中方法:\u003c/p\u003e\n\u003cp\u003e1 使用元素链接到外部的样式文件\u003c/p\u003e\n\u003cp\u003e2 在元素中使用”style”元素来指定\u003c/p\u003e\n\u003cp\u003e3 使用CSS “@import”标记来导入样式表单\u003c/p\u003e\n\u003cp\u003e4 在内部的元素中使用”style”属性来定义样式\u003c/p\u003e\n\u003cp\u003e一个例子:\u003c/p\u003e\n\u003cp\u003ecss demo\u003c/p\u003e\n\u003cp\u003e第一种是直接在html页面上进行css书写,而第二种和第三种是采用外部引用样式单独提取文件。\u003c/p\u003e\n\u003cp\u003e问题1.到底link和@import有什么区别?\u003c/p\u003e\n\u003cp\u003e我们先来看看他们的定义\u003c/p\u003e\n\u003cp\u003elink元素\u003c/p\u003e\n\u003cp\u003eHTML和XHTML都有一个结构,它使网页作者可以增加于HTML文档相关的额外信息。这些额外资源可以是样式化信息(CSS)、导航助手、属于另 外形式的信息(RSS)、联系信息等等。\u003c/p\u003e\n\u003cp\u003e@import\u003c/p\u003e\n\u003cp\u003e指定导入的外部样式表及目标设备类型。\u003c/p\u003e\n\u003cp\u003e其实link和@import的最根本区别就是,\u003cstrong\u003elink\u003c/strong\u003e 是一个 \u003cstrong\u003ehtml\u003c/strong\u003e 的一个标签 ,而**@import** 是 \u003cstrong\u003ecss\u003c/strong\u003e 的一个标签 ,\u003c/p\u003e\n\u003cp\u003elink除了调用css外还可以有其他作用譬如声明页面链接属性,声明目录,rss等等, …\u003c/p\u003e"
November 4, 2008
JavaScript isNaN() 函数
"\u003ch2 id=\"义和用法\"\u003e义和用法\u003c/h2\u003e\n\u003cp\u003eisNaN() 函数用于检查其参数是否是非数字值。\u003c/p\u003e\n\u003ch3 id=\"语法\"\u003e语法\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eisNaN(x)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e参数\u003c/p\u003e\n\u003cp\u003e描述\u003c/p\u003e\n\u003cp\u003ex\u003c/p\u003e\n\u003cp\u003e必需。要检测的值。\u003c/p\u003e\n\u003ch3 id=\"返回值\"\u003e返回值\u003c/h3\u003e\n\u003cp\u003e如果 x 是特殊的非数字值 NaN(或者能被转换为这样的值),返回的值就是 true。如果 x 是其他值,则返回 false。\u003c/p\u003e\n\u003ch3 id=\"说明\"\u003e说明\u003c/h3\u003e\n\u003cp\u003eisNaN() 函数可用于判断其参数是否是 NaN,该值表示一个非法的数字(比如被 0 除后得到的结果)。\u003c/p\u003e\n\u003cp\u003e如果把 NaN 与任何值(包括其自身)相比得到的结果均是 false,所以要判断某个值是否是 NaN,不能使用 == 或 === 运算符。正因为如此,isNaN() 函数是必需的。\u003c/p\u003e\n\u003ch2 id=\"提示和注释\"\u003e提示和注释\u003c/h2\u003e\n\u003cp\u003e提示:isNaN() 函数通常用于检测 parseFloat() 和 parseInt() 的结果,以判断它们表示的是否是合法的数字。当然也可以用 isNaN() 函数来检测算数错误,比如用 0 作除数的情况。\u003c/p\u003e\n\u003ch2 id=\"实例\"\u003e实例\u003c/h2\u003e\n\u003cp\u003e在本例中,我们将使用 isFinite() 在检测无穷数:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026lt;script type=\u0026#34;text/javascript\u0026#34;\u0026gt;\n\ndocument.write(isFinite(123)) …\u003c/code\u003e\u003c/pre\u003e"
November 4, 2008
JavaScript push() 方法
"\u003ch2 id=\"定义和用法\"\u003e定义和用法\u003c/h2\u003e\n\u003cp\u003epush() 方法可向数组的末尾添加一个或多个元素,并返回新的长度。\u003c/p\u003e\n\u003ch3 id=\"语法\"\u003e语法\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003earrayObject.push(newelement1,newelement2,....,newelementX)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e参数\u003c/p\u003e\n\u003cp\u003e描述\u003c/p\u003e\n\u003cp\u003enewelement1\u003c/p\u003e\n\u003cp\u003e必需。要添加到数组的第一个元素。\u003c/p\u003e\n\u003cp\u003enewelement2\u003c/p\u003e\n\u003cp\u003e可选。要添加到数组的第二个元素。\u003c/p\u003e\n\u003cp\u003enewelementX\u003c/p\u003e\n\u003cp\u003e可选。可添加多个元素。\u003c/p\u003e\n\u003ch3 id=\"返回值\"\u003e返回值\u003c/h3\u003e\n\u003cp\u003e把指定的值添加到数组后的新长度。\u003c/p\u003e\n\u003ch3 id=\"说明\"\u003e说明\u003c/h3\u003e\n\u003cp\u003epush() 方法可把它的参数顺序添加到 arrayObject 的尾部。它直接修改 arrayObject,而不是创建一个新的数组。push() 方法和 pop() 方法使用数组提供的先进后出栈的功能。\u003c/p\u003e\n\u003ch2 id=\"提示和注释\"\u003e提示和注释\u003c/h2\u003e\n\u003cp\u003e注释:该方法会改变数组的长度。\u003c/p\u003e\n\u003cp\u003e提示:要想数组的开头添加一个或多个元素,请使用 unshift() 方法。\u003c/p\u003e\n\u003ch2 id=\"实例\"\u003e实例\u003c/h2\u003e\n\u003cp\u003e在本例中,我们将创建一个数组,并通过添加一个元素来改变其长度:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026lt;script type=\u0026#34;text/javascript\u0026#34;\u0026gt;\n\nvar arr = new Array(3)\narr[0] = …\u003c/code\u003e\u003c/pre\u003e"
November 2, 2008
让iframe失效,使自己的网站不怕iframe挂马
"\u003cp\u003e\u003cstrong\u003e方法一:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e"FSO功能:"-”关闭站点Fso功能”.将站点的fso功能关闭掉.这样子基本上就可以杜绝目前的asp木马.如果需要上传附件的话.可以通过”SAFileUp”.”aspupload”.等组件进行上传.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e方法二:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e辛辛苦苦做的网站突然被挂马,究其原因是因为网页带病毒,打开代码发现所有的页面的代码最后一行都多了一句:\u003c/p\u003e\n\u003cp\u003e引用内容\u003c/p\u003e\n\u003cp\u003e\u0026lt; IFRAME src=”http://www.xxx.xxx “\u0026gt;\u0026lt; /IFRAME \u0026gt;\u003c/p\u003e\n\u003cp\u003e打开引用页面一看防病毒软件一顿乱响,找到元凶了这可怎办?\u003c/p\u003e\n\u003cp\u003e最后一行怎么弄都不行?!!\u003c/p\u003e\n\u003cp\u003e其实很简单我们只需要在 \u0026lt; STYLE \u0026gt;\u0026lt; / STYLE \u0026gt; 之间加上一句\u003c/p\u003e\n\u003cp\u003e完整如下:\u003c/p\u003e\n\u003cp\u003e程序代码\u003c/p\u003e\n\u003cp\u003e就可以了其实这是用了CSS样式表来对网页中所有的FRAME对象进行”洗脑”把iframe中的src属性的值换成空白页这样加进去的iFRAME 代码就不起作用了。\u003c/p\u003e\n\u003cp\u003e这个解决方案除了IFRAME里面的JS代码alert方法不能屏蔽之外,其他任意JS都可以不起作用。\u003c/p\u003e\n\u003cp\u003e如果要使自己的IFRAME显示在网页里,别人挂的IFRAME马都不起作 …\u003c/p\u003e"
September 27, 2008
js中arguments.length的意思
"\u003cp\u003efunction imagePreload() {\nvar imgPreload = new Image();\nfor (i = 0; i \u0026lt; arguments.length; i++) {\nimgPreload.src = arguments[i];\n}\n}\n\u003cstrong\u003eimagePreload(‘001.gif’, ‘002.gif’, ‘003.gif’, ‘004.gif’, ‘005.gif’)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e这个是js中的arguments.主要是可以对输入的参数进行跟踪。\n这如作者所举出的例子:imagePreload函数出入了5个参数,所以在js代码中的\narguments.length会知道你输入的了5个参数。并可以通过索引器获得五个参数的值。\u003c/p\u003e"
May 20, 2008
FCKEditor——添加自定义工具栏
"\u003cp\u003e FCKEditor是一个功能强大的开源在线编辑器,所以是非常适合我等兜兜无啥银子的人拿来“把玩”的~~~呵呵。一个产品即使功能再强大也不能满足所有用户的需求,当然FCKEditor也不例外咯。就拿我现在所开发的一个系统(工作流)来说,就遇到了FCKEditor不能满足我的要求的情况。因为我想在工具栏中加入自己的操作控制按钮,配置当然搞不定咯,就只有改源代码了。可一看FCKEditor经过处理后的JS源码,头立刻就大了——无换行无注释,一大堆JS代码堆在那里,想看懂几乎没门。当然它这样做也是有好处的,要不这大的一个东西加载怎么会那么快呢。看不懂处理后的JS源码,我们可以看有格式的源码嘛,所以就上网down了一个2.4的FCKEditor。好了,现在就让我们开始怎么一步一步的加入我们自己的操作菜单到工具栏中去。\u003c/p\u003e\n\u003cp\u003e 比如我想加一个我自己的输入框用来控制日期的输入,即该输入框只能通过选择来选择日期,这个我们结合日期控件my97来做,呵呵,充分利用已有的成果。有人会说,我直接改它的对话框不就得了,当然这也是可以的,可我们今天要做的就是如何加入自己的工具栏操作,这样以后就可以依次类推, …\u003c/p\u003e"
March 1, 2008
mootools 教程
"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emootools【一】- 起步篇\n以前一直在用prototype.js,最近发现了mootools,据说也相当不错,它是个纯OO的javascript 框架,所以拿来学习学习,把学习经过记录下来。\n粗略看了下,mootools很貌似prototype,所以用过prototype框架的人应该很容易上手的。\nmootools提供的功能高度模块化,可以根据实际需要来裁剪。\n它的核心库是Moo.js和Utility.js,Moo.js里包含了实现OO的基础类,Utility.js提供了最常用的工具函数的封装。\n---------------------------Moo.js-------------------------------------\nprototype.js里提供了如下形式来创建我们的对象:\nvar Cat = Class.create();\nPerson.prototype = {\ninitialize: function(name){\nthis.name = name;\n}\n};\nvar cat = new Cat (\u0026#39;kitty\u0026#39;); …\u003c/code\u003e\u003c/pre\u003e"
March 1, 2008
mootools基本XMLHttpRequest的包装类
"\u003ch1 id=\"top-xhrjs\"\u003e\u003ca href=\"http://www.seoeye.org/mootools/XHR.htm#MainTopic\"\u003etop\u003c/a\u003e XHR.js\u003c/h1\u003e\n\u003cp\u003e包含了基本的 XMLHttpRequest 类的包装〿\u003c/p\u003e\n\u003ch4 id=\"license\"\u003eLicense\u003c/h4\u003e\n\u003cp\u003eMIT-style license.\u003c/p\u003e\n\u003cp\u003e概要\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.seoeye.org/mootools/XHR.htm#XHR.js\"\u003eXHR.js\u003c/a\u003e\n包含了基本的 XMLHttpRequest 类的包装〿\n\u003ca href=\"http://www.seoeye.org/mootools/XHR.htm#XHR\"\u003eXHR\u003c/a\u003e\n基本皿XMLHttpRequest的包装类\n\u003ca href=\"http://www.seoeye.org/mootools/XHR.htm#XHR.Properties\"\u003e属怿/a\u0026gt;\u003c/a\u003e\u003ca href=\"http://www.seoeye.org/mootools/XHR.htm#XHR.setHeader\"\u003esetHeader\u003c/a\u003e\n添加/修改请求的Header\n\u003ca href=\"http://www.seoeye.org/mootools/XHR.htm#XHR.send\"\u003esend\u003c/a\u003e\n打开XMLHttpRequest连接并发送数捿/td\u0026gt;\n\u003ca href=\"http://www.seoeye.org/mootools/XHR.htm#XHR.cancel\"\u003ecancel\u003c/a\u003e\n取消正在执行的请汿\u003c/p\u003e\n\u003ch2 id=\"top-xhr\"\u003e\u003ca href=\"http://www.seoeye.org/mootools/XHR.htm#MainTopic\"\u003etop\u003c/a\u003e XHR\u003c/h2\u003e\n\u003cp\u003e基本皿XMLHttpRequest的包装类\u003c/p\u003e\n\u003ch4 id=\"参数\"\u003e参数\u003c/h4\u003e\n\u003cp\u003eoptions\u003c/p\u003e\n\u003cp\u003e一个请求的配置对象。参考下面的可选项\u003c/p\u003e\n\u003ch4 id=\"可选项\"\u003e可选项\u003c/h4\u003e\n\u003cp\u003emethod\u003c/p\u003e\n\u003cp\u003e’post’ 房‘get’ – 请求的协访 可选,默认丿lsquo;post’.\u003c/p\u003e\n\u003cp\u003easync\u003c/p\u003e\n\u003cp\u003e是否是异步。默认为true.\u003c/p\u003e\n\u003cp\u003eencoding\u003c/p\u003e\n\u003cp\u003e数据编码。默认为utf-8.\u003c/p\u003e\n\u003cp\u003eautoCancel\u003c/p\u003e\n\u003cp\u003e自动取消前一个正在执行的请求。默认为false.\u003c/p\u003e\n\u003cp\u003eheaders\u003c/p\u003e\n\u003cp\u003e一个请求头的配置对豿\u003c/p\u003e\n\u003ch4 id=\"事件\"\u003e事件\u003c/h4\u003e\n\u003cp\u003eonRequest\u003c/p\u003e\n\u003cp\u003e请求发送时触发\u003c/p\u003e\n\u003cp\u003eonSuccess\u003c/p\u003e\n\u003cp\u003e请求完成时触叿\u003c/p\u003e\n\u003cp\u003eonStateChange\u003c/p\u003e\n\u003cp\u003eXMLHttpRequest状态发生改 …\u003c/p\u003e"
March 1, 2008
mootools的学习资源
"\u003cp\u003e一.教程/文章/代码实例:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://clientside.cnet.com/wiki/mootorial/\"\u003ehttp://clientside.cnet.com/wiki/mootorial/\u003c/a\u003e — The Mootorial:比较完整的mootools教程\n \u003ca href=\"http://solutoire.com/2007/02/16/mootools-ajax-xhr-classes/\"\u003ehttp://solutoire.com/2007/02/16/mootools-ajax-xhr-classes/\u003c/a\u003e — ajax 和 XHR\n \u003ca href=\"http://solutoire.com/2007/01/31/mootools-10-whats-new/\"\u003ehttp://solutoire.com/2007/01/31/mootools-10-whats-new/\u003c/a\u003e — Mootools 1.0: What’s new\n \u0026quot; \u003ca href=\"http://solutoire.com/2006/12/25/porting-prototype-enumerable-functions-to-mootools-array-objects/\"\u003ehttp://solutoire.com/2006/12/25/porting-prototype-enumerable-functions-to-mootools-array-objects/\u003c/a\u003e — 将 Prototype的Enumerable移植到Mootools Array\n \u003ca href=\"http://www.coryhudson.com/blog/2006/09/12/extending-objects-and-classes-with-mootools/\"\u003ehttp://www.coryhudson.com/blog/2006/09/12/extending-objects-and-classes-with-mootools/\u003c/a\u003e — 用mootools …\u003c/p\u003e"
March 1, 2008
基于mootools重写js(tab,tree)控件包
"\u003cp\u003e以前写过一个js包,里面的tab和tree都是纯粹用js的function手写,没有使用框架,\u003c/p\u003e\n\u003cp\u003e存在几个问题\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e扩展比较困难\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e接下去在添加新的控件,没有一个统一的实现方式,显得混乱,不好管理\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e基于以上理由,重新基于 mootools1.1 重写了tab和tree控件,为将来添加更多的控件打个好的基础\u003c/p\u003e\n\u003cp\u003e代码中有详细的注释,也有demo,一看全明白了\u003c/p\u003e\n\u003cp\u003e下面附上源码和效果图\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"http://www.javaeye.com/topics/download/1a5be506-47ce-44c7-b946-8efad4f8304f\"\u003edemo.rar\u003c/a\u003e (80.1 KB)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e描述: 示例和源码\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e下载次数: 708\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"http://www.javaeye.com/topics/download/d7a07383-d8f5-4c5a-8e20-7293a5ba52b6\"\u003e\u003cimg src=\"http://www.javaeye.com/upload/attachment/7132/d7a07383-d8f5-4c5a-8e20-7293a5ba52b6-thumb.jpg?1199174530\" alt=\"D7a07383-d8f5-4c5a-8e20-7293a5ba52b6-thumb\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e描述: tab效果图\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e大小: 5.1 KB\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e查看次数: 240\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"http://www.javaeye.com/topics/download/3a4bfaa8-907a-4e09-b8e4-e3cc4b1c68e4\"\u003e\u003cimg src=\"http://www.javaeye.com/upload/attachment/7133/3a4bfaa8-907a-4e09-b8e4-e3cc4b1c68e4-thumb.jpg?1199174530\" alt=\"3a4bfaa8-907a-4e09-b8e4-e3cc4b1c68e4-thumb\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e描述: tree效果图\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e大小: 2 KB\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e查看次数: 117\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e"
October 24, 2007
CSS技巧DIV为空时占据空间的解决办法
"\u003cp\u003e如果给div元素设置了宽度时,比如width:100%,此时div在IE中(IE6,IE7)将占据物理空间,而在FF中不占据物理空间(正确理解)。为了表述直观,将样式直接写在元素标签内:\u003c/p\u003e\n\u003cp\u003e此时在IE中到底是什么在影响着最终的显示,又是如何解析的呢?\u003c/p\u003e\n\u003cp\u003e可能的影响因素:字体大小(font-size),字体行高(line-height),高度(height),溢出(overflow)\u003c/p\u003e\n\u003cp\u003e我们对上面的代码逐一添加过滤属性(具体的过程有兴趣的朋友,可以私下里实验一下,“自己动手,丰衣足食”!)\u003c/p\u003e\n\u003cp\u003e在测试的过程中,你会发现IE6和IE7的解析也不尽相同,比如在给div设置了line-height:0; height:0; 的样式后,IE7中显示正常了,不再占据物理空间了,而IE6却依然我行我素,亦或是悲!\u003c/p\u003e\n\u003cp\u003e最终的测试结果,最简单的方法是,给div设置高度(height)和溢出(overflow)属性:\u003c/p\u003e"
August 10, 2007
自定义404页面返回不当状态码
"\u003cp\u003eHTTP \u003ca href=\"/?tag=404\"\u003e404\u003c/a\u003e 错误意味着链接指向的网页不存在。在网站建设中想要完全避免这种情况是不可能的,比如说,我们常常需要对网站进行调整、改版,便会有网页被删除、改名或移动位置,这时候,虽然相应内容的网页还存在于网站中,但使用原来的地址访问则无法访问。——当然,对这类情况首先要考虑的是为原来页面地址做301重定向,以尽可能地减小对\u003ca href=\"/?tag=seo\"\u003eSEO\u003c/a\u003e效果的影响。——其次,在别人建立指向网站的链接时,也可能会由于出现拼写错误而使其成为一个无效的链接:在网站内找不到相应的内容页面。\u003c/p\u003e\n\u003cp\u003e简单说来,这类无效链接是由web服务器自动处理的:当Web 服务器接到类似的数据请求量,会返回一个 \u003ca href=\"/?tag=404\"\u003e404\u003c/a\u003e 状态码,告诉对方其要请求的资源并不存在。但是,Web服务器默认的404错误页面,无论\u003ca href=\"/?tag=apache\"\u003eApache\u003c/a\u003e还是\u003ca href=\"/?tag=iis\"\u003eIIS\u003c/a\u003e,均十分简陋、呆板且对用户不友好,无法给予用户寻找相应信息的更多线索,用户看到这类页面往往最直接的反应并是关闭浏览器窗口离开,这在很大程度上给网站造成损失。毕竟,对网站来说,用户永远是最重要的资源,以这种方式损失用户更意味着某种程度的失败。\u003c/p\u003e\n\u003cp\u003e这也是许多网站使用自定义\u003ca href=\"/?tag=404\"\u003e404\u003c/a\u003e 错误页面的原因。通过良好的自定义404页面,可以包 …\u003c/p\u003e"
August 10, 2007
SEO与404错误处理方式
"\u003cp\u003e 在“通过HTTP状态码查看搜索引擎蜘蛛如何爬行你的网站”一文中,我介绍了一些经常涉及到的HTTP状态码及含义,譬如大家经常探讨并且与本文相关的Http状态码:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/?tag=404\"\u003e404\u003c/a\u003e:服务器找不到指定的资源,请求的网页不存在(譬如浏览器请求的网页被删除或者移位,但不排除日后该链接有效的可能性);\n410:请求的网页不存在(注意:410表示永久性,而404表示临时性);\n200:服务器成功返回请求的网页;\n301:网址永久性重定向\n302:网址临时性重定向\u003c/p\u003e\n\u003cp\u003e注意:大部分搜索引擎将“404”与“410”状态同等对待,如Google。(参见Matt Cutts的说明)\u003c/p\u003e\n\u003cp\u003e对HTTP404状态码的理解\u003c/p\u003e\n\u003cp\u003e HTTP 404 错误意味着链接指向的网页不存在,即原始网页的URL失效,这种情况经常会发生,很难避免,比如说:网页URL生成规则改变、网页文件更名或移动位置、导入链接拼写错误等,导致原来的URL地址无法访问;当Web 服务器接到类似请求时,会返回一个404 状态码,告诉浏览器要请求的资源并不存在。但是,Web服务器默认的404错误页面,无论Apache还是IIS,均十分简陋、呆板且对用户不友好, …\u003c/p\u003e"
Category: 索引
February 7, 2017
关于 InnoDB 索引长度限制的 tips
"\u003cp\u003e有同学问到InnoDB的索引长度问题,简单说几个tips。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e关于3072\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e大家经常碰到InnoDB单列索引长度不能超过767bytes,实际上联合索引还有一个限制是3072。\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/19130103_qFJc.jpg\" alt=\"\"\u003e][1]\u003c/p\u003e\n\u003cp\u003e可以看到,由于每个字段占用255*3, 因此这个索引的大小是3825(255*3*5)\u0026gt;3072,报错。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e为什么3072\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e我们知道InnoDB一个page的默认大小是16k。由于是Btree组织,要求叶子节点上一个page至少要包含两条记录(否则就退化链表了)。\u003c/p\u003e\n\u003cp\u003e所以一个记录最多不能超过8k。\n又由于InnoDB的聚簇索引结构,一个二级索引要包含主键索引,因此每个单个索引不能超过4k (极端情况,pk和某个二级索引都达到这个限制)。\n由于需要预留和辅助空间,扣掉后不能超过3500,取个“整数”就是(1024*3)。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e单列索引限制\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e上面有提到单列索引限制767,起因是256×3-1。这个3是字符最大占用空间(utf8)。但是在5.6以后,开始支持4个字节的uutf8。255×4\u0026gt;767, 于是增加了一个参数叫做 innodb_large_prefix。\u003c/p\u003e\n\u003cp\u003e这个参数默认值是OFF。当改为ON时, …\u003c/p\u003e"
Category: 数据库
July 23, 2014
MySQL 更新并返回计数
"\u003cp\u003e对于想使用 MySQL 实现简单 ID 分配器, 一般就是设置一个整数字段, 然后想分配的时候加 1 并返回. 新手往往犯错误, 先执行一条 update 语句, 然后再 select 那个字段. 但这是错误的!\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-sql\" data-lang=\"sql\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eCREATE\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eTABLE\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003emytable\u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003e (\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003ecounter\u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003e int(\u003cspan style=\"color:#ae81ff\"\u003e10\u003c/span\u003e) \u003cspan style=\"color:#66d9ef\"\u003eNOT\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eNULL\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eDEFAULT\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;0\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e) ENGINE\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003eInnoDB \u003cspan style=\"color:#66d9ef\"\u003eDEFAULT\u003c/span\u003e CHARSET\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003eutf8;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003einsert\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003einto\u003c/span\u003e mytable \u003cspan style=\"color:#66d9ef\"\u003evalues\u003c/span\u003e(\u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e正确的方式应该是使用 last_insert_id() 函数:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-sql\" data-lang=\"sql\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eupdate\u003c/span\u003e mytable \u003cspan style=\"color:#66d9ef\"\u003eset\u003c/span\u003e counter\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003elast_insert_id(counter\u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eselect\u003c/span\u003e last_insert_id();\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e另一种方法(http://imysql.cn/2010/07/01/mysql-faq-using-mysql-as-serial-generator.html):\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-sql\" data-lang=\"sql\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eSELECT\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003eID\u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eFROM\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003eID_RANGE_XX\u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eORDER\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eBY\u003c/span\u003e ID \u003cspan style=\"color:#66d9ef\"\u003eLIMIT\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eFOR …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
August 10, 2012
incorrect MySQL client library version! This gem was compiled for 6.0.0 but the client library is 5.5.20. 的解决办法
"\u003cp\u003e从mysql官方下载 mysql-connector-c-noinstall-6.0.2-win32 解压到e:/。注意根据自己的实际情况下载相对应的版本,这里使用非安装版。\u003c/p\u003e\n\u003cp\u003eor Ruby 1.9.2:\u003c/p\u003e\n\u003cp\u003egem install mysql \u0026ndash;platform=ruby \u0026ndash; \u0026ndash;with-mysql-dir=e:/mysql-connector-c-noinstall-6.0.2-win32\u003c/p\u003e\n\u003cp\u003efor Ruby 1.9.3: (showing mysql2 variant)\u003c/p\u003e\n\u003cp\u003egem pristine mysql2 \u0026ndash; \u0026ndash;with-mysql-config=e:\\mysql-connector-c-noinstall-6.0.2-win32\u003c/p\u003e\n\u003cp\u003e这里我用64位的win7系统.\u003c/p\u003e\n\u003cp\u003e然后将** E:\\mysql-connector-c-noinstall-6.0.2-win32\\lib** 目录下的 libmysql.lib 文件复制到 \u003cstrong\u003eE:\\RailsInstaller\\Ruby1.9.3\\bin\u003c/strong\u003e 目录下。\u003c/p\u003e\n\u003cp\u003e重新执行刚才的命令即可。\u003c/p\u003e"
July 13, 2012
mysql中Table is read only的解决办法
"\u003cp\u003e今天遇到一个这样的提示repair数据表的时候出现“mysql中Table is read only”\u003c/p\u003e\n\u003cp\u003e在mysql中,Select之类的都正常,但在网页程序中提示:Table ‘********’ is read only\u003c/p\u003e\n\u003cp\u003e然后我\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003echmod -R 0777 /var/lib/mysql/taoniu2007/\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e给数据库目录的所属用户和组改为mysql,并加上777的权限,还是一样提示。\u003c/p\u003e\n\u003cp\u003e程序中使用root连接,也是一样的提示。\u003c/p\u003e\n\u003cp\u003e想用myisamchk来检查一下,也提示read only。\u003c/p\u003e\n\u003cp\u003e最终在这里找到了解决方法: \u003ca href=\"http://www.mysqltalk.org/re-the-table-is-read-only-vt154092.htm\"\u003ehttp://www.mysqltalk.org/re-the-table-is-read-only-vt154092.htm\u003c/a\u003e l\u003c/p\u003e\n\u003cp\u003e引用一下\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSQL代码\nHi,\u003c/p\u003e\n\u003cp\u003eI just encountered a similar problem on one of my production servers\nthis morning. (I’m still investigating the cause.) After doing a\nquick bit of …\u003c/p\u003e\u003c/blockquote\u003e"
June 12, 2012
CAP理论十二年回顾:”规则”变了
"\u003cp\u003e\u003cem\u003e本文首发于 \u003ca href=\"http://www.computer.org/portal/web/computingnow/computer\"\u003eComputer\u003c/a\u003e 杂志,由InfoQ和IEEE呈现给您。\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eCAP理论断言任何基于网络的数据共享系统,最多只能满足数据一致性、可用性、分区容忍性三要素中的两个要素。但是通过显式处理分区情形,系统设计师可以做到优化数据一致性和可用性,进而取得三者之间的平衡。\u003c/p\u003e\n\u003cp\u003e自打引入CAP理论的十几年里,设计师和研究者已经以它为理论基础探索了各式各样新颖的分布式系统,甚至到了滥用的程度。NoSQL运动也将CAP理论当作对抗传统关系型数据库的依据。\u003c/p\u003e\n\u003cp\u003eCAP理论主张任何基于网络的数据共享系统,都最多只能拥有以下三条中的两条:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e数据一致性(C),等同于所有节点访问同一份最新的数据副本;\u003c/li\u003e\n\u003cli\u003e对数据更新具备高可用性(A);\u003c/li\u003e\n\u003cli\u003e能容忍网络分区(P)。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCAP理论的表述很好地服务了它的目的,即开阔设计师的思路,在多样化的取舍方案下设计出多样化的系统。在过去的十几年里确实涌现了不计其数的新系 统,也随之在数据一致性和可用性的相对关系上产生了相当多的争论。“三选二”的公式一直存在着误导性,它会过分简单化各性质之间的相互关系。现在我们有必 要辨析其中的细节。实际上只有“在分区存在的前提下呈现完美的数据一致性和可 …\u003c/p\u003e"
April 7, 2012
PowerDesigner(PowerDesigner15.1.0.2850)下载、安装以及破解
"\u003cp\u003e一、先安装PowerDesigner15(PowerDesigner15.1.0.2850),下载地址如下:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://download.sybase.com/eval/PowerDesigner/PowerDesigner15_Evaluation.exe\"\u003ehttp://download.sybase.com/eval/PowerDesigner/PowerDesigner15_Evaluation.exe\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e二、破解文件下载地址:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://download.csdn.net/source/1605189\"\u003ehttp://download.csdn.net/source/1605189\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e将下载的破解文件pdflm15.dll覆盖到PowerDesigner15安装目录下(如:C:\\Program Files\\Sybase\\PowerDesigner 15)\u003c/p\u003e"
March 18, 2012
wordpress后台文章列表显示缩略图
"\u003cp\u003e大家都知道我们在wordpress后台添加文章或页面时如果你启用了缩略图功能,那么会在添加时有个特色图像的设置。具体的大家可以看下我的教程( \u003ca href=\"http://www.favortt.com/wordpress-theme-thumbnails.html\" title=\"WordPress主题(模板)修改教程(十一):使用文章缩略图功能\"\u003e点击查看\u003c/a\u003e),当我们添加好后。如果你在wordpress后台需要看某个文章或页面的缩略图是什么的时候,还得单击编辑才能看到。这样是不是很麻烦呢?如果我们直接把缩略图显示在文章或者页面的列表上面,这样的话就一目了然了。如下面效果图:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2012/03/thumbnail-list.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2012/03/thumbnail-list.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e今天磊子就把这个功能的实现,分享给大家,我们需要用到的是wordpress插件API里面的函数方法。看下面代码:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026lt;?php\nadd_filter(\u0026#39;manage_posts_columns\u0026#39;, \u0026#39;lei_add_thumb_col\u0026#39;);\nfunction lei_add_thumb_col($cols) {\n\t$cols[\u0026#39;thumbnail\u0026#39;] = __(\u0026#39;Thumbnail\u0026#39;);\n\treturn $cols;\n}\n\n//__(\u0026#39;Thumbnail\u0026#39;)是显示的文字标题,也可以改成__(\u0026#39;缩略图\u0026#39;)。\n\n//通 …\u003c/code\u003e\u003c/pre\u003e"
November 22, 2011
如何构建千万用户级别后台数据库架构设计的思路
"\u003cp\u003e【 \u003cstrong\u003e导读\u003c/strong\u003e】\u003c/p\u003e\n\u003cp\u003e关于如何构建千万级别用户的后台数据库架构话题,在ITPUB及CSDN论坛都有不少网友提问,新型问答网站知乎上也有人提问,并且顺带梳理了下思路,方便更多的技术朋友有章可循,整理一篇抛砖引玉性的文章。\u003c/p\u003e\n\u003cp\u003e一、 \u003cstrong\u003e技术朋友给出的背景资料\u003c/strong\u003e:\u003c/p\u003e\n\u003cp\u003e(1). 网站型应用,主要指:SNS社交网站、新闻门户型网站、邮件系统、SNS Game社交游戏、电子商务网站、即时通信IM等类型系统;\u003c/p\u003e\n\u003cp\u003e(2). 注册用户为千万级别,也即1KW注册用户以内;\u003c/p\u003e\n\u003cp\u003e二、要求\u003c/p\u003e\n\u003cp\u003e构建千万级别用户的后台数据库架构分析思路,对数据层架构设计的有章可循,必须考虑数据量的大小,以及数据库提供服务的性能和系统的可靠性,适当地考虑用户量超过,以及需要使用的服务器资源等信息。\u003c/p\u003e\n\u003cp\u003e三、构建千万级别用户的后台数据库架构的分析思路\u003c/p\u003e\n\u003cp\u003e曾经发过一篇文章,关于千万级别用户应用架构设计的歌谣,供大家参考 \u003ca href=\"http://blog.haohtml.com/archives/12110\"\u003e千万级架构设计诀窍\u003c/a\u003e,接下来我们针对如何构建千万级别用户的后台数据库架构,给出通用性分析思路的建议,未必完全靠谱,但求基本靠谱(注:毕竟很多事情需要看具体业务而定的):\u003c/p\u003e\n\u003cp\u003e(1). 一定要区分业务类型,可能达到千万用户级别的应用业务 …\u003c/p\u003e"
June 15, 2011
Redis在Windows,linux平台下的安装配置
"\u003cp\u003e为了方便查阅资料,特将网上搜索到的Redis相关安装配置进行归档整理:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ewindow平台Redis安装\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e下载地址: \u003ca href=\"http://code.google.com/p/servicestack/wiki/RedisWindowsDownload\"\u003ehttp://code.google.com/p/servicestack/wiki/RedisWindowsDownload\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eRedis文件夹有以下几个文件\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eredis-server.exe:服务程序\u003c/p\u003e\n\u003cp\u003eredis-check-dump.exe:本地数据库检查\u003c/p\u003e\n\u003cp\u003eredis-check-aof.exe:更新日志检查\u003c/p\u003e\n\u003cp\u003eredis-benchmark.exe:性能测试,用以模拟同时由N个客户端发送M个 SETs/GETs 查询 (类似于 Apache 的ab 工具).\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e指定redis的配置文件,如没有指定,则使用默认设置\u003c/p\u003e\n\u003cp\u003e解压目录:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ed:\u0026gt;redis-server.exe\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eredis-cli.exe:命令行客户端,测试用.windows下没有redis.conf配置文件.\u003c/p\u003e\n\u003cp\u003e解压目录:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ed:\u0026gt;redis-cli.exe -h 127.0.0.1 -p 6379\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e使用方法有两种:一种是直接使用redis-cli.exe 后面加操作,另一种是直接输 …\u003c/p\u003e"
June 15, 2011
Google开源了一个kv存储的库leveldb
"\u003cp\u003eGoogle开源了一个kv存储的库leveldb,从提交的代码和contributor名单来看,毫无疑问,就是bigtable论文描述的tablet的实现。也就是我们常说的LSMTree的一个实现。 \u003ca href=\"http://code.google.com/p/leveldb/\"\u003ehttp://code.google.com/p/leveldb/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e那LSMTree是什么呢?\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.douban.com/group/topic/19607128/\"\u003ehttp://www.douban.com/group/topic/19607128/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThe Log-Structured Merge-Tree (LSM-Tree)\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.44.2782\u0026amp;;rep=rep1\u0026amp;type=pdf\"\u003ehttp://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.44.2782\u0026amp;;rep=rep1\u0026amp;type=pdf\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e这篇文章读起来感觉有难度,细节太多。它介绍了 LSM-Tree 这种算法思想。这种算法思想主要用于解决日志记录索引的问题。这种应用的特点是数据量大、写速率高(2000条/s),又要建立有效的索引来查找日志中的特定条目。 采用 B+ 树索引,因为数据量大,每次又是随机的写到一个 page 中,导致无法进行有效的 page 缓存, …\u003c/p\u003e"
April 20, 2011
2011数据库技术大会演讲PPT下载(pdf版)
"\u003cp\u003e关于大会的更多精彩照片,请点击以下链接。(更新2011.4.16)\n\u003cstrong\u003e2011数据库技术大会现场图片,能找到你自己不?\u003c/strong\u003e\n\u003ca href=\"http://bbs.chinaunix.net/thread-2305667-1-1.html\"\u003ehttp://bbs.chinaunix.net/thread-2305667-1-1.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e2011数据库技术大会胜利结束了,非常感谢大家积极的参与支持。\n这次大会DBA相关的技术工程师达到了近700人,加上庞大的出版社、赞助商等参与者,大会总人数接近800人。会上再次汇集了国内各个领域的数据库技术工程师。\n这已经是第二届数据库技术大会了,如果算上下半年的架构师大会,就可以算作第4届由我们组织的技术大会了。经过这两年的发展,突然发现:DTCC、SACC真的成为了一个品牌。\n在第一届数据库技术大会中,有来自各个行业的技术工程师,例如,银行、证券、保险、电信、医疗、教育、制造业、物流、互联网等行业,不过,在这些行业中,互联网企业的占比较大。今年,这个行业比较有了一定的变化,那就是:教育、制造业、医疗、银行等行业的参与者的比重有明显的增加。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e职业比例的问题\u003c/strong\u003e\n数据库技术大会从名字上看,定位的人群就是DBA。另一方面,在一个企业中,纯DBA在企业的技术工程师中,占比不超 …\u003c/p\u003e"
March 21, 2011
sqlserver2000附加数据库错误823的解决方案
"\u003cp\u003e一、SQL-Server附加数据库时失败。\n1、异常情况:服务器在正常运行的情况下突然断电,导致数据库文件损坏,具体表现是:数据库名后面有“(置疑)”字样。\n2、异常分析:关于823错误的 SQL-SERVER 中的帮助:\u003c/p\u003e\n\u003cp\u003e错误 823\n严重级别 24\n消息正文\n在文件 “%4!” 的偏移量 %3! 处的 %2! 过程中,检测到 I/O 错误 %1!。\u003c/p\u003e\n\u003cp\u003e解释\nMicrosoft SQL Server 在对某设备进行读或写请求时遇到 I/O 错误。该错误通常表明磁盘问题。但是,错误日志中在错误 823 之前记录的其它核心消息应指出涉及了哪个设备。\n3、解决办法:\n在SQL-Server企业管理器中,新建同名数据库(这里假设为Test)后,停止数据库,把损坏的数据库文件Data.mdf和Test_log.LDF覆盖刚才新建数据库目录下的Data.mdf和Test_log.LDF,同时删除Test_log.LDF文件;启动数据库服务,发现数据库名Test后面有“置疑”字样。不要紧,打开SQL自带查询分析器,分别执行如下SQL语句:\n第一、\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eexec sp_configure ‘allow …\u003c/p\u003e\u003c/blockquote\u003e"
November 17, 2010
数据库主键全局唯一方案
"\u003cp\u003e现在通过数据的水平切分(sharding)来实现数据库 Scale Out 的解决方案受到了越来越多人的青睐,但是在切分过程中可能遇到的问题也肯定不在少数,如切分规则的设计,切分后的访问路由,切分后的主键的全局唯一等等。\u003c/p\u003e\n\u003cp\u003e这里我主要列举几个可以使用在 MySQL 数据库主键全局唯一方案及其优劣,供大家参考:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e通过应用程序生成一个GUID,然后和数据一起插入切分后的集群。优点是维护简单,实现也容易。缺点是应用的计算成本较大,且GUID比较常,占用数据库存储空间较大,涉及到应用的开发。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e说明:主要优势是简单,缺点是浪费存储空间,GUID:32字节,100W记录,多32兆,如果是int,4字节,会少28M。如果有外键关联,会浪费更多。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e通过独立的应用程序事先在数据库中生成一系列唯一的 ID,各应用程序通过接口或者自己去读取再和数据一起插入到切分后的集群中。优点是全局唯一主键简单,维护相对容易。缺点是实现复杂,需要应用开发。\n说明:ID表要频繁查和频繁更新,插入数据时,影响性能。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e通过中心数据库服务器利用数据库自身的自增类型(如 MySQL的 auto_increment 字段), …\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e"
November 11, 2010
分布式数据库拆表拆库的常用策略
"\u003cp\u003e在大容量,高负荷的web系统中,对数据库进行一系列拆分,可有效提升数据库容量和性能。在初学程序的早期,程序员通常都喜欢按传统数据库设计模式,设计为单库和单一功能表的结构,这样的结构在数据量和并发量达到一定程度之后,会出现严重性能问题和维护问题。在出现问题的时候才着手进行优化,会非常痛苦,所以应该在系统架设之初就考虑好之后会出现的问题。\u003c/p\u003e\n\u003cp\u003e目前有些数据库策略是采用单库结构,然后通过同步分发到数台服务器实现读写分离。个人觉得这样的策略非常笨拙,还是想办法将其分隔开来好,否则每台机器的内存都很容易超支。\u003c/p\u003e\n\u003cp\u003e一般只对数据量比较大的表进行拆分,这应该没有什么异议;还有一种是有可能会进行维护的比较重要的表,比如文章目录表,如果有从其它系统倒数据进来的可能的话,也要拆掉,不然倒数据时一不小心把目录表弄坏了,发现忘了备份,那真是欲哭无泪。\u003c/p\u003e\n\u003cp\u003e下面来分析一下:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、时间结构\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e如果业务系统对时效性较高,比如新闻发布系统的文章表,可以把数据库设计成时间结构,按时间分有几种结构:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e平板式\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e表类似:\narticle_200901\narticle_200902\narticle_200903\u003c/p\u003e\n\u003cp\u003e用年来分还是用月可自定, …\u003c/p\u003e"
September 26, 2010
PHP操作MongoDB
"\u003cp\u003e\u003cstrong\u003e一、MongoDB简介\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eMongoDB (名称来自”humongous”) 是一个可扩展的、高性能、开源、模式自由、面向文档的数据库,集文档数据库、键值对存储和关系型数据库的优点于一身。官方站点: \u003ca href=\"http://www.mongodb.org/\"\u003ehttp://www.mongodb.org/\u003c/a\u003e,MongoDB特点:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e面向文档存储(类JSON数据模式简单而强大)\u003c/li\u003e\n\u003cli\u003e动态查询\u003c/li\u003e\n\u003cli\u003e全索引支持,扩展到内部对象和内嵌数组\u003c/li\u003e\n\u003cli\u003e查询记录分析\u003c/li\u003e\n\u003cli\u003e快速,就地更新\u003c/li\u003e\n\u003cli\u003e高效存储二进制大对象 (比如照片和视频)\u003c/li\u003e\n\u003cli\u003e复制和故障切换支持\u003c/li\u003e\n\u003cli\u003eAuto-Sharding自动分片支持云级扩展性\u003c/li\u003e\n\u003cli\u003eMapReduce 支持复杂聚合\u003c/li\u003e\n\u003cli\u003e商业支持,培训和咨询\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e二、安装MongoDB\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e安装MongoDB非常的简单,仅需下载压缩包解压运行命令即可,下载地址: \u003ca href=\"http://www.mongodb.org/downloads\"\u003ehttp://www.mongodb.org/downloads\u003c/a\u003e,本文为windows平台,MongoDB运行命令:\u0026gt;bin/mongod。提示:首先要创建存储数据的文件夹,MongoDB 默认存储数据目录为 /data/db/ (或者 c:datadb),当然你也可以修改成不同目录,只需要指定 –dbpath 参数,eg: …\u003c/p\u003e"
September 26, 2010
NoSQL数据库探讨之一 - 为什么要用非关系数据库?
"\u003cp\u003e随着互联网web2.0网站的兴起,非关系型的数据库现在成了一个极其热门的新领域,非关系数据库产品的发展非常迅速。而传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,例如:\u003c/p\u003e\n\u003cp\u003e1、High performance – 对数据库高并发读写的需求\nweb2.0网站要根据用户个性化信息来实时生成动态页面和提供动态信息,所以基本上无法使用动态页面静态化技术,因此数据库并发负载非常高,往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强顶得住,但是应付上万次SQL写数据请求,硬盘IO就已经无法承受了。其实对于普通的BBS网站,往往也存在对高并发写请求的需求,例如像JavaEye网站的实时统计在线用户状态,记录热门帖子的点击次数,投票计数等,因此这是一个相当普遍的需求。\u003c/p\u003e\n\u003cp\u003e2、Huge Storage – 对海量数据的高效率存储和访问的需求\n类似Facebook,twitter,Friendfeed这样的SNS网站,每天用户产生海量的用户动态,以Friendfeed为例,一个月就达到了2.5亿条用户 …\u003c/p\u003e"
September 26, 2010
MongoDB 介绍,安装
"\u003cp\u003e这是MongoDB的系列学习笔记的第一篇,主要介绍什么是非关系型数据库MongoDB,如何下载,去哪儿下载,又该怎么正确的安装等一系列问题。\u003c/p\u003e\n\u003ch2 id=\"一前言\"\u003e一、前言\u003c/h2\u003e\n\u003cp\u003e最近开始学习非关系型数据库MongoDB,却在博客园上找不到比较系统的教程,很多资料都要去查阅英文网站,效率比较低下。本人不才,借着自学的机会把心得体会都记录下来,方便感兴趣的童鞋分享讨论。部分资源出自其他博客,旨将零散知识点集中到一起,如果有侵犯您的权利,请联系li-pan2@163.com。大部分内容均系原创,欢迎大家转载分享,但转载的同时别忘了注明作者和原文链接哦。\u003c/p\u003e\n\u003ch2 id=\"二mongodb简介\"\u003e二、MongoDB简介\u003c/h2\u003e\n\u003cp\u003eMongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种。它在许多场景下可用于替代传统的关系型数据库或键/值存储方式。Mongo使用C++开发。Mongo的官方网站地址是:http://www.mongodb.org/,读者可以在此获得更详细的信息。\n小插曲:什么是NoSql?\u003c/p\u003e\n\u003cp\u003eNoSql,全称是 Not Only Sql,指的是非关系型的数据库。下一代数据库主要解决几个要点:非关系型的、分布式的、开源的、 …\u003c/p\u003e"
September 1, 2010
开源软件keepalived实现分布式数据分发
"\u003cp\u003e大家都看到过在支付宝架构图里面一个分布式数据分发中心(Gara系统),这个分布中心为了完成每天的数据抽取和向多个Oracle Rac集群和Greenplum集群分布数据的心脏,数据仓库系统是一切系统数据来源。其中功能是为了完成异构数据抽取和装载。\u003c/p\u003e\n\u003cp\u003e为了使Gara实现高效性和线性扩展能力,现在alipay dw是用4台高性能PC Dell R900(4*4core,128GB memory)来实现,但是Gara原来开发的程序不能实现分布式,只能通过调度系统来控制,灵活性不够强。\u003c/p\u003e\n\u003cp\u003e最近发现一个开源软件 Keepalived,能很好来实现Gara高效性和线性扩展能力,很多人用来 Keepalived网站的负载均衡,Keepalived还有一个重要的特性就是实现高可用性,就利用这个特性来实现Gara分布式管理\u003c/p\u003e\n\u003cp\u003eKeepalived可以提供IP层的高可用性, 一旦某一台机器的网络出现问题, 另一台服务器会立即(几秒或者更少的时间)使用出故障的服务器的IP进行工作。\u003c/p\u003e\n\u003cp\u003ekeepalived体系架构图:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/09/1252109344_11666ae6.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/1252109344_11666ae6.jpg\" alt=\"\"\u003e\u003c/a\u003e\nkeepalived体系架构很清晰,都模块化的,跟我们目前开发的调度系统架构非常相像,大家可以去 …\u003c/p\u003e"
September 1, 2010
分布式key/value存储系统比较
"\u003cp\u003e先介绍一下绍一些流行的分布式key/value存贮系统,并做一些简单的比较。\u003c/p\u003e\n\u003cp\u003e词汇与背景阅读:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://en.wikipedia.org/wiki/Distributed_hash_table\"\u003eDistributed Hash Table (DHT)\u003c/a\u003e and algorithms such as Chord or Kadmelia\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html\"\u003eAmazon’s Dynamo Paper\u003c/a\u003e, and \u003ca href=\"http://www.readwriteweb.com/archives/amazon_dynamo.php\"\u003ethis ReadWriteWeb article about Dynamo\u003c/a\u003e which explains why such a system is invaluable\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://aws.amazon.com/simpledb/\"\u003eAmazon’s SimpleDB Service\u003c/a\u003e, and \u003ca href=\"http://gigaom.com/2007/12/14/amazon-simple-db/\"\u003esome\u003c/a\u003e \u003ca href=\"http://www.satine.org/archives/2007/12/13/amazon-simpledb/\"\u003ecommentary\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://labs.google.com/papers/bigtable.html\"\u003eGoogle’s BigTable paper\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://en.wikipedia.org/wiki/Paxos_algorithm\"\u003eThe Paxos Algorithm\u003c/a\u003e – read this page in order to appreciate that knocking up a Paxos implementation isn’t something you’d want to do whilst hungover on a Saturday morning.\u003c/p\u003e\n\u003cp\u003e现有比较流行的key/value存储系统:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/09/1264740160_1835db83.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/1264740160_1835db83.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e以下评 …\u003c/p\u003e"
August 14, 2010
NoSQL总结分类
"\u003cp\u003eNoSQL数据库异军突起,随着Digg和 sf.net大型应用不断采取NoSQL,NoSQL运动已经蓬勃发展,NoSQL数据库很多,如何对他们分类,以便方便地根据自己应用特色选择不同的NoSQL数据库呢?\u003c/p\u003e\n\u003cp\u003eNoSQL = HVSP 无(传统关系数据库的)join或明显事务的高容量简单处理。\u003c/p\u003e\n\u003cp\u003e按照数据模型保存性质将当前NoSQL分为四种:\u003c/p\u003e\n\u003cp\u003e1.Key-value stores键值存储, 保存keys+BLOBs (二进制大对象Binary Large OBjects)\u003c/p\u003e\n\u003cp\u003e2.Table-oriented 面向表, 主要有Google的BigTable和Cassandra.\u003c/p\u003e\n\u003cp\u003e3.Document-oriented面向文本, 文本是一种类似XML文档,MongoDB 和 CouchDB\u003c/p\u003e\n\u003cp\u003e4.Graph-oriented 面向图论. 如Neo4J.\u003c/p\u003e\n\u003cp\u003eNoSQL一般都是分布式数据库,高性能是其特点,因此,数据是如何被分布、复制/碎片以及合成就成为关键,这其中涉及你的应用对数据一致性的要求,见CAP原理,不同一致性处理方式决定不同类型:\u003c/p\u003e\n\u003cp\u003e1.基本上基于Dynamo. 核心思想就是在多个节点之间获得最 …\u003c/p\u003e"
August 14, 2010
Cassandra数据模型
"\u003cp\u003e提起NoSQL这个话题,仿佛不应该是DBA要关注的事,而是架构师应该关心的。但是作为一名DBA,在使用传统的关系型思想建模时,应该有必要了解NoSQL的建模方法。\u003c/p\u003e\n\u003cp\u003e各种NoSQL数据库有很多,我最关注的还是\u003cstrong\u003eBigTable\u003c/strong\u003e类型,因为它是一个高可用可扩展的分布式计算平台,用来处理海量的结构化数据,而数据库同样也是处理结构化数据,所以除了没有SQL,在数据模型方面有相似之处。\u003cstrong\u003eCassandra\u003c/strong\u003e是facebook开源出来的一个版本,可以认为是BigTable的一个开源版本,目前twitter和digg.com在使用。我们尝试从DBA的角度出发去理解Cassandra的数据模型。\u003c/p\u003e\n\u003cp\u003eNoSQL并不能简单的理解为\u003cstrong\u003eNo SQL\u003c/strong\u003e,其本质应该是\u003cstrong\u003eNo Relational\u003c/strong\u003e,也就是说它不是基于关系型的理论基础,而我们所有传统的数据库都是基于这套理论而发展起来的,所以SQL并不是问题的关键所在,比如有些NoSQL数据库可以提供SQL类型的接口,允许你通过类SQL的语法去访问数据。而Friendfeed则是反其道而行之,利用关系型数据库MySQL,采用了去关系化的设计方法,去实现自己的KeyValue存储。所 …\u003c/p\u003e"
April 4, 2010
Tokyo Cabinet Key-Value数据库及其扩展应用PPT[原创]
"\u003cp\u003e以下是我4月2日在“ \u003ca href=\"http://dtcc.it168.com/\"\u003e2010年数据库技术大会\u003c/a\u003e”的演讲PPT,介绍了 Tokyo Cabinet Key-Value 数据库的性能优化关键参数,以及金山逍遥网在Tokyo Cabinet基础上实现的TCSQL实时列表缓存数据库(Version 1.3)。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2010/04/dtcc_tc_tt_tcsql.pdf\"\u003e点击下载dtcc_tc_tt_tcsql.pdf\u003c/a\u003e\u003c/p\u003e"
May 16, 2009
如何根据rowid获取extent_id
"\u003cp\u003e我们知道,rowid是由四部分组成的,分别是data_object_id,file_id,block_number和row_number,通过oracle提供的dbms_rowid包可以很方便的将一串rowid解析出上述四部分的内容。然后根据这些信息,则可以获取其extent_id。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eSYS@datac\u0026gt;declare\n 2 v_block_id number;\n 3 v_file_id number;\n 4 v_object_id number;\n 5 v_extent_id number;\n 6 v_object_name varchar2(30);\n 7 v_owner varchar2(30);\n 8 v_rowid varchar2(20):=\u0026#39;AAACrKAAXAAAAzUAAH\u0026#39;;\n 9 begin\n 10 select dbms_rowid.ROWID_BLOCK_NUMBER(v_rowid),\n 11 dbms_rowid.ROWID_RELATIVE_FNO(v_rowid),\n 12 …\u003c/code\u003e\u003c/pre\u003e"
November 12, 2008
新一篇: Oracle数据库的安全性措施概述
"\u003cp\u003e\u003cstrong\u003e一、Oracle中的实体完整性\u003c/strong\u003e Oracle在CREATE TABLE语句中提供了PRIMARY KEY子句,供用户在建表时指定关系的主码列。例如,在学生-选课数据库中,要定义Student表的Sno为主码,可使用如下语句:\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif\" alt=\"\"\u003eCREATETABLE student\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif\" alt=\"\"\u003e (sno NUMBER(8),\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif\" alt=\"\"\u003e sanme VARCHAR(20),\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif\" alt=\"\"\u003e sage NUMBER(20),\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif\" alt=\"\"\u003eCONSTRAINT pk_sno PRIMARYKEY(sno));\u003c/p\u003e\n\u003cp\u003e其中,PRIMARY KEY(Sno)表示是Student表的主码。PK_SNO是此主码约束名。\u003c/p\u003e\n\u003cp\u003e 若要在SC表中定义(Sno,Cno)为主码,则用下面语句建立SC表:\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif\" alt=\"\"\u003eCREATETABLE sc\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif\" alt=\"\"\u003e (sno NUMBER(8),\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif\" alt=\"\"\u003e cno NUMBER(2),\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif\" alt=\"\"\u003e grade NUMBER(2),\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif\" alt=\"\"\u003eCONSTRAINT pk_sc PRIMARYKEY(sno,cno));\u003c/p\u003e\n\u003cp\u003e 用PRIMARY KEY语句定义了关系的主码后,每当用户程序对主码列进行更新操作时,系统自 …\u003c/p\u003e"
November 12, 2008
在 Oracle 和 PHP 中使用 LOB
"\u003cp\u003e作者:Harry Fuecks是否达到 4,000 字节的极限? 我们先来了解一下 LOB……本文相关下载:\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://oracleimg.com/admin/images/ocom/bullet_5x5.gif\" alt=\"\"\u003e\u003ca href=\"http://www.oracle.com/technology/global/cn/software/products/database/oracle10g/index.html\"\u003eOracle 数据库 10 \u003cem\u003eg\u003c/em\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://oracleimg.com/admin/images/ocom/bullet_5x5.gif\" alt=\"\"\u003e\u003ca href=\"http://www.oracle.com/technology/global/cn/tech/php/zendcore/index.html\"\u003eZend Core for Oracle\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://oracleimg.com/admin/images/ocom/bullet_5x5.gif\" alt=\"\"\u003e\u003ca href=\"http://httpd.apache.org/download.cgi\"\u003eApache HTTP Server 1.3 和更高版本\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e使用 VARCHAR2 这样的 Oracle 类型是完全可以的,但如果您要一次性存储的数据量超过它的 4,000 字节的极限,情况将会如何? 要完成此任务,您需要 Oracle 的某个 Long 对象 (LOB) 类型,为此您应了解如何使用 PHP API 来处理 LOB。 这对于不熟悉它的人来说是很困难的。\u003c/p\u003e\n\u003cp\u003e在这篇“Oracle+PHP 指南”操作文档中,您将了解可用的 LOB 类型以及与它们相关的问题,然后将探讨 PHP 中常见 LOB 操作示例。\u003c/p\u003e\n\u003cp\u003eOracle 中的 Long 对象\u003c/p\u003e\n\u003cp\u003eOracle 提供了以下 LOB 类型:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eBLOB,用于存储二进制数据\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCLOB,用于使用数据库字符集编码存储字符数据\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNCLOB,用于使用国家字符集存储 Unicode 字符数据。 注意,您将在本文中使用的 PHP \u003ca href=\"http://www.php.net/oci8\"\u003eOCI8 …\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e"
November 12, 2008
在 Oracle 和 PHP 中绑定变量
"\u003cp\u003e作者:Larry Ullman通过绑定变量提高 Oracle 驱动的 PHP 应用程序的速度和安全性。本文相关下载:\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://oracleimg.com/admin/images/ocom/bullet_5x5.gif\" alt=\"\"\u003e\u003ca href=\"http://www.oracle.com/technology/global/cn/software/products/database/oracle10g/index.html\"\u003eOracle 数据库 10 \u003cem\u003eg\u003c/em\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://oracleimg.com/admin/images/ocom/bullet_5x5.gif\" alt=\"\"\u003e\u003ca href=\"http://www.oracle.com/technology/global/cn/software/tech/oci/instantclient/index.html\"\u003eOracle Instant Client\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://oracleimg.com/admin/images/ocom/bullet_5x5.gif\" alt=\"\"\u003e\u003ca href=\"http://www.oracle.com/technology/global/cn/products/jdev/htdocs/partners/addins/exchange/php/index.html\"\u003eOracle JDeveloper PHP Extension\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://oracleimg.com/admin/images/ocom/bullet_5x5.gif\" alt=\"\"\u003e\u003ca href=\"http://www.oracle.com/technology/global/cn/tech/php/zendcore/index.html\"\u003eZend Core for Oracle\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e想必您一定知道,当前的大多数网站都依赖数据库,只是方式各有不同。 无论您正在构建的站点需要论坛、电子商务组件、包含大量文章和信息还是仅仅从访问者那里获得反馈,您都很可能会通过某种方式并入数据库。 尽管数据库很重要并通常是不可或缺的,但使用它们会影响(通常是不利影响) Web 应用程序的两个方面: 性能和安全性。 了解何时以及如何在 PHP 中绑定变量将对改善这两个问题方面大有帮助。\u003c/p\u003e\n\u003cp\u003e如果您曾经对 Web 项目进行过测试,想必您一定会知道数据库交互通常是要求最高的过程。 在数据库中运行查询时,Oracle 必须先对查询进行分析,以确保它的语法正确,然后才执行实际的查询。 即使您运行多个相似查询也必须先进行分析:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eSELECT * FROM movies WHERE movie_id=1 …\u003c/code\u003e\u003c/pre\u003e"
November 12, 2008
利用 Oracle 和 PHP 轻松处理树
"\u003cp\u003e作者:Nick Bollweg利用一流的查询和函数,轻松处理层次数据。本文相关下载:\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://oracleimg.com/admin/images/ocom/bullet_5x5.gif\" alt=\"\"\u003e\u003ca href=\"http://www.oracle.com/technology/pub/files/bollweg_easytrees_sample.zip\"\u003e示例代码和清单\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://oracleimg.com/admin/images/ocom/bullet_5x5.gif\" alt=\"\"\u003e\u003ca href=\"http://www.oracle.com/technology/global/cn/software/products/database/oracle10g/index.html\"\u003eOracle 数据库 10 \u003cem\u003eg\u003c/em\u003e Express 版\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://oracleimg.com/admin/images/ocom/bullet_5x5.gif\" alt=\"\"\u003e\u003ca href=\"http://www.oracle.com/technology/global/cn/software/tech/oci/instantclient/index.html\"\u003eOracle 即时客户端\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://oracleimg.com/admin/images/ocom/bullet_5x5.gif\" alt=\"\"\u003e\u003ca href=\"http://www.oracle.com/technology/global/cn/products/jdev/htdocs/partners/addins/exchange/php/index.html\"\u003e为 PHP 提供的 Oracle JDeveloper 扩展\u003c/a\u003e2005 年 12 月发表\u003c/p\u003e\n\u003cp\u003e几乎每一种数据驱动的应用程序都依赖于某种形式的、不同复杂程度的层次数据:产品类别中的产品、文件夹中的消息、部门中的员工。当然,某些时候您将需要显示这些数据来创建一个目录、收件箱或组织架构的图表。利用 Oracle 提供的特定供应商的 SQL 扩展和 PHP 在数组处理方面的出色能力,您可以检索并显示一个树,并且以简洁和易于维护的方式对树进行内在的高度优化。\u003c/p\u003e\n\u003cp\u003e因为本文讨论的查询和函数都包含较少的过程,而注重提供更条理清晰,易于理解的代码,因此这篇方法文档在实施的时候以及重构现有代码的时候非常有用。如果您的数据拥有树状的数据形式(目前已经显示或者要取其值),那么本方法文档将会很有价值。使用最新推出的优秀 RDBMS 的用户非常幸运,因为新的特性使得一些棘手的处理层次数据的任务变得更为容易 — 虽然自 Oracle8_i_ 起的 …\u003c/p\u003e"
November 12, 2008
Oracle+PHP 简明手册
"\u003cp\u003e\u003ca href=\"http://www.oracle.com/technology/global/cn/pub/articles/oracle_php_cookbook/index.html\"\u003ehttp://www.oracle.com/technology/global/cn/pub/articles/oracle_php_cookbook/index.html\u003c/a\u003e\u003c/p\u003e"
November 12, 2008
oracle添加用户,赋权,修改密码,解锁
"\u003cp\u003e\u003cstrong\u003e添加用户(随着用户的创建,自动产生与用户同名的schema)\u003c/strong\u003e\nCREATE USER “TESTER” PROFILE “DEFAULT” IDENTIFIED BY “TESTER” DEFAULT TABLESPACE “TESTDATA” TEMPORARY TABLESPACE “TESTTEMP” ACCOUNT UNLOCK;\u003c/p\u003e\n\u003cp\u003e赋权(说实话,这些权限是开发中使用的权限,如果用户生产环境,请自行对于用户创建相应的系统权限)\n据说生产环境下,只是connect resource这样的角色就可以了。\nGRANT “CONNECT” TO “TESTER”;\nGRANT “RESOURCE” TO “TESTER”;\nGRANT “DBA” TO “TESTER”;\nGRANT “EXP_FULL_DATABASE” TO “TESTER”;\nGRANT “IMP_FULL_DATABASE” TO “TESTER”;\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e用户修改密码,解锁\u003c/strong\u003e\nALTER USER “SCOTT” IDENTIFIED BY “*\u003cstrong\u003e*\u003c/strong\u003e*”\nALTER USER “SCOTT” ACCOUNT UNLOCK …\u003c/p\u003e"
November 12, 2008
ORACLE用户常用数据字典的查询使用方法
"\u003cp\u003e查看当前用户的缺省表空间\nSQL\u0026gt;select username,default_tablespace from user_users;\u003c/p\u003e\n\u003cp\u003e查看当前用户的角色\nSQL\u0026gt;select * from user_role_privs;\u003c/p\u003e\n\u003cp\u003e查看当前用户的系统权限和表级权限\nSQL\u0026gt;select * from user_sys_privs;\nSQL\u0026gt;select * from user_tab_privs;\u003c/p\u003e\n\u003cp\u003e查看用户下所有的表\nSQL\u0026gt;select * from user_tables;\u003c/p\u003e\n\u003cp\u003e显示用户信息(所属表空间)\nselect default_tablespace,temporary_tablespace\nfrom dba_users where username=’GAME’;\u003c/p\u003e\n\u003cp\u003e**1、用户\n**\n查看当前用户的缺省表空间\nSQL\u0026gt;select username,default_tablespace from user_users;\u003c/p\u003e\n\u003cp\u003e查看当前用户的角色\nSQL\u0026gt;select * from user_role_privs; …\u003c/p\u003e"
November 12, 2008
第二章:oracle中的索引
"\u003cp\u003e1,索引\u003c/p\u003e\n\u003cp\u003e与表关联的可选结构\u003c/p\u003e\n\u003cp\u003e加快SQL语句的执行\u003c/p\u003e\n\u003cp\u003e减少磁盘I/O\u003c/p\u003e\n\u003cp\u003eCREATE INDEX 语句用于创建索引\u003c/p\u003e\n\u003cp\u003e在逻辑上和物理上独立于表中的数据\u003c/p\u003e\n\u003cp\u003eORCALE自动维护索引\u003c/p\u003e\n\u003cp\u003e2,唯一索引\u003c/p\u003e\n\u003cp\u003e确保在定义索引的列中没有重复的值\u003c/p\u003e\n\u003cp\u003eORACLE自动为主键列和唯一键列创建唯一索引\u003c/p\u003e\n\u003cp\u003eCREATE UNIQUE INDEX 语句用于创建唯一索引\u003c/p\u003e\n\u003cp\u003e//创建唯一索引的语法 CREATE UNIQUE INDEX index_name on table_name(column_name);\u003c/p\u003e\n\u003cp\u003e//例:\u003c/p\u003e\n\u003cp\u003eSQL\u0026gt; create unique index idx_stuId on student(studentid);\u003c/p\u003e\n\u003cp\u003e3:组合索引\u003c/p\u003e\n\u003cp\u003e在表的多个列上创建的索引\u003c/p\u003e\n\u003cp\u003e也称为“连接索引”\u003c/p\u003e\n\u003cp\u003e组合索引中的列可以按任意顺序排列\u003c/p\u003e\n\u003cp\u003e对于在WHERE子句中包含多个列的查询,可以提高数据访问速度\u003c/p\u003e\n\u003cp\u003e//\u003c/p\u003e\n\u003cp\u003e创建组合索引的语法\u003c/p\u003e\n\u003cp\u003eCREATE INDEX index_name on table_name(cloumns_list);\u003c/p\u003e\n\u003cp\u003e//例:\u003c/p\u003e\n\u003cp\u003eSQL\u0026gt; create index idx_empNoAndDeptNo on …\u003c/p\u003e"
November 12, 2008
用一个实例讲解oracle数据库中的connect resource权限
"\u003cp\u003econnect resource权限;\u003c/p\u003e\n\u003cp\u003e grant connect,resource to user;\u003c/p\u003e\n\u003cp\u003e 后用户包括的权限:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCONNECT角色: –是授予最终用户的典型权利,最基本的\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e ALTER SESSION –修改会话\u003c/p\u003e\n\u003cp\u003e CREATE CLUSTER –建立聚簇\u003c/p\u003e\n\u003cp\u003e CREATE DATABASE LINK –建立数据库链接\u003c/p\u003e\n\u003cp\u003e CREATE SEQUENCE –建立序列\u003c/p\u003e\n\u003cp\u003e CREATE SESSION –建立会话\u003c/p\u003e\n\u003cp\u003e CREATE SYNONYM –建立同义词\u003c/p\u003e\n\u003cp\u003e CREATE VIEW –建立视图\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eRESOURCE角色: –是授予开发人员的\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e CREATE CLUSTER –建立聚簇\u003c/p\u003e\n\u003cp\u003e CREATE PROCEDURE –建立过程\u003c/p\u003e\n\u003cp\u003e CREATE SEQUENCE –建立序列\u003c/p\u003e\n\u003cp\u003e CREATE TABLE –建表\u003c/p\u003e\n\u003cp\u003e CREATE TRIGGER –建立触发器\u003c/p\u003e\n\u003cp\u003e CREATE TYPE –建立类型\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e从dba_sys_privs里可以查到:\u003c/strong\u003e SQL\u0026gt; select …\u003c/p\u003e"
November 12, 2008
找回oracle的户名和密码
"\u003cp\u003eCMD下 输入 SQLPLUS /NOLOG\n然后再在出来的界面中打入 CONN /AS SYSDBA\n这样就会以本地系统登录的用户为信任用户进入数据库的操作\nALTER USER SYS IDENTIFIED BY “123”;\n这样就可以将SYS的密码改为123 或者改SYSTEM的密码,都一样。\u003c/p\u003e\n\u003cp\u003e这样你就可以用SYS用户随心所欲了。\u003c/p\u003e\n\u003cp\u003e另一种是新增用户:\nCREATE USER MaoMao IDENTIFIED BY “123”;\n新增MaoMao后改变她的权限就可以了,改变用户权限的命令是:\nGRANT ROLES TO MaoMao;\u003c/p\u003e\n\u003cp\u003e还有另一种更简便的方法,在本机CMD下 输入 SQLPLUS SYS AS Sysdba\n然后要求输密码时按Enter即可,进入后自行改密码…\u003c/p\u003e"
November 12, 2008
MySQL数据库向Oracle转换时注意若干问题
"\u003cp\u003e 有很多应用项目, 刚起步的时候用MySQL数据库基本上能实现各种功能需求,随着应用用户的增多,数据量的增加,MySQL渐渐地出现不堪重负的情况:连接很慢甚至宕机,于是就有把数据从MySQL迁到 Oracle的需求,应用程序也要相应做一些修改。本人总结出以下几点注意事项,希望对大家有所帮助。\u003c/p\u003e\n\u003cp\u003e 1. 自动增长的数据类型处理 MySQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。 Oracle没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。\u003c/p\u003e\n\u003cp\u003e CREATE SEQUENCE 序列号的名称 (最好是表名 序列号标记) INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE;其中最大的值按字段的长度来定, 如果定义的自动增长的序列号 NUMBER(6) , 最大值为999999 INSERT 语句插入这个字段值为: 序列号的名称.NEXTVAL\u003c/p\u003e\n\u003cp\u003e 2. 单引号的处理 MySQL里可以用双引号包起字符串,Oracle里只可以用单引号包起字符串。在插入和修改字符 …\u003c/p\u003e"
November 11, 2008
char和varchar2的区别
"\u003cp\u003e区别:\n1.CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc”,对于CHAR (20),表示你存储的字符将占20个字节(包括17个空字符),而同样的VARCHAR2 (20)则只占用3个字节的长度,20只是最大值,当你存储的字符小于20时,按实际长度存储。\n2.CHAR的效率比VARCHAR2的效率稍高。\n3.目前VARCHAR是VARCHAR2的同义词。工业标准的VARCHAR类型可以存储空字符串,但是oracle不这样做,尽管它保留以后这样做的权利。Oracle自己开发了一个数据类型VARCHAR2,这个类型不是一个标准的VARCHAR,它将在数据库中varchar列可以存储空字符串的特性改为存储NULL值。如果你想有向后兼容的能力,Oracle建议使用VARCHAR2而不是VARCHAR。\u003c/p\u003e\n\u003cp\u003e何时该用CHAR,何时该用varchar2?\n CHAR与VARCHAR2是一对矛盾的统一体,两者是互补的关系.\nVARCHAR2比CHAR节省空间,在效率上比CHAR会稍微差一些,即要想获得效率,就必须牺牲一定的空间,这也就是我们在 …\u003c/p\u003e"
November 11, 2008
如何在Oracle 中实现类似自动增加 ID 的功能?
"\u003cp\u003e我们经常在设计数据库的时候用一个系统自动分配的ID来作为我们的主键,但是在ORACLE 中没有这样的 功能,我们\u003c/p\u003e\n\u003cp\u003e可以通过采取以下的功能实现自动增加ID的功能\u003c/p\u003e\n\u003cp\u003e 1.首先创建 sequence\u003c/p\u003e\n\u003cp\u003e create sequence seqmax increment by 1\u003c/p\u003e\n\u003cp\u003e 2.使用方法\u003c/p\u003e\n\u003cp\u003e select seqmax.nextval ID from dual\u003c/p\u003e\n\u003cp\u003e 就得到了一个ID\u003c/p\u003e\n\u003cp\u003e 如果把这个语句放在 触发器中,就可以实现 和 ms sql 的自动增加ID相同的功能!\u003c/p\u003e"
October 15, 2008
mysql忘记root密码的解决方法
"\u003cp\u003e一. MySQL密码的恢复方法之一\n如果忘记了MySQL的root密码,可以用以下方法重新设置:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eKILL掉系统里的MySQL进程;\nkillall -TERM mysqld\u003c/li\u003e\n\u003cli\u003e用以下命令启动MySQL,以不检查权限的方式启动;\nsafe_mysqld –skip-grant-tables \u0026amp;\u003c/li\u003e\n\u003cli\u003e然后用空密码方式使用root用户登录 MySQL;\nmysql -u root\u003c/li\u003e\n\u003cli\u003e修改root用户的密码;\nmysql\u0026gt; update mysql.user set password=PASSWORD(‘新密码’) where User=’root’;\nmysql\u0026gt; flush privileges;\nmysql\u0026gt; quit\n重新启动MySQL,就可以使用新密码登录了。\n二. MySQL密码的恢复方法二\n有可能你的系统没有 safe_mysqld 程序(比如我现在用的 ubuntu操作系统, apt-get安装的mysql) , 下面方法可以恢复\u003c/li\u003e\n\u003cli\u003e停止mysqld;\n /etc/init.d/mysql stop\n(您可能有其它的方法,总之停止mysqld的运行就可以 …\u003c/li\u003e\u003c/ol\u003e"
March 25, 2008
使用mysql的replace函数替换字符串
"\u003cp\u003e一直以为只有mysql才有replace这个方法,后来一查,sql server居然也有,看来自己真是无知啊。。。。\u003c/p\u003e\n\u003cp\u003e比如你要将 表 tb1里面的 f1字段的abc替换为def\u003c/p\u003e\n\u003cp\u003eUpdate tb1 SET f1=REPLACE(f1, ‘abc’, ‘def’);\u003c/p\u003e\n\u003cp\u003eREPLACE(str,from_str,to_str)\n在字符串 str 中所有出现的字符串 from_str 均被 to_str替换,然后返回这个字符串:\nmysql\u0026gt; Select REPLACE(‘www.mysql.com’, ‘w’, ‘Ww’);\n -\u0026gt; ‘WwWwWw.mysql.com’\n这个函数是多字节安全的。\u003c/p\u003e\n\u003cp\u003e示例:\nUpdate `dede_addonarticle` SET body = REPLACE ( body,\n ‘’,\n ” );\nUpdate `dede_addonarticle` SET body = REPLACE ( body,\n ‘’,\n ” );\nUpdate …\u003c/p\u003e"
March 4, 2008
MySQL索引分析和优化:
"\u003cp\u003e本文主要讲述了如何加速动态网站的\u003ca href=\"http://www.phpchina.com/viewnews_11670.html\"\u003eMySQL\u003c/a\u003e索引分析和优化。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、什么是索引?\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。\u003c/p\u003e\n\u003cp\u003e假设我们创建了一个名为people的表:\u003c/p\u003e\n\u003cp\u003eCreate TABLE people ( peopleid SMALLINT NOT NULL,\u003c/p\u003e\n\u003cp\u003ename CHAR(50) NOT NULL );\u003c/p\u003e\n\u003cp\u003e然后,我们完全随机把1000个不同name值插入到people表。在数据文件中name列没有任何明确的次序。如果我们创建了name列的索引,MySQL将在索引中排序name列,对于索引中的每一项,MySQL在内部为它保存一个数据文件中实际记录所在位置的“指针”。因此,如果我们要查找name等于“Mike”记录 …\u003c/p\u003e"
March 4, 2008
mysql数据类型
"\u003cp\u003e\u003cstrong\u003e1. mysql的数据类型\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在mysql中有如下几种数据类型:\u003c/p\u003e\n\u003cp\u003e(1)数值型\u003c/p\u003e\n\u003cp\u003e数值是诸如32 或153.4 这样的值。mysql 支持科学表示法,科学表示法由整数或浮点数后跟“e”或“e”、一个符号(“+”或“-”)和一个整数指数来表示。1.24e+12 和23.47e-1 都是合法的科学表示法表示的数。而1.24e12 不是合法的,因为指数前的符号未给出。\u003c/p\u003e\n\u003cp\u003e浮点数由整数部分、一个小数点和小数部分组成。整数部分和小数部分可以分别为空,但不能同时为空。\u003c/p\u003e\n\u003cp\u003e数值前可放一个负号“-”以表示负值。\u003c/p\u003e\n\u003cp\u003e(2)字符(串)型\u003c/p\u003e\n\u003cp\u003e字符型(也叫字符串型,简称串)是诸如“hello, world!”或“一个馒头引起的血案”这样的值,或者是电话号码87398413这样的值。既可用单引号也可用双引号将串值括起来。\u003c/p\u003e\n\u003cp\u003e初学者往往分不清数值87398143和字符串87398143的区别。都是数字啊,怎么一个要用数值型,一个要用字符型呢?关键就在于:数值型的87398143是要参与计算的,比如它是金融中的一个货款总额;而字符型的87398143是不参与计算的,只是表示电话号码,这样的还有街道号码、门牌号码等等,它们都不参与 …\u003c/p\u003e"
February 28, 2008
怎么给mysql表的字段添加索引和查询索引呢
"\u003cp\u003e1.普通索引。\n这是最基本的索引,它没有任何限制。它有以下几种创建方式:\n(1)创建索引:Create INDEX indexName ON tableName(tableColumns(length));如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB 和 TEXT 类型,必须指定length,下同。\n(2)修改表结构:Alter tableName ADD INDEX [indexName] ON (tableColumns(length))\n(3)创建表的时候直接指定:Create TABLE tableName ( […], INDEX [indexName] (tableColumns(length)) ;\u003c/p\u003e\n\u003cp\u003e2.唯一索引。\n它与前面的\u0026quot;普通索引\u0026quot;类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:\n(1)创建索引:Create UNIQUE INDEX indexName ON tableName(tableColumns(length))\n(2)修改表结 …\u003c/p\u003e"
December 6, 2007
mysql中 is marked as crashed and last (automatic?)
"\u003cp\u003e使用php+mysql时,用的数据库偶然一次出现了Table ‘./****/tbl_admin is marked as crashed and last (automatic?) repair failed],在此以前使用过一次myisamchk ,结果就出现这个错误提示了,在网上也找不了少办法,但都差不多,myisamchk 表名,可是提示tbl_admin.MYII不存在,在数据库目录里发现这个文件没有了,但同时多出一个tbl_admin.TMD文件,网上查了一下说是一个临时文件的,其实这些是本地的数据,要不要无所谓的,但这个问题我们得解决吧.后来用了以下方面的:\u003c/p\u003e\n\u003cp\u003e先把这个文件做个备份,然后直接把.TMD扩展名改成.MYI了.然后用check table 命令结果成功了,呵呵,大家如果遇到此类问题不妨一试的.\u003cimg src=\"/fckeditor/editor/images/smiley/msn/teeth_smile.gif\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e另个也可以用其它命令试一下:repair table 表名 和 check table 表名等其它命令的…\u003c/p\u003e"
November 23, 2007
windows下mysql定时自动备份
"\u003cp\u003e对于linux或unix下备份mysql可以说很简介的,但在windows下备份,好像只有用windows自带的计划任务了.\u003c/p\u003e\n\u003cp\u003e==============\n假想环境:\nMySQL 安装位置:C:MySQL\n论坛数据库名称为:bbs\nMySQL root 密码:123456\n数据库备份目的地:D:db_backup\u003c/p\u003e\n\u003cp\u003e程序代码\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e@echo off\nC:MySQLbinmysqladmin -u root –password=123456 shutdown\nC:MySQLbinmysqldump –opt -u root –password=123456 bbs \u0026gt; D:db_backupbbs.sql\nC:MySQLbinmysqld-nt\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e将以上代码保存为backup_db.bat\n然后使用Windows的“计划任务”定时执行该脚本即可。(例如:每天凌晨5点执行back_db.bat)\u003c/p\u003e"
November 23, 2007
使用mysqldump定时备份数据库的脚本
"\u003cp\u003e每7天备份一次所有数据,每天备份binlog,也就是增量备份.\u003c/p\u003e\n\u003cp\u003e(如果数据少,每天备份一次完整数据即可,可能没必要做增量备份)\u003c/p\u003e\n\u003cp\u003e作者对shell脚本不太熟悉,所以很多地方写的很笨 🙂\u003c/p\u003e\n\u003cp\u003e开启 bin log\u003c/p\u003e\n\u003cp\u003e在\u003ca href=\"/?tag=mysql\"\u003emysql\u003c/a\u003e 4.1版本中,默认只有错误日志,没有其他日志.可以通过修改配置打开bin log.方法很多,其中一个是在/etc/my.cnf中的mysqld部分加入:\u003c/p\u003e\n\u003cp\u003e[mysqld]\nlog-bin\u003c/p\u003e\n\u003cp\u003e这个日志的主要作用是增量备份或者复制(可能还有其他用途).\u003c/p\u003e\n\u003cp\u003e如果想增量备份,必须打开这个日志.\u003c/p\u003e\n\u003cp\u003e对于数据库操作频繁的mysql,这个日志会变得很大,而且可能会有多个.\u003c/p\u003e\n\u003cp\u003e在数据库中flush-logs,或者使用mysqladmin,mysqldump调用flush-logs后并且使用参数delete-master-logs,这些日志文件会消失,并产生新的日志文件(开始是空的).\u003c/p\u003e\n\u003cp\u003e所以如果从来不备份,开启日志可能没有必要.\u003c/p\u003e\n\u003cp\u003e完整备份的同时可以调用flush-logs,增量备份之前flush-logs,以便备份最新的数据.\u003c/p\u003e\n\u003cp\u003e完整备份脚本\u003c/p\u003e\n\u003cp\u003e如果数据库数据比较多,我们一般是几天或者一周备份一次数 …\u003c/p\u003e"
November 23, 2007
mysql表索引被破坏的问题及解决
"\u003cp\u003e常见错误信息:\n\u003ca href=\"http://sunxingfang.cn/article.asp?id=210\"\u003eTable xxx is marked as crashed and should be repaired\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e用mysql的用户,经常会遇到这样的问题,检查mysql日志,错误信息为:\u003c/p\u003e\n\u003cp\u003eTable ‘.dedecmsv4dede_archives’ is marked as crashed and should be repaired\u003c/p\u003e\n\u003cp\u003e提示说cms的文章表dede_archives被标记有问题,需要修复。于是赶快恢复历史数据,上网查找原因。最终将问题解决。解决方法如下:\u003c/p\u003e\n\u003cp\u003e找到mysql的安装目录的bin/myisamchk工具,在命令行中输入:\u003c/p\u003e\n\u003cp\u003emyisamchk -c -r ../data/dedecmsv4/dede_archives.MYI\u003c/p\u003e\n\u003cp\u003e然后myisamchk 工具会帮助你恢复数据表的索引。重新启动mysql,问题解决。\u003c/p\u003e\n\u003cp\u003e问题分析:\u003c/p\u003e\n\u003cp\u003e1、错误产生原因,有网友说是频繁查询和更新dede_archives表造成的索引错误,因为我的页面没有静态生成,而是动态页面,因此比较同意这种说法。还有说法为是MYSQL数据库因为某种原因而受到了损坏,如:数据库服务器突发性的断电、 …\u003c/p\u003e"
November 22, 2007
MySql创建用户及授权
"\u003cp\u003eGRANT 语句的语法如下:\nGRANT privileges (columns)\nON what\nTO user IDENTIFIEDBY “password”\nWITH GRANT OPTION\u003c/p\u003e\n\u003cp\u003e对用户授权\u003c/p\u003e\n\u003cp\u003emysql\u0026gt;grant rights on database.* to user@host identified by “pass“;例1:\u003c/p\u003e\n\u003cp\u003e增加一个用户test1密码为abc,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003egrant select,insert,update,delete on \u003cem\u003e.\u003c/em\u003e to test1@”%” Identified by “abc”; ON 子句中*.* 说明符的意思是“所有数据库,所有的表”例2:\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e增加一个用户test2密码为abc, 让他只可以在localhost上登录,并可以对数据库mydb进行查询、插入、修改、删除的操作。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003egrant select,insert,update,delete on mydb.* to test2@localhost identified by “abc”;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e例子3\n增加 …\u003c/p\u003e"
September 19, 2007
修改MySQL的默认密码
"\u003cp\u003e对于windows平台来说安装完mysql后,系统就已经默认生成了许可表和账户,你不需要像在Unix平台上那样执行 mysql_install_db脚本来生成帐户和相应权限许可表。\u003c/p\u003e\n\u003cp\u003e但是如果不是用MSI格式来安装MySQL的话,就需要在安装完以后,手动给 root帐户添加新密码,因为默认情况下的root没有开启密码保护功能,如果不重新赋予root帐户密码,那么许多非本机的连接将 无法成功。具体更新密码步骤如下:\u003c/p\u003e\n\u003cp\u003ec:\u0026gt;mysql -u root\u003c/p\u003e\n\u003cp\u003emysql\u0026gt;set passWord for ‘root’@’localhost’=password(‘newpasswd’);\u003c/p\u003e\n\u003cp\u003emysql\u0026gt;set password for ‘root’@’%’=password(‘newpasswd’); //本条可选\u003c/p\u003e\n\u003cp\u003e通过以上设置,root的密码将变为newpasswd这样就完成了根用户root密码的设置工作。\u003c/p\u003e"
August 13, 2007
mysql中DATETIME、DATE 和 TIMESTAMP 类型数据使用
"\u003cp\u003e\u003ccode\u003eDATETIME\u003c/code\u003e、\u003ccode\u003eDATE\u003c/code\u003e 和 \u003ccode\u003eTIMESTAMP\u003c/code\u003e 类型是相似的。这个章节描述了它们的特性以及它们的相似点与不同点。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eDATETIME\u003c/code\u003e 类型可用于需要同时包含日期和时间信息的值。MySQL 以 \u003ccode\u003e'YYYY-MM-DD HH:MM:SS'\u003c/code\u003e 格式检索与显示 \u003ccode\u003eDATETIME\u003c/code\u003e 类型。支持的范围是 \u003ccode\u003e'1000-01-01 00:00:00'\u003c/code\u003e 到 \u003ccode\u003e'9999-12-31 23:59:59'\u003c/code\u003e。(“支持”的含义是,尽管更早的值可能工作,但不能保证他们均可以。)\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eDATE\u003c/code\u003e 类型可用于需要一个日期值而不需要时间部分时。MySQL 以 \u003ccode\u003e'YYYY-MM-DD'\u003c/code\u003e 格式检索与显示 \u003ccode\u003eDATE\u003c/code\u003e 值。支持的范围是 \u003ccode\u003e'1000-01-01'\u003c/code\u003e 到 \u003ccode\u003e'9999-12-31'\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eTIMESTAMP\u003c/code\u003e 列类型提供了一种类型,通过它你可以以当前操作的日期和时间自动地标记 \u003ccode\u003eInsert\u003c/code\u003e 或\u003ccode\u003eUpdate\u003c/code\u003e 操作。如果一张表中有多个 \u003ccode\u003eTIMESTAMP\u003c/code\u003e 列,只有第一个被自动更新。\u003c/p\u003e\n\u003cp\u003e自动更新第一个 \u003ccode\u003eTIMESTAMP\u003c/code\u003e 列在下列任何条件下发生:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e列值没有明确地在一个 \u003ccode\u003eInsert\u003c/code\u003e 或 \u003ccode\u003eLOAD DATA INFILE\u003c/code\u003e 语句中被指定。\u003c/li\u003e\n\u003cli\u003e列值 …\u003c/li\u003e\u003c/ul\u003e"
August 8, 2007
从日志中恢复SQLServer数据库到时间点
"\u003cp\u003e DB2中可以使得数据库回复到指定的时间点,SQL Server数据库的Recovery Model为full 或者Bulk copy的时候,是可以从日志来恢复数据库的。实际上日志中记录的一条一条的transact sql语句,恢复数据库的时候会redo这些sql语句。\u003c/p\u003e\n\u003cp\u003e前提条件:myBBS是数据库test中的一个表,\u003c/p\u003e\n\u003cp\u003e 数据库test的Recovery Model为Full,Auto Close,Auto Shrink两个选项未选中。\u003c/p\u003e\n\u003cp\u003e 数据库test的data files和log files均为默认的自动增长状态。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://www.mx68.com/WebDeveloper/UploadFiles_5122/200603/2006310142248361.jpg\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003eA:2004/10/13,16:00进行数据库备份,backup database test to disk=’d:\\db\\1600.bak’ with init\u003c/p\u003e\n\u003cp\u003eB:2004/10/14,13:00对数据库进行了update,delete等操作;\u003c/p\u003e\n\u003cp\u003eC:2004/10/15,18:00使用delete mybbs where id\u0026gt;300时,语句误写成delete mybbs,因而删除了表mybbs中的所有数据。\u003c/p\u003e\n\u003cp\u003e现 …\u003c/p\u003e"
August 7, 2007
在sql server中改变表的所有者
"\u003cp\u003e 在对数据库进行移植的时候,经常会发现表的所有者发生了改变,而造成数据表拒绝访问,我们可以通过下面的语句来修改数据表的所有者:\u003c/p\u003e\n\u003cp\u003eEXEC sp_changeobjectowner ‘super.article’, ‘dbo’\u003c/p\u003e\n\u003cp\u003e这个我们就可以dbo的身份对数据库中的表进行相应的操作了!\u003c/p\u003e"