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

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

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

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

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

Ответ 1

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

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. 

launcher script - php-apc.sh

Мы будем использовать этот script для запуска наших скриптов с поддержкой 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 использовать не-t212 > аналоги; проверьте свое использование статистики, когда не использует APC (Muchos important senor), с помощью эхо-потока StreamWrapper для вызовов метода url_stat; К сожалению: ошибка при превышении избыточного объема! прерывание потока уведомлений. см. url_stat message: Ошибка, вызванная StreamWrapper, выходит за рамки этого обсуждения.

smoke test

С помощью пусковой установки выполните базовый script

./php-apc.sh apc-cli.php

Целая куча ничего не случилось, что мы хотим правильно, зачем еще вы хотите использовать кеш? Если он ничего выводил, то это не сработало, извините.

Должен быть файл дампа, называемый apc.dump, если вы его найдете? Если вы не можете найти его, это не сработает, извините.

Хорошо, что у нас есть файл дампа, ошибки там не запускались.

./php-apc.sh apc-cli.php

Что вы хотите увидеть:

awesome in cli from apc

Успех! =)

В PHP мало что удовлетворяет как работающая реализация APC.
NJoy!

Ответ 2

Я бы определенно не использовал его в CLI, как при его перезагрузке, почти так, как будто он никогда не запускался в первую очередь!

Лучший способ использования APC - заставить его работать на веб-сервере все время, таким образом, при его активном действии он фактически сделает то, что он должен делать!

Ответ 3

Я попробовал с curl и APC.it работает

используйте эти команды в CLI

curl --data "param1=value2" http://testsite.com/test.php

поэтому он отправит данные в test.php и вы напишете в нем код.