Allowed memory size of 8589934592 bytes exhausted
Ce type d'erreurs est causé par une grande quantité de données en mémoire, donc la façon de le corriger est d'écrire un script de mémoire moins lourd. En modifiant memory_limit
nous n'obtenons qu'une correction temporelle, car lorsque nos données augmentent, elles reviennent.
$campaigns = Campaign::all(); //at this point you are pulling the whole Campaigns table to memory.. and you pull some extra rows after that increasing even more the memory use
Comme je l'ai dit, Elloquent est peu efficace pour ce genre de tâche, alors récupérons les lignes de la base de données comme le faisait mysqli, une par une :
$db = DB::connection()->getPdo(); //get a database connection instance
$main_query_sql = "SELECT * FROM Campaigns"; //write our query
$main_query = $db->prepare($main_query_sql); //prepare it to get executed
$main_query->execute(); //execute our query
$visits_denied_sql = "SELECT COUNT(*) as total FROM VISITS WHERE DENIED = 1 AND CAMPAIGN_ID ="; //let's prepare our aggregate queries
$visits_allowed_sql = "SELECT COUNT(*) as total FROM VISITS WHERE DENIED = 0 AND CAMPAIGN_ID ="; //I just assumed them so change it as you need
$visits_denied = null;
$visits_allowed = null;
while($campaign = $main_query->fetch()){ //fetch our rows one by one
//now we are getting an associative array from the db instead of a model so we cannot use it as a Laravel Model (we can't use ->save() method or eager loading)
$visits_denied = $db->prepare($visits_denied_sql.$campaign['id']);
$visits_denied = $visits_denied->execute();
$denied_visits = $visits_denied->fetch();
$visits_allowed= $db->prepare($visits_allowed_sql.$campaign['id']);
$visits_allowed= $visits_allowed->execute();
$allowed_visits = $visits_allowed->fetch();
$campaign['denied_visits'] = $denied_visits['total'];
$campaign['allowed_visits'] = $allowed_visits['total'] ;
//edit with the correct update sentence:
$insert_query_sql = "UPDATE CAMPAIGNS SET allowed_visits = :visits_allowed, denied_visits = :visits_denied WHERE id = :id";
$insert_query = $db->prepare($insert_query_sql);
$insert_query->bindParam(':visits_allowed', $campaign['allowed_visits']);
$insert_query->bindParam(':visits_denied', $campaign['denied_visits']);
$insert_query->bindParam(':id', $campaign['id']);
$insert_query->execute();
}
Essayez ceci dans votre emploi du temps et faites-moi savoir si cela a fonctionné !