我想在php中定义一个全局范围的变量。该变量应该是每个用户都可以访问的,因此它不应该依赖于会话。
我想做一些类似如下的事情:我有一个php脚本,这个脚本通常需要5到15分钟来执行,但在某些特殊情况下可能需要一个多小时。此脚本使用cron作业运行,运行时间间隔为15分钟。此脚本也可以由任何用户手动运行。
现在可以同时运行任意数量的脚本。我想限制这个脚本的数量。
因此,我想要一个变量来存储当前正在执行的脚本的数量。我不想使用DB或文件来存储单个值。
提前谢谢。
发布于 2011-08-18 18:49:48
将变量写入特定的内存地址,并使用诸如计数之类的信息对该地址进行读写,可能会起作用。
有关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),以防止标头已经发送错误
发布于 2011-08-18 18:22:27
中删除
如果没有文件或数据库,则无法将此文件保存到其他地方
发布于 2011-08-18 18:33:20
你的前提条件是相当严格的。内存不在脚本之间共享(或not normally),我们不能使用文件或数据库:这实际上没有可用于共享信息的公共空间,所以每次都必须计算信息。您最好的选择可能是检查正在运行的进程,确定哪些进程属于您的脚本,并对它们进行计数。您提到的cron建议使用Unix,这使事情变得更容易。PHP可能允许在这种程度上控制进程的执行,作为最后一个资源,您始终可以从POSIX运行ps命令。
https://stackoverflow.com/questions/7105866
复制相似问题