EEDU Blog: 博客 ·  资讯 ·  论坛 ·  留言
登录 新用户? 注册   |  

ahaoxie's blog

订阅博客:

环境生态网站长

小窍门

Configuring Backup & Migrate Module on IIS

 Configuring Backup & Migrate Module on IIS and the following error show:
  • Security notice: Backup and Migrate will not save backup files to the server because the destination directory is publicly accessible. If you want to save files to the server, please secure the 'sites/default/files/backup_migrate/manual' directory
  • Could not run backup because the file could not be saved to the destination.

It turns out the solution is quite simple if you have the right directions!

In IIS6 / Windows Server 2003?
1. Open IIS Manager
2. Navigate to the sites/default/files directory
3. Right click on the backup_migrate directory and select "Properties"
4. In the box with all the checkboxes, uncheck "Read"
5. Click "Apply", then "OK"

For IIS7 / Windows Server 2008
1. Open Windows Explorer
2. Navigate to the sites/default/files directory or where you've configured your backups to be stored.
3. Right click on the backup_migrate/manual directory and select properties. Select the security tab then advance button.
4. Add / modify the user IUSR click Deny for "List folder contents"
5. Click "Apply", then "OK"

http://groups.drupal.org/node/74893

发表于: 2012-09-21 04:39 | 全文(查看: 356) | 评论(1) | 本文地址 | 收藏 
分类: 小窍门(95)   标签: drupal  新知  

如何让drupal承受更大的负载量跑得更快

drupal是比较耗资源的cpu占用率,内存使用量, 和脚本执行时间都不乐观,主要是
1) drupal会加载所有的开启的了的模块的module文件,加载很多的inc文件,还有tpl.php文件,以block为例, 如果你一个页有20个block,那么就有20次include('block.tpl.php'), 一个比较复杂的页面,可能光加载tpl文件就多达七八十次,结果就是不断的读硬盘呀读硬盘。
2) drupal有很多的static变量,而且有的static变量占着相当大的内存, 这些static变量加上载入的文件, 结果就是很多人碰到的,你得将php.ini中的memory_limit设到128M以上甚至更大。
3) drupal的theme与数据高度分离,在一定程度增加了cpu的占用率, 以theme_item_list 和 theme_table为例, 为获得item_list和table的rows的数据,你得执行一次foreach()或者while()将内容放到数组里,然后将数组传给theme 函数, 然后theme里边又执行一次循环来输出数据。
4) drupal的一些函数需要不停的查询数据库. 比如l()和t(), 一个页面执行到输出,查询数据库几百次。
5)drupal 灵活的hook机制,也导致一些资源的浪费. 一个很简单的页面输出,如果没有开启缓存,那么就可能会针对一系列的hook各循环一次module_list()来检查是否实现了这个hook, 有的话则执行这些hook function. 如果你开启了80-100个模块(很正常, 因为模块丰富又不用钱买), 如果某个页面要检查15种hook或者35钟, 那么你可以计算循环多少行。
6) 使用了一些效率较低的模块。

针对以上问题,drupal社区中已经有了一些对策:
1) 给module等文件减肥,drupal7好像有实现了function registry, 社区中有讨论,没有去看过代码。 针对drupal6.x, 比较简单的做法是:

function do_something($arg)
{
// 所有的代码在这里
}

可以替换为:

function do_something($arg)
{
include_once dirname(__FILE__).'/do_something.inc.php';
return _real_do_something($arg);
}
2) 检查哪些文件不是必须加载的,或者哪些函数是不一定每次都得加载的,将它驳离出去。同时减少页面复杂程度。以hook_init为例, drupal模块的作者,很多喜欢将加载js, css 文件写在hook_init 中,结果就是无论你访问什么页面,这些不相关的js, css文件都被加载。实际上很多情况下hook_init并不是必要的。你完全可以去掉hook_init, 而将drupal_add_js, drupal_add_css放到hook_view之中,或者到少要加个if(....) drupal_add_js, 这样,你的module文件中就可能少一个函数的代码或者访问者会因为无需加载无用的文件页少等一两秒。
3) 使用theme输出时,如果数据较大,而未来又不太可能会改变显示方式的话,不妨直接硬编码html而不用再调用一次theme函数。如:
$output = '<ul class="ab">';
while(....){
$output .='<li class="abc">'. $something .'</li>';
//... 省略八百行
}
return $output;
而不是写成
$output = array();
while(....){
$output[] =$something;
//... 还有八百行
}
return theme('item_list', $output);
这两者的效率是谁更优是明显的。即使是节省了50ms也值得。因为你要执行的是成千上万个函数才能输出一个页面,因此在任何可能的地方节约几十毫秒,汇总起来可能就有两三秒, 对于访客而言, 10秒与7秒是完全不同的体验。
4) 针对dupal过多查询数据库的情况, 一可以启用缓存,二可以给drupal的某些函数加个补丁,比如l()要调用到的drupal_lookup_path()就可以通过一个url白名单的 补丁减少它对数据库的别名查询, 原理是, 查询url_alias得出一个url_alias表中当前所有src列的唯一开头段的集合, 无非是node, user, taxonomy这几个,将它缓存起来,在drupal_lookup_path中,只有传入的链接是这些词开头的才查询数据库,这样一来,对于一个链接 较多的页面,可以节省两三百次查询。
5)尽量只开启必需的模块,可用可不用的模块坚决不用。可能的话自己写一个模块,然后将自己需要的一些功能从其它模块中取出来,合并到自己的模块中,以减少资源浪费,对于drupal使用者来说,为一个小小的功能而启用一个庞大的模块是常见的事。
6)检查使用的模块进行一些效率优化。比如对模块中常用到的数据加入缓存机制,将某些费了大力气才获得的数据,缓存起来,以便以后省些劲。
7)实现早期页面缓存内容直接输出, fastpath_fscache这个模块可以实现这一点。
8)drupal载入大量的文件, 在php.ini中开启
realpath_cache_size=512k
realpath_cache_ttl=36000
可大大加快文件加载速度。
9) 安装eaccelerator可以加速至原来的数倍。
10)安装 zendOptimizer也有一定帮助。
11)用memcache或eaccelerator将缓存保存在内存中,前提是内存要足够大。(转)

发表于: 2012-09-20 03:19 | 全文(查看: 335) | 评论(0) | 本文地址 | 收藏 
分类: 小窍门(95)   标签: drupal  新知  

IIS7.5下常见程序通过web.config实现伪静态

新建一个以web.config命名的文件内容为
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
<!---将下面的规则添加到这里--->

    </system.webServer>  
</configuration>

规则示例,选择需要的规则添加:
<!---shopex--->
<rewrite>
            <rules>
                <rule name="disableDownloadThemeHtml">
                    <match url="^themes/.*.(html|xml)$" ignoreCase="false" />
                    <action type="CustomResponse" url="/" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
                </rule>
                <rule name="urlRewrite">
                    <match url="^(.*)$" ignoreCase="false" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{REQUEST_FILENAME}" pattern=".(html|xml|json|htm|php|php2|php3|php4|php5|phtml|pwml|inc|asp|aspx|ascx|jsp|cfm|cfc|pl|cgi|shtml|shtm|phtm)$" ignoreCase="false" />
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" pattern="" ignoreCase="false" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" pattern="" ignoreCase="false" />
                    </conditions>
                    <action type="Rewrite" url="index.php?{R:1}" appendQueryString="false" />
                </rule>
            </rules>
        </rewrite>

