8

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(“答案”):

由于 DBus 并不是我想要的(需要安装第三方模块,没有“严重”的应用证据),我现在使用的 Memcache 已经证明了它的可靠性(在@PeterM 评论之后,见下文)。

4

4 回答 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(而不是随机的用户唯一字符串)为所有访问者初始化会话会导致对所有用户都相同的会话。


真的有必要使用会话来实现目标还是使用常量不是更好?

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


由于一些评论员指出,Session 数据的序列化/反序列化功能可能会破坏传输中的数据,因此有一个解决方案:在 PHP 中,serialize_handler可以根据需要配置序列化和反序列化功能。请参阅https://www.php.net/manual/session.configuration.php#ini.session.serialize-handler查看魔术类方法可能也很有趣__sleep()__wakeup()它们定义了对象在序列化上的行为方式或反序列化请求。https://www.php.net/manual/language.oop5.magic.php#object.sleep ...从 PHP 5.1 开始,还有一个预定义的Serializable接口可用:https ://www.php.net/manual/class .serializable.php

于 2013-02-26T10:18:39.457 回答
2

您可以在 .htaccess 中声明一个变量。例如SetEnv APPLICATION_ENVIRONMENT production并在您的应用程序中使用该功能访问它getenv('APPLICATION_ENVIRONMENT')

于 2013-02-26T10:20:18.363 回答
2

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

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

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

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

于 2016-01-14T16:35:28.080 回答
1

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

考虑参考它的手册

于 2013-02-26T10:15:16.053 回答