Недавно я начал использовать кеш APC на наших серверах. Одной из наиболее важных частей нашего продукта является процесс CLI (Cron / schedule), производительность которого имеет решающее значение. Как правило, batchjob состоит из запуска примерно 16-32 процессов параллельно в течение примерно часа (они «перезапускаются» каждые несколько минут).
По умолчанию использование кэша APC в CLI является пустой тратой времени из-за того, что кеш-код операции не сохраняется между отдельными вызовами. Но APC также содержит функции apc_bin_dumpfile()
и apc_load_dumpfile()
.
Я думал, что эти две функции могут быть использованы для повышения эффективности APC в режиме CLI за счет того, что все они были скомпилированы когда-то за пределами batchjob, хранятся в одном файле дампа и имеют отдельные процессы для загрузки дампа.
Есть ли у кого-нибудь опыт такого сценария или вы можете дать веские причины, почему он будет работать или не будет работать? Если можно было бы разумно получить какой-либо значительный выигрыш, будь то использование памяти или производительность? Какие подводные камни скрываются в тени?
Отказ от ответственности: такой же потрясающий, как APC, когда он работает в CLI, и это потрясающе, он может быть столь же расстроен. Используйте со здоровой нагрузкой терпения, будьте осторожны, отходите от проблемы, если вы вращаетесь, имейте в виду, что вы работаете с кешем, поэтому кажется, что он ничего не делает, на самом деле ничего не делает. Удалите файл дампа, начните только с основ, если это не работает, забудьте его попробовать новый компьютер, новую ОС, если он работает, сделать копию, по частям расширить функциональность – есть масса вещей, которые не будут работать , если он работает с фиксацией или делает копию, добавляет еще один кусок и снова тестирует, для проверки работоспособности перепроверяем копии, которые работали до этого, клише или нет; если сначала вам не удастся попробовать повторить попытку, вы не можете продолжать делать то же самое, ожидая новых результатов.
Готов? Это то, чего вы ждали:
apc.enable-cli = 1
это не идеально для создания, заполнения и уничтожения кэша APC при каждом запросе CLI
- previous answer by unknown poster since removed.
Вы абсолютно правы, что отстой, давайте исправить это?
Если вы попытаетесь использовать APC в CLI, и он не включен, вы получите предупреждения.
что-то вроде:
PHP Warning: apc_bin_loadfile(): APC is not enabled, apc_bin_loadfile not available. PHP Warning: apc_bin_dumpfile(): APC is not enabled, apc_bin_dumpfile not available.
Предупреждение: я предлагаю вам не включить cli в php.ini, это не стоит разочарований, вы забудете, что сделали это, и у вас много других головных болей с другими скриптами, поверьте мне, что этого не стоит, используйте сценарий запуска вместо. (Смотри ниже)
Согласно комментарию mayye php нам нужно отключить apc.stat или вы получите предупреждения
что-то вроде:
PHP Warning: apc_bin_dumpfile(): Excluding some files from apc_bin_dump[file]. Cached files must be included using full path with apc.stat=0.
Мы будем использовать этот скрипт для запуска наших скриптов с поддержкой apc (например ./php-apc.sh apc-cli.php
) вместо того, чтобы напрямую изменять свойства в php.ini
.
#/bin/sh php -d apc.enable_cli=1 -d apc.stat=0 $1
Готовы к основным функциям? Конечно, вы =)
<?php /** check if dump file exists, you don't want to use file_exists */ if (false !== $dump_file = stream_resolve_include_path('apc.dump')) /** so where were we lets have a look see shall we */ if (false !== apc_bin_loadfile($dump_file)) /** fetch what was stored last run just for fun */ if (false !== $value = apc_fetch('my.awesome.apc.store')) echo "$value from apc\n"; /** store what gets fetched the next run just for fun */ apc_store('my.awesome.apc.store', 'awesome in cli'); /** what a shlep lets not do that all over again shall we */ apc_bin_dumpfile(array(),null,'apc.dump');
Примечание. Почему бы не использовать file_exists? Потому что file_exists == stat
вы видите, и мы хотим получить вознаграждение, которое apc.stat=0
; работа внутри включенного пути; использовать абсолютные, а не относительные пути – как возвращено stream_resolve_include_path();
избегайте include_once
, require_once
используйте копии non *_once
; проверьте использование своего стата, когда не используете APC (Muchos important senor), с помощью эхо- url_stat;
StreamWrapper для вызовов метода url_stat;
Ошибка: ошибка превышения допустимой пробела! прерывание потока уведомлений. см. сообщение url_stat : Ошибка, вызванная StreamWrapper, выходит за рамки этой дискуссии.
С помощью пусковой установки выполните основной скрипт
./php-apc.sh apc-cli.php
Целая куча ничего не случилась, и это то, что мы хотим, почему еще вы хотите использовать кеш? Если он выдал что-нибудь, то это не сработало, извините.
Должен быть файл дампа, называемый apc.dump, если вы его найдете? Если вы не можете найти его, это не сработает, извините.
Хорошо, что у нас есть файл дампа, там не было ошибок, чтобы запустить его снова.
./php-apc.sh apc-cli.php
Что ты хочешь увидеть:
awesome in cli from apc
Успех! знак равно
В PHP мало что удовлетворяет как работающая реализация APC.
NJoy!
Я бы определенно не использовал его в CLI, как при перезагрузке, это почти так, как если бы он никогда не запускался в первую очередь!
Лучший способ использовать APC – это постоянно работать на веб-сервере , поэтому при активном действии он фактически сделает то, что он должен делать!
Я пробовал с curl и APC.it работает
использовать эти команды в CLI
curl --data "param1=value2" http://testsite.com/test.php
поэтому он будет отправлять данные в test.php, и вы записываете в него код.