Consider that very simple code, that runs on PHP 5.2.5 onto a Windows machine : <?php class a { public $b; public function __sleep() { file_put_contents("log.txt","ok" . PHP_EOL,FILE_APPEND); echo "done!"; return array(); } } $a = new a; serialize($a); ?> No problem here, log.txt is writtable, when it passes on the serialize() instruction, it goes to __sleep and works well. "OK\r\n" is appended to the log file , and "done!" is displayed. Now consider this : <?php session_start(); class a { public $b; public function __sleep() { file_put_contents("log.txt","ok" . PHP_EOL,FILE_APPEND); echo "done!"; return array(); } } $a = new a; $_SESSION['obj'] = $a; ?> In this case, when the object is going in the session, it naturally passes throught __sleep(). The problem is that file_put_contents() doesn't work -> the file is not appended "OK\r\n" as it should be. "done!" is displayed , and if you look at the return value of file_put_contents ( number of bytes that have been written ) : it's all right ! It simply doesn not write to the file. Anyone has an idea ? Is this a bug ? Thx :)