Apache PHP/OSX Mavericks: - не удалось открыть поток: слишком много открытых файлов
Недавно я обновился до OSX Mavericks, и с тех пор я начал получать вышеупомянутую ошибку на моей машине разработки. В коде нет очевидной проблемы (это автоматически созданное приложение Yii). Что произошло в рамках обновления до Mavericks:
- PHP был обновлен с 5.2.x, который в комплекте с OSX Lion до 5.4.x.
- Мне пришлось получить 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, поскольку из того, что я прочитал, это влияет на количество файлов, которые могут открывать оболочки.
Любая помощь приветствуется.
EDIT:
- Перезапуск
apache
помогает немного, пока ошибка не встретится снова.
- Кроме того, помогает оставить веб-сервер на холостом ходу (без определенного интервала).
Ответы
Ответ 1
Я, вероятно, страдал от информационной перегрузки. Возможное объяснение предлагается здесь, о котором я также упоминал в своем оригинальном посте. Думаю, я пропустил небольшую деталь, где OP упоминает, что он работает на Mac OSX 10.8.x. Я на 10.9, поэтому я загрузил zenddebugger.so со страницы, и все выглядит хорошо. Не получили ни одного too many open files
весь день.
Итак, возможно, это проблема ZendDebugger.
Ответ 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
Ответ 3
Если вы столкнулись с этой проблемой при запуске Apache, вы можете настроить apache для увеличения лимита:
$ sudo vi /usr/sbin/apachectl
найти:
ULIMIT_MAX_FILES=""
и измените эту строку на что-то вроде:
ULIMIT_MAX_FILES="ulimit 4096"
Тогда:
sudo apachectl restart
Это не будет работать для сценариев CLI. Но добавление ulimit непосредственно к вашему ~/.bash_profile
(или эквиваленту) должно работать для этой цели.
Это имеет то преимущество, что вы устанавливаете конкретные лимиты для apache и вашего терминала, не затрагивая другие приложения.
Кроме того, вы должны иметь возможность адаптировать этот метод к другим ОС, заменив ulimit
на команду, применимую к этой среде.
Ответ 4
Я столкнулся с тем же вопросом в 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
Надеюсь, что это поможет.
Ответ 5
Относительно ответа на исправление отладчика выше. К сожалению, приведенный выше ответ не будет работать для меня, поскольку он применим к версиям PHP версии 5.4, и я должен ограничиться php 5.3.
Zend выпустила версию 6.3 своего сервера, которая поддерживает php в 5.3. Я немного поиграл с установкой (после того, как я удалил свой ulimit до Apple по умолчанию), чтобы проверить его и не испытываю никаких проблем. Перед обновлением я не мог выполнять отладки php без повышения этого предела.
Ответ 6
Per http://forums.zend.com/viewtopic.php?t=110823&start=10#p219438 Я думаю, что это действительно была ошибка на Zend Server, которая была исправлена в 6.2.
Ответ 7
Получена такая же ошибка при запуске xDebug.
Обновление решило проблему.
см
https://superuser.com/info/787888/too-many-files-open-on-mac-osx-after-running-apache-in-php-with-xdebug-for-som/829413#829413