人一生这一辈子,能记住多少事?还是写下来的好。 注册 | 登陆
浏览模式: 标准 | 列表2007年10月的文章

PHP5下fckeditor的上传中文名出错的解决方法

使用FCKeditor上传图片、Flash等文件时,文件名中的中文会显示为乱码并在在服务器上面保存有些全部为乱码文件,不能正常显示,在网上搜了一下前辈们的解决方法,没找到很好的解决办法。看来还有N多的人和我一样的困惑,但解决办法又如此的简单:

将 editor\filemanager\browser\default\frmupload.html 文件的编码改为UTF-8即可。

如果不能解决则

编辑upload.php文件

 

PHP代码
  1. // Compose the file path.    
  2.   
  3. $sFileName =mb_convert_encoding ( $sFileName , 'utf-8' );   
  4. //End Modifyed    

Tags: fckeditor, 上传出错, 中文文件名

php技术生成静态页面的实现

 我们先回顾一些基本的概念。

  一、PHP脚本与动态页面。

  PHP脚本是一种服务器端脚本程序,可通过嵌入等方法与HTML文件混合,也可以类,函数封装等形式,以模板的方式对用户请求进行处理。无论以何种方式,它的基本原理是这样的。由客户端提出请求,请求某一页面 -----> WEB服务器引入指定相应脚本进行处理 -----> 脚本被载入服务器 -----> 由服务器指定的PHP解析器对脚本进行解析形成HTML语言形式 ----> 将解析后的HTML语句以包的方式传回给浏览器。由此不难看出,在页面发送到浏览器后, PHP就不存在了,已被转化解析为HTML语句。客户请求为一动态文件,事实上并没有真正的文件存在在那里,是PHP解析而成相对应的页面,然后发送回浏览器。这种页面处理方式被称为“动态页面”。

  二、静态页面。

  静态页面是指在服务器端确实存在的仅含HTML以及JS,CSS等客户端运行脚本的页面。它的处理方式是。由客户端提出请求,请求某一页面 ---- > WEB服务器确认并载入某一页面 ----> WEB服务器将该页面以包的形式传递回浏览器。由这一过程,我们对比一下动态页面,即可方现。动态页面需由WEB服务器的PHP解析器进行解析,而且通常还需连接数据库,进行数据库存取操作,然后才能形成HTML语言信息包;而静态页面,无须解析,无须连接数据库,直接发送,可大大减轻服务器压力,提高服务器负载能力,大幅提供页面打开速度和网站整体打开速度。但其缺点是,不能动态地对请求进行处理,服务器上必须确实存在该文件。

  三、模板及模板解析。

  模板即尚未填充内容html文件。例如:

  temp.html

 

