GeoIp共享内存

时间:2014-05-20 07:43:29

标签: 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);
    $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 dabase都在内存中),但仅适用于一个运行的应用程序。在下一次(浏览器中的刷新页面)中,所有文件将根据geoip_load_shared_mem再次加载到内存中(它会清除所有内存缓存并再次加载文件)。 所以问题是,如何为所有正在运行的应用程序使用geoip共享内存。

我已经完成了下一步。添加检查filesize chaging。 Thx WizKid帮助

 $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);

0 个答案:

没有答案