<!---dz2.0--->
<rewrite>
 <rules>
  <rule name="portal_topic">
   <match url="^(.*/)*topic-(.+).html\?*(.*)$" />
   <action type="Rewrite" url="{R:1}/portal.php\?mod=topic&amp;topic={R:2}&amp;{R:3}" />
  </rule>
  <rule name="portal_article">
   <match url="^(.*/)*article-([0-9]+)-([0-9]+).html\?*(.*)$" />
   <action type="Rewrite" url="{R:1}/portal.php\?mod=view&amp;aid={R:2}&amp;page={R:3}&amp;{R:4}" />
  </rule>
  <rule name="forum_forumdisplay">
   <match url="^(.*/)*forum-(\w+)-([0-9]+).html\?*(.*)$" />
   <action type="Rewrite" url="{R:1}/forum.php\?mod=forumdisplay&amp;fid={R:2}&amp;page={R:3}&amp;{R:4}" />
  </rule>
  <rule name="forum_viewthread">
   <match url="^(.*/)*thread-([0-9]+)-([0-9]+)-([0-9]+).html\?*(.*)$" />
   <action type="Rewrite" url="{R:1}/forum.php\?mod=viewthread&amp;tid={R:2}&amp;extra=page%3D{R:4}&amp;page={R:3}&amp;{R:5}" />
  </rule>
  <rule name="group_group">
   <match url="^(.*/)*group-([0-9]+)-([0-9]+).html\?*(.*)$" />
   <action type="Rewrite" url="{R:1}/forum.php\?mod=group&amp;fid={R:2}&amp;page={R:3}&amp;{R:4}" />
  </rule>
  <rule name="home_space">
   <match url="^(.*/)*space-(username|uid)-(.+).html\?*(.*)$" />
   <action type="Rewrite" url="{R:1}/home.php\?mod=space&amp;{R:2}={R:3}&amp;{R:4}" />
  </rule>
  <rule name="home_blog">
   <match url="^(.*/)*blog-([0-9]+)-([0-9]+).html\?*(.*)$" />
   <action type="Rewrite" url="{R:1}/home.php\?mod=space&amp;uid={R:2}&amp;do=blog&amp;id={R:3}&amp;{R:4}" />
  </rule>
  <rule name="forum_archiver">
   <match url="^(.*/)*(fid|tid)-([0-9]+).html\?*(.*)$" />
   <action type="Rewrite" url="{R:1}/index.php\?action={R:2}&amp;value={R:3}&amp;{R:4}" />
  </rule>
 </rules>
</rewrite>

<!---dz2.5--->
<rewrite>
 <rules>
  <rule name="portal_topic">
   <match url="^(.*/)*topic-(.+).html\?*(.*)$" />
   <action type="Rewrite" url="{R:1}/portal.php\?mod=topic&amp;topic={R:2}&amp;{R:3}" />
  </rule>
  <rule name="portal_article">
   <match url="^(.*/)*article-([0-9]+)-([0-9]+).html\?*(.*)$" />
   <action type="Rewrite" url="{R:1}/portal.php\?mod=view&amp;aid={R:2}&amp;page={R:3}&amp;{R:4}" />
  </rule>
  <rule name="forum_forumdisplay">
   <match url="^(.*/)*forum-(\w+)-([0-9]+).html\?*(.*)$" />
   <action type="Rewrite" url="{R:1}/forum.php\?mod=forumdisplay&amp;fid={R:2}&amp;page={R:3}&amp;{R:4}" />
  </rule>
  <rule name="forum_viewthread">
   <match url="^(.*/)*thread-([0-9]+)-([0-9]+)-([0-9]+).html\?*(.*)$" />
   <action type="Rewrite" url="{R:1}/forum.php\?mod=viewthread&amp;tid={R:2}&amp;extra=page%3D{R:4}&amp;page={R:3}&amp;{R:5}" />
  </rule>
  <rule name="group_group">
   <match url="^(.*/)*group-([0-9]+)-([0-9]+).html\?*(.*)$" />
   <action type="Rewrite" url="{R:1}/forum.php\?mod=group&amp;fid={R:2}&amp;page={R:3}&amp;{R:4}" />
  </rule>
  <rule name="home_space">
   <match url="^(.*/)*space-(username|uid)-(.+).html\?*(.*)$" />
   <action type="Rewrite" url="{R:1}/home.php\?mod=space&amp;{R:2}={R:3}&amp;{R:4}" />
  </rule>
  <rule name="home_blog">
   <match url="^(.*/)*blog-([0-9]+)-([0-9]+).html\?*(.*)$" />
   <action type="Rewrite" url="{R:1}/home.php\?mod=space&amp;uid={R:2}&amp;do=blog&amp;id={R:3}&amp;{R:4}" />
  </rule>
  <rule name="forum_archiver">
   <match url="^(.*/)*(fid|tid)-([0-9]+).html\?*(.*)$" />
   <action type="Rewrite" url="{R:1}/index.php\?action={R:2}&amp;value={R:3}&amp;{R:4}" />
  </rule>
  <rule name="plugin">
   <match url="^(.*/)*([a-z]+[a-z0-9_]*)-([a-z0-9_\-]+).html\?*(.*)$" />
   <action type="Rewrite" url="{R:1}/plugin.php\?id={R:2}:{R:3}&amp;{R:4}" />
  </rule>
 </rules>
