Apache PHP / OSX Mavericks: – не удалось открыть поток: слишком много открытых файлов

Недавно я обновился до OSX Mavericks, и с тех пор я начал получать вышеупомянутую ошибку на моей машине разработки. В коде нет очевидной проблемы (это приложение, созданное автоматически с использованием Yii ). Что произошло в рамках обновления до Mavericks:

  1. PHP был обновлен с 5.2.x, который в комплекте с OSX Lion до 5.4.x.
  2. Мне пришлось получить Zend Debugger для PHP 5.4, установив Zend Server , взяв ZendDebugger.so и удалив Zend Server (все это, потому что Zend не предоставляет отдельную версию своего отладчика для php 5.4.x).

С тех пор я получаю эту проблему после загрузки и перезагрузки веб-сайта несколько раз. После возникновения этой ошибки мой веб-сервер продолжает возвращать ту же ошибку для любого другого приложения, размещенного на 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, поскольку из того, что я прочитал, это влияет на количество файлов, которые могут открывать оболочки.

Любая помощь приветствуется.

РЕДАКТИРОВАТЬ:

  1. Перезапуск apache помогает немного, пока ошибка не встретится снова.
  2. Также помогает покинуть веб-сервер на холостом ходу (без определенного интервала).

Бесстыдно украден из 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 

Сохраните файл и перезапустите систему, чтобы новые лимиты вступили в силу. После перезапуска проверьте новые лимиты с помощью команды limitctl 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

locate: ULIMIT_MAX_FILES=""

и измените эту строку на что-то вроде:

ULIMIT_MAX_FILES="ulimit 4096"

Затем: sudo apachectl restart

Это не будет работать для сценариев CLI. Но добавление ulimit непосредственно к вашему ~/.bash_profile (или эквиваленту) должно работать для этой цели.

Это имеет преимущество в том, что вы устанавливаете конкретные лимиты для apache и вашего терминала, не затрагивая другие приложения.

Кроме того, вы должны иметь возможность адаптировать этот метод к другим ОС, заменив ulimit командой, применимой к этой среде.

Я, вероятно, страдал от информационной перегрузки. Здесь предлагается возможное объяснение, о котором я также упоминал в своем оригинальном посте. Думаю, я пропустил небольшую деталь, где OP упоминает, что он работает на Mac OSX 10.8.x. Я на 10.9, поэтому я загрузил zenddebugger.so со страницы, и все выглядит хорошо. Не получили too many open files весь день.

Так, возможно, это проблема ZendDebugger.

Я столкнулся с тем же вопросом в El Capitain. Здесь я нашел статью, заслуживающую должного кредита. Выполните следующие действия:

Настройка открытых ограничений файлов Чтобы настроить ограничения открытых файлов на общесистемной основе в Yosemite и выше, вам необходимо создать два файла конфигурации. Первый – это список свойств (aka plist) в /Library/LaunchDaemons/limit.maxfiles.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 своего сервера, которая поддерживает php в 5.3. Я немного поиграл с установкой (после того, как я удалил свой ulimit обратно по умолчанию Apple), чтобы проверить его и не испытываю никаких проблем. Перед обновлением я не мог отлаживать php без повышения этого предела.

Per http://forums.zend.com/viewtopic.php?t=110823&start=10#p219438 Я думаю, что это действительно была ошибка на сервере Zend, которая была исправлена ​​в 6.2.

Ошибка при запуске xDebug. Обновление решило проблему.

видеть:

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