Вы можете поместить свой код в цикл и определить ключ итеративно вместо
рекурсивно .
Пример:
function key_generator($length = 4)
{
do {
$key = 'xxxx'; //TODO
if (timeOutReached()) return InvalidKey;
} while (!$this->user_model->valid_key($key))
return $key;
}
Сам цикл не предотвращает цикл infinte, но в отличие от вызова функции, он не поглощает пространство стека, поэтому вы не рискуете переполнением стека.
Также это немного упрощает вещи. В зависимости от типа ключа вы также можете адаптировать метод генерации ключа, например, с помощью пронумерованных ключей вы можете увеличивать экспоненциально с каждой итерацией.
Примечания: Если это возможно, используйте функцию автоматического увеличения базы данных вместо использования собственной функции генерации ключей.
Также убедитесь, что вы защищаете свой код от одновременного доступа. Что если два экземпляра этой функции попытаются сгенерировать ключ, и они оба определят одно и то же? Используйте критические разделы или транзакции, чтобы убедиться, что ничего плохого не происходит.