Обхожу неработающий set_time_limit с помощью создания очереди заданий.
Попросту
select id,task from update_list limit 3 where active = 1
далее когда обработка выполнена
update update_list limit set active=1 where id= $obj->id
Главное чтобы одна операция не превышала 30сек, конечно.
Если превышает — надо разрезать задания на куски, оптимизировать базу.
Например разделять одну таблицу на множество по id записи, например, создавая таблицы:
users_10k
users_20k