请求资源正在使用中

昨天上海服务器中了arp病毒了,没有办法,机房非得让重新做系统不可了,真郁闷呀,上次做了系统以后,正正好好才一个星期,今天又要做,客户非得气死不可了.

重新开通iis后,发现asp文件无法运行.显示HTTP500错误,把服务器里的IE选项里的”显示友好HTTP错误信息“取消,再浏览,请求的资源在使用中。”,真晕了,看了其它配置都没有问题的,后来才百度一百度了一下,找了下面的解决办法.

    后来仔细看了看,发现:只要打开单机版杀毒的脚本监控IIS6.0就会不正常。这就说明这可能和脚本的出错有关。运行regsvr32 jscript.dll(命令功能:修复Java动态链接库) 和 regsvr32 vbscript.dll(命令功能:修复VB动态链接库) 重新注册JAVA脚本和VB脚本的动态链接库后一切正常。

方法一:可能和脚本的出错有关,运行regsvr32 jscript.dll和 regsvr32 vbscript.dll重新注册JAVA脚本和VB脚本的动态链接库
方法二:在IIS中删除原来的网站,再删除原来的应用池。然后重新建应用池,重新建网站。就解决了。

出现这个情况,可能是装了杀毒软件macfee的原因的.

Smarty实例 – 使用ADODB连接数据库

今天就先来说说ADODB.说到ADODB,可能做过ASP的都知道WINDOWS平台的ADO组件,但我们这里的ADODB不是微软的那个数据库操作组件,而是由php语言写的一套数据库操作类库,先让我们来看看它倒底有什么样的优点.
1. 以标准的SQL语句书写的数据库执行代码在进行数据库移植时不用更改源程序,也就是说它可以支持多种数据库,包括ACCESS.

2. 提供与微软ADODB相似的语法功能.这一点对于从ASP转行到PHP的人们是一大福音,它的很多操作都与WINDOWS中的ADODB相似.

3. 可以生成Smarty循环需要的二维数组,这样会简化smarty开发.这一点是等会我给大家演示.
4. 支持数据库的缓存查询,最大可能的提高查询数据库的速度。
5. 其它的实用功能.
虽然说优点很多,但是由于这个类库非常的庞大,光它的主执行类就107K,所以如果大家考虑执行效率的话就要认真想想了.不过说实话,它的功能还是很强大的,有很多的很实用的功能,使用它的这些功能,可以非常方便的实现我们想要的功能.所以对于那些老板没有特殊要求时大家不防用用它.
一、如何得到ADODB? 它的运行环境是什么?
从http://sourceforge.net/project/show…簆hp4.0.5以上。
二、如何安装ADODB?
解压下载回的压缩文件,注意:大家下载回来的格式为ADODB.tar.gz,这是linux的压缩格式,在windows下大家可以使用winrar对其进行解压,解压完成后将目录拷贝到指定的目录的adodb目录下,像我在例子中将它拷贝到了/comm/adodb/中。
三、如何调用ADODB?
使用include_once (“./comm/adodb/adodb.inc.php”);这行就不用说了吧?包含ADODB的主文件。
四、如何使用ADODB?
1.进行初始化:
ADODB采用$conn = ADONewConnection();这样的语句进行初始化,对ADODB进行初始化有两种方式:
第一种方式为:传统方式。我暂时称它为这个名称。它使用的建立一个新连接的方式很像php中的标准连接方式:
$conn = new ADONewConnection($dbDriver);
$conn->Connect($host, $user, $passwd, $db);
简单吧?如果使用过phplib中的db类应该对它很熟悉的。

第二种方式:采用dsn方式,这样是将数据库的连接语句写成一条语句来进行初始化,dsn的写法有为:$dsn = “DBType://User:Passwd@Host/DBName”; 其中DBType表示数据库类型,User表示用户名,Passwd为密码,Host为服务器名,DBName为数据库名,像这样我使用oracle数据库,用户名:oracleUser,密码为oraclePasswd,数据库服务器为localhost, 数据库为oradb的dsn这样写:
$dsn = “oracle://oracleUserraclePasswd@localhost/oradb”;
$conn = new ADONewConnection($dsn);
这种方式可能从ASP转行来的程序员会更感兴趣。

这两种方式都可以使用,要看个人习惯来选用了.

2. 相关的概念:
使用ADODB有两个基本的类,一是是ADOConnection类,另一个是ADORecordSet类,使用过ASP的人看到这两个类会明白它的含义,ADOConnection指的是数据库连接的类,而ADORecordSet指的是由ADOConnection执行查询语句返回的数据集类,相关的资料大家可以查询ADODB类的手册。

3.基本的函数:

关于ADOConnection类的相关方法有:
1.Connect:数据库连接方法,上边我们介绍过的。对于mysql还有PConnect,与PHP语言中的用法一样
2.Execute($sql):执行查询语句结果返回一个ADORecordSet类。
3.GetOne($sql):返回第一行的第一个字段
4.GetAll($sql):返回所有的数据。这个函数可是大有用处,记得不记的我在以前的教程中写关于新闻列表的输入时要将需要在页面显示的

新闻列表做成一个二维数组?就是这样的语句:
=====================================================================================
while($db->next_record())
{
$array[] = array(“NewsID” => $db->f(“iNewsID”),
“NewsTitle” => csubstr($db->f(“vcNewsTitle”), 0, 20));
}
=====================================================================================
这一行是什么意思呢?就是将要显示的新闻例表生成
$array[0] = array(“NewsID”=>1, “NewsTitle”=>”这里新闻的第一条”);
$array[1] = array(“NewsID”=>2, “NewsTitle”=>”这里新闻的第二条”);

