PHP - APC Cache - пользовательские данные против данных, доступных всем пользователям - PullRequest
4 голосов
/ 13 июля 2011

Я прочитал несколько учебников на нескольких веб-сайтах, а также несколько вопросов здесь, на StackOverFlow, по этой теме, и до сих пор не могу найти четкий ответ на свой вопрос.

Мне интересно, как APC Cache управляет / сохраняет пользовательские данные (переменные, которые будут использоваться в коде php, которые являются пользовательскими. Другими словами, данные, которые не должны просматриваться другими пользователями.) И как сохранить общедоступные данные, которые могут видеть все пользователи?

Я просто пытаюсь понять, как это работает. Я знаю, что APC "сохраняет" или сохраняет в памяти необходимые и включенные файлы ... но что, если эти включенные файлы имеют пользовательские переменные в коде? Если, скажем, в /account/user_profile.php я использую несколько переменных, таких как $ firstname $ lastname $ address и т. Д. Будут ли эти переменные храниться в памяти? Например, если Джон X вошел в систему во время обновления или сохранения кэша, то APC всегда будет помнить Джона как $ firstname, а X как $ lastname? Если другой пользователь заходит на ту же страницу, я хочу, чтобы он видел детали своего профиля пользователя, а не Джона.

Я знаю, что это, возможно, уже обсуждалось, но мне нужен четкий ответ, пожалуйста.

Спасибо!

Ответы [ 3 ]

6 голосов
/ 13 июля 2011

Вы неверно понимаете кэш APC. Это кеш байт-кода, что означает, что он будет хранить байт-код скрипта PHP. Это сохранит PHP-интерпретатор в следующий раз, чтобы снова создать байт-код из скрипта, потому что он уже там.

Примечание: Начиная с версии PHP 5.5 он поставляется со своим собственным расширением ядра кэша OPCode с именем Opcache . Использование APC для Opcode-Caching неофициально не рекомендуется. Проконсультируйтесь с вашим системным администратором или Opdesk для получения подробной информации и опций, общие принципы, изложенные в этом ответе, продолжают действовать независимо от имени расширения.

В обычном исполнении PHP ваш код скриптов будет взят и скомпилирован в байт-код. Этот байт-код будет затем выполняться процессором php. Это общий шаблон для JIT-компиляторов.

Таким образом, без кэширования байт-кода байт-код необходимо компилировать при каждом запросе. При использовании байтового кеша этот шаг необходимо выполнить только один раз для всех запросов. В следующий раз байт-код уже находится в кеше и может быть выполнен прямо.

Это совершенно не связано с переменным содержимым, это только для кода.

1 голос
/ 06 сентября 2012

У меня был тот же вопрос.Но ключ в этом.APC видит пользователя не как конечного пользователя, то есть Джона Смита, а как само приложение.Поэтому, когда APC сообщает специфические данные пользователя, вы можете хранить «специфические данные пользователя», то есть информацию о mywebsite.com в APC об этом конкретном приложении.Это не предназначено для людей.Он предназначен для одной программы, в основном отправляющей переменную информацию другой.

1 голос
/ 13 июля 2011

П.С .: Я никогда не использовал APC (до этого я перешел на другой язык, я действительно понимаю важность APC), но, думаю, я понимаю концепцию. Пожалуйста, поправьте меня, если я где-то лгу.

> I am wondering how APC Cache manages/saves the user-specific data
> (variables that will be used in the php code, that are user-specific.
> In other words, data that should not be seen by other users.) and how
> does it save the publicly available data that all users can see?

Вы можете использовать apc_store для хранения данных в памяти, которые можно получить с помощью apc-fetch . Он не хранит все ваши переменные внутри вашей программы.

bool apc_store ( string $key , mixed $var [, int $ttl = 0 ] )

Примечание: в отличие от многих других механизмов в PHP, переменные хранятся с использованием apc_store () будет сохраняться между запросами (пока значение не будет удалено из кеша).

Параметры

ключ

Сохраните переменную под этим именем. ключи уникальны для кеша, поэтому второе значение с тем же ключом перезапишет исходное значение.

Из прочтения документов я предполагаю, что вы должны предоставить уникальные ключи так же, как и в memcached / redis. Для хранения личных данных вы просто должны получить session_id (уникальный для каждой сессии) и использовать его в качестве префикса. Вы используете key для хранения ваших данных. В этом руководстве по Redis от Саймона Уиллисона также есть раздел, описывающий, как использовать ключи, которые я процитирую ниже:

Redis является хранилищем значений ключей, поэтому имеет смысл начать с говорить о ключах. Ключи не должны содержать пробелов - версии Redis до 1.2 имел проблемы с этим, и даже сейчас это не гарантировано, что любые ошибки в крайнем случае были устранены. Обычный соглашение заключается в использовании obj-type: id: field, хотя теперь, когда Redis поддерживает хэши как значения, это соглашение, вероятно, станет менее важным.

...