【问题标题】:PHP: Creating some sort of common pool of variables from where php code can pick up variablesPHP:创建某种通用变量池,php代码可以从中获取变量
【发布时间】:2013-05-06 11:16:35
【问题描述】:

我相信PHP,每当用户向后端PHP页面发送请求时,都会启动一对一的通信,即根据用户的请求创建并执行该页面的新实例。

我的问题,如果每次创建一个新的实例,我想创建一个PHP脚本,它在所有实例之间共享,

例如:我想在该脚本中存储几百个随机数(让我们将其命名为 pool.php - 一个静态池),并且每次向后端页面(比如说 BE.php)发出请求时, BE.php每次都要求pool.php返回一个唯一的变量,一旦所有的变量都用完了,我会在pool.php里放一个逻辑来创建一组新的变量

如果我的问题不清楚,请告诉我

【问题讨论】:

    标签: php javascript html apache phpmyadmin


    【解决方案1】:

    Memcached 是一个很好的选择。

    尽管 PHP 来来去去,它仍然是一个键/值存储。您可以从一个 PHP 脚本写入值并从另一个脚本读取它们。这不是您正在寻找的,但可以用于相同的目的,并且比连接到其他 PHP 脚本的套接字更容易处理。

    http://memcached.org/

    【讨论】:

    • 好的,我试试看,会恢复的,在那之前,性能怎么样,memcached会增加开销吗?
    • @Tarun,是的,但远不如处理一个守护进程的 PHP 脚本。 Memcached 的构建速度非常快。
    • 那太好了,但现在我在诅咒我的共享主机提供商,他们似乎没有启用 memcached,有没有替代方案或解决方法
    • 最简单/最好的解决方案是找一个更好的托管服务提供商。
    • 我发现了另一种使用 APC 的解决方案,幸运的是我的托管服务提供商支持它,我希望它不会花费我太多 CPU :)
    【解决方案2】:

    您可以使用 MySQL 并锁定有问题的表来解决这个问题。将此变量池保存在一个单独的表中,然后使用 SQL 表级锁来推迟其他请求,直到当前请求完成,方法是:

    SELECT GET_LOCK( 'my_lock', 10 ) AS success
    

    确保检查查询返回 1,这意味着您现在有一个锁。如果没有,您的查询在等待锁定时超时。

    然后执行您的普通查询,例如检查是否存在未占用的变量。如果是这样,请通过更新或其他方式占用它。

    然后你释放锁,使用:

    DO RELEASE_LOCK( 'my_lock' )
    

    数字 10 是每个请求在失败前等待的超时时间。

    【讨论】:

    • 我不是在寻找将变量存储在表中,这将是一个巨大的性能开销,想象一下,如果我必须将这些变量用作每个评论用户帖子的唯一标识符,那么我将拥有对表进行查询只是为了获取帖子的 ID :(
    • 它可能会在其他情况下解决问题,但不是我的
    【解决方案3】:

    Tarun,您确实知道数据库中有一些称为 AUTO_INCREMENT 的字段,可以用作您的用户 cmets 的 primary keys。每次您添加新评论时,数据库服务器都会增加该字段,并且您会在每个新条目上获得unique ID 而不费力气?

    满足您需求的唯一可行方法是使用数据库和某种 MutexMySQL 的内部 Mutex,如 John Severinson 所说,如果 @ 987654326@ 字段不够用。

    PS性能开销...当谈到 PHP 脚本时,这不是问题。如果您需要性能,请使用 C/C++ 编写您的网站。您说的是毫秒(0.001 秒) 或更短。如果这会影响你的表现,你需要重新审视你的项目/逻辑。

    【讨论】:

    • AUTO_INCREMENT 不能解决问题,请尝试正确阅读问题。顺便说一句,APC 将解决我的问题
    • 此外,如果您可以仔细阅读我的帖子,您会看到 John 提到请求失败,如果我需要池中的 ID 作为 html 标签的 ID,那么我没有选择失败的请求,它也会很慢。 APC 更快
    • @Tarun 首先学习使用数据库!为了创建 AUTOINCREMENT 字段值,数据库在内部处理同步(这就是它们为大型站点提供动力的方式)。因此,对于尽可能多的同步请求,您将始终拥有不同的值。互斥锁只是为了给你安慰。 o.O ...嗯。
    • 在所有事情中,您应该学会正确阅读问题和cmets。为什么你对你的解决方案能解决我的问题如此有信心?嗯。在我将值插入数据库之前我想要那个 ID,APC 是更好的解决方案,让我再说一遍,我的查询已经得到回答,并且解决方案有效,我不想使用 AUTO_INCREMENT,祝你有美好的一天跨度>
    • @Tarun,我不在乎你的投票。我只是想帮忙。 (PS:这样做将近 10 年告诉我这是解决方案。)干杯! - 我没有这个话题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 2014-06-10
    • 2023-03-21
    相关资源
    最近更新 更多