Php 当本地数据不可用时,从外部web资源下载数据在应用程序中是否可行;有空吗?

Php 当本地数据不可用时,从外部web资源下载数据在应用程序中是否可行;有空吗?,php,localization,Php,Localization,不久前,我遇到了一个脚本,它基本上从一个web资源(如果它不在数据库中)获取一个国家/州的列表,然后这个脚本将用这些内容填充数据库,从那时起,依赖它们 因为我正在开发自己的本地化类,所以我将使用Zend使用的相同的语言环境数据,以大约60个xml文件的形式,其中包含本地化数据,例如国家、语言和语言环境 我认为,由于我正在使用的框架从现在起将依赖于这些文件(现在没有),而且现在没有任何服务器拥有这些数据,我应该: 将我的web应用程序设置为从中央服务器下载这些文件,其中所有内容都存储在.tar.

不久前,我遇到了一个脚本,它基本上从一个web资源(如果它不在数据库中)获取一个国家/州的列表,然后这个脚本将用这些内容填充数据库,从那时起,依赖它们

因为我正在开发自己的本地化类,所以我将使用Zend使用的相同的语言环境数据,以大约60个xml文件的形式,其中包含本地化数据,例如国家、语言和语言环境

我认为,由于我正在使用的框架从现在起将依赖于这些文件(现在没有),而且现在没有任何服务器拥有这些数据,我应该:

  • 将我的web应用程序设置为从中央服务器下载这些文件,其中所有内容都存储在.tar.gz中,将其解压缩,存储在服务器上,然后依赖它们
  • 创建一个单独的脚本来执行此操作,而不是在应用程序中实际执行此操作
伪代码:

if ( !data ) {
    resource = getFile( 'http://central-server.com/tar.gz' );
    if ( resource ) {
        resource = unpack( directory, resource )
        return true
    }
    throw Exception('could not download files.')
}

如果这是一个库,我可能会让它成为安装步骤的一部分。如果数据不存在,则可能会打印错误。

请使用安装脚本进行下载,如果不可用,则抛出错误。按要求从服务器下载可能会导致超时,并可能会拒绝用户。fsockopen是最简单的方法,如果您没有CURL设置并且无法打开/读取远程文件,则可以手动处理套接字。

如果数据需要不断更新,我会选择第一个选项,否则我会选择第二个选项。


这是我几年前开发的一个方法,它是GeoIP类的一部分:

function Update()
{
    $result = false;

    $databases = glob(HIVE_DIR . 'application/repository/GeoIP/GeoIP_*.dat');

    foreach ($databases as $key => $value)
    {
        $databases[$key] = basename($value);
    }

    $databases[] = 'GeoIP.dat.gz';

    $date = date('ym');

    if ((!in_array('GeoIP_' . $date . '.dat', $databases)) && (date('j') >= 2))
    {
        if ($this->Hive->Filesystem->Write(HIVE_DIR . 'application/repository/GeoIP/GeoIP.dat.gz', file_get_contents('http://www.maxmind.com/download/geoip/database/GeoIP.dat.gz'), false) === true)
        {
            $handler = gzopen(HIVE_DIR . 'application/repository/GeoIP/GeoIP.dat.gz', 'rb');

            $result = $this->Hive->Filesystem->Write(HIVE_DIR . 'application/repository/GeoIP/GeoIP_' . $date . '.dat', gzread($handler, 2 * 1024 * 1024), false);

            gzclose($handler);

            foreach ($databases as $database)
            {
                $this->Hive->Filesystem->Delete(HIVE_DIR . 'application/repository/GeoIP/' . $database);
            }
        }
    }

    return $result;
}
基本上,
Update()
每次都会执行,然后它会检查该月的日期是否等于或大于2(MaxMind在该月的第一天发布GeoIP数据库)以及该月的数据库是否不存在。只有当这两个条件都为true时,该方法才会下载、解包、重命名数据库并删除前几个月的所有旧数据库

在您的情况下,由于您与地区打交道,偶尔做一次类似的定期检查可能不是一个坏主意,因为国家经常更改内容(名称、货币、呼叫代码等)