以下摘自:《卓有成效的程序员》之自动化

我经常会一次往Subversion里添加一批文件。在使用命令行做这件事时,你必须指定所有想要添加的文件名。如果文件不多的话这还不算太糟糕,但如果你要添加20个文件,那就费事了。当然你也可以用通配符,但这样一来就可能匹配到已经在版本控制之下的文件(这不会有什么损害,只不过会输出一堆错误信息,可能会跟别的错误信息混淆)。为了解决这个问题,我写了一行简单的bash命令:

svn st | grep ‘^\?’ | tr ‘^\?’ ‘ ‘ | sed ‘s/[ ]*//’ | sed ‘s/[ ]/\\ /g’ | xargs svn add

表4.3详细解释了这一行命令。

我大概花了15分钟写出这条命令,然后用了它成百上千次。

****************************************************

这个自动化过程已经很完美了,一个“简单”的shell脚本,这是一个权威编写并使用了百上千次的脚本。

然后我在一个博客中看到这样一个脚本:

svn st|awk ‘{print $2}’|xargs svn add。

乍看之下觉得更加精炼,仔细看下就会发现这个脚本没有区分文件状态。所以完善了以下这个脚本:

 

  1. svn st | awk ‘{if ( $1 == “?”) { print $2}}’ | xargs svn add

这样,以后我可能使用这个脚本成百上千次。(当然这个脚本也没有考虑过滤掉不要添加的文件)

当你第三次做一件事情的时候,就应该考虑将其工具化,自动化!

ubuntu 安装 nginx

2011/10/12 9:15 am  |  分类:nginx,ubunut

下载nginx源码包(从http://wiki.nginx.org/NginxChs上)

编译nginx需要指定pcre,zlib,openssl,既然我的系统没有安装这些包,我也不安装deb的包了,直接运行

然后也将nginx-0.6.32的包解压到/opt目录下,进入nginx目录,执行:
#./configure  –sbin-path=/usr/local/sbin –with-http_ssl_module –with-pcre=../pcre-7.7  –with-zlib=../zlib-1.2.3 –with-openssl=../openssl-0.9.8g
#make &&  make  install

如果在./configure时出现在错误,依次查询问题,一般情况下不会出现什么错误,但前提需要安装build-essential,如果没有安装,可执行以下命令安装编译环境
#apt-get  install  build-essential

默认nginx安装的目录在/usr/local/nginx下,包括:

/usr/local/nginx/sbin  #控制nginx启动文件
/usr/local/nginx/conf #配置文件
/usr/local/nginx/html  #默认网页文件
/usr/local/nginx/logs #日志文件

 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

转:http://docs.google.com/View?docid=dhf86kr9_302cssf49dh&hgd=1

Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理  服务器,相对Apache的臃肿,Nginx绝对是轻量级的,配置简单,本篇文章介绍如何在Ubuntu Hardy  上用源,码来编译Nginx。

一、选择版本

选 择从源码编译Nginx的大多数原因是可以采用最新的版本,而不局限于aptitude安装的旧版本,在写本文的时候,Nginx的最新稳定版本是  0.6.31(你可以到Nginx的官方站点查看最新版本),而aptitude安装的是0.5.33版本。
当然,采用源码编译会比aptitude麻烦一些,以后更新都需要DIY,如果你喜欢方便,且对版本不是很敏感的话,你可以参考前  面一篇文章“使用aptitude安装Nginx”采用aptitude来安装。

二、注意目录结构

需要注意的是,采用aptitude安装Nginx和从源码编译安装的Nginx的时候,目录结构是有  所不同的,使用aptitude安装的Nginx会在其安装目录中创建’sites-available’ 和  ‘sites-enabled’目录(貌似想Ubuntu上的Apache安装目录结构),而从源码编译的时候,并不会自动创建这两个目录的,后面我们会  说如何修改使得其达到一致(虽然可以不用修改,但是把每个web的配置放到一个配置文件中,总比混合在一起好)。

三、依赖关系

采用aptitude安装的时候,系统会将所有依赖的包都一并装上,但是使  用源码编译的时候就没这么智能了,我们需要找到需要的依赖包,然后手工安装,幸运的是,这并不复杂,也不多,例如pcre, ssl  和zlib,安装方法比较简单:

sudo aptitude install libpcre3 libpcre3-dev libpcrecpp0 libssl-dev  zlib1g-dev

四、安装Nginx

ok,准备工作做完了,是时候开始下载、 安装Nginx了。
1、创建一个目录

mkdir ~/sources
cd ~/sources/

2、 下载源代码

wget http://sysoev.ru/nginx/nginx-0.6.31.tar.gz

3、 解压

tar -zxvf nginx-0.6.31.tar.gz

cd  nginx-0.6.31/

4、选择需要的编译选项
Nginx的编译选项还是不少 的,你可以参考Nginx wiki的Install Options这个页面或者我下面的附录1来了解每个选项的详细信息,基本上都是定制位置和模块的,这里就是要两个模块就够了(要是你有自己的需求,自己DIY),分别  是:
1)–sbin-path=/usr/local/sbin
从源码编  译Nginx会安装在/usr/local/nginx目录下(你可以使用参数–prefix=<path>指定自己需要的位置),然后会  将bin文件放在/usr/local/nginx/sbin/nginx,虽然比较清晰,但是和我们一般的习惯不同(我们习惯在/usr/local  /sbin下寻找bin文件);
2)–with-http_ssl_module
这个没啥好说的,主要是提供https访问支持的。

5、  Compile

./configure –sbin-path=/usr/local/sbin  –with-http_ssl_module

