2

我为我的应用程序创建了一个 1MB 的共享内存空间。

每个用户都是一个且只有一个数组,其中包含一些信息,可以从大约 10 个并发进程中访问,并且在其监视器上,用户可以看到每个进程的进度。

Evey 进程从客户的数组中清除其拥有的值。

但是..在不断增长的情况下... 100 万用户,每一个 1 个空数组“在每一刻”都会给我这个

shm_put_var(): 没有足够的共享内存

...我如何检测共享区域的大小何时“低”?所以我可以种植它

编辑:我正在使用 shm_ 函数(例如shm_get_var()

在这组函数中,没有什么能告诉我在内存中的数据损坏之前空间不足......

4

2 回答 2

2

也许你可以估计你缓存的对象的大小并自己跟踪剩余空间,通过使用如下的实用函数:

public static function getSize($object){
    return self::formatBytes(strlen(serialize($object)));
}

public static function formatBytes($bytes, $precision=2){
    $units = array('B', 'KB', 'MB', 'GB', 'TB');
    $bytes = max($bytes, 0);
    $pow = floor(($bytes ? log($bytes) : 0) / log(1024));
    $pow = min($pow, count($units) - 1);    
    $bytes /= pow(1024, $pow);
    return round($bytes, $precision).' '.$units[$pow];
}

这可能并不总是 100% 准确,但应该接近真实对象的大小。

于 2014-03-26T11:42:58.887 回答
1

您可以使用 shell 命令,但这取决于您的托管服务允许的内容,如果您这样做的话。

使用 shell_exec() 您可以调用系统函数来读取操作系统的任务管理器。

例如,对于 OSX,您可以使用“top”命令行函数实时检索空闲内存。最简单的可能是转储整个活动表并使用正则表达式来获取 PHP 进程。

于 2013-02-18T10:46:07.123 回答