</rewrite>
发表于: 2012-09-19 06:36 | 全文(查看: 75) | 评论(0) | 本文地址 | 收藏 
分类: 小窍门(95)   标签: IIS  rewrite新知  

aspnet_isapi.dll '检测到死锁' 解决方法

创建一个批处理文件,在一个工作进程被孤立时执行
1. 启动记事本。
2. 将下面的代码粘贴到记事本中:


@if "%_echo%"=="" echo off
setlocal
    set TIMESTAMP=%DATE:~-9%_%TIME%
set TIMESTAMP=%TIMESTAMP:/=_%
set TIMESTAMP=%TIMESTAMP::=_%
set TIMESTAMP=%TIMESTAMP:.=_%
set TIMESTAMP=%TIMESTAMP: =_%
set FILENAME=c:\crash_%TIMESTAMP%.dmp
set LOG=c:\log.txt
set COMMAND=c:\debuggers\cdb.exe -c ".dump /o /mhf %FILENAME%;q" -p %1

echo %COMMAND% > %LOG%
%COMMAND%

endlocal

3. 将文件保存为文件名.cmd。在这个例子中,我们将文件命名为 action.cmd。但是,您也可以随意给文件起别的名字。

 

配置孤立工作进程设置
1. 在命令提示符处键入以下命令,然后按 Enter:
cd \Inetpub\adminscripts
2. 要使孤立工作进程的功能可用,需要在命令提示符下键入以下命令:adsutil.vbs SET W3SVC/AppPools/DefaultAppPool/OrphanWorkerProcess TRUE


3. 在命令提示符下,设置当进程预定要回收时运行的可执行文件。例如,在这种情况下使用在“创建一个批处理文件,在一个工作进程被孤立时执行”一节创建的批处理文件:adsutil.vbs SET W3SVC/AppPools/DefaultAppPool/OrphanActionExe "c:\action.cmd"
adsutil.vbs SET W3SVC/AppPools/DefaultAppPool/OrphanActionParams "%%1%%"

发表于: 2012-09-14 17:10 | 全文(查看: 293) | 评论(0) | 本文地址 | 收藏 
分类: 小窍门(95)   标签: aspnet  新知  

localhost与127.0.0.1的区别

localhost与127.0.0.1的区别是什么?相信有人会说是本地ip,曾有人说,用127.0.0.1比localhost好,可以减少一次解析。看来这个入门问题还有人不清楚,其实这两者是有区别的。

no1:

localhost也叫local ,正确的解释是:本地服务器
127.0.0.1在windows等系统的正确解释是:本机地址(本机服务器)

no2:

localhot(local)是不经网卡传输!这点很重要,它不受网络防火墙和网卡相关的的限制。

127.0.0.1是通过网卡传输,依赖网卡,并受到网络防火墙和网卡相关的限制。

 

一般设置程序时本地服务用localhost是最好的,localhost不会解析成ip,也不会占用网卡、网络资源。

有时候用localhost可以,但用127.0.0.1就不可以的情况就是在于此。猜想localhost访问时,系统带的本机当前用户的权限去访问,而用ip的时候,等于本机是通过网络再去访问本机,可能涉及到网络用户的权限。

 

