PHP中的会话间变量

PHP中的会话间变量,php,variables,scope,Php,Variables,Scope,我相信一旦脚本或会话结束,globals和superglobals就会消失。在PHP中存储会话间变量的最佳方式是什么?换句话说,我希望每个会话都能访问一个变量。(为了同步对服务器上资源的访问,它将是一个布尔值。)除了将值存储在文件中之外,还有解决方案吗?最好将变量保存在内存中 编辑: 我只想做到这一点: while ($beingused) sleep(5); $beingused = true; // Do something 解决方案: 非常感谢你们的帮助。这是我根据您的意见提出的解

我相信一旦脚本或会话结束,globals和superglobals就会消失。在PHP中存储会话间变量的最佳方式是什么?换句话说,我希望每个会话都能访问一个变量。(为了同步对服务器上资源的访问,它将是一个布尔值。)除了将值存储在文件中之外,还有解决方案吗?最好将变量保存在内存中

编辑:

我只想做到这一点:

while ($beingused)
   sleep(5);
$beingused = true;
// Do something
解决方案:

非常感谢你们的帮助。这是我根据您的意见提出的解决方案

memcache_pconnect('localhost');
while (memcache_get('inuse') == 'true')
    usleep(10);
memcache_set('inuse', 'true');
// Do something
memcache_set('inuse', 'false');
更新


事实上,我最终还是选择了一个文件解决方案。每次用户与应用程序交互时,它都会收到一个脚本,该脚本会根据用户的输入而变化。我意识到脚本文件的存在可能会双重成为一个布尔值,正如许多回答中所建议的那样。

要跨浏览器保存,请使用cookie。要访问它们,请使用
$\u COOKIE[]
设置\u COOKIE()

要在服务器上保存,请使用数据库字段

更新


尽管有否决票,但在更新之后,您似乎可以在数据库中设置一个布尔值,并相应地检查其值。当然,该页面在数据库中有一个条目—节点、日志或其他内容。

我认为根据您的问题,您希望使用“内存数据库”,或者使用etc创建的数据库

但我不确定是否值得使用内存中的数据库来保存一个变量

请参阅更多详细信息:

编辑:

在OP编辑之后,似乎他需要的是在执行特定任务之前获得锁。 然后,我认为您也可以使用这些php信号量相关函数来实现这一点


PHP原则之一是不共享任何内容。这意味着您不能在两个PHP执行/进程/请求处理之间共享任何内容。每个共享的东西都必须在PHP之外共享


对于相同的用户对象,您拥有会话。对于一般共享,在经典LAMP安装中,您拥有数据库。但是您也可以使用文件系统(信号量、锁)。使用数据库来放置应用程序锁是一件经典的事情,但它可能会给写操作非常慢的经典关系数据库带来不好的压力。一些NOSQL存储引擎(如Redis)具有非常快速的锁定操作支持。

我会使用具有特定名称的空文件(如Linux中的PID文件)。在执行命令之前,脚本检查文件是否存在,如果不存在,则创建文件。执行shell脚本后,删除该文件。但是要小心文件系统缓存


另一个快速选项是将标志存储在内存数据库中,如memcache或Redis。

什么类型的资源?此资源是在用户之间共享还是在站点访问期间仅由一个用户使用?一个例子价值千言万语,它是一个运行在服务器上的应用程序。每个用户都将通过shell_exec()命令与应用程序的同一实例交互。命令完成得非常快,因此碰撞将非常罕见,但我想确保这一点。布尔值将指示其他用户是否正在使用该应用程序。如果是这样,脚本可以等待几毫秒,然后再试一次。这仍然很模糊。您正在寻找配置设置吗?数据库中的半永久性条目?信号灯/锁/令牌?这是特定于用户的设置、特定于机器的设置还是全局设置?所以您正在寻找锁/令牌?在这种情况下,如果可能的话,也许你更应该研究一种不同的体系结构,比如队列/工作者解决方案。是的,我想写一个守护程序,但这一切看起来都太过分了。也许我会在服务器上有一个文件,其中存储了1或0:-)真的没有简单的方法吗?看起来我应该能够设置$_SERVER['foo']或其他东西(但我知道你不能这么做…)OP特别请求“除了将值存储在文件中”。Danielvarady请求一个布尔变量。这就是PID文件可以做的-如果文件存在=>TRUE,则shell脚本正在运行。如果它不存在-FALSE,则脚本未运行。无需在文件中写入内容。我认为memcache听起来是最合理的解决方案。其他的对我来说听起来有点老套(文件系统和数据库不是用来存储运行时变量的)…谢谢你提供的信息。“我将调查memcache。”史蒂夫·op对此事的看法相当模糊。你可能会认为自己没有这种荒谬的限制。文件没问题+1A PID和memcache都是很好的解决方案,所以我接受了这个答案。尽管其他答案也很有帮助。谢谢谢谢-我想我会使用内存数据库解决方案。这是最有意义的…谢谢你的感谢,但我认为这不值得-1我没有投反对票(事实上我还没有被允许投反对票…)编辑:NM-显然我确实得到了这一特权+1我没有投反对票,但我认为一个原因是Cookie并不能解决这个问题。数据库(这通常意味着关系数据库)可以解决这个问题,但它相当缓慢,而且消耗资源。@Danielfaday请参阅关于信号量的更新。但我最初的投反对票的帖子仍然没有什么问题。正如您在下面的帖子中对内存数据库的评论一样。