uses ignore_user_abort()