他家之言:

1. mysql -h 127.0.0.1 的时候,使用TCP/IP连接,
mysql server 认为该连接来自于127.0.0.1或者是"localhost.localdomain"

 

2. mysql -h localhost 的时候,是不使用TCP/IP连接的,而使用Unix socket;
此时,mysql server则认为该client是来自"localhost"

 

3. mysql权限管理中的"localhost"有特定含义:
—— MySQL手册 5.6.4 ..... A Host value may be a hostname or an IP number, or 'localhost' to indicate the local host.

 

注意:虽然两者连接方式有区别,但当localhost 为默认的127.0.0.1时,两种连接方式使用的权限记录都是以下的1.row的记录(因为记录在前,先被匹配)

*************************** 1. row ***************************
                 Host: localhost
                 User: root
......

*************************** 2. row ***************************
                 Host: 127.0.0.1
                 User: root

 

证明:


shell> mysql -h 127.0.0.1
mysql> status;

Current user:           root@127.0.0.1

SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.1.33-log Source distribution
Protocol version:       10
Connection:          127.0.0.1 via TCP/IP


shell> mysql -h locahost
mysql> status;

Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.1.33-log Source distribution
Protocol version:       10
Connection:          Localhost via UNIX socket

 

shell> mysql -h XXXX(ip)

mysql> status;

Current user:           root@ip

SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.1.33-log Source distribution
Protocol version:       10
Connection:          XXXX(ip) via TCP/IP

发表于: 2012-09-10 09:30 | 全文(查看: 158) | 评论(0) | 本文地址 | 收藏 
分类: 小窍门(95)   标签: mysql  新知  

定时重启MS SQL 2000 释放内存

1,在属性->>>内存选项里,根据服务器的配置,设置一个合适的内存限制值。

2,写一个如下的bat文件,加入任务计划,定时重启MS SQL以释放内存:

net stop sqlserveragent
net stop mssqlserver
net start mssqlserver
net start sqlserveragent

发表于: 2012-09-02 11:45 | 全文(查看: 82) | 评论(0) | 本文地址 | 收藏 
分类: 小窍门(95)   标签: 内存  新知  

windows2008 R2 显示桌面图标

Q:新安装完windows2008 R2 桌面只有回收站图标,怎么显示更多的系统图标呢?

A:点击开始、在搜索程序和文件里输入 icon 选择  “显示或隐藏桌面上的通用图标”  就可以看到需要设置的选项了。
发表于: 2012-08-27 11:57 | 全文(查看: 95) | 评论(0) | 本文地址 | 收藏 
分类: 小窍门(95)   标签: 图标  新知  

windows平台下提升php性能的方法

  PHP一直以来是windows平台的尴尬,用PHP扩展的速度跟不上其它服务端(甚至还有一些致命问题例如在某内存地址报错),而PHP又比ASP.net普及得多,微软终于重视了,采取了一系列措施。比如windows2008集成的IIS7对PHP的支持已经大幅提高。

1.如果你没有用IIS,仅仅用的是windows

.Windows Cache Extension for PHP可以用。
地址:http://www.iis.net/extensions/WinCacheForPHP
这是用来提高PHP应用跑在Windows系统上的速度的PHP加速器。任何PHP应用程序不需要修改任何代码都可以用它来提速,所需做的只是在PHP引擎里启用这个扩展。

按照"Using Windows Cache Extension for PHP"文章里的指示来安装、启用和配置这个扩展。

注意:

  • 该扩展只能用于PHP的non-thread-safe版本
  • 该扩展只能用于以FastCGI方式运行在IIS上的PHP
  • Windows Cache Extension 1.0 for PHP 5.3只能用于PHP5.3的x86 VC9版本

特性:

  • 支持PHP 5.2和PHP 5.3
  • 提供PHP函数获得cache状态信息