XML/HTML代码
  1. <HTML>    
  2. <TITLE>{ title }</TITLE>    
  3. <BODY>    
  4. this is a { file } file''''s templets    
  5. </BODY>    
  6. </HTML>   

  PHP处理:


  templetest.php 

PHP代码
  1.   $title = "HP爱好者测试模板";    
  2.   $file = "TwoMax Inter test templet,   
  3.   author:Sheyi";    
  4.   $fp = fopen ("temp.html","r");    
  5.   $content = fread ($fp,filesize ("temp.html"));    
  6.   $content .= str_replace ("{ file }",$file,$content);    
  7.   $content .= str_replace ("{ title }",$title,$content);    
  8.   echo $content;   

  模板解析处理,即将经PHP脚本解析处理后得出的结果填充(content)进模板的处理过程。通常借助于模板类。目前较流行的模板解析类有 phplib,smarty,fastsmarty等等。模板解析处理的原理通常为替换。也有些程序员习惯将判断,循环等处理放进模板文件中,用解析类处理,典型应用为block概念,简单来说即为一个循环处理。由PHP脚本指定循环次数,如何循环代入等,再由模板解析类具体实施这些操作。

  好了,对比过静态页面与动态页面各自的优劣,现在我们就来说说,如何用PHP生成静态文件。

  PHP生成静态页面并不是指PHP的动态解析,输出HTML页面,而是指用PHP创建HTML页面。同时因为HTML的不可写性,我们创建的HTML 若有修改,则需删掉重新生成即可。(当然你也可以选择用正则进行修改,但个人认为那样做倒不如删掉重新生成来得快捷,有些得不偿失。)

  言归正传。用过PHP文件操作函数的PHP FANS知道,PHP中有一个文件操作函数fopen,即打开文件。若文件不存在,则尝试创建。这即是PHP可以用来创建HTML文件的理论基础。只要用来存放HTML文件的文件夹有写权限(即权限定义0777),即可创建文件。(针对UNIX系统而言,Win系统无须考虑。)仍以上例为例,若我们修改最后一句,并指定在test目录下生成一个名为test.html的静态文件:

 

PHP代码
  1.   $title = "拓迈国际测试模板";    
  2.   $file = "TwoMax Inter test templet,   
  3.   author:_Max\">Matrix@Two_Max";    
  4.   $fp = fopen ("temp.html","r");    
  5.   $content = fread ($fp,filesize ("temp.html"));    
  6.   $content .= str_replace ("{ file }",$file,$content);    
  7.   $content .= str_replace ("{ title }",$title,$content);    
  8.   // echo $content;    
  9.   $filename = "test/test.html";    
  10.   $handle = fopen ($filename,"w"); //打开文件指针,创建文件    
  11.   /*   
  12.   检查文件是否被创建且可写   
  13.   */    
  14.   if (!is_writable ($filename)){    
  15.   die ("文件:".$filename."不可写,请检查其属性后重试!");    
  16.   }    
  17.   if (!fwrite ($handle,$content)){ //将信息写入文件    
  18.   die ("生成文件".$filename."失败!");    
  19.   }    
  20.   fclose ($handle); //关闭指针    
  21.   die ("创建文件".$filename."成功!");   

  实际应用中常见问题解决方案参考:

  一、文章列表问题:

  在数据库中创建字段,记录文件名,每生成一个文件,将自动生成的文件名存入数据库,对于推荐文章,只需指向存放静态文件的指定文件夹中的该页面即可。利用PHP操作处理文章列表,存为字符串,生成页面时替换此字符串即可。如,在页面中放置文章列表的表格加入标记{ articletable },而在PHP处理文件中:

 

PHP代码
  1.   $title = "拓迈国际测试模板";    
  2.   $file = "file";    
  3.   $fp = fopen ("temp.html","r");    
  4.   $content = fread ($fp,filesize ("temp.html"));    
  5.   $content .= str_replace ("{ file }",$file,$content);    
  6.   $content .= str_replace ("{ title }",$title,$content);    
  7.   // 生成列表开始    
  8.   $list = '''''''';    
  9.   $sql = "select id,title,filename from article";    
  10.   $query = mysql_query ($sql);    
  11.   while ($result = mysql_fetch_array ($query)){    
  12.   $list .= ''''''''.$result[''''title''''].''''    
  13.   '''';    
  14.   }    
  15.   $content .= str_replace ("{ articletable }",$list,$content);    
  16.   //生成列表结束    
  17.   // echo $content;    
  18.   $filename = "test/test.html";    
  19.   $handle = fopen ($filename,"w"); //打开文件指针,创建文件    
  20.   /*   
  21.   检查文件是否被创建且可写   
  22.   */    
  23.   if (!is_writable ($filename)){    
  24.   die ("文件:".$filename."不可写,请检查其属性后重试!");    
  25.   }    
  26.   if (!fwrite ($handle,$content)){ //将信息写入文件    
  27.   die ("生成文件".$filename."失败!");    
  28.   }    
  29.   fclose ($handle); //关闭指针    
  30.   die ("创建文件".$filename."成功!");   


  二、分页问题。

  如我们指定分页时,每页20篇。某子频道列表内文章经数据库查询为45条,则,首先我们通过查询得到如下参数:1,总页数;2,每页篇数。第二步, for ($i = 0; $i < allpages; $i++),页面元素获取,分析,文章生成,都在此循环中执行。不同的是,die ("创建文件".$filename."成功!";这句去掉,放到循环后的显示,因为该语句将中止程序执行。例:

 

PHP代码
  1. <?php   
  2.   $fp = fopen ("temp.html","r");    
  3.   $content = fread ($fp,filesize ("temp.html"));    
  4.   $onepage = ''''20'''';    
  5.   $sql = "select id from article where channel=''''$channelid''''";    
  6.   $query = mysql_query ($sql);    
  7.   $num = mysql_num_rows ($query);    
  8.   $allpages = ceil ($num / $onepage);    
  9.   for ($i = 0;$i<$allpages$i++){    
  10.   if ($i == 0){    
  11.   $indexpath = "index.html";    
  12.   } else {    
  13.   $indexpath = "index_".$i."html";    
  14.   }    
  15.   $start = $i * $onepage;    
  16.   $list = '''''''';    
  17.   $sql_for_page = "select name,filename,title from article where channel=''''$channelid'''' limit $start,$onepage";    
  18.   $query_for_page = mysql_query ($sql_for_page);    
  19.   while ($result = $query_for_page){    
  20.   $list .= ''''''''.$title.''''    
  21.   '''';    
  22.   }    
  23.   $content = str_replace ("{ articletable }",$list,$content);    
  24.   if (is_file ($indexpath)){    
  25.   @unlink ($indexpath); //若文件已存在,则删除    
  26.   }    
  27.   $handle = fopen ($indexpath,"w"); //打开文件指针,创建文件    
  28.   /*   
  29.   检查文件是否被创建且可写   
  30.   */    
  31.   if (!is_writable ($indexpath)){    
  32.   echo "文件:".$indexpath."不可写,请检查其属性后重试!"//修改为echo    
  33.   }    
  34.   if (!fwrite ($handle,$content)){ //将信息写入文件    
  35.   echo "生成文件".$indexpath."失败!"//修改为echo    
  36.   }    
  37.   fclose ($handle); //关闭指针    
  38.   }    
  39.   fclose ($fp);    
  40.   die ("生成分页文件完成,如生成不完全,请检查文件权限系统后重新生成!");    
  41.   ?>  

  大致思路如此,其中如其它数据生成,数据输入输出检查,分页内容指向等可酌情在页面中加入。

  在实际文章系统处理过程当中,还有许多问题有待考虑,与动态页面不同之处,需注意的地方还有很多。但大致思路即是如此,其它方面可举一反三而得。

  版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明

  本文出自:http://www.otm.cn 作者:Matrix@Two_Max

PHP生成静态页面的一些经验

静态页面的生成一般有这么几个思路了。。
1。程序编写过程中。不使用直接输出的语句。而时将所有的输出连接至输出字符串,输出完成后。再直接将输出字符串内容写入文件
2。编写中按照正常的方式编写。通过ob函数组捕获输出。然后将输出写入文件
3。使用模板类时,用get/fetch一类的方法获取输出。并写入文件。

具体实现上又有这两种方法
1。管理后台添加记录时,直接生成目标html页面,并且前台调用连接直接指向生成的html页面。这种方法程优点是程序效率最高。服务器负荷轻,不过由于生成的是纯静态页面,一旦页面样式上有所改动就必须重新生成所有的内容页。所以实际使用中应用一般不是太多。更多的是使用js,ssi,xml/xsl等客户端手段,生成的静态文件中仅保存数据,不涉及样式,这样能达到速度和维护性的平衡,不过相对前后台程序要复杂些(应用这种方法时,由于内容为纯静态,可以搭配单独编译的纯静态的apache使用。。效率和资源占用上比包含动态内容支持的要更佳)

2。前台访问链接指向php程序,php程序首先检查是否存在相应的静态文件。如果静态文件不存在。则生成并重定向至此文件,否则直接重定向。这种方法实际使用中一般和apache的url_rewrite功能一起使用。将php的文件地址重为html的形式,有利于搜索引擎的检索。这种方法在效率上略有损失,不过程序结构简单,便于调整,在访问量不是很大时使用很合适

Tags: 静态页面, php, 经验

PHP中使用FCKeditor2.4.3配置

1、首先删除不必要的文件节省空间。凡是以_开头的文件如_samples,_testcases和一些用不到的.asp、.jsp、.cfm文件统统干掉。

2、修改fckconfig.js 

JavaScript代码
  1. FCKConfig.AutoDetectLanguage = true ;//是否自动检测语言    
  2. FCKConfig.DefaultLanguage     = 'zh-cn' ;//设置语言    
  3. FCKConfig.SkinPath = FCKConfig.BasePath + 'skins/default/' ;//设置皮肤    
  4. FCKConfig.TabSpaces = 1 ;//tab是否有效    
  5. FCKConfig.ToolbarStartExpanded = true ;//编辑工具条是否出现,等点“展开工具栏”时才出现    
  6. FCKConfig.FontNames     = '宋体;黑体;隶书;楷体_GB2312;Arial;Comic Sans MS;Courier New;Tahoma;Times New Roman;Verdana' ;//添加中文字体   


修改FCKeditoreditorCSSfck_editorarea.css
设置默认字体及大小 

CSS代码
  1. body, td    
  2. {    
  3. font-familyArialVerdana, Sans-Serif;    
  4. font-size14px;    
  5. }   


3、关于文件上传的设置
 
修改fckconfig.js 

JavaScript代码
  1. var _FileBrowserLanguage = 'php' ; // asp | aspx | cfm | lasso | perl | php     
  2. var _QuickUploadLanguage = 'php' ; // asp | aspx | cfm | lasso | php   

修改fckeditor/editor/filemanager/connectors/php/config.php 
 

PHP代码
  1. $Config['Enabled'] = true ;       
  2. $Config['UserFilesPath'] = '/userfiles/' ;//设置上传的文件夹,可自己指定      


修改fckeditor/editor/filemanager/upload/php/config.php 
 

PHP代码
  1. $Config['Enabled'] = true ;       
  2. $Config['UseFileType'] = true ;       
  3. $Config['UserFilesPath'] = '/userfiles/' ;//同上要一样      



4、引入在线编辑器时只需 

PHP代码
  1. <?php    
  2. include("fckeditor/fckeditor.php") ;    
  3. $oFCKeditor = new FCKeditor('FCKeditor1') ;//实例化    
  4. $oFCKeditor->BasePath = 'fckeditor/';//这个路径一定要和上面那个引入路径一致,否则会报错:找不到fckeditor.html页面    
  5. //$oFCKeditor->Value = '' ;    
  6. $oFCKeditor->Width = '100%' ;     
  7. $oFCKeditor->Height = '300' ;     
  8. $oFCKeditor->Create() ;    
  9. ?>   



 
JS用alert( FCKeditorAPI.GetInstance('FCKeditor1').GetXHTML( true)得到FCKeditor1的值;
PHP用$_POST['FCKeditor1']得到FCKeditor1的值。

Tags: fckeditor, php, 配置

FLASH的wmode的說明

目前也為 Netscape Windows & Mac OS X 實作了無視窗模式
無視窗模式 (之前只有在 Windows Internet Explorer 上有支援) 讓您可以在瀏覽器中使用透明影片、絕對位置和圖層功能等好處。無視窗模式是使用 object 標記中的 wmode 參數所控制。Flash Player 在特定的瀏覽器中支援三種無視窗模式:

視窗:使用 Window 屬性,在網頁上其本身的矩形視窗中播放 Flash Player 影片。這是 WMode 的預設屬性,以典型的 Flash Player 方式運作。一般而言,它提供了最快速的動畫效能。

不透明:使用 Opaque 屬性,您可以使用 JavaScript 移動或重新調整影片大小,而不需要透明的背景。不透明模式可以在網頁上隱藏影片後的所有東西。此外,不透明模式會在 Flash 影片後移動元素 (例如,動態的 HTML),防止它們被顯示出來。

透明:(Transparent) 透明模式允許 HTML 網頁的背景、Flash 影片或圖層下的 DHTML 圖層,透過影片的透明部分被顯示出來。這讓您可以將影片與 HTML 網頁的其他元素相重疊。當您使用這個屬性時,動畫效能可能會變慢。

透過下列幾種方式,無視窗模式會被 Flash 或 HTML 開發人員所叫用或影響:
- 在 object 或 embed 標記中設定 wmode 參數
- 使用 Flash 撰寫工具,在「發佈設定」HTML 標記中設定 HTML「視窗模式」選項
- 使用階層式樣式表,設定 z 軸索引或樣式設定,將 DIV 層疊在外掛程式的上方。

這項功能在下列瀏覽器中受到支援:
Windows Internet Explorer
Windows Netscape 7.0
Windows AOL
Windows Mozilla 1.0
Mac OS X IE 5.1
Mac OS X IE 5.2
Mac OS X Netscape 7.0
Mac OS X AOL
Mac OS X Mozilla 1.0
Mac OS X CompuServe

這項功能在 Mac Classic 上不受支援。

Tags: flash, wmode

MPM中prefork与worker的区别

为了使Apache更加平滑地从1.3版升级到2.0版,Apache开发团队做了很多工作。目前很多重要的模块已经可以很好地支持2.0版,如PHP、FastCGI、Mod_perl、Mod_python等。在httpd.conf的指令配置语法上,目前的2.0版(2.0.45)与1.3版的兼容性已做得相当好。比如,以前的2.0版如果要使用PHP,一般用过滤器实现;现在的PHP官方文档中已经使用1.3版中的LoadModule语句做为加载PHP的推荐方式。只要略微了解一下Apache 2.0的新特性,从1.3版升级到2.0版将是一件非常容易的事情。使用Apache 2.0是大势所趋,因为Apache的开发团队已经把开发重心转移到2.0版上。1.3版自2002年10月发布了1.3.27后一直没有新版本推出,而2.0版在与1.3.27同时发布2.0.43后,在今年1月发布了2.0.44,并于今年3月末发布了2.0.45,并包含了很多改进和修正。

  MPM的引入带来性能改善

  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目录,运行以下代码:

[code]
$ ./configure --help|grep mpm
[/code]

 

  显示如下:
[code]
--with-mpm=MPM Choose the process model for Apache to use. MPM={beos|worker|prefork|mpmt_os2| perchild|leader|threadpool}
[/code]

 

  上述操作用来选择要使用的进程模型,即哪种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配置文件,里面包含如下配置段:
[code]<IfModule prefork.c> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 MaxRequestsPerChild 0 </IfModule>[/code]

 


  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配置段:
[code]
<IfModule prefork.c> StartServers 10 MinSpareServers 10 MaxSpareServers 15 ServerLimit 2000 MaxClients 1000 MaxRequestsPerChild 10000 </IfModule>
[/code]

 

  上述配置中,ServerLimit的最大值是20000,对于大多数站点已经足够。如果一定要再加大这个数值,对位于源代码树下server/mpm/prefork/prefork.c中以下两行做相应修改即可:
[code]
define DEFAULT_SERVER_LIMIT 256
define MAX_SERVER_LIMIT 20000
[/code]


  worker的工作原理及配置

  相对于prefork,worker是2.0 版中全新的支持多线程和多进程混合模型的MPM。由于使用线程来处理,钥梢源硐喽院A康那肭螅低匙试吹目∮诨诮痰姆务器。但是,worker也使用了多进程,每个进程又生成多个线程,以获得基于进程服务器的稳定性。这种MPM的工作方式将是Apache 2.0的发展趋势。

  在configure -with-mpm=worker后,进行make编译、make install安装。在缺省生成的httpd.conf中有以下配置段:

[code]
<IfModule worker.c> StartServers 2 MaxClients 150 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule>
[/code]

 

  worker的工作原理是,由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild线程数,各个线程独立地处理请求。同样,为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;而MaxClients设置了所有子进程中的线程总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。

  MinSpareThreads和MaxSpareThreads的最大缺省值分别是75和250。这两个参数对Apache的性能影响并不大,可以按照实际情况相应调节。

  ThreadsPerChild是worker MPM中与性能相关最密切的指令。ThreadsPerChild的最大缺省值是64,如果负载较大,64也是不够的。这时要显式使用ThreadLimit指令,它的最大缺省值是20000。上述两个值位于源码树server/mpm/worker/worker.c中的以下两行:

[code]
define DEFAULT_THREAD_LIMIT 64
define MAX_THREAD_LIMIT 20000
[/code]


  这两行对应着ThreadsPerChild和ThreadLimit的限制数。最好在configure之前就把64改成所希望的值。注意,不要把这两个值设得太高,超过系统的处理能力,从而因Apache不起动使系统很不稳定。

  Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild值决定的,应该大于等于MaxClients。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认最大的子进程总数是16,加大时也需要显式声明ServerLimit(最大值是20000)。这两个值位于源码树server/mpm/worker/worker.c中的以下两行:

[code]
define DEFAULT_SERVER_LIMIT 16
define MAX_SERVER_LIMIT 20000
[/code]


  需要注意的是,如果显式声明了ServerLimit,那么它乘以ThreadsPerChild的值必须大于等于MaxClients,而且MaxClients必须是ThreadsPerChild的整数倍,否则Apache将会自动调节到一个相应值(可能是个非期望值)。下面是笔者的worker配置段:

[code]
<IfModule worker.c> StartServers 3 MaxClients 2000 ServerLimit 25 MinSpareThreads 50 MaxSpareThreads 200 ThreadLimit 200 ThreadsPerChild 100 MaxRequestsPerChild 0 </IfModule>
[/code]

 

  通过上面的叙述,可以了解到Apache 2.0中prefork和worker这两个重要MPM的工作原理,并可根据实际情况来配置Apache相关的核心参数,以获得最大的性能和稳定性。

Tags: mpm, prefork, worker

表单过期的处理

在开发过程中,经常会出现表单出错而返回页面的时候填写的信息全部丢失的情况,为了支持页面回跳,可以通过以下两种方法实现。

 

[code]
1.使用header头设置缓存控制头Cache-control。
header('Cache-control: private, must-revalidate');
//支持页面回跳

2.使用session_cache_limiter方法。
session_cache_limiter('private, must-revalidate'); //要写在session_start方法之前
下面的代码片断可以防止用户填写表单的时候,单击“提交”按钮返回时,刚刚在表单上填写的内容不会被清除:
session_cache_limiter('nocache');
session_cache_limiter('private');
session_cache_limiter('public');
session_start();
//以下是表单内容,这样在用户返回该表单时,已经填写的内容不会被清空
将该段代码贴到所要应用的脚本顶部即可。
Cache-Control消息头域说明Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。
请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh和only-if-cached,响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate和max-age。各个消息中的指令含义如表5-3所示。
表5-3


缓存指令
 说 明
 
public 指示响应可被任何缓存区缓存
private 指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效
no-cache 指示请求或响应消息不能缓存
no-store 用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存
max-age 指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应
min-fresh 指示客户机可以接收响应时间小于当前时间加上指定时间的响应
max-stale 指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息
 
 [/code]

 

Tags: 表单过期