Y'en a encore

Y’en a encore, des coins mal explorés par ma pomme dans Clearbricks (et probablement aussi dans Dotclear), bien que ça s’arrange de plus en plus à la faveur de la mise en place des tests unitaires, à minima pour le premier.

Dernière trouvaille sur la gestion de la mémoire allouée à Dotclear lorsqu’il gère une image, par exemple, ou lorsqu’il zippe ou dézippe une archive.

La fonction en question, que j’ai corrigée il y a peu pour palier les configurations étranges de chez 1&1[1] (j’ai ajouté les lignes 5 à 8) est celle-ci :

protected function memoryAllocate($size)
{
    $mem_used  = function_exists('memory_get_usage') ? @memory_get_usage() : 4000000;
    $mem_limit = @ini_get('memory_limit');
    if ($mem_limit && trim($mem_limit) === '-1' || !files::str2bytes($mem_limit)) {
        // Cope with memory_limit set to -1 in PHP.ini
        return;
    }
    if ($mem_used && $mem_limit) {
        $mem_limit  = files::str2bytes($mem_limit);
        $mem_avail  = $mem_limit - $mem_used - (512 * 1024);
        $mem_needed = $size;

        if ($mem_needed > $mem_avail) {
            if (@ini_set('memory_limit', $mem_limit + $mem_needed + $mem_used) === false) {
                throw new Exception(__('Not enough memory to open file.'));
            }

            if (!$this->memory_limit) {
                $this->memory_limit = $mem_limit;
            }
        }
    }
}

Qu’on trouve dans class.zip.php, class.unzip.php et class.image.tools.php (d’ailleurs dans ce dernier, elle était un poil différente, ce qui n’avait pas lieu d’être).

Son boulot est d’augmenter si possible la mémoire qui peut être allouée en fonction des besoins, de décompression ou de compression (ça dépend de la taille de l’archive), ou du chargement d’une image pour créer des miniatures par exemples. Cette modification est temporaire et l’ancienne valeur, si elle existait, est remise en place à la fin du traitement.

Maintenant autant je conçois bien l’idée d’augmenter temporairement cette valeur si besoin autant sur des hébergements mutualisés, ce qui est tout de même le plus fréquemment utilisé, je doute que celle-ci soit modifiable par n’importe quelle appli tournant dessus. Dans ce cas là, le seul avantage de cette fonction est de lever une exception qui permet de tracer le « besoin ».

Et en écrivant la dernière phrase je me rends compte qu’il serait probablement opportun d’inclure dans le message d’erreur, la quantité de mémoire requise par le traitement.

Note

[1] Ils ont, depuis peu, défini cette valeur à -1, soit illimitée, sur les hébergements mutualisés.

Ajouter un commentaire

Les champs suivis d'un * sont obligatoires

Les commentaires peuvent être formatés en utilisant la syntaxe Markdown Extra.

Ajouter un rétrolien

URL de rétrolien : https://open-time.net/trackback/13943

Haut de page