我目前正在编写我的第一个php应用程序之一。应用程序必须连接到 LDAP 服务器并更改目录中的某些用户属性。
该应用程序有一些参数要在mySQL数据库中读取才能运行。这些参数的一些示例可能是:-LDAP 地址-LDAP 服务帐户-LDAP 密码
还有更多参数,例如,这些参数规则用户向我的应用程序进行身份验证的方式,...
目前,数据库在每个用户会话初始化时读取,但是,它没有任何意义,因为参数不会因会话而异。
因此,我正在寻找一种从数据库中加载这些参数的方法,只有一次(例如,在 php 服务初始化时),并通过变量在"普通"php 代码中访问这些参数。
最好的方法是什么?
提前谢谢你。
您正在寻找持久的交叉请求存储。这有很多选择。
最简单的是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 Sessions。
<?php
session_start(); // need to be before any html code
$_SESSION['something'] = 'Something here...';
echo $_SESSION['something']; // will show "Something here..."
您可以使用...
unset($_SESSION['something']);
您也可以使用cookie,使用函数setcookie。看这里。
您可以使用...
echo $_COOKIE['something'];
生产模式
在生产模式下,这将作为Wordpress的set_transient工作。您将执行第一个数据库请求以获取该值,并将使用 cookie、会话或 memcache 缓存此值。
如果要在页面中显示此值,可以使用标准缓存库。
我对这个问题的理解是,您有一些或多或少恒定的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
如果这只在启动服务器时使用(所以一次就完成了),并且你不想打扰memcached/xcache(因为它们会过度杀死),你仍然可以使用环境变量。见get_env