[risolto] Sito lentissimo, è il mio script?

IImanuII

Utente Attivo
10 Giu 2012
390
0
16
Ragazzi ho un sito hostato su netsons e come l'utenza è aumentata di pochissimo 100/200 online il sito carica in maniera lentissima.
Ho paura che la colpa sia mia, difatti l'unico error log che vedo è questo

PHP:
[13-Mar-2014 12:44:41 Europe/Berlin] PHP Warning:  imagecreatefromjpeg() [<a href='function.imagecreatefromjpeg'>function.imagecreatefromjpeg</a>]: Cannot read image data in percorso* on line 4
[13-Mar-2014 12:44:41 Europe/Berlin] PHP Warning:  imagecopyresampled() expects parameter 1 to be resource, boolean given in percorso* on line 7
[13-Mar-2014 12:44:41 Europe/Berlin] PHP Warning:  imagejpeg() expects parameter 1 to be resource, boolean given in percorso*on line 10
[13-Mar-2014 12:44:41 Europe/Berlin] PHP Warning:  imagedestroy() expects parameter 1 to be resource, boolean given in percorso* on line 12

Lo script interessato è uno script che fa in modo di fare il resize di un'immagine e dopo di sovrapporne due.
Ho pensato che magari fosse quello, vi posto i file interessati

Il file index.php

PHP:
<?php
$site_url='http://'.$_SERVER['SERVER_NAME'].implode("/", explode("/", $_SERVER['PHP_SELF'], -1)).'/';

$dest = imagecreatefromjpeg($site_url."resize.php");
$src = imagecreatefrompng("play.png");

imagecopyresampled($dest, $src, 0, 0, 0, 0, 700, 300, 700, 300); 

header('Content-Type: image/jpeg');
imagejpeg($dest);

imagedestroy($dest);
imagedestroy($src);
?>

e resize.php

PHP:
/*
 * PHP GD
 * resize an image using GD library
 */

// File and new size
//the original image has 800x600
$filename = 'video.jpg';
//the resize will be a percent of the original size
//$percent = 0.5;

// Content type
header('Content-Type: image/jpeg');

// Get new sizes
list($width, $height) = getimagesize($filename);
$newwidth = 700;//$width * $percent;
$newheight = 300;//$height * $percent;

// Load
$thumb = imagecreatetruecolor($newwidth, $newheight);
$source = imagecreatefromjpeg($filename);

// Resize
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

// Output and free memory
//the resized image will be 400x300
imagejpeg($thumb);
imagedestroy($thumb);

Ovviamente poi ci sono 2 immagini in formato jpg

Questo script serve per creare un'anteprima.

E' urgentissimo, non è che potete darmi una mano? Non è che lo script consuma troppe risorse perchè scritto male? Oppure non è che ogni volta fa il resiza dell'immagine e quindi genera errore?

Help :crying:
 
Lavorare con le GD consuma molte risorse, non dovresti mai far generare a PHP le anteprime ogni volta che un utente le richiede per la normale navigazione.

Piuttosto fai si di salvarti l'anteprima generata dalla prima richiesta così che, nelle successive, se disponi del file di cache salvato in precedenza lo mostri senza passare più per le GD.


