2012-1-30 17:54 Monday  

服务器是win2003+apache+php+mysql
前一段时间重装apache后,现在就不能使用curl模块了,
php.ini的配置是正确的。

百度一下,大家的解决方法都是复制 libeay32.dll 和 ssleay32.dll到/windows/system32/,有的甚至说要复制4个,再加上php5ts.php,php_curl.php我也做过,还是不行。

在csdn上提问后,在网友的提醒下,我查看了一下日志,提示php_curl.dll载入错误,

于是在修改php.ini里面的dll路径后,还是提示相同的错误

PHP Warning: PHP Startup: Unable to load dynamic library 'c:/php5/ext/php_curl.dll' - \xca\xd4\xcd\xbc\xb7\xc3\xce\xca\xce\xde\xd0\xa7\xb5\xc4\xb5\xd8\xd6\xb7\xa1\xa3\r\n in Unknown on line 0

我以为是路径的问题,结果发现不是。

在更深的百度之后,找到一个答案就是在apache的配置文件中载入libeay32.dll 和 ssleay32.dll

于是,在加了下面两段话之后

LoadFile "c:/php5/ssleay32.dll"
LoadFile "c:/php5/libeay32.dll"

问题解决~

转帖 (1):

这几天遇到了一个很多人都遇到过的问题,这个问题在google上有太多的人都遇到,但很少有指出最终的解决方案, 大部分是解决了AcceptEx failed,但引起了内存的疯狂增加(“memory leak”)。这几天遇到这个问题后也费了不少功夫,但没有从网上找到最根本的解决办法,幸运的是,最终探索出了一个解决方案,在这里写出来,希望能帮助 后来遇到问题的难友们尽早解决问题。

遇到的问题比较曲折,大体经过是:

某天,不能访问apache的页面,检查得知,apache在疯狂写日志,而且大部分是一句 话:“winnt_accept: Asynchronous AcceptEx failed”,最多的时候写到了200M以上。经各方探索,最终在apache的手册上找到了一个解决方法:

在http.conf配置中设置Win32DisableAcceptEx参数。这样做的原因是,apache在某些Windows版本上可能兼容性不足,在调用AcceptEx接收请求时可能有问题,使用上面的参数禁用后,apache会使用另一套方案替代(BSD),这种方案效率稍微低些。详见:

http://httpd.apache.org/docs/2.0/mod/mpm_winnt.html#win32disableacceptex

当时修改完该设置后,重启apache,测试了一段时间,感觉原来的问题确实消除了,不过当时感觉内存占用量非常明显,但测试一段时间没有问题就放过去了,直到今天下午:

今天下午发现又不能访问页面了,然后检查apache发现它已经crash了。然后打开日志发现最后一句:“Out of memory!”--内存不足了。

然后对内存进行测试,发现一直按住F5键不停,apache的内存就不停上涨,似乎有一直吃光内存的意思,停止刷新 后只能下降到500M左右了(刚启动时是20M)。如果不使用Win32DisableAcceptEx参数则明显没有这个问题,停止刷新后能回落到 20M。看来是这个参数的原因。

于是从google上寻找答案,但可惜的是没有太多有价值的东西。只能看到apache的官方网站已经把这个问题列 为了一个bug,甚至有些人又退回到不使用那个参数(忍受AcceptEx failed的风险?)。最后看到了一个说法,将ThreadsPerChild 设为170以下就可以,可为什么是170以下呢?作者没有很多描述。于是自己探索如下,使用一个简单的页面,不停的按住F5刷新:

如果将Threadsperchild 设为50,无论怎么刷新内存最多到150M左右,但不会再长了。停止刷新后,会降到55M左右;如果将ThreadsPerChild 设为100, 内存峰值:282M,能降到92M左右;如果将ThreadsPerChild设为550,内存峰值2G,停止后到500M左右……。

按照上述规律,基本上找到了问题的原因,因为我的配置中原来使用的是ThreadsPerChild 550,这样也就是内存很可能会长到2G以上(复杂页面比简单页面耗用量大),而机器的内存设置不能支持这么大,因此应该就是这个问题了。

