我想在全局范围内在php中定义一个变量。每个用户都应该可以访问该变量,因此它不应该依赖于会话。
我想做类似以下的事情:我有一个PHP脚本,该脚本通常需要大约5到15分钟才能执行,但在某些特殊情况下可能需要一个多小时。此脚本使用cron作业运行,间隔为15分钟。此脚本也可由任何用户手动运行。
现在可以同时运行任意数量的脚本。我想限制这个脚本数量。
所以,我想要一个变量来存储当前正在执行的脚本的数量。我不想使用数据库或文件来存储单个值。
提前致谢。
答案 0 :(得分:1)
除了文件和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操作系统)检查脚本是否已在运行,如果已经运行,您可以查看它的实例数。