Quando vou trabalhar com um período em dias no PHP costumo usar o seguinte código:
<?php
$dia = date('d') -1; // Esse menos 1 aqui é para se referir ao dia anterior.
$mes = date('m'); // O date pega a data atual.
$ano = date('Y'); // Ele recebe como parâmetro o d, m e Y para dia, mês e ano respectivamente.
$data = mktime(0,0,0,$mes,$dia,$ano);
// A função mktime() retorna o timestamp Unix dos argumentos informados.
$data = date('Y-m-d',$data); // Aqui o date não considera a data atual, mas sim o segundo parâmetro informado com a data definida anteriormente e junta ano, mês e dia para inserir a data no formato mais usado em banco de dados, o formato date original.
?>
Nesse exemplo estou pegando o dia anterior mas poderiam ser 15 ou 90 dias, ou qualquer outra quantidade, bastaria substituir o 1 por esses valores.
Mas se fosse usar em uma rotina assim como está, em que todos os dias tivessem que pegar o dia anterior, na virada do mês provavelmente teria problema, não pela data em si, pois essa já estaria correta, mas pelo dia, mês ou ano que se fosse o primeiro do próximo ciclo ficaria zerado.
No caso do dia 01/10/21 se fosse usar $dia."/".$mes."/".$ano; ficaria 0/10/21, agora se fosse 01/01/21 ficaria 0/0/22 e não é esse o resultado esperado.
então complemento com explode, assim:
if($dia == 0){ // Vejo se o dia está zerado, no caso de dia primeiro (1 - 1).
$ultimoDia = explode('-',$data); // Uso explode na data formatada.
$ano = $ultimoDia[0]; // Insiro a parte referente ao ano na variável respectiva.
$mes = $ultimoDia[1]; // Faço o mesmo para o mês.
$dia = $ultimoDia[2]; // Também para o dia.
}
No caso o explode transforma uma string em um array de substring, após fazer a quebra do texto inicial de acordo com um limitador, nesse exemplo o traço "-".
Veja mais em: