Http错误大全

HTTP/IIS错误类型

1XX 信息提示

用于表示临时的响应。客户端在收到常规响应之前,应准备接受一个或多个1XX响应。

100 :继续
101 :切换协议

2XX 成功

表示服务器成功地接受了客户端请求。

200 :确定。客户端请求已成功
201 :已创建
202 :已接受
203 :非权威性信息
204 :无内容
205 :重置内容
206 :部分内容

3XX 重定向

客户端浏览器必须采取更多操作来实现请求。(例如:浏览器可能不得不请求服务器上的不同的页面,或通过代理服务器重复该请求)

302 :对象已移动
304 :未修改
307 :临时重定向

4XX 客户端错误

发生错误,客户端似乎有问题。(例如:客户端请求不存在的页面,客户端未提供有效的身份验证信息)

400 :错误的请求
401 :访问被拒绝
IIS 定义了许多不同的 401 错误,它们指明更为具体的错误原因。这些具体的错误代码在浏览器中显示,但不在 IIS 日志中显示:
401.1 :登陆失败
401.2 :服务器配置导致登陆失败
401.3 :由于ACL对资源的限制而未获得授权
401.4 :筛选器授权失败
401.5 :ISAPI/CGI应用程序授权失败
401.7 :访问被Web服务器上的URL授权策略拒绝(IIS6.0专用)
403 :禁止访问
IIS定义了许多不同的错误原因:
403.1 :执行访问被禁止
403.2 :读访问被禁止
403.3 :写访问被禁止
403.4 :要求SSL
403.5 :要求SSL 128
403.6 :IP地址被拒绝
403.7 :要求客户端证书
403.8 :站点访问被拒绝
403.9 :用户数过多
403.10 :配置无效
403.11 :密码更改
403.12 :拒绝访问映射表
403.13 :客户端证书被吊销
403.14 :拒绝目录列表
403.15 :超出客户端访问许可
403.16 :客户端证书不受信任或无效
403.17 :客户端证书已过期或尚未生效
403.18 :在当前的应用程序池中不能执行所请求的URL(IIS6.0专用)
403.19 :不能未这个应用程序池中的客户端执行CGI(IIS6.0专用)
403.20 :Passport登陆失败(IIS6.0专用)
404 未找到
404.0 :没有找到文件或目录
404.1 :无法在所请求的断开上访问Web站点
404.2 :Web服务扩展锁定策略阻止本请求
404.3 :MIME映射策略阻止本请求
405 用来访问本页的HTTP谓词不被允许
406 客户端浏览器不接受所请求页面的MIME类型
407 要求进行代理身份验证
412 前提条件失败
413 请求实体太大
414 请求URL太大
415 不支持的媒体类型
416 所请求的范围无法满足
417 执行失败
423 锁定的错误

5XX 服务器错误

服务器由于遇到错误而不能完成该请求

500 内部服务器错误
500.12 :应用程序正忙于在Web服务器上重新启动
500.13 :Web服务器太忙
500.15 :不允许直接请求Global.asa
500.16 :UNC授权凭据不正确(IIS6.0专用)
500.18 :URL授权存储不能打开(IIS6.0专用)
500.100 :内部ASP错误
501 页眉值制定了未实现的配置

502 Web服务器用作网关或代理服务器时收到了无效响应

502.1 :CGI应用程序超时
502.2 :CGI应用程序出错
503 服务不可用(IIS6.0专用)

504 网关超时

505 HTTP版本不受支持

Server ran out of threads to serve requests.

刚刚发完blog却发现居然连自己都连不上网页,看了一下Apache的error.log,发现了下面一段讯息:
Server ran out of threads to serve requests. Consider raising the ThreadsPerChild setting
真恐怖,ThreadsPerChild的预设值是50还不够用,害我以為伺服器出了什麼问题,还好很快就排除了,目前把上限给调到了500,这样应该就不会不够了吧
顺便引一下刚刚网路上找到的资料,作為以后修改的依据。
Apache Server 设定限制Client连接数量

