[英]Apache PHP/OSX Mavericks: - failed to open stream: Too many open files
我最近升级到OSX Mavericks,从那时起,我开始在我的开发机器上得到上述错误。 代码中没有明显的问题(它是一个自动生成的Yii示例应用程序)。 作为升级到小牛队的一部分发生的事情是:
从那时起,我在加载和重新加载网站几次之后就遇到了这个问题。 发生此错误后,我的Web服务器将继续为localhost上托管的任何其他应用程序返回相同的错误。 我必须提到静态网页服务很好。
我见过几个线程关于这一主题。 大多数人都指出代码中的问题是文件句柄未正确关闭,从而超过了打开文件限制阈值。 我也发现这个线程似乎暗示这可能是一个zend调试器问题。 还有针对php 5.2.x提交的错误报告 。 在这里的帖子之后,我尝试了以下内容:
$ ulimit -a
报道:
open files (-n) 256
也,
sysctl -a | grep files
回报,
kern.maxfiles = 12288
kern.maxfilesperproc = 10240
kern.maxfiles: 12288
kern.maxfilesperproc: 10240
kern.num_files: 3248
另一个有趣的线程建议使用以下方法提高此限制(目前为256):
ulimit -n 1024
我已经尝试了一切,但似乎没有任何工作。 问题也不能始终如一地重现。
我想知道是使用ulimit -n 1024
会影响apache,因为从我读过的内容来看,它会影响shell可以打开的文件数量。
任何帮助表示赞赏。
编辑:
apache
有所帮助,直到再次遇到错误。 从http://docs.basho.com/riak/latest/ops/tuning/open-files-limit/#Mac-OS-X无耻地偷走
要检查Mac OS X系统上的当前限制,请运行:
$ launchctl limit maxfiles
最后两列分别是软限制和硬限制。
要调整OS X 10.7(Lion)或更高版本中的最大打开文件限制,请编辑/etc/launchd.conf并根据需要增加这两个值的限制。
例如,要将软限制设置为16384文件,将硬限制设置为32768文件,请执行以下步骤:
验证当前限制:
$ launchctl limit
cpu unlimited unlimited
filesize unlimited unlimited
data unlimited unlimited
stack 8388608 67104768
core 0 unlimited
rss unlimited unlimited
memlock unlimited unlimited
maxproc 709 1064
maxfiles 10240 10240
编辑(或创建) /etc/launchd.conf并增加限制。 添加如下所示的行(使用适合您环境的值):
limit maxfiles 16384 32768
保存文件,然后重新启动系统以使新限制生效。 重新启动后,使用launchctl limit命令验证新限制:
$ launchctl limit
cpu unlimited unlimited
filesize unlimited unlimited
data unlimited unlimited
stack 8388608 67104768
core 0 unlimited
rss unlimited unlimited
memlock unlimited unlimited
maxproc 709 1064
maxfiles 16384 32768
如果您在运行Apache时遇到此问题,可以配置apache以增加限制:
$ sudo vi /usr/sbin/apachectl
找到: ULIMIT_MAX_FILES=""
并将此行更改为:
ULIMIT_MAX_FILES="ulimit 4096"
然后: sudo apachectl restart
这不适用于CLI脚本。 但是直接向~/.bash_profile
(或等效的)添加ulimit应该可以用于此目的。
这样做的好处是可以为apache和终端设置特定限制,而不会影响其他应用程序。
此外,您应该能够通过将ulimit
替换为适用于该环境的命令来使此方法适用于其他操作系统。
我在El Capitain遇到了同样的问题。 在这里找到一篇文章我应该归功于解决方案。 请按照以下操作:
调整打开文件限制要在Yosemite及更高版本的系统范围内调整打开文件限制,您需要创建两个配置文件。 第一个是/Library/LaunchDaemons/limit.maxfiles.plist中的属性列表(aka plist)文件,其中包含以下XML配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>limit.maxfiles</string>
<key>ProgramArguments</key>
<array>
<string>launchctl</string>
<string>limit</string>
<string>maxfiles</string>
<string>65536</string>
<string>65536</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>
这会将打开文件限制设置为65536.第二个plist配置文件应存储在/Library/LaunchDaemons/limit.maxproc.plist中,其中包含以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple/DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>limit.maxproc</string>
<key>ProgramArguments</key>
<array>
<string>launchctl</string>
<string>limit</string>
<string>maxproc</string>
<string>2048</string>
<string>2048</string>
</array>
<key>RunAtLoad</key>
<true />
<key>ServiceIPC</key>
<false />
</dict>
</plist>
两个plist文件必须由root:wheel拥有并具有权限-rw-r-r-。 重启系统。
还建议在.bashrc中为用户会话设置它们并添加:
ulimit -n 65536
ulimit -u 2048
希望这可以帮助。
关于上面的调试器补丁答案。 不幸的是,上面提供的答案对我不起作用,因为它适用于php版本5.4,我必须限制自己到php 5.3。
Zend发布了他们的服务器版本6.3,它支持5.3的php。 我已经玩了一段时间的安装(在将我的ulimit放回到Apple的默认值之后)来测试它并且没有遇到任何问题。 在升级之前,我无法在不提高限制的情况下进行任何php调试。
根据http://forums.zend.com/viewtopic.php?t=110823&start=10#p219438我认为这实际上只是在6.2中修复的Zend Server中的一个错误。
运行xDebug时出现同样的错误。 升级解决了这个问题。
看到:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.