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.
1 De Bernard -
Je viens de tester sur la version Dotclear “Free”
- version Dc.? remaniée
Avertissement :
j’ai tenté de charger une image de taille +/-11Mb.
Résultat, après une attente, un peu longue:
Conséquence: un message indiquant soit >2 MB ou 11Mb>2MB aurait été le bienvenu ;-)
(est_ce possible avant opération ? ce qui éviterait d’utiliser des ressources inutilement?)
2 De Franck -
Tu ouvres un ticket avec ça ?
3 De Bernard -
Euh….
Je donnais l’exemple de ce qui n’est pas fait chez Free (les blogs Dc mis en place par Yohan)… Donc pas de ticket pour ce type de blog Dc ;-)
Je vais tester sur la version dotclear pour voir si c’est le même comportement.
Si c’est le cas j’ouvre un ticket.