步行者的专栏

程序开发 网站建设 软件 操作系统 硬件

PHP has encountered an Access Violation问题的解决方法总结

 

这个问题不是很好处理,困惑了很多站长非常时间了
主要出现在windows主机的服务器上。
在php官方,http://bugs.php.net/
也能够查到两三千页的报告,他们官方也是束手无策,经过了11个小版本后,还是没有彻底解决
http://bugs.php.net/search.php?cmd=display&search_for=PHP+has+encountered+an+Access&x=8&y=9

目前我提供一下这几年我维护经验,我的一些民间解决办法

第一种可能:

去掉 php中 eaccelerator 的扩展
这样做能够解决您的问题,不过可能会加重系统负担
因为eaccelerator主要是为了节省系统资源的东西

具体做法是找到php.ini
如果是我帮您配置的,一般在c:/php/php.ini或者 c:/winnt/php.ini 或者c:/windows/php.ini

去掉

zend_extension_ts="C:\php\extensions\eaccelerator_win_xxx.dll"
eaccelerator.shm_size="16"
eaccelerator.cache_dir="c:\temp"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"

ea主要是在unix环境下开发的,但是作者忽略到windows实际上不像u主机那样,是没有u主机的那种内存共享机制的
这个bug已经提交给他们了,希望0.9.5能够解决

当然,如果您的机器这个问题不严重,建议还是保留,ea是一块非常优秀的Php缓存+加速软件
配合zo使用,将会降低系统负担 50%-80%左右,提高负载能力、速度和效率 200%左右


第二种可能

session_save_path 需要设定一个实际的物理路径,并且该目录需要everyone的所有权限,类似U主机的0777


第三种可能
c:/winnt/temp 或者 c:/windows/temp
也需要everyone的所有权限,类似U主机的0777


第四种可能
您的内存严重不足,查看一下,如果有问题,请加内存,最好是一次加两条
比如加1G内存,最好是加2条一模一样的512M。否则没有启用双通道,效果也很一般


第五种可能
ZendOptimizer和php的搭配不是很好
换个版本试试看
目前比较稳定的搭配是
php4.3.11+zo 2.5.10a
或者php4.4.1+zo 3.0 beta2


第六种可能

这种多属于用win2003的用户
他们在应用池中设定了限制
比如多长时间回收,最大使用内存多少等等
这些设置势必造成这个经典的php错误
木头经过数以百计的测试,敢担保问题会出现在这里。

 

---------------------------------------------------------------------其它说明

extension=”eaccelerator.dll” ;扩展文件名
eaccelerator.shm_size=”800″ ;分配的内存以及磁盘限额单位是M
eaccelerator.cache_dir=”C:\temp” ;临时文件目录,确保user权限
eaccelerator.enable=”1″ ;开启缓存服务不?
eaccelerator.optimizer=”1″ ;开启优化不?
eaccelerator.check_mtime=”1″ ;检测文件更新不?
eaccelerator.debug=”0″ ;调试不?
eaccelerator.filter=”*.php” ;文件类型,空格分割支持*和!语法
eaccelerator.shm_max=”.” ;缓存文件大小限制0不限制,如1k,10M,20480
eaccelerator.shm_ttl=”7200″
eaccelerator.shm_prune_period=”3600″
eaccelerator.shm_only=”0″
eaccelerator.compress=”1″ ;压缩不?
eaccelerator.compress_level=”9″
eaccelerator.keys = “shm”
eaccelerator.sessions = “shm”
eaccelerator.content = “shm”
eaccelerator.admin.name=”name” ;WEB控用户名
eaccelerator.admin.password=”198554″ ;WEB控密码,md5 hash,然后把这行和上行的明文写在下行的脚本理
eaccelerator.allowed_admin_path = “D:\www\xxx.com\ec.php” ;WEB控脚本

shm那里,有下面几个可选的,shm_and_disk,内存和硬盘存储数据,shm内存优先超过eaccelerator.shm_size限制后使用硬盘,shm_only仅仅

内存,disk_only仅仅硬盘,none不缓存

最近我给自己的VPS安装了eAccelerator缓存模块,但随之而来的麻烦也来了,我的网站总是出现500错误,让人头大如斗。
于是上网查询,令人遗憾的是没有一个有效的办法,有的甚至叫你禁用eAccelerator。最后从“eAccelerator 完全手册 ”一文中得知

eAccelerator默认使用shm_and_disk模式,我心中在想,这会不会是VPS限制了共享内存呢,于是抱着试试看的态度将
eaccelerator.keys、eaccelerator.sessions、eaccelerator.content手动设置为disk_only,如下:

eaccelerator.keys = "disk_only"
eaccelerator.sessions = "disk_only"
eaccelerator.content = "disk_only"
保存,重启apache服务,故障成功解除,这说明这个错误至少是跟共享内存是有关的,于是我们用半角分号“;”注释掉上面我们设置的这三项

(eaccelerator.keys、eaccelerator.sessions、eaccelerator.content),让它们使用默认值,并且设置:

eaccelerator.shm_ttl = "3600"
eaccelerator.shm_prune_period = "3600"
它们原来的值是0,现在把它改成3600。保存,重启apache服务,测试,依然没有再现500错误,至此这应当就是最佳的解决方案了。

 

 

 

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