Limitare rezoluție imaginii la încărcare
Am o problemă în care o imagine de dimensiuni foarte mari face ca serverul meu VPS să repornească din cauza problemelor de memorie. Configurația acestei protecții nu depinde de mine, este un fel de mecanism de siguranță al gazdei.
Am un VPS cu 300M memorie, care cred că este suficient pentru instalația mea WordPress, cel puțin pentru operațiunile zilnice.
Imaginea pe care o încarc nu este deosebit de mare ca dimensiune a fișierului (~380 kb) și este în mare parte neagră cu litere albe. Totuși, rezoluția ei este de 4583 * 4583. Când o încarc prin WordPress, primesc o eroare HTTP în fereastra de încărcare, iar când verific site-ul live, acesta este indisponibil pentru câteva minute.
Mă întrebam dacă este posibil să detectez rezoluția unei imagini și să o împiedic să fie încărcată. Sunt destul de priceput să mă descurc cu un editor de imagini, dar unii dintre autorii mei ar putea să nu fie la fel de experimentați pentru a procesa imaginea înainte de a încărca ceva atât de mare.
Ar fi și mai bine dacă limitarea ar putea fi bazată pe biți-per-pixel ai imaginii, dar nu am nicio idee care este limita serverului meu pentru aceasta, așa că cred că un mesaj de eroare care să spună că imaginea nu poate fi încărcată pentru că este mai mare de, să zicem, 2000 * 2000 este suficient.
Problema nu este atât încărcarea în sine, deoarece aceasta presupune o conexiune de rețea între client și server. Nu aceasta consumă memoria serverului.
Când WordPress începe să 'proceseze' imaginile, atunci intervine PHP și începe să redimensioneze și să decupeze imaginile încărcate. Înainte de acest moment trebuie să interveniți și să efectuați câteva verificări înainte de a permite PHP să consume memoria.
Folosind filtrul wp_handle_upload_prefilter
, puteți atașa o funcție care efectuează orice verificare doriți asupra imaginii care urmează să fie procesată:
<?php
/* Utilitare Marc Dingena
* Verifică rezoluția imaginii înainte de procesare
*/
add_filter('wp_handle_upload_prefilter','mdu_validate_image_size');
function mdu_validate_image_size( $file ) {
$image = getimagesize($file['tmp_name']);
$minimum = array(
'width' => '400',
'height' => '400'
);
$maximum = array(
'width' => '2000',
'height' => '2000'
);
$image_width = $image[0];
$image_height = $image[1];
$too_small = "Dimensiunile imaginii sunt prea mici. Dimensiunea minimă este {$minimum['width']} pe {$minimum['height']} pixeli. Imaginea încărcată are $image_width pe $image_height pixeli.";
$too_large = "Dimensiunile imaginii sunt prea mari. Dimensiunea maximă este {$maximum['width']} pe {$maximum['height']} pixeli. Imaginea încărcată are $image_width pe $image_height pixeli.";
if ( $image_width < $minimum['width'] || $image_height < $minimum['height'] ) {
// adaugă în câmpul 'error' al array-ului $file mesajul
$file['error'] = $too_small;
return $file;
}
elseif ( $image_width > $maximum['width'] || $image_height > $maximum['height'] ) {
// adaugă în câmpul 'error' al array-ului $file mesajul
$file['error'] = $too_large;
return $file;
}
else
return $file;
}
?>

Pentru un plugin, încearcă http://wordpress.org/plugins/imsanity/ și acesta te va ajuta să previți încărcarea de imagini prea mari de către alți utilizatori ai site-ului.
Imsanity redimensionează automat imaginile uriașe încărcate la o dimensiune mai rezonabilă pentru afișare în browser, dar încă suficient de mare pentru utilizarea tipică pe site. Plugin-ul este configurat cu lățime, înălțime și calitate maximă. Când un contributor încarcă o imagine mai mare decât dimensiunea configurată, Imsanity o va redimensiona automat la dimensiunea configurată și va înlocui imaginea originală.

În legătură cu consumul de memorie PHP al WordPress pentru procesarea imaginilor, cum ai spune că se compară acest plugin? Nu ar face acest plugin la fel de mult să se blocheze serverul?

Acest plugin este bun pentru a menține un spațiu total pe disc scăzut datorită încărcărilor de imagini originale foarte mari, dar aceasta nu este întrebarea care a fost pusă. Imsanity nu este o soluție pentru problema încărcării originale care eșuează să fie procesată din cauza dimensiunilor în pixeli atât de mari încât PHP se blochează din cauza lipsei de memorie disponibilă.

Este posibil ca serverul tău să aibă suficientă memorie pentru a efectua sarcina, dar setarea limită de memorie PHP este prea mică pentru conversia imaginilor foarte mari.
Încearcă să setezi memory_limit
în php.ini la o valoare mai mare.
memory_limit=256M
*Notă: Această soluție poate să nu fie potrivită în unele medii de hosting.

Pentru un plugin, încercați https://es.wordpress.org/plugins/cheetaho-image-optimizer/ și acesta vă va ajuta să preveniți încărcarea de către alți utilizatori a imaginilor prea mari.
