python开发规范(Guido van Rossum&&Barry Warsaw )(PEP8)

这份规范是python编程者必看的一份文档,最初是来自python之父的Guido van Rossum的python风格指南,官方的编号为PEP:8,原始地址为:http://www.python.org/dev/peps/pep-0008/
PEP: 8
Title: Style Guide for Python Code
Version: 00f8e3bb1197
Last-Modified: 2011-06-13 12:48:33 -0400 (Mon, 13 Jun 2011)
Author: Guido van Rossum <guido at python.org>, Barry Warsaw <barry at python.org>
Status: Active
Type: Process
Created: 05-Jul-2001
Post-History: 05-Jul-2001
    中文版请见PDF附件:Python开发编码规范(本文的翻译是由 hoxide、dreamingk、xyb、RedWolf 完成)

阅读全文 »

如何成为Python高手(How to become a proficient Python programmer )

本文是从 How to become a proficient Python programmer 这篇文章翻译而来。 这篇文章主要是对我收集的一些文章的摘要。因为已经有很多比我有才华的人写出了大量关于如何成为优秀Python程序员的好文章。 我的总结主要集中在四个基本题目上:函数式编程,性能,测试,编码规范。如果一个程序员能将这四个方面的内容知识都吸收消化,那他/她不管怎样都会有巨大的收获。 函数式编程 命令式的编程风格已经成为事实上的标准。命令式编程的程序是由一些描述状态转变的语句组成。虽然有时候这种编程方式十分的有效,但有时也不尽如此(比如复杂性) —— 而且,相对于声明式编程方式,它可能会显得不是很直观。 如果你不明白我究竟是在说什么,这很正常。这里有一些文章能让你脑袋开窍。但你要注意,这些文章有点像《骇客帝国》里的红色药丸 —— 一旦你尝试过了函数式编程,你就永远不会回头了。 http://www.amk.ca/python/writing/functional http://www.secnetix.de/olli/Python/lambda_functions.hawk http://docs.python.org/howto/functional.html 性能 你会看到有如此多的讨论都在批评这些“脚本语言”(Python,Ruby)是如何的性能低下,可是你却经常的容易忽略这样的事实:是程序员使用的算法导致了程序这样拙劣的表现。 这里有一些非常好的文章,能让你知道Python的运行时性能表现的细节详情,你会发现,通过这些精炼而且有趣的语言,你也能写出高性能的应用程 序。而且,当你的老板质疑Python的性能时,你别忘了告诉他,这世界上第二大的搜索引擎就是用Python写成的 —— 它叫做Youtube(参考 Python摘录 ) http://jaynes.colorado.edu/PythonIdioms.html http://wiki.python.org/moin/PythonSpeed/PerformanceTips 测试 如今在计算机科学界,测试可能是一个最让人不知所措的主题了。有些程序员能真正的理解它,十分重视TDD(测试驱动开发)和它的后继者BDD(行为 驱动开发)。而另外一些根本不接受,认为这是浪费时间。那么,我现在将告诉你:如果你不曾开始使用TDD/BDD,那你错过了很多最好的东西! 这并不只是说引入了一种技术,可以替换你的公司里那种通过愚蠢的手工点击测试应用程序的原始发布管理制度,更重要的是,它是一种能够让你深入理解你 自己的业务领域的工具 —— 真正的你需要的、你想要的攻克问题、处理问题的方式。如果你还没有这样做,请试一下。下面的这些文章将会给你一些提示: http://www.oreillynet.com/lpt/a/5463 http://www.oreillynet.com/lpt/a/5584 http://wiki.cacr.caltech.edu/danse/index.php/Unit_testing_and_Integration_testing http://docs.python.org/library/unittest.html 编码规范 并非所有的代码生来平等。有些代码可以被另外的任何一个好的程序员读懂和修改。但有些却只能被读,而且只能被代码的原始作者修改 —— 而且这也只是在他或她写出了这代码的几小时内可以。为什么会这样?因为没有经过代码测试(上面说的)和缺乏正确的编程规范。 下面的文章给你描述了一个最小的应该遵守的规范合集。如果按照这些指导原则,你将能编写出更简洁和漂亮的代码。作为附加效应,你的程序会变得可读性更好,更容易的被你和任何其他人修改。 http://www.python.org/dev/peps/pep-0008/ http://www.fantascienza.net/leonardo/ar/python_best_practices.html 那就去传阅这这些资料吧。从坐在你身边的人开始。也许在下一次程序员沙龙或编程大会的时候,也已经成为一名Python编程高手了! 祝你学习旅途顺利。 如果你喜欢这些文章,请在微博上顶一下,让其他人也知道。 本文原始地址: 如何成为Python高手 ...

