我想在php中定义一个具有超全局范围的变量

时间:2011-08-18 10:20:02

标签: php variables scope cron

我想在全局范围内在php中定义一个变量。每个用户都应该可以访问该变量,因此它不应该依赖于会话。

我想做类似以下的事情:我有一个PHP脚本,该脚本通常需要大约5到15分钟才能执行,但在某些特殊情况下可能需要一个多小时。此脚本使用cron作业运行,间隔为15分钟。此脚本也可由任何用户手动运行。

现在可以同时运行任意数量的脚本。我想限制这个脚本数量。

所以,我想要一个变量来存储当前正在执行的脚本的数量。我不想使用数据库或文件来存储单个值。

提前致谢。

4 个答案:

答案 0 :(得分:1)

  1. 检查是否达到限制
  2. 当用户访问脚本时,将他添加到DB
  3. 当用户存在(或脚本结束)时,将其从DB中删除
  4. 除了文件和DB

    之外,没有办法将其保存在其他地方

答案 1 :(得分:1)

将变量写入特定的内存地址,并使用计数等信息读取和写入该地址可能有效。

关于IPC(过程间通信)的(旧)文章可能会对您有所帮助

http://zez.org/article/articleview/46/

出于兴趣,为什么你不想使用文件或数据库?

另一种解决方案(尽管技术上很可能使用文件或数据库)将强制脚本使用特定的会话ID。

<?php

$maximum = 1;

session_id(md5('myscript'));
session_start();

if( !isset( $_SESSION['count'] ) ) {
    $_SESSION['count'] = 1;
} else {
    if( $_SESSION['count'] >= $maximum ) {
        die( "too many processes running" );
    } else {
        $_SESSION['count']++;
    }
}

session_write_close();

// simulate running something
sleep(10);

session_id(md5('myscript'));
session_start();

$_SESSION['count']--;

session_write_close();

echo "<br />executed";

?>

请注意,在上面的示例中,对session_write_close()的调用很重要,因为执行脚本会阻止计数器递增,直到完成否则。然后当它关闭时,它需要重新开启以减少计数器。

显然,由于会话重新开放,脚本的任何输出都需要缓冲(请参阅http://www.php.net/ob_start)以防止标头已发送错误

答案 2 :(得分:0)

你的先决条件非常严格。内存不是(或not normally)在脚本之间共享,我们不能使用文件或数据库:这实际上没有可用于共享信息的公共空间,因此您必须每次都计算信息。您最好的选择可能是检查正在运行的进程,确定哪些进程属于您的脚本并对其进行计数。你提到cron建议使用Unix,这会让事情变得更容易。 POSIX扩展可能允许将流程执行控制到这个程度,并且作为最后一个资源,您始终可以从PHP运行ps命令。

答案 3 :(得分:0)

如果没有数据库或文件,就我所知,这是不可能的。相反,如果您有权访问服务器(root访问权限),您可以使用ps命令(如果运行Linux操作系统)检查脚本是否已在运行,如果已经运行,您可以查看它的实例数。