编 译的时间不会很长,完成的时候你会在屏幕上看到类似下面的信息:


nginx path prefix: “/usr/local/nginx”
nginx binary file:  “/usr/local/sbin”
nginx configuration file:  “/usr/local/nginx/conf/nginx.conf”

留 意上面的提示,涉及到nginx的几个重要文件的路径信息。

6、Make && make  install
差不多快完成了,现在make一下。

make

sudo make install

7、chmod
还需 要给bin文件有执行权限,也比较简单:

chmod +x /usr/local/sbin/nginx

五、使用

安装完成后,试着使用下。
1、启动

sudo /usr/local/sbin/nginx    (启动)

/usr/local/sbin/nginx -s stop (停止)
/usr/local/sbin/nginx -s reload (重启)

 

 

 

 

然后把自己的浏览器导航到http://IP就可 以看到默认的欢迎界面了,如下:

2、停止
如果你使用过apache或者看到前面那篇使用aptitude安装Nginx的话,你可能会对/etc/init.d/下的那  个nginx脚本印象比较深刻,使用/etc/init.d/nginx可以直接start或者stop,但是,从源码编译的Nginx是没有自动创建这  个脚本的(后面会告诉你怎么手工创建),现在看看在没有创建这个脚本前,如何了stop。
或许你已经注意编译的时候,有这 个提示“nginx pid  file: “/usr/local/nginx/logs/nginx.pid””,你可以cat下看看,他记录的就是当前nginx的pid号,于是我们就可以这  样来停止nginx了。

sudo kill `cat /usr/local/nginx/logs/nginx.pid`

