Apache PHP / OSX Mavericks: - 无法打开流:打开的文件过多

时间:2013-11-04 11:26:24

标签: php macos apache yii

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

  1. PHP从与OSX Lion捆绑在一起的5.2.x升级到5.4.x。
  2. 我必须通过安装Zend Server获取Zend Debugger for PHP 5.4,拿起ZendDebugger.so并卸载Zend Server(所有这一切都是因为Zend没有为php 5.4提供独立版本的调试器.X)。
  3. 从那以后,我在加载和重新加载网站几次之后就遇到了这个问题。发生此错误后,我的Web服务器将继续为localhost上托管的任何其他应用程序返回相同的错误。我必须提到静态网页服务很好。

    我在这个主题上看过几个threads。大多数人都指出代码中的问题是文件句柄未正确关闭,从而超过了打开文件限制阈值。我还发现这个thread似乎表明这可能是一个zend调试器问题。还为php 5.2.x提交了bug report。在帖子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可以打开的文件数。

    感谢任何帮助。

    修改

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

7 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分:5)

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

$ sudo vi /usr/sbin/apachectl

定位: ULIMIT_MAX_FILES=""

并将此行更改为:

ULIMIT_MAX_FILES="ulimit 4096"

然后: sudo apachectl restart

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

这样做的好处是可以为apache和终端设置特定限制,而不会影响其他应用程序。

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

答案 2 :(得分:2)

我在El Capitain遇到了同样的问题。找到一篇文章here我应该归功于解决方案。请按照以下操作:

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

希望这有帮助。

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)