2013-02-13 1 views
0

Возможно ли, чтобы сервер PHP (через php5-fpm) запускал скрипт PHP сразу после его запуска и до того, как клиенты получили к нему доступ, чтобы выполнить инициализация переменных APC.PHP-скрипт, который должен запускаться при запуске (инициализация переменных APC)

В основном некоторые события учитываются в течение срока службы сервера с помощью apc_inc, как

apc_inc('event-xyz-happened'); 

событий хуга-произошло APC ВДПА постоянный (продолжительность жизни жизнь сервера, не запрашивала жизнь).

Проблема заключается в том, что событие event-xyz- APC var должно существовать до того, как оно будет увеличено (в отличие от Perl) в первый раз. apc_inc быть довольно быстро, я хочу, чтобы избежать решений, как

if (! apc_exists('event-xyz-happened')) { 
    apc_store('event-xyz-happened', 1); 
} 
else { 
    apc_inc('event-xyz-happened'); 
} 

, которые требуют не только вызов apc_exists('event-xyz-happened'), но могут также страдать от состояния гонки, когда он еще не существует.

-

Есть ли решение создать некоторые переменные APC, прежде чем клиенты имеют доступ к серверу?

+0

Незнайки о php5-FPM, но я знаю, что на работе мы имеем следующее в нашей виртуальной конфигурации хоста в apache, который ищет аналогичную вещь для того, что вам нужно: 'php_value auto_prepend_file/var/www/xhprof_gui/xhprof_session.php' – Jason

+0

@Jason это настройка директив конфигурации, а не переменных APC (плюс, я использую * nginx *) –

ответ

2

Вы можете использовать apc_add с последующим apc_inc (см http://www.php.net/manual/en/function.apc-add.php)

// if it doesn't exist, it gets created 
// if it does exist, nothing happens, no race condition 
apc_add('event-xyz-happened', 0); 
apc_inc('event-xyz-happened', 1); 
+0

Хорошая идея. Я по-прежнему предпочитаю * инициализацию * решение, которое позволит избежать накладных расходов apc_add. Но это лучшая альтернатива. –

0

Вы не должны использовать переменные apc для этой цели.

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

Все ваши скрипты php должны проверить, находится ли переменная в кеше apc, а если нет, инициализируйте ее.

Если вам нужно сохранить некоторые переменные с очень быстрым доступом, вы можете настроить локальный сервер mysql и создать таблицу с движком «память». Это будет почти так же быстро, как apc, но я буду работать, пока работает сервер.

Успехов SWilk

+0

Это неправда. Если не задано [* ttl *] (http://www.php.net/manual/en/function.apc-store.php), переменная не истечет (пока имеется доступная память). Что касается создания таблицы * памяти * в БД, я после выполнения, и я сомневаюсь, что inc + query + fetch ... из базы данных может быть даже близок к 'apc_inc' (который возвращает добавочное значение) в терминах производительности. –

+0

Я просто говорю, что вы не можете положиться на переменную, находящуюся в кеше. Если у вас закончилась нехватка памяти, и переменная ttl не закончилась, весь кеш будет очищен. См. http: // stackoverflow.com/questions/1053810/php-apc-what-happens-when-apc-cache-is-full Что касается производительности таблицы памяти mysql, я мог бы немного преувеличить;) – SWilk

+0

Конечно, спасибо, и я полагаюсь на кеш , Вот почему принимаются все меры предосторожности - автоматическая проверка скриптов, много памяти - не переполнение памяти, выделенной для кеша. Память будет * не * переполнена. –

 Смежные вопросы

  • Нет связанных вопросов^_^