Di solito utilizzo una semplice variabile bandiera, un pò come per il controllo del login.
Sia quando sfrutto il pattern mvc, ma anche ai tempi del procedurale ,di norma utilizzo un file di configurazione che viene sempre incluso, all'interno è presente una variabile che se è ad esempio impostata a true rappresenta lo stato di manutenzione, di conseguenza viene stampato un messaggio di avviso appena un utente proverà a caricare una nuova pagina.
Lo stato "manutenzione" può anche essere salvato in database, dipende un pò dalle esigenze.

Come dicevo, un pò come per il controllo del login, se la variabile manutenzione è true stampi un messaggio (o carichi la pagina apposita) e blocchi l'esecuzione.

Magari altri utenti sapranno indicarti altri metodi, io procedo così.