有时候可能Server本身硬体上有一定的限制无法承受大量使用者不断的连接上来,当然架设网站的人总是要设想一下
当自己的网站ㄏㄤ到不行的时候,这样的问题该怎麼办.......

现在很多人在Windows会使用Apache来当Server因為方便好用,但是对於Windows这样不稳定的系统
有时候就需要控制一下连接到Server的Client数了。
Apache Server几个设定各位可以参考看看......
1. MaxClients : 此直最大是256,他的意思是说可以连接到Server上最大的数量,所以当Over这个数量的时候一定要等到
有Free出来的Process才可以提供另外一个Client在连线上来。
2. MaxRequestsPerChild : 此设定是连接的每一个Process可以要求最大Thread的数量,Win32系统建议值是0
3. ThreadsPerChild : 这是告诉Server可以处理最大的Thread数量是多少,当然你必须要依据Server的状况来设定,如果设定太大可能Server吃不下来最后可能会造成当机。(这个设定只符合Win32使用,Unix系统必须参考其他设定值)

这裡大家一定会有疑问,到底MaxClients与ThreadsPerChild有何不同?
其实MaxClients是设定最大的连接数,IE每对网页一个Request就是一个Connection(Process),我们就只服务到这个最大量,绝不超过,那ThreadPerChild呢?
这是在设定对於每个Process我能提供的服务(Thread),因為进入到你的网页你总是会提供一些服务,那就是你可以提供的量。
所以MaxClients*ThreadPerChild就是你提供服务的最大量了。
你可以调整看看什麼样的情况下你的Server可以达到一个最稳定的状况。

JavaScript 面向对象编程

作者:lzlhero <lzlhero_at_eyou.com>
发布:heiyeluren <heiyeluren_at_gmail.com>
时间:2005-08-25

我们将向你展示 JavaScript 如何实现面向对象的语言中的: 继承. 同时, 这些例子将向你展示如何实现类的封装. 在此, 我们不会讨论多态实现.

虽然 JavaScript 是脚本语言, 但它所支持的面向对象编程也是非常强大的. 虽然它没有类和实例, 但它有对象, 原型和隐式的继承. 我们将会解释如何模拟继承及其超类与子类之间关系的形式. 原型是理解继承概念的关键, 我们将会教你如何建立原型, 如何检测一个对象是否是另外一个对象的原型, 及其 JavaScript 的模型与 Java 面向对象编程之间的区别. 我们同样会向你展示如何检测对象所包含的各种属性的方法. 在另外一篇文章里, 我还会详细地讲解有关 "原型链 (prototype chain)" 的知识. Continue reading

Javascript面向对象编程

---->什么是类和对象
    这是所有面向对象编程之前必须弄明白的.
    所谓类:简单地说就是模板,说的专业一些,是一类具有某种性质的物的集合.比如:人就是一个类,车也是一个类,等等.
    所谓对象:就是类的具体实现.如上面所说,人是一个类,一个具体的人就是一个对象,比如张三.
   
    对象是类的实例化后的结果.javascript中使用new关键字来实例化一个类,生成一个对象.
    例子:
        function people(){    //javascript中一个function也是一个类,这里我们建立一个空的类people
        }
       
        var zhangsan=new people;    //实例化生成一个对象张三

---->一个具体形象的例子
    /*-->最简单的类:
     *people类
     *    属性:性别,年龄,姓名
     *    方法:说话
     */
        function people(name,sex,age){
            this.name=name;
            this.sex=sex;
            this.age=age;
            this.say=function(){
                return "我叫"+this.name;
            }
        }
       
        使用时:
        var zhangsan=new people;
        alert(zhangsan.say());
        var lisi=new people;
        alert(lizi.say());
        说明:
            上面使用了this关键字,this总是指向当前的对象,在上面例子中,zhangsan.say中具有this.name,这里的this是当前的对象zhangsan.后面lisi.say则是指向当前对象lisi
            对象具有属性,上面的name,sex和age就是对象的属性.我们这样可以访问,如lisi.name,zhangsan.age
            对象还具有方法,比如上面的say.方法是通过构造函数实现的.使用时,如上面,用lisi.say(),zhangsan.say()
           
            当然我们还可以在实例化对象后为对象添加新的属性和方法.比如:
            zhangsan.girlfriend="小丽";
            zhangsan.doing=function(){
                return "I am eating";
            }