阅读全文 »

Beautiful Soup 中文文档之二

剖析 HTML 使用 BeautifulSoup 类剖析HTML文档。 BeautifulSoup会得出以下一些信息: 有些标签可以内嵌 如:BLOCKQUOTE,有些不行 如:P table和list标签有一个自然的内嵌顺序。例如,TD标签内为TR标签,而不会相反。 SCRIPT 标签的内容不会被剖析为HTML。 META 标签可以知道文档的编码类型。 这是运行例子: 这是运行例子: from BeautifulSoup import BeautifulSoup html = " html p Para 1 p Para 2 blockquote Quote 1 blockquote Quote 2" soup = BeautifulSoup ( html ) print soup . prettify () # html # p #   Para 1 # /p # p #   Para 2 # blockquote #    Quote 1 # blockquote #     Quote 2 # /blockquote # /blockquote # /p # /html 注意: BeautifulSoup 会智能判断那些需要添加关闭标签的位置,即使原始的文档没有。 也就是说那个文档不是一个有效的HTML,但是它也不是太糟糕。下面是一个比较糟糕的文档。在一些问题中,它的 FORM 的开始在 TABLE 外面,结束在 TABLE 里面。 (这种HTML在一些大公司的页面上也屡见不鲜) from BeautifulSoup import BeautifulSoup html = """ html form table td input name="input1" Row 1 cell 1 tr td Row 2 cell 1 /form td Row 2 cell 2 br This /br sure is a long cell /body /html """ Beautiful Soup 也可以处理这个文档: print BeautifulSoup ( html ). prettify () # html # form # table # td # input name="input1" / #     Row 1 cell 1 # /td # tr # td #      Row 2 cell 1 # /td # /tr # /table # /form # td #   Row 2 cell 2 # br / #   This #   sure is a long cell # /td # /html table的最后一个单元格已经在标签 TABLE 外了;Beautiful Soup 决定关闭 TABLE 标签当它在 FORM 标签哪里关闭了。写这个文档家伙原本打算使用 FORM 标签扩展到table的结尾,但是Beautiful Soup 肯定不知道这些。即使遇到这样糟糕的情况, Beautiful Soup 仍可以剖析这个不合格文档,使你开业存取所有数据。 剖析 XML BeautifulSoup 类似浏览器,是个具有启发性的类,可以尽可能的推测HTML文档作者的意图。但是XML没有固定的标签集合,因此这些启发式的功能没有作用。因此 BeautifulSoup 处理XML不是很好。 使用 BeautifulStoneSoup 类剖析XML文档。它是一个概括的类,没有任何特定的XML方言已经简单的标签内嵌规则。下面是范例: from BeautifulSoup import BeautifulStoneSoup xml = " doc tag1 Contents 1 tag2 Contents 2 tag1 Contents 3" soup = BeautifulStoneSoup ( xml ) print soup . prettify () # doc # tag1 #   Contents 1 # tag2 #    Contents 2 # /tag2 # /tag1 # tag1 #   Contents 3 # /tag1 # /doc BeautifulStoneSoup 的一个主要缺点就是它不知道如何处理 自结束标签 。 HTML 有固定的自结束标签集合,但是XML取决对应的DTD文件。你可以通过传递 selfClosingTags 的参数的名字到 BeautifulStoneSoup 的构造器中,指定自结束标签: from BeautifulSoup import BeautifulStoneSoup xml = " tag Text 1 selfclosing Text 2" print BeautifulStoneSoup ( xml ). prettify () # tag #  Text 1 # selfclosing #   Text 2 # /selfclosing # /tag print BeautifulStoneSoup ( xml , selfClosingTags =[ 'selfclosing' ]). prettify () # tag #  Text 1 # selfclosing / #  Text 2 # /tag 如果它不工作 这里有 一些其他的剖析类 使用与上述两个类不同的智能感应。你也可以 子类化以及定制一个剖析器 使用你自己的智能感应方法。 使用Unicode的Beautiful Soup,Dammit 当你的文档被剖析之后,它就自动被转换为unicode。 Beautiful Soup 只存储Unicode字符串。 from BeautifulSoup import BeautifulSoup soup = BeautifulSoup("Hello") soup.contents[0] # u'Hello' soup.originalEncoding # 'ascii' 使用UTF-8编码的日文文档例子: from BeautifulSoup import BeautifulSoup soup = BeautifulSoup("xe3x81x93xe3x82x8cxe3x81xaf") soup.contents[0] # u'u3053u308cu306f' soup.originalEncoding # 'utf-8' str(soup) # 'xe3x81x93xe3x82x8cxe3x81xaf' # Note: this bit uses EUC-JP, so it only works if you have cjkcodecs # installed, or are running Python 2.4. soup.__str__('euc-jp') # 'xa4xb3xa4xecxa4xcf' Beautiful Soup 使用一个称为 UnicodeDammit 的类去来检测文档的编码,并将其转换为Unicode。如果你需要为其他文档(没有石油Beautiful Soup剖析过得文档)使用这转 ...

