0
Well, I have a function that when implemented with direct values per code processes quite fast but when it receives values by http request the page takes a lot of time to be processed (I spent more than 15 minutes with the page being processed).
What should I do?
The code is as follows::
<?php
ini_set('max_execution_time', 0);
//CALCULANDO DIAS NORMAIS
/*Abaixo vamos calcular a diferença entre duas datas. Fazemos uma reversão da maior sobre a menor
para não termos um resultado negativo. */
function CalculaDias($xDataInicial, $xDataFinal){
$time1 = dataToTimestamp($xDataInicial);
$time2 = dataToTimestamp($xDataFinal);
$tMaior = $time1>$time2 ? $time1 : $time2;
$tMenor = $time1<$time2 ? $time1 : $time2;
$diff = $tMaior-$tMenor;
$numDias = $diff/86400; //86400 é o número de segundos que 1 dia possui
return $numDias;
}
//LISTA DE FERIADOS NO ANO
/*Abaixo criamos um array para registrar todos os feriados existentes durante o ano.*/
function Feriados($ano,$posicao){
$dia = 86400;
$datas = array();
$datas['pascoa'] = easter_date($ano);
$datas['sexta_santa'] = $datas['pascoa'] - (2 * $dia);
$datas['carnaval'] = $datas['pascoa'] - (47 * $dia);
$datas['corpus_cristi'] = $datas['pascoa'] + (60 * $dia);
$feriados = array (
'01/01',
date('d/m',$datas['carnaval']),
date('d/m',$datas['sexta_santa']),
date('d/m',$datas['pascoa']),
'25/04',
'01/05',
'10/06',
date('d/m',$datas['corpus_cristi']),
'15/08',
'05/10',
'01/11',
'01/12',
'08/12',
'25/12',
);
return $feriados[$posicao]."/".$ano;
}
//FORMATA COMO TIMESTAMP
/*Esta função é bem simples, e foi criada somente para nos ajudar a formatar a data já em formato TimeStamp facilitando nossa soma de dias para uma data qualquer.*/
function dataToTimestamp($data){
$ano = substr($data, 6,4);
$mes = substr($data, 3,2);
$dia = substr($data, 0,2);
return mktime(0, 0, 0, $mes, $dia, $ano);
}
//SOMA 01 DIA
function Soma1dia($data){
$ano = substr($data, 6,4);
$mes = substr($data, 3,2);
$dia = substr($data, 0,2);
return date("d/m/Y", mktime(0, 0, 0, $mes, $dia+1, $ano));
}
//CALCULA DIAS UTEIS
/*É nesta função que faremos o calculo. Abaixo podemos ver que faremos o cálculo normal de dias ($calculoDias), após este cálculo, faremos a comparação de dia a dia, verificando se este dia é um sábado, domingo ou feriado e em qualquer destas condições iremos incrementar 1*/
function DiasUteis($yDataInicial,$yDataFinal){
$diaFDS = 0; //dias não úteis(Sábado=6 Domingo=0)
$calculoDias = CalculaDias($yDataInicial, $yDataFinal); //número de dias entre a data inicial e a final
$diasUteis = 0;
while($yDataInicial!=$yDataFinal){
$diaSemana = date("w", dataToTimestamp($yDataInicial));
if($diaSemana==0 || $diaSemana==6){
//se SABADO OU DOMINGO, SOMA 01
$diaFDS++;
}else{
//senão vemos se este dia é FERIADO
for($i=0; $i<=12; $i++){
if($yDataInicial==Feriados(date("Y"),$i)){
$diaFDS++;
}
}
}
$yDataInicial = Soma1dia($yDataInicial); //dia + 1
}
return $calculoDias - $diaFDS;
}
if(isset($_POST['dferiasinicial']) && $isset($_POST['dferiasfinal'])){
$datai=date("d-m-Y", strtotime($_POST['dferiasinicial'])); // converte a data para o formato indicado
$dataf=date("d-m-Y", strtotime($_POST['dferiasfinal'])); // converte a data para o formato indicado
$diasUteis = DiasUteis($datai, $dataf);
$diasNormal = CalculaDias($datai, $dataf);
echo "diasuteis : ".$diasuteis;
echo "diasnormais : ".$diasNormal;
}
<!DOCTYPE html>
<html>
<head>
<title>Ferias</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
</head>
<body>
<form method="post">
<div class="form-group">
<label for="dferiasinicial">Data de férias inicial</label>
<input type="date" class="form-control" id="dferiasinicial" name="dferiasinicial" placeholder="Insira a data de inicio das suas ferias">
</div>
<div class="form-group">
<label for="dferiasfinal">Data de férias final</label>
<input type="date" class="form-control" id="dferiasfinal" name="dferiasfinal" placeholder="Insira a data de fim das suas ferias">
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</body>
</html>
In my opinion you should save the days that are bank holidays. Thus, you would not need to process this data every time there is a new call.
– Andrei Coelho
By http request you mean you are receiving a request from another server? This may be the problem of the distance between the servers and/or the server itself that takes time to respond to an external request. I think this has nothing to do with your PHP code
– cHida
One suggestion is that you use the PHP Datetime library to optimize your date calculations. http://php.net/manual/en/class.datetime.php
– cHida
By http request I mean I am sending the data through a form instead of putting it directly by code.
– Marco Silva
I’m only using 1 server
– Marco Silva