---->javascript类/对象和其他面向对象语言的异同
    相同点:面向对象编程的思想都是一样的,世界上所有的具体事物都可以看成对象,而这些事物从属的集合都可以看成类.我们要做的是构造我们需要的类,在实例化成我们需要的对象为我们工作.
    不同点:其他面向对象编程的语言对于类/对象关心下面的事情:
            1.作用域:公用,私用,受保护,静态.而javascript只有一种作用域:公用作用域.
            2.特性:继承,多态.javascript不支持多态,继承方面的内容将在"javascript对象的继承"一文中介绍

---->构建javascript类/对象的方式
    首先,可以大致定义出下面几种类型:
        1.工厂方式
        2.构造函数方式
        3.原型方式
        4.混合的构造函数/原型方式
        5.动态原型方法
        6.混合工厂方式
   
    具体说明:
        A.工厂方式:
            所谓工厂方式,是指先建立对象,然后再往对象里面添加属性和方法.
            eg.1
                var zhangsan=new Object;    //创建对象
                zhangsan.name="张三";        //给对象添加属性
                zhangsan.say=function(){    //给对象增加方法
                    alert("我叫张三");
                }
            eg.2 上面的例子没有封装性,我们可以使用函数封装,实现多重利用
                function people(){
                    var p_object=new Object;
                    p_object.name="张三";
                    p_object.say=function(){
                        alert("我叫张三");
                    }
                    return p_object;    //返回对象
                }
                var zhangsan=people;
                var lisi=people;
                上面zhangsan和lisi两个对象具有完全相同的属性和方法,都叫"张三"(name属性),都会说"我叫张三"(say()方法)
            eg.3 通过传递参数改进eg.2
                function people(name){
                    var p_object=new Object;
                    p_object.name=name;
                    p_object.say=function(){
                        alert("我叫"+this.name);
                    }
                    return p_object;    //返回对象
                }
                var zhangsan=people("张三");
                var lisi=people("李四");
            总结:
                工厂方式,总是先创建一个对象,再往对象中添加你需要的属性和方法.但这种做法对于封装性和多种利用性不是很有利,这导致了这种对象的构造方法不被提倡.
                使用工厂方式总是为每个对象创建独立的函数版本.
                这类方式使用封装然后调用新对象的时候不使用new创建对象.
               
        B.构造函数方式:
            所谓构造函数方式,就像我给出的例子"一个具体形象的例子",就是采用构造函数的方式.它和工厂方式的区别是不再在函数内部创建一个对象.而是通过this关键字指向当前对象.
            构造函数的例子不再给出.
            构造函数和工厂方式一样,会重复生成函数,为每个版本的对象创建独立的函数版本.
       
        C.原型方式
            所谓原型方式,就是利用prototype属性来实现属性和方法的继承
            eg.1
                function people(){
                }
               
                people.prototype.name="张三";
                people.prototype.say=function(){
                    alert("我叫"+this.name);
                };
               
                var zhangsan=new people();
                var lisi=new people();
            原型方式不能通过构造函数传递参数初始化属性的值,因为所有的属性和方法都是通过prototype添加的
           
        D.混合的构造函数/原型方式
            对于对象的属性,使用构造函数的方式
            对于对象的方法,使用原型方式
            eg.1
                function people(name){
                    this.name=name;
                }
                people.prototype.say=function(){
                    return "我的名字叫"+this.name;
                };
               
                var zhangsan=new people("张三");
                document.write(zhangsan.say());
           
            eg.2 我们也可以把prototype写入类,实现视觉上的封装.
                function people(name){
                    this.name=name;
                    people.prototype.say=function(){
                        return "我的名字叫"+this.name;
                    };
                }
               
                var zhangsan=new people("张三");
                document.write(zhangsan.say());
           
            总结:这种构造类/对象的方法是推荐使用的
           
        E.动态原型方式
            这是在混合的构造函数/原型方式上改进的一种方式(提供更友好的编码风格),他们功能是等价的
            eg.1
                function people(name){
                    this.name=name;
                    if(typeof people._initialized=="undefined"){
                        people.prototype.say=function(){
                            return "我的名字叫"+this.name;
                        };
                        people._initialized=true;
                    }
                }
                var zhangsan=new people("张三");
                document.write(zhangsan.say());
                var lisi=new people("李四");
                document.write(lisi.say());
            这样处理的目的是创建对象的方法后下一次使用时不要再创建.
            由于上面的原因,动态原型方式也是javascript中常用的一种创建类/对象的一种方式
           
        F.混合工厂方式
            混合工厂方式几乎和工厂方式是一样的.它同样是先构造对象,然后再往对象中添加属性和方法.不同的是,混合工厂方式生成对象时依旧使用new关键字.
            eg.1
                function people(){
                    var p_object=new Object;
                    p_object.name="张三";
                    p_object.say=function(){
                        alert("我叫张三");
                    }
                    return p_object;    //返回对象
                }
                var zhangsan=new people;
                var lisi=new people;
                zhangsan.say();
                lisi.say();
            混合工厂方式和工厂方式以及经典方式(构造函数,原型方式)一样会产生问题,不推荐使用
           
    对各种构建类/对象方式的总结:
        通常地,我们使用混合的构造函数/原型方式,即属性使用构造函数方式,方法采用原型方式.当然,加强地,我们可以使用动态原型方式.
        上面两种方式是推荐使用的.
       
                   