所以最终的解决方法就是保留Win32DisableAcceptEx的同时修改了ThreadsPerChild 150。解决完成后我推测内存疯狂增长的原因:

首先,ThreadsPerChild的意思是系统启动时默认启动的等待线程数,用来等待处理客户的请求。在使用 AcceptEx时内存增长不明显并且可以降回20M左右,可能是因为用户来了请求线程分配了一些资源,此时内存增长,但用户访问完成后,这些资源都释放 了(这些资源很可能都和用户相关,没法留着下个用户使用,所以都释放了)。但禁用了AcceptEx后,由于apache每个线程需要处理网络事件,因此 每个线程的资源需要就多了,并且处理完一个用户的请求后,有些资源不想释放,是可以对下个用户重用的,这样就留在了里面。由于我的线程数设了550(估计 网上很多人遇到这个类似于“memory leak”问题的可能也都设的比较大或者机器虚拟内存较小),这样当线程较多时就会出现达到最大内存的情况,而且这种现象给人的感觉就是有内存泄漏,因为 初始时是20M,来一个请求后线程分配一些资源(暂时不释放的),这样可能就变成了21M,如果同时有10个人访问,可能等他们访问完后就变成了50M, 感觉是有内存泄漏。

这样也就解释了为什么有人说设到170以下就不再出现内存不足了,可能因为他的机器这个配置比较合适。不过知道了上述的规律和一些推测,这个结论应该是根据自己机器的情况合理调配。

我很少接触apache等linux上的东西,所知较少,只是遇到了问题才开始了解的上述信息,可能有很多的理解错误。如果能给别人一些帮助我会比较欣慰,如果误导甚至帮了倒忙,也希望能够理解!

如果在Win下使用Apache,而你又必须要开防火墙之类的软件,那么如果你的Apache运行有问题,比如文件下载不完全或者损坏、未知错误信息、防火墙冲突等等,请参考如下:

打开你的 httpd.conf 配置文件,看是否如下修改可以解决问题:

    EnableSendfile Off
    EnableMMAP Off
    Win32DisableAcceptEx

转帖 (2):

现象:】


访问apache静态的http内容,有时候比较慢,有时候“找不到网页”404错误;另外在error.log里也报错:

[Mon May 26 10:11:47 2008] [warn] (OS 64)指定的网络名不再可用。 : winnt_accept: Asynchronous AcceptEx failed.

原因:】

winnt(MPM) - Apache 2.2 参考手册有下列描述

Apache MPM winnt

说明 专门为Windows NT优化过的MPM
状态 MPM
模块名 mpm_winnt_module
源文件 mpm_winnt.c

概述

该多路处理模块(MPM)是Windows NT上的默认值。它使用一个单独的父进程产生一个单独的子进程,在这个子进程中轮流产生多个线程来处理请求。

Win32DisableAcceptEx 指令

说明 使用accept()代替AcceptEx()接受网络链接
语法 Win32DisableAcceptEx
默认值 AcceptEx()是默认的,使用这个指令将禁用它。
作用域 server config
状态 MPM
模块 mpm_winnt
兼容性 仅在 Apache 2.0.49 及以后的版本中可用

AcceptEx()是一个微软的WinSock2 API ,通过使用BSD风格的accept() API提供了性能改善。一些流行的Windows产品,比如防病毒软件或虚拟专用网络软件,会干扰AcceptEx()的正确操作。如果你遇到类似于如下的错误:

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

你就需要使用这个指令来禁止使用AcceptEx()

【解决办法:】

在httpd.conf文件中添加 Win32DisableAcceptEx 标记,如下:

<IfModule mpm_winnt.c>
ThreadsPerChild 150
MaxRequestsPerChild 10000
Win32DisableAcceptEx
</IfModule>

这样可以允许并发连接更大一些。同时性能上也不会有明显的降低。

如果Apache的 error.log还是出现大量的:Sat Dec 24 17:21:28 2006] [warn] (OS 64)指定的网络名不再可用。 : winnt_accept: Asynchronous AcceptEx failed。可以参考下列配置:

1、网上邻居->本地连接->属性->internet协议(TCP/IP)->属性->高级->wins标签->去掉启用LMhosts查询前的勾.
2、控制面版->windows防火墙->高级标签->本地连接设置->服务的标签里勾选安全Web服务器(HTTPS)。
3、然后退出Apache,再打开启动就可以了 ,一开始我没有退出,直接在那重启,就是不可以,一定要先停止,在开启即可

转帖 (3):

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

   以前也看到,但忽略了。这回不能再放过她了。

   看了几篇(winnt(MPM) - Apache 2.2 中文版参考手册),说是因为一些流行的视窗系统产品,比如防病毒软件或虚拟专用网络软件,会干扰AcceptEx()的正确操作。于是在apache设置文件中添加如下语句:

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

   停止Apache,再启动。确实新设置起作用了:

[notice] Disabled use of AcceptEx() WinSock2 API
[notice] mod_python: Creating 8 session mutexes based on 0 max processes and 1000 max threads.
[notice] Child 2380: Child process is running
[notice] Child 2380: Acquired the start mutex.
[notice] Child 2380: Starting 1000 worker threads.

   okay,似乎错误不再来了。

问题一、
Apache日志中“指定的网络名不再可用”问题的解决
现象:
[Sat Mar 03 13:29:49 2007] [warn] (OS 64)指定的网络名不再可用。   : winnt_accept: Asynchronous AcceptEx failed.
出现这个故障时硬盘灯狂闪,内存占用极大,访问极慢。
分析:
AcceptEx() 是 Microsoft WinSock v2 API 一组提升网路效率 API 中的指令。而且在 Windows 上似乎蛮有可能出问题的。
   注:可能為了效能还是预设為开啟 AcceptEx()
解决:
    如果无预警的发生问题,我猜可能是 Windows Update 或是防火墙、防毒软体更新了某些网路原件,造成 Microsoft WinSock v2 API 动作不正常,这时可以把这个功能先给关掉。
   依照官方说明 , Win32DisableAcceptEx 这个功能,只有 2.0.49 版以后的才可以使用,所以我猜测 AcceptEx() 这个指令大概也是 2.0.49 才会开始支援(目前最新的就是 2.0.49)。
   关掉 AcceptEx() 的方式只要在 httpd.conf 找到   区段,加入 Win32DisableAcceptEx 就可以了。
Win32DisableAcceptEx #加入这一行
ThreadsPerChild 250
MaxRequestsPerChild 0

疑问:如果把AcceptEx()这个关掉了,是否会影响访问的速度;如果影响速度,又怎样不让速度慢下来。
问题二、
apache错误日志里面出现"connection reset by peer"
分析:
这个问题一般是客户端在连接还没有完全建立的时候就取消连接,比如用户按了浏览器上面的“停止”按钮,一般来说没有什么问题。但是如果频繁出现,就表示很多客户端连接到Apache服务器的响应时间太长了,可能是网络的问题或者服务器性能问题。
问题三、
apache错误日志里面提示default.ida或者cmd.exe不存在
分析:
这个说明Internet上面的某些机器中了蠕虫病毒比如Nimda或者Code Red。 你可以略过这些错误,因为这些病毒对Apache无效。
问题四、
apache错误日志里面出现"fcntl: F_SETLKW: No record locks available
现象:
服务器挂起,或者不能启动,错误日志里面出现"fcntl: F_SETLKW: No record locks available"或者类似的信息。
分析:
这个是文件锁定问题,表示Apache服务器在尝试使用一个NFS文件系统上面的同步文件。由于使用并行操作模式,Apache服务器在访问某些特定资源 的时候需要一些同步机制。其中一种同步机制就是文件锁定,这个需要被锁定文件那端的文件系统要支持锁定机制,所以使用NFS文件系统上面的文件会出现这种 问题。
解决:
为了解决NFS文件系统的局限性,可以在配置文件里面加入一行:
  LockFile /var/run/apache-lock
  这个文件对其他人必须是不能写入的。
  注意:Redhat Linux7.x版本以后已经提供了NFS锁定机制,应该不会出现此问题。
