这个东西是用来设置对象缓存时间的。
首先理解 refresh_pattern 语法: refresh_pattern [-i] regexp min percent max [options]
例如:
refresh_pattern \.(jpg|png|gif|mp3|xml|css|js)$ 1440 50% 28800 ignore-reload
-i 其实就是是否区分大小写,加上这个参数就是不区分。 regexp代表正则表达式,上例中表示以jpg|png|gif|mp3|xml|css|js 结尾的这些文件,当然这里的| 表示 或 的意思。
几个概念:
resource age =对象进入cache的时间-对象的last_modified,简单点理解就是从对象被缓存到对象被修改之间的时间
response age =当前时间-对象进入cache的时间,简单理解就是对象已经被缓存了多久
min和max为时间,单位是分钟,上例中 1440就是1天,28800就是20天。
百分比,这个东西用来衡量一个文件的存活时间。存活时间= resource age * 百分比。
[options]
如果希望页面一进入cache就不删除,直到被主动purge掉为止,可以加上ignore-reload选项. 一般情况可以使用 reload-into-ims
最后说说,如何判断一个文件是否过期:
1. 首先计算出response age
2. 当response age <= max时,对象不过期,而>max时就过期了
3. 当response age介于两者之间时,就需要看 存活期了,当存活期 > response age 时则过期,否则不过期。
过期了的话,squid并不会删除对象,当有请求来访问该文件时,则squid会到前端的web上去读取新的文件,但是squid还是会把当前的文件和web上的文件做对比,如果改了则重新拉取过来缓存,否则不拉取,直接更改resource age 。
Squid 在高负载下,需要大量的内核资源。特别的,您需要给您的系统配置比正常情况更高的文档描述符和缓存。文档描述符的限制通常很恼人。您最好在开始编译squid 之前来增加这些限制的大小。 .
文档描述符是个简单的整数,用以标明每一个被进程所打开的文档和socket。第一个打开的文档是0,第二个是1,依此类推。Unix 操作系统通常给每个进程能打开的文档数量强加一个限制。更甚的是,unix 通常有一个系统级的限制。
因为squid 的工作方式,文档描述符的限制可能会极大的影响性能。当squid 用完任何的文档描述符后,他不能接收用户新的连接。也就是说,用完文档描述符导致拒绝服务。直到一部分当前请求完成,相应的文档和socket 被关闭,squid 不能接收新请求。当squid发现文档描述符短缺时,他会发布警告。
在运行./configure 之前,检查您的系统的文档描述符限制是否合适,能给您避免一些麻烦。大多数情况下,1024 个文档描述符足够了。很忙的cache可能需要4096或更多。在配置文档描述符限制时,我推荐配置系统级限制的数量为每个进程限制的2 倍。
通常在您的Unix shell 中能找到系统的文档描述符限制。任何的C shell 及其类似的shell有内建的limit 命令。更新的Bourne shell 及其类似的shell 有一条叫做ulimit 的命令。为了发现您的系统的文档描述符限制,试运行如下命令:
sh$ ulimit -n .
在Linux 上配置文档描述符有点复杂。在编译squid 之前,您必须编辑系统include 文档中的一个,然后执行一些shell 命令。请首先编辑/usr/include/bits/typesizes.h 文档,改变__FD_SETSIZE 的值:
#define _ _FD_SETSIZE 8192
下一步,使用这个命令增加内核文档描述符的限制:
# echo 8192 > /proc/sys/fs/file-max
最后,增加进程文档描述符的限制,在您即将编译squid 的同一个shell 里执行:
sh# ulimit -Hn 8192
该命令必须以root 运行,仅仅运行在bash shell。不必重启机器。
使用这个技术,您必须在每一次系统启动后执行上述echo 和ulimit 命令,或至少在squid 启动之前。假如您使用某个rc.d 脚本来启动squid,那是个放置这些命令的好地方。 .
临时端口是TCP/IP 栈分配给出去连接的本地端口。换句话说,当squid 发起一条连接到另一台服务器,内核给本地socket 分配一个端口号。这些本地端口号有特定的范围限制。
临时端口号的短缺对很忙的代理服务器(例如每秒数百个连接)来说,会较大的影响性能。这是因为一些TCP 连接在他们被关闭时进入TIME_WAIT 状态。当连接进入TIME_WATI 状态时,临时端口号不能被重用。
您能使用netstat 命令来显示有多少个连接进入这个状态:
% netstat -n | grep TIME_WAIT
在Linux 上,简单的写一对数字到下列指定文档:
# echo "1024 40000" > /proc/sys/net/ipv4/ip_local_port_range
不要忘记将这些命令加到您的系统启动脚本中,以使机器每一次重启后都生效。 ..
ls -l /usr/local/squid
total 5
drwxr-x--- 2 wessels wheel 512 Apr 28 20:42 bin
drwxr-x--- 2 wessels wheel 512 Apr 28 20:42 etc
drwxr-x--- 2 wessels wheel 512 Apr 28 20:42 libexec
drwxr-x--- 3 wessels wheel 512 Apr 28 20:43 man
drwxr-x--- 2 wessels wheel 512 Apr 28 20:42 sbin
drwxr-x--- 4 wessels wheel 512 Apr 28 20:42 share
drwxr-x--- 4 wessels wheel 512 Apr 28 20:43 var ..
.4.1 configure 选项
./configure 脚本有大量的不同选项,他们以-开始。当您敲入./configure --help 时,能看到选项的完整列表。一些选项对任何configure 脚本是通用的,更有一些是squid 专有的。下面是您可能用得到的标准选项:
--perfix =PREFIX
如前面描述的相同,这里配置安装目录。安装目录是任何可执行文档,日志,和配置文档的默认目录。在整本书中,$prefix 指您选择的安装目录。
--localstatedir =DIR
该选项允许您改变var 目录的安装位置。默认是$prefix/var,但也许您想改变他,以使squid 的磁盘缓存和日志文档被存储在别的地方。
--sysconfdir =DIR
该选项允许您改变etc 目录的位置。默认的是$prefix/etc。假如您想使用/usr 作为安装位置,您也许该配置--sysconfdir为/etc.
以下是squid 的专有./configure选项:
--enable-dlmalloc[=LIB]
在一些系统上,内建的内存分配机制(malloc)在使用squid 时表现不尽人意。使用--enable-dlmalloc 选项将squid 源代码包中的dlmalloc 包编译和链接进来。假如您的系统中已安装dlmalloc,您能使用=LIB 参数指定库的路径。请见http://g.oswego.edu/dl/html/malloc.html更多关于dlmalloc 的信息。 。
--enable-gnuregex
在访问控制列表和其他配置指令里,squid 使用正则表达式作为匹配机制。GNU 的正则表达式库包含在squid 的源代码包里;他能够在没有内建正则表达式的操作系统中使用。./configure脚本侦察您系统中的正则表达式库,假如必要,他能够激活使用GNU正则表达式。假如因为某些理由,您想强制使用GNU正则表达式,您能够将这个选项加到./configure命令后。
--enable-carp
Cache数组路由协议(CARP)用来转发丢失的cache到父cache的数组或cluster。在10.9章有更多关于CARP的细节。
--enable-async-io[=N_THREADS]
同步I/O 是squid 技术之一,用以提升存储性能。aufs 模块使用大量的线程来执行磁盘I/O 操作。该代码仅仅工作在linux 和solaris 系统中。=N_THREADS 参数改变squid 使用的线程数量。aufs 和同步I/O 在8.4 章中被讨论。
Squid的Error messages 默认的时间显示的GMT时间,而非本地时间,这个有时候看着很别扭。
下面是修改方法,找到Squid的源文件src/errorpage.c 大概在60多行,
{
ERR_SQUID_SIGNATURE,
"\n<BR clear=\"all\">\n"
"<HR noshade size=\"1px\">\n"
"<ADDRESS>\n"
"Generated %T by %h (%s)\n"
"</ADDRESS>\n"
"</BODY></HTML>\n"
},
把上面的“ "Generated %T by %h (%s)\n"” 修改为“ "Generated %t by %h (%s)\n"”即可。
即:把%T改为%t 。
1、下载 ming-0.4.0.rc1.tar.bz2
wget http://mylinux.5d6d.com/userdirs ... ng-0.4.0.rc1.tar.gz
2、 tar jxvf ming-0.4.0.rc1.tar.bz2
3、cd ming-0.4.0.rc1 ; ./configure --prefix=/usr/local/ming ; make && make install
4、cp -r php_ext/* /usr/local/src/php-5.2.8/ext/ming
5、cd /usr/local/php-5.2.8/
6、./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-mysql=/usr/local/mysql --with-mysql-sock=/tmp --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-mcrypt=/usr/local/libmcrypt --enable-soap --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-exif --enable-zend-multibyte --disable-ipv6 --enable-fastcgi --enable-fpm --with-ming=/usr/local/ming
7、make && make install
PHP需要MySQL客户端模块支持,需要下载MySQL软件。
# cd /usr/local/src
# tar zvxf mysql-5.0.67-linux-i686-icc-glibc23.tar.gz
# mv mysql-5.0.67-linux-i686-icc-glibc23 /usr/local/mysql
# tar zvxf php-5.2.8.tar.gz
# cd php-5.2.8
# ./configure --prefix=/usr/local/php \
--with-apxs2=/usr/local/apache2/bin/apxs \
--with-config-file-path=/usr/local/php/etc \
--with-mysql=/usr/local/mysql \
--with-libxml-dir \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--with-iconv-dir \
--with-zlib-dir \
--with-bz2 \
--with-openssl \
--with-mcrypt \
--enable-soap \
--enable-gd-native-ttf \
--enable-ftp \
--enable-mbstring \
--enable-sockets \
--enable-exif \
--disable-ipv6 \
--disable-cgi \
--disable-cli
# make
# make install
# mkdir /usr/local/php/etc
# cp php.ini-dist /usr/local/php/etc/php.ini
安装libevent(版本不低于libevent-1.4.12)
wget http://syslab.comsenz.com/downlo ... .4.12-stable.tar.gz
tar zxvf libevent-1.4.12-stable.tar.gz
cd libevent-1.4.12-stable
./configure --prefix=/usr/local/libevent
make && make install
安装php-fpm 0.6
wget http://syslab.comsenz.com/downlo ... m-0.6-5.2.11.tar.gz
tar -zxvf php-fpm-0.6-5.2.11.tar.gz
./php-fpm-0.6-5.2.11/generate-fpm-patch //生成fpm补丁在/usr/local/src下
下载php-5.2.11.tar.gz
wget http://syslab.comsenz.com/downloads/linux/php-5.2.11.tar.gz
tar xvfz php-5.2.11.tar.gz
cd php-5.2.11
patch -p1 < ../fpm.patch
./buildconf --force
mkdir fpm-build && cd fpm-build
../configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-fpm --with-fpm-bin=/usr/local/php/bin/php-fpm --with-fpm-conf=/usr/local/php/etc/php-fpm.conf --with-fpm-log=/usr/local/php/var/php-fpm.log --with-fpm-pid=/usr/local/php/var/php-fpm.pid --with-fpm-user=www --with-fpm-group=www --with-libevent=/usr/local/libevent/ --with-mysql=/usr/local/mysql --with-mysql-sock=/tmp --with-libxml-dir --with-mcrypt --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --enable-soap --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-exif --enable-zend-multibyte --disable-ipv6 --enable-fastcgi
make && make install
启动php-fpm
/etc/init.d/php-fpm start
默认端口9000启动,需要套接字启动,需要修改/usr/local/php/etc/php-fpm.conf
# cd /usr/local/src
# tar jxvf eaccelerator-0.9.5.2.tar.bz2
# cd eaccelerator-0.9.5.2
# /usr/local/php/bin/phpize
# ./configure \
--enable-eaccelerator=shared \
--with-php-config=/usr/local/php/bin/php-config \
--with-eaccelerator-shared-memory \
--with-eaccelerator-sessions \
--with-eaccelerator-content-caching
# make
# make install
# mkdir /usr/local/php/ext
# ln -s /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so /usr/local/php/ext/eaccelerator.so
来源: http://hi.baidu.com/leechl
首先要安装libtidy, 否则安装过程会报"configure: error: Cannot find libtidy"的错误.
libtidy的项目地址是:http://tidy.sourceforge.net/ , 我是在这里下载的http://anduin.linuxfromscratch.org/files/BLFS/sources/tidy-cvs_20070326.tar.bz2 或者 mylinux.5d6d.com/userdirs/c/f/mylinux/attachments/month_1102/tidy-cvs_20070326.tar.bz2
安装libtity
#tar jxf tidy-cvs_20070326.tar.bz2
#cd tidy-cvs_20070326
#./configure --prefix=/usr && make && make install
安装tidy的php扩展
#cd /home/php-5.2.8
#./configure --with-php-config=/home/php/bin/php-config && make && make install
#strip /home/php/lib/php/extensions/no-debug-non-zts-20060613/tidy.so
#vi /home/php/lib/php.ini
加入extension=tidy.so
#/home/php/sbin/php-fpm reload
安装好之后发现tidy.so没有load进去, 查了老半天看php_error.log, 发现有下面一行
PHP Startup: Unable to load dynamic library '/home/php/lib/php/extensions/no-debug-non-zts-20060613/tidy.so' - libtidy-0.99.so.0: cannot open shared object file: No such file or directory in Unknown on line 0
原来是找不到库文件, 虽然安装了库文件, 但是要用 /sbin/ldconfig 命令来重新加载. 于是执行如下命令.
# /sbin/ldconfig -f /etc/ld.so.conf
#/home/php/sbin/php-fpm restart
emergency_restart_threshold 默认值 10
emergency_restart_interval 默认值 1m = 60s
表示在emergency_restart_interval(60)秒内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果超过emergency_restart_threshold个,php-fpm就会优雅重启。
request_terminate_timeout
请求处理超时时间,类似PHP中的max_execution_time
request_slowlog_timeout
超过这个时间的定义为slow请求。这些请求会进入slowlog日志
rlimit_files
文件句柄的最大限制
max_requests
在重启之前每个进程最多处理多少个请求。
简单介绍libxslt
libxslt 包括 libxslt 库文件. 它扩展了libxml2库,以支持 XSLT 文件.
软件包信息
下载地址 http://ftp.acc.umu.se/pub/GNOME/sources/libxslt/1.1/
控制参数: short_open_tag = On
如果设置为Off,则不能正常解析类似于这样形式的php文件:
<?
phpinfo()
?>
而只能解析
<?php
phpinfo()
?>
这样形式的php文件
所以要想php支持短标签,需要我们把short_open_tag 设置为On.
注:本文转自51cto.com
从php4到php5,从个人框架到开源框架的发展,见证着php从山寨走上正规大军的发展。php6还在酝酿中,相信php5会作为php6小试牛刀的场地。php5.3是php5的一个里程碑,加入了大量新特性。
我个人总感觉php功能是越来越多了,但是php的语法却越来越丑陋了,有时加入了新功能,而新功能带来了问题,为了修复问题,又要加入新的语法来修复,郁闷。估计php用语法修复问题是为了更好的解析。
一、mysql驱动mysqlnd
一直以来,php都是通过mysql客户端连接mysql,而现在mysql官方已经推出php版的mysql客户端,而这个mysqlnd有效降低内存的使用以及提高性能。具体可以看:
http://dev.mysql.com/downloads/connector/php-mysqlnd/
http://forge.mysql.com/wiki/PHP_MYSQLND
从图中可以看出,使用mysqlnd少了从mysql驱动中复制数据到php扩展这一步。mysqlnd使用copy-on-write,也就是写时复制,读引用。
mysqlnd已经内置在php5.3的源码中,编译的时候使用--with-mysql=mysqlnd、--with-mysqli=mysqlnd 和 --with-pdo-mysql=mysqlnd 安装mysqlnd驱动。
mysqlnd的优点
编译php更方便了,不需要libmysql,已经内置在源码中
编译php更方便了,不需要libmysql,已经内置在源码中
使用php许可,避免版权问题
使用php的内存管理,支持php内存限制(memory_limit)
所有数据在内存只有一份,之前的libmysql有两份,参考上图
提供性能统计功能,帮助分析瓶颈
mysqli支持长连接(persistent connections)
性能绝对比libmysql要快
在驱动层增加缓存机制
看了这么多特点,有点矛盾,作为数据库抽象层的PDO能把不同后端的特点发挥出来吗?如果使用mysql作为数据库的话mysqli是不是更好的选择?我总觉得mysqli只是个过度产品,PDO才是未来的。
二、性能提高
md5()大概提高了10%-15%的性能
Better stack implementation in the engine,没明白
常量保存在ROM里(Constants moved to read-only memory),这里没明白意思
改进异常处理,操作码(opcode)更简洁
解决了include(require)_once重复打开的问题,之前once我都是用静态变量实现的,终于解决这个问题了
用gcc4编译的二进制文件将更小
整体性能提高了5%-15%
很多人觉得web的瓶颈在db,所以app应用的性能毫不在乎,我认为主要是因为app扩展比db扩展要容易得多,所以才会产生db瓶颈,但这并不意味着可以不顾虑app的性能,毕竟最终还是要在app里解决各种问题的,作为一名程序员编写高质量的代码是最基本的要求。程序的内存使用量少点和执行速度快点,在高并发下是有很效果的,有些时候你改动下实现方法,能提高几十倍也很正常,当然如果付出要很多收获很少的时候就不要太执着了,我觉得一定要有编写高质量代码的意识。
三、?:操作符
其实就是js里的||,返回的结果不是逻辑类型,而是返回本来变量的值,例如 false ?: 123返回123,而不是true。语法就是有点怪怪!
http://downloads.sourceforge.net/libpng/libpng-1.2.29.tar.bz2
几台使用了 nginx+php-fpm 的机器上,偶尔能看到php-fpm.log中有这样的内容
引用
Oct 28 23:13:53.849419 [NOTICE] fpm_got_signal(), line 73: received SIGCHLD
Oct 28 23:13:53.849490 [WARNING] fpm_children_bury(), line 229: child 15044 (pool default) exited on signal 11 SIGSEGV after 1.332818 seconds
Oct 28 23:13:53.850341 [NOTICE] fpm_children_make(), line 305: child 15122 (pool default) started
如果得到SIGSEGV信号的进程比较多的话,还能看到如下的日志
引用
Oct 28 09:03:15.812009 [WARNING] fpm_children_bury(), line 256: failed processes threshold (10 in 60 sec) is reached, initiating reload
Oct 28 09:03:15.812030 [NOTICE] fpm_pctl(), line 208: switching to 'reloading' state
然后php-fpm就会重启。其中的
failed processes threshold (10 in 60 sec) is reached
是在php-fpm.conf中设置的,表示在60秒内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果超过10个,php-fpm就会重启。可以通过把php-fpm.conf中的 emergency_restart_threshold的值设置的大一些来增加这个重启的阀值,比如增加到60个,在有些时候,这能够避免php-fpm重启,但这并不是解决问题的根本办法
SIGSEGV信号一般表示
引用
SIGSEGV --- Segment Fault. The possible cases of your encountering this error are:
1.buffer overflow --- usually caused by a pointer reference out of range.
2.stack overflow --- please keep in mind that the default stack size is 8192K.
3.illegal file access --- file operations are forbidden on our judge system
其中的第三条,跟本问题的关系比较大。也就是php-cgi访问了一个不存在的或者没有权限访问的文件
我用的php-fpm补丁是0.5.8版的,按照一些说法,只要设置了
引用
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
之后,php-cgi如果找不到文件或者没有权限访问的话 会提示No input file specified. 或者Access denied.
问题到这里似乎又陷入了僵局
后来又在php.ini中找到了php-cgi的一个参数 cgi.fix_pathinfo
引用
cgi.fix_pathinfo boolean
对 CGI 提供了真正的 PATH_INFO/PATH_TRANSLATED 支持。以前 PHP 的行为是将 PATH_TRANSLATED 设为 SCRIPT_FILENAME,而不管 PATH_INFO 是什么。有关 PATH_INFO 的更多信息见 cgi 规格。将此值设为 1 将使 PHP CGI 修正其路径以遵守规格。设为 0 将使 PHP 的行为和从前一样。默认为零。用户应该修正其脚本使用 SCRIPT_FILENAME 而不是 PATH_TRANSLATED。
把这个参数的值设置为1 ,cgi会多做一些检查,来判断请求的路径中,那部分是文件名,哪部分是路径名
下面是google groups上的一段话
引用
when cgi.fix_pathinfo was set to "1" it caused a lot of checks in order to find which part of SCRIPT_FILENAME is a file name and which is PATH_INFO. In case of missing file it caused NULL
in path_translated, which caused the crash.
资料引用:http://www.knowsky.com/536760.html
在php-fpm.org 网站上已经说明了。
PHP 5.3.3 is released and now bundles PHP-FPM。
告诉我们,在php-5.3.3版本中已经绑定了php-fpm 所以,再编译这个版本的时候不需要做打php-fpm补丁的操作了。
下面我就把如何编译并配置php-5.3.3 的步骤写出来,分享给大家。
1 wget http://syslab.comsenz.com/downloads/linux/php-5.3.3.tar.gz
2 tar zxvf php-5.3.3.tar.gz
3 cd php-5.3.3
4 './configure' '--prefix=/usr/local/php' '--with-config-file-path=/usr/local/php/etc' '--enable-fpm' '--with-fpm-user=www' '--with-fpm-group=www' '--with-mysql=/usr/local/mysql' '--with-mysql-sock=/tmp' '--with-libxml-dir' '--with-gd' '--with-jpeg-dir' '--with-png-dir' '--with-freetype-dir' '--with-iconv-dir' '--with-zlib-dir' '--with-mcrypt' '--enable-soap' '--enable-gd-native-ttf' '--enable-ftp' '--enable-mbstring' '--enable-exif' '--enable-zend-multibyte' '--disable-ipv6' '--enable-fastcgi' '--with-pear' '--with-curl' '--with-openssl'
5 make && make install
注:如果在以上步骤中,提示找不到libevent 等错误时,那说明你还没有安装libevent这个库,所以需要手动安装一下。可以用yum install -y libevent 这个命令搞定。
如果你顺利执行完以上5步,那么你已经安装好了php-5.3.3
接下来就是需要配置了。
cp /usr/local/src/php-5.3.3/php.ini-development /usr/local/php/etc/php.ini
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
vi /usr/local/php/etc/php-fpm.conf
需要修改的地方为:
[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
[www]
listen = /tmp/php-fcgi.sock
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024
这些地方需要删除行开头的分号。
启动php-fpm
命令为 /usr/local/php/sbin/php-fpm -c /usr/local/php/etc/php.ini -y /usr/local/php/etc/php-fpm.conf
你也可以使用系统启动脚本
cp /usr/local/src/php-5.3.3/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod 755 /etc/init.d/php-fpm
/etc/init.d/php-fpm start
注:php-5.3.3 并非稳定版本,不建议在生成环境中使用。另外从php-5.3版本起,mysql的驱动已经支持了mysqlnd,据说这个驱动有效减少了内存使用。具体请看 http://mylinux.5d6d.com/thread-408-1-1.html
- «
- 1
- ...
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- ...
- 66
- »