---->关于prototype的其他功能
    1.给对象(包括本地对象)添加新的方法
        比如Array对象,你可能需要添加一个方法toHexString,你可以这样做:
            Array.prototype.toHexString=function(){
                //code here
            }
    2.重定义方法
        实质是让方法指向一个新的函数
            Array.prototype.toHexString=function(){
                //other code href
            }

JavaScript面向对象编程(1)-- 基础

自从有了Ajax这个概念,JavaScript作为Ajax的利器,其作用一路飙升。JavaScript最基本的使用,以及语法、浏览器对象等等东东在这里就不累赘了。把主要篇幅放在如何实现JavaScript的面向对象编程方面。

1. 用JavaScript实现类
JavaScritpt没有专门的机制实现类,这里是借助它的函数允许嵌套的机制来实现类的。一个函数可以包含变量,又可以包含其它函数,这样,变量可以作为属性,内部的函数就可以作为成员方法了。因此外层函数本身就可以作为一个类了。如下:

function myClass()
{
    
//此处相当于构造函数
}

这里 myClass就是一个类。其实可以把它看成类的构造函数。至于非构造函数的部分,以后会详细描述。 Continue reading

Apache在window下出现的常用问题

作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

所谓Apache出现CPU高占用率就是指Apache在一段时间内持续占用很高的CPU使用率,甚至达到CPU100%,这个时候造成网站无法访问。解决的方法就是仔细观察Apache的日志文件,查阅错误的信息。

下面我们针对几种错误信息进行分析并给出解决的方法:

1. Apache与WinSock v2相冲突
Apache官方提供的手册中提到,在Windows系统下Apache2.x为了提高性能而使用了Microsoft WinSock v2 API,但是一些常见的防火墙软件会破坏他的正确性,从而使得Apache出现死循环操作造成CPU100%。

其错误提示如下所示:

[error] (730038)An operation was attempted on something that is not a socket.: winnt_accept: AcceptEx failed. Attempting to recover.

[error] (OS 10038) : Child 3356: Encountered too many errors accepting client connections. Possible causes: dynamic address renewal, or incompatible VPN or firewall software. Try using the Win32DisableAcceptEx directive.

