I think you're misusing the term "thread-safe." Thread saftey is (mostly) about shared resources in threaded code. PHP doesn't have threading, and file handles aren't shared resources. Files are shared resources, though. I think you're looking for the term "race condition" instead.
What if the collision occurs after I fopen()
the file, but before I flock()
it?
The same thing that would happen if you weren't using SPLFileObject. Just make sure you never open+truncate, always open+append and then truncate once you have the lock. This should be standard procedure if you're already aware of how file opening and locking race conditions work.