Non avrei mai immaginato un problema simile.

Ti propongo questo. Non è un granché ma sembra funzionare.

Codice PHP:
<?php
//--- Intervallo di 1 mese
$intervallo = new DateInterval('P1M');
$fine       date("Y-m-d");
$dataFine   = new DateTime($fine);
$inizio     = new DateTime($fine);
$inizio     $inizio->sub($intervallo);
//--- Intervallo di 1 giorno
$intervallo2 = new DateInterval('P1D'); 
// finché l'anno è il mese sono uguali
while ($inizio->format('Y-m') == $dataFine->format('Y-m')) {
 
// Data giorno precedente
 
$inizio     $inizio->sub($intervallo2); 
}
print 
$inizio->format('Y-m-d');