[warn] (OS 121)信号灯超时时间已到。 : winnt_accept: Asynchronous AcceptEx failed.

[warn] (OS 64)指定的网络名不再可用。 : winnt_accept: Asynchronous AcceptEx failed.

可以依次采用下面的方法来解决上面的问题,如果进行了一步还有问题就继续下一步:

1) 在httpd.conf文件中使用 Win32DisableAcceptEx 禁止Apache使用 Microsoft WinSock v2 API :

  1. <IfModule mpm_winnt.c>
  2. Win32DisableAcceptEx # 禁止使用AcceptEx()
  3. </IfModule>

2) 使用System Repair Engineer(SREng)查看WinSocket供应者,如果出现非MS的陌生项则将其删除,并使用软件的“重置WinSocket”按钮进行重置。

3) 卸载与Apache相冲突的杀毒软件或防火墙软件。

如果进行上面的三个步骤之后还有问题,那应该看看是不是还有下面的错误。

2. 是否加载了第三方模块(so文件)
Apache2.x要求所有的第三方模块都必须是线程安全的,但有很多第三方的模块可能存在内存泄露,因此时间一长就可以极大的消耗Apache资源。所以可以采用将所有的第三方模块逐个关闭的方法看看运行一段时间之后Apache对资源的占用是否有所改善。

3. “Terminating 1 threads that failed to exit”错误
上面错误中的数字1有可能是其他数字,造成这个错误的原因是Apache在关闭并发线程的时候出现线程溢出,从而造成内存泄露,表现出来的就是Apache所占用的系统资源持续增长。

具体来说,Apache的子进程在结束当前请求之前会首先将所有的并发线程进行关闭,在关闭的时候会等待3分钟,如果3分钟之内没有将所有的线程关闭则会抛出上述的错误提示,然后强制关闭。这样就造成了内存溢出,时间一长会使得Apache所占用资源持续增长直到无法工作。这个时候可以适当将MaxRequestsPerChild的值降低,使得Apache子进程所并发的线程数量减少,从而降低该错误出现的几率。

但是这种方式并不能彻底解决问题,幸好Apache2.0.x的最新版本(2.0.63)解决了之前版本的这个问题,如果3分钟之内有线程没有关闭的话会自动根据时间情况再增加等待结束的时间直到最终将所有的线程结束。日志文件中会出现类似下面的信息:

Child 1952: Waiting 150 more seconds for 2 worker threads to finish.
Child 1952: Waiting 120 more seconds for 1 worker threads to finish.
Child 1952: All worker threads have exited.

4. “file .\\server\\mpm\\winnt\\child.c, line 1078, assertion “(rv >= 0) && (rv < threads_created)” failed” 错误