这样的形式,但如果我们不需要对标题进行控制,在ADODB中我们就有福了,我们可以这样写:
==================================================================================
$strQuery = “select iNews, vcNewsTitle from tb_news_ch”;
$array = &$conn->GetAll($strQuery);//注意这条语句
$smarty->assign(“News_CH”, $array);
unset($array);
==================================================================================
当然,这里的$conn应该进行初始化过了,不知大家看明白了没有?原来我要手工创建的二维数据在这里直接使用GetAll就行了!!!这也是为什么有人会说ADODB+Smarty是无敌组合的原因之一了…
4.SelectLimit($sql, $numrows=-1, $offset=-1, $inputarrr=false): 返回一个数据集,大家从语句上也不难看出它是一条限量查询语句,与mysql语句中的limit 有异曲同工之效,来一个简单的例子:
$rs = $conn->SelectLimit(“select iNewsID, vcNewsTitle from tb_news_CH”, 5, 1);
看明白了吗?$rs中保存的是数据库中从第一记录开始的5条记录。我们知道,在oracle数据库不支持在SQL语句中使用limit,但是我们如果使用ADODB的话,那这个问题就容易解决多了!
5.Close():关闭数据库,虽然说PHP在页面结束时会自动关闭,但为了程序的完整大家还是要在页面结束进行数据库的关闭。

关于ADORecordSet.ADORecordSet为$conn->Execute($sql)返回的结果,它的基本函数如下:
1. Fields($colname):返回字段的值.
2. RecordCount():所包含的记录数.这个记录确定数据集的记录总数.
3. GetMenu($name, [$default_str=”], [$blank1stItem=true], [$multiple_select=false], [$size=0], [$moreAttr=”])非常好的一个函数,使用它可以返回一个name=$name的下拉菜单(或多选框)!!!当然,它是一个HTML的字符串,这是一个令人激动的好东西,$name指的是option的name属性,$default_str是默认选中的字串,$blank1stItem指出第一项是否为空,$multiple_select指出是否为多选框,而我们得到这个字串后就可以使用$smarty->(“TemplateVar”, “GetMenuStr”)来在模板的”TemplateVar” 处输入一个下拉列表(或是多先框)
4. MoveNext():来看一段代码:
=========================================================
$rs = &$conn->Exceute($sql);
if($rs)
{
while($rs->EOF)
{
$array[] = array(“NewsID” => $rs->fields[“iNewsID”],
“NewsTitle” => csubstr($rs->fields[“vcNewsTitle”]), 0, 20);

$rs->MoveNext();
}
}
=========================================================
明白了吗?很像MS ADODB中的那一套嘛!
5. MoveFirst(),MoveLast(), Move($to):一样的,看函数名大家就可以知道它是什么意思了.
6. FetchRow():返回一行,看代码:
=========================================================
$rs = &$conn->Exceute($sql);
if($rs)
{
while($row = $rs-&g
t;FetchRow())
{
$array[] = array(“NewsID” => $row[“iNewsID”],
“NewsTitle” => csubstr($row[“vcNewsTitle”]), 0, 20);
}
}
=========================================================
它实现了与4一样的功能,但看起来更符合PHP的习惯,而4的习惯看起来更像是MS ADODB的办法.

7.GetArray($num):返回数据集中的$num行数据,将其组合成二维数组.这个方法我们在例子index.php要用到.

8. Close():同mysql_free_result($rs);清除内容占用.

好了,初步的函数就介绍到这里,够我们用的啦!实际上ADODB还有很多实用的技术,包括格式化日期时间,格式化查询语句,输出表格,更高级点的Cache查询,带参查询等等,大家可以自行查看手册.

下面我们开始学习我们的程序,同样还是那个Web程序,我将其中的comm目录重新组织了一下,同时为了提高效率对Smarty重新进行了封装,mySmarty.class.php是封装后的类,它继承自Smarty,所以以后所有的程序文件中只调用新的类MySmarty,先来看看目录结构:
+Web (站点根目录)
|
|—-+comm (Smarty相关文档目录)
| |
| |—-+smarty (Smarty原始文件目录)
| |—-+adodb (adodb原始文目录)
| |—–mySmarty.class.php (扩展后的smarty文件)
| |—–csubstr.inc (截取中文字符)
|
|—-+cache (Smarty缓存目录,*nix下保证读写权限)
|
|—-+templates (站点模板文件存放目录)
| |
| |—-header.tpl(页面页头模板文件)
| |—-index.tpl(站点首页模板文件)
| |—-foot.tpl(页面页脚模板文件)
| |—-news.tpl (新闻页模板文件)
|
|
|—-+templates_c (模板文件编译后存放目录,*nix下保证读写权限)
|
|—-+css (站点CSS文件目录)
|
|—-+image (站点图片目录)
|
|—-+media (站点Flash动画存放目录)
|
|—-indexbak.htm (首页原始效果图)
|
|—-newsbak,htm (新闻页原始效果图)
|
|—-index.php (Smarty首页程序文件)
|
|—-news.php (Smarty新闻显示文件)
|
|—-newsList.php (显示新闻列表)
|
|—-例程说明.txt (本文档)

相对于前两个教程,有将comm目录重新组织了一下,其它的文件结构没有变化,整个站点相对于上两个教程来讲,改变的地方只有comm目录与index.php与news.php,同时增加了新闻列表,大家可以在index.php执行后的页面中点击”国内新闻”,”国际新闻”, “娱乐新闻”来分别查看各自的新闻列表, 我们先来看看index.php:

======================================================
index.php
======================================================
<?php
/*********************************************
*
* 文件名: index.php
* 作 用: 显示实例程序
*
* 作 者: 大师兄
* Email: teacherli@163.com
*
*********************************************/
include_once(“./comm/mySmarty.class.php”); //包含smarty的扩展类文件
include_once(“./comm/adodb/adodb.inc.php”); //包含ADODB主执行文件
include_once(“./comm/csubstr.inc”); //包含中文截取类

define (“NEWS_NUM”, 5); //定义新闻列表显示数目

$smarty = new MySmarty(); //建立smarty实例对象$smarty

1. $conn = ADONewConnection(“mysql”); //初始化ADODB
2. $conn->Connect(“localhost”, “root”, “”, “News”); //连接数据库

//这里将处理国内新闻部分
3. $strQuery = “Select iNewsID AS NewsID, vcNewsTitle AS NewsTitle FROM tb_news_CH orDER BY iNewsID DESC”;
4. $rs = &$conn->Execute($strQuery);
5. $smarty->assign(“News_CH”, $rs->GetArray(NEWS_NUM));
6. unset($rs);

//这里处理国际新闻部分
$strQuery = “Select iNewsID AS NewsID, vcNewsTitle AS NewsTitle FROM tb_news_IN orDER BY iNewsID DESC”;
$rs = &$conn->Execute($strQuery);
$smarty->assign(“News_IN”, $rs->GetArray(NEWS_NUM));
unset($rs);

//这里将处理娱乐新闻部分
$strQuery = “Select iNewsID AS NewsID, vcNewsTitle AS NewsTitle FROM tb_news_MU orDER BY iNewsID DESC”;
$rs = &$conn->Execute($strQuery);
$smarty->assign(“News_MU”, $rs->GetArray(NEWS_NUM));
unset($rs);

7. $conn->close();

//编译并显示位于./templates下的index.tpl模板
$smarty->display(“index.tpl”);
?>
=============================================================================
同样,我在关键的地方加了数标,下面来说明一下它们的含义:

1. 建立一个连接对象$conn,大家在这里要注意的是它的初始不是以$conn = new ADONewConnection($dbType)这样的形式出现的,也就是说,ADONewConnection不是一个class,你不能使用new 对它进行初始化.看看它的源码你就会明白,这只不过是一个函数.

2. 这个就不用说了吧?打开一个News的数据库,主机为:localhost, 用户名为root, 密码为””

3. 一个查询语句,注意,这里要将查询的字段使用AS关键字来重新标识,名称为你在模板中设置的模板变量的名称.

4. 使用Execute来执行这个查询,结果返回一个RecordSet数据集

5. 这里有个方法:$rs->GetArray($num) 这个在上边介绍过,它是要从$rs这个数据集中返回$num行,结果为一个可被Smarty所识别的二维数据.这样ADODB就自动为我们构建起了这样的结构,而在我们以前的例子中,都是使用一个循环构建这样的数组的.

6. 这一句我看也不用说了吧?

7. 关闭内存中的相关资源.

大家可以看看,整个程序中再没有出现什么while语句,程序整体结构显的非常清楚,这就是为什么ADODB+Smarty是黄金组合的原因.不过话也说回来了,简单有简单的问题,不知大家想过没有,这里对显示的新闻标题的长度没有控制,也就是说,如果某条新闻标题的长度超出一行显示的范围,它就是自动折行到下一行,那么整个的版面就会变乱,所说大家自已适自己的情况来决定是否这样使用吧当然,你也可以使用像上一节中介绍的那样,使用一个循环语句重构这个二维数组,使它符合你的用途,怎么做大家自己去想吧,参考PHPLIB中的做法,上节我介绍过了…

再来看看新闻页吧

=============================================================
news.php
=============================================================
<?php
/*********************************************
*
* 文件名: news.php
* 作 用: 新闻显示程序
*
* 作 者: 大师兄
* Email: teacherli@163.com
*
*********************************************/
include_once(“./comm/mySmarty.class.php”); //包含smarty的扩展类文件
include_once(“./comm/adodb/adodb.inc.php”); //包含ADODB主执行文件

$smarty = new MySmarty(); //建立smarty实例对象$smarty

$conn = ADONewConnection(“mysql”); //初始化ADODB
$conn->Connect(“localhost”, “root”, “”, “News”); //连接数据库

$NewsID = $_GET[“id”]; //获取新闻编号
$NewsType = $_GET[“type”]; //要显示的新闻类型
switch($NewsType)
{
case 1: $dbName = “tb_news_CH”;
break;
case 2:
$dbName = “tb_news_IN”;
break;
case 3:
$dbName = “tb_news_MU”;
break;
}

$strQuery = “Select vcNewsTitle AS NewsTitle, ltNewsContent AS NewsContent FROM ” . $dbName;
1. $row = &$conn->GetRow($strQuery); //返回一个一维数组,下标为模板变量名

$smarty->display($row);
unset($row);

$conn->Close();
?>
=============================================================
说明一下关键的地方,其实在news.php中也只有一个地方值的说明一下了.

1. $conn->GetRow($strQuery):这一句返回一个一维数组,返回的形式为:

$array = (“NewsTitle”=>”xxxx”, “NewsContent”=>”yyyyy…”)
明白如果使用$smarty($array)后Smarty会干什么吗?对了,就是相当于:
$smarty->assign(“NewsTitle”, “xxxx”);
$smarty->assign(“NewsContent”, “yyyyy…”);

