PHP中是否可以像Java EE中那样使用持久性数据? (在PHP线程之间共享对象),而无需会话或缓存/ DB

问题描述 投票:8回答:4

PHP中是否有一种方法可以使用“会话外”变量,该变量不会像Java服务器那样在每次连接时都被加载/卸载?

请原谅我缺乏准确性,我不知道如何以正确的方式编写它。

主要思想是拥有这样的东西:

<?php
    ...
    // $variablesAlreadyLoaded is kind of "static" and shared between all PHP threads
    // No need to initialize/load/instantiate it.
    $myVar = $variablesAlreadyLoaded['aConstantValueForEveryone'];
    ...
?>

我已经使用shmop和其他奇怪的东西做过类似的事情,但是如果有一种“干净”的方式可以在“纯PHP”中使用缓存系统(我认为是APC,Redis ...),也没有数据库。

编辑1:

由于人们(感谢他们花了我的时间)在会议上回答我的方式相同,所以我添加了我错过写的一个约束:请不要参加会议。

编辑2:

看来做这种事情的唯一PHP本机方法是共享内存(shmop)和命名管道。我将以托管方式访问共享对象,而不用担心内存管理(共享内存块大小)或系统问题(管道)。

然后,我在网上浏览了一个PHP模块/库,该库提供了执行该操作的功能/方法:我什么也没找到。

编辑3:

在对@KFO指出的方式进行了一些研究之后,看来putenv / setenv并不是用来处理对象的(我会避免序列化)。因此,它可以解决字符串或数字之类的短“事物”的问题,但不能解决更大/复杂的对象的问题。

使用“ env方法”以及另一种处理较大对象的方法将不连贯,并增加了代码的复杂性和可维护性。

编辑4:

找到了:DBus(GREE Lab DBus),但我没有工具可以在工作中对其进行测试。有人测试过了吗?

我愿意接受所有建议。

谢谢

编辑5(“ ANSWER”):

由于DBus并非我真正想要的(需要安装第三方模块,没有“大量的”应用程序证明),所以我现在使用的Memcache已经证明了其可靠性(@PeterM注释,参见下文)。

php persistence share shared-memory inter-process-communicat
4个回答
5
投票
// First page
session_id('same_session_id_for_all');
session_start();
$_SESSION['aConstantValueForEveryone'] = 'My Content';

// Second page
session_id('same_session_id_for_all');
session_start();
echo $_SESSION['aConstantValueForEveryone'];

这在PHP中是开箱即用的。使用相同的会话ID(而不是随机的user-uniqe字符串)初始化所有访问者的会话将导致一个会话,该会话对于所有用户都是相同的。


真的需要使用会话来实现目标,还是使用constants更好吗?

没有纯PHP方式可以在不同的对象之间共享信息PHP中的线程!除了“外部”文件/数据库/服务器变量/会话文件解决方案。


[由于一些评论者指出,Session数据具有序列化/反序列化功能,这可能会破坏传输中的数据,因此有一个解决方案:在PHP中,可以根据需要配置序列化和非序列化功能serialize_handler。参见https://www.php.net/manual/session.configuration.php#ini.session.serialize-handler


2
投票

您可以在.htaccess中声明一个变量。例如SetEnv APPLICATION_ENVIRONMENT production,然后在您的应用程序中使用功能getenv('APPLICATION_ENVIRONMENT')


2
投票

[另一种解决方案是将变量包装在“持久数据”类中,该类将在每次运行php脚本时自动恢复其数据内容。您的课程需要满足以下条件:

  • 将变量的内容存储到__destructor中的文件中
  • 从文件的__constructor中加载变量的内容

我更喜欢以JSON格式存储文件,因此可以轻松地检查内容以进行调试,但这是可选的。

请注意,某些Web服务器将在析构函数中更改当前工作目录,因此您需要使用绝对路径。


1
投票

我认为您可以使用$_SESSION['aConstantValueForEveryone'],以便您可以在同一域的每个页面上阅读它。

考虑引用为manual

© www.soinside.com 2019 - 2024. All rights reserved.