tristram
Guest
проблемма с fopen в class.
Для своего движка и приложений я решил делать текстовые конфиги, ini-style я считаю очень тупым, т.к туда нельзя запихнуть массив или булеан стандартными средствами php. я решил юзать serialize() и забыть про траблы. задача была написать класс который автоматом загружает данные из файла, пишет в $class->db и при вызове $class->flush(); пишет $class->db обратно в файл, а также опционально поддерживает base64. скрипт я сделал, но я решил не останавливатся на конфигах, и сделать гвестбук на такой базе.
для этого обязательно требуется flock, и по-этому надо делать $class->fp где будет распологатся указатель файла, а фукции будут с ним работать.
у меня нифига не вышло.
вот версия без flock (там каждую операцию открывается файл и закрыватеся).
Для своего движка и приложений я решил делать текстовые конфиги, ini-style я считаю очень тупым, т.к туда нельзя запихнуть массив или булеан стандартными средствами php. я решил юзать serialize() и забыть про траблы. задача была написать класс который автоматом загружает данные из файла, пишет в $class->db и при вызове $class->flush(); пишет $class->db обратно в файл, а также опционально поддерживает base64. скрипт я сделал, но я решил не останавливатся на конфигах, и сделать гвестбук на такой базе.
для этого обязательно требуется flock, и по-этому надо делать $class->fp где будет распологатся указатель файла, а фукции будут с ним работать.
у меня нифига не вышло.
вот версия без flock (там каждую операцию открывается файл и закрыватеся).
PHP:
class mydb_sdb
{
var $db;
function mydb_sdb($path,$nobase64) {$this->load($path,$nobase64);}
function load($path,$nobase64) {$this->path = $path; if (empty($nobase64)) {$nobase64 = $this->nobase64;} $this->nobase64 = $nobase64; $this->path = $path; $fp = fopen($path,"r"); while ($read = fread($fp,1024)) {$data .= $read;} fclose($fp); if (!$this->nobase64) {$data = base64_decode($data);} $this->db = unserialize($data); unset($data); return $this->db;}
function loaddata($data) {if (!$this->nobase64) {$data = base64_decode($data);} $this->db = unserialize($data); return $this->db;}
function flush($path) {if (empty($path)) {$path = $this->path;} $fp = fopen($path,"w"); $data = $this->db; $data = serialize($data); if (!$this->nobase64) {$data = base64_encode($data);} fwrite($fp,$data); fclose($fp);}
}