En teoría session_cache_expire(0); va en el lugar que pusistes: despues de sesion_start() .. Pero lo que no hace exactamente es:
Cita: para que las sesiones terminen cuando el usuario cierra el navegador.
Esa función sólo evita que la página sea "cacheada" por un navegador/proxy . .pero no tiene nada que ver con el tiempo de expiración de un SID válido.
Revisa las directivas tipo session.gc_maxtimelife y afines para controlar ese tiempo.
Por lo demás .. fijate que en tu flujo de código .. en várias ocasiones estás repitiendo la definición del nombre de sesión (session_name()) e inciandola (session_start()) (sobraría esas funciones de tu if() ya que lo defines al principio y se cumplan o no dichas condiciones simpre accedes/usas esa sesión.
Un saludo,