2012-1-30 17:47 Monday  
xdebug的性能测试输出文件名是可以配置的。
默认是 xdebug.profiler_output_name = cachegrind.out.%p
那个%p是服务器的pid,会输出“cachegrind.out.1408”之类的文件。
可能这样不太方便测试很多文件的网站。
网上看到的中文文章里面都没有关于这个参数的说明。
我从xdebug官网上找来了它的说明翻译成中文了。
符号 含义 配置样例 样例文件名
%c 当前工作目录的crc32校验值 trace.%c trace.1258863198.xt
%p 当前服务器进程的pid trace.%p trace.5174.xt
%r 随机数 trace.%r trace.072db0.xt
%s 脚本文件名(注) cachegrind.out.%s cachegrind.out._home_httpd_html_test_xdebug_test_php
%t Unix时间戳(秒) trace.%t trace.1179434742.xt
%u Unix时间戳(微秒) trace.%u trace.1179434749_642382.xt
%H $_SERVER['HTTP_HOST'] trace.%H trace.kossu.xt
%R $_SERVER['REQUEST_URI'] trace.%R trace._test_xdebug_test_php_var=1_var2=2.xt
%S session_id (来自$_COOKIE 如果设置了的话) trace.%S trace.c70c1ec2375af58f74b390bbdd2a679d.xt
%% %字符 trace.%% trace.%.xt
注 此项不适用于trace file的文件名