阅读全文 »

Python 悖论

日前, 我提到 Python 程序员要比使用 Java 工作的程序员更聪明。大家也许会有点疑惑吧。 我并没有 "Java 程序员何其盲目" 的意思, 我只想说 Python 程序员是很聪明的。学习一种新的编程语言都是需要花点工夫的 ──── 而 Python 并不能用来找工作。人们学习 Python 只是因为他们率真地喜欢编程, 而目前所有已知的编程语言都不能使他们满足。 这使得这种程序员成为软件公司心目中最为理想的雇员。介于此, 目前还没有一个更好的词, 我姑且叫它 Python 悖论吧: 如果公司选用一种颇为曼妙的编程语言, 他能雇到好的程序员, 因为好的编程语言总是能够吸引到优秀的程序员。然后悖论就来了: 这种语言会很快流行, 会有许多工作机会, 然后这种语言 (比如 Java) 就堕落成程序员的敲门砖了。 只有少数公司能够清醒地认识到这一点。但是还有另一种可能, 就是公司里的程序员都非常热爱他们的编程工作于是一拍即合, 从而逃离这个悖论的影响。Google, 比如说。当他们刊登招聘 Java 程序员的广告时, 同时也要求有 Python 的编程经历。 我有一个几乎懂得所有编程语言的朋友, 几乎所有的项目他都在使用 Python。据他自己说主要是因为, "他喜欢 Python 源代码在视觉感官上的体验"。对于语言的选择, 这是一个看似非常轻佻的理由。但它实际上并没有听上去那么卤莽: 当你编程时, 比起书写代码你得花更多的时间去阅读它们。如同雕塑家将泥一块一块地涂到艺术品上, 你的代码被一行一行地添加上去。因此, 如果一种语言写出的代码不那么漂亮, 它会让严谨的程序员抓狂, 恰如一位雕塑家看到一个充满瑕疵的作品一样。 既然提到了丑陋的代码, 许多人理所当然地会想到 Perl。但是 Perl 代码的丑陋只是表象, 并不是我所说的那种丑陋的类型。真正的丑陋不是肤浅地从字面代码上来评判, 而是你被迫基于一种错误的观念来架构你的程序。也许看上去 Perl 像是 "$%^ $#@! ...", 但是有许多案例证明他其实拥有比 Python 更先进的理念。 迄今为止, 不管怎么说。这两种语言尽管设计的目标不同, 但是它们, 包括 Ruby (以及 Icon, Joy, J, Lisp, 和 Smalltalk) 都是为那些真正关心程序的人创建, 并给他们使用的。这是事实。这些程序员总会试图去做得更好。 The Python Paradox August 2004 (原文地址: http://www.paulgraham.com/pypar.html) In a recent talk I said something that upset a lot of people: that you could get smarter programmers to work on a Python project than you could to work on a Java project. I didn't mean by this that Java programmers are dumb. I meant that Python programmers are smart. It's a lot of work to learn a new programming language. And people don't learn Python because it will get them a job; they learn it because they genuinely like to program and aren't satisfied with the languages they already know. Which makes them exactly the kind of programmers companies should want to hire. Hence what, for lack of a better name, I'll call the Python paradox: if a company chooses to write its software in a comparatively esoteric language, they'll be able to hire better programmers, because they'll attract only those who cared enough to learn it. And for programmers the paradox is even more pronounced: the language to learn, if you want to get a good job, is a language that people don't learn merely to get a job. Only a few companies have been smart enough to realize this so far. But there is a kind of selection going on here too: they're exactly the companies programmers would most like to work for. Google, for example. When they advertise Java programming jobs, they also want Python experience. A friend of mine who knows nearly all the widely used languages uses Python for most of his projects. He says the main reason is that he likes the way source code looks. That may seem a frivolous reason to choose one language over another. But it is not so frivolous as it sounds: when you program, you spend more time reading code than writing it. You push blobs of source code around the way a sculptor does blobs of clay. So a language that makes source code ugly is maddening to an exacting programmer, as clay full of lumps would be to a sculptor. At the mention of ugly source code, people will of course th ...

阅读全文 »

python程序员的进化(The Evolution of a Python Programmer )

不久前,在互联网上出现了一篇有趣的文章,讲的是对于同一个问题,不同层次的程序员编出的Python代码显示出了不同的风格,代码都很简单,有趣。这篇文章的原始出处在 这里 ,我把它整理了一下,并修改了几处错误。 编程新手 1 2 3 4 5 6 def factorial ( x ) : if x == 0 : return 1 else : return x * factorial ( x - 1 ) print factorial ( 6 ) 一年编程经验(学Pascal的) 1 2 3 4 5 6 7 8 def factorial ( x ) : result = 1 i = 2 while i = x: result = result * i i = i + 1 return result print factorial ( 6 ) 一年编程经验(学C的) 1 2 3 4 5 6 7 8 9 def fact ( x ) : #{ result = i = 1 ; while ( i = x ) : #{ result * = i ; i += 1 ; #} return result ; #} print ( fact ( 6 ) ) 一年编程经验(读过 SICP ) 1 2 3 4 5 @tailcall def fact ( x, acc= 1 ) : if ( x 1 ) : return ( fact ( ( x - 1 ) , ( acc * x ) ) ) else : return acc print ( fact ( 6 ) ) 一年编程经验(Python) 1 2 3 4 5 6 def Factorial ( x ) : res = 1 for i in xrange ( 2 , x + 1 ) : res * = i return res print Factorial ( 6 ) 懒惰的Python程序员 1 2 3 def fact ( x ) : return x 1 and x * fact ( x - 1 ) or 1 print fact ( 6 ) 更懒的Python程序员 1 2 f = lambda x: x and x * f ( x - 1 ) or 1 print f ( 6 ) Python 专家 1 2 fact = lambda x: reduce ( int . __mul__ , xrange ( 2 , x + 1 ) , 1 ) print fact ( 6 ) Python 黑客 1 2 3 4 5 6 import sys @tailcall def fact ( x, acc= 1 ) : if x: return fact ( x. __sub__ ( 1 ) , acc. __mul__ ( x ) ) return acc sys . stdout . write ( str ( fact ( 6 ) ) + ' n ' ) 专家级程序员 1 2 from c_math import fact print fact ( 6 ) 大英帝国程序员 1 2 from c_maths import fact print fact ( 6 ) Web 设计人员 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 def factorial ( x ) : #------------------------------------------------- #--- Code snippet from The Math Vault --- #--- Calculate factorial (C) Arthur Smith 1999 --- #------------------------------------------------- result = str ( 1 ) i = 1 #Thanks Adam while i = x: #result = result * i #It's faster to use *= #result = str(result * result + i) #result = int(result *= i) #?????? result = str ( int ( result ) * i ) #result = int(str(result) * i) i = i + 1 return result print factorial ( 6 ) Unix 程序员 1 2 3 4 import os def fact ( x ) : os . system ( 'factorial ' + str ( x ) ) fact ( 6 ) Windows 程序员 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 NULL = None def CalculateAndPrintFactorialEx ( dwNumber, hOutputDevice, lpLparam, lpWparam, lpsscSecurity, * dwReserved ) : if lpsscSecurity ! = NULL: return NULL #Not implemented dwResult = dwCounter = 1 while dwCounter = dwNumber: dwResult * = dwCounter dwCounter += 1 hOutputDevice. write ( str ( dwResult ) ) hOutputDevice. write ( ' n ' ) return 1 import sys CalculateAndPrintFactorialEx ( 6 , sys . stdout , NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ) 企业级程序员 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 def new ( cls, * args, ** kwargs ) : return cls ( * args, ** kwargs ) class Number ( object ) : pass class IntegralNumber ( int , Number ) : def toInt ( self ) : return new ( int , self ) class InternalBase ( object ) : def __init__ ( self , base ) : self . base = base. toInt ( ) def getBase ( self ) : return n ...

阅读全文 »

python提升运行速度一例

尝试了一下用Python实现的K-Means Clustering算法,抽样了10000篇百科词条,分为1000个类,分词后词语总数为130000左右。如果把1000个类定义为1000个向量,每个向量的元素个数为130000,K-Means Clustering算法的第一步是初始化这1000个向量的值,如果每个向量元素的值用float型存储,则需要的内存为: 1000 * 130000 * sizeof(float) 约 520M 左右。 最初用Python的list存储,动态扩展列表大小,结果内存用到近3G还没初始化完成,只好赶紧kill掉了。 改用 NumPy 存成固定数组的类别,发现内存使用量和计算结果基本一致,而且NumPy支持数组的数学计算,确实方便了不少,但即便如此,性能仍不够理想,K-Means算法第一次迭代花了一个小时还没完成。 怀疑K-Means算法的pearson距离计算时间较长(没有用profile工具论证过),用 Cython 重新改写了该算法,并尽可能缓存计算中间结果。第一轮迭代耗时1个多小时,算是有了进步。 由于K-Means算法费CPU较多,改写了计算逻辑,用multiprocessing模块并行计算,在4核的CPU上速度提升了4倍,第一轮迭代花了约30分钟。但multiprocessing需要fork多个进程,每个进程的内存使用量均在600M上下想,4个进程占用了2.4G内存,代价有些大。而且计算结果在不同的进程间传递,性能开销也是存在的。 multiprocessing + 共享内存可以解决这个问题,但Python的数据结构不好表示。 继而想到写C的动态链接库,用Python的ctypes模块调用该动态链接库完成计算过程,C的动态链接库则创建系统线程,这样能有效躲过Python的GIL。问题是C代码有时候确实需要访问Python的数据对象,这只能通过Python的C扩展模块实现了,但C的扩展模块能访问ctypes的原始C指针吗?如果只能通过Python的C API访问,则GIL是绕不开的,我们的目标是尽可能少地锁住Python虚拟机。 解决办法是修改Python的ctypes源码,让它导出函数 addressof 的C API,这样在其他的C扩展模块里就能拿到ctypes的原始数据块指针。addressof的返回结果是一个long的PyObject包装对象,通过 PyLong_AsVoidPtr调用即可获取其值。 因此最后的解决办法是下载Python的源码,修改模块_ctypes的源码,通过Capsule导出C API。继而编写Python的C扩展模块,创建线程池,直接操作ctypes定义的数据内存。由于Python数据结构是非线程安全的,访问它们仍需获得GIL,但用到的可能性很小。程序的主体逻辑仍由Python代码构造,包括必要的ctypes数据结构。 代码改写后一次K-Means迭代不到一分钟就完成了,4颗CPU全跑满,内存仅占用600M左右,跟预期完全一致。 总结 Python大多数时间能如我们预期那样工作 涉及到数值计算和海量循环,Python表现极其糟糕 Cython + NumPy 可解决部分计算问题和内存问题,但GIL无法避免 multiprocessing能解决SMP/GIL问题,但内存问题解决不了,也许共享内存+ctypes是个办法,没尝试过 ctypes + C的动态链接库创建系统线程能解决GIL和内存共享问题,但无法在C中操作Python对象 ctypes + Python C扩展意义不大,因为C扩展无法直接操作ctypes的数据指针 改写后的ctypes + Python C扩展解决了性能和内存消耗问题 ctypes数据类型能被msgpack之类的工具快速序列化到磁盘,但恢复的时候只能恢复成list类型,这可能是美中不足的地方。 ...

阅读全文 »

python 自动化测试模块介绍

 

Win32 GUI自动化测试模块:

1. pywinauto:

    下载链接:http://sourceforge.net/projects/pywinauto/

    在线文档:http://pywinauto.googlecode.com/hg/pywinauto/docs/contents.html

    邮件列表:https://lists.sourceforge.net/lists/listinfo/pywinauto-users

    其它相关链接: http://code.google.com/p/pywinauto/

2. Watsup: http://www.tizmoi.net/watsup/intro.html

3. winGuiAuto: http://www.brunningonline.net/simon/blog/archives/winGuiAuto.py.html

Web 自动化测试模块

1. twill: 项目主页:http://twill.idyll.org/

2. PAMIE: 项目主页: http://pamie.sourceforge.net/

远程操作、命令行控制类的自动化测试:

1. 项目主页:http://www.noah.org/wiki/Pexpect

2. 探索Pexpect,第 1 部分:剖析 Pexpect : http://www.ibm.com/developerworks/cn/linux/l-cn-pexpect1/

3. 探索Pexpect,第 2 部分:Pexpect 的实例分析 : http://www.ibm.com/developerworks/cn/linux/l-cn-pexpect2/

阅读全文 »

基本遗传算法(GA)

1、基本遗传算法描述 遗传算法在自然与社会现象模拟、工程计算等方面得到了广泛的应用。在各个不同的应用领域,为了取得更好的结果,人们对GA进行了大量的改进,为了不至于混淆,我们把Holland提出的算法称为基本遗传算法,简称 GA、SGA(Simple Genetic Algorithm )、CGA(Canonical Genetic Algorithm),将其它的 GA类 算法称为GAs(Genetic Algorithms),可以把GA看作是GAs的一种特例。 1.1、 基本遗传算法的构成要素 染色体编码方法 基本遗传算法使用固定长度的二进制符号串来表示群体中的个体,其等位基因由二值符号集{0,1}组成。初始群体中各个个体的基因值用均匀分布的随机数来生成。如:x;100111001000101101就可表示一个个体,该个体的染色体长度是 l=18。 个体适应度评价 基本遗传算法按与个体适应度成正比的概率来决定当前群体中每个个体遗传到下一代群体中的机会多少。为正确计算这个概率,这里要求所有个体的适应 度必须为正数或零。这样,根据不同种类的问题,必须预先确定好由目标函数值到个体适应度之间的转换规则,特别是要预先确定好当目标函数值为负数时的处理方法。 遗传算子 基本遗传算法使用下述三种遗传算子: 选择运算:使用比例选择算子; 交叉运算:使用单点交叉算子; 变异运算:使用基本位变异算子。 基本遗传算法的运行参数 基本遗传算法有下述4个运行参数需要提前设定: M:群体大小,即群体中所含个体的数量,一般取为20 ~ 100。 T:遗传运算的终止进化代数,一般取为100 ~ 500 pc:交叉概率,一般取为0.4 ~ 0.99 pm:变异概率,一般取为 0.0001 ~ 0.1 这4个运行参数对遗传算法的求解结果和求解效率都有一定的影响,但目前尚无合理选择它们的理论依据。在遗传算法的实际应用中,往往需要经过多次试算后才能确定出这些参数合理的取值大小或取值范围。 1.2、基本遗传算法的形式化定义 基本遗传算法可定义为一个7元组: GA= (M, F, s, c, m, pc, pm ) M 群体大小; F 个体适应度评价函数; s 选择操作算于; c 交叉操作算子: m 变异操作算于; pc 交叉概率; pm 变异概率; 1.3、基本遗传算法描述 Procedure GA Begin initialize P(0); t=0; while (t =T) do for i=1 to M do Evaluate fitness of P(t); end for for i=1 to M do Select operation to P(t); end for for i=1 to M/2 do Crossover operation to P(t); end for for i=1 to M do Mutation operation to P(t); end for for i=1 to M do P(t+1) = P(t); end for t=t+1 end while end ...

阅读全文 »

memcache与memcached区别和安装

1.首先来看看memcache与memcached的区别: Memcache是一个高性能的分布式的内存对象缓存系统,用于加速动态web应用程序,减轻数据库负载。Memcache官方网站: http://memcached.org/ 。 而Memcached是该系统的主程序文件,以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,使用共享内存存取数据。 PHP中的memcache是用于连接Memecached的客户端组件。 2.memcache与memcached的安装和启动: php的memcache扩展安装:(首先需要下载好 memcache的源码包 ) tar xvf memcache-3.0.3.tgz cd memcache-3.0.3 (/usr/local/php/bin/)phpize ./configure --with-php-config=/usr/local/php5/bin/php-config --enable-memcache make make install (下面是根据各自的环境不同设置不同) 编译出来的memcache.so保存在 /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/ 目录下,如果你的环境不一样,你得根据自己情况修改你的php.ini了。 接着要做的工作就是让php加载这个扩展,编辑你的php.ini,在适当位置(通常是最后,也可以是独立的一个ini文件)加入如下行: extension=memcache.so 接着重启nginx或者apache等服务器,打开phpinfo的网页查看memcache的信息,到这里php的memcache扩展已经安装完成了。 memcached的安装: 由于memcached依赖libevent来处理很多的连接,所以需要先确定libevent是否已经安装,如果libevent没有安装的话,需要先把libevent的包下载下来(需要下载稳定包) cd /tmp tar zxvf libevent-1.4.7-stable.tar.gz cd libevent-1.4.7-stable ./configure --prefix=/usr make make install 安装memcached(先下载memached源码) cd /tmp tar zxvf memcached-1.4.7.tar.gz cd memcached-1.4.7 ./configure --with-libevent=/usr make make install 启动memcached /usr/local/bin/memcached -d -m 2048 -u root -l 192.168.1.20 -p 12111 -c 1024 -P /tmp/memcached.pid 参数说明: -d 启动为守护进程 -m num 分配给Memcached使用的内存数量,单位是MB,默认为64MB -u username 运行Memcached的用户,仅当作为root运行时 -l ip_addr 监听的服务器IP地址,默认为环境变量INDRR_ANY的值 -p num 设置Memcached监听的端口,最好是1024以上的端口 -c num 设置最大并发连接数,默认为1024 -P file 设置保存Memcached的pid文件,与-d选择同时使用 简单的测试用例: ?php $mem = new Memcache; $mem- connect( 127.0.0.1 , 11211); $mem- set( key , This is a test! , 0, 60); $val = $mem- get( key ); echo $val; ? ...

阅读全文 »

FTP的架设(基于linux(centos))

1.下载vsftpd yum install vsftpd 2.启动/重启/关闭vsftpd服务器(/sbin/service vsftpd restart|start|stop) [root@localhost ftp]# /sbin/service vsftpd restart Shutting down vsftpd: [ OK ] Starting vsftpd for vsftpd: [ OK ] OK表示重启成功了. 启动和关闭分别把restart改为start/stop即可. 如果是源码安装的,到安装文件夹下找到start.sh和shutdown.sh文件,执行它们就可以了. 3.与vsftpd服务器有关的文件和文件夹 vsftpd服务器的配置文件的是: /etc/vsftpd/vsftpd.conf vsftpd服务器的根目录,即FTP服务器的主目录: 在/var/ftp处pub处 如果你想修改服务器目录的路径,那么你只要修改/var/ftp到别处就行了 4.添加FTP本地用户 有的FTP服务器需要用户名和密码才能登录,就是因为设置了FTP用户和权限. FTP用户一般是不能登录系统的,只能进入FTP服务器自己的目录中,这是为了安全.这样的用户就叫做虚拟用户了.实际上并不是真正的虚拟用户,只是不能登录SHELL了而已,没能力登录系统. /usr/sbin/adduser -d /opt/test_ftp -g ftp -s /sbin/nologin test 这个命令的意思是: 使用命令(adduser)添加test用户,不能登录系统(-s /sbin/nologin),自己的文件夹在(-d /opt/test_ftp)),属于组ftp(-g ftp) 然后你需要为它设置密码 passwd test 这样就添加了一个FTP用户了.下面的示例可以帮助你进入FTP服务器了. [root@localhost ftp]# ftp ftp open 192.168.0.33 Connected to 192.168.0.33 (192.168.0.33). 220 (vsFTPd 2.0.5) Name (192.168.0.33:gxl): test 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp quit 221 Goodbye. 在windows中,只要在浏览器中输入 ftp://192.168.0.33 进入FTP服务器,然后 右键 登录,输入用户名和密码就可以登录自己的目录了. 当然你要保证自己能读写自己的目录,就要在配置文件vsftpd.conf里设置一下就可以读写了. local_enable=yes write_enable=yes local_umask=022 5.匿名上传下载 修改配置文件即可vsftpd.conf,确定有以下几行,没有自己添加进去就可以了. anonymous_enable=yes anon_upload_enable=yes anon_mkdir_write_enable=yes anon_umask=022 然后你可以新建一个文件夹,修改它的权限为完全开放,任何用户就可以登录这个文件夹,并上传下载文件: mkdir /var/ftp/guest chmod 777 /var/ftp/guest 6.定制进入FTP服务器的欢迎信息 在vsftpd.conf文件中设置: dirmessage_enable=yes 然后进入用户目录建立一个.message文件,输入欢迎信息即可(我这里写入的是Welcome to gxlinux's FTP!): [root@localhost test_ftp]# ftp 192.168.0.33 Connected to 192.168.0.33 (192.168.0.33). 220 (vsFTPd 2.0.5) Name (192.168.0.33:gxl): test 331 Please specify the password. Password: 230-Welcome to gxlinux's FTP! 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. 7.实现虚拟路径 将某个目录挂载到FTP服务器下供用户使用,这就叫做虚拟路径. 比如将gxl用户的目录挂载到FTP服务器中,供FTP服务器的用户使用,使用如下命令即可: [root@localhost opt]# mount --bind /home/gxl /var/ftp/pub #使用挂载命令 [root@localhost opt]# ls /var/ftp/pub 8.打开vsFTPd的日志功能 添加下面一行到vsftpd.conf文件中,一般情况下该文件中有这一行,只要把前面的注释符号#去掉即可,没有的话就添加,或者修改: xferlog_file=/var/log/vsftpd.log 9.限制链接数,以及每个IP最大的链接数 修改配置文件中,例如vsftp最大支持链接数100个,每个IP能支持5个链接: max_client=100 max_per=5 10.限制传输速度 修改配置文件中,例如让匿名用户和vsftd上的用户(即虚拟用户)都以100KB=1024*100=102400的速度下载 anon_max_rate=102400 local_max_rate=102400 11.将用户(一般指虚拟用户)限制在自家目录 修改配置文件中,这样用户就只能访问自己家的目录了: chroot_local_user=yes 如果只想某些用户仅能访问自己的目录,其它用户不做这个限制,那么就需要在chroot_list文件(此文件一般是在/etc/vsftpd/中)中添加此用户. 编辑此文件,比如将test用户添加到此文件中,那么将其写入即可.一般的话,一个用户占一行. [root@localhost vsftpd]# cat chroot_list test 12.绑定某个IP到vsFTPd 有时候要限制某些IP访问服务器,只允许某些IP访问,例如只允许192.168.0.33访问这个FTP,同样修改配置文件: listen_addres ...

阅读全文 »