Определите переменную php при инициализации php

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

Это приложение имеет некоторые параметры для чтения в базе данных MySQL для запуска. Примерами этих параметров могут быть: -адрес LDAP -Учетная запись службы LDAP-пароль LDAP

есть гораздо больше параметров, которые, например, определяют способ аутентификации пользователей в моем приложении...

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

Итак, я ищу способ загрузить эти параметры из базы данных, только один раз (например, при инициализации службы php), и доступ к этим параметрам в "нормальном" коде php через переменные.

Каков был бы лучший способ сделать это?

Заранее спасибо.

4 ответа

Решение

Вы ищете постоянное хранилище перекрестных запросов. Есть много вариантов для этого.

Самым простым является APCu (который может использоваться вместе с Zend OpCache или для PHP < 5.5, APC).

Просто:

if (apc_exists('mykey')) {
    $data = apc_fetch('mykey');
} else {
    // create it from scratch
    apc_store('mike', $data);
}

$data может быть любым типом PHP, массивами, объектами или скалярами.

Вы даже можете поместить этот код в auto_prepend_file Настройка INI, поэтому он запускается автоматически при каждом запросе.

Однако это относится к серверу (и к SAPI, поэтому mod_php/php-fpm/cli не разделяет кеш), поэтому вам придется создавать его один раз для каждого сервера.

Кроме того, для настройки нескольких серверов вы можете использовать что-то вроде memcached или же redis, Это автономные демоны, которые позволят вам хранить произвольные пары ключ / значение строковых данных (поэтому вам может понадобиться serialize() / unserialize() на ценности).

Я лично предпочитаю memcache, который имеет два расширения для PHP, pecl/memcached а также pecl/memcache (Я предпочитаю pecl/memcached, у него больше возможностей).

Оба они довольно просты.

pecl/memcached:

$memcache = new Memcached();
$memcache->addServer('localhost', '11211');

$data = $memcache->get('mykey');
if (empty($data)) {
   // Create data
   $memcache->set('mykey', $data);
}

pecl/memcache:

$memcache = new Memcache();
$memcache->connect(); // uses localhost:11211, the default memcache host/port
$data = $memcache->get('mykey');
if (empty($data)) {
    // Create data
    $memcache->set('mykey', $data);
}

Оба расширения поддерживают хранение массивов и объектов без сериализации.

Конечно, вы можете хранить несколько ключей с любым из этих решений и просто извлекать их все, вместо того, чтобы использовать один или один с массивом / объектом.

Вы можете использовать Memcache для кеширования запросов к базе данных. Смотрите здесь, как использовать.

Другой способ - использовать Php-сессии.

<?php
session_start(); // need to be before any html code
$_SESSION['something'] = 'Something here...';

echo $_SESSION['something']; // will show "Something here..."

И вы можете удалить с помощью...

unset($_SESSION['something']);

Вы также можете использовать куки, используя функцию setcookie. Посмотреть здесь.

И вы можете получить куки, используя...

echo $_COOKIE['something'];

Режим производства

В производственном режиме это будет работать как set_transient Wordpress. Вы сделаете первый запрос БД, чтобы получить значение, и кешируете это значение, используя куки, сессии или memcache.

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

Если это нужно использовать только при запуске вашего сервера (как только это будет сделано), и вы не хотите беспокоиться об использовании memcached/xcache (так как они были бы слишком уничтожены), вы все равно можете использовать переменные окружения. Смотрите get_env

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

Если это так, вы можете использовать memcache для хранения данных: http://php.net/manual/en/book.memcache.php

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

Если данные относятся к конкретному пользователю, вы можете просто использовать сеанс. http://php.net/manual/en/book.session.php

http://php.net/manual/en/session.examples.basic.php

Другие вопросы по тегам