In ogni caso, la lentezza potrebbe essere frutto anche di una mancata ottimizzazione del database:
  • Le colonne delle tue tabelle hanno valori di dimensionamento appropriati per il dato che devono contenere ? (esempio: se i nickname dei tuoi utenti non possono superare i 20 caratteri non ha senso un varchar(50), se devi archiviare un valore numerico intero molto basso non ha senso un INT(10) e così via
  • Le colonne chiave che sfrutti per la ricerca con le tue query sono indicizzate ?
  • Tra le tue procedure ce ne sono alcune che fanno eseguire delle query all'interno di cicli while/for ?
  • Hai query che realizzano Join fullscan su più tabelle molto voluminose ?
 
Lavorare con le GD consuma molte risorse, non dovresti mai far generare a PHP le anteprime ogni volta che un utente le richiede per la normale navigazione.

Piuttosto fai si di salvarti l'anteprima generata dalla prima richiesta così che, nelle successive, se disponi del file di cache salvato in precedenza lo mostri senza passare più per le GD.


In ogni caso, la lentezza potrebbe essere frutto anche di una mancata ottimizzazione del database:
  • Le colonne delle tue tabelle hanno valori di dimensionamento appropriati per il dato che devono contenere ? (esempio: se i nickname dei tuoi utenti non possono superare i 20 caratteri non ha senso un varchar(50), se devi archiviare un valore numerico intero molto basso non ha senso un INT(10) e così via
  • Le colonne chiave che sfrutti per la ricerca con le tue query sono indicizzate ?
  • Tra le tue procedure ce ne sono alcune che fanno eseguire delle query all'interno di cicli while/for ?
  • Hai query che realizzano Join fullscan su più tabelle molto voluminose ?

Si il problema non credo sia nel DB perché prima non si è mai presentato. Ma comunque la cosa strana è che dal cpanel non ci sono segnali di sovraccarico. La CPU è sempre bassissima!! Comunque come posso fare in modo da salvare l'immagine creata? Cioè nel file index come salvo l'immagine?

Inviato dal mio Nexus 4 con Tapatalk
 
Si il problema non credo sia nel DB perché prima non si è mai presentato. Ma comunque la cosa strana è che dal cpanel non ci sono segnali di sovraccarico. La CPU è sempre bassissima!! Comunque come posso fare in modo da salvare l'immagine creata? Cioè nel file index come salvo l'immagine?

Inviato dal mio Nexus 4 con Tapatalk

Ho fatto delle prove ed il problema è proprio lo script!

Peccato perchè mi è molto comodo. Il problema è che non so come salvare l'immagine jpg creata. Sai come fare?
 
Prova così

PHP:
<?php 
#> Nome file nel resize, basta solo questo se "play.png" è statica come variabile, altrimenti concatenala a questa
$resizeFilename = 'video.jpg';
$thumbCache = md5($resizeFilename) . '.jpg';

#> Se l'anteprima esiste già la carico
if (file_exists($thumbCache)){
    header('Content-type: image/jpeg');
    echo file_get_contents($thumbCache);
    die();
}

#> Altrimeni la creo
$site_url='http://'.$_SERVER['SERVER_NAME'].implode("/", explode("/", $_SERVER['PHP_SELF'], -1)).'/'; 

$dest = imagecreatefromjpeg($site_url."resize.php"); 
$src = imagecreatefrompng("play.png"); 

imagecopyresampled($dest, $src, 0, 0, 0, 0, 700, 300, 700, 300);  

header('Content-Type: image/jpeg'); 

#> Salva su file
imagejpeg($dest, $thumbCache); 

#> Output al browser
imagejpeg($dest);

imagedestroy($dest); 
imagedestroy($src); 
?>
 
Prova così

PHP:
<?php 
#> Nome file nel resize, basta solo questo se "play.png" è statica come variabile, altrimenti concatenala a questa
$resizeFilename = 'video.jpg';
$thumbCache = md5($resizeFilename) . '.jpg';

#> Se l'anteprima esiste già la carico
if (file_exists($thumbCache)){
    header('Content-type: image/jpeg');
    echo file_get_contents($thumbCache);
    die();
}

#> Altrimeni la creo
$site_url='http://'.$_SERVER['SERVER_NAME'].implode("/", explode("/", $_SERVER['PHP_SELF'], -1)).'/'; 

$dest = imagecreatefromjpeg($site_url."resize.php"); 
$src = imagecreatefrompng("play.png"); 

imagecopyresampled($dest, $src, 0, 0, 0, 0, 700, 300, 700, 300);  

header('Content-Type: image/jpeg'); 

#> Salva su file
imagejpeg($dest, $thumbCache); 

#> Output al browser
imagejpeg($dest);

imagedestroy($dest); 
imagedestroy($src); 
?>

A onor del vero non funziona.

Il codice mi crea un log di questo genere

Codice:
[13-Mar-2014 17:02:20 Europe/Berlin] PHP Warning:  imagejpeg() [<a href='function.imagejpeg'>function.imagejpeg</a>]: Unable to open 'http://youreport.info/video/resized.jpg' for writing: No such file or directory in /home/qjfdlyhb/public_html/video/resize.php on line 22
[13-Mar-2014 17:02:20 Europe/Berlin] PHP Warning:  imagecreatefromjpeg() [<a href='function.imagecreatefromjpeg'>function.imagecreatefromjpeg</a>]: Cannot read image data in /home/qjfdlyhb/public_html/video/crea_anteprima.php on line 16
[13-Mar-2014 17:02:20 Europe/Berlin] PHP Warning:  imagecopyresampled() expects parameter 1 to be resource, boolean given in /home/qjfdlyhb/public_html/video/crea_anteprima.php on line 19
[13-Mar-2014 17:02:20 Europe/Berlin] PHP Warning:  imagejpeg() expects parameter 1 to be resource, boolean given in /home/qjfdlyhb/public_html/video/crea_anteprima.php on line 24
[13-Mar-2014 17:02:20 Europe/Berlin] PHP Warning:  imagejpeg() expects parameter 1 to be resource, boolean given in /home/qjfdlyhb/public_html/video/crea_anteprima.php on line 27
[13-Mar-2014 17:02:20 Europe/Berlin] PHP Warning:  imagedestroy() expects parameter 1 to be resource, boolean given in /home/qjfdlyhb/public_html/video/crea_anteprima.php on line 29

Vorrei adottare una soluzione più spartana arrivati a questo punto:

Poichè ho un pannello admin potrei far così:

1. All'interno del pannello creo un bottone "Crea anteprima immagine"
2. Una volta premuto il bottone questo mi porta su una pagina che dovrebbe:
a. prendere all'interno di una cartella una prima immagine con un nome statico "base.jpg"
b. ridimensionare la "base.jpg" in formato 700x300
c. unire la base.jpg (ridimansionata) con l'immagine "play.png" (che è statica ed ha una trasparenza)
d. salvare l'immagine ultimata in "play.jpg" => dare un messaggio di conferma

Ho provato così ma non va proprio:

PHP:
$site_url='http://'.$_SERVER['SERVER_NAME'].implode("/", explode("/", $_SERVER['PHP_SELF'], -1)).'/';

$filename = 'base.jpg';

############
#  RESIZE  #
############

//nuove dimensioni $attr stampa levecchie
list($width, $height, $type, $attr) = getimagesize($filename);
$newwidth = 700;//$width * $percent;
$newheight = 300;//$height * $percent;

// le carica
$thumb = imagecreatetruecolor($newwidth, $newheight);
$source = imagecreatefromjpeg($filename);

// Le ridimensiona
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

// Output
// l'immagine sarà di 700x300
imagejpeg($thumb, $site_url.'resized.jpg', 100);

############
#  CREATE  #
############

$dest = imagecreatefromjpeg("resized.jpg");
$src = imagecreatefrompng("play.png");

imagecopyresampled($dest, $src, 0, 0, 0, 0, 700, 300, 700, 300); 

imagejpeg($dest, $site_url.'play.jpg', 100);

// Free memory
//imagedestroy($thumb);
//imagedestroy($dest);
imagedestroy($src);

Cosa sbaglio? perchè non mi crea nessun file ma i log mi danno quest'errore:

Codice:
[13-Mar-2014 17:09:55 Europe/Berlin] PHP Warning:  imagejpeg() [<a href='function.imagejpeg'>function.imagejpeg</a>]: Unable to open 'http://youreport.info/video/resized.jpg' for writing: No such file or directory in /home/qjfdlyhb/public_html/video/play.php on line 24
[13-Mar-2014 17:09:55 Europe/Berlin] PHP Warning:  imagecreatefromjpeg(resized.jpg) [<a href='function.imagecreatefromjpeg'>function.imagecreatefromjpeg</a>]: failed to open stream: No such file or directory in /home/qjfdlyhb/public_html/video/play.php on line 30
[13-Mar-2014 17:09:55 Europe/Berlin] PHP Warning:  imagecopyresampled() expects parameter 1 to be resource, boolean given in /home/qjfdlyhb/public_html/video/play.php on line 33
[13-Mar-2014 17:09:55 Europe/Berlin] PHP Warning:  imagejpeg() expects parameter 1 to be resource, boolean given in /home/qjfdlyhb/public_html/video/play.php on line 35
 
Ho risolto così:
PHP:
<?php
$filename = 'video.jpg';

// Content type
header('Content-Type: image/jpeg');

############
#  RESIZE  #
############
// Get new sizes
list($width, $height) = getimagesize($filename);
$newwidth = 700;//$width * $percent;
$newheight = 300;//$height * $percent;

// Load
$thumb = imagecreatetruecolor($newwidth, $newheight);
$source = imagecreatefromjpeg($filename);

// Resize
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

$save = 'resize.jpg';
// Output and free memory
//the resized image will be 400x300
imagejpeg($thumb, $save, 100) ;

imagedestroy($thumb);

############
#  CREATE  #
############

$dest = imagecreatefromjpeg('resize.jpg');
$src = imagecreatefrompng('play.png');

imagecopyresampled($dest, $src, 0, 0, 0, 0, 700, 300, 700, 300); 

$def = 'play.jpg';

imagejpeg($dest, $def, 100) ;

// Free memory
imagedestroy($dest);
imagedestroy($src);
?>
 

Discussioni simili