Php GeoIp共享内存

Php GeoIp共享内存,php,geolocation,ip,shared-memory,geoip,Php,Geolocation,Ip,Shared Memory,Geoip,在共享内存(GeoIpMaxMind扩展名)的实现中,我们可以看到每次调用此函数时,它都会加载内存中的所有文件 function geoip_load_shared_mem($file) { $fp = fopen($file, "rb"); if (!$fp) { print "error opening $file: $php_errormsg\n"; exit; } $s_array = fstat($fp); $si

在共享内存(GeoIpMaxMind扩展名)的实现中,我们可以看到每次调用此函数时,它都会加载内存中的所有文件

function geoip_load_shared_mem($file)
{
    $fp = fopen($file, "rb");
    if (!$fp) {
        print "error opening $file: $php_errormsg\n";
        exit;
    }
    $s_array = fstat($fp);
    $size = $s_array['size'];
    if (($shmid = @shmop_open(GEOIP_SHM_KEY, "w", 0, 0))) {
        shmop_delete($shmid);
        shmop_close($shmid);
    }
    $shmid = shmop_open(GEOIP_SHM_KEY, "c", 0644, $size);
    shmop_write($shmid, fread($fp, $size), 0);
    shmop_close($shmid);
}
所以在共享内存中加载文件后,我可以使用geoip_open和共享内存标志

$geoLiteCityData = GEOIPMAXMIND_ROOT . DS . 'GeoLiteCity.dat';
geoip_load_shared_mem($geoLiteCityData);
$gi = geoip_open($geoLiteCityData, GEOIP_SHARED_MEMORY);
这意味着使用该数据库的所有操作都会更快(因为我所有的ip数据都存储在内存中),但只运行一个应用程序。在下一次(在浏览器中刷新页面)中,所有文件将根据geoip_load_shared_mem再次加载到内存中(它将清除所有内存缓存并再次加载文件)。 所以问题是,如何为所有运行的应用程序使用geoip共享内存

我已经用另一种方法做了。添加对文件大小更改的检查。谢谢你的帮助

 $geoLiteCityData = GEOIPMAXMIND_ROOT . DS . 'GeoLiteCity.dat';

        if (!($shmid = @shmop_open(GEOIP_SHM_KEY, "a", 0, 0)) || shmop_size($shmid) != filesize($geoLiteCityData)) {
            geoip_load_shared_mem($geoLiteCityData);
        }
        $gi = geoip_open($geoLiteCityData, GEOIP_SHARED_MEMORY);

尝试打开共享内存进行读取。如果失败了,它就不存在了,你必须写出来。如果它在那里,只需读取它并使用itok,但是否有可能在内存中的这些地址中会有一些其他信息,我可以读取它,但它将不是我的数据库?第一个参数是键。只要您没有将其他内容写入同一个键的代码,您就可以了