摘要:   <html> </html>   标志着html文件的开始与结束 <head> </head>  头部标志符 <title> </title>  网页的标题 <boby> </boby> 构成web的主体 1. background&nbs...  阅读全文
posted @ 2009-11-18 15:31 肖马辉 阅读(1004) | 评论 (0)编辑 收藏
 
如何利用网页弹出各种形式的窗口,我想大家大多都是知道些的,但那种多种多样的弹出式窗口是怎么搞出来的,我们今天就来学习一下:

  1.弹启一个全屏窗口

<html>
<body onload="window.open('http://www.kunde58.com','example01','fullscreen');">;
<b>www.kunde58.com</b>
</body>
</html>

  2.弹启一个被F11化后的窗口

<html>
<body onload="window.open(''http://www.kunde58.com','example02','channelmode');">;
<b>www.kunde58.com</b>
</body>
</html>

  3.弹启一个带有收藏链接工具栏的窗口

<html>
<body onload="window.open('www.wangye8.com','example03','width=400,height=300,directories');">
<b>www.wangye8.com</b>
</body>
</html>

  4.网页对话框

<html>
<SCRIPT LANGUAGE="javascript">
<!--
showModalDialog('http://www.kunde58.com,'example04','dialogWidth:400px;dialogHeight:300px;
dialogLeft:200px;dialogTop:150px;center:yes;help:yes;resizable:yes;status:yes')
//-->
</SCRIPT>
<b>www.wangye8.com</b>
</body>
</html>

<html>
<SCRIPT LANGUAGE="javascript">
<!--
showModelessDialog('http://www.kunde58.com,'example05','dialogWidth:400px;dialogHeight:300px;
dialogLeft:200px;dialogTop:150px;center:yes;help:yes;resizable:yes;status:yes')
//-->
</SCRIPT>
<b>http://www.wangye8.com</b>
</body>
</html>

  showModalDialog()或是showModelessDialog() 来调用网页对话框,至于showModalDialog()与showModelessDialog()的区别,在于showModalDialog()打开的窗口(简称模式窗口),置在父窗口上,必须关闭才能访问父窗口(建议尽量少用,以免招人反感);showModelessDialog()

dialogHeight: iHeight 设置对话框窗口的高度。
dialogWidth: iWidth 设置对话框窗口的宽度。   
dialogLeft: iXPos 设置对话框窗口相对于桌面左上角的left位置。
dialogTop: iYPos 设置对话框窗口相对于桌面左上角的top位置。
center: {yes | no | 1 | 0 } 指定是否将对话框在桌面上居中,默认值是“yes”。
help: {yes | no | 1 | 0 } 指定对话框窗口中是否显示上下文敏感的帮助图标。默认值是“yes”。   
resizable: {yes | no | 1 | 0 } 指定是否对话框窗口大小可变。默认值是“no”。
status: {yes | no | 1 | 0 } 指定对话框窗口是否显示状态栏。对于非模式对话框窗口,默认值是“yes”;对于模式对话框窗口,默认值是 “no”。

5、其他弹出窗口代码

经常上网的朋友可能到过这样一些网站,一进入首页立刻会弹出一个窗口,或者按一个链接或按钮弹出,通常在这个窗口里会显示一些注意事项、版权信息、警告、欢迎光顾之类的话或者作者想要特别提示的信息。其实制作这样的页面非常容易,只要往该页面的HTML里加入几段java script代码即可实现。下面我就带你剖析它的奥秘。

【最基本的弹出窗口代码】
其实代码非常简单:
<SCRIPT LANGUAGE="java script">
<!--
window.open (’page.html’)
-->
</SCRIPT>
因为这是一段java script代码,所以它们应该放在<SCRIPT LANGUAGE ="java script">标签和</script>之间。<!--和-->是对一些版本低的浏览器起作用,在这些老浏览器中如果不支持java script,不会将标签中的代码作为文本显示出来。
Window.open (’page.html’)用于控制弹出新的窗口page.html,如果page.html不与主窗口在同一路径下,前面应写明路径,绝对路径(http://)和相对路径(../)均可。

 

用单引号和双引号都可以,只是不要混用。
这一段代码可以加入HTML的任意位置,加入到<head>和</head>之间也可以,位置越靠前执行越早,尤其是页面代码较长时,又想使页面早点弹出就尽量往前放。

【经过设置后的弹出窗口】
下面再说一说弹出窗口外观的设置。只要再往上面的代码中加一点东西就可以了。
我们来定制这个弹出窗口的外观、尺寸大小、弹出位置以适应该页面的具体情况。
<SCRIPT LANGUAGE="java script:>
<!--
window.open (’page.html’,’newwindow’,’height=100,width=400,top=0,left=0,toolbar=no,menubar=no,scrollbars=no,resizable=no,
location=no,status=no’)
//写成一行
-->
</SCRIPT>
参数解释:
<SCRIPT LANGUAGE="java script"> js脚本开始;
window.open 弹出新窗口的命令;
page.html 弹出新窗口的文件名;
newwindow 弹出窗口的名字(不是文件名),可用空 ″代替;
height=100 窗口高度;
top=0 窗口距离屏幕上方的像素值;
left=0 窗口距离屏幕左侧的像素值;
toolbar=no 是否显示工具栏,yes为显示;
menubar,scrollbars 表示菜单栏和滚动栏;
resizable=no 是否允许改变窗口大小,yes为允许;
location=no 是否显示地址栏,yes为允许;
status=no 是否显示状态栏内的信息(通常是文件已经打开),yes为允许;
</SCRIPT> js脚本结束。

【用函数控制弹出窗口】
下面是一个完整的代码。
<html>
<head>
<script LANGUAGE="java script">
<!--
function openwin(){
window.open("page.html","newwindow","height=100,width=400,toolbar=no,menubar=no,scrollbars=no,resizable=no,
location=no,status=no";)
//写成一行
}
-->
</script>
</head>
<body onload="openwin()">
...任意的页面内容...
</body>
</html>
这里定义了一个函数openwin(),函数内容就是打开一个窗口。在调用它之前没有任何用途。怎么调用呢?
方法一:<body onload="openwen()"> 浏览器读页面时弹出窗口;
方法二:<body onunload="openwen()"> 浏览器离开页面时弹出窗口;
方法三:用一个连接调用:<a href="#" onclick="openwin()">打开一个窗口</a>
注意:使用的"#"是虚连接。
方法四:用一个按钮调用:<input type="button" onclick="openwin()" value="打开窗口">

【主窗口打开文件1.htm,同时弹出小窗口page.html】
将如下代码加入主窗口<head>区:
<script language="java script">
<!--
function openwin(){
window.open("page.html","","width=200,height=200" ;)
}
//-->
</script>
加入<body>区:<a href="1.htm" onclick="openwin()">open</a>即可。

【弹出的窗口之定时关闭控制】
下面我们再对弹出窗口进行一些控制,效果就更好了。如果我们再将一小段代码加入弹出的页面(注意是加入到page.html的HTML中,可不是主页面中,否则…),让它在10秒钟后自动关闭是不是更酷了?
首先,将如下代码加入page.html文件的<head>区:
<script language="java script">
function closeit() {
setTimeout("self.close()",10000) //毫秒
}
</script>
然后,再用<body onload="closeit()">这一句话代替page.html中原有的<BODY>这一句就可以了。(这一句话千万不要忘记写啊!这一句的作用是调用关闭窗口的代码,10秒钟后就自行关闭该窗口。)

【在弹出窗口中加上一个关闭按钮】
<form>
<INPUT TYPE=’BUTTON’ value=’关闭’ onClick=’window.close()’>
</form>
呵呵,现在更加完美了!

 

 

内包含的弹出窗口——一个页面两个窗口】
上面的例子都包含两个窗口,一个是主窗口,另一个是弹出的小窗口。
通过下面的例子,你可以在一个页面内完成上面的效果。
<html>
<head>
<SCRIPT LANGUAGE="java script">
function openwin()
{
OpenWindow=window.open("","newwin","height=250,width=250,toolbar=no,scrollbars="+scroll+",menubar=no";);
//写成一行
OpenWindow.document.write("<TITLE>例子</TITLE>" ;)
OpenWindow.document.write("<BODY BGCOLOR=#FFFFFF>" ;)
OpenWindow.document.write("<H1>Hello!</h1>" ;)
OpenWindow.document.write("New window opened!" ;)
OpenWindow.document.write("</BODY >" ;)
OpenWindow.document.write("</HTML>" ;)
OpenWindow.document.close()
}
</script>
</head>
<body>
<a href="#" onclick="openwin()">打开一个窗口</a>
<input type="button" onclick="openwin()" value="打开窗口">
</body>
</html>
看看OpenWindow.document.write()里面的代码不就是标准的HTML吗?只要按照格式写更多的行即可。千万注意多一个标签或少一个标签都会出现错误。记住用OpenWindow.document.close()结束啊。

【终极应用——弹出窗口的Cookie控制】
回想一下,上面的弹出窗口虽然酷,但是有一点小毛病(你沉浸在喜悦之中,一定没有发现吧?)比如你将上面的脚本放在一个需要频繁经过的页面里(例如首页),那么每次刷新这个页面,窗口都会弹出一次,是不是非常烦人?有解决的办法吗?Yes!Follow me。我们使用Cookie来控制一下就可以了。
首先,将如下代码加入主页面HTML的<HEAD>区:

<script>
function openpopup(){
window.open("hello.htm","","width=300,height=300") //自己修改弹出窗口
}

function get_cookie(Name) {
var search = Name + "="
var returnvalue = "";
if (documents.cookie.length > 0) {
offset = documents.cookie.indexOf(search)
if (offset != -1) { // if cookie exists
offset += search.length
// set index of beginning of value
end = documents.cookie.indexOf(";", offset);
// set index of end of cookie value
if (end == -1)
end = documents.cookie.length;
returnvalue=unescape(documents.cookie.substring(offset, end))
}
}
return returnvalue;
}

function loadpopup(){
if (get_cookie('popped')==''){
openpopup()
documents.cookie="popped=yes"
}
}

</script>
</head>

将如下代码键入BODY区:
<body onunload="loadpopup()"> //pop when leave page
或者:
<body onload="loadpopup()"> //pop when enter page

你可以试着刷新一下这个页面或重新进入该页面,窗口再也不会弹出了。真正的Pop-Only-Once!
写到这里,弹出窗口的制作和应用技巧基本上算是讲完了,希望对正在制作网页的朋友有所帮助我就非常欣慰了。
需要注意的是,JS脚本中的大小写最好前后保持一致。

没有菜单、工具栏、地址栏的弹出窗口:

<script language="java script">
<!--
var gt = unescape(’%3e’);
var popup = null;
var over = "Launch Pop-up Navigator";
popup = window.open(’’, ’popupnav’, ’width=500,height=500,resizable=0,scrollbars=auto’); // width=500,height=500为窗口长和宽
if (popup != null) {
if (popup.opener == null) {
popup.opener = self; }
popup.location.href = ’要打开的文件名’;
}
// -->
</script>


方法二:Cookies应用:控制弹出窗口 当我们在一个页面中设置一个POP弹出窗口后,每次只要重新浏览该页面,POP窗口就会自动弹出来,造成不必要的麻烦。那么怎么解决这个问题呢? 我在这里用一个简单的例子讲解一下如何通过操作Cookies让弹出窗口只在第一次浏览该页面时弹出,以后就不再招人烦了!

 

 

<script> function openpopwindow() { window.open("hello.htm","","width=200,height=200" //自己修改弹出窗口 } function get_cookie(Name) { var search = Name + "="; var returnvalue = ""; if (documents.cookie.length > 0) { offset = documents.cookie.indexOf(search); if (offset != -1) { // 如果以前有cookies记录 offset += search.length; // 设置cookie的起始位置 end = documents.cookie.indexOf(";", offset); // 设置cookie的结束位置 if (end == -1) end = documents.cookie.length; returnvalue=unescape(documents.cookie.substring(offset, end)) } } return returnvalue; } function loadpopup() { if (get_cookie('popped')=='') { openpopwindow(); documents.cookie="popped=yes"; } } </script>

将上面的代码键入BODY区: <body onunload="loadpopup()"> //离开页面的时候弹出
或者: <body onload="loadpopup()"> //打开页面的时候弹出


离开页面时弹开窗口效果:

效果:别人关闭这个页面的时候,弹出一个窗口,你可以写一些祝福的话
核心代码:
<script LANGUAGE="javascript">
<!--Begin function leave(){
window.open
('1.htm',",'toolbar=no,menubar=no,location=no,height=225,width=235');
break
}
//END-->
</script>

posted @ 2009-11-05 18:10 肖马辉 阅读(1507) | 评论 (0)编辑 收藏
 
Zend是众多开源成功故事之一的主角,它遵循了已在MySQL和Subversion中被证明成功的模式,针对那些需要高可靠性、高可扩展性Web应用服务器的企业客户,提供技术支持和商用软件。

  此前,该公司已经宣布推出了Zend Server软件,这是一个在一台到三台服务器上运行PHP应用的高度集成平台。它包含一个高速代码缓存功能,可以让PHP应用更快速运行。它还可以监控用户服务器上的所有PHP脚本,当运行缓慢或出错时向用户告警。

  现在,Zend正在推出其企业软件的精简免费版,在Zend Server社区版中,用户可以获得同样的高性能代码执行和管理界面,但是不会获得技术支持,而且当PHP更新发布时,不会获得即时升级。尽管如此,用户至少可以使用其强大的功能,轻松节省昂贵的硬件升级成本。

  Zend创始人济夫•苏拉斯基(Zeev Suraski)最近接受了媒体采访,谈论了Zend Server社区版与其非免费版本的关系,以及其团队为何花费了如此长时间来开发PHP 6等。

  记者:Zend Server与现有Zend平台软件有何异同?

  苏拉斯基:开始阶段,我们计划同时运作管理这两款产品,其中Zend Server针对单服务器解决方案,最多两、三台服务器;而Zend平台针对大型集群环境。我们决定逐渐推出Zend Server战略,因此未来我们计划在Zend Server上增加群集支持功能,以及对其增加Zend平台上的其它功能和新功能。

  记者:也就是说,你的计划是把Zend平台的功能加入到Zend Server中?

  苏拉斯基:对,不过不仅仅增加来自Zend平台的功能,我们还将改进其用户界面和易用性,因此未来在群集版Zend Server中你不会看到完全相同的功能,而是它们的改进版;或者具有更高的性能,或者是全新的功能。

  记者:Zend Server的关键特点之一是,它是一个高度集成的解决方案,具有以更优化方式配置运行的软件。但用户已经有了MySQL和Apache,是否真的还需要Zend Server?

  苏拉斯基:这要看你使用什么操作系统。如果你在一个已经安装Apache的Linux系统上安装它,那么你无需安装一个新Apache,只需使用系统自带的Apache即可。但是如果你使用其它系统,你可以通过Zend Server来安装Apache,这将非常方便。

  记者:用户能使用系统自带的PHP吗?

  苏拉斯基:不能。用户必须使用Zend Server中的PHP。从技术的角度讲,你或许可以这么做,但是我们不建议这么做,也不对此进行支持。

  记者:Zend Server的监控代理自动跟踪脚本、数据库连接或其它PHP相关问题出错的时间,它能够保存应用程序状态,因此可以在以后进行恢复。这需要占用很多资源吗?

  苏拉斯基:如果用户的应用程序确实非常差,那么它会产生很多这种事件,保存它们的确需要花费大量时间。但一般情况下,用户的应用程序不会产生太多这种事件,其资源开销几乎可以忽略不计,大约在1%到2%之间。它取决于产生事件的数量。

  记者:是否可以说Zend正在进入以前由Java应用服务器统治的一个领域?

  苏拉斯基:在某种程度上我认为是如此。实际上在某些方面已经是一个事实。PHP已经被应用于许多关键业务应用中,并且被进行了非常大范围的部署,例如维基百科、YouTube和Flickr等。这种趋势还在增长,我们认为这非常有意义,并在Zend Server中对其进行支持。

  记者:另一方面,随着Zend Server让PHP更加面向企业,是否可以说PHP可能在失去与其最初社区的联系?

  苏拉斯基:我认为不是这样,但是我要指出的是PHP已经发展了12年到13年,它不再是新手语言。也就是说,我认为PHP社区依然在开发它,而且与使用它的社区依然保持紧密联系。PHP社区非常健康,它非常强大且依然在增长。

  PHP的关键优势是它是一个成熟的解决方案,这已经被事实证明。知道如何使用Ruby或Python部署网站的人还相对较少,它们也都是非常好的解决方案,但是它们的社区规模要比PHP社区小的多。当然,Web服务器行业有容纳多个产品的空间,我不认为PHP会被所有的网站所使用。

  记者:是否可以说社区的开源产品正在影响Zend Server免费版中的功能?举例来说,我认为PHP 6将包含一个可选代码缓存标准,你们是否会对此推出相应版本?

  苏拉斯基:这是我们决定增加的功能之一,但是它不是唯一的功能。

  可选PHP缓存(APC)将成为PHP的标准,但是它不会带来多大变化,它已经在PHP扩展库中,用户可以非常轻松的安装它,而且如果用户关注PHP 6的话,将会发现它并不会默认被启用。如果人们真的喜欢APC,可以禁用Zend Optimizer插件然后使用APC,除了小部分用户界面是Zend专用之外,其它完全相同。

  记者:PHP 6的开发时间似乎过于长了。考虑到Perl 6的情况,难道数字6是一个魔咒?或者只是计划的一部分?

  苏拉斯基:或许吧,不过我认为PHP 6将在Python 6之前推出。PHP 6是一个比PHP 4和PHP 5都更难的项目,原因有二:一是PHP的代码库现在已经如此巨大;二是每一处细小的兼容性故障都会成为很多人的噩梦。而且由于PHP 6将引入对native Unicode的支持,不可避免的会给该语言带来大量兼容性故障。坦白的说,我不知道最终结果会如何。

  记者:与从PHP 4转向PHP 5相比,从PHP 5转向PHP 6的难度如何?

  苏拉斯基:从版本4到版本5的迁移是相当成功的,只花了几年的时间,但是今天的PHP 5已经比当初的PHP 4更加普及。我们决定不着急进行升级,因此我们现在更关注PHP 5.3。

  我们决定在PHP 5.3中增加最初计划在PHP 6中推出的一些新功能,诸如命名空间,这样我们不必急于升级到PHP 6。PHP 6正式推出可能还需要一段时间。

posted @ 2009-10-27 10:17 肖马辉 阅读(110) | 评论 (0)编辑 收藏
 

//遍历option和添加、移除option
function changeShipMethod(shipping){
var len = $("select[@name=ISHIPTYPE] option").length
if(shipping.value != "CA"){
$("select[@name=ISHIPTYPE] option").each(function(){
if($(this).val() == 111){
$(this).remove();
}
});
}else{
$("<option value='111'>UPS Ground</option>").appendTo($("select[@name=ISHIPTYPE]"));
}
}


//取得下拉选单的选取值

$(#testSelect option:selected').text();
或$("#testSelect").find('option:selected').text();
或$("#testSelect").val();
//////////////////////////////////////////////////////////////////
记性不好的可以收藏下:
1,下拉框:

var cc1 = $(".formc select[@name='country'] option[@selected]").text(); //得到下拉菜单的选中项的文本(注意中间有空格)
var cc2 = $('.formc select[@name="country"]').val(); //得到下拉菜单的选中项的值
var cc3 = $('.formc select[@name="country"]').attr("id"); //得到下拉菜单的选中项的ID属性值
$("#select").empty();//清空下拉框//$("#select").html('');
$("<option value='1'>1111</option>").appendTo("#select")//添加下拉框的option

稍微解释一下:
1.select[@name='country'] option[@selected] 表示具有name 属性,
并且该属性值为'country' 的select元素 里面的具有selected 属性的option 元素;
可以看出有@开头的就表示后面跟的是属性。

2,单选框:
$("input[@type=radio][@checked]").val(); //得到单选框的选中项的值(注意中间没有空格)
$("input[@type=radio][@value=2]").attr("checked",'checked'); //设置单选框value=2的为选中状态.(注意中间没有空格)

3,复选框:
$("input[@type=checkbox][@checked]").val(); //得到复选框的选中的第一项的值
$("input[@type=checkbox][@checked]").each(function(){ //由于复选框一般选中的是多个,所以可以循环输出
alert($(this).val());
});

$("#chk1").attr("checked",'');//不打勾
$("#chk2").attr("checked",true);//打勾
if($("#chk1").attr('checked')==undefined){} //判断是否已经打勾


当然jquery的选择器是强大的. 还有很多方法.

<script src="jquery-1.2.1.js" type="text/javascript"></script>
<script language="javascript" type="text/javascript">
$(document).ready(function(){
$("#selectTest").change(function()
{
//alert("Hello");
//alert($("#selectTest").attr("name"));
//$("a").attr("href","xx.html");
//window.location.href="xx.html";
//alert($("#selectTest").val());
alert($("#selectTest option[@selected]").text());
$("#selectTest").attr("value", "2");

});
});
</script>


<a href="#">aaass</a>

<!--下拉框-->
<select id="selectTest" name="selectTest">
<option value="1">11</option>
<option value="2">22</option>
<option value="3">33</option>
<option value="4">44</option>
<option value="5">55</option>
<option value="6">66</option>
</select>
jquery radio取值,checkbox取值,select取值,radio选中,checkbox选中,select选中,及其相关获取一组radio被选中项的值
var item = $('input[@name=items][@checked]').val();
获取select被选中项的文本
var item = $("select[@name=items] option[@selected]").text();
select下拉框的第二个元素为当前选中值
$('#select_id')[0].selectedIndex = 1;
radio单选组的第二个元素为当前选中值
$('input[@name=items]').get(1).checked = true;
获取值:
文本框,文本区域:$("#txt").attr("value");
多选框checkbox:$("#checkbox_id").attr("value");
单选组radio: $("input[@type=radio][@checked]").val();
下拉框select: $('#sel').val();
控制表单元素:
文本框,文本区域:$("#txt").attr("value",'');//清空内容
$("#txt").attr("value",'11');//填充内容
多选框checkbox: $("#chk1").attr("checked",'');//不打勾
$("#chk2").attr("checked",true);//打勾
if($("#chk1").attr('checked')==undefined) //判断是否已经打勾
单选组radio: $("input[@type=radio]").attr("checked",'2');//设置value=2的项目为当前选中项
下拉框select: $("#sel").attr("value",'-sel3');//设置value=-sel3的项目为当前选中项
$("<optionvalue='1'>1111</option><optionvalue='2'> 2222</option>").appendTo("#sel")//添加下拉框的option
$("#sel").empty();//清空下拉框

获取一组radio被选中项的值
var item = $('input[@name=items][@checked]').val();
获取select被选中项的文本
var item = $("select[@name=items] option[@selected]").text();
select下拉框的第二个元素为当前选中值
$('#select_id')[0].selectedIndex = 1;
radio单选组的第二个元素为当前选中值
$('input[@name=items]').get(1).checked = true;
获取值:
文本框,文本区域:$("#txt").attr("value");
多选框checkbox:$("#checkbox_id").attr("value");
单选组radio: $("input[@type=radio][@checked]").val();
下拉框select: $('#sel').val();
控制表单元素:
文本框,文本区域:$("#txt").attr("value",'');//清空内容
$("#txt").attr("value",'11');//填充内容
多选框checkbox: $("#chk1").attr("checked",'');//不打勾
$("#chk2").attr("checked",true);//打勾
if($("#chk1").attr('checked')==undefined) //判断是否已经打勾
单选组radio: $("input[@type=radio]").attr("checked",'2');//设置value=2的项目为当前选中项
下拉框select: $("#sel").attr("value",'-sel3');//设置value=-sel3的项目为当前选中项
$("<option value='1'>1111</option><option value='2'>2222</option>").appendTo("#sel")//添加下拉框的option
$("#sel").empty();//清空下拉框

posted @ 2009-10-22 11:41 肖马辉 阅读(153) | 评论 (0)编辑 收藏
 

提交表单form1:
Private Sub Command1_Click()
WebBrowser1.Document.Forms("form1").submit
End Sub

将form1中的名为u的属性设为不可用:
Private Sub Command2_Click()
WebBrowser1.Document.Forms("form1").u.setAttribute "disabled", "disabled"
End Sub

将form1中的名为u的Text框中的内容设为abc:
Private Sub Command2_Click()
WebBrowser1.Document.Forms("form1").u.setAttribute "value", "abc"
End Sub

遍历所有标签:
For i = 0 To WebBrowser1.Document.All.length - 1
If UCase(WebBrowser1.Document.All(i).tagName) = UCase("div") Then
End If
Next i

1、获得浏览器信息:
Private Sub Command1_Click()
WebBrowser1.Navigate "http://www.applevb.com"
End Sub
Private Sub Command2_Click()
Dim oWindow
Dim oNav
Set oWindow = WebBrowser1.Document.parentWindow
Set oNav = oWindow.navigator
Debug.Print oNav.userAgent
Set oWindow = Nothing
Set oNav = Nothing
End Sub
点击Command1浏览网页,点击Command2在立即窗口中输出浏览器信息。

2、弹出Webbrowser消息窗口

Dim oWindow
Set oWindow = WebBrowser1.Document.parentWindow
oWindow.confirm "abcd"

VB调用webbrowser技巧集2

向Webbrowser中写入HTML内容的几种方法

首先在Form_Load中加入

WebBrowser1.Navigate "about:blank"

确保Webbrowser1可用


方法1:

Dim s As String
Dim stream As IStream

s = ""
s = s + ""
s = s + ""
s = s + "

hello world

"
s = s + ""
s = s + "
WebBrowser1.Document.Write s


方法2:

Dim o

Set o = WebBrowser1.Document.selection.createrange
Debug.Print o
If (Not o Is Nothing) Then
o.pasteHTML "哈哈"
Set o = Nothing
End If


方法3:

'插入文本框
Dim o

Set o = WebBrowser1.Document.selection.createrange

o.execCommand "InsertTextArea", False, "xxx"

vb调用Webbrowser技巧集3
1、页面滚动:

Private Sub Command2_Click()
WebBrowser1.Document.parentwindow.scrollby 0, 30
End Sub

Private Sub Form_Load()
WebBrowser1.Navigate "http://www.applevb.com"
End Sub


点击Command2就可以使当前页面向下滚动30像素


2、判断页面是否可以前进后退

Private Sub Command1_Click()
WebBrowser1.GoForward
End Sub

Private Sub Command2_Click()
WebBrowser1.GoBack
End Sub

Private Sub Form_Load()
WebBrowser1.Navigate "http://www.applevb.com"
End Sub

Private Sub WebBrowser1_CommandStateChange(ByVal Command As Long, ByVal Enable As Boolean)
If (Command = CSC_NAVIGATEBACK) Then
Command2.Enabled = Enable
End If
If (Command = CSC_NAVIGATEFORWARD) Then
Command1.Enabled = Enable
End If
End Sub

VB调用webbrowser技巧集4

1、如何使网页不出现滚动条:

Private Sub mnuScroll1_Click()
@#注意:必须在网页完全显示之后才可以运行
WebBrowser1.Document.body.Scroll = "no" @#不显示滚动条的办法
End Sub
Private Sub mnuScroll2_Click()
@#注意:必须在网页完全显示之后才可以运行
WebBrowser1.Document.body.Scroll = "Auto" @#显示滚动条的办法
End Sub

2、如何获得网页中被选中部分的HTML:

Private Sub Command1_Click()
Dim objSelection
Dim objTxtRange

Set objSelection = WebBrowser1.Document.selection
If Not (objSelection Is Nothing) Then
Set objTxtRange = objSelection.createRange
If Not (objTxtRange Is Nothing) Then
Debug.Print objTxtRange.htmlText

Set objTxtRange = Nothing
End If
Set objSelection = Nothing
End If
End Sub

Private Sub Form_Load()
WebBrowser1.Navigate "http://www.applevb.com"
End Sub

Navigate 方 法 的 语 法 格 式 为:

WebBrowser 控 件 名.Navigate URL
[Flags,][TargetFrameName,][PostData,][Headers]

---- WebBrowser 控 件 支 持 的 主 要 方 法 有:

GoBack — — — 回 退 到 上 一 屏。
GoForward — — — 进 入 到 下 一 屏。
GoHome — — — 回 家。 即 回 到 主 页。
Stop — — — 停 止 导 航。
Refresh — — — 刷 新。
Navigate — — — 导 航。

---- WebBrowser 控 件 所 响 应 的 事 件:

---- BeforeNavigate 事 件 — — — 在 开 始 导 航 前 发 生。 一 般 在 此 获 取 完 整 的URL 字 符 串。

---- WebBrowser 控 件 最 主 要 的 参 数:

---- URL — — — 获 得 导 航 用 的 标 准URL 字 符 串。 例 如: 它 能 将”www.MicroSoft.Com” 自 动 翻 译 为”http://www.MicroSoft.Com”.URL 是Uniform Resource Locator 的 缩 写, 是 在Internet 的WWW 服 务 程 序 上 用 于 指 定 信 息 位 置 的 表 示 方 法。

使用WebBrowser的Navigator或者Navigator2方法打开一个asp文档并且传递

参数进去,但是asp文档无法获得参数,请教是什么原因?

vb源码:
Private Sub cmdSubmit_Click()
Dim strURL As String, strFormData As String
Dim strData As String
strURL = Trim$(txtURL.Text)
strFormData = "name=" & Trim$(txtName.Text) &

"&password=" & Trim$(txtPassword.Text)
Call WBTest.Navigate2(strURL, 64, "_blank", strFormData,

"hello")
End Sub

asp源码:

<%@ Language=VBScript %>
<%
dim strName
dim strPassword
strName=Trim(Request.Form("name"))
strPassword=Trim(Request.Form("password"))
Response.Write(strName)
Response.Write(strPassword)
if strName="KingZhang" and strPassword="123456" then
Response.Write("登陆成功")
else
Response.Write("非法登陆用户!")
end if

%>

*********************************************************************

Option Explicit

Private Sub Command1_Click()
Dim szValue As String
WebBrowser1.Document.body.innerHTML = "


method=post action=http://地址/xxx.php>
"
WebBrowser1.Document.Forms("post").submit
End Sub

Private Sub Form_Load()
WebBrowser1.Navigate2 "about:blank"
End Sub
Top


********************************************************************

请问:在WebBrwoser控件里提供的Navigate或者Navigate2方法中提供了传递数据

的参数,调用方式为:WebBrowser1.Navigate2(URL,[Flags],

[TargetFrameName],[PostData],[Headers])
其中PostData参数就是一个提交参数字符串,例如"name=aaa&password=123",

但问题是为什么这个方法并不是有效的,服务器端不能取得数据?
如果这个方法是有效的话就不需要用一段html代码模拟这种调用了。

下面代码能检测出程序post出去的消息

Private Sub WebBrowser1_BeforeNavigate2(ByVal pDisp As Object, URL As Variant, Flags As Variant, TargetFrameName As Variant, PostData As Variant, Headers As Variant, Cancel As Boolean)
MsgBox PostData
End Sub

WebBrowser的8个方法和13个属性

WebBrowser的8个方法和13个属性,以及它们的功能:

方法 说明
 GoBack 相当于IE的“后退”按钮,使你在当前历史列表中后退一项

 GoForward 相当于IE的“前进”按钮,使你在当前历史列表中前进一项
 GoHome 相当于IE的“主页”按钮,连接用户默认的主页
 GoSearch 相当于IE的“搜索”按钮,连接用户默认的搜索页面
 Navigate 连接到指定的URL
 Refresh 刷新当前页面
 Refresh2 同上,只是可以指定刷新级别,所指定的刷新级别的值来自RefreshConstants枚举表,
该表定义在ExDisp.h中,可以指定的不同值如下:
REFRESH_NORMAL 执行简单的刷新,不将HTTP pragma: no-cache头发送给服务器
REFRESH_IFEXPIRED 只有在网页过期后才进行简单的刷新
REFRESH_CONTINUE 仅作内部使用。在MSDN里写着DO NOT USE! 请勿使用
REFRESH_COMPLETELY 将包含pragma: no-cache头的请求发送到服务器

 Stop 相当于IE的“停止”按钮,停止当前页面及其内容的载入
属性 说明
 Application 如果该对象有效,则返回掌管WebBrowser控件的应用程序实现的自动化对象(IDispatch)。如果在宿主对象中自动化对象无效,这个程序将返回WebBrowser
控件的自动化对象
 Parent 返回WebBrowser控件的父自动化对象,通常是一个容器,例如是宿主或IE窗口
 Container 返回WebBrowser控件容器的自动化对象。通常该值与Parent属性返回的值相同
 Document 为活动的文档返回自动化对象。如果HTML当前正被显示在WebBrowser中,则
Document属性提供对DHTML Object Model的访问途径
 TopLevelContainer 返回一个Boolean值,表明IE是否是WebBrowser控件顶层容器,是就返回true

 Type 返回已被WebBrowser控件加载的对象的类型。例如:如果加载.doc文件,就会返
回Microsoft Word Document
 Left 返回或设置WebBrowser控件窗口的内部左边与容器窗口左边的距离
 Top 返回或设置WebBrowser控件窗口的内部左边与容器窗口顶边的距离
 Width 返回或设置WebBrowser窗口的宽度,以像素为单位
 Height 返回或设置WebBrowser窗口的高度,以像素为单位
 LocationName 返回一个字符串,该字符串包含着WebBrowser当前显示的资源的名称,如果资源
是网页就是网页的标题;如果是文件或文件夹,就是文件或文件夹的名称
 LocationURL 返回WebBrowser当前正在显示的资源的URL
 Busy 返回一个Boolean值,说明WebBrowser当前是否正在加载URL,如果返回true
就可以使用stop方法来撤销正在执行的访问操作

如何利用 WebBrowser 控件,显示 .GIF 动画?

要有一定的网页知识(HTML、JavaScript、CSS)
注意细节:
没有"滚动条"和"鼠标右键弹出的 IE 上下文菜单",".HTM 源文件" ...
我写了一个,效果还真不错!

'Objects: Form1、Command1、CommonDialog1、WebBrowser1
Option Explicit
Private Sub Command1_Click()
CommonDialog1.ShowOpen
If VBA.Len(VBA.Trim(CommonDialog1.FileName)) > 0 Then
Dim p As stdole.StdPicture
Dim sPath As String
sPath = VBA.Trim(VBA.Trim(CommonDialog1.FileName))
Set p = VB.LoadPicture(sPath)
WebBrowser1.Width = p.Width * 16 / 26
WebBrowser1.Height = p.Height * 16 / 26
' WebBrowser1.Navigate "about:blank"
WebBrowser1.Document.open
WebBrowser1.Document.writeln ""
WebBrowser1.Document.writeln ""
WebBrowser1.Document.writeln ""
WebBrowser1.Document.writeln ""
WebBrowser1.Document.writeln "WebBrowser1.Document.writeln "
WebBrowser1.Document.writeln "WebBrowser1.Document.writeln "
"
WebBrowser1.Document.writeln ""
WebBrowser1.Document.writeln ""
End If
End Sub
Private Sub Form_Load()
Command1.Caption = "&Open"
WebBrowser1.Navigate "about:blank"
WebBrowser1.Document.open
WebBrowser1.Document.writeln ""
WebBrowser1.Document.writeln ""
WebBrowser1.Document.writeln ""
WebBrowser1.Document.writeln ""
WebBrowser1.Document.writeln "WebBrowser1.Document.writeln ""
WebBrowser1.Document.writeln ""
WebBrowser1.Document.Close
End Sub

WebBrowser控件说明
方法 说明
 GoBack 相当于IE的“后退”按钮,使你在当前历史列表中后退一项

 GoForward 相当于IE的“前进”按钮,使你在当前历史列表中前进一项
 GoHome 相当于IE的“主页”按钮,连接用户默认的主页
 GoSearch 相当于IE的“搜索”按钮,连接用户默认的搜索页面
 Navigate 连接到指定的URL
 Refresh 刷新当前页面
 Refresh2 同上,只是可以指定刷新级别,所指定的刷新级别的值来自RefreshConstants枚举表,
该表定义在ExDisp.h中,可以指定的不同值如下:
REFRESH_NORMAL 执行简单的刷新,不将HTTP pragma: no-cache头发送给服务器
REFRESH_IFEXPIRED 只有在网页过期后才进行简单的刷新
REFRESH_CONTINUE 仅作内部使用。在MSDN里写着DO NOT USE! 请勿使用
REFRESH_COMPLETELY 将包含pragma: no-cache头的请求发送到服务器

 Stop 相当于IE的“停止”按钮,停止当前页面及其内容的载入

属性 说明
 Application 如果该对象有效,则返回掌管WebBrowser控件的应用程序实现的自动化对象(IDispatch)。如果在宿主对象中自动化对象无效,这个程序将返回WebBrowser
控件的自动化对象
 Parent 返回WebBrowser控件的父自动化对象,通常是一个容器,例如是宿主或IE窗口
 Container 返回WebBrowser控件容器的自动化对象。通常该值与Parent属性返回的值相同
 Document 为活动的文档返回自动化对象。如果HTML当前正被显示在WebBrowser中,则
Document属性提供对DHTML Object Model的访问途径
 TopLevelContainer 返回一个Boolean值,表明IE是否是WebBrowser控件顶层容器,是就返回true

 Type 返回已被WebBrowser控件加载的对象的类型。例如:如果加载.doc文件,就会返
回Microsoft Word Document
 Left 返回或设置WebBrowser控件窗口的内部左边与容器窗口左边的距离
 Top 返回或设置WebBrowser控件窗口的内部左边与容器窗口顶边的距离
 Width 返回或设置WebBrowser窗口的宽度,以像素为单位
 Height 返回或设置WebBrowser窗口的高度,以像素为单位
 LocationName 返回一个字符串,该字符串包含着WebBrowser当前显示的资源的名称,如果资源
是网页就是网页的标题;如果是文件或文件夹,就是文件或文件夹的名称
 LocationURL 返回WebBrowser当前正在显示的资源的URL
 Busy 返回一个Boolean值,说明WebBrowser当前是否正在加载URL,如果返回true
就可以使用stop方法来撤销正在执行的访问操作


WebBrowser 的事件
Private Events Description
BeforeNavigate2 导航发生前激发,刷新时不激发
CommandStateChange 当命令的激活状态改变时激发。它表明何时激活或关闭Back和Forward
菜单项或按钮
DocumentComplete 当整个文档完成是激发,刷新页面不激发
DownloadBegin 当某项下载操作已经开始后激发,刷新也可激发此事件
DownloadComplete 当某项下载操作已经完成后激发,刷新也可激发此事件
NavigateComplete2 导航完成后激发,刷新时不激发
NewWindow2 在创建新窗口以前激发
OnFullScreen 当FullScreen属性改变时激发。该事件采用VARIENT_BOOL的一个输
入参数来指示IE是全屏显示方式(VARIENT_TRUE)还是普通显示方式(VARIENT_FALSE)
OnMenuBar 改变MenuBar的属性时激发,标示参数是VARIENT_BOOL类型的。
VARIANT_TRUE是可见,VARIANT_ FALSE是隐藏
OnQuit 无论是用户关闭浏览器还是开发者调用Quit方法,当IE退出时就会激发
OnStatusBar 与OnMenuBar调用方法相同,标示状态栏是否可见。
OnToolBar 调用方法同上,标示工具栏是否可见。
OnVisible 控制窗口的可见或隐藏,也使用一个VARIENT_BOOL类型的参数
StatusTextChange 如果要改变状态栏中的文字,这个事件就会被激发,但它并不理会程序是否有状态栏
TitleChange Title有效或改变时激发
WEBBROWSER 技巧(收藏)

看到很多关于WebBrowser控件禁止右键的提问,回复的方法很多,其中有提到使用微软提供的Webbrowser扩展COM服务器对象(WBCustomizer.dll),但是该方法在我们想使用Webbrowser编辑网页(Webbrowser1.Document.execCommand editMode)的时候有很多弊端,比如不能显示选中的文本等。另有些方法也就不用一一列举了。

这儿我想提到的是关于MSHTML.HTMLDocument

引用Microsoft HTML OBject Library

Rem #窗体代码#

Dim WithEvents M_Dom As MSHTML.HTMLDocument
Private Function M_Dom_oncontextmenu() As Boolean
M_Dom_oncontextmenu = False
End Function

Private Sub Webbrowser1_DownloadComplete()
Set M_Dom = Webbrowser1.Document
End Sub

Rem 好了,右键菜单没有了

=======================================================================

控件调用和获得收藏夹里面

基本上用 specialfolder(6 ) 就可以得到收藏夹的路径, 然后你可以用dir去循环读入每个目录,然后dir里面的file, file的名字就是你要的收藏的名字, 路径可以自己根据从上面得到的路径去得到.
如果你不用dir也可以用vb的dir控件.
Private Type SHITEMID
cb As Long
abID As Byte
End Type

Public Type ITEMIDLIST
mkid As SHITEMID
End Type
Public Function SpecialFolder(ByRef CSIDL As Long) As String
locate the favorites folder
Dim R As Long
Dim sPath As String
Dim IDL As ITEMIDLIST
Const NOERROR = 0
Const MAX_LENGTH = 260
R = SHGetSpecialFolderLocation(MDIMain.hwnd, CSIDL, IDL)
If R = NOERROR Then
sPath = Space$(MAX_LENGTH)
R = SHGetPathFromIDList(ByVal IDL.mkid.cb, ByVal sPath)
If R Then
SpecialFolder = Left$(sPath, InStr(sPath, vbNullChar) - 1)
End If
End If
End Function
================================================================

是的,webbrowser本生是一个控件, 你要它全屏,就是要它所在的窗体全屏, 可以用setwindowlong取消窗体的 title, 用Call ShowWindow(FindWindow(Shell_traywnd, ), 0) 隐藏tray,就是下边那个包含开始那一行. 用Call ShowWindow(FindWindow(Shell_traywnd, ), 9) 恢复. 够详细了吧.

然后在form1.windowstate = 2 就可以了.

====================================================================
选择网页上的内容。
Private Sub Command1_Click()
请先选中一些内容
Me.WebBrowser1.ExecWB OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT
MsgBox Clipboard.GetText
End Sub

=============================================================
用IE来下载文件
Private Declare Function DoFileDownload Lib shdocvw.dll (ByVal lpszFile As String) As Long


Private Sub Command1_Click()

Dim sDownload As String

sDownload = StrConv(Text1.Text, vbUnicode)
Call DoFileDownload(sDownload)

End Sub

保存webbrowser中的HTML内容
Dim oPF As IPersistFile
Set oPF = WebBrowser1.Document
oPF.Save "TheFileNameHere.htm", False

WebBrowser1.ExecWB怎么用

下面是我测试的参数
WB.ExecWB(4,1)

4,1 保存网页
4,2 保存网页(可以重新命名)
6,1 直接打印
6,2 直接打印
7,1 打印预览
7,2 打印预览
8,1 选择参数
8,2 选择参数
10,1 查看页面属性
10,2 查看页面属性
17,1 全选
17,2 全选
22,1 重新载入当前页
22,2 重新载入当前页

webbrowser确定对话框的正确方法
webbrowser确定窗口对话框

某些网页出于各种考虑会弹出对话框要求信息确认,往往会中断我们的webbrowser过程,可以使用如下方法:
1.加入Microsoft Html Object
2.加入语句

Private Sub WebBrowser1_NavigateComplete2(ByVal pDisp As Object, URL As Variant)
Dim obj As HTMLDocument
Set obj = pDisp.Document
obj.parentWindow.execScript "function showModalDialog(){return;}" '对showModalDialog引起的对话框进行确定
End Sub
而confirm引发的对话确定框可用confirm替换showModalDialog即可,Alert等同理~

WebBrowser取得网页源码Private Sub Command1_Click()
WebBrowser1.Navigate "http://www.sdqx.gov.cn/sdcity.php"
End Sub

Private Sub WebBrowser1_DownloadComplete()
'页面下载完毕
Dim doc, objhtml
Set doc = WebBrowser1.Document

Set objhtml = doc.body.createtextrange()
If Not IsNull(objhtml) Then
Text1.Text = objhtml.htmltext
End If

End Sub

我用WebBrowser取得网页源码,直接运行正常,但在编译后出错

提示:实时错误“91” Object 变量或 with 块变量没有设置
可能是没有下载完所致,

Private Sub WebBrowser1_DownloadComplete()
if webbrowser.busy=false then
Dim doc, objhtml
Set doc = WebBrowser1.Document

Set objhtml = doc.body.createtextrange()
If Not IsNull(objhtml) Then
Text1.Text = objhtml.htmltext
End If
end if
End Sub

 

posted @ 2009-09-21 13:41 肖马辉 阅读(671) | 评论 (0)编辑 收藏
 

Windows XP + Apache 2.2.4 + PHP 5.2.3 + MySQL 5.0.27 + Zend Optimizer 3.3.0环境配置说明(推荐)
2007年08月24日 星期五 下午 02:56

以下为本说明所要用到的软件及相关网站,zend网站下载需要注册一个用户。
Apache 2.2.4 — www.apache.org
PHP 5.2.3 — www.php.net
MySQL 5.0.27 — www.mysql.com
Zend Optimizer 3.3.0 — www.zend.com
phpMyAdmin 2.9.2 — www.phpmyadmin.net

≡ Apache 2.2.4 的安装 ≡

打开我的电脑,进入D盘,在其下新建一个文件夹,名为 local 。
到其官方站点下载 apache_2.2.4-win32-x86-no_ssl.msi 并执行。
按3次Next按钮,安装程序要求输入你的Network Domain(网络域名)、Server Domain(服务器域名)和网站管理员的E-mail,有的话就如实填写,本说明介绍的是本地自建测试环境,所以随便一下,前两个填 localhost ,邮件写自己的即可。
进入Next后,默认的安装路径是”C:\Program Files\Apache Software Foundation\Apache2.2\”,修改路径,改为前面所述的”D:\local\Apache2″。
然后一路下去,直到安装结束;此时,打开D盘下的local文件夹,可以看到有一个名为Apache2的文件夹。
打开IE,然后在地址栏输入:”http://localhost” 或者 “http://127.0.0.1″ 可以看到Apache安装完成的成功页面;以后网页的存在位置就在 “D:\webserver\Apache2\htdocs” 目录。

≡ PHP 5.2.3 的安装 ≡

到其官方站点下载 php-5.2.3-Win32.zip 并解压(在此不要下载及使用它的Installer,这种方式虽然很自动化、很智能,但也存在很多方面的限制,因为不推荐。)
将PHP文件解压到一个目录下,目录地址为 “D:\webserver\php5″。
将PHP目录(D:\webserver\php5)下的php.ini-dist复制到windows(有的系统是winnt目录)目录下,并改名为php.ini。
复制D:\local\php目录下的所有dll文件到windows的系统文件夹里,即:C:\windows\system32。

≡ MySQL 5.0.27 的安装 ≡

1.打开我的电脑,进入D:\webserver,在其下新建一个文件夹,名为 mysql5 。
2.到其官方站点下载 Mysql 5.0.27 Installer 并执行。
3.按Next,然后选择Custom安装方式。
4.点击Change,改变安装路径;原路径是”C:\Program Files\MySQL\MySQL Server 5.0\”,这里改为:”D:\webserver\mysql5\”。
5.等安装进度条load完时,会出现一个Sign Up向导,这里不用理,选择最下面的那个Skip Sign-Up,然后Next,上面有个 “Configure the MySQL Server now” 是打勾的,不要去掉,直接点Finish。
6.现在开始安装最后的配置,点Next,选择Detailed Configuration,然后选择第二个Server Machine。
7.再Next,选择Non-Transactional Database Only。
8.再Next,选择Manual Setting,连接数选择200到300,在此因为是本机测试,所以此项并不重要。
9.再Next,是设置其的端口,默认是3306,不要动它。
10.再Next,选择Manual Selected Default Character Set / Collation,在下面的 Character Set选择gbk。
11.再Next,在Include Bin Directory in Windows PATH前打勾。
12.再Next,在Modify Security Settings前的勾取消,因为是本地环境,非服务器和虚拟主机。
13.最后一个Next再加Execute,可以看到上面的步骤全部完成。
14.MySQL的帐号是:root,密码为空(安装过程中有定义)。
15.检测MySQL,键盘的Win + R,弹出运行对话框,输入cmd后回车,进入命令提示符,然后输入:”net start mysql”(注意空格),如提示您要的服务已经启动,表示全部安装成功。

≡ Apache 与 PHP 的配置 ≡

开始菜单的程序的Apache HTTP Server 2.2.4,再进入下一级的Configure Apache Server,这时可以看到那个Edit the Apache httpd.conf Configuration File。点一下。
1.查找:
#LoadModule ssl_module modules/mod_ssl.so
在下面添加:
LoadModule php5_module “d:/webserver/php5/php5apache2_2.dll”
2.查找:
DirectoryIndex index.html
3.替换:
DirectoryIndex index.html index.htm index.php default.php
4.查找:
AddType application/x-gzip .gz .tgz
在下面添加:
AddType application/x-httpd-php .php
Apache配置结束,现在开始进行PHP配置,用Notepad打开C:\windows\php.ini。
5.查找:
extension_dir = “./”
6.替换:
extension_dir = “d:/webserver/php5/ext/”
7.查找:
upload_max_filesize = 2M
这里的意思为修改上传文件的最大限制,默认为2M,可以改为6M。
8.查找:
;extension=php_mbstring.dll
将前面的;号去掉。
9.查找:
;extension=php_gd2.dll
将前面的;号去掉。
10.查找:
;extension=mysql.dll
将前面的;号去掉。
11.查找:
;date.timezone =
替换:
date.timezone = PRC
文件修改完毕,此时,双击右下角任务栏的Apache图标,弹出的窗口中,点Stop停止服务,等停止后再点Start启动服务,此时,可以看到其窗口的状态栏中会显示:”Apache/2.2.4 (Win32) PHP/5.2.0″。配置全部完成。

≡ phpMyAdmin 2.9.2 的安装 ≡

到其官方站点下载 phpMyAdmin-2.9.2.zip 并解压,并更改目录名为phpmyadmin,然后移动到”d:\webserver\Apache2\htdocs”。
编辑:libraries下的config.default.php。
查找:
$cfg[’Servers’][$i][’auth_type’] = ‘config’; // Authentication method (config, http or cookie based)?
$cfg[’Servers’][$i][’user’] = ‘root’; // MySQL user
$cfg[’Servers’][$i][’password’] = ”; // MySQL password (only needed
// with ‘config’ auth_type)
$cfg[’Servers’][$i][’nopassword’] = FALSE; // Whether to try to connect without password
$cfg[’Servers’][$i][’only_db’] = ”; // If set to a db-name, only
// this db is displayed in left frame
// It may also be an array of db-names, where sorting order is relevant.
这里由于是本地测试环境,所以所按默认值,不需要更改。
查找:
$cfg[’DefaultLang’] = ‘en-iso-8859-1′;
替换:
$cfg[’DefaultLang’] = ‘gb2312′;
查找:
$cfg[’DefaultCharset’] = ‘iso-8859-1′;
替换:
$cfg[’DefaultCharset’] = ‘gb2312′;
设置完成。现在打开IE,键入:”http://localhost/phpmyadmin”,即可进行相关操作。
 

posted @ 2009-08-18 21:57 肖马辉 阅读(375) | 评论 (0)编辑 收藏
 

一般来说,您可以使用IIS来完成自定义的操作。IIS 拥有一套自己独特的自定义错误,提供的反馈量较默认的 HTTP 1.1错误消息更大,而且更为"友好"。例如,默认的 HTTP 1.1 404 错误消息所包含的"找不到对象"语句已被扩展为:"Web 服务器找不到要求的文件/脚本。请检查 URL 以确保路径正确。如果问题仍然存在,请与服务器管理员联系。"默认情况下,在 IIS 管理单元的"默认Web站点"中设置这些详细的自定义错误消息。 

自定义错误消息作为列表显示在 IIS 的管理单元中。IIS 将此管理单元看作单个属性。例如,在 Web 站点级配置一组自定义错误消息之后,该服务器下的所有目录都将继承整个自定义错误消息列表。也就是说,两个自定义错误消息列表(对于服务器和目录)并不合而为一。 

-------------------------------------------------------------------------------- 

自定义错误消息分类说明 

错误代码:400 

400错误是由于不正确的请求造成的,说明正在搜索的网页可能已经删除、更名或暂时不可用。 

错误代码:401.1 

401.1错误是由于登陆失败造成的,说明没有权限查看该目录或网页。 

错误代码:401.2 

401.2错误是由于服务器配置问题而导致登陆失败,由于服务器端脚本未能正确发送 WWW 身份验证头文件字段。如果要通过 Active Server Pages 脚本完成此项任务,可以使用"Response"对象的"AddHeader"方法来要求客户端用特定身份验证方法访问资源。 

错误代码:401.3 

401.3错误是由于资源上的 ACL 导致未被授权而无权访问网页或目录。 

错误代码:401.4 

401.4错误是由于筛选器导致授权失败。如果Web 服务器安装了筛选器程序以检查连接到服务器的用户。该筛选器程序能够禁止通过连接到服务器的身份验证来访问资源。 

错误代码:401.5 

401.5错误是由于 ISAPI/CGI 应用程序导致授权失败。如果所要访问的 Web 服务器地址上安装了 ISAPI 或 CGI 程序用于在继续执行之前检验用户证书。该程序能够禁止通过连接到服务器的身份验证证书来访问资源。 

错误代码:403.1 

403.1错误是由于"执行"访问被禁止而造成的,若试图从目录中执行 CGI、ISAPI 或其他可执行程序,但该目录不允许执行程序时便会出现此种错误。 

错误代码:403.2 

403.2错误是由于"读取"访问被禁止而造成的。导致此错误是由于没有可用的默认网页并且没有对目录启用目录浏览,或者要显示的 HTML 网页所驻留的目录仅标记为"可执行"或"脚本"权限。 

错误代码:403.3 

403.3错误是由于"写入"访问被禁止而造成的,当试图将文件上载到目录或在目录中修改文件,但该目录不允许"写"访问时就会出现此种错误。 

错误代码:403.4 

403.4错误是由于要求SSL而造成的,您必须在要查看的网页的地址中使用"https"。 

错误代码:403.5 

403.5错误是由于要求使用 128 位加密算法的 Web 浏览器而造成的,如果您的浏览器不支持128位加密算法就会出现这个错误,您可以连接微软网站进行浏览器升级。 

错误代码:403.6 

403.6错误是由于IP 地址被拒绝而造成的。如果服务器中有不能访问该站点的 IP 地址列表,并且您使用的 IP 地址在该列表中时您就会返回这条错误信息。 

错误代码:403.7 

403.7错误是因为要求客户证书,当需要访问的资源要求浏览器拥有服务器能够识别的安全套接字层 (SSL) 客户证书时会返回此种错误。 

错误代码:403.8 

403.8错误是由于禁止站点访问而造成的,若服务器中有不能访问该站点的 DNS 名称列表,而您使用的 DNS 名称在列表中时就会返回此种信息。请注意区别403.6与403.8错误。 

错误代码:403.9 

403.9错误是由于连接的用户过多而造成的,由于Web 服务器很忙,因通讯量过多而无法处理请求时便会返回这条错误。 

错误代码:403.10 

403.10错误是由于无效配置而导致的错误,当您试图从目录中执行 CGI、ISAPI 或其他可执行程序,但该目录不允许执行程序时便会返回这条错误。 
 
 
 
 作者:翼狱之风    2007-2-11 08:06   回复此发言   
 
--------------------------------------------------------------------------------
 
2 IIS自定义错误详解 
 
错误代码:403.11 

403.11错误是由于密码更改而导致无权查看页面。 

错误代码:403.12 

403.12错误是由于映射器拒绝访问而造成的。若要查看的网页要求使用有效的客户证书,而您的客户证书映射没有权限访问该 Web 站点时就会返回映射器拒绝访问的错误。 

错误代码:403.13 

403.13错误是由于需要查看的网页要求使用有效的客户证书而使用的客户证书已经被吊销,或者无法确定证书是否已吊销造成的。 

错误代码:403.15 

403.15错误是由于客户访问许可过多而造成的,当服务器超出其客户访问许可限制时会返回此条错误。 

错误代码:403.16 

403.16错误是由于客户证书不可信或者无效而造成的。 

错误代码:403.17 

403.17错误是由于客户证书已经到期或者尚未生效而造成的。 

错误代码:404.1 

404.1错误表明所访问 Web 站点的 IP 地址不接受对端口(请求的来源端口)的请求。一般来说,404.1 错误只会出现在具有多个 IP 地址的计算机上。如果在特定 IP 地址/端口组合上收到客户请求,而且在特定的端口上 IP 地址并没有设置为侦听,则 IIS 将返回 404.1 HTTP 错误。例如,如果一台计算机有两个 IP 地址,而只将其中一个 IP 地址配置为在端口 80 上侦听,则其它 IP 地址从端口 80 收到的任何请求都将导致 IIS 返回 404.1 错误。只应在服务级设置这一错误,因为只有当服务器上使用多个 IP 地址时它才返回给客户。 

错误代码:404b 

404b错误是由于无法找到文件而造成的,通常是由于正在搜索的网页可能已经删除、更名或暂时不可用。 

错误代码:405 

405错误是由于资源被禁止而导致的网页地址不正确,因此要寻找的网页无法显示。 

错误代码:406 

406错误是由于浏览器无法打开正在寻找的资源而导致的错误。 

错误代码:407 

407错误是由于代理服务器必须先验证身份,然后才处理请求。 

错误代码:410 

410错误要寻找的网页已被永久删除而导致的,这意味着资源永远无法使用。 

错误代码:412 

412错误是由于要查看的网页设置有先决条件,因此该请求无法完成。一般是网页中有一个或多个请求标题字段中具有先决条件,这些字段经服务器测试后被认为是"FALSE"。客户端为当前资源的 meta 信息(头文件字段数据)设置了先决条件,以便防止请求的方法被用于指定资源外的其他资源。 

错误代码:414 

414错误是由于请求的 URI 太长,服务器拒绝处理请求而造成的。一般的可能性有: 

1)客户端错误地将 POST 请求转换为带有长查询信息的 GET 请求。 

2)或者是客户端遇到重定向问题(例如,重定向 URL 的前缀指向自身的后缀)。 

3)服务器遭到客户端的攻击,该客户端试图利用那些使用定长缓冲来读取或控制请求 URI 的服务器上的安全漏洞。 

错误代码:500 

500错误是由于内部服务器错误造成的。 

错误代码:500.11 

500.11错误是由于服务器关闭而造成的资源无法访问,Web 站点关闭期间无法处理请求。 

错误代码:500.12 

500.12错误是由于应用程序重新启动而造成的资源暂时无法访问,Web站点重新启动期间无法处理请求。 

错误代码:500.13 

500.13错误是由于服务器太忙而造成的,此时无法处理请求。通讯量超出 Web 站点的能力。 

错误代码:500.14 

500.14错误是由于应用程序无效而造成的,部分 Web 站点不可用。Web 站点应用程序配置存在问题,无法处理请求。 

错误代码:500.15 

500.15错误是由于请求了不不允许请求的 global.asa而造成的,你可以编辑"地址"栏中的网址,删除 global.asa,然后按 Enter。来解决这个问题。 

错误代码:502 

502错误是由于网关错误而造成的,当作为网关或代理的服务器与上层内容服务器联络时,收到无效的响应时就会出现502错误。 

错误代码:500-100.asp 

500-100.asp错误是指ASP错误,默认情况下,"默认 Web 站点"及其所有应用程序都将 ASP 错误进程传送到 500-100.asp 文件;但是,用户创建的任何新 Web 站点或其应用程序都将 500.100 错误进程传送到默认的(不是自定义的)错误文件。如果要为 .asp 文件开发附加的错误进程,可以将 500-100 错误映射到 .asp 文件,或者创建自己的错误进程 .asp 文件。 

500-100.asp 文件处理 .asp 文件编译和运行期间发生的任何错误。当发生 ASP 错误时,IIS 返回 500-100.asp 文件并附带详细的错误信息,如发生错误的行号和对错误的描述。 

如果文件 500-100.asp 本身包含 ASP 错误,ASP 就不会返回另一个 500-100.asp 文件;这样,报告错误时就好象根本没有与 500-100 错误对应的自定义错误文件似的。 

如果错误处理文件(默认是 500-100.asp)包含运行时错误,则只显示此错误,而不考虑请求的 .asp 文件中的错误类型。如果错误处理文件有预处理和编辑错误,则在浏览器中显示这两种错误(即,显示 500-100.asp 文件中的错误和请求的 .asp 文件中的错误)
 

posted @ 2009-06-14 19:28 肖马辉 阅读(651) | 评论 (0)编辑 收藏
 
之前也有一些介绍大型网站架构演变的文章,例如LiveJournal的、ebay的,都是非常值得参考的,不过感觉他们讲的更多的是每次演变的结果,而没有很详细的讲为什么需要做这样的演变,再加上近来感觉有不少同学都很难明白为什么一个网站需要那么复杂的技术,于是有了写这篇文章的想法,在这篇文章中将阐述一个普通的网站发展成大型网站过程中的一种较为典型的架构演变历程和所需掌握的知识体系,希望能给想从事互联网行业的同学一点初步的概念,:),文中的不对之处也请各位多给点建议,让本文真正起到抛砖引玉的效果。
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
架构演变第一步:物理分离webserver和数据库
最开始,由于某些想法,于是在互联网上搭建了一个网站,这个时候甚至有可能主机都是租借的,但由于这篇文章我们只关注架构的演变历程,因此就假设这个时候已经是托管了一台主机,并且有一定的带宽了,这个时候由于网站具备了一定的特色,吸引了部分人访问,逐渐你发现系统的压力越来越高,响应速度越来越慢,而这个时候比较明显的是数据库和应用互相影响,应用出问题了,数据库也很容易出现问题,而数据库出问题的时候,应用也容易出问题,于是进入了第一步演变阶段:将应用和数据库从物理上分离,变成了两台机器,这个时候技术上没有什么新的要求,但你发现确实起到效果了,系统又恢复到以前的响应速度了,并且支撑住了更高的流量,并且不会因为数据库和应用形成互相的影响。
看看这一步完成后系统的图示:
<!--[if !vml]-->
<!--[endif]-->
这一步涉及到了这些知识体系:
这一步架构演变对技术上的知识体系基本没有要求。
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
架构演变第二步:增加页面缓存
好景不长,随着访问的人越来越多,你发现响应速度又开始变慢了,查找原因,发现是访问数据库的操作太多,导致数据连接竞争激烈,所以响应变慢,但数据库连接又不能开太多,否则数据库机器压力会很高,因此考虑采用缓存机制来减少数据库连接资源的竞争和对数据库读的压力,这个时候首先也许会选择采用squid等类似的机制来将系统中相对静态的页面(例如一两天才会有更新的页面)进行缓存(当然,也可以采用将页面静态化的方案),这样程序上可以不做修改,就能够很好的减少对webserver的压力以及减少数据库连接资源的竞争,OK,于是开始采用squid来做相对静态的页面的缓存。
看看这一步完成后系统的图示:
<!--[if !vml]-->
<!--[endif]-->
这一步涉及到了这些知识体系:
前端页面缓存技术,例如squid,如想用好的话还得深入掌握下squid的实现方式以及缓存的失效算法等。

架构演变第三步:增加页面片段缓存
增加了squid做缓存后,整体系统的速度确实是提升了,webserver的压力也开始下降了,但随着访问量的增加,发现系统又开始变的有些慢了,在尝到了squid之类的动态缓存带来的好处后,开始想能不能让现在那些动态页面里相对静态的部分也缓存起来呢,因此考虑采用类似ESI之类的页面片段缓存策略,OK,于是开始采用ESI来做动态页面中相对静态的片段部分的缓存。
看看这一步完成后系统的图示:
<!--[if !vml]-->
<!--[endif]-->
这一步涉及到了这些知识体系:
页面片段缓存技术,例如ESI等,想用好的话同样需要掌握ESI的实现方式等;

架构演变第四步:数据缓存
在采用ESI之类的技术再次提高了系统的缓存效果后,系统的压力确实进一步降低了,但同样,随着访问量的增加,系统还是开始变慢,经过查找,可能会发现系统中存在一些重复获取数据信息的地方,像获取用户信息等,这个时候开始考虑是不是可以将这些数据信息也缓存起来呢,于是将这些数据缓存到本地内存,改变完毕后,完全符合预期,系统的响应速度又恢复了,数据库的压力也再度降低了不少。
看看这一步完成后系统的图示:
<!--[if !vml]-->
<!--[endif]-->
这一步涉及到了这些知识体系:
缓存技术,包括像Map数据结构、缓存算法、所选用的框架本身的实现机制等。

架构演变第五步:增加webserver
好景不长,发现随着系统访问量的再度增加,webserver机器的压力在高峰期会上升到比较高,这个时候开始考虑增加一台webserver,这也是为了同时解决可用性的问题,避免单台的webserver down机的话就没法使用了,在做了这些考虑后,决定增加一台webserver,增加一台webserver时,会碰到一些问题,典型的有:
1、如何让访问分配到这两台机器上,这个时候通常会考虑的方案是Apache自带的负载均衡方案,或LVS这类的软件负载均衡方案;
2、如何保持状态信息的同步,例如用户session等,这个时候会考虑的方案有写入数据库、写入存储、cookie或同步session信息等机制等;
3、如何保持数据缓存信息的同步,例如之前缓存的用户数据等,这个时候通常会考虑的机制有缓存同步或分布式缓存;
4、如何让上传文件这些类似的功能继续正常,这个时候通常会考虑的机制是使用共享文件系统或存储等;
在解决了这些问题后,终于是把webserver增加为了两台,系统终于是又恢复到了以往的速度。看看这一步完成后系统的图示:
<!--[if !vml]-->
<!--[endif]-->
这一步涉及到了这些知识体系:
负载均衡技术(包括但不限于硬件负载均衡、软件负载均衡、负载算法、linux转发协议、所选用的技术的实现细节等)、主备技术(包括但不限于ARP欺骗、linux heart-beat等)、状态信息或缓存同步技术(包括但不限于Cookie技术、UDP协议、状态信息广播、所选用的缓存同步技术的实现细节等)、共享文件技术(包括但不限于NFS等)、存储技术(包括但不限于存储设备等)。

架构演变第六步:分库
享受了一段时间的系统访问量高速增长的幸福后,发现系统又开始变慢了,这次又是什么状况呢,经过查找,发现数据库写入、更新的这些操作的部分数据库连接的资源竞争非常激烈,导致了系统变慢,这下怎么办呢,此时可选的方案有数据库集群和分库策略,集群方面像有些数据库支持的并不是很好,因此分库会成为比较普遍的策略,分库也就意味着要对原有程序进行修改,一通修改实现分库后,不错,目标达到了,系统恢复甚至速度比以前还快了。
看看这一步完成后系统的图示:
<!--[if !vml]-->
<!--[endif]-->
这一步涉及到了这些知识体系:
这一步更多的是需要从业务上做合理的划分,以实现分库,具体技术细节上没有其他的要求;
但同时随着数据量的增大和分库的进行,在数据库的设计、调优以及维护上需要做的更好,因此对这些方面的技术还是提出了很高的要求的。

架构演变第七步:分表、DAL和分布式缓存
随着系统的不断运行,数据量开始大幅度增长,这个时候发现分库后查询仍然会有些慢,于是按照分库的思想开始做分表的工作,当然,这不可避免的会需要对程序进行一些修改,也许在这个时候就会发现应用自己要关心分库分表的规则等,还是有些复杂的,于是萌生能否增加一个通用的框架来实现分库分表的数据访问,这个在ebay的架构中对应的就是DAL,这个演变的过程相对而言需要花费较长的时间,当然,也有可能这个通用的框架会等到分表做完后才开始做,同时,在这个阶段可能会发现之前的缓存同步方案出现问题,因为数据量太大,导致现在不太可能将缓存存在本地,然后同步的方式,需要采用分布式缓存方案了,于是,又是一通考察和折磨,终于是将大量的数据缓存转移到分布式缓存上了。看看这一步完成后系统的图示:
<!--[if !vml]-->
<!--[endif]-->
这一步涉及到了这些知识体系:
分表更多的同样是业务上的划分,技术上涉及到的会有动态hash算法、consistent hash算法等;
DAL涉及到比较多的复杂技术,例如数据库连接的管理(超时、异常)、数据库操作的控制(超时、异常)、分库分表规则的封装等;

架构演变第八步:增加更多的webserver
在做完分库分表这些工作后,数据库上的压力已经降到比较低了,又开始过着每天看着访问量暴增的幸福生活了,突然有一天,发现系统的访问又开始有变慢的趋势了,这个时候首先查看数据库,压力一切正常,之后查看webserver,发现apache阻塞了很多的请求,而应用服务器对每个请求也是比较快的,看来是请求数太高导致需要排队等待,响应速度变慢,这还好办,一般来说,这个时候也会有些钱了,于是添加一些webserver服务器,在这个添加webserver服务器的过程,有可能会出现几种挑战:
1、Apache的软负载或LVS软负载等无法承担巨大的web访问量(请求连接数、网络流量等)的调度了,这个时候如果经费允许的话,会采取的方案是购买硬件负载,例如F5、Netsclar、Athelon之类的,如经费不允许的话,会采取的方案是将应用从逻辑上做一定的分类,然后分散到不同的软负载集群中;
2、原有的一些状态信息同步、文件共享等方案可能会出现瓶颈,需要进行改进,也许这个时候会根据情况编写符合网站业务需求的分布式文件系统等;
在做完这些工作后,开始进入一个看似完美的无限伸缩的时代,当网站流量增加时,应对的解决方案就是不断的添加webserver。看看这一步完成后系统的图示:
<!--[if !vml]-->
<!--[endif]-->
这一步涉及到了这些知识体系:
到了这一步,随着机器数的不断增长、数据量的不断增长和对系统可用性的要求越来越高,这个时候要求对所采用的技术都要有更为深入的理解,并需要根据网站的需求来做更加定制性质的产品。

架构演变第九步:数据读写分离和廉价存储方案
突然有一天,发现这个完美的时代也要结束了,数据库的噩梦又一次出现在眼前了,由于添加的webserver太多了,导致数据库连接的资源还是不够用,而这个时候又已经分库分表了,开始分析数据库的压力状况,可能会发现数据库的读写比很高,这个时候通常会想到数据读写分离的方案,当然,这个方案要实现并不容易,另外,可能会发现一些数据存储在数据库上有些浪费,或者说过于占用数据库资源,因此在这个阶段可能会形成的架构演变是实现数据读写分离,同时编写一些更为廉价的存储方案,例如BigTable这种。
看看这一步完成后系统的图示:
<!--[if !vml]-->
<!--[endif]-->
这一步涉及到了这些知识体系:
数据读写分离要求对数据库的复制、standby等策略有深入的掌握和理解,同时会要求具备自行实现的技术;
廉价存储方案要求对OS的文件存储有深入的掌握和理解,同时要求对采用的语言在文件这块的实现有深入的掌握。

架构演变第十步:进入大型分布式应用时代和廉价服务器群梦想时代
经过上面这个漫长而痛苦的过程,终于是再度迎来了完美的时代,不断的增加webserver就可以支撑越来越高的访问量了,对于大型网站而言,人气的重要毋庸置疑,随着人气的越来越高,各种各样的功能需求也开始爆发性的增长,这个时候突然发现,原来部署在webserver上的那个web应用已经非常庞大了,当多个团队都开始对其进行改动时,可真是相当的不方便,复用性也相当糟糕,基本是每个团队都做了或多或少重复的事情,而且部署和维护也是相当的麻烦,因为庞大的应用包在N台机器上复制、启动都需要耗费不少的时间,出问题的时候也不是很好查,另外一个更糟糕的状况是很有可能会出现某个应用上的bug就导致了全站都不可用,还有其他的像调优不好操作(因为机器上部署的应用什么都要做,根本就无法进行针对性的调优)等因素,根据这样的分析,开始痛下决心,将系统根据职责进行拆分,于是一个大型的分布式应用就诞生了,通常,这个步骤需要耗费相当长的时间,因为会碰到很多的挑战:
1、拆成分布式后需要提供一个高性能、稳定的通信框架,并且需要支持多种不同的通信和远程调用方式;
2、将一个庞大的应用拆分需要耗费很长的时间,需要进行业务的整理和系统依赖关系的控制等;
3、如何运维(依赖管理、运行状况管理、错误追踪、调优、监控和报警等)好这个庞大的分布式应用。
经过这一步,差不多系统的架构进入相对稳定的阶段,同时也能开始采用大量的廉价机器来支撑着巨大的访问量和数据量,结合这套架构以及这么多次演变过程吸取的经验来采用其他各种各样的方法来支撑着越来越高的访问量。看看这一步完成后系统的图示:
<!--[if !vml]-->
<!--[endif]-->
这一步涉及到了这些知识体系:
这一步涉及的知识体系非常的多,要求对通信、远程调用、消息机制等有深入的理解和掌握,要求的都是从理论、硬件级、操作系统级以及所采用的语言的实现都有清楚的理解。
运维这块涉及的知识体系也非常的多,多数情况下需要掌握分布式并行计算、报表、监控技术以及规则策略等等。
说起来确实不怎么费力,整个网站架构的经典演变过程都和上面比较的类似,当然,每步采取的方案,演变的步骤有可能有不同,另外,由于网站的业务不同,会有不同的专业技术的需求,这篇blog更多的是从架构的角度来讲解演变的过程,当然,其中还有很多的技术也未在此提及,像数据库集群、数据挖掘、搜索等,但在真实的演变过程中还会借助像提升硬件配置、网络环境、改造操作系统、CDN镜像等来支撑更大的流量,因此在真实的发展过程中还会有很多的不同,另外一个大型网站要做到的远远不仅仅上面这些,还有像安全、运维、运营、服务、存储等,要做好一个大型的网站真的很不容易,写这篇文章更多的是希望能够引出更多大型网站架构演变的介绍,:)。
posted @ 2009-05-04 16:29 肖马辉 阅读(200) | 评论 (0)编辑 收藏
 

WEB网站大数据量的性能解决方案 2009-02-17 00:04
分类:默认分类
字号: 大 中 小
随着中国大型IT企业信息化速度的加快,大部分应用的数据量和访问量都急剧增加
,大型企业网站正面临性能和高数据访问量的压力,而且对存储、安全以及信息检索等
等方面都提出了更高的要求……
本文中,我想通过几个国外大型IT企业及网站的成功案例,从Web技术人员角度探讨
如何积极地应对国内大型网站即将面临的扩展(主要是技术方面,而较少涉及管理及营
销等方面)矛盾。
一、 国外大型IT网站的成功之道
(一) MySpace
今天,MySpace已经成为全球众口皆碑的社区网站之王。尽管一流和营销和管理经验
自然是每个IT企业取得成功的首要因素,但是本节中我们却抛弃这一点,而主要着眼于
探讨在数次面临系统扩张的紧急关头MySpace是如何从技术方面采取应对策略的。
第一代架构—添置更多的Web服务器
MySpace最初的系统很小,只有两台Web服务器(分担处理用户请求的工作量)和一
个数据库服务器(所有数据都存储在这一个地方)。那时使用的是Dell双CPU、4G内存的
系统。在早期阶段,MySpace基本是通过添置更多Web服务器来对付用户暴增问题的。但
到在2004年早期,在MySpace用户数增长到五十万后,其数据库服务器已经开始疲于奔命
了。
第二代架构—增加数据库服务器
与增加Web服务器不同,增加数据库并没那么简单。如果一个站点由多个数据库支持
,设计者必须考虑的是,如何在保证数据一致性的前提下让多个数据库分担压力。
MySpace运行在三个SQL Server数据库服务器上—一个为主,所有的新数据都向它提
交,然后由它复制到其它两个;另两个数据库服务器全力向用户供给数据,用以在博客
和个人资料栏显示。这种方式在一段时间内效果很好——只要增加数据库服务器,加大
硬盘,就可以应对用户数和访问量的增加。
这一次的数据库架构按照垂直分割模式设计,不同的数据库服务于站点的不同功能
,如登录、用户资料和博客。垂直分割策略利于多个数据库分担访问压力,当用户要求
增加新功能时,MySpace只需要投入新的数据库加以支持。在账户到达二百万后,MySpa
ce还从存储设备与数据库服务器直接交互的方式切换到SAN(存储区域网络)—用高带宽
、专门设计的网络将大量磁盘存储设备连接在一起,而数据库连接到SAN。这项措施极大
提升了系统性能、正常运行时间和可靠性。然而,当用户继续增加到三百万后,垂直分
割策略也变得难以维持下去。
第三代架构—转到分布式计算架构
几经折腾,最终,MySpace将目光移到分布式计算架构——它在物理上分布的众多服
务器,整体必须逻辑上等同于单台机器。拿数据库来说,就不能再像过去那样将应用拆
分,再以不同数据库分别支持,而必须将整个站点看作一个应用。现在,数据库模型里
只有一个用户表,支持博客、个人资料和其他核心功能的数据都存储在相同数据库。
既然所有的核心数据逻辑上都组织到一个数据库,那么MySpace必须找到新的办法以
分担负荷——显然,运行在普通硬件上的单个数据库服务器是无能为力的。这次,不再
按站点功能和应用分割数据库,MySpace开始将它的用户按每百万一组分割,然后将各组
的全部数据分别存入独立的SQL Server实例。目前,MySpace的每台数据库服务器实际运
行两个SQL Server实例,也就是说每台服务器服务大约二百万用户。据MySpace的技术人
员说,以后还可以按照这种模式以更小粒度划分架构,从而优化负荷分担。
第四代架构—求助于微软方案
2005年早期,账户达到九百万,MySpace开始用微软的C#编写ASP.NET程序。在收到
一定成效后,MySpace开始大规模迁移到ASP.NET。
账户达到一千万时,MySpace再次遭遇存储瓶颈问题。SAN的引入解决了早期一些性
能问题,但站点目前的要求已经开始周期性超越SAN的I/O容量——即它从磁盘存储系统
读写数据的极限速度。
第五代架构—增加数据缓存层并转到支持64位处理器的SQL Server 2005
2005年春天,MySpace账户达到一千七百万,MySpace又启用了新的策略以减轻存储
系统压力,即增加数据缓存层——位于Web服务器和数据库服务器之间,其唯一职能是在
内存中建立被频繁请求数据对象的副本,如此一来,不访问数据库也可以向Web应用供给
数据。
2005年中期,服务账户数达到两千六百万时,MySpace因为我们对内存的渴求而切换
到了还处于beta测试的支持64位处理器的SQL Server 2005。升级到SQL Server 2005和
64位Windows Server 2003后,MySpace每台服务器配备了32G内存,后于2006年再次将配
置标准提升到64G。
事实上,MySpace的Web服务器和数据库仍然经常发生超负荷,其用户频繁遭遇“意
外错误”和“站点离线维护”等告示,他们不得不在论坛抱怨不停……
MySpace正是在这样不断重构站点软件、数据库和存储系统中,才一步步走到今天。
事实上,MySpace已经成功解决了很多系统扩展性问题,其中存在相当的经验值得我们借
鉴。MySpace系统架构到目前为止保持了相对稳定,但其技术人员仍然在为SQL Server支
持的同时连接数等方面继续攻坚,尽可能把事情做到最好。
(二) Amazon
亚马逊书店无疑是电子商务发展的里程碑。2000年到现在,世界网络业腥风血雨。
Amazon曾经成为网络泡沫的头号代表。如今,当这个“最大的泡沫”用几经易改的数字
把自己变成了坚实的IT巨人。
历览Amazon发展过程,其成功经验在于,它创造性地进行了电子商务中每一环节的探索
,包括系统平台的建设,程序编写、网站设立、配送系统等等方面。用Amazon当家人贝
索斯的话说就是,“在现实世界的商店最有力的武器就是地段,地段,地段,而对于我
们来说最重要的三件事就是技术,技术,技术。”
(三) eBay
eBay是世界闻名的拍卖网站,eBay公司通信部主管凯文?帕斯格拉夫认为,“eBay成
功的最重要原因在于公司管理和服务。”
其成功的奥秘可以列举为以下几点:
①敢为天下先—在网络尚不普及的时代,eBay率先进入网络拍卖领域;
②依托虚拟商场所产生的特有的“零库存”是eBay公司取得成功的另一个重要原因。该
公司的核心业务没有任何库存风险,所有的商品都是由客户提供,它只需要负责提供虚
拟的拍卖平台—网络和软件。所以,eBay公司的财务报表上不会出现“库存费用”和“
保管费用”等。
③自eBay公司成立开始,它就一直遵循两条“黄金原则”:建设虚拟社区,给网民以家
的感觉;保证网站稳定安全地运行。
二、 国内大型网站开发时的几点建议
从本节开始,我们将结合国内外大型IT网站在技术扩展方面的沉痛教训和成功经验
,探讨在如今刚刚开始的Web 2.0时代如何应对国内网站即将面临的数据访问量增加(甚
至是急剧膨胀)的问题,并提出一些供参考的策略和建议。
(四) 搭建科学的系统架构
构建大型的商业网站绝对不可能像构建普通的小型网站一样一蹴而就,需要从严格
的软件工程管理的角度进行认真规划,有步骤有逻辑地进行开发。对于大型网站来说,
所采用的技术涉及面极其广泛,从硬件到软件、编程语言、数据库、Web服务器、防火墙
等各个领域都有了很高的要求,已经不是原来简单的html静态网站所能比拟的。以著名
的Yahoo!为例,他们的每一个大型网站工程都需要大量相应专业人员的参与。
(五) 页面静态化
可不要小看纯静态化的HTML页面!其实在很多情况下,HTML往往意味着“效率最高
、消耗最小”,所以我们尽可能使我们的网站上的页面采用静态页面来实现。但是,对
于大量内容并且频繁更新的网站,我们无法全部手动实现,因此可以开发相应的自动化
更新工具,例如我们常见的信息发布系统CMS。像我们经常访问的各个门户站点的新闻频
道,甚至他们的其他频道,都是通过信息发布系统来管理和实现的。信息发布系统可以
实现最简单的信息录入自动生成静态页面,还能具备频道管理、权限管理、自动抓取等
功能,对于一个大型网站来说,拥有一套高效、可管理的CMS是必不可少的。
(六) 存储问题
存储也是一个大问题,一种是小文件的存储,比如图片这类;另一种是大文件的存
储,比如搜索引擎的索引。
大家知道,对于Web服务器来说,不管是Apache、IIS还是其他容器,图片是最消耗资源
的,于是我们有必要将图片与页面进行分离,这是基本上大型网站都会采用的策略,他
们都有独立的图片服务器,甚至很多台图片服务器。这样的架构可以降低提供页面访问
请求的服务器系统压力,并且可以保证系统不会因为图片问题而崩溃,在应用服务器和
图片服务器上,可以进行不同的配置优化以保证更高的系统消耗和执行效率。
(七) 数据库技术—集群和库表散列
对于大型网站而言,使用大型的数据库服务器是必须的事情。但是,在面对大量访
问的时候,数据库的瓶颈仍然会显现出来,这时一台数据库将很快无法满足应用,于是
我们需要借助于数据库集群或者库表散列技术。
在数据库集群方面,很多数据库厂商都有自己的解决方案,Oracle、Sybase、SQL
Server等都有很好的方案,常用的MySQL提供的Master/Slave也是类似的方案。因此,你
使用了什么样的数据库,就参考相应的解决方案来实施即可。
上面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用数据库类型
的限制,于是我们需要从应用程序的角度来考虑改善系统架构,其中,库表散列是常用
并且最有效的解决方案。我们在应用程序中安装业务和应用或者功能模块将数据库进行
分离,不同的模块对应不同的数据库或者表,再按照一定的策略对某个页面或者功能进
行更小的数据库散列,比如用户表,按照用户ID进行表散列,这样就能够低成本的提升
系统的性能并且有很好的扩展性。在这一方面一个现成的例子就是搜狐。它的论坛就是
采用了这样的架构,将论坛的用户、设置、帖子等信息进行数据库分离,然后对帖子、
用户按照板块和ID进行散列数据库和表,最终可以在配置文件中进行简单的配置便能让
系统随时增加一台低成本的数据库进来补充系统性能。
(八) 缓存策略
这绝对不单指低级的缓存技术相关的编程,应从整个架构角度着眼,深入研究Web服
务器、数据库服务器的各层级的缓冲策略,最后才是低级的缓冲技术的编程。不同的We
b服务器、数据库服务器及Web编程语言都有自己不同的缓冲策略。例如数据库存储方面
,SQL Serve 2005中的主动式缓存机制,Oracle数据的cache group技术,Hibernate的
缓存包括Session的缓存和SessionFactory的缓存;Web服务器方面,Apache提供了自己
的缓存模块,也可以使用外加的Squid模块进行缓存,这两种方式均可以有效的提高Apa
che的访问响应能力,IIS缓冲器技术;至于web开发语言,所用缓存技术更存在很大不同
,例如ASP.NET 2.0中提出了两种缓存应用程序数据和缓存服务页输出的策略,这两种缓
存技术相互独立但不相互排斥,PHP有Pear的Cache模块,等等。
(九) 镜像
镜像是大型网站常采用的提高性能和数据安全性的方式,镜像的技术可以解决不同
网络接入商和地域带来的用户访问速度差异。在镜像的细节技术方面,这里不阐述太深
,有很多专业的现成的解决架构和产品可选。也有廉价的通过软件实现的思路,比如Li
nux上的rsync等工具。
(十) 负载均衡
负载均衡将是大型网站解决高负荷访问和大量并发请求采用的终极解决办法。
负载均衡技术发展了多年,有很多专业的服务提供商和产品可以选择,基于LAMP解决方
案的Lighttped+Squid是相当不错的解决负载均衡和加速系统的有效方式。
(十一) 硬件四层交换
第四层交换使用第三层和第四层信息包的报头信息,根据应用区间识别业务流,将
整个区间段的业务流分配到合适的应用服务器进行处理。第四层交换功能就象是虚IP,
指向物理服务器。它传输的业务服从的协议多种多样,有HTTP、FTP、NFS、Telnet或其
他协议。这些业务在物理服务器基础上,需要复杂的载量平衡算法。在IP世界,业务类
型由终端TCP或UDP端口地址来决定,在第四层交换中的应用区间则由源端和终端IP地址
、TCP和UDP端口共同决定。
在硬件四层交换产品领域,有一些知名的产品可以选择,比如Alteon、F5等,这些
产品很昂贵,但是物有所值,能够提供非常优秀的性能和很灵活的管理能力。Yahoo中国
当初接近2000台服务器使用了三四台Alteon就搞定了。
(十二) 软件四层交换
大家知道了硬件四层交换机的原理后,基于OSI模型来实现的软件四层交换也就应运
而生,这样的解决方案实现的原理一致,不过性能稍差。但是满足一定量的压力还是游
刃有余的。
一个典型的使用负载均衡的策略就是,在软件或者硬件四层交换的基础上搭建squid集群
,这种思路在很多大型网站包括搜索引擎上被采用,这样的架构低成本、高性能还有很
强的扩张性,随时往架构里面增减节点都非常容易。
(十三) 软件投资问题
据报导,目前国内除了一些上市企业和特别大知名大公司以外,很少有企业在成本
中考虑正版软件的购置费用。这种思维极有可能给中国互联网带来噩梦。如果一些公司
真正面临软件资金方面的困难,完全可以考虑使用开源世界的LAMP解决方案(Linux+A
pache+MySQL+Perl、PHP或者Python Web编程语言);否则,随着我国加入WTO范围的
不断扩大,盗版打击必然越来越严。因此,“苟且偷生”必将自食其果。
另外,随着网络带宽日渐提升,WEB 2.0技术必将影响到网络世界的几乎每一个角落
。因此,如何积聚技术人员进行技术攻关并进一步加强安全防范也成为一个日益严峻的
问题,宜尽早纳入到公司的议事日程。

posted @ 2009-03-28 23:00 肖马辉 阅读(836) | 评论 (0)编辑 收藏
 
    

先下载所需要安装的东东~~

PHP 5.2.0 官方下载地址:http://www.php.net/downloads.php
mysql-5.0.27 官方下载地址:http://dev.mysql.com/downloads/mysql/5.0.html
phpMyAdmin for Windows V2.9.1 官方下载地址:http://www.phpmyadmin.net/home_page/index.php
你也可以上天空站下载:http://www.skycn.com/soft/10687.html

第一步:配置PHP

  如果你下载的是安装版的php,安装的时候可以选择使用IIS,安装完毕就会自动配置好IIS。如果你下载的是zip版的,则按照以下步骤配置:

1、把PHP-5.2.0 zip(目前最新版本)解压放到 D:\php (你可以选择目录,本例以此说明)。

2、将php.ini-dist复制到 C:\Windows 目录下并改名为php.ini,复制 php5ts.dll和 libmysql.dll到 C:\Windows\system32 中。

3、用记事本打开php.ini,查找“extension_dir”,然后把 extension_dir = "./"修改为 extension_dir = "D:\php\ext"  注意:路径在Win下一定要使用\

4、在记事本中查找“;extension=php_mysql.dll”和“;extension=php_gd2.dll”,然后把前面的“;”去掉,即把 ;extension=php_mysql.dll 改为 extension=php_mysql.dll
把以下内容前面的;去掉
;extension=php_mbstring.dll
;extension=php_gd2.dll
;extension=php_dbase.dll
;extension=php_ldap.dll

5、找到 ;session.save_path = "/tmp" 将';'去掉.设置你保存session的目录。
如:session.save_path = "C:\Windows\Temp";

6、找到 register_globals 将 Off 改为 On

7、找到 allow_url_include 将 Off 改为 On

8、保存 php.ini

9、接下来在IIS中进行设置,打开Web服务扩展,添加PHP扩展,扩展名为PHP,要求的文件为d:\php\php5isapi.dll,打开默认网站-〉属性对话框,切换到“主目录”选项卡,然后点“配置”按钮打开“应用程序配置对话框”,点“添加”按钮打开“添加/编辑应用程序扩展名映射”对话框。在“可执行文件”输入框中,指向d:\php\php5isapi.dll,在“扩展名”输入框里面输入“.php”,并选中“脚本引擎”和“检查文件是否存在”两个复选框,一路确定,选择文档,添加默认内容为 index.php ,确定并重启IIS后退出IIS。

此时PHP环境基本已经配置成功
在WEB根目录(如我的D:\website)里建一个名为test.php的文件内容如下
<? echo phpinfo(); ?>
用浏览器打开 http://localhost/test.php
如果可以看到php配置输出信息就OK了


第二步:安装MySql

1、先安装mysql,双击执行 Setup.exe,点Next选择Custom(自定义)安装,然后点Next(下一步),默认安装目录为 C:\Program Files\MySQL\MySQL Server 5.0\ 为了方便进入我们可以安装在D盘根目录下,点Change(改变目录)按钮来更改安装目录为D:\mysql。完成后出现创建 MySQL.com 帐号的界面,简单一点,我们选择Skip Sign-Up跳过这一步,既安装完成。这里有个配置向导的选项Configure the MySQL Server now默认的是选起的,我们就顺便完成配置吧。

  这里的配置是很简单的,我们只要点Next(下一步)即可,有几个地方要说明:Install As Windows Service默认的是选中的,这一选项要选上,作用是将MySQL作为Windows的服务运行。Service Name(服务名)默认的“MySQL”,可以改你喜欢的服务名。下面的Launch the MySQL Server automatically要勾选,这样Windows启动时,MySQL就会自动启动服务。Include Bin Directory in Windows PATH这一选项是修改环境变量,在PATH的值中增加../bin目录,可以根据怎么的爱好来决定是否选上,如果选上,在CMD下不需要进入bin目录就可以运行mysql。在Manual Selected Default Character Set / Collation 下 Character Set: 选择 gbk 或 gb2312,接着点下一步,Modify Security Settings是设置根帐号的密码,设置后点下一步,excute完成安装。

  如果是zip文件,用解压缩软件将压缩包直接解压到指定目录,如 D:\mysql;

2、安装完成后,打开“开始”按钮中的“运行”,输入命令:D:\mysql\bin\mysqld-nt.exe --install,并执行;

3、打开“开始”按钮下的“程序”=》“管理工具”=》“服务”,找到“mysql”服务,启动它;

4、至此,mysql安装完成,重启win2003 server。您还可以打开D:\mysql\bin\MySQLInstanceConfig.exe,再次配置MySQL,在Manual Selected Default Character Set / Collation 下 Character Set: 选择 gbk 或 gb2312(我选择的是 gbk ),后面还会要求输入 root 登录密码(如:123456)。

  至此,mysql安装完成。


第三步:PHPMyAdmin 的安装配置

1、将phpMyAdmin-2.9.1.zip解压到WEB根目录(d:\website\中去),重命名文件夹为myadmin或其它
打开myadmin 目录中的 config.sample.inc.php
找到以下这些(以下我已改好):

$cfg['blowfish_secret'] = 'cookie'; //在等号后的单引号内加入 cookie

$cfg['Servers'][$i]['controluser'] = 'root'; //将 pmausr 改为 root

$cfg['Servers'][$i]['controlpass'] = '123456'; //分别填上你mysql的用户和密码即可

改好了保存并将config.sample.inc.php改为config.inc.php,在浏览器打开http://localhost/myadmin 输入你的用户名和密码,便可以管理mysql了。

  如果以上都正常的话,开始建网站吧 ^-^

蓝色数码写于2006-11-15 14:09        以前写的,转来此处。

补充:

mysql连接错误(10061)该怎么办?
Error: Can't connect to MySQL server on 'localhost' (10061)

请检查你的mysql服务是否启动!

MySQL的1067错误
错误信息为:
A system error has occurred.
System error 1067 has occurred.
The process terminated unexpectedly.

在我的机上的解决办法是:
修改%windir%\my.ini,增加
[mysqld]
#设置basedir指向mysql的安装路径
basedir=D:\mysql
datadir=D:\data

或者删除%windir%\my.ini

在c:\下添加一个 c:\my.cnf文件
文件内容
[mysqld]
#设置basedir指向mysql的安装路径
basedir=D:\mysql
datadir=D:\mysql\data

posted @ 2009-02-16 23:10 肖马辉 阅读(984) | 评论 (0)编辑 收藏
仅列出标题
共7页: 上一页 1 2 3 4 5 6 7 下一页