Düz dosya veritabanları

oy
101

PHP'de düz dosya veritabanı yapıları oluşturarak etrafında en iyi uygulamalar nelerdir?

Oraya bakın daha olgun bir PHP düz dosya çerçeveler bir sürü (sadece o noktada bir veritabanı kullanırsınız) çoğu durumda benim amaçlar için üst üzerinde SQL benzeri sorgu sözdizimi, uygulamaya çalışırlar.

küçük bir kod yükü ile iyi performans ve özellikleri almak için orada herhangi zarif hileler var mı?

Oluştur 01/08/2008 saat 15:19
kaynak kullanıcı
Diğer dillerde...                            


12 cevaplar

oy
68

Eh, düz veritabanlarının doğası budur. onlar büyük veya küçük. bu onların içindeki dizilerle basit diziler var mı? onun bir şey basit gibi inşa UserProfiles dersen:

$user = array("name" => "dubayou", 
              "age" => 20,
              "websites" => array("dubayou.com","willwharton.com","codecream.com"),
              "and_one" => "more");

ve kaydetmek veya güncellemek için db kaydını bu kullanıcı için.

$dir = "../userdata/";  //make sure to put it bellow what the server can reach.
file_put_contents($dir.$user['name'],serialize($user));

ve yük kayıt kullanıcı için

function &get_user($name){
    return unserialize(file_get_contents("../userdata/".$name));
}

ama yine bu uygulama size gereken veritabanı uygulama ve doğasına değişecektir.

Cevap 01/08/2008 saat 18:45
kaynak kullanıcı

oy
46

Sen düşünebilirsiniz SQLite'ı . Düz dosyalar olarak neredeyse kadar basit, ancak sorgulamak için SQL motoru olsun. Bu PHP ile iyi çalışıyor da.

Cevap 09/08/2008 saat 00:00
kaynak kullanıcı

oy
20

Bence, sen anlam ediyoruz anlamda (ve kabul ettikten cevap) bir "düz dosya veritabanı" seçeneğini kullanarak neccesarily şeyleri ele almak için en iyi yol değildir. Her şeyden önce, kullanma serialize()ve unserialize()birisi alır ve dosyayı düzenler, BÜYÜK baş ağrılarına neden olabilir (bunlar, aslında, her zaman çalıştırılacak sizin "veritabanında" in arbritrary kodu koyabilirsiniz.)

değil geleceğe bakmak neden - Şahsen ben derim? Orada ben kendi "özel" dosyaları oluşturma oldum çünkü sorunları yaşadım pek çok kez olmuştur ve proje bunun bir veritabanı gereken bir noktaya patladı ve ben keşke, bilirsin" düşünüyorum kod üstlenmeden çok fazla zaman ve çaba gerektirir, çünkü - Ben "ile başlayan bir veritabanı için bu yazmıştım.

Bundan ben daha büyük aldığında Gidip günler üstlenmeden harcamak zorunda kalmamak için başvurumu geçirmezlik o geleceği ileri gitmek için bir yol olduğunu öğrendim. Bunu nasıl yaparım?

SQLite. Bu mySQL geçmek için, bir veritabanı olarak çalışır SQL kullanır ve oldukça kolaydır (benim yaptığım gibi veritabanı manipülasyon için soyutlanmış sınıfları kullanıyorsanız espescially ise!)

Aslında, espescially "kabul edilen yanıt" 'in metodu ile, büyük ölçüde uygulamanızın bellek kullanımını kesebilir (PHP içine tüm 'KAYITLARI' yüklemek zorunda değilsiniz)

Cevap 21/09/2008 saat 19:21
kaynak kullanıcı

oy
15

Bu doğru. serialize()bunun için de oldukça yararlı olabilir.

Ben uygulanabilir bir sistem ile geliyor için hile karmaşıklığı ile kendinizi öldürmeden endeksi verileri düğümler için bir yol bulmaktır düşünüyorum.

Cevap 01/08/2008 saat 15:58
kaynak kullanıcı

oy
11

Ben düşünüyorum Bir çerçeve bir blog platformu için olurdu. Eğer tarihe göre sıralanır olacağını isteyeyim verilerin hemen hemen tüm olası görünümü beri, bu yapısı hakkında düşünüyordum:

içerik düğümü başına bir dizin:

./content/YYYYMMDDHHMMSS/

dahil olmak üzere her bir düğümün alt dizinler

/tags  
/authors  
/comments  

Hem de öncesi ve sonrası işlenen içerik ve benzerleri için düğüm dizinde basit metin dosyaları olarak.

Bu basit bir PHP sağlayacak glob()sadece içerik yapısı içinde bir şey hakkında sorgulamak için (muhtemelen ve result dizisinin bir tersine) çağrısı:

glob("content/*/tags/funny");  

"Komik" etiketli tüm makaleler içeren yolları dönecekti.

Cevap 01/08/2008 saat 15:26
kaynak kullanıcı

oy
8

Burada Lilina için kullanmak kod:

<?php
/**
 * Handler for persistent data files
 *
 * @author Ryan McCue <cubegames@gmail.com>
 * @package Lilina
 * @version 1.0
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 */

/**
 * Handler for persistent data files
 *
 * @package Lilina
 */
class DataHandler {
    /**
     * Directory to store data.
     *
     * @since 1.0
     *
     * @var string
     */
    protected $directory;

    /**
     * Constructor, duh.
     *
     * @since 1.0
     * @uses $directory Holds the data directory, which the constructor sets.
     *
     * @param string $directory 
     */
    public function __construct($directory = null) {
        if ($directory === null)
            $directory = get_data_dir();

        if (substr($directory, -1) != '/')
            $directory .= '/';

        $this->directory = (string) $directory;
    }

    /**
     * Prepares filename and content for saving
     *
     * @since 1.0
     * @uses $directory
     * @uses put()
     *
     * @param string $filename Filename to save to
     * @param string $content Content to save to cache
     */
    public function save($filename, $content) {
        $file = $this->directory . $filename;

        if(!$this->put($file, $content)) {
            trigger_error(get_class($this) . " error: Couldn't write to $file", E_USER_WARNING);
            return false;
        }

        return true;
    }

    /**
     * Saves data to file
     *
     * @since 1.0
     * @uses $directory
     *
     * @param string $file Filename to save to
     * @param string $data Data to save into $file
     */
    protected function put($file, $data, $mode = false) {
        if(file_exists($file) && file_get_contents($file) === $data) {
            touch($file);
            return true;
        }

        if(!$fp = @fopen($file, 'wb')) {
            return false;
        }

        fwrite($fp, $data);
        fclose($fp);

        $this->chmod($file, $mode);
        return true;

    }

    /**
     * Change the file permissions
     *
     * @since 1.0
     *
     * @param string $file Absolute path to file
     * @param integer $mode Octal mode
     */
    protected function chmod($file, $mode = false){
        if(!$mode)
            $mode = 0644;
        return @chmod($file, $mode);
    }

    /**
     * Returns the content of the cached file if it is still valid
     *
     * @since 1.0
     * @uses $directory
     * @uses check() Check if cache file is still valid
     *
     * @param string $id Unique ID for content type, used to distinguish between different caches
     * @return null|string Content of the cached file if valid, otherwise null
     */
    public function load($filename) {
        return $this->get($this->directory . $filename);
    }

    /**
     * Returns the content of the file
     *
     * @since 1.0
     * @uses $directory
     * @uses check() Check if file is valid
     *
     * @param string $id Filename to load data from
     * @return bool|string Content of the file if valid, otherwise null
     */
    protected function get($filename) {
        if(!$this->check($filename))
            return null;

        return file_get_contents($filename);
    }

