Эта тема на forum.dklab.ru


Kirill_: Проблемы чтения и блокировки файлов
Для обмена данными между распараллеливаемыми процессами(с использованием CURL_MULTI) потребовалось самостоятельно реализовать механизм, идентичный PHP сессии и столь же надёжный. Получился код:


public function __construct(){
$this->session_file=fopen($session_path,'a+b');

flock($this->session_file,LOCK_EX);

if (($size=filesize($session_path))){
fseek($this->session_file,0);
$this->session=unserialize(fread($this->session_file,$size));
}
}



[здесь — модификация $this->session]

public function __destuct(){
ftruncate($this->session_file,0);
fwrite($this->session_file,serialize($this->session));
flush($this->session_file);
@flock($this->session_file, LOCK_UN);
fclose($this->session_file);

}


Этот простейший код «из учебника» не работает. Очень часто возникает ошибка типа:

<b>Notice</b>: unserialize() [<a href='function.unserialize'>function.unserialize</a>]: Error at offset 25820 of 25823 bytes
Что она означает — не знаю. Или fread некорректно работает, или операция чтения вклинивается между операцией записи.

Решение с file_get_contents работает, но я понимаю, что при больших нагрузках не удастся даже подстраховаться от ошибок :(

Условия использования: PHP 5.2.6, Windows XP(NTFS)

Уже четыре ночи сижу над этой проблемой — ничего не могу придумать. :(
Поэтому заранее очень благодарю за любую помощь.
Александр Михалицын:
Kirill_,
http://phpfaq.ru/debug

Учитесь отладке - это едва ли не самое важное, в работе программиста. (-;

Что нужно сделать чтобы разрешить данную проблему? Правильно, посмотреть что же такое передается функции unserialize,
что она так на вас ругается. (-:

Эта тема на forum.dklab.ru