Проблему с проверкой занятости файла думаю лучше всего решать с помощью shm:
php.net/manual/en/ref.sem.php
Либо установкой брокировки на запись, используя:
php.net/manual/en/function.flock.php
Используя семафоры, можно маркировать файл как используемый, при этом не будет необходимости в стороннем хранилище, таком как memcache.
В случае, если требуется "плотная" запись (имею ввиду, что есть требование писать сперва в первые доступные файлы), нужно будет использовать цикл поиска свободного от записи файла.
Если плотная запись не требуется, то можно фиксировать имя последнего закрытого файла опять же в shm, минусом данной реализации будет неравномерное распределение данных.
Имхо, в вашем случае будет достаточно flock(). Внутри, насколько понимаю, как раз используется shm для бокировок записи (прошу поправить меня если я ошибаюсь).
Примерно так может выглядеть поиск первого доступного файла:
for($i=0; $i<MAX_OFILES; ++$i) {
$fp = fopen("file$i.log", "w");
if ($fp && !flock($fp, LOCK_EX | LOCK_NB)) {
fclose($fp);
continue;
}
// write your actions here
fclose($fp);
break;
}
Пример ожидания доступности файла не сильно отличается от приведенного и есть по ссылке на доку к методу flock.
з.ы. Давно не писал на пыхе, поэтому код может быть не валидным.