    /**
     * Check a file for validity
     *
     * Basically just a fancy alias for file_exists(), made primarily to be
     * overriden.
     *
     * @since 1.0
     * @uses $directory
     *
     * @param string $id Unique ID for content type, used to distinguish between different caches
     * @return bool False if the cache doesn't exist or is invalid, otherwise true
     */
    protected function check($filename){
        return file_exists($filename);
    }

    /**
     * Delete a file
     *
     * @param string $filename Unique ID
     */
    public function delete($filename) {
        return unlink($this->directory . $filename);
    }
}

?>

Biz (hayır gereksiz veri yüklenir ve kaydetmek için daha hızlı) kullanımı için yeterince verimli buldum ayrı bir dosya olarak her giriş depolar.

Cevap 28/10/2008 saat 11:45
kaynak kullanıcı

oy
8

Eğer veri gerçekleştikten düz dosyası kullanmak gidiyoruz, veri yapısı XML kullanabilirsiniz. PHP bir sahiptir yerleşik XML ayrıştırıcı .

Cevap 18/09/2008 saat 07:40
kaynak kullanıcı

oy
7

Bir dosyada veri depolamak için tasarlanmış iki basit işlevleri yazdım. bu durumda yararlıdır kendin için yargılayabilir. nokta bir dosyaya (o da bir dizi bir dize veya bir nesne ise) bir php değişkeni kurtarmaktır.

<?php
function varname(&$var) {
    $oldvalue=$var;
    $var='AAAAB3NzaC1yc2EAAAABIwAAAQEAqytmUAQKMOj24lAjqKJC2Gyqhbhb+DmB9eDDb8+QcFI+QOySUpYDn884rgKB6EAtoFyOZVMA6HlNj0VxMKAGE+sLTJ40rLTcieGRCeHJ/TI37e66OrjxgB+7tngKdvoG5EF9hnoGc4eTMpVUDdpAK3ykqR1FIclgk0whV7cEn/6K4697zgwwb5R2yva/zuTX+xKRqcZvyaF3Ur0Q8T+gvrAX8ktmpE18MjnA5JuGuZFZGFzQbvzCVdN52nu8i003GEFmzp0Ny57pWClKkAy3Q5P5AR2BCUwk8V0iEX3iu7J+b9pv4LRZBQkDujaAtSiAaeG2cjfzL9xIgWPf+J05IQ==';
    foreach($GLOBALS as $var_name => $value) {
        if ($value === 'AAAAB3NzaC1yc2EAAAABIwAAAQEAqytmUAQKMOj24lAjqKJC2Gyqhbhb+DmB9eDDb8+QcFI+QOySUpYDn884rgKB6EAtoFyOZVMA6HlNj0VxMKAGE+sLTJ40rLTcieGRCeHJ/TI37e66OrjxgB+7tngKdvoG5EF9hnoGc4eTMpVUDdpAK3ykqR1FIclgk0whV7cEn/6K4697zgwwb5R2yva/zuTX+xKRqcZvyaF3Ur0Q8T+gvrAX8ktmpE18MjnA5JuGuZFZGFzQbvzCVdN52nu8i003GEFmzp0Ny57pWClKkAy3Q5P5AR2BCUwk8V0iEX3iu7J+b9pv4LRZBQkDujaAtSiAaeG2cjfzL9xIgWPf+J05IQ==')
        {
            $var=$oldvalue;
            return $var_name;
        }
    }
    $var=$oldvalue;
    return false;
}

function putphp(&$var, $file=false)
    {
    $varname=varname($var);
    if(!$file)
    {
        $file=$varname.'.php';
    }
    $pathinfo=pathinfo($file);
    if(file_exists($file))
    {
        if(is_dir($file))
        {
            $file=$pathinfo['dirname'].'/'.$pathinfo['basename'].'/'.$varname.'.php';
        }
    }
    file_put_contents($file,'<?php'."\n\$".$varname.'='.var_export($var, true).";\n");
    return true;
}
Cevap 19/12/2012 saat 21:48
kaynak kullanıcı

oy
6

