Php) ((unserialize kullanarak) ve seri bir kayıtlı dosyasındaki değerleri değişiyor

3 Cevap php

Ben bir dosyaya kaydedilir değerler tefrika dizi var ve değişkenlerin birinin değerini değiştirmek gerekir. Mesela ben 2 $ değerini değiştirin ve sonra yeni değeri ile dosyanın geri tüm dizi kaydedin.

Dışarı tüm dosya / dizi okumak ve yazmak zorunda ile sadece tek değerini değiştirerek daha etkili bir yolu var mı.

$data = file_get_contents('./userInfo');

$data = unserialize($data);
extract($data);
$two="this is a altered value";

 $userData = array(
        'one'          => $one,
        'two'          => $two,
        'three'        => $three
        );

 $file=fopen("../userInfo",'w');
        fwrite($file, $userData);
 fclose($file);

3 Cevap

Seçenek 1: Her dizi girişi için veritabanı satır.

Seçenek 2: Her dizi girişi için farklı bir dosya, dosya adı yerine dizi tuşunu kullanarak. Temelde çok basit bir veritabanı olarak dosya sisteminde bir dizin kullanın.

Seçenek 3: düz dosya ölçekli girdileri sabit, bu nedenle okuma blok boyutuna göre dizi indeksi çarpma ve yazabilirsiniz. Seçtiğiniz blok boyutundan daha büyük veri kesecek olurdu. Temelde çok basit bir veritabanı olarak tek bir dosyayı kullanabilirsiniz.

Sadece ihtiyacınız dizi anahtarına erişmeye - sana $userData gibi yeniden extract() kullanmanız gerekmez. Ayrıca, kullanarak bir kaç adım kaydedebilirsiniz file_put_contents()

This function is identical to calling fopen(), fwrite() and fclose() successively to write data to a file.

Yeni kodu:

$filePath = './userInfo';

$data = unserialize( file_get_contents( $filePath ) );

$data['two'] = "this is a altered value";

file_put_contents( $filePath, serialize( $data ) );

Eğer manuel dize ayrıştırma yapmak için istekli iseniz, o zaman sadece dize uzunluğunu değiştirmek varsayarak, değerden sonra meydana dosya içeriğini kalanını yeniden yazmak gerekebilir. Eğer dize uzunluğunu değiştirmek istemiyorsanız, yerinde düzenleyebilirsiniz. Serialized veri bu dosya very büyük olsa, ben gerçekten şüphe olmadıkça şey ama yavaş yapacak.

Ben olsa rahatsız olmaz. Bu sizin için bir performans sorunu veriyorsa, ben ciddiye farklı bir depolama biçimi düşünün.