该扩展包含3个可以被分别启用或禁用的缓存特性:

  • PHP opcode cache - PHP是一个脚本处理引擎,它阅读包含文本和/或PHP指令的输入流,并产生另一个数据流(通常是HTML格式)。这意味着在一个web服务器上PHP引擎对每一次来自浏览器客户端的请求都要读入、解析、编译和执行一遍PHP脚本。读入、解析和编译操作给web服务器的CPU和文件系统带来额外的负载,影响PHP网页应用的总体效能。PHP opcode (字节码) cache 用来在共享内存里缓存编译好的脚本字节码,以便同一脚本文件的后续请求可以被PHP引擎重用。
  • File cache - 即使PHP字节码缓存启用,PHP引擎还需要访问文件系统里的脚本文件。当PHP脚本存储在远程UNC文件共享时,文件操作会带来显著的性能开销。Windows Cache Extension for PHP的文件缓存可以把PHP脚本文件的内容缓存在共享内存里,减少PHP引擎的文件系统操作。
  • Relative file path cache - PHP脚本频繁使用相对路径include或操作文件。每个相对文件路径需要被PHP引擎转换成绝对文件路径。当PHP应用以相对路径使用很多PHP文件时,解析相对路径到绝对路径的操作会影响性能。Windows Cache Extension for PHP提供相对文件路径缓存,减少PHP引擎需要进行的转换数量。

2.如果你用的是wind2003的IIS6
那么,你有FastCGI for IIS 6这个可以用。
地址:http://www.iis.net/extensions/FastCGI

不用看,就是开启类似Apache支持的FastCGI模式,提高访问速度。

下面还从网上找到其他办法,供参考:

代码优化

  在这里并不想再次告诉你怎么写更干净的代码,这一点我想每个人都清晰,在需要速度的时候,你可能已在PHP原始码的优化上面做了不少的工作,这里所提出的是,这个烦琐的工作能交由其他工具来完成。这就是Zend Optimizer,此程式能从Zend Technologies的网站(http://www.zend.com/)免费得到。他的原理非常简单,通过检测Zend引擎产生的中间代码,并且优化他来得到更高的执行速度。我认为优化代码是一项颇烦琐的工作,而且优化后的代码可能变得难以理解,尤其是当你放下该PHP程式一段时间后,忽然间客户需求你做一些修改时,可能你自己也不懂了;-)。因此我建议你在PHP的原始码较为复杂的时候,用Zend Optimizer来做这个优化的工作,好处是他不会令你的代码变得复杂难懂。

  安装Zend Optimizer是非常简单的。只要根据你使用的平台,下载相关的预编译库,并且在你的php.ini中加入两行,重新启动你的web服务器就行了!

zend_optimizer.optimization_level=15
zend_extension="/path/to/ZendOptimizer.so"
zend_loader.enable=Off

  你可能有点奇怪,不是说两行吗,怎么变成三行了。不过第三行是可选的,看来禁止这个zend_loader将会令优化的速度更快,因此不妨在你的php.ini文件中多加这一行。要注意的是:只有在你不使用Zend Encoder Runtime的时候,才能禁止zend_loader,关于Zend Encoder Runtime,还会在下文提到。

要更快吗?使用cache(缓冲)吧

  如果你的PHP应用还需要更快的速度,下一个办法是缓冲。要实现这一点,有几种不同的方式。我自己就试用过Zend Cache(评测版本),APC和Afterburner Cache。

  以上提到的都是“缓冲模块”。他们的原理都差不多,在php文件被首次请求的时候,通过将你的PHP原始码的中间代码存储在web服务器的内存中,对于以后同样的请求,都直接提供内存中的“编译”版本。由于他能令磁盘的访问达到最小化,因此这个方法确实能极大地提高PHP的性能。更为方便的是,当你的PHP原始码修改时,缓冲的模块能察觉到这些变化,并且重新载入相同,因此你不必担心客户得到的是旧版本的程式。这些缓冲的模块确实不错,不过我应该选用哪一种呢?下面分别介绍一下:

  Zend Cache是Zend Technologies的一个商业化的产品(他也是免费为我们提供PHP引擎和Zend Optimizer的公司)。他确实不错。在首次运行后,你能明显察觉到PHP的速度得到了非常大的提高,服务器的空闲资源也更多了。缺点是你要付费购买他,但就性价比来说,还是非常值得的。

  Afterburner Cache是Bware Technologies(http://bwcache.bware.it/)提供的免费缓冲模块。当前还只是beta版,他所做的工作看来和Zend Cache差不多,不过性能的提高就比不上Zend Cache,而且现有的版本不能和Zend Optimizer一起工作,不过他是免费的。

  APC(Alternative PHP Cache)是由Community Connect(http://apc.communityconnect.com/)提供的另一个免费模块。他的工作非常稳定,速度也有不少的提高,要注意的是,我还没有找到一个官方的测试数据,这些只是在我的应用上作测试,因此不能下一个结论。

Web内容的压缩(令你客户用起来更“爽”)

  经过以上两个的方法,相信你的PHP应用的性能已得到了非常大的提高,目前该从另一个方面来考虑了:下载速度。如果你的应用只是在公司内跑,所有的客户都使用100Mb/s的以太网连接到服务器,这可能不是个问题,不过如果你的客户中有使用慢速的modem连接的,你就要考虑使用内容压缩这个方法了。根据IETF的规范,大多数的浏览器都支持gzip的内容压缩。这意味着你在将web的内容发给客户的浏览器前,能先使用gzip进行压缩,浏览器在接收的时候就会自动解压数据,并且令用户看到原来的页面。同样,压缩web页面的内容也有几个不同的方法。

  mod_gzip是Remote Communications(http://www.phpbuilder.com/columns/www.remotecommunications.com)免费提供的一个Apache模块,他能压缩静态的web页面。他工作得非常好,你只需要将他和apache一起编译就行了(或将他作为一个DSO使用)。Remotecommunications的人说他还能压缩动态的内容,包括mod_php, mod_perl等。不过我尝试了一下,看来并不行。我在mod_gzip的邮件列表中了解到,这个bug将在下一个版本中修正(我想应该是1.3.14.6f版本)。不过你仍然能用他作静态内容的压缩。

  不过我们还想压缩动态的内容,因此我们必须找另外的办法。一个办法是使用class.gzip encode.php(http://leknor.com/code/),只要在你的PHP脚本中的开头和结尾调用这个PHP类,就能压缩你的页面内容。如果整个站点都需要这样的压缩,你能在你的php.ini文件中的auto_prepend和auto_append中调用这些函数。他工作得非常好,不过在负载非常重的站点上,他明显会带来一点的系统开销。要周详了解他是怎么工作的,能看一下他的类代码(你至少需要在编译PHP时加入zlib支持)。作者在里面的说明也非常周详,你能得到所有需要了解的东西。

  在最近,我也看到了一篇关于PHP输出缓冲的文章。他说的是PHP4.0.4推出了一种新的输出缓冲的处理手段--ob_gzhandler,他的作用和上面介绍的类相同,但差别是你只要在你的php.ini中使用以下的句法就行了:

output_handler = ob_gzhandler;

  这样将激活PHP的输出缓冲功能,并且压缩所有他发送的东西。出于某些特别的原因,如果你不想在这里设置的话,只在需要的地方才改动这个默认设置的话(不压缩),只要在需要压缩的PHP源码目录中,修改一下.htaccess文件就行了,使用的句法如下:

php_values output_handler ob_gzhandler

  或直接在你的PHP代码中调用他,以下面的方式:

ob_start("ob_gzhandler");

  这个输出缓冲处理的方法非常好,并且不会为服务器带来额外的系统开销。我十分建议你使用这种方法。他的改动能用以下的例子说明,如果客户使用的是28.8K的modem的话,经过这个处理,他将会认为忽然间换成了一个ISDN接入相同。要注意的一点是:Netscape Communicator并不支持图象的压缩,所以将显示不出来。因此除非你的客户全部使用Internet Explorer,否则你必须禁止压缩jpeg和gif图象。其他文件的压缩应该没有问题,不过我建议你最佳测试一下,特别是浏览器使用了不常见的插件或是少人用的浏览器。

其他有用的东西

  Zend Technologies的在线商店在今年1月24开通了,并且售卖一些和PHP相关的有趣产品。包括前面提到的Zend Cache,Zend Encoder(简单说来,是PHP代码的编译器,能产生编译的类,这样你就能售卖给顾客而不用担心泄露原始码。在需要运行这些类的web服务器上,将要使用Zend Encoder Runtime来解码),Zend Ide(一个为PHP而设的集成化研发环境,带有非常多强大的性能),更有为PHP研发者提供的支持服务。

结论

  使用这篇文章提到的技术,你将能极大地提高站点的性能,不过请注意以下几点:

瓶颈或许不在PHP,你需要考察应用中的每个对象(例如数据库)
一个web服务器的性能都是有限制的,因此,不要认为性能不好就是PHP的原因,也可能是访问量非常大,你的服务器需要升级了,或考虑使用负载均衡的系统(将会花非常多钱)
不要认为内容压缩不重要,在100Mb/s的局域网中,你的PHP应用或许性能非常好,但要考虑到使用慢速modem的用户。

发表于: 2012-08-27 11:38 | 全文(查看: 279) | 评论(0) | 本文地址 | 收藏 
分类: 小窍门(95)   标签: php  性能  新知  

解决SQL2005在 sys.servers 中找不到服务器的办法

错误:Microsoft OLE DB Provider for SQL Server 错误 '80004005' 在 sys.servers 中找不到服务器 'SUNMAY2008\SQLEXPRESS'。请验证指定的服务器名称是否正确。如果需要,请执行存储过程 sp_addlinkedserver 以将服务器添加到 sys.servers。

解决方法:出现这个错误一般是因为改动了服务器的计算机名.所以出现找不到服务器名的错误.出现这个错误可以通过重新添加服务器名来解决.

在查询分析器中执行下列语句

select * from sys.servers         (查看系统表,看原来的服务器名)

sp_dropserver '原来的服务器名'    (删除原来的服务器名)
sp_addserver '现在的服务器名'      (添加现在的服务器名)
sp_serveroption '现在的服务器名','data access', 'true' (设定 SQL Server 选项,使其允许加入linked server)

实例:

解决方法:

打开SQL Server Management Studio,新建查询:

select * from sys.servers  

GO

//这里可得到原来的计算机名称。然后将其记录下来(复制即可)

新建查询:

sp_dropserver [user-HHFVUAHFUAHSF]

GO

//这里是将原来的名称删除。

新建查询:

sp_addserver [WEBSITE],local

GO

//这里是新建服务器名称

新建查询:

sp_serveroption 'WEBSITE','data access', 'true'

GO

重启服务器就完成了。

注意必须重启服务器!

发表于: 2012-08-22 23:06 | 全文(查看: 296) | 评论(0) | 本文地址 | 收藏 
分类: 小窍门(95)   标签: sql  新知  

Java heap space 解决方法

 因为程序要从数据读取近10W行记录处理,当读到9W的时候就出现 java.lang.OutOfMemoryError: Java heap space 这样的错误。
在网上一查可能是JAVA的堆栈设置太小的原因。

跟据网上的答案大致有这两种解决方法:

1、设置环境变量
 set JAVA_OPTS= -Xms32m -Xmx512m
可以根据自己机器的内存进行更改,但本人测试这种方法并没有解决问题。可能是还有哪里需要设置。

2、java -Xms32m -Xmx800m className
就是在执行JAVA类文件时加上这个参数,其中className是需要执行的确类名。(包括包名)
这个解决问题了。而且执行的速度比没有设置的时候快很多。

如果在测试的时候可能会用Eclispe 这时候就需要在Eclipse ->run -arguments 中的VM arguments 中输入-Xms32m -Xmx800m这个参数就可以了。
发表于: 2012-08-16 05:11 | 全文(查看: 258) | 评论(1) | 本文地址 | 收藏 
分类: 小窍门(95)   标签: java  新知  
Page was generated in 15 milliseconds