Yerel veri mevcut değildir olduğunda harici web kaynak veri indirmek için bir uygulamada pratik mi?

3 Cevap php

Bir süre önce bir veritabanında bulunan değilse temelde bir web kaynak ülkelerin / devletlerin listesini getirilen bir senaryo geldi, ve bu komut sonra onlara güveniyor, bu içeriklerle ve o andan itibaren veritabanı doldurmak istiyorum ardından.

Benim kendi yerelleştirme sınıf üzerinde çalışıyorum beri, ben bu yerellerde için ülkeler, diller olarak yerelleştirilmiş veriler içeren etrafında ~ 60 ya da öylesine xml dosyaları şeklinde, Zend kullanarak aynı yerel verileri kullanarak olacak.

Ben üzerinde çalışıyorum çerçeve artık (şimdi değil ise) bu dosyalar üzerinde durulacaktır beri anlamaya ve sunucuların hiçbiri şimdi bu verileri, should I:

  • Kur sonra, tüm içeriği. Tar.gz saklanan bir merkezi sunucu bu dosyaları indirmek bunları açmak, sunucusunda depolamak ve benim web uygulama onlara güveniyor
  • Bunun için ayrı bir komut dosyası oluşturun ve aslında uygulaması içinde bunu.

Sahte kod:

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

3 Cevap

I would go for the first option iff veriler aksi Ben ikinci seçeneği tercih ediyorum, contantly güncelleştirilmesi gerekiyor.


İşte GeolP sınıfın bir parçası oldu ben birkaç yıl önce geliştirilen bir yöntemdir:

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;
}

Temelde Update() her zaman idam edildi, daha sonra kontrol eğer eşit ya da 2 (MaxMind ayın ilk gününde GeolP veritabanları açıklamaları) and daha yüksek ayın günü o ay için aa veritabanı zaten var olmasaydı. Sadece yöntem indirmek istiyorsunuz ama gerçek bu şartlar varsa, paket açma, veritabanını yeniden adlandırın ve önceki aylara tüm eski veritabanlarını kaldırın.

Ülke (isimler, para, vb kodları, çağıran ..) bir sürü şeyler değiştirmek beri durumunda, buna benzer bir periyodik kontrol yapıyor, yerel ile uğraşıyoruz beri bir süre sonra, kötü bir fikir olmayabilir.

Bu bir kitaplık ise, ben muhtemelen bu kurulum adımlarının parçası olurdu. veri yoksa bir hata basılabilir.

Bir yükleme komut indirme yapmak, ya da mevcut değilse, bir hata atmak var. Sunucudan istendiği gibi indirirken zaman aşımına neden olabilir ve büyük olasılıkla kullanıcıların uzak açacak. fsockopen Eğer CURL kurulum yok ve / fread uzak dosyaları fopen değil eğer bunu yapmak ve elle prizlere ile başa çıkmak için en kolay yoludur.