特别注意:这里使用的是反 引号(`)而不是单引号(‘).

六、小结

这篇 文章介绍了如何在Ubuntu上使用源码按照我们的需要来编译安装nginx,然后介绍了如何手工启动和停止nginx,前面也提到了,后续文章会介绍如  何创建init脚本,以及如何规划调整目录结构(sites-available  和sites-enabled);然后会介绍如何配置nginx使其更能发挥威力。

七、附录:Compile-time options

(原文参考:

http://wiki.codemongers.com/NginxInstallOptions )

configure 脚本确定系统所具有一些特性,特别是 nginx 用来处理连接的方法。然后,它创建 Makefile  文件。

configure 支持下面的选项:

1)目录属性

–prefix=<path> – Nginx安装路径。如果没有指定,默认为  /usr/local/nginx。

–sbin-path=<path> -  Nginx可执行文件安装路径。只能安装时指定,如果没有指定,默认为<prefix>/sbin/nginx。

–conf-path=<path> -  在没有给定-c选项下默认的nginx.conf的路径。如果没有指定,默认为<prefix>/conf/nginx.conf。

–pid-path=<path> -  在nginx.conf中没有指定pid指令的情况下,默认的nginx.pid的路径。如果没有指定,默认为  <prefix>/logs/nginx.pid。

–lock-path=<path> -  nginx.lock文件的路径,默认为<prefix>/logs/nginx.lock

–error-log-path=<path> -  在nginx.conf中没有指定error_log指令的情况下,默认的错误日志的路径。如果没有指定,默认为  <prefix>/logs/error.log。

–http-log-path=<path> -  在nginx.conf中没有指定access_log指令的情况下,默认的访问日志的路径。如果没有指定,默认为  <prefix>/logs/access.log。

–user=<user> -  在nginx.conf中没有指定user指令的情况下,默认的nginx使用的用户。如果没有指定,默认为 nobody。

–group=<group> -  在nginx.conf中没有指定user指令的情况下,默认的nginx使用的组。如果没有指定,默认为 nobody。

–builddir=DIR – 指定编译的目录

2)模块

–with-rtsig_module – 启用 rtsig 模块

–with-select_module–without-select_module -允许或不允许开启SELECT模式,如果 configure  没有找到更合适的模式,比如:kqueue(sun os),epoll (linux kenel 2.6+),  rtsig(实时信号)或者/dev/poll(一种类似select的模式,底层实现与SELECT基本相 同,都是采用轮训方法)  SELECT模式将是默认安装模式

–with-poll_module–without-poll_module – Whether or not to enable the poll  module. This module is enabled by default if a more suitable method such as  kqueue, epoll, rtsig or /dev/poll is not discovered by configure.

–with-http_ssl_module -开启HTTP  SSL模块,使NGINX可以支持HTTPS请求。这个模块需要已经安装了OPENSSL,在DEBIAN上是libssl

–with-http_realip_module – 启用  ngx_http_realip_module

–with-http_addition_module – 启用  ngx_http_addition_module

–with-http_sub_module – 启用  ngx_http_sub_module

–with-http_dav_module – 启用  ngx_http_dav_module

–with-http_flv_module – 启用  ngx_http_flv_module

–with-http_stub_status_module – 启用 “server  status” 页

–without-http_charset_module – 禁用  ngx_http_charset_module

–without-http_gzip_module – 禁用  ngx_http_gzip_module. 如果启用,需要 zlib 。

–without-http_ssi_module – 禁用  ngx_http_ssi_module

–without-http_userid_module – 禁用  ngx_http_userid_module

–without-http_access_module – 禁用  ngx_http_access_module

–without-http_auth_basic_module – 禁用  ngx_http_auth_basic_module

–without-http_autoindex_module – 禁用  ngx_http_autoindex_module

–without-http_geo_module – 禁用  ngx_http_geo_module

–without-http_map_module – 禁用  ngx_http_map_module

–without-http_referer_module – 禁用  ngx_http_referer_module

–without-http_rewrite_module – 禁用  ngx_http_rewrite_module. 如果启用需要 PCRE 。

–without-http_proxy_module – 禁用  ngx_http_proxy_module

–without-http_fastcgi_module – 禁用  ngx_http_fastcgi_module

–without-http_memcached_module – 禁用  ngx_http_memcached_module

–without-http_limit_zone_module – 禁用  ngx_http_limit_zone_module

–without-http_empty_gif_module – 禁用  ngx_http_empty_gif_module

–without-http_browser_module – 禁用  ngx_http_browser_module

–without-http_upstream_ip_hash_module – 禁用  ngx_http_upstream_ip_hash_module

–with-http_perl_module – 启用  ngx_http_perl_module

–with-perl_modules_path=PATH – 指定 perl  模块的路径

–with-perl=PATH – 指定 perl 执行文件的路径

–http-log-path=PATH – Set path to the http  access log

–http-client-body-temp-path=PATH – Set path  to the http client request body temporary files

–http-proxy-temp-path=PATH – Set path to the  http proxy temporary files

–http-fastcgi-temp-path=PATH – Set path to  the http fastcgi temporary files

–without-http – 禁用 HTTP server

–with-mail – 启用 IMAP4/POP3/SMTP 代理模块

–with-mail_ssl_module – 启用  ngx_mail_ssl_module

–with-cc=PATH – 指定 C 编译器的路径

–with-cpp=PATH – 指定 C 预处理器的路径

–with-cc-opt=OPTIONS – Additional parameters  which will be added to the variable CFLAGS. With the use of the system library  PCRE in FreeBSD, it is necessary to indicate –with-cc-opt=”-I  /usr/local/include”. If we are using select() and it is necessary to increase  the number of file descriptors, then this also can be assigned here:  –with-cc-opt=”-D FD_SETSIZE=2048″.

–with-ld-opt=OPTIONS – Additional parameters  passed to the linker. With the use of the system library PCRE in FreeBSD, it is  necessary to indicate –with-ld-opt=”-L /usr/local/lib”.

–with-cpu-opt=CPU – 为特定的 CPU  编译,有效的值包括:pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64,  sparc32, sparc64, ppc64

–without-pcre – 禁止 PCRE 库的使用。同时也会禁止 HTTP  rewrite 模块。在 “location” 配置指令中的正则表达式也需要 PCRE 。

–with-pcre=DIR – 指定 PCRE 库的源代码的路径。

–with-pcre-opt=OPTIONS – Set additional  options for PCRE building.

–with-md5=DIR – Set path to md5 library  sources.

–with-md5-opt=OPTIONS – Set additional  options for md5 building.

–with-md5-asm – Use md5 assembler  sources.

–with-sha1=DIR – Set path to sha1 library  sources.

–with-sha1-opt=OPTIONS – Set additional  options for sha1 building.

–with-sha1-asm – Use sha1 assembler  sources.

–with-zlib=DIR – Set path to zlib library  sources.

–with-zlib-opt=OPTIONS – Set additional  options for zlib building.

–with-zlib-asm=CPU – Use zlib assembler  sources optimized for specified CPU, valid values are: pentium, pentiumpro

–with-openssl=DIR – Set path to OpenSSL  library sources

–with-openssl-opt=OPTIONS – Set additional  options for OpenSSL building

–with-debug – 启用调试日志

–add-module=PATH – Add in a third-party module found in  directory  PATH
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=

php vld的使用

2011/10/11 11:09 am  |  分类:php

php -dvld.active=1 t.php

如上为VLD输出的PHP代码生成的中间代码的信息,说明如下:

  • Branch analysis from position 这条信息多在分析数组时使用。
  • Return found 是否返回,这个基本上有都有。
  • filename 分析的文件名
  • function name 函数名,针对每个函数VLD都会生成一段如上的独立的信息,这里显示当前函数的名称
  • number of ops 生成的操作数
  • compiled vars 编译期间的变量,这些变量是在PHP5后添加的,它是一个缓存优化。这样的变量在PHP源码中以IS_CV标记。
  • op list 生成的中间代码的变量列表

-dvld.active=1表示激活VLD扩展,使用VLD扩展输出中间代码,此命令在CMD中输出信息为

php -dvld.active=1 -dvld.verbosity=3 t.php //如果想看更加详细的内容。可以使用-dvld.verbosity参

php -dvld.active=1 -dvld.execute=0 t.php //只看输出的中间代码,并不想执行这段PHP代码

php -dvld.active=1 -dvld.save_dir=’D:\tmp’ -dvld.save_paths=1 -dvld.dump_paths=1 t.php //VLD扩展还支持输出.dot文件

总结一下,VLD扩展的参数列表:

  • -dvld.active 是否在执行PHP时激活VLD挂钩,默认为0,表示禁用。可以使用-dvld.active=1启用。
  • -dvld.skip_prepend 是否跳过php.ini配置文件中auto_prepend_file指定的文件, 默认为0,即不跳过包含的文件,显示这些包含的文件中的代码所生成的中间代码。此参数生效有一个前提条件:-dvld.execute=0
  • -dvld.skip_append 是否跳过php.ini配置文件中auto_append_file指定的文件, 默认为0,即不跳过包含的文件,显示这些包含的文件中的代码所生成的中间代码。此参数生效有一个前提条件:-dvld.execute=0
  • -dvld.execute 是否执行这段PHP脚本,默认值为1,表示执行。可以使用-dvld.execute=0, 表示只显示中间代码,不执行生成的中间代码。
  • -dvld.format 是否以自定义的格式显示,默认为0,表示否。可以使用-dvld.format=1, 表示以自己定义的格式显示。这里自定义的格式输出是以-dvld.col_sep指定的参数间隔
  • -dvld.col_sep 在-dvld.format参数启用时此函数才会有效,默认为 “\t”。
  • -dvld.verbosity 是否显示更详细的信息,默认为1,其值可以为0,1,2,3 其实比0小的也可以, 只是效果和0一样,比如0.1之类,但是负数除外,负数和效果和3的效果一样 比3大的值也是可以的,只是效果和3一样。
  • -dvld.save_dir 指定文件输出的路径,默认路径为/tmp。
  • -dvld.save_paths 控制是否输出文件,默认为0,表示不输出文件
  • -dvld.dump_paths 控制输出的内容,现在只有0和1两种情况,默认为1,输出内容

 

vc++ 2008编译 php扩展 以vld 以例

2011/10/11 10:37 am  |  分类:php

环境:VC++ 2008, windows 7 ,php 5.3.8 vc9 php

源码下载 http://www.php.net/

Vld源码包(可以去http://pecl.php.net/package/vld)

编译步骤:

1 新建一个win32 控制台应用程序

2 新vld源码包中的头文件和源文件分别COPY到工程中

3 菜单->项目->选项->配置属性->
C/C++{
预处理器定义: ZEND_DEBUG=0,COMPILE_DL_VLD,ZTS=1,ZEND_WIN32,PHP_WIN32,HAVE_VLD=1,PHP_EXTENSION,WIN32=1
代码生成: 运行时库 (多线程 DLL (/MD))
预编译头: 不使用预编译头
高级: 编译为C代码(/TC)
}
链接器(link){
输入: 附加依赖 php5ts.lib
}
4 菜单-> 工具->选项-> VC++ 目录{
包含文件:    D:\php\php-src-5.3\main D:\php\php-src-5.3\ D:\php\php-src-5.3\TSRM D:\php\php-src-5.3\Zend
引用文件:    D:\php\php-src-5.3 C:\Program Files\PHP\dev
库文件:    D:\php\php-src-5.3 C:\Program Files\PHP\dev C:\Program Files\PHP
}
5 到php源码目录  buildconf 注意
buildconf
cscript /nologo configure.js –with-php-build=”../win32build” –without-libxml  –disable-odbc
这里cl.exe所在的目录 和库目录 Common7\IDE 加到php中

6 f7 生成 中间有可能有些小问题,不记得了 google下都可以搞得了

Apache2.2+fastCGI+(多版本)PHP设备

2011/10/10 4:00 pm  |  分类:apache,php

Apache2.2+fastCGI+(多版本)PHP设备

 

 

比来因为项目须要(项目主管欲望能让项目在多版本PHP【5.1.0以上】中都能包管正常运行,实话说,要在一个Apache(我用的是Apache)中加载多个版本的Php 进行测试,还真的没有试过,也不知道到底怎么样,也愁闷把本身ubuntu景象给搞坏了(修复麻烦啊),所以就在虚拟机xp里做测试,所以,以下都是我在XP体系下的设备景象。

思虑:拿到这个任务我起首思虑的题目是,我要怎么样将apache中装上多个版本的php而又让本身应用的时辰便利,而不消每次应用都去更改设备之后重启apache;其次我想,我必然不肯意经由过程多装几种办事器(比如Apache,IIS等)来完成我的任务,若是经由过程这种景象才干解决题目,我感觉是很是不克不及容忍的事,更何况我须要在测试完成之后将ubuntu也安装上多版本php;最后,众所周知php在apache中的加载体式格式可所以fastcgi和模块加载(loadmodule)两种体式格式,loadmodule这种体式格式是我一向在用的体式格式,我也不知道这种体式格式可否支撑多版本的php,然则经过网上的搜刮发明其也是可认为之,不过我选择的是fastcgi,来完成,一来想尝尝一向未用过的体式格式,二来想看看fastcgi和loadmodule两者到底在应用上给我带来什么不一样的感触感染。

fastcgi的安装体式格式我goole了下,出来很多,然则细心看完之后发明,这些可以总结为如下模式:

#下载fastcgi(http://www.fastcgi.com/dist)将mod_fastcig.xxx.dll放到apache安装目次下的#modules文件夹下

#加载mod_fastcgi模块

LoadModule fastcgi_module modules/mod_fastcgi-2.4.6-AP22.dll  

#设置FastCGI运行路径和过程数量,前面路径为php安装路径

FastCgiServer "E:/PHP/PHP5/php-cgi.exe" -processes 3 

#将php-cgi.exe地点的路径定义别号为fcgi-php5,

ScriptAlias /fcgi-php5/ "E:/PHP/PHP5/"

#将以php后缀的文件定义类型为application/x-httpd-php

AddType application/x-httpd-php .php

#应用php-cgi.exe来履行php文件

Action application/x-httpd-php "/fcgi-php5/php-cgi.exe"

经过我的测试(apache版本为2.2.14和2.2.18)遵守以上办法设备,完全不可,查看启动日记发明fastcgi没有起来:FastCGI: server “E:/PHP/PHP5/php-cgi.exe” (pid 1600) terminated with exit with status “”0″” ,后来持续google发明,和apache版本有关(http://blog.csdn.net/networkwx/article/details/5970604 该文也有说到这点)。

既然fastcgi不可,莫非就没有此外办法了么,果真鄙人载apache2.2.14的时辰(http://www.apache.org/dist/httpd/  习惯性先去官网查找apache版本),发明mod_fcgid/ 这个器材,于是搜刮之,才知道,本来可以用这个来设备fastcgi,并且发明此文(http://www.javatang.com/archives/2010/01/07/3629356.html),具体描述了浩繁fastcgi版本的差别。一下是我用mod_fcgid安装的全过程:

1、下载mod_fcgid,  http://httpd.apache.org/download.cgi   我这里下载的是2.3.6

2、解压之,获得mod_fcgid.so,将它移至apache安装目次下的modules下,我这里是(C:\Program Files\Apache Software Foundation\Apache2.2\modules)

3、打开httpd.conf  添加如下:

#load 

LoadModule fcgid_module modules/mod_fcgid.so

AddHandler fcgid-script .fcgi .php

# Set PHP_FCGI_MAX_REQUESTS to greater than or equal to FcgidMaxRequestsPerProcess

# to prevent php-cgi process  exiting before all requests completed

FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000

# Maximum requests a process should handle before it is terminated

FcgidMaxRequestsPerProcess 1000

# Maximum number of PHP processes

FcgidMaxProcesses 15

# Number of seconds of idle time before a php-cgi process is terminated

FcgidIOTimeout  120

FcgidIdleTimeout  120

# Define the MIME-Type for ".php" files

AddType application/x-httpd-php .php

# Where to look for the php.ini file?

FcgidInitialEnv PHPRC "C:/php/php-5.3.8"

#Path to php-cgi

FcgidWrapper "D:/Server/php5/php-cgi.exe" .php

4、设备好fcgid模块之后,还须要做一个处理惩罚:   找到设备运行目次属性的处所,在option中添加一个属性CGI

5、重启apache,运行localhost,就能看到方才设备的信息(我在php运行目次下设置了一个index.php中输出phpinfo【须要apache认的index.php如许的默认履行文件,须要同样设备DirectoryIndex】):

第二点:设备多版本支撑

为懂得决应用便利的题目,我筹算采取虚拟机的设备来分别设备,每个虚拟机一个php版本,如许我应用的时辰只要接见须要的php版本的虚拟机即可,而不须要设置设备文件。同时也为了削减代码拷贝上的题目,我将所有的虚拟机都设备在同一个目次下,每个虚拟机都设备一个监听端口,如许也解决了代码在不合目次的共享题目。

1和2如上方一致,就不说了。不一样从第三步开端

3、在httpd.conf中,我加载fastcgi并且设备项只有如下:

#load 

LoadModule fcgid_module modules/mod_fcgid.so

AddHandler fcgid-script .fcgi .php

# Set PHP_FCGI_MAX_REQUESTS to greater than or equal to FcgidMaxRequestsPerProcess

# to prevent php-cgi process  exiting before all requests completed

FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000

# Maximum requests a process should handle before it is terminated

FcgidMaxRequestsPerProcess 1000

# Maximum number of PHP processes

FcgidMaxProcesses 15

# Number of seconds of idle time before a php-cgi process is terminated

FcgidIOTimeout  120

FcgidIdleTimeout  120

# Define the MIME-Type for ".php" files

AddType application/x-httpd-php .php

同时查找该文件中的:

# Virtual hosts
#Include conf/extra/httpd-vhosts.conf

将Include ….一行前面的#号去掉,同时,打开conf/extra/httpd-vhosts.conf文件进行虚拟主机设备(当然若是不应用该文件,也可以将虚拟主机的设备直接放置在httpd.conf文件的末尾)

4、虚拟主机的设备:

打开的文件中有一份默认的设备,我们更改如下:

Listen localhost:80
NameVirtualHost *:80
<VirtualHost *:80>
#load php.ini
FcgidInitialEnv PHPRC “C:/php/php-5.3.8/”
FcgidWrapper “C:/php/php-5.3.8/php-cgi.exe” .php
ServerAdmin webmaster@dummy-host.hz.ali.com
DocumentRoot “C:/www”
ServerName localhost
ServerAlias www.dummy-host.hz.ali.com
ErrorLog “logs/localhost”
CustomLog “logs/localhost.log” common
</VirtualHost>

对了,就是将FcgidInitialEnv  和FcgidWrapper两个的设备转移到虚拟机中,如许每个虚拟机都有本身的设备,我这里默认是履行5.3.8版本,所以给他的端标语是80,如下,我还设备了5.2.17和5.2.4两个版本分别给的端标语是217和24:

Listen localhost:217

NameVirtualHost *:217

<VirtualHost *:217>

    #load php.ini

    FcgidInitialEnv PHPRC "C:/php/php-5.2.17"

    FcgidWrapper "C:/php/php-5.2.17/php-cgi.exe" .php

    ServerAdmin webmaster@dummy-host.hz.ali.com

    DocumentRoot "C:/www"

    ServerName localhost

    ServerAlias www.dummy-host.hz.ali.com

    ErrorLog "logs/217"

    CustomLog "logs/217.log" common

</VirtualHost>

Listen localhost:24

NameVirtualHost *:24

<VirtualHost *:24>

    #load php.ini

    FcgidInitialEnv PHPRC "C:/php/php-5.2.4"

    FcgidWrapper "C:/php/php-5.2.4/php-cgi.exe" .php

    ServerAdmin webmaster@dummy-host.hz.ali.com

    DocumentRoot "C:/www"

    ServerName localhost

    ServerAlias www.dummy-host.hz.ali.com

    ErrorLog "logs/24"

    CustomLog "logs/24.log" common

</VirtualHost>

 

如许就可以了,我测试的时辰只须要将我的待测试代码放到c:\www目次下,就可以经由过程端口的不合分别测试各个版本下的差别了。

 

总结:

fastcgi的体式格式设备起来了,然则不知道真实景象是否如此,总感触感染用这种体式格式运行的php法度比loadModule体式格式慢了些。呵呵,关于fastcgi的相干文档http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html官网给了,英文的~,特此纪念

 

最终配置

 

#load
LoadModule fcgid_module modules/mod_fcgid.so
AddHandler fcgid-script .fcgi .php
# Set PHP_FCGI_MAX_REQUESTS to greater than or equal to FcgidMaxRequestsPerProcess
# to prevent php-cgi process  exiting before all requests completed
FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000
# Maximum requests a process should handle before it is terminated
FcgidMaxRequestsPerProcess 1000
# Maximum number of PHP processes
FcgidMaxProcesses 15
# Number of seconds of idle time before a php-cgi process is terminated
FcgidIOTimeout  120
FcgidIdleTimeout  120
# Define the MIME-Type for “.php” files
AddType application/x-httpd-php .php

# Where to look for the php.ini file
FcgidInitialEnv PHPRC “C:/Program Files/PHP/”
#Path to php-cgi
FcgidWrapper “C:/Progra~1/PHP/php-cgi.exe” .php

50点提高PHP编程效率 引入缓存提升性能

2011/09/22 2:02 pm  |  分类:php

 0、用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。

  1、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。

  2、$row[’id’] 的速度是$row[id]的7倍。

  3、echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。

  4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。

  5、注销那些不用的变量尤其是大数组,以便释放内存。

  6、尽量避免使用__get,__set,__autoload。

  7、require_once()代价昂贵。

  8、include文件时尽量使用绝对路径,因为它避免了PHP去include_path里查找文件的速度,解析操作系统路径所需的时间会更少。

  9、如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用

$_SERVER['REQUEST_TIME']

  要好于

time()

  10、函数代替正则表达式完成相同功能。

  11、str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。

  12、如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。

  13、使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。

  14、用@屏蔽错误消息的做法非常低效,极其低效。

  15、打开apache的mod_deflate模块,可以提高网页的浏览速度。

  16、数据库连接当使用完毕时应关掉,不要用长连接。

  17、错误消息代价昂贵。

  18、在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。

  19、递增一个全局变量要比递增一个局部变量慢2倍。

  20、递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。

  21、递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。

  22、仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。

  23、方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了10个方法,但性能上没有变化。

  24、派生类中的方法运行起来要快于在基类中定义的同样的方法。

  25、调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。

  26、Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。

  27、除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能,以免除编译开销。

  28、尽量做缓存,可使用memcached。memcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码 (OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。

  29、当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返回在zval 结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。但是,由于strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用的函数一起执行。在某些情况下,你可以使用isset() 技巧加速执行你的代码。

  (举例如下)

  if (strlen($foo) < 5) { echo “Foo is too short”$$ }

  (与下面的技巧做比较)

  if (!isset($foo{5})) { echo “Foo is too short”$$ }

  调用isset()恰巧比strlen()快,因为与后者不同的是,isset()作为一种语言结构,意味着它的执行不需要函数查找和字母小写化。也就是说,实际上在检验字符串长度的顶层代码中你没有花太多开销。

  30、当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的C或Java代码并指望它们能立即变快,没用的。++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种,正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意,因为并不是所有的指令优化器都会做同样的优化处理,并且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。

  31、并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。

  32、并非要用类实现所有的数据结构,数组也很有用。

  33、不要把方法细分得过多,仔细想想你真正打算重用的是哪些代码?

  34、当你需要时,你总能把代码分解成方法。

  35、尽量采用大量的PHP内置函数。

  36、如果在代码中存在大量耗时的函数,你可以考虑用C扩展的方式实现它们。

  37、评估检验(profile)你的代码。检验器会告诉你,代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序,评估检验总体上可以显示出代码的瓶颈。

  38、mod_zip可作为Apache模块,用来即时压缩你的数据,并可让数据传输量降低80%。

  39、在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下,尽量用file_get_contents,因为他的效率高得多!但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题;

  40、尽量的少进行文件操作,虽然PHP的文件操作效率也不低的;

  41、优化Select SQL语句,在可能的情况下尽量少的进行Insert、Update操作(在update上,我被恶批过);

  42、尽可能的使用PHP内部函数(但是我却为了找个PHP里面不存在的函数,浪费了本可以写出一个自定义函数的时间,经验问题啊!);

  43、循环内部不要声明变量,尤其是大变量:对象(这好像不只是PHP里面要注意的问题吧?);

  44、多维数组尽量不要循环嵌套赋值;

  45、在可以用PHP内部字符串操作函数的情况下,不要用正则表达式;

  46、foreach效率更高,尽量用foreach代替while和for循环;

  47、用单引号替代双引号引用字符串;

  48、“用i+=1代替i=i+1。符合c/c++的习惯,效率还高”;

  49、对global变量,应该用完就unset()掉;

左值右值

2011/09/22 11:19 am  |  分类:c/c++

左值(lvalue)和右值(rvalue)是编程中两个非常基本的概念,但是也非常容易让人误解,看了很多文章,自我感觉真正将这个问题讲的很透彻的文章还没有看见,所以自告奋勇来尝试一下。如果左值右值的概念不是非常清楚的话,它们迟早会像拦路虎一样跳出来,让你烦心不已,就像玩电脑游戏的时候每隔一段时间总有那么几个地雷考验你的耐性,如果一次把所有地雷扫尽就好了。:)

左值(lvalue)和右值(rvalue)最先来源于编译理论(感谢南大小百合的programs)。在C语言中表示位于赋值运算符两侧的两个值,左边的就叫左值,右边的就叫右值。比如:

int ii = 5;//ii是左值,5是右值

int jj = ii;//jj是左值,ii是右值

上面表明,左值肯定可以作为右值使用,但反之则不然。左值和右值的最早区别就在于能否改变。左值是可以变的,右值不能变。【注1】

注1:这一点在C++中已经猪羊变色,不再成立。拱猪游戏还是挺好玩的,我还真抓过好几次全红心,不过真的好险。:)

在很多文章中提到,在C++中,左值更多的指的是可以定位,即有地址的值,而右值没有地址。【注2】

注2:这一点仍然不准确,我在程序中生成一个临时右值std::vector(),你能够说它没有地址吗?难道它是没有肉体的鬼魂或幽灵?它是有地址的,而且它也是绝对的右值。

在现代C++中,现在左值和右值基本上已经失去它们原本所具有的意义,对于左值表达式,通过具体名字和引用(pointer or reference)来指定一个对象。非左值就是右值。我来下一个定义:

左值表示程序中必须有一个特定的名字引用到这个值。

右值表示程序中没有一个特定的名字引用到这个值。

跟它们是否可以改变,是否在栈或堆(stack or heap)中有地址毫无关系。

1.左值

在下面的代码中:

int ii = 5;

int const jj = ii;

int a[5];

a[0] = 100;

*(a+3) = 200;

int const& max( int const& a, int const& b ) //call by reference

{

return a > b ? a : b;

}

int& fun(int& a) //call by reference

{

a += 5;

return a;

}

ii,jj,a[0],*(a+3),还有函数max的返回值比如max(ii, jj),【注3】函数fun的返回值fun(ii)都是左值。,它们都是有特定的引用名字的值。ii,jj,a[0],*(a+3),max(ii, jj),fun(ii)分别就是它们的名字。

注3:在这里有一个不太容易分清楚的盲点。那就是有人会问max(8, 9)到达是左值还是右值,C++标准规定常量引用(reference to const)可以引用到右值,所以max(8, 9)似乎应该是右值,不过不管它是左值,还是右值,我们都不能试图去改变它。为了与前面的概念一致,我认为它是左值,不可改变的常量左值。

左值有不能改变的,即被const所修饰的左值,比如上面的jj,max(ii, jj)都是被常量(const)魔咒所困住的左值。

没有被const困住的左值当然是可以改变的,比如下面的代码都是成立的:

ii = 600;

a[0] = 700;

fun(ii) = 800; //OK!

我们的眼睛没有问题,fun(ii) = 800;完全正确,因为它是可以改变的左值。所以我们看STL的源码,就会理解std::vector中的重载operator[]运算符的返回值为什么要写成引用,因为operator[]必须返回左值。

2.右值

没有特定名字的值是右值。先看下面的代码:

std::list();

std::string(“It is a rvalue!”);

int fun1() //call by value

{

}

int* fun2() //call by reference

{

}

其中std::list(),std::string(“It is a rvalue!”),函数fun1的返回值fun1(),函数fun2的返回值fun2()都是右值,它们的值都没有特定的名字去引用。也许有人会奇怪,fun2()也是右值?最前面的max(a,b)不是左值吗?

请看清楚,函数fun2的返回值是pointer,pointer也是call by value,而函数max的返回值是reference,reference是call by reference。所以说C++中引入reference不仅仅是为了方便,它也是一种必须。【注4】

注4:Scott Meyer写的《More Effective C++》的条款1专门讲了pointer和reference的区别,写的很好,辨别的非常清楚。

fun2()是右值,但 *fun2()却是左值,就跟经常看到的*p一样,所以看C++库代码的时候,会发现重载operator*的函数返回值是reference。

当然我还遗漏了一种右值,那就是字面上的(literal)值,比如5,8.23,’a’等等理所当然的都是右值。

右值最初出现的时候,一个最大的特征就是不可改变。但就跟我们的道德标准一样,时代不同了,标准也变化了,以前的三纲五常早已经被扔到历史的垃圾堆里面了。

C++中有可以改变的右值,而且这个特性还非常有用。那就是用户自定义的类(class)的构造函数生成的临时对象。比如:

std::vector(9),std::deque(),……都是可以改变的右值。在Herb Sutter的《More Exceptional C++》中的条款7的page51页有这样几行代码:

// Example 7-2(b): The right way to shrink-to-fit a vector.

vector c( 10000 );

// …now c.capacity() >= 10000…

// erase all but the first 10 elements

c.erase( c.begin()+10, c.end() );

// the following line does shrink c’s

// internal buffer to fit (or close)

vector( c ).swap( c );

// …now c.capacity() == c.size(), or

// perhaps a little more than c.size()

认真看几遍,你会发现但vector的大小增大到一定程度,你又用不着这么多空间的时候,你会想办法把它收缩到最合适的大小,但利用别的办法比如调用成员函数reserve()都无法办到,这个时候就必须利用右值可以改变这个性质了。

vector( c ).swap( c );这行代码就是点睛之处。

首先使用复制构造函数生成临时右值vector( c ),这个右值正好是合适大小,然后和c交换【注5】,c就变成合适大小了,最后在整个表达式结束的时候,这个临时右值析构归还内存空间。真是绅士一般的优雅!

注5:这个时候这个临时右值就发生了改变。

如果还不理解,可以看看书,或者直接看库的源代码。

至于为什么会这样?我思考了一下,我想是这样的,我们看类(class)的数据布置结构,会发现它的每一个数据成员都是有名字的,我想编译器在编译的过程中,都会生成一个外部不所知的对这个临时对象右值的名字引用,但需要改变这个临时对象的时候,这个名字就用上了。比如:

class Point

{

public: //纯粹为了方便,我把数据成员公开,现实中尽量不要这样用

int x, y ,z;

……//其他各种成员函数

};

我们现在就可以改变右值,用到了匿名的引用名字。

Point().x = 6;//改变了右值

Point().y = 6;//同意改变了右值,不过注意,这个右值跟上面的不是同一个。

总结

左值和右值的真正区别我想就是这些了,左值表示有特定的名字引用,而右值没有特定的名字引用。当然我仍然会有疏忽,希望大家能够提醒我,指正我的不足。

前两天看Herb Sutter从邮件中寄来的新文章(我订阅他的新文章邮件通知),一篇是讲Tuple数据结构的,没有什么新意,以前好像看过,还有一篇名字是:(Mostly)Private,地址为http://www.cuj.com/documents/s=8273/cujcexp2107sutter/ 内容本身并不深,但看完文章,发现随处可见C++的波诡云谲,又会对什么叫袖里乾坤,滴水藏海多一份感性认识。

在下一篇文章我想从不同于一般的角度,从自己的经历谈谈在校毕业生在IT行业怎样找工作,我想会让所有读者都有一些思考,不仅仅是求职者。题目我已经想好了,就叫《扮虎吃猪》,不过现在我有一些别的事情要忙,所以可能会让大家等几天。

转载请注明来源,谢谢!

算法(异或)

2011/09/22 9:38 am  |  分类:c/c++,算法

数列L中有n个整数,其中K个数字出现了两次,1个数字出现了一次,所以n=2k+1;请在使用O(1)空间的前提下,尽快找出只出现一次的那个数字,并说明算法的复杂度。

1
2
3
4
5
6
int res = 0;
for (i = 0; i < n; i++}
{
   res ^= src[i];
}
return res;

hello word by C

2011/09/02 10:29 am  |  分类:c/c++
1
2
3
int main(void){
 printf("Hello Word");
}

java httpclient 无证书访问 https

2011/08/29 3:52 pm  |  分类:java
1
2
3
4
5
6
7
8
9
10
	public static void main(String[] args) throws HttpException, IOException {
		String url = "https://xxxx";
		Protocol https = new Protocol("https", new HTTPSSecureProtocolSocketFactory(), 443);
		Protocol.registerProtocol("https", https);
		GetMethod get = new GetMethod(url);
		HttpClient client = new HttpClient();
		client.executeMethod(get);
		System.out.println(get.getResponseBodyAsString());
		Protocol.unregisterProtocol("https");
	}
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.SocketFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import org.apache.commons.httpclient.ConnectTimeoutException;
import org.apache.commons.httpclient.params.HttpConnectionParams;
import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory;
/**
 * httpclient https
 * @author shiyuan.pxm
 *
 */
public class HTTPSSecureProtocolSocketFactory implements ProtocolSocketFactory {//SecureProtocolSocketFactory
 
	/**
	 * 
	 */
	static {
		// System.out.println(">>>>in MySecureProtocolSocketFactory>>");
	}
	private SSLContext sslcontext = null;
 
	private SSLContext createSSLContext() {
		SSLContext sslcontext = null;
		try {
			sslcontext = SSLContext.getInstance("SSL");
			sslcontext.init(null,
					new TrustManager[] { new TrustAnyTrustManager() },
					new java.security.SecureRandom());
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (KeyManagementException e) {
			e.printStackTrace();
		}
		return sslcontext;
	}
 
	private SSLContext getSSLContext() {
		if (null == this.sslcontext) {
			this.sslcontext = createSSLContext();
		}
		return this.sslcontext;
	}
 
	public Socket createSocket(Socket socket, String host, int port,
			boolean autoClose) throws IOException, UnknownHostException {
		return getSSLContext().getSocketFactory().createSocket(socket, host,
				port, autoClose);
	}
 
	public Socket createSocket(String host, int port) throws IOException,
			UnknownHostException {
		return getSSLContext().getSocketFactory().createSocket(host, port);
	}
 
	public Socket createSocket(String host, int port, InetAddress clientHost,
			int clientPort) throws IOException, UnknownHostException {
		return getSSLContext().getSocketFactory().createSocket(host, port,
				clientHost, clientPort);
	}
 
	public Socket createSocket(String host, int port, InetAddress localAddress,
			int localPort, HttpConnectionParams params) throws IOException,
			UnknownHostException, ConnectTimeoutException {
		if (params == null) {
			throw new IllegalArgumentException("Parameters may not be null");
		}
		int timeout = params.getConnectionTimeout();
		SocketFactory socketfactory = getSSLContext().getSocketFactory();
		if (timeout == 0) {
			return socketfactory.createSocket(host, port, localAddress,
					localPort);
		} else {
			Socket socket = socketfactory.createSocket();
			SocketAddress localaddr = new InetSocketAddress(localAddress,
					localPort);
			SocketAddress remoteaddr = new InetSocketAddress(host, port);
			socket.bind(localaddr);
			socket.connect(remoteaddr, timeout);
			return socket;
		}
	}
 
	private static class TrustAnyTrustManager implements X509TrustManager {
		public void checkClientTrusted(X509Certificate[] chain, String authType)
				throws CertificateException {
		}
 
		public void checkServerTrusted(X509Certificate[] chain, String authType)
				throws CertificateException {
		}
 
		public X509Certificate[] getAcceptedIssuers() {
			return new X509Certificate[] {};
		}
	}
 
}
Pages: 1 2 3 4 5 6 7 8 ...15 16 17 Next