Bu bir pratik çözüm olarak ilham verici:
https://github.com/mhgolkar/FlatFire
Bu işleme verileri için birden stratejileri kullanır ...
[Benioku Dosyadan kopyalandı]

Serbest veya Yapılandırılmış veya Karışık

- STRUCTURED
Regular (table, row, column) format.
[DATABASE]
/   \
TX  TableY
    \_____________________________
    |ROW_0 Colum_0 Colum_1 Colum_2|
    |ROW_1 Colum_0 Colum_1 Colum_2|
    |_____________________________|
- FREE
More creative data storing. You can store data in any structure you want for each (free) element, its similar to storing an array with a unique "Id".
[DATABASE]
/   \
EX  ElementY (ID)
    \________________
    |Field_0 Value_0 |
    |Field_1 Value_1 |
    |Field_2 Value_2 |
    |________________|
recall [ID]: get_free("ElementY") --> array([Field_0]=>Value_0,[Field_1]=>Value_1...
- MIXD (Mixed)
Mixed databases can store both free elements and tables.If you add a table to a free db or a free element to a structured db, flat fire will automatically convert FREE or SRCT to MIXD database.
[DATABASE]
/   \
EX  TY
Cevap 02/05/2013 saat 14:57
kaynak kullanıcı

oy
6

Eğer Homebrewing şey kaçınmak istiyorsanız IMHO, iki seçenek vardır:

  1. SQLite

    PDO aşina iseniz, SQLite'ı bir PDO sürücüsü desteği yükleyebilirsiniz. Hiçbir zaman kullandım ama PDO MySQL ile bir ton kullanmıştır. Bunun mevcut proje üzerinde denemek için gidiyorum.

  2. XML

    Verilerin nispeten küçük miktarlarda bu defalarca Done. XMLReader hafif, salt ileri imleç tarzı sınıftır. SimpleXML basit bunları tıpkı diğer sınıf örneği gibi erişebilmesi bir nesne haline bir XML belgesi okumayı kolaylaştırır.

Cevap 02/12/2012 saat 16:49
kaynak kullanıcı

oy
6

Eğer bir insan tarafından okunabilir bir sonuç istiyorsanız, ayrıca bu türde bir dosya kullanabilirsiniz:

ofaurax|27|male|something|
another|24|unknown||
...

(Göre bölünmüş, her hat için |) Bu şekilde, sadece bir dosya var, bunu hata ayıklama (ve elle düzeltmek) kolayca, siz (her satırın sonunda) sonradan alanlar ekleyebilirsiniz ve PHP kodu basittir olabilir.

Ancak, dezavantajları bir şey aramak için dosyanın tamamını ayrıştırmak gerektiğidir (eğer giriş milyonlarca varsa, sorun değil) ve (nick WaR ise örneğin | ordz) Eğer verilerde ayırıcı kolu olmalıdır.

Cevap 18/09/2008 saat 08:51
kaynak kullanıcı

oy
4

Sadece sistemin bu tip bir düz dosya veritabanı ile potansiyel bir sorun işaret:

data|some text|more data

row 2 data|bla hbalh|more data

...vb

"|" Sorun hücre veri içeriyor olmasıdır ya da bir "\ n" sonra veri kaybolacaktır. Bazen insanların çoğu kullanmak ister harflerin kombinasyonları ile bölmek kolay olurdu.

Örneğin:

Sütun ayırıcı: #$% (Shift+345)

Satır ayırıcı: ^&* (Shift+678)

Metin dosyası: test data#$%blah blah#$%^&*new row#$%new row data 2

Sonra kullan: explode("#$%", $data); use foreach, the explode again to separate columns

Veya bu satırlar boyunca herhangi bir şey. Ayrıca, daha büyük veritabanları için büyük bellek domuz düz dosya veritabanları veri (yani. 20'den az satırlar) küçük miktarlarda olan sistemler için iyi olduğuna katmakla kalmıyor hale gelebilir.

Cevap 04/01/2013 saat 01:14
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more