从上表可以找到一些适合你的参数。
比如,我想针对每个文件生成一个输出文件。
那么我可以用:
xdebug.profiler_output_name = cachegrind.out.%s
多个域名的话,也可以组合使用
xdebug.profiler_output_name = cachegrind.out.%H.%u.%s
=============================================================
使用Xdebug调试和优化PHP程序系列教程之Xdebug配置,根据Xdebug的官方文档来详细解释Xdebug的参数配置。
Xdebug配置
第一部分:安装
预编译模块
安装预编译模块是很容易的。只需要将它们放到一个目录中,并将下面的内容添加到php.ini中:(不要忘记更改路径和文件名为你自己的值,并确信你使用的是完整路)
zend_extension_ts = "c:/php/modules/php_xdebug.dll"
第二部分:基本特征:
相关参数设置
xdebug.default_enable
类型:布尔型 默认值:On
如果这项设置为On,堆栈跟踪将被默认的显示在错误事件中。你可以通过在代码中使用xdebug_disable()来禁止堆叠跟踪的显示。因为这是xdebug基本功能之一,将这项参数设置为On是比较明智的。
xdebug.max_nesting_level
类型:整型 默认值:100
The value of this setting is the maximum level of nested functions that are allowed before the script will be aborted.
限制无限递归的访问深度。这项参数设置的值是脚本失败前所允许的嵌套程序的最大访问深度。
第三部分:堆栈跟踪:
相关参数设置
xdebug.dump_globals
类型:布尔型 默认值:1
限制是否显示被xdebug.dump.*设置定义的超全局变量的值
例 如,xdebug.dump.SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT 将打印 PHP 超全局变量 $_SERVER['REQUEST_METHOD']、$_SERVER['REQUEST_URI'] 和 $_SERVER['HTTP_USER_AGENT']。
xdebug.dump_once
类型:布尔型 默认值:1
限制是否超全局变量的值应该转储在所有出错环境(设置为Off时)或仅仅在开始的地方(设置为On时)
xdebug.dump_undefined
类型:布尔型 默认值:0
如果你想从超全局变量中转储未定义的值,你应该把这个参数设置成On,否则就设置成Off
xdebug.show_exception_trace
类型:整型 默认值:0
当这个参数被设置为1时,即使捕捉到异常,xdebug仍将强制执行异常跟踪当一个异常出现时。
xdebug.show_local_vars
类型:整型 默认值:0
当这个参数被设置为不等于0时,xdebug在错环境中所产生的堆栈转储还将显示所有局部变量,包括尚未初始化的变量在最上面。要注意的是这将产生大量的信息,也因此默认情况下是关闭的。
第四部分:分析PHP脚本
相关参数设置
xdebug.profiler_append
类型:整型 默认值:0
当这个参数被设置为1时,文件将不会被追加当一个新的需求到一个相同的文件时(依靠xdebug.profiler_output_name的设置)。相反的设置的话,文件将被附加成一个新文件。
xdebug.profiler_enable
类型:整型 默认值:0
开放xdebug文件的权限,就是在文件输出目录中创建文件。那些文件可以通过KCacheGrind来阅读来展现你的数据。这个设置不能通过在你的脚本中调用ini_set()来设置。
xdebug.profiler_output_dir
类型:字符串 默认值:/tmp
这个文件是profiler文件输出写入的,确信PHP用户对这个目录有写入的权限。这个设置不能通过在你的脚本中调用ini_set()来设置。
xdebug.profiler_output_name
类型:字符串 默认值:cachegrind.out%p
这个设置决定了转储跟踪写入的文件的名称。
第五部分:远程Debug
相关参数设置
xdebug.remote_autostart
类型:布尔型 默认值:0
一般来说,你需要使用明确的HTTP GET/POST变量来开启远程debug。而当这个参数设置为On,xdebug将经常试图去开启一个远程debug session并试图去连接客户端,即使GET/POST/COOKIE变量不是当前的。
xdebug.remote_enable
类型:布尔型 默认值:0
这个开关控制xdebug是否应该试着去连接一个按照xdebug.remote_host和xdebug.remote_port来设置监听主机和端口的debug客户端。
xdebug.remote_host
类型:字符串 默认值:localhost
选择debug客户端正在运行的主机,你不仅可以使用主机名还可以使用IP地址
xdebug.remote_port
类型:整型 默认值:9000
这个端口是xdebug试着去连接远程主机的。9000是一般客户端和被绑定的debug客户端默认的端口。许多客户端都使用这个端口数字,最好不要去修改这个设置。
注意:所有以上参数修改后,要重启Apache才能生效!
=======================================================
Xdebug的配置
[Zend]
;关闭ZendExtensionManager,它和Xdebug有冲突,只能加载一个。
;zend_extension_ts=E:\XAMPP\php\zendOptimizer\lib\ZendExtensionManager.dll
[XDebug]
;; Only Zend OR (!) XDebug
zend_extension_ts=”E:\XAMPP\php\ext\php_xdebug.dll”
xdebug.profiler_enable=1
xdebug.profiler_output_dir=”E:\XAMPP\tmp”
xdebug.profiler_output_name=cachegrind.out.%p.%s
;回答四个 w 问题
xdebug.default_enable = On
xdebug.show_exception_trace = On
xdebug.show_local_vars = 1
xdebug.max_nesting_level = 50
xdebug.var_display_max_depth = 6
xdebug.dump_once = On
xdebug.dump_globals = On
xdebug.dump_undefined = On
xdebug.dump.REQUEST = *
xdebug.dump.SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT
xdebug.dump.GET=*
xdebug.dump.POST=*
;跟踪代码
xdebug.trace_format = 0
xdebug.auto_trace = On
xdebug.trace_output_dir = “E:\XAMPP\tmp”
;每个文件请求会生成一个trace文件,否则会覆盖,你只能看到最后执行的,
xdebug.trace_output_name = trace.%c.%p.%R
xdebug.collect_vars=on
xdebug.collect_params = 4
xdebug.collect_includes = On
xdebug.collect_return = On
xdebug.show_mem_delta = On

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/binger819623/archive/2009/03/12/3985506.aspx
2012-1-30 17:44 Monday  
第1种方法:使用rotatelogs
第1种方法是网上比较流行的做法。
编辑httpd.conf文件,将CustomLog "logs/access.log" common注释掉
加入如下一行:
CustomLog "|bin/rotatelogs logs/access-%Y-%m-%d.log 86400" common
86400代表一天,表示每天生成一个日志文件。
%Y-%m-%d代表年-月-日
第2种方法:使用mod_log_rotate
第2种方法要利用mod_log_rotate.so模块。
1.首先下载mod_log_rotate.so模块,网站http://www.apachelounge.com/download/下载最新版本。目前版本mod_log_rotate-1.00a-w32.zip
2.将mod_log_rotate.so文件拷贝到Apache2/modules目录下。
4.编辑httpd.conf,
加入一行:
LoadModule log_rotate_module modules/mod_log_rotate.so
写日志的地方修改为CustomLog logs/access_log.%Y%m%d-%H%M%S common
再加入下列三行:
RotateLogs On #代表启用自动生成日志;
RotateLogsLocalTime On #代表使用本地时间;
RotateInterval 86400 #代表每天生成
5.重新启动apache,搞定。
2012-1-30 17:43 Monday  
Windows下:
1、开启安全模式,可以禁用exec()、system()等函数
2、在httpd.conf中用php_admin_value open_basedir限制PHP的存取目录
3、在php_admin_value open_basedir别忘了加上php.ini中指定的PHP临时上传目录和session保存目录,不然会无法上传文件、存取session
php.ini中按如下配置:
upload_tmp_dir = "E:/APMServ5.2.0/PHP/uploadtemp/"
session.save_path = "E:/APMServ5.2.0/PHP/sessiondata/"

