22

我最近升级到 OSX Mavericks,从那时起,我的开发机器上开始出现上述错误。代码中没有明显的问题(它是一个自动生成的Yii示例应用程序)。作为升级到小牛队的一部分发生的事情是:

  1. PHP 从与 OSX Lion 捆绑的 5.2.x 升级到 5.4.x。
  2. 我必须通过安装Zend Server、获取 ZendDebugger.so 并卸载 Zend Server来获得 PHP 5.4 的 Zend 调试器(这一切都是因为 Zend 没有为 php 5.4.x 提供独立版本的调试器)。

从那以后,我可能在加载和重新加载网站几次后遇到了这个问题。发生此错误后,我的 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 可以打开的文件数量。

任何帮助表示赞赏。

编辑:

  1. 重新启动apache会有所帮助,直到再次遇到错误。
  2. 让 Web 服务器闲置一段时间(没有明确的时间间隔)也有帮助。
4

7 回答 7

18

无耻地从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
于 2013-11-05T11:14:05.467 回答
5

如果您在运行 Apache 时遇到此问题,您可以配置 apache 以增加限制:

$ sudo vi /usr/sbin/apachectl

定位: ULIMIT_MAX_FILES=""

并将这一行更改为:

ULIMIT_MAX_FILES="ulimit 4096"

然后: sudo apachectl restart

这不适用于 CLI 脚本。但是直接向您的(或等效的)添加一个 ulimit~/.bash_profile应该可以达到这个目的。

这具有为 apache 和您的终端设置特定限制而不影响其他应用程序的优点。

ulimit此外,您应该能够通过替换适用于该环境的命令来将此方法应用于其他操作系统。

于 2016-02-06T21:07:46.823 回答
2

我在 El Capitain 上遇到了同样的问题。在这里找到一篇文章,我对解决方案负有应有的责任。请执行以下操作:

调整打开文件限制 要在 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

希望这可以帮助。

于 2016-04-21T20:49:07.863 回答
1

我可能正遭受信息过载的困扰。这里提供了一个可能的解释,我在原始帖子中也提到过。我想我错过了 OP 提到他正在使用 Mac OSX 10.8.x 的小细节。我在 10.9,所以我从页面下载了 zenddebugger.so,一切看起来都不错。too many open files一整天都没有收到。

所以,也许这是一个 ZendDebugger 问题。

于 2013-11-05T13:21:35.083 回答
0

关于上面的调试器补丁答案。不幸的是,上面提供的答案对我不起作用,因为它适用于 php 5.4 版,我必须将自己限制为 php 5.3。

Zend 发布了他们的服务器的 6.3 版本,它在 5.3 时支持 php。我一直在玩安装一段时间(在将我的 ulimit 降回 Apple 的默认值之后)来测试它并且没有遇到任何问题。在升级之前,我无法在不提高该限制的情况下进行任何 php 调试。

于 2014-02-18T21:41:50.597 回答
0

根据http://forums.zend.com/viewtopic.php?t=110823&start=10#p219438我认为这实际上只是 Zend Server 中的一个错误,已在 6.2 中修复。

于 2015-07-28T05:09:53.347 回答
0

运行 xDebug 时遇到同样的错误。升级解决了这个问题。

看:

https://superuser.com/questions/787888/too-many-files-open-on-mac-osx-after-running-apache-in-php-with-xdebug-for-som/829413#829413

于 2016-01-20T13:43:24.430 回答