2009年3月31日星期二
Linux下如何解压.zip和.rar文件
1:对于.zip
linux下提供了zip和unzip程序,zip是压缩程序,unzip是解压程序。它们的参数选项很多,这里只做简单介绍,举例说明一下其用法:
# zip all.zip *.jpg(这条命令是将所有.jpg的文件压缩成一个zip包)
# unzip all.zip(这条命令是将all.zip中的所有文件解压出来)
2:对于.rar
要在linux下处理.rar文件,需要安装RAR for Linux,可以从网上下载,但要记住,RAR for Linux不是免费的;可从http://www.rarsoft.com/download.htm下载RAR 3。60 for Linux ,然后安装其安装操作如下:
# tar -xzpvf rarlinux-3.2.0.tar.gz
# cd rar
# make
这样就安装好了,安装后就有了rar和unrar这两个程序,rar是压缩程序,unrar是解压程序。它们的参数选项很多,举例说明一下其用法
# rar a all *.jpg
这条命令是将所有.jpg的文件压缩成一个rar包,名为all.rar,该程序会将.rar 扩展名将自动附加到包名后。
# unrar e all.rar
这条命令是将all.rar中的所有文件解压出来到当前目录。
查询命令详细说明:
#unrar --help
解压到指定的目录
#unrar x all.rar path/all
-------------------------------------------
by i3server
www.86-00.com
2009年3月30日星期一
Linux Nautilus无法启动 解决方法
这是因为在登录到图形界面之前,bonobo-activation-server已经在运行——这是因为上次退出的时候bonobo-activation-server没有被正常的kill掉。
具体的解决办法是——
打开终端,输入下面的命令:
#killall bonobo-activation-server
#killall nautilus
#nautilus & disown
图标就出现了。如果重启再进去的时候还是会报错,可以换了个用户用Gnome方式登录没问题。
-------------------------------------------
i3server
www.86-00.com
2009年3月29日星期日
在linux系统下用命令行修改时间日期的方法
修改日期
时间设定成2008年9月10日的命令如下:
#date -s 09/10/2008
修改时间
将系统时间设定成上午10点25分0秒的命令如下。
#date -s 10:25:00
同步biso时间
同步BIOS时钟,强制把系统时间写入CMOS,命令如下:
#clock -w
-------------------------------------------
By i3server
www.i3.net.cn
www.86-00.com
2009年3月22日星期日
i3原创: 用Drupal 6 实现千万条记录和300多个子站方法(二)
是一个有超过千万条记录及300多个城市子站的网站。在(一)已讲到为实现300多个子站与将数据分散减软服务器负担。 本文将介绍用 apache 在 Drupal 实现用同一个数据库建立不同内容子站的方法。
其实这个并不复杂简单易实现,具体操作步骤:
1. 要实现子站,当然首先要在域名设置泛域名解释,每个域名控制平台都的设置可能不同。在域名管理平台中,将 *.你的域名.com( 如: *.86-00.com) 指向服务器的IP地址 。生效后,输入任意的子域名都会指向服务器地址。 当然已具体设定指向的子域名除外。
2. 在 apache 设定 httpd.conf 文件, 在 < VirtualHost *:80> < /VirtualHost> 中加入 ServerAlias *.你的域名.com 如:
< VirtualHost *:80>
ServerName 0769.86-00.com
ServerAlias *.86-00.com
DocumentRoot d:/86city/www
Options Indexes FollowSymLinks
AllowOverride all
Order allow,deny
Allow from all
< /Virtuaost>
以上定义是将所有的子网站都指向这个地址。
3. 安装Drupal,在 www.drupal.org 下载新版 Drupal 6及中文语言包。默认安装上述目录。安装完成后,可以输入任意子域名打开网站。 我将每个城市信息内容都分开,每个城市一个数据表,再建2个数据表一个记录每个子站的网站信息,包括:网页头,关键字,区号等信息,另一个数据表记录会员添加信息日志,用于控制会员添加信息后操作。
( 86-00.com 我只自定义了2个模块,一个是 i3producer 用于管理各个城市的企业信息,另一个是 i3weblog 记录用户的企业操作信息。)
4. 修改 Drupal ,让每个子域名访问自己的内容。 一般情况最好不要修改Druapl 的文件,但由于想一开始加载程序时就可以知道。所以我直接修改了 /includes/bootstrap.inc 加入 :
$pub_web_http_host=explode('.',$_SERVER["HTTP_HOST"]);
$i3_ini_set['qh'] = $pub_web_http_host[0];
通过 $_SERVER["HTTP_HOST"] 取的子域名的名称,并保存在 $i3_ini_set 中备用。
5. 建立模块,显示每个子域名内容。我建了一个 i3_producer 模块,并在 hook_init 中,用 $i3_ini_set['qh'] 进行数据表查询,并将相应的数据显示,如 title, keywords等显示,这样就完成在一套 Drupal 显示不同的子域名内容了。
以上是我用Drupal实现86-00.com建城市子站的方法,当然这不是最好方法,每种方法都有好坏,适合自己就好了。 可能有好多不足之处,欢迎指出,谢谢!
<** 此文共享,欢迎转载 ** >
下篇:用Drupal 6 实现千万级记录和300多个子站方法(三)
用 boost 为 300多个子站实现静态页面。敬请留意。
-------------------------------------------
By i3server
www.i3.net.cn
www.86-00.com
2009年3月18日星期三
Apache 2.2 性能优化
Apache 2.0在性能上的改善最吸引人。在支持POSIX线程的Unix系统上,Apache可以通过不同的MPM运行在一种多进程与多线程相混合的模式下,增强部分配置的可扩充性能。相比于Apache 1.3,2.0版本做了大量的优化来提升处理能力和可伸缩性,并且大多数改进在默认状态下即可生效。但是在编译和运行时刻,2.0也有许多可以显著提高性能的选择。本文不想叙述那些以功能换取速度的指令,如HostnameLookups等,而只是说明在2.0中影响性能的最核心特性:MPM(Multi -Processing Modules,多道处理模块)的基本工作原理和配置指令。
毫不夸张地说,MPM的引入是Apache 2.0最重要的变化。大家知道,Apache是基于模块化的设计,而Apache 2.0更扩展了模块化设计到Web服务器的最基本功能。服务器装载了一种多道处理模块,负责绑定本机网络端口、接受请求,并调度子进程来处理请求。扩展模块化设计有两个重要好处:
◆ Apache可以更简洁、有效地支持多种操作系统;
◆ 服务器可以按站点的特殊需要进行自定制。
在用户级,MPM看起来和其它Apache模块非常类似。主要区别是在任意时刻只能有一种MPM被装载到服务器中。
指定MPM的方法
下面以Red Hat Linux 9为平台,说明在Apache 2.0中如何指定MPM (Apache采用2.0.45)。先解压缩源代码包httpd-2.0.45.tar.gz,生成httpd-2.0.45目录(Apache 1.3源代码包的命名规则是apache_1.3.NN.tar.gz,而2.0版则是httpd-2.0.NN.tar.gz,其中NN是次版本号)。
进入httpd-2.0.45目录,运行以下代码:
$ ./configure --help|grep mpm
显示如下:
--with-mpm=MPM
Choose the process model for Apache to use.
MPM={beos|worker|prefork|mpmt_os2| perchild|leader|threadpool}
上述操作用来选择要使用的进程模型,即哪种MPM模块。Beos、mpmt_os2分别是BeOS和OS/2上缺省的MPM, perchild主要设计目的是以不同的用户和组的身份来运行不同的子进程。这在运行多个需要CGI的虚拟主机时特别有用,会比1.3版中的SuExec 机制做得更好。leader和threadpool都是基于worker的变体,还处于实验性阶段,某些情况下并不会按照预期设想的那样工作,所以 Apache官方也并不推荐使用。因此,我们主要阐述prefork和worker这两种和性能关系最大的产品级MPM ( 有关其它的MPM详细说明,请参见Apache官方文档:http://httpd.apache.org/docs-2.0/mod/)。
prefork的工作原理及配置
如果不用“--with-mpm”显式指定某种MPM,prefork就是Unix平台上缺省的MPM。它所采用的预派生子进程方式也是 Apache 1.3中采用的模式。prefork本身并没有使用到线程,2.0版使用它是为了与1.3版保持兼容性;另一方面,prefork用单独的子进程来处理不同的请求,进程之间是彼此独立的,这也使其成为最稳定的MPM之一。
若使用prefork,在make编译和make install安装后,使用“httpd -l”来确定当前使用的MPM,应该会看到prefork.c(如果看到worker.c说明使用的是worker MPM,依此类推)。再查看缺省生成的httpd.conf配置文件,里面包含如下配置段:
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
prefork的工作原理是,控制进程在最初建立“StartServers”个子进程后,为了满足MinSpareServers设置的需要创建一个进程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个,直到满足 MinSpareServers设置的值为止。这就是预派生(prefork)的由来。这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。
MaxSpareServers设置了最大的空闲进程数,如果空闲进程数大于这个值,Apache会自动kill掉一些多余进程。这个值不要设得过大,但如果设的值比MinSpareServers小,Apache会自动把其调整为MinSpareServers+1。如果站点负载较大,可考虑同时加大MinSpareServers和MaxSpareServers。
MaxRequestsPerChild设置的是每个子进程可处理的请求数。每个子进程在处理了“MaxRequestsPerChild” 个请求后将自动销毁。0意味着无限,即子进程永不销毁。虽然缺省设为0可以使每个子进程处理更多的请求,但如果设成非零值也有两点重要的好处:
◆ 可防止意外的内存泄漏;
◆ 在服务器负载下降的时侯会自动减少子进程数。
因此,可根据服务器的负载来调整这个值。笔者认为10000左右比较合适。
MaxClients是这些指令中最为重要的一个,设定的是Apache可以同时处理的请求,是对Apache性能影响最大的参数。其缺省值 150是远远不够的,如果请求总数已达到这个值(可通过ps -ef|grep http|wc -l来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源还剩下很多而HTTP访问却很慢的主要原因。系统管理员可以根据硬件配置和负载情况来动态调整这个值。虽然理论上这个值越大,可以处理的请求就越多,但Apache默认的限制不能大于256。如果把这个值设为大于256,那么 Apache将无法起动。事实上,256对于负载稍重的站点也是不够的。在Apache 1.3中,这是个硬限制。如果要加大这个值,必须在“configure”前手工修改的源代码树下的src/include/httpd.h中查找 256,就会发现“#define HARD_SERVER_LIMIT 256”这行。把256改为要增大的值(如4000),然后重新编译Apache即可。在Apache 2.0中新加入了ServerLimit指令,使得无须重编译Apache就可以加大MaxClients。下面是笔者的prefork配置段:
StartServers 10
MinSpareServers 10
MaxSpareServers 15
ServerLimit 2000
MaxClients 1000
MaxRequestsPerChild 10000
上述配置中,ServerLimit的最大值是20000,对于大多数站点已经足够。如果一定要再加大这个数值,对位于源代码树下server/mpm/prefork/prefork.c中以下两行做相应修改即可:
#define DEFAULT_SERVER_LIMIT 256
#define MAX_SERVER_LIMIT 20000
worker的工作原理及配置
相对于prefork,worker是2.0 版中全新的支持多线程和多进程混合模型的MPM。由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的服务器。但是, worker也使用了多进程,每个进程又生成多个线程,以获得基于进程服务器的稳定性。这种MPM的工作方式将是Apache 2.0的发展趋势。
在configure -with-mpm=worker后,进行make编译、make install安装。在缺省生成的httpd.conf中有以下配置段:
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
worker的工作原理是,由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild 线程数,各个线程独立地处理请求。同样,为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;而MaxClients设置了所有子进程中的线程总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。
MinSpareThreads和MaxSpareThreads的最大缺省值分别是75和250。这两个参数对Apache的性能影响并不大,可以按照实际情况相应调节。
ThreadsPerChild是worker MPM中与性能相关最密切的指令。ThreadsPerChild的最大缺省值是64,如果负载较大,64也是不够的。这时要显式使用 ThreadLimit指令,它的最大缺省值是20000。上述两个值位于源码树server/mpm/worker/worker.c中的以下两行:
#define DEFAULT_THREAD_LIMIT 64
#define MAX_THREAD_LIMIT 20000
这两行对应着ThreadsPerChild和ThreadLimit的限制数。最好在configure之前就把64改成所希望的值。注意,不要把这两个值设得太高,超过系统的处理能力,从而因Apache不起动使系统很不稳定。
Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild值决定的,应该大于等于MaxClients。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认最大的子进程总数是16,加大时也需要显式声明ServerLimit(最大值是 20000)。这两个值位于源码树server/mpm/worker/worker.c中的以下两行:
#define DEFAULT_SERVER_LIMIT 16
#define MAX_SERVER_LIMIT 20000
需要注意的是,如果显式声明了ServerLimit,那么它乘以ThreadsPerChild的值必须大于等于MaxClients,而且 MaxClients必须是ThreadsPerChild的整数倍,否则Apache将会自动调节到一个相应值(可能是个非期望值)。下面是笔者的 worker配置段:
StartServers 3
MaxClients 2000
ServerLimit 25
MinSpareThreads 50
MaxSpareThreads 200
ThreadLimit 200
ThreadsPerChild 100
MaxRequestsPerChild 0
通过上面的叙述,可以了解到Apache 2.0中prefork和worker这两个重要MPM的工作原理,并可根据实际情况来配置Apache相关的核心参数,以获得最大的性能和稳定性。
-------------------------------------------
By i3server
www.i3.net.cn
www.86-00.com
i3原创: 用Drupal 6 实现千万条记录和300多个子站方法(一)
是一个有超过千万条记录及300多个城市子站的网站,如何Drupal 实现。
项目要求:
城市分类黄页 是定位全国300多个城市分类企业信息网站。要求 每个城市可以用子域名访问,并显示相应城市内容。如 东莞分类黄页 , 广州分类黄页 等。
企业资料超过 1000万,管理员要对所有城市新增资料容易管理。
我制作时要解决的问题问题分别是:
1. 过 1000万条记录用 Drupal 的node 能否承受,用什么方法解决。
2. 如何实现 300多个子站,并关联到相应的城市数据中。
3. 服务器资源有限,如何用 boost 为 300多个子站实现静态页面。
我希望实现的方法尽里简单,以下将会分3篇分别说明以上实现的方法:
(一)过 1000万条记录用 Drupal 的node 能否承受,用什么方法解决:
如方便管理想过将 1000万条企业资料记录都导入到node中,但这个项目只有1台服务器,资源相当有限,这样做搜索资料时可能很慢。所以只有将每个城市分别有自已的企业资料数据表,而其他的数据表共享。
这样300多个子站都可以共用一套Drupal 数据表,只有自己城市的企业资料表才是不同。这个做之后,最大的企业数据表就只有 70万条记录 如: 上海分类黄页,这样相对来说会快些。
但由于这样 300多个城市,有会员提交企业资料时如果知道。所以自定义一个模块,用来记录会员向那个城市提交资料, 并进行管理。这样就可以一个管理员管理300多个子站。
小结: 由于服务器资源问题,将1000万条记录分为 ,300多个数据表而没有将所有资料都放在 node 中,这样将无法自动用到 node的一些功能,需要自己编写模块附加。 由于世事总难完美,只有适合自身要求才是好。 不过其他子站发的信息都将会统一用node表中。
城市分类黄页 是用Drupal 6 最简单的模块,只用了核心的模块和boost模块,和我自己编写的2个简单模块实现。 有较多的不足之处敬请指教。
<** 此文共享,欢迎转载 ** >
下篇:用Drupal 6 实现千万级记录和300多个子站方法(二)
用 apache 泛域名实现子站及关联数据表,敬请留意。
-------------------------------------------
By i3server
www.i3.net.cn
www.86-00.com
2009年3月17日星期二
i3: 用Drupal 6 的 i18n 建立一个多语言网站 教程
在括号我的相对路径的网址。因此,如果您的网站,并在括号内http://example.com/drupal我管理/建立/模块,然后在网址是: http://example.com/drupal/admin/build/modules
1 。安装国际化模块 i18n
2 。转到模块(管理/建立/模块) ,并在核心-可选部分启用
*地区
*内容翻译
3 。在多国语言-本土化节让所有可用的。如果您尚未启用投票和简介模块, Drupal问你是否要启用他们。如果你不想让他们在多国语言-本土化没有启用多语言投票和多语言配置文件。
4 。保存
您现在需要翻译的文件的所有可用的语言您的网站(如果你还没有把他们的话) 。去翻译网页和下载。然后提取他们Drupal的文件夹 。
您必须添加此语言:
1 。转到语言网页(管理/设置/语言)
*可以到语言下载,并从中提取出(管理/设置/语言/添加)
*选择配置
*在语言选择路径前缀只和保存设置
2 。确保英语是默认语言
3 。去块(管理/建立/块)
4 。在无效领域选择一个地区的语言切换
5 。选择保存区块
好了,现在你正处于一个良好起点。选择一种语言的语言切换,内置的界面变化相应的语言!如果没有确定,这是翻译。为此,浏览到管理/建立/翻译和检查的比例。它必须是接近100 % 。
接下来的步骤是使多语言内容。
1 。启用多语言支持所有内容类型你想(管理/内容/类型)
*选择编辑的内容类型你想(如网页)
*工作流程中的设置,选择启用,并保存与翻译
2 。现在创建内容的内容类型您已经启用多语言支持(如网页) (节点/添加/页)
3 。在语言领域选择英语
4 。保存网页
5 。选择翻译链接
6 。选择添加的语言翻译为您想要
7 。写的网页。中的值语言领域应显示所选的语言和被禁用/灰色。
8 。保存
现在您应该能够翻译之间切换时,查看网页使用语言切换块。
您可能想要使用国旗相反,在这种情况下,您需要的语言图标模块。
为您的网站完全翻译你需要的菜单翻译。您有两种选择!
1 。建立一个菜单一切可用语言
2 。建立一个菜单上的连结点,以一切可用的语言。我的意思是,如果节点/ 1是您的主页的英文和节点/ 2在希腊,在您的菜单中,您要链接到节点/ 1名为“主页”和一个节点/ 2名为“ Αρχική Σελίδα “ (这是在希腊的主页) 。你必须做到这一点,每多语种网页。
试用两种选择,并选择最适合你。
第一选择(多种菜单)
1 。添加新的菜单(管理/建立/菜单/添加)
2 。菜单中的名称提供一个名称,例如:恩菜单
3 。给标题,说明和保存
4 。新增的项目(管理/建立/菜单定制/菜单昂韦菜单/添加)
5 。给予的路径英文网页(节点/ 1 )
6 。让英文名称的链接
7 。在语言组合框您不必选择一种语言!
8 。保存
9 。添加新的菜单上的第二语言(管理/建立/菜单/添加)
10 。菜单中的名称提供一个名称,例如:萨尔瓦多菜单
11 。新增的项目(管理/建立/菜单定制/菜单法菜单/添加)
12 。给予路径(节点/ 2 ) ,名称和保存
13 。使用相同的程序,建立菜单的所有可用的语言你有
好吧,你现在你的菜单。让我们显示它们。
1 。去块(管理/建立/块)
2 。去无效区域,并选择一个地区的菜单
3 。选择保存区块
4 。为您的英语菜单选择配置栏下行动
5 。在多国语言设置选择英语作为语言和保存
6 。这样做,其余的菜单,并选择适当的语言
第二选择( 1菜单)
1 。添加新的菜单(管理/建立/菜单/添加)
2 。菜单中的名称提供一个名称,例如:多菜单
3 。给标题,说明和保存
4 。新增的项目(管理/建立/菜单定制/菜单多菜单/添加)
5 。给予的路径英文网页(节点/ 1 )
6 。让英文名称的链接
7 。在语言组合框选择英语
8 。保存
9 。添加另一个项目(管理/建立/菜单定制/菜单法菜单/添加)
10 。给予路径(节点/ 2 )和名称
11 。在语言组合框选择您的语言,例如:希腊语
12 。保存
13 。这样做,如果节点/ 1被翻译到更多语言
14 。使用相同的程序,建立菜单链接,所有可用的网页您有多种语言
现在,展示您的菜单
1 。去块(管理/建立/块)
2 。去无效区域,并选择一个地区的菜单
3 。选择保存区块
做完!现在,当您选择一种语言的语言切换,您应该可以看到翻译的内容和正确的菜单。
-------------------------------------------
By i3server
www.i3.net.cn
www.86-00.com
Drupal 推荐一个构建多语言站必备的模块
于是想到了用views来实现,在views的filters中设 Node translation: Language = Current user's languag,这样在切换的时候就可以达到要求了,但是这样还是很麻烦,每次显示一个列表就要创建一个views,而且首页的显示也是一个问题.
后来就在网上找到了 http://drupal.org/project/i18n ,这个i18n模块,可以说是构建多语言必须要用到的一个模块。它可以在查询的时候加上一个条件,这样,默认的所有列表,就可以随着多语言的切换而改变 了。另外,i18n还可以对block,menu,taxonomy,等进行多语言的设置,这样,i18n就可以让你的站完全实现多语言化了,非常 power.
当然,再强大的东西总有它的不足之处,i18n对menu的多语言支持个人感觉不是很好,设置起来相当麻烦,作为i18n的加强版模块,你可以考虑用translation table .它可以快速设置taxonomies和menus的UI,很好地弥补了i18n的不足.
另外,设置多语言也可以考虑用Translation Access ,它提供了对节点的访问控制功能。Menu Translation ,可是对菜单多语言的加强 Cosistent Language Interface ,提供一个可以切换多语言的block.
如果你想更多了解i18n多语言的功能,请参考手册 :http://drupal.org/node/133977
-------------------------------------------
By i3server
www.i3.net.cn
www.86-00.com
Drupal 安装操作手册
2. http://drupal.org/project/zh-hans 下载新版 drupal 中文翻译文件,并复制到安装目录中
3. 新建网站目录,将drupal 原文件与中中文翻译文件复制新目录中
4 在新目录中复制 sites\default\default.settings.php 为 settings.php
5. 在打开 apache 的 httpd.conf 配置文件, 配置站点端口与目录
6. 重启 apache ,打开配置的网址 开始安装 druapl
7. 选择安装druapl的语言,中文 点下继续
8. 输入数据库名称,用户名,密码,数据表前缀,点击保存继续
9. 输入站点名称,Email ,管理员名称,密码 点击确定,完成Drupal 操作
-------------------------------------------
By i3server
www.i3.net.cn
www.86-00.com
2009年3月12日星期四
i3: php常用的几个数组函数
看看下面有关数组的函数你是否都熟悉呢?
一、数组操作的基本函数
数组的键名和值
array_values($arr);获得数组的值
array_keys($arr);获得数组的键名
array_flip($arr);数组中的值与键名互换(如果有重复前面的会被后面的覆盖)
in_array("apple",$arr);在数组中检索apple
array_search("apple",$arr);在数组中检索apple ,如果存在返回键名
array_key_exists("apple",$arr);检索给定的键名是否存在数组中
isset($arr[apple]):检索给定的键名是否存在数组中
数组的内部指针
current($arr);返回数组中的当前单元
pos($arr);返回数组中的当前单元
key($arr);返回数组中当前单元的键名
prev($arr);将数组中的内部指针倒回一位
next($arr);将数组中的内部指针向前移动一位
end($arr);将数组中的内部指针指向最后一个单元
reset($arr;将数组中的内部指针指向第一个单元
each($arr);将返回数组当前元素的一个键名/值的构造数组,并使数组指针向前移动一位
list($key,$value)=each($arr);获得数组当前元素的键名和值
数组和变量之间的转换
extract($arr);用于把数组中的元素转换成变量导入到当前文件中,键名当作变量名,值作为变量值
注:(第二个参数很重要,可以看手册使用)使用方法 echo $a;
compact(var1,var2,var3);用给定的变量名创建一个数组
二、数组的分段和填充
数组的分段
array_slice($arr,0,3);可以将数组中的一段取出,此函数忽略键名
array_splice($arr,0,3,array("black","maroon"));可以将数组中的一段取出,与上个函数不同在于返回的序列从原数组中删除
分割多个数组
array_chunk($arr,3,TRUE);可以将一个数组分割成多个,TRUE为保留原数组的键名
数组的填充
array_pad($arr,5,'x');将一个数组填补到制定长度
三、数组与栈
array_push($arr,"apple","pear");将一个或多个元素压入数组栈的末尾(入栈),返回入栈元素的个数
array_pop($arr);将数组栈的最后一个元素弹出(出栈)
四、数组与列队
array_shift($arr);数组中的第一个元素移出并作为结果返回(数组长度减1,其他元素向前移动一位,数字键名改为从零技术,文字键名不变)
array_unshift($arr,"a",array(1,2));在数组的开头插入一个或多个元素
五、回调函数
array_walk($arr,'function','words');使用用户函数对数组中的每个成员进行处理(第三个参数传递给回调函数function)
array_mpa("function",$arr1,$arr2);可以处理多个数组(当使用两个或更多数组时,他们的长度应该相同)
array_filter($arr,"function");使用回调函数过滤数组中的每个元素,如果回调函数为TRUE,数组的当前元素会被包含在返回的结果数组中,数组的键名保留不变
array_reduce($arr,"function","*");转化为单值函数(*为数组的第一个值)
六、数组的排序
通过元素值对数组排序
sort($arr);由小到大的顺序排序(第二个参数为按什么方式排序)忽略键名的数组排序
rsort($arr);由大到小的顺序排序(第二个参数为按什么方式排序)忽略键名的数组排序
usort($arr,"function");使用用户自定义的比较函数对数组中的值进行排序(function中有两个参数,0表示相等,正数表示第一个大于第二个,负数表示第一个小于第二个)忽略键名的数组排序
asort($arr);由小到大的顺序排序(第二个参数为按什么方式排序)保留键名的数组排序
arsort($arr);由大到小的顺序排序(第二个参数为按什么方式排序)保留键名的数组排序
uasort($arr,"function");使用用户自定义的比较函数对数组中的值进行排序(function中有两个参数,0表示相等,正数表示第一个大于第二个,负数表示第一个小于第二个)保留键名的数组排序
通过键名对数组排序
ksort($arr);按照键名正序排序
krsort($arr);按照键名逆序排序
uksort($arr,"function");使用用户自定义的比较函数对数组中的键名进行排序(function中有两个参数,0表示相等,正数表示第一个大于第二个,负数表示第一个小于第二个)
自然排序法排序
natsort($arr);自然排序(忽略键名)
natcasesort($arr);自然排序(忽略大小写,忽略键名)
七、数组的计算
数组元素的求和
array_sum($arr);对数组内部的所有元素做求和运算
数组的合并
array_merge($arr1,$arr2);合并两个或多个数组(相同的字符串键名,后面的覆盖前面的,相同的数字键名,后面的不会做覆盖操作,而是附加到后面)
“+”$arr1+$arr2;对于相同的键名只保留后一个
array_merge_recursive($arr1,$arr2);递归合并操作,如果数组中有相同的字符串键名,这些值将被合并到一个数组中去。 如果一个值本身是一个数组,将按照相应的键名把它合并为另一个数组。当数组具有相同的数组键名时,后一个值将不会覆盖原来的值,而是附加到后面
数组的差集
array_diff($arr1,$arr2);返回差集结果数组
array_diff_assoc($arr1,$arr2,$arr3);返回差集结果数组,键名也做比较
数组的交集
array_intersect($arr1,$arr2);返回交集结果数组
array_intersect_assoc($arr1,$arr2);返回交集结果数组,键名也做比较
八、其他的数组函数
range(0,12);创建一个包含指定范围单元的数组
array_unique($arr);移除数组中重复的值,新的数组中会保留原始的键名
array_reverse($arr,TRUE);返回一个单元顺序与原数组相反的数组,如果第二个参数为TRUE保留原来的键名
//srand((float)microtime()*10000000); 随机种子触发器
array_rand($arr,2);从数组中随机取出一个或 多个元素
shuffle($arr);将数组的顺序打乱
-------------------------------------------
By i3server
www.i3.net.cn
www.86-00.com
2009年3月8日星期日
i3总结: Apache配置参数(2) : ProxyPass指令详解
描述:将远程服务器映射到本地服务器的URL空间
语法:ProxyPass [路径] !|url [键=值 键=值 ...]] [nocanon]
上下文: server config, virtual host, directory
状态:扩展
模块:mod_proxy
该指令可以将远程服务器映射到本地服务器的URL空间;本地的服务器并不是扮演传统意义上的代理服务器的角色,而是表现为远程服务器的一个镜像。此本地服务器常被成为反向代理(reversed proxy)或者是网关(gateway)。路径是指本地虚拟路径的名字;url指远程服务器的一个部分URL,不能包含查询字符串。
注意:在使用ProxyPass
指令的时候,ProxyRequests
指令通常都应该是关闭的。
假设本地服务器的地址是 http://example.com/
,那么
ProxyPass /mirror/foo/ http://backend.example.com/
将会把对http://example.com/mirror/foo/bar
的本地请求内部转换成到http://backend.example.com/bar
的代理请求。
其中,!
指令当你不想对某个子目录进行反向代理的时候就有用了,例如:
ProxyPass /mirror/foo/i !
ProxyPass /mirror/foo http://backend.example.com
将会把所有的/mirror/foo
请求重定向到backend.example.com
除了对/mirror/foo/i
的请求。
注意:
顺序很重要:排除的指令必须在一般的ProxyPass
指令之前。
和Apache 2.1一样,具备了使用到后端服务器的线程池的能力。使用“键=值
”的参数便可调节线程池的分配。硬性最大值(Hard Maximum)
的默认值为当前MPM中每个进程的线程数量。在Prefork MPM中,该值总是为1,在Worker MPM中,该值受ThreadsPerChild
控制。
设置min
可以决定有多少到后端服务器的链接始终打开。根据需要最多创建数量为柔性最大值(Soft Maximum),也就是smax
的链接。任何超出smax
数量的链接都会指定一个生存时间也就是ttl
。Apache不会同时创建超过硬性最大值(或max
)数量的到后端服务器的链接。
ProxyPass /example http://backend.example.com smax=5 max=20 ttl=120 retry=300
参数 | 默认值 | 描述 |
---|---|---|
min | 0 | 到后端服务器的总是打开的链接最小数。 |
max | 1…n | 允许连接到后端服务器的硬性最大链接数。硬性最大值 的默认值为当前MPM中每个进程的线程数量。在Prefork MPM中,该值总是为1,在Worker MPM中,该值受ThreadsPerChild 控制。 |
smax | max | 根据需要最多创建数量为柔性最大值(Soft Maximum),也就是smax 的链接。任何超出smax 数量的链接都会指定一个生存时间也就是ttl 。 |
acquire | - | 如果设置了该参数,它就会成为等待链接池中空闲链接的最大时间。如果链接池中没有任何空闲链接,那么Apache将会给客户端返回SERVER_BUSY 状态。 |
flushpackets | off | 决定代理模块是否要在接受到每段数据的时候自动冲掉输出缓冲。‘off’表示只有当需要的时候才冲掉,‘on’表示每段数据后都冲,‘auto’表示轮询/等待一段长度为‘flushwait ’毫秒的时间后如果没有输入便冲掉。目前该参数仅对AJP有效。 |
flushwait | 10 | 表示如果‘flushpackets’为‘auto’,在冲掉输出组前等待额外输入的时间,单位毫秒。 |
keepalive | Off | 该参数应该在你的Apache和后端服务器之间有防火墙的时候时候,因为防火墙有可能会丢弃不活动的链接。该标志将会告诉操作系统在不活动的链接中发送KEEP_ALIVE 消息(时间间隔由全局的OS设置决定,一般为120ms),这样避免防火墙丢弃该链接。要启用keepalive可以将该属性设置为On 。 |
lbset | 0 | 对该工作单元所属的负载均衡集群进行设置。负载均衡器会先尝试较小的lbset,然后尝试大的。 |
ping | 0 | Ping数据告诉Web服务器在对ajp13链接递交请求前发送一个CPING请求。参数为等待CPONG响应的延迟,单位为秒。添加该功能是为 了避免挂起和忙碌的Tomcat的一些问题。该功能需要ajp13 的ping/pong支持,已经在Tomcat 3.3.2+、4.1.28+、5.0.13+中实现。它会增加普通操作中的网络流量,有可能是个问题,但是它在集群节点失效或者繁忙的时候减少网络流 量。目前该参数只对AJP有效。 |
loadfactor | 1 | 工作单元负载系数。用于BalancerMember。它是一个1到100之间的数字,用于定义应用于该工作单元的正规化权重负载。 |
redirect | - | 工作单元的重定向路由(Redirection Route)。该值通常被动态设置用于从集群中安全地移除某个节点。如果被设置了,所有不包含会话ID的请求都会被重定向到有等值route参数的BalancerMember中。 |
retry | 60 | 线程池工作单元重试的超时时间,以秒为单位。如果到后端服务器的线程池工作单元状态是出错,Apache将不会递交任何请求到该服务器,直到超时结束。这可以令后端服务器关闭进行维护,并稍后上线。如果值为0则表示总是重试错误状态的工作单元不等待任何时间。 |
route | - | 工作单元的路由,用于负载均衡器中。该路由是附加给会话ID的一个值。 |
status | - | 用一个字符定义该工作单元的初始状态:‘D’表示禁用,‘S’表示已停止,‘I’表示忽略错误,‘H’表示热备,‘E’表示出错。状态可以通过前置‘+’表示设置或者‘-’表示清楚。这样,‘S-E’表示设置该工作单元为已停止并清除出错标志。 |
timeout | Timeout | 链接超时时间,单位为秒。如果未设置,那么Apache会一直等到有可用的链接位置。该指令常和max参数一起使用来限制到后端服务器的链接。 |
ttl | - | 超出smax连接数的非活动链接的生存时间(Time To Live),单位为秒。Apache会关闭在这段时间内没有被用过的所有链接。 |
如果代理的指令类型以balancer://
开头那么会创建一个虚拟工作单元,并不直接和后端服务器通讯。它负责对一些“真正”的工作单元进行管理。这种情况下可以给虚拟工作单元添加一系列额外参数。更多关于均衡器如何工作的信息请查看mod_proxy_balancer
。
参数 | 默认值 | 描述 |
---|---|---|
lbmethod | byrequests | 选择均衡器的负载均衡方式。可以是byrequests ,进行加权请求计数,或者是bytraffic ,进行加权流量字节计数均衡。默认按请求数。 |
maxattempts | 1 | 在放弃之前的故障转移的最大尝试次数。 |
nofailover | Off | 如果设为‘On ’,当工作单元被禁用或者出错时,会话则立即中断。可以将该值设为On 如果后端服务器不支持会话复制(Session replication)。 |
stickysession | - | 均衡器粘连会话名称。该值常常会被设置为类似JSESSIONID 或者PHPSESSIONID 之类的值,他依赖于支持会话的后端应用服务器。如果后端服务器使用不同的cookie名称或者URL编码的ID(像servlet容器),使用|来分开他们。第一个部分针对cookie,第二个针对路径。 |
timeout | 0 | 均衡器超时时间,单位为秒。如果设置了,那么就是等待空闲工作单元的最大时间。默认是不等。 |
均衡器设置范例
ProxyPass /special-area http://special.example.com/ smax=5 max=10
ProxyPass / balancer://mycluster stickysession=JSESSIONID|jsessionid nofailover=On
BalancerMember http://1.2.3.4:8009
BalancerMember http://1.2.3.5:8009 smax=10
# 性能较弱的服务器,不要给他发送太多请求
BalancerMember http://1.2.3.6:8009 smax=1 loadfactor=20
设置一个热备份,也就是只有当没有其他成员可用的时候才使用:
ProxyPass / balancer://hotcluster/
BalancerMember http://1.2.3.4:8009 loadfactor=1
BalancerMember http://1.2.3.5:8009 loadfactor=2
# 以下是热备份
BalancerMember http://1.2.3.6:8009 status=+H
ProxySet lbmethod=bytraffic
正常情况下,mod_proxy会标准化被ProxyPass的URL。但它可能会和某些后端不兼容,尤其是那些利用了PATH_INFO的。可选的nocanon关键词可以禁止它,并不动地直接将URL路径传递给后端。注意它可能会影响到后端的安全性,因为它跳过了由代理提供的对常见的基于URL的攻击的保护。
当用在
节中的时候,第一个参数应被忽略,并且本地的路径将从
取得。
如果你需要更加有弹性的反向代理配置,参见是用[P]
标志的RewriteRule
指令。
i3总结: Apache配置参数(1) : ReWriteRule参数,RewriteRule重写规则的语法
一条RewriteRule指令,定义一条重写规则,规则间的顺序非常重要。对Apache1.2及以后的版本,模板(pattern)是一个 POSIX正则式,用以匹配当前的URL。当前的URL不一定是用记最初提交的URL,因为可能用一些规则在此规则前已经对URL进行了处理。
对mod_rewrite来说,!是个合法的模板前缀,表示“非”的意思,这对描述“不满足某种匹配条件”的情况非常方便,或用作最后一条默认规则。当使用!时,不能在模板中有分组的通配符,也不能做后向引用。
当匹配成功后,Substitution会被用来替换相应的匹配,它除了可以是普通的字符串以外,还可以包括:
1. $N,引用RewriteRule模板中匹配的相关字串,N表示序号,N=0..9
2. %N,引用最后一个RewriteCond模板中匹配的数据,N表示序号
3. %{VARNAME},服务器变量
4. ${mapname:key|default},映射函数调用
这些特殊内容的扩展,按上述顺序进行。
一个URL的全部相关部分都会被Substitution替换,而且这个替换过程会一直持续到所有的规则都被执行完,除非明确地用L标志中断处理过程。
当susbstitution有”-”前缀时,表示不进行替换,只做匹配检查。
利用RewriteRule,可定义含有请求串(Query String)的URL,此时只需在Sustitution中加入一个?,表示此后的内容放入QUERY_STRING变量中。如果要清空一个 QUERY_STRING变量,只需要以?结束Substitution串即可。
如果给一个Substitution增加一个
1. 'redirect|R [=code]' (强制重定向)
给当前的URI增加前缀
2. 'forbidden|F' (强制禁止访问URL所指的资源)
立即返回状态值403 (FORBIDDEN)的应答包。将这个标志与合适的RewriteConds 联合使用,可以阻断访问某些URL。
3. 'gone|G' (强制返回URL所指资源为不存在(gone))
立即返回状态值410 (GONE)的应答包。用这个标志来标记URL所指的资源永久消失了.
4. # 'proxy|P' (强制将当前URL送往代理模块(proxy module))
这个标志,强制将substitution当作一个发向代理模块的请求,并立即将共送往代理模块。因此,必须确保substitution串是一个合法的URI (如, 典型的情况是以
5. 'last|L' (最后一条规则)
中止重写流程,不再对当前URL施加更多的重写规则。这相当于perl的last命令或C的break命令。
6. 'next|N' (下一轮)
重新从第一条重写规则开始执行重写过程,新开的过程中的URL不应当与最初的URL相同。 这相当于Perl的next命令或C的continue命令. 千万小心不要产生死循环。
7. # 'chain|C' (将当前的规则与其后续规则綑绑(chained))
当规则匹配时,处理过程与没有綑绑一样;如果规则不匹配,则綑绑在一起的后续规则也不在检查和执行。
8. 'type|T=MIME-type' (强制MIME类型)
强制将目标文件的MIME-type为某MIME类型。例如,这可用来模仿mod_alias模块对某目录的ScriptAlias指定,通过强制将该目录下的所有文件的类型改为 “application/x-httpd-cgi”.
9. 'nosubreq|NS' (used only if no internal sub-request )
这个标志强制重写引擎跳过为内部sub-request的重写规则.例如,当mod_include试图找到某一目录下的默认文件时 (index.xxx),sub-requests 会在Apache内部发生. Sub-requests并非总是有用的,在某些情况下如果整个规则集施加到它上面,会产生错误。利用这个标志可排除执行一些规则。
10. 'nocase|NC' (模板不区分大小写) 11. 'qsappend|QSA' (追加请求串(query string))
这个标志,强制重写引擎为Substitution的请求串追加一部分串,则不是替换掉原来的。借助这个标志,可以使用一个重写规则给请求串增加更多的数据。
12. 'noescape|NE' (不对输出结果中的特殊字符进行转义处理)
通常情况下,mod_write的输出结果中,特殊字符(如'%', '$', ';', 等)会转义为它们的16进制形式(如分别为'%25', '%24', and '%3B')。这个标志会禁止mod_rewrite对输出结果进行此类操作。 这个标志只能在 Apache 1.3.20及以后的版本中使用。
13. 'passthrough|PT' (通过下一个处理器)
这个标志强制重写引擎用filename字段的值来替换内部request_rec数据结构中uri字段的值。. 使用这个标志,可以使后续的其它URI-to-filename转换器的Alias、ScriptAlias、Redirect等指令,也能正常处理 RewriteRule指令的输出结果。用一个小例子来说明它的语义:如果要用mod_rewrite的重写引擎将/abc转换为/def,然后用 mod_alas将/def重写为ghi,则要:
RewriteRule ^/abc(.*) /def$1 [PT]
Alias /def /ghi
如果PT标志被忽略,则mod_rewrite也能很好完成工作,如果., 将 uri=/abc/... 转换为filename=/def/... ,完全符合一个URI-to-filename转换器的动作。接下来 mod_alias 试图做 URI-to-filename 转换时就会出问题。
注意:如果要混合都含有URL-to-filename转换器的不同的模块的指令,必须用这个标志。最典型的例子是mod_alias和mod_rewrite的使用。
14. 'skip|S=num' (跳过后面的num个规则)
当前规则匹配时,强制重写引擎跳过后续的num个规则。用这个可以来模仿if-then-else结构:then子句的最后一条rule的标志是skip=N,而N是else子句的规则条数。
15. 'env|E=VAR:VAL' (设置环境变量)
设置名为VAR的环境变量的值为VAL,其中VAL中可以含有正则式的后向引用($N或%N)。这个标志可以使用多次,以设置多个环境变量。这儿设置 的变量,可以在多种情况下被引用,如在XSSI或CGI中。另外,也可以在RewriteCond模板中以%{ENV:VAR}的形式被引用。
16. 注意:一定不要忘记,在服务器范围内的配置文件中,模板(pattern)用以匹配整个URL;而在目录范围内的配置文件中,目录前缀总是被自动去掉后再 进行模板匹配的,且在替换完成后自动再加上这个前缀。这个功能对很多种类的重写是非常重要的,因为如果没有去前缀,则要进行父目录的匹配,而父目录的信息 并不是总能得到的。一个例外是,当substitution中有http://打头时,则不再自动增加前缀了,如果P标志出现,则会强制转向代理。
注意:如果要在某个目录范围内启动重写引擎,则需要在相应的目录配置文件中设置 “RewriteEngine on”,且目录的“Options FollowSymLinks”必须设置。如果管理员由于安全原因没有打开FollowSymLinks,则不能使用重写引擎。 http://hostname开头),否则会从代理模块得到一个错误. 这个标志,是ProxyPass指令的一个更强劲的实现,将远程请求(remote stuff)映射到本地服务器的名字空间(namespace)中来。
注意,使用这个功能必须确保代理模块已经编译到Apache 服务器程序中了. 可以用“httpd -l ”命令,来检查输出中是否含有mod_proxy.c来确认一下。如果没有,而又需要使用这个功能,则需要重新编译``httpd''程序并使用 mod_proxy有效。 http://thishost[:thisport]/, 从而生成一个新的URL,强制生成一个外部重定向(external redirection,指生的URL发送到客户端,由客户端再次以新的URL发出请求,虽然新URL仍指向当前的服务器). 如果没有指定的code值,则HTTP应答以状态值302 (MOVED TEMPORARILY),如果想使用300-400(不含400)间的其它值可以通过在code的位置以相应的数字指定,也可以用标志名指定: temp (默认值), permanent, seeother. 注意,当使用这个标志时,要确实substitution是个合法的URL,这个标志只是在URL前增加http://thishost[:thisport]/前缀而已,重写操作会继续进行。如果要立即将新URL重定向,用L标志来中重写流程。 http://thishost[:port]的前缀,则mod_rewrite会自动将此前缀去掉。因此,利用http://thisthost做一个无条件的重定向到自己,将难以奏效。要实现这种效果,必须使用R标志。
Flags是可选参数,当有多个标志同时出现时,彼此间以逗号分隔。
---------------------------------------------
By i3server
www.i3.net.cn
www.86-00.com
2009年3月5日星期四
i3原创:在 Lighttpd 实现Drupal 的Clean URLS
在网上找了说用 Lighttpd 的 mod_magnet 模块,但没有成功实现。
后查找用用 Lighttpd 的 mod_rewrite 可以简单的实现. 过程:
1. 修改Lighttpd配置文件,Lighttpd目录下的conf/lighttpd-inc.conf配置文件,那么就修改这个文件,开启rewrite模块:
server.modules = (
### rewrite模块
mod_rewrite"
)
2 . 参考Drupal默认的.htaccess文件里rewrite模块部分:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
看到没有,只有一条RewriteRule,就是它了。那么怎么样把它“移植”到Lighttpd的配置文件里呢?很简单,在Lighttpd配置文件里的相关站点添加:
#### url handling modules (rewrite, redirect, access)
url.rewrite = ( "^/(.*.gif|.*.png|.*.jpg|.*.pdf|.*.js|.*.css)" => "/$1", "^/(.*)$" => "/index.php?q=$1" )
3. 然后进入Drupal目录,修改sites/default/settings.php文件,在末尾处添加:
/**
* Clean URL
**/
$conf['clean_url']=1;
现在访问http://***.*** /,Drupal 网站一切正常了哦! 这样让 Lighttpd 也支持安装 Druapl了。
但是当Drupal 的 page带参数是无法显示 page参数。所以可以再修改一下
url.rewrite-final = (
"^/system/test/(.*)$" => "/index.php?q=system/test/$1",
"^/system/test-clean-url/(.*)$" => "/index.php?q=system/test-clean-url/$1",
"/rss.xml$" => "/index.php?q=rss.xml",
"^/search/(.*)$" => "/index.php?q=search/$1",
"^/([^.?]*)\?(.*)$" => "/index.php?q=$1&$2",
"^/([^.?]*)$" => "/index.php?q=$1",
"^/([^.?]*\.html)$" => "/index.php?q=$1",
"^/([^.?]*\.htm)$" => "/index.php?q=$1",
"^/([^.?]*\.php)$" => "/index.php?q=$1",
)
加入您要修改的转内容。
---------------------------------------
i3Server 写
www.i3.net.cn
www.86-00.com
i3原创:在实现用 Druapl 做 86-00.com 网站访问问题
虽然已做了数据库缓存,Drupal 也设了激进的缓存。但在 apache + mysql 4.12 下还是经常无法响影。 当百度机器人搜索时更是无法打开,无奈之下只有白天禁止百度的IP搜索,晚上手开回来。
这个问题还是要解决的。 由于服务器内存小,apache 的耗用还是较大,所以现在决定改用 Lighttpd 做 web服务器