简单吧,确实很简单

下面再来看看新闻列表:
================================================================
newsList.php
================================================================
<?php
/*********************************************
*
* 文件名: newsList.php
* 作 用: 新闻列表显示程序
*
* 作 者: 大师兄
* Email: teacherli@163.com
*
*********************************************/
include_once(“./comm/mySmarty.class.php”); //包含smarty的扩展类文件
include_once(“./comm/adodb/adodb.inc.php”); //包含ADODB主执行文件

$smarty = new MySmarty(); //建立smarty实例对象$smarty

$conn = ADONewConnection(“mysql”); //初始化ADODB
$conn->Connect(“localhost”, “root”, “”, “News”); //连接数据库

$NewsID = $_GET[“id”]; //获取新闻编号
$NewsType = $_GET[“type”]; //要显示的新闻类型
switch($NewsType)
{
case 1:
$tbName = “tb_news_CH”;
break;
case 2:
$tbName = “tb_news_IN”;
break;
case 3:
$tbName = “tb_news_MU”;
break;
}

$strQuery = “Select iNewsID AS NewsID, vcNewsTitle AS NewsTitle FROM ” . $tbName;
1. $rs = &$conn->GetAll($strQuery);
2. $smarty->assign(“NewsType”, $NewsType); //这一句为新闻列表中的链接服务
3. $smarty->assign(“NewsList”, $rs);
unset($rs);
$conn->close();

$smarty->display(“newsList.tpl”);
?>
================================================================
分别来说明一下:

1. GetAll($strQuery):这个函数可是个好东东,它的作用是将$strQuery查询到的所有数据组合成为一个能够被Smarty所识别的二维数组,记住:它返回的是一个二维数组而不是一个RecordSet,所在你可以程序中直接在3处使用.
2. 这里是为了给新闻标题做链接时要GET参数type=XX而做的

后记:
大家在使用ADODB时有几个地方要注意:
1. 初始化: 初始化的方式不是使用new,因为它不是一个对象
2. 方 法: 基本上每个方法都是以大写字母开头大小写混合的名称,这一点好像与*NIX的习惯有些不同,也不同于PHP的整体风格,所以注意这里的大小写问题.

日志文件分析工具—AWStats在IIS中的配置

AWStats是sourceforge.net上很有名的Web/Mail/FTP服务器日志文件分析工具,可以运行在windows系统上分析IIS日志文件,本文讲的是AWStats在windows下的安装及配置。

运行环境说明:

操作系统Microsoft Windows Server 2003 SP2简体中文企业版
Web服务器IIS 6.0
Perl:ActivePerl 5.8.8.820
AWStats 6.7

一、IIS配置

1.启用IIS日志记录:打开windows运行对话框(Windows+R),输入inetmgr,打开Internet 信息服务(IIS)管理器控制台界面,在控制台左边“网站”项目上点击鼠标右键,打开“网站属性”设置窗口,在“网站”标签中,将“启用日志记录”前的复选框选中,再点击“应用”按钮,使设置生效。

2.日志格式设置:活动日志格式选择“W3C扩展日志文件格式,再点击“属性”按钮,进入日志记录属性配置界面,新日志计划选择“每天”,勾选“文件名和创建使用当地时间”,日志文件目录默认为C:\WINDOWS\system32\LogFiles,由于Web服务器的长期运行会使日志文件会变得非常大,因此建议不要将日志文件存放在默认的目录中,应该保存到特定的目录中,确保磁盘空间充足,并做好备份和维护工作,如果您不在意以前的数据丢失与否或者您仅仅是在本机做测试,就没必要更改默认目录了,在本项目中,日志文件保存路径设定为:D:\site\LogFiles\,在设置了日志文件目录后,日志文件其实并不是直接保存在该目录下,系统会在设定的目录中根据需要建立不同的子目录,分别保存不同的日志文件,在下图中,日志文件名:W3SVCX\exyymmdd.log是站点的日志的实际存储路径。其中W3SVCX中的X表示不同的WEB站点的标识符,为数字,组合后目录名称为W3SVC1,W3SVC2等,文件名为字母ex加上年月日。实际日志文件名例如:W3SVC1\ex070712.log。

3.日志记录属性高级设置:在设置了新日志计划以及日志文件命名规则以后,还需要对日志文件包含的内容进行配置,选择“高级”标签,进入“扩展日志选项”的界面。 勾选以下12个项目,项目必须完全一致。

  • date(日期)
  • time(时间)
  • c-ip(客户端IP地址)
  • cs-username(用户名)
  • cs-method(方法)
  • cs-uri-stem(URI资源)
  • cs-uri-query(URI查询)
  • sc-status(协议状态)
  • sc-bytes(发送的字节数)
  • cs-version(协议版本)
  • cs(User-Agent)(用户代理)
  • cs(Refer)(引用站点)

4.应用配置方案:您可以对服务器上的所有站点进行相同的配置,也可以分别对每个站点进行不同的配置!停止IIS,删除原有的日志文件,然后启动IIS,并访问一次站点,即可生成新格式下的IIS日志记录文件。

二、 Perl语言运行环境

AWStats软件是使用动态语言Perl开发的应用程序,因此服务器上必须具有Perl运行环境,我们这里使用ActivePerl 5.8.x软件,它的安装配置比较简单。

1.下载软件:

2.安装ActivePerl :

  • 安装用户必须是Administrators组的用户,否则安装不能成功或者不完整,导致软件不能正常运行。
  • Perl环境变量:如果已经存在PERLLIB, PERL5LIB 或者 PERL5OPT这几个环境变量,必须在安装ActivePerl之前使它们无效,否则这些变量会在安装处理过程中导致Perl模块的版本不兼容问题。
  • 在安装ActivePerl之前,请先停止Web服务器,安装完毕以后再启动WEB服务器。
  • MSI安装包:双击安装文件,直接进行安装。ZIP安装包,直接拷贝到想要放置的目录。如果已经安装过其他版本,请首先卸载,然后再安装新版本。不要直接在以前版本上安装。 本方案中将ActivePerl安装到C:\Perl目录下。

3.配置:

  • 启用Perl服务扩展:安装ActivePerl以后,还需要配置WEB服务扩展,使得IIS能够支持perl脚本,打开IIS, 选择左边窗口目录树中的“Web 服务扩展”项,则右边窗口中显示出系统已经安装的服务扩展及状态(默认多为禁止),对于ActivePerl 5.8.x在Windows Server 2003上的默认安装,我们可以看到以下两个项目: Perl CGI Extension 禁止、Perl ISAPI Extension 禁止。默认情况下它们处于禁止状态,需要将它们的状态改变为“允许”,请分别选择这两个服务扩展,点击“允许”按钮,启用它们,使得perl脚本程序可以被IIS执行。
  • 添加Perl服务扩展:如果没有以上两项服务扩展(使用ZIP包安装或者安装其他版本的ActivePerl),那么我们需要手工添加这两项配置信息。 选择管理控制台左边窗口上的“Web 服务扩展”,点击鼠标右键,选择“添加一个新的Web服务扩展(A)…”,在“扩展名”中输入一个完整说明名称(不是文件的扩展名),例如:Perl CGI Extension,点击“添加”按钮,在“文件路径”中输入进行扩展处理的文件的完整路径以及参数,例如:C:\Perl\bin\Perl.exe  "%s"  %s ,并勾选“设置扩展状态为允许”
  • 配置IIS脚本程序映射:ActivePerl安装完毕以后,应该会在IIS主目录配置中添加脚本程序映射,如果没有,那么在你希望配置Perl脚本的虚拟目录、应用程序或网站上点击鼠标右键,选择“属性”,打开网站属性界面,选择“主目录”标签,点击“配置”按钮,(如果配置按钮不可用,点击创建按钮,创建一个默认的配置方案),进行应用程序配置。如果在应用程序扩展列表中,没有发现.pl的扩展名项,那么点击“添加”按钮,进行应用程序扩展名映射。在“可执行文件”中输入和前面添加Web服务扩展中相同的命令行C:\Perl\bin\Perl.exe  "%s"  %s ,在“扩展名”中输入.pl,在“动作”中输入:GET,HEAD,POST

 

三、  AWStats的安装与配置

1、下载AWStats

2.安装AWStats

  • 文件安装在D:\AWStats
  • 安装目录说明:
    • x:\aswtats\docs软件的相关文档)
    • x:\aswtats\tools(软件的相关工具)
    • x:\aswtats\wwwroot(Web日志分析统计程序及相关文件)
    • x:\aswtats\wwwroot\cgi-bin(分析结果主显示程序 )
    • x:\aswtats\wwwroot\classes(软件的相关类文件)
    • x:\aswtats\wwwroot\css(样式表)
    • x:\aswtats\wwwroot\icon(该软件所用图片)
    • x:\aswtats\wwwroot\js(javascript脚本)

3、IIS相关配置

  • 映射虚拟目录AWStats:在AWSTATS 软件安装以后,需要将主程序所在的路径wwwroot 映射成网站的一个虚拟目录,当然,也可以将该目录下的所有子目录复制到你的网站中,但是这样对于管理很不方便,而且权限设置也存在安全问题,因此,我们选择将wwwroot映射成虚拟目录。启动“Internet 信息服务管理器”,选择你的网站,如“默认网站”,右键,“新建虚拟目录”,虚拟目录名称我们命名为AWStats,路径为安装程序所在的路径,如 x:\awstats\wwwroot。
  • 虚拟目录相关属性设置:虚拟目录建立完毕以后,还需要对虚拟目录的属性进行设置。选择建立的虚拟目录,点击鼠标右键,选择“属性”,将“记录访问”、“索引资源”前的复选框选项去掉,表示对于该虚拟目录的访问不记录进访问日志中,并且全文索引不对该虚拟目录进行索引。 将“执行权限”选择为“脚本和可执行文件”,该选项必须如此,否则不能显示统计信息。

4.AWStats运行配置

  • 创建网站的AWStats配置信息:网站配置文件存放在x:\AWStats\wwwroot\cgi-bin\目录下,默认文件名称为:awstats.model.conf,我们将它复制成一个新配置文件:awstats.myvirtualhostname.conf,其中myvirtualhostname是网站的域名或者IP,因此,我们创建了配置文件:awstats.www.mysite.com.cn.conf
  • 编辑配置文件中相应配置信息:
    • LogType:日志文件的类型,W—web日志、M—email日志、F—FTP日志。LogType=W
    • LogFile:日志文件存储的路径或位置,以及文件名,在前面我们进行IIS配置时,将日志文件存储在D:\site\LogFiles目录下,我们查看得到MYSITE网站的标识为W3SVC1(不同的安装会导致此标识不同,因此需要根据实际查看得到),日志文件命名为exYYMMDD.log。LogFile="D:\site\LogFiles\W3SVC1\ex%YY-0%MM-0%DD-0.log"
    • LogFormat:日志文件的格式,它必须与log文件中的格式完全一致(查看log文件中的#Fields字段),栏目多少与顺序也必须一致,因此,IIS日志记录格式必须按照前面介绍的配置进行。LogFormat="date time cs-method cs-uri-stem cs-uri-query cs-username c-ip cs-version cs(User-Agent) cs(Referer) sc-status sc-bytes"
    • DirData由于网站访问的日志有可能极大,每次统计可能需要耗时几小时,因此统计信息不是即时的,而是以天为单位,因此分析得到的统计数据需要存放到专用的数据文件中。注意,必须首先手工建立该数据存放目录。DirData="D:\AWStats\wwwroot\cgi-bin\data"
    • CreateDirDataIfNotExists:如果分析结果数据保存路径不存在,是否创建该路径,1表示立即创建。CreateDirDataIfNotExists=0
    • DirIcons:AWStats需要使用的图片文件的存储路径,由于我们将x:\awstats\wwwroot设置为虚拟路径,因此,在此处
      DirIcons="../icon"
    • SiteDomain:网站完整域名,SiteDomain="www.mysite.com.cn"
    • AllowFullYearView:是否运行以年为单位分析日志。AWStats默认是以月为单位分析日志数据,如果需要以年为单位进行查看分析,需要按照下面设置。AllowFullYearView=3
    • DefaultFile:网站主页名称。DefaultFile="index.asp"
    • Lang: 网站分析统计结果界面的语言,cn表示中文。Lang="cn"
    • NotPageList:NotPageList="css js class gif jpg jpeg png bmp ico swf zip pdf xml htc"
  • 插件安装以及设置:
    • Plugin: TimeZone:由于采用W3C标准格式记录日志,日期时间记录的是格林威治时间,因此需要根据时区进行调整,否则得到的统计结果就是错误的。 该插件的配置在网站配置文件中(与上面的参数配置相同)。LoadPlugin="timezone +8"
    • IP地址插件:如果需要对访问用户的IP地址进行分析,需要使用IP地址插件,安装该插件以后,可以按照国家进行统计,它的安装稍微复杂一些。 我们使用GeoIPfree插件,首先在配置文件中打开该插件。 LoadPlugin="geoipfree"
    • 下载GeoIPfree软件:该软件为免费软件, 网址为:http://search.cpan.org/~gmpassos/Geo-IPfree-0.2/,文件为:Geo-IPfree-0.2.tar.gz
    • 安装配置GeoIPfree软件:首先使用winzip等解压缩该软件,再进行软件的编译链接,在命令行执行:perl makefile.pl,再将lib目录下的geo目录复制到Perl的库文件目录中或者AWStats的插件目录中。其中Perl的库目录为x:\Perl\lib ,AWStats插件目录为x:\AWStats\wwwroot\cgi-bin\plugins。
  • 初始化统计信息:
    • 在以上配置信息以及插件都安装完毕以后,首次运行之前的需要手工在命令行进行统计信息初始化工作。
    • 在命令行,切换目录到x:\awstats\wwwroot\cgi-bin,运行 (如果pl没有与perl解释程序相关联,请加上x:\Perl\bin\perl.exe )awstats.pl –config=www.mysite.com.cn –update
    • 按照awstats.www.mysite.com.cn.conf网站配置信息进行初次统计分析,它会使用前一天的日志文件进行分析,如果日志文件数据量很大,分析可能持续几小时。
    • 每日定时执行统计分析:AWStats是以天为单位进行统计分析的,统计分析需要用户执行,因此我们需要使用操作系统的计划任务使它每日定时进行,定时时间为每日00:05。 首先在x:\awstats\wwwroot\cgi-bin目录中创建批处理文件update.bat,文件内容为:Perl.exe awstats.pl –config=www.mysite.com.cn –update
    • 如果有多个网站的日志需要进行统计分析,那么创建一个全部更新的命令更加方便。在x:\awstats\tools目录下,创建一个批处理文件updateall.bat,文件内容为:Perl.exe awstats_updateall.pl now -awstatsprog=../wwwroot/cgi-bin/awstats.pl -configdir=../wwwroot/cgi-bin
    • 在Windows Server 2003命令行中创建计划任务:schtasks /create /tn "AWStats Update Statistics" /tr d:\awstats\wwwroot\cgi-bin\update.bat /sc daily /st 00:05或者schtasks /create /tn "AWStats UpdateAll Statistics" /tr d:\awstats\tools\updateall.bat /sc daily /st 00:05或者或者使用计划任务向导创建计划,每日00:05分执行批处理程序,更新统计信息,注意在执行计划任务时需要指定运行该计划的用户和密码,最好为该任务创建一个专用用户帐号,并为适当的目录指定相应的权限。
  • 查看统计信息:AWStats的日志统计分析信息以Web方式提供给用户,查看方式为:http://www.mysite.com.cn/awstats/cgi-bin/awstats.pl?config=www.mysite.com.cn

PHP生成动态WAP页面

  WAP(无线通讯协议)是在数字移动电话、个人手持设备(PDA等)及计算机之间进行通讯的开放性全球标准。由于静态的WAP页面在很多方面不能满足用户个性化的服务请求,因此通过WAP服务器端语言产生动态的WML页面,具有很广泛的应用价值和很高的商业价值。
  WAP应用结构非常类似于Internet,一个典型的WAP应用请求是这样的:首先,具有WAP用户代理功能的移动终端(WAP手机等)通过内部运行的微浏览器(Micro Browser)对某一网站以无线方式发送WAP服务请求。该请求先由WAP网关截获,对信息内容进行编码压缩,以减少网络数据流量,同时根据需要将WAP协议转换成HTTP协议,然后将处理后的请求转送到相应WAP服务器。在WAP服务器端,根据页面扩展名等性质,被请求的页面直接或由服务器端脚本解释后输出,再经网关传回用户。
  从上述WAP应用流程可以看到,生成动态WAP页面与动态产生Web网页的过程非常类似。但是由于WAP应用使用的WML语言来源于语法严格的XML,因此要求输出的格式必须按WAP网页的规范输出。同时,由于WAP协议的应用范围、移动客户端的软硬件水平等特殊性,对每次输出的页面的大小、图像的格式及容量都有一定限制。下面我们以PHP脚本语言为例,看看如何动态输出WAP页面。
  一、设置WEB服务器

  首先你的 Web服务器要安装好PHP,即能处理PHP脚本程序。其次,为使Web服务器能同时识别和处理PHP、WML、WBMP等文件,Web 服务器的MIME表需添加以下的几种文件类型。

  text/vnd.wap.wml .wml 
  image/vnd.wap.wbmp .wbmp 
  application/vnd.wap.wmlc .wmlc 
  text/vnd.wap.wmls.wmls
  application/vnd.wap.wmlsc .wmlsc 

  二、用PHP输出简单动态WAP页面 

  下面有一个最简单的PHP生成WAP页面的例子。注意由于需要PHP解释器来解释该程序,并输出WAP页面,因此所有类似程序应以.php为扩展名。

  <?php
  header(″Content-type: text/vnd.wap.wml″);
  echo (″<wml> <card> <p>″);
  echo date( ″l dS of F Y h:i:s A″ ); 
  echo (″</p></card></wml>″);
  ?> 

  该例子在WAP手机模拟器中可以浏览,输出当前日期时间,而在普通的浏览器中无法识别,甚至会被认为是错误下载。这是因为在程序开头就声明了该输出文档为WML类型,该类型只有WAP设备能够识别并解释。值得注意的是,我们常见的HTML语言对规范性要求不严,大多数浏览器能“容忍”其中相当多的编写错误,而WML规范相当严格,一点失误都可能导致无法输出所需页面。

  一旦我们知道了用PHP脚本输出WAP页面的标准过程,我们就能够使用PHP强大的功能配合以WML语言的交互处理以及WML Script的简单脚本,开发出适合我们需要的应用系统了。

   三、用PHP动态生成图像 

  WAP应用使用一种特殊黑白的图像格式WBMP。我们可以用一些工具来将已有图像转换成WBMP格式,然后在WML文档中使用。但是在WAP站点上如果能动态地生成所需图像如K线图等,将会有广阔的应用前景。幸运的是,PHP的GD库(版本1.8以上)已经提供了相应函数。

  <?PHP
  Header(″Content-type: image/vnd.wap.wbmp″);
  Sim = ImageCreate(50, 50);
  Swhite = ImageColorAllocate(Sim,255,255,255);
  Sblack = ImageColorAllocate(Sim,0,0,0);
  ImageRectangle(Sim, 5, 5, 20, 20, Sblack);
  ImageWBMP(Sim);   ImageDestroy(Sim);
  ?>

  该文件将在WAP模拟器中显示一个黑色矩形框。注意要使用GD的图像函数库,必须在PHP配置中加载PHP_GD.DLL库文件。

  四、在PHP中处理汉字

  WAP作为一种全球应用,选择了UNICODE 2.0作为其标准字符集编码,以便能同时处理包括英文、中文、日文、法文等多种文字。而我们平常处理汉字使用的是GB2312编码,不同的内码标准势必不能通用,因此如果不在两种编码之间通过码表进行转换,就会出现汉字乱码现象。现在已经有较成熟的GB-2312与UNICODE编码转换的程序和函数,并在ASP、PHP、JSP等系统中使用,我们可以在一些技术站点上找到它们。

  目前的大多数WAP手机(Nokia7110、爱立信R320S等等)都是使用UTF-8编码的,也就是采用UNICODE来编码。这样,如果我们直接在WML使用中文字符(GB2312编码),将会产生乱码,手机用户无法识别,所以我们在输出中文之前,要使用程序或函数对中文进行UNICODE的编码。而在少数支持GB2312编码的手机或WAP终端设备中,我们可以在程序中定义好文档的内码类型后即可直接正确显示汉字,例如:

  <?php 
  header(″Content-type: text/vnd.wap.wml; charset=gb2312″);
  echo (″<wml><card><p>″);
  echo (″中文测试″);
  echo (″</p></card></wml>″);
  ?> 

在PHP中如何远程链接Mysql数据库?

MySQL是可以远程调用的,但用户要有远程调用的权限。

在增加用户的时候有一个host 选项,是任何主机 或 locahost,你选用 any host,这样,你就可以远程调用了。

mysql_pconnect(“192.168.0.2:3306″,”root”,”password”);

一段经常用来加速网页打开速度的javascript广告代码

在网页在显示广告的位置的代码为:
<span id=”top_ad”></span>

这里是加载的广告代码,一般放在网页的底部,这样可以加快网页显示速度,最后才加载广告代码.

<span id=”top_ad_body” style=”display:none;”>
      <script language=”javascript” src=”/js/top.js”></script>
</span>

<script type=”text/javascript”>
var top_ad = document.getElementById(‘top_ad’);

if (top != null) {
      top_ad.innerHTML=top_ad_body.innerHTML;
      top_ad_body.innerHTML=””;
}
</script>

郑州双线服务器的两个客户的问题总算得到解决了

所谓的两大问题是:一。jmail组件一直不能用的,让易方的人看了一下,当时好像也不能用的,我在MACFEE上把排除进w3wp.exe添加到里面就好了,也许是jmail版本的问题吧,他们给安装的是专业版的,想想当时本想换一个版本的,发现服务器上打不开网页,就让郑州景安机房检查了一下,正好还有一个LZSOU.COM的用户反映下载没有办法使用的,他的下载只是几个采集页面的,完全是采集其它网站的,所以打不开网站正常的,当时客户反映的时候,用的IP是203.171.236.116的,当时心想可能是IP的问题,就让他解析到103上,发现还是不行的,等调试好后,发现下载还是不行,就检查了一下,原来他采集的下载站打不开了,呵呵,没有想到解决另一个问题的时候也把这个给解决了。到止为止,JMAIL的问题总算解决了。另一个就是一个BBAD.CN网站后台突然进不去了,在服务器上调的时候经常出现验证码无法显示的,看了一下GD也启用了,客户在本地测试了也没有问题,把程序重新上传问题照样存在,我把网站从服务器上DOWN到本地测试也是没有发现什么问题的,没有办法只有在本地慢慢的用最古老最实用的办法了,一行一行的代码进行调了。终于发现问题就是SESSION取不出来,看了一下php.ini文件,也没有的,咋办。看来可能是易方软件的问题,让易方的人查了一下,说是可能权限,给传过来了一个安全设置工具的,重新设置了一下,发现报错。晕倒,怎么会这样的呀。后来发现Editpuls打开了php.ini文件的,关闭重装应用安全配置,OK,一切正常。重新打开原来的测试页面发现session还是为空值,汗。难道不是权限的问题么?心想着,再一检查,原来测试文件有问题的,用易方软件重新应用权限设置的时候重启了IIS,启用SESSION的值为空了。改了一下终于成功了。登陆网站后台也正常了。呵呵,两个大问题总算得到解决了,哈哈!

明天可能还是上海虚拟主机的问题了,总是慢的,服务器上显示的一切都正常的,只是时大时小的。唉,看看再说吧,实在不用看来再重新安装一次系统了。

Sql Server2000数据库自动备份现

第一种,最简单。
1、启动SQL服务器

2、打开企业管理器

3、进入你服务器下“管理”,启动“SQL Server代理”,如果这个启动不了的话什么都不能做。

4、进入“管理”下的“数据库维护计划”

5、右键,“新建维护计划”

6、下一步

7、选择你要备份的数据库,下一步

8、下一步

9、下一步

10、点“更改”,详细设定你要备份的周期

11、下一步,可以更改你备份文件的目录

12、一直点下一步直到完成

13、打开服务器属性,选择“自动启动SQL Server代理”,OK大功告成

第二种:

1.在要备份的数据上建立以下存储过程:
Create PROCEDURE [dbo].[过程名] AS
declare
@filename nvarchar(100),–文件名
@NowDay int –设置时间
set @filename='F:\JXXdata'+cast(Day(GetDate()) as varchar(2))+'.dat' –文件路径及文件名
Set @NowDay=Day(GetDate())
if (@NowDay>=20) or (@NowDay<=10) --这个月的20到下个月的10要备份 begin print @filename BACKUP DATABASE [数据库名()你也可以设参数] TO DISK = @filename WITH INIT , NOUNLOAD , NAME = N'XX数据备份', NOSKIP , STATS = 10, NOFORMAT end 存储过程要调试好无误 2、进入企业管理器中->管理->sql server代理->作业,新建作业,作业名称随便取,例如:data备份,所有者选择sa,当然你也可以选择其他用户,前提是该用户有执行作业的权限;

3.在步骤中取名-选中要备份的数据库 --在命令中输入 exec('过程名')

4.在调度中选反复出现--更改–选每天--时间自己输入

5.测试完后-最后导入脚本 进入服务器

6.把SQlServer服务管理器 启用SqlServer Agent服务
p.s.一定要启动agent服务,否则调度不会执行,你可以同样利用调度实现某些表的自动更新。

在win2003上安装SQL SERVER2000需要序列号的解决办法

我们在windows2003的系统上安装sql server2000数据库的时候,有时会经常遇到要让输入序列号,个人在网上找了一些,但还是不行,这里我们介绍一下解决办法,就是不跳过输入序列号这一步.下面是我从网上找到的一个办法,但不一定有效,不过值得一试,在我的个人机器上试了几次是可以的.大家如果实在没有办法的话,可以不妨一试的,呵呵.
解决办法:

打开注册表编辑器并定为到:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager

找到名为“SafeDLLSearchMode”的DWORD值,切换修改他的值 0 或 1,如果没有则创建这个DWORD值。

附部分序列号:

s/n: H6TWQ – TQQM8 – HXJYG – D69F7 – R84VM
s/n: R7MPM – R36DT – F38FC – RPPCX – XJG7M
s/n: KRJQ8 – RQ822 – YRMXF – 6TTXC – HD2VM
s/n: RBDC9 – VTRC8 – D7972 – J97JY – PRVMG

今天恢复了一下系统,发现用上面写的方法又不行了,晕倒,试好好几次都不行,结果在网上找了几个序列号,大家可以试一下:

XR6Y2-YK3PK-XWBM9-PVQTR-GMGJM

GXKQH-VGTD2-K8QC4-9H3PK-HY9XW

G6TW2-QEQM8-H7JJG-O69F7-NMO9U