Apache PHP/OSX Mavericks: - 无法打开流:打开的文件太多
Posted
技术标签:
【中文标题】Apache PHP/OSX Mavericks: - 无法打开流:打开的文件太多【英文标题】:Apache PHP/OSX Mavericks: - failed to open stream: Too many open files 【发布时间】:2013-11-15 00:20:07 【问题描述】:我最近升级到 OSX Mavericks,从那时起,我的开发机器上开始出现上述错误。代码中没有明显的问题(它是一个自动生成的Yii 示例应用程序)。作为升级到 Mavericks 的一部分发生的情况是:
-
php 已从与 OSX Lion 捆绑的 5.2.x 升级到 5.4.x。
我必须通过安装Zend Server、获取 ZendDebugger.so 并卸载 Zend Server 来获得 PHP 5.4 的 Zend 调试器(这一切都是因为 Zend 没有为 php 5.4.x 提供独立版本的调试器)。
从那时起,我在加载和重新加载网站几次后遇到了这个问题。发生此错误后,我的 Web 服务器不断为 localhost 上托管的任何其他应用程序返回相同的错误。我不得不提一下,静态网页服务很好。
我见过几个关于这个话题的threads。大多数人指出代码中文件句柄未正确关闭的问题,从而超过了打开文件限制阈值。我还发现了这个thread,这似乎表明这可能是一个zend 调试器问题。还有一个bug report 为 php 5.2.x 提交。跟随线程here,我尝试了以下操作:
$ 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
另一个有趣的thread 建议使用以下方法提高此限制(当前为 256):
ulimit -n 1024
我已经尝试了所有方法,但似乎没有任何效果。该问题也不能始终如一地重现。
我想知道使用 ulimit -n 1024
会影响 apache,因为据我所知,它会影响 shell 可以打开的文件数量。
感谢任何帮助。
编辑:
-
重新启动
apache
会有所帮助,直到再次遇到错误。
让网络服务器闲置一段时间(没有明确的时间间隔)也有帮助。
【问题讨论】:
【参考方案1】:无耻地从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
【讨论】:
感谢您的努力。我提到我已经尝试增加最大打开文件限制。这对我没有多大帮助,因为最终每个限制都会被击中。 嗨,我试过了,但即使重新启动我的 mac,launchctl limit 仍然返回原始值。 /etc/launchd.conf 似乎没有考虑。我在小牛队 10.9 上运行。有什么想法吗? 在 Mavericks 上,maxfiles
硬限制应该是“无限制”。无论如何,您仍然应该能够在/etc/launchd.conf
中设置不同的限制和其他环境内容。但请注意:如果此文件中存在语法错误,则所有内容都会被忽略(但总比拒绝启动或登录要好)。
这不再有效。请看unix.stackexchange.com/questions/108174/…【参考方案2】:
如果您在运行 Apache 时遇到此问题,您可以配置 apache 以增加限制:
$ sudo vi /usr/sbin/apachectl
定位:
ULIMIT_MAX_FILES=""
并将这一行更改为:
ULIMIT_MAX_FILES="ulimit 4096"
然后:
sudo apachectl restart
这不适用于 CLI 脚本。但是直接将 ulimit 添加到您的 ~/.bash_profile
(或等效项)应该可以达到此目的。
这样做的好处是可以为 apache 和您的终端设置特定限制,而不会影响其他应用程序。
此外,您应该能够通过将ulimit
替换为适用于该环境的命令来将此方法应用于其他操作系统。
【讨论】:
这为我在 MAC OS Mojave 10.14.5 上修复了它,谢谢。【参考方案3】:我在 El Capitain 上遇到了同样的问题。找到了一篇文章here 我对解决方案应有尽有。请按照以下操作:
调整打开文件限制 要在 Yosemite 及更高版本上调整系统范围内的打开文件限制,您需要创建两个配置文件。第一个是 /Library/LaunchDaemons/limit.maxfiles.plist 中的属性列表(又名 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
希望这会有所帮助。
【讨论】:
【参考方案4】:我可能正遭受信息过载的困扰。 here 提供了一个可能的解释,我在原始帖子中也提到过。我想我错过了 OP 提到他正在使用 Mac OSX 10.8.x 的小细节。我在 10.9 上,所以我从页面下载了 zenddebugger.so,一切看起来都不错。一整天都没有收到一个too many open files
。
所以,可能是 ZendDebugger 问题。
【讨论】:
这为我解决了问题。自从我再次看到该错误以来已经一个多月了。【参考方案5】:关于上面的调试器补丁答案。不幸的是,上面提供的答案对我不起作用,因为它适用于 php 5.4 版本,我必须将自己限制为 php 5.3。
Zend 已经发布了他们的服务器的 6.3 版本,它支持 5.3 的 php。我一直在玩安装一段时间(在将我的 ulimit 降回 Apple 的默认值之后)来测试它并且没有遇到任何问题。在升级之前,我无法在不提高限制的情况下进行任何 php 调试。
【讨论】:
是的,该错误已在 Zend Server 6.2 中修复 forums.zend.com/viewtopic.php?t=110823&start=10【参考方案6】:根据http://forums.zend.com/viewtopic.php?t=110823&start=10#p219438,我认为这实际上只是 Zend Server 中的一个错误,已在 6.2 中修复。
【讨论】:
【参考方案7】:运行 xDebug 时遇到同样的错误。 升级解决了这个问题。
见:
https://superuser.com/questions/787888/too-many-files-open-on-mac-osx-after-running-apache-in-php-with-xdebug-for-som/829413#829413
【讨论】:
以上是关于Apache PHP/OSX Mavericks: - 无法打开流:打开的文件太多的主要内容,如果未能解决你的问题,请参考以下文章
在 OS X Mavericks 10.9 上安装 apache 2.4
OS X 10.9 Mavericks - 使用虚拟主机设置本地主机
php [OSX脚本] macOS的脚本和命令#mac #os #osx #macos