2011-12-09 21 views
3

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

编辑:

我只是希望能够做到这一点:

while ($beingused) 
    sleep(5); 
$beingused = true; 
// Do something 

SOLUTION:

非常感谢你的帮助。这是我的解决方案根据您的输入。

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

UPDATE

其实我结束了一个文件解决方案,会后所有。每次用户与应用程序进行交互时,都会根据用户输入提供一个脚本,该脚本会发生变化。我意识到脚本文件的存在可以作为布尔值加倍,正如许多响应中所提示的那样。

+1

什么样的资源?该资源是在用户之间共享还是在网站访问期间仅由一个用户使用?一个价值千言万语的例子。 –

+0

嗯,这是一个在服务器上运行的应用程序。每个用户将通过shell_exec()命令与应用程序的同一个实例进行交互。命令完成得非常快,所以碰撞很少发生,但我想确保这一点。该布尔值将指示另一个用户是否正在使用该应用程序。如果是这样,该脚本可能会等待几毫秒,然后再试一次。 –

+1

这还是比较模糊的。你在寻找*配置设置吗? *数据库*中的半永久入口? *信号量/锁定/令牌*?这是用户特定设置,机器特定设置还是全局设置? – deceze

回答

2

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

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

+0

OP特别要求“除了将值存储在文件中”。 – Ben

+0

danielfaraday请求一个布尔变量。这就是PID文件可以执行的操作 - 如果文件存在=> TRUE,则shell脚本正在运行。如果它不存在 - FALSE,脚本没有运行。无需在文件中写入内容。 – Minras

+0

我认为memcache听起来像是最合理的解决方案。其他人听起来有点哈克(文件系统和数据库并不意味着存储运行时变量)...感谢您的信息。我将研究memcache。 –

0

跨浏览器保存:使用cookie。要访问它们,请使用$_COOKIE[]set_cookie()

保存在服务器上:使用数据库字段。

UPDATE

尽管downvotes,你的更新后,似乎你可以只设置一个布尔值在数据库中,并相应地检查它的价值。毫无疑问,该页面在数据库中有一个条目 - 一个节点或一个日志,或其他东西。

+0

... downvotes的原因? – Ben

+0

我没有downvote,但我认为一个原因是,饼干不是问题的解决方案。数据库(通常意味着关系数据库)可以解决这个问题,但是这个过程非常缓慢且耗费资源。 – Minras

+0

@Minras - 谢谢,这很有道理。 – Ben

2

我想你根据你的问题需要的是用“内存数据库”像SQlite in-memory database,或者使用MySQL Memory Storage engine

创建一个数据库,但我不知道是否值得使用的内存数据库仅用于保存一个变量。

查看更多详细信息:http://en.wikipedia.org/wiki/In-memory_database

编辑:

OP的编辑后,看来他需要的是做一个特定的任务之前获得锁。 然后我认为你也可以使用这些php 信号量相关的功能。

http://www.php.net/manual/en/function.sem-get.php

http://www.php.net/manual/en/function.sem-acquire.php

http://www.php.net/manual/en/function.sem-get.php

+0

是的,这将工作 - 但它似乎是一个布尔值矫枉过正。嗯... –

+0

@danielfaraday查看有关信号量的更新。但是我的原始投票是没有问题的。正如你在下面的帖子中评论过的内存数据库一样。 –

0

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

对于同一用户的事情,你有会议。对于普通的共享,在传统的LAMP安装中,您有数据库。但是你也可以使用文件系统(信号量,锁)。使用数据库来放置应用程序锁是一件经典的事情,但它可能会给写入操作相当慢的传统关系数据库造成不利影响。 Redis等一些NOSQL存储引擎具有非常快速的锁定操作支持。

+0

downvoting?任何原因? – regilero

+0

谢谢 - 我想我将会使用内存数据库解决方案。它是最有意义的... –

+0

感谢您的谢意,但我认为这不配得到-1 – regilero