4、更多内容参考我的APMServ软件的配置 [url]http://apmserv.s135.com[/url]

httpd.conf配置(假如将PHP读写权限限制在E:\smis目录下)

Apache2.0配置示例:
<VirtualHost *:80>
ServerName [url]www.abc.com[/url]
DocumentRoot "E:/smis"
Options FollowSymLinks IncludesNOEXEC Indexes
DirectoryIndex index.html index.htm default.htm index.php default.php
AllowOverride None
Order Deny,Allow
Allow from all
php_admin_value open_basedir "E:/smis/;E:/APMServ5.2.0/PHP/uploadtemp/;E:/APMServ5.2.0/PHP/sessiondata/"
php_admin_value safe_mode On
</VirtualHost>




Apache2.2配置示例:

<VirtualHost *:80>
ServerName [url]www.abc.com[/url]
DocumentRoot "E:/smis"
</VirtualHost>
<Directory "E:/smis">
Options FollowSymLinks IncludesNOEXEC Indexes
DirectoryIndex index.html index.htm default.htm index.php default.php
AllowOverride None
Order Deny,Allow
Allow from all
php_admin_value open_basedir "E:/smis/;E:/APMServ5.2.0/PHP/uploadtemp/;E:/APMServ5.2.0/PHP/sessiondata/"
php_admin_value safe_mode On
</Directory>
2012-1-30 17:43 Monday  
1. 用打开“httpd.conf”配置文件。

  2. 添加以下内容。

  Alias /icons/ "D:/Apache2/icons/"

  (设置虚拟目录名为“icons”,放到网站根目录的“icons”内,其真实地址为“D:/Apache2/icons/”。请注意,“ /icons/”以斜线结束,这就要求输入访问地址时也要输入最后的斜线,如“http://10.2.1.103/icons/”,如果这里省略的话, 就可以输入访问地址时省略,不过系统会自动给加上这一斜线。真实地址“D:/Apache2/icons/”因安装位置而不同,需要注意)

  (设置虚拟目录属性)

  Options Indexes MultiViews

  (当没有主页时以是否显示文件及文件夹)

  AllowOverride None

  Order allow,deny

  Allow from all

  3. 回车换行后输入修改的以上内容如下。

  Alias /ziyuan "D:/ftproot/" (访问时可以省略最后的斜线)

  Options Indexes MultiViews

  AllowOverride None

  Order allow,deny

  Allow from all

  4. 保存以上内容,重新启动Apache服务器

1.创建虚拟主机

NameVirtualHost 192.168.1.101

<VirtualHost 192.168.1.101>
DocumentRoot "c:/www"
ServerName test.yiwuku.net
</VirtualHost>


<VirtualHost 192.168.1.101>
DocumentRoot "c:/www/w1"
ServerName test1.yiwuku.net
</VirtualHost>

<VirtualHost 192.168.1.101>
DocumentRoot "c:/www/w2"
ServerName test2.yiwuku.net
</VirtualHost>

也可以加上 

ErrorLog /var/log/httpd/hr.yourdomain.com/error_log
TransferLog /var/log/hr.yourdomain.com/access_log

2.不能启动,运行-》cmd 进入到apache的bin目录。输入httpd.exe -w -n "Apache" -k start 会提示配置文件的具体那行出错, 其中"Apache"为服务的名字