2009年3月31日星期二

Linux下如何解压.zip和.rar文件

对于Window下的常见压缩文件.zip和.rar,Linux也有相应的方法来解压它们:

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无法启动 解决方法

启动fedora的时候,用root登录进去出现"Nautilus can't be used now, due to an unexpected error from Bonobo when attempting to locate the factory.Killing bonobo-activation-server and restarting Nautilus may help fix the problem." 桌面没有图标,搜索之后找到解决方法:



这是因为在登录到图形界面之前,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系统下用命令行修改时间日期的方法

在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多个子站方法(二)

用Drupal 6 实现千万级记录和300多个子站 http://www.86-00.com 城市分类黄页

是一个有超过千万条记录及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.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多个子站方法(一)

用Drupal 6 实现千万级记录和300多个子站 http://www.86-00.com 城市分类黄页

是一个有超过千万条记录及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 推荐一个构建多语言站必备的模块

近来需要对这个站点进行重新改版,客户要求用drupal来实现。 这个站本身并没有什么特别的,以前都做过,主要的功能之一就是增加了多语言的支持。但是drupal默认的多语言有个缺点,它只能对单个文章进行多语言的 切换,而对一个列表,就不起作用了。比如我用taxonomy作为菜单项,这时如果切换多语言,相应的列表就无法随着改变。

于是想到了用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 安装操作手册

1. 在 http://www.drupal.org 下载新版 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指令详解

由于网站 www.86-00.com 城市分类黄页 用apache + PHP + Drupal 是运行在 windows 平台, 但是经常无法访问 1G内存很快就用完,高峰时达到3G多的虚拟内存。 听说 Lighttpd 耗内存少,处理量又是 Apache 的几倍。 就想改用 Lighttpd 。 成功地在 Windows平台上安装 Lighttpd + php 可以运行网站。 这时要将 apache 的设置参数转为Lighttpd . 所以总结了以 下ProxyPass指令详解. 当转换成 Lighttpd 后运行 PHP 在Windows并没有想象中的高效,如果用cgi方式运行会生成很多个进程。多访时用fcgi 反应感觉很慢。最终都放弃用 Lighttpd。 现在改成用 Apache + php + mysql 运行 Drupal ,用 boost 模块生成 Html 文件再用 ProxyPass 转到 Lighttpd 显示 这迟些再写篇如何实现,这个配置现在我还在测试效果中。

描述:将远程服务器映射到本地服务器的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重写规则的语法

由于想将网站 86-00.com 从apache 转到 lighttpd 但300个子站与一些apache 的 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

由于要将网站 从 Apache 网页服务器转为 Lighttpd , 但 Lighttp 不支持 .htaccess文件 .

在网上找了说用 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 网站访问问题

在实现用 Druapl 做 86-00.com 网站访问问题, 由于数据量大超过1千万条记录。

虽然已做了数据库缓存,Drupal 也设了激进的缓存。但在 apache + mysql 4.12 下还是经常无法响影。 当百度机器人搜索时更是无法打开,无奈之下只有白天禁止百度的IP搜索,晚上手开回来。

这个问题还是要解决的。 由于服务器内存小,apache 的耗用还是较大,所以现在决定改用 Lighttpd 做 web服务器