这个错误是Apache的一个bug(#11997),可以通过 Win32DisableAcceptEx 禁止Apache使用WinSocket v2来避免此bug,具体设置见前述。

5. PHP5.2.1以上版本的libmysql.dll与MySQL5不兼容
PHP5.2.1以后的新版本(截止目前最新版本为5.2.5)中用于连接MySQL的libmysql.dll组件与MySQL5不兼容,在Apache中运行PHP的时候会造成Apache产生CPU100%的问题。

解决的方法就是从http://www.php.net/releases/下载5.2.1版本,将压缩包中的libmysql.dll文件覆盖现在的文件,然后重启Apache就可以了。

6. 病毒或木马程序命名为Apache.exe
有的时候病毒或木马程序会将其名称命名为Apache.exe文件达到一种掩饰的目的,这个时候使用第三方进程分析器查看进程的路径然后将其删除或使用杀毒软件清除就可以了。

7. 程序编写不严谨造成死循环等错误
如果上面的问题都不存在Apache依然产生CPU100%的问题的话,通常来说就应该是Web程序自身的问题了,例如死循环等等。这个时候需要在日志中设置HTTP请求的文件及执行的时间,然后查找出执行时间比较长的地址进行分析排查。

日志格式设置如下:

LogFormat “%v %h %l %u %t [%Ts] \”%r\” %>s %b” vhost_common #设置程序执行时间

<VirtualHost xxx.xxx.xx.xx:80>
ServerName xxx.xxx.com
DirectoryIndex index.php index.html index.htm
DocumentRoot “xxx”
# cronolog.exe用于将日志文件进行分割的应用程序,可以在 http://cronolog.org/ 下载
CustomLog “|bin/cronolog.exe e:/%Y%m%d.log” vhost_common
</VirtualHost>

参考资料:
apache 遇到[error] (OS 10038) 错误
Error in my_thread_global_end(): 1 threads didn’t exit
Apache 2.2.x (ASF) faulting module errors
Need some advice on Apache 2.2.4 PHP 5.2.3 MYSQL 4.0.26
查看Apache并发请求数及其TCP连接状态
Apache Bug 11997
关于apache.exe开机占用cpu100%的终极解决方法
apache cpu占用100%的问题。
空间持续CPU100%时间过长,如何优化程序

windows2003下APACHE2.2.8优化配置手记(一)

原文地址:http://www.phpobject.net/blog/read.php?125
windows2003下APACHE2.2.8优化配置手记。

一、按照日期自定义apache日志

LogFormat "%v %l %u %t \"%r\" %>s %b" comonvhost
CustomLog   "|bin/rotatelogs.exe   -l   D:/apache/logs/access/%Y-%m-%d.log   86400"   common  
Errorlog "|bin/rotatelogs.exe   -l   D:/apache/logs/error/%Y-%m-%d.log   86400"


二、不能加载动态库的错误。

路径明显正确的情况下出现“PHP Warning:  PHP Startup: Unable to load dynamic library”。。原因是动态库有些是依赖其他的DLL的。解决方法
1 将这些依赖的dll拷贝到%windir%\system32下
2 或者将PHP5的安装目录添加到%PATH%中。

三、Apache与WinSock v2相冲突

在错误日志中看到

(OS 64)指定的网络名不再可用。  : winnt_accept: Asynchronous AcceptEx failed.

AcceptEx()是一个微软的WinSock2 API ,通过使用BSD风格的accept() API提供了性能改善。一些流行的Windows产品,比如防病毒软件或虚拟专用网络软件,会干扰AcceptEx()的正确操作。具体看apache手册关于Win32DisableAcceptEx 的说明。
解决方法:
在httpd.conf加上

Win32DisableAcceptEx # 禁止使用AcceptEx()

四、最大连接数
错误日志中提醒
Server ran out of threads to serve requests. Consider raising the ThreadsPerChild setting
很明显,把ThreadsPerChild设置的更大一点就可以了。

关于站点程序或者ACCESS出错导致DLLHOST.exe占用CPU达100%的监测办法

在DLLHOST.EXE导致CPU占用100%(另一种情况是DLLHOST.EXE和INETINFO.EXE各占50%左右)的时候,我们在任务管理器中强制关闭DLLHOST.EXE,然后在事件查看器的系统日志中查意外站点关闭的警告。这几个意外关闭的站点是嫌疑最大的站点,可以逐个监测。

在性能监视器中,新建一个关于DLLHOST.EXE的CPU占用的计数器。设置5秒钟采样一次。然后记录较长的时间,这段时间能保证CPU占用异常事件会发生数次即可(比如半天)。

然后关闭某个嫌疑站点,再做一次DLLHOST.EXE的CPU占用的性能监视。在相同数量级的时间(比如半天)内,如果一次也没有了CPU占用异常的事件,或者事件发生次数大大减少,则这个站点极有可能是导致CPU占用异常的站点,至少是站点之一。

这样的对比监测多做几次就可以确定这个站点是不是有问题了。保存下来的DLLHOST.EXE的CPU占用的计数器日志也是提供给此站站长的证据,责令其修改更正,否则永久关闭站点。

Window下APACHE的Win32DisableAcceptEx的问题

【问题的提出:】 我用的是apache2.0.55+win2003,在使用了一段时间后,出现如下问题: apache正常启动,但是访问localhost或虚拟主机时,出现不能访问的情况,不是找不到服务器,是一直在显示【正在打开网页…】,然后就是长时间空白,Apache不工作。

【出 现的问题:】 我就重装系统,在装好window2003server后,进行自动更新完毕后,安装apache2.0.55后,apache能正常启动,就出现上面的 问题,然后卸掉装2.0.59、2.2.2、2.2.3都是这样的问题,没有办法,就format c盘重装window2003server,没有进行自动更新,安装apache2.0.55时, apache正常工作了,一段时间后就出现了这种问题,期间,win2003又进行了【自动更新】。系统就出现了这样的问题。

【现象:】 apache正常启动,但是访问localhost或虚拟主机时,出现不能访问的情况,不是找不到服务器,是一直在显示【正在打开网页…】,然后就是 长时间空白。apache的error.log,里面出现大量的这样的错误信息: [Wed Nov 01 09:45:34 2006] [error] (OS 10038)在一个非套接字上尝试了一个操作。 : Child 816: Encountered too many errors accepting client connections. Possible causes: dynamic address renewal, or incompatible VPN or firewall software. Try using the Win32DisableAcceptEx directive.

【问题的原因:】 在网上查了一下,发现很多人碰到这个情况,原因是Apache 的AcceptEx在window下会出现这种问题,只在APAche2.0.49以上版本会有这中问题。 《Apache 2_2 中文版参考手册》上说:“AcceptEx()是一个微软的WinSock2 API ,通过使用BSD风格的accept() API提供了性能改善。一些流行的Windows产品,比如防病毒软件或虚拟专用网络软件,会干扰AcceptEx()的正确操作。如果你遇到类似于如下 的错误:一般的解决办法是关闭 AcceptEx()”。也就是说,可能是 Windows Update 或是防火墙、防毒软件更新了某些网络原件,造成 Microsoft WinSock v2 API 动作不正常,会干扰WinSock2 API,就会影响AcceptEx()的正确操作,就可能出现上面所出现的问题。但是关闭会影响Apache的性能。需要自己权衡利弊。因此如果没有什么 错误发生,最好还是不要随便关闭这个功能比较好吧。

【解决办法:】在httpd.conf文件中添加 Win32DisableAcceptEx 标记,如下:

\< IfModule mpm_winnt.c\>
ThreadsPerChild 1000
MaxRequestsPerChild 10000
Win32DisableAcceptEx
\</IfModule\>

这 样可以允许并发连接更大一些。同时性能上也不会有明显的降低. 一般,这样设置基本就能搞定,但是我碰到的情况,就是想上面那样关闭AcceptEx,也会出现类似问题,Apache还是不能正常运作, error.log 出项了大量的:Sat Dec 24 17:21:28 2006] [warn] (OS 64)指定的网络名不再可用。 : winnt_accept: Asynchronous AcceptEx failed.。又找了一下,发现了如下的一种解决办法,我试了试,果然可以,而且在多台服务器上试过,只要出现了AcceptEx 的问题,就能解决,具体设置为: 1、网上邻居-;本地连接-;属性-;internet协议(TCP/IP)-;属性-;高级-;wins标签-;去掉启用LMhosts查询前的勾. 2、控制面版-;windows防火墙-;高级标签-;本地连接设置-;服务的标签里勾选安全Web服务器(HTTPS)。 3、然后退出Apache,再打开启动就可以了 ,一开始我没有退出,直接在那重启,就是不可以,一定要先停止,在开启即可。

【建议:】以 上问题在PHP2.0的版本里面好像没有出现,只出现在php5.1.x与Apahce2.0.49以后的版本,可能PHP2.0与Apache2.2的 版本结合性比较好,所以建议大家在window下,最好使用Apahce2.2.3+PHP2.0的版本,比较稳定。

,jsonJavaScript中的JSON

  • 作者:Douglas Crockford
  • 原文网址:http://www.json.org/js.html
    JavaScript这种编程语言首要的目的是为Netscape Navigator提供一种页面脚本语言。它仍被普遍的认为是Java的一个子集,但事实并非如此。它是一种语法类似c语言并且支持面向对象Scheme-like语言。JavaScript使用了ECMAScript语言规范第三版进行了标准化。

    JSON是JavaScript面向对象语法的一个子集。由于JSON是JavaScript的一个子集,因此它可清晰的运用于此语言中。

    var myJSONObject = {"bindings": [
            {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"},
            {"ircEvent": "PRIVMSG", "method": "deleteURI", "regex": "^delete.*"},
            {"ircEvent": "PRIVMSG", "method": "randomURI", "regex": "^random.*"}
        ]
    };

    上面的示例,创建了一个包括单独成员”bindings”的对象,此成员包括一个含有三个对象(”ircEvent”, “method”, 与 “regex”)的数组

    成员可以通过.或者下标操作符检索。

    myJSONObject.bindings[0].method    // "newURI"

    为了将JSON文本转换为对象,可以使用eval()函数。eval()函数调用JavaScript编辑器。由于JSON是JavaScript的子集,因此编译器将正确的解析文本并产生对象结构。文本必须括在括号中避免产生JavaScript的语法歧义。

    var myObject = eval('(' + myJSONtext + ')');

    eval函数非常快速。它可以编译执行任何JavaScript程序,因此产生了安全性问题。当使用可信任与完善的源代码时才可以使用eval函数。这样可以更安全的使用JSON解析器。使用XMLHttpRequest的web应用,页面之间的通讯只允许同源,因此是可以信任的。但这却不是完善的。如果服务器没有严谨的JSON编码,或者没有严格的输入验证,那么可能传送包括危险脚本的无效JSON文本。eval函数将执行恶意的脚本。

    使用JSON解析器可以防止此类事件。JSON解析器只能辨识JSON文本,拒绝所有脚本。提供了本地JSON支持的浏览器的JSON解析器将远快于eval函数。预计未来的ECMAScript标准将支持本地JSON。

    var myObject = JSON.parse(myJSONtext, reviver);

    一个替换函数(reviver function)做为可选参数被最终结果的每一级的键(key)与值(value)调用。 每个值都将被替换函数的值代替。这可以用来将一般的类改变成伪类的实例,或者将日期字符串转变为日期对象。

    myData = JSON.parse(text, function (key, value) {
        var type;
        if (value && typeof value === 'object') {
            type = value.type;
            if (typeof type === 'string' && typeof window[type] === 'function') {
                return new (window[type])(value);
            }
        }
        return value;
    });

    JSON stringifier进行反向操作,可以把JavaScript数据结构转换为JSON文本。JSON不支持循环数据结构,因此应小心不要为JSON stringifier提供循环结构。

    var myJSONText = JSON.stringify(myObject, replacer);

    如果stringify函数发现一个带有toJSON方法的对象,它将执行此方法,并且返回产生的值。这样一个对象就可以决定自己的JSON表现。

    stringifier方法可以携带一个可选的字符串数组。这些字符串被用于选择包括在JSON文本中的属性。

    stringifier方法可以携带一个可选的替代(replacer)函数。它将在结构中每个值的toJSON方法(如果有的话)后面执行。它将每个键与值做为参数传递,当然对象要包含这个键。值将被stringified返回。

    如果没有提供数组或替代函数,一个用于忽略被集成的属性的可选替代函数将被提供。如果想要所有被继承的属性,可以提供一个简单的替换函数:

    var myJSONText = JSON.stringify(myObject, function (key, value) {
        return value;
    });

    值在JSON中不代表任何内容,函数与未定义(undefined)被排除在外。

    不能确定的数量将被替换为null。为了替代其它的值,可以像下面一样使用替换(replacer)函数

    function replacer(key, value) {
        if (typeof value === 'number' && !isFinite(value)) {
            return String(value);
        }
        return value;
    }

    开放源代码的JSON解析器与JSON stringifier可以使用。通过minified可以小于2.5K。