Использование кэша APC PHP в режиме CLI с использованием dumpfiles

Недавно я начал использовать кеш APC на наших серверах. Одной из наиболее важных частей нашего продукта является процесс CLI (Cron / schedule), производительность которого имеет решающее значение. Как правило, batchjob состоит из запуска примерно 16-32 процессов параллельно в течение примерно часа (они «перезапускаются» каждые несколько минут).

По умолчанию использование кэша APC в CLI является пустой тратой времени из-за того, что кеш-код операции не сохраняется между отдельными вызовами. Но APC также содержит функции apc_bin_dumpfile() и apc_load_dumpfile() .

Я думал, что эти две функции могут быть использованы для повышения эффективности APC в режиме CLI за счет того, что все они были скомпилированы когда-то за пределами batchjob, хранятся в одном файле дампа и имеют отдельные процессы для загрузки дампа.

Есть ли у кого-нибудь опыт такого сценария или вы можете дать веские причины, почему он будет работать или не будет работать? Если можно было бы разумно получить какой-либо значительный выигрыш, будь то использование памяти или производительность? Какие подводные камни скрываются в тени?

Отказ от ответственности: такой же потрясающий, как APC, когда он работает в CLI, и это потрясающе, он может быть столь же расстроен. Используйте со здоровой нагрузкой терпения, будьте осторожны, отходите от проблемы, если вы вращаетесь, имейте в виду, что вы работаете с кешем, поэтому кажется, что он ничего не делает, на самом деле ничего не делает. Удалите файл дампа, начните только с основ, если это не работает, забудьте его попробовать новый компьютер, новую ОС, если он работает, сделать копию, по частям расширить функциональность – есть масса вещей, которые не будут работать , если он работает с фиксацией или делает копию, добавляет еще один кусок и снова тестирует, для проверки работоспособности перепроверяем копии, которые работали до этого, клише или нет; если сначала вам не удастся попробовать повторить попытку, вы не можете продолжать делать то же самое, ожидая новых результатов.

Готов? Это то, чего вы ждали:

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

apc_loadfile и apc_dumpfile в cli

Согласно комментарию 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. 

сценарий запуска – php-apc.sh

Мы будем использовать этот скрипт для запуска наших скриптов с поддержкой apc (например ./php-apc.sh apc-cli.php ) вместо того, чтобы напрямую изменять свойства в php.ini .

 #/bin/sh php -d apc.enable_cli=1 -d apc.stat=0 $1 

Готовы к основным функциям? Конечно, вы =)

базовый APC сохраняется – apc-cli.php

 <?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, и вы записываете в него код.