Cita: pero termina cortándose por limite de tiempo.
¿Lo estás ejecutando a través del servidor web?
Ese creo que sería tu principal error: php no debe usarse para procesos largos, y menos si se deben disparar desde la web.
Debes usar un proceso en el fondo del sistema, pues a dicho proceso le es irrelevante el timeout dado que dicha limitante existe sólo en el contexto web.