← Hosting

Problemas surreais com o servidor

Lida 6935 vezes

Offline

Volchok 
Membro
Mensagens 38 Gostos 0
Troféus totais: 16
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Level 3 Level 2 Level 1 10 Posts First Post Karma Avatar

Boa noite,
Venho por este meio falar vos da minha situação que eu acho irrisória. Eu não irei revelar o nome da empresa por não querer aqui manchar o nome de ninguém, contudo vou partilhar a situação!

O meu website o www.nintendopt.com tem tido vários momentos Off line durante os ultimos dias, e isto é muito mau pois o site abriu esta semana e para um projecto entrar de forma respeitadora tem de entrar com tudo e não dar logo um ar de amadorismo, mas isto são princípios básicos que todos sabemos.
Ao contactar a empresa de alojamento pela primeira vez para reportar o problema, a empresa responde-me isto.
Citar
Estimados clientes,

Como tem vindo a ser relatado por diversas agências noticiosas, o Furacão Irene irá passar pela área de New Jersey. Visto os nossos servidores se encontrarem nesta área, é possível que exista algum downtime em certos websites, nomeadamente nos websites do servidor “serverx”.

Apesar disso, todos os servidores foram verificados, assim como os geradores de emergência, para o caso de uma falha eléctrica na região e teremos uma equipa pronta a detectar e reparar qualquer problema que possa surgir.

A equipa do nosso servidor esteve a trabalhar no sentido de não ocorrer nenhum downtime.

Os restantes serviços não deverão ser afectados, visto se encontrarem com os servidores em Portugal e na Alemanha.

Caso tenha alguma questão adicional, não hesite em colocar-nos, através do nosso email.

Atenciosamente

Apesar de ser uma razão algo surreal é possível e eu compreendi perfeitamente. Para resolução de problema a empresa transferiu o meu website para outro servidor deles e ficou ai acordado que o problema estaria resolvido, e de inicio até pareceu pois o site aguentou-se umas horinhas on line.

Passado algumas horas o meu website volta a estar off line e eu volto a reportar e ai vem mais uma resposta um bocado #-o

Citar
Estimado cliente,
 
Lamentamos desde já o sucedido.
 
A sua conta foi mudada do servidor antigo para o nosso servidor CloudLinux. Ao verificarmos o registo da mesma, verificamos que os limites de memoria e processos da sua conta estariam a atingir o máximo, provavelmente devido a um ataque ddos ao seu website, tendo consequências sobre o servidor.
 
Visto termos trocado de servidor e o problema ter-se mantido, colocamos o seu website no servidor de cloudlinux seguro, de forma a ficar limitado quanto a memoria que poderá ocupar (300 MB), para evitar novos ataques.
 
Por enquanto bloqueamos os ataques contra o seu website com a nossa firewall e deverá ter o acesso restaurado novamente.
Igualmente informamos que o IP dos atacantes é oriundo da China, pelo que será uma boa medida bloquear os acessos de IP’s do pais, utilizando o painel CloudFlare. Caso necessite de ajuda nesse ponto, não hesite em contactar-nos.
 
Atenciosamente

Ao que eu respondo e questiono quando é que resolvem o problema? o meu principal objectivo que é ter o meu website on line.
E ao que respondem de forma ainda mais surreal!

Citar
Estimado cliente,
 
Quanto a sua duvida, não se encontra com menos espaço em disco. O que se encontra limitado é a memoria RAM que a sua conta pode utilizar, neste caso 300MB.
Esse limite é suficiente para qualquer CMS, e irá evitar que, caso a sua conta seja novamente atacada, o restante servidor e clientes não sejam afectados.
 
Depois de analisarmos os dados dos servidor antigo, verificamos igualmente que este estava a ser atacado a partir do seu website, dai o downtime que sofreu. Assim que o retiramos do antigo servidor, este voltou a ficar estável, estando agora acontecer neste novo servidor.
 
Como deve entender, um ataque DDos não pode ser previsto, mas tomamos as medidas para o evitar.
Este ataque poderá estar a acontecer visto o nome do seu domínio ser muito semelhante ao da empresa “Nintendo”.
 
Deixamos igualmente uma imagem dos recursos que o seu website tem consumido nas ultimas 4 horas:
http://tinypic.com/r/nyv410/7
Como pode comprovar na imagem, os limites foram atingidos diversas vezes e de forma continuada.
 
Por agora bloqueamos os IP’s de acesso ao seu website que sejam oriundos do pais do ataca (china) e aumentamos a segurança pelo Cloudflare. No entanto, se os ataques persistirem, teremos de bloquear novamente o acesso a mesma. Infelizmente, segundo os nossos termos, não podemos alojar websites que estejam a ser repetidamente atacados, visto por em causa a integridade do serviço para os restantes clientes.
 
Por enquanto iremos manter o seu website no nosso servidor, com as medidas de protecção activadas e sobre uma vigilância constante, mas caso o ataque seja novamente efectuado, para evitarmos danos nos restantes clientes, teremos de suspender a sua conta, pelo que agradecemos  a sua compreensão sobre este caso.
 
Quanto a informação que disponibilizamos acerca do furacão Irene, como é visto nos media sociais, o mesmo criou um acto destrutivo na zona de passagem , no entanto o nosso datacenter manteve-se online com os geradores, não tendo sofrido nenhum downtime.
 
Agradecemos desde já a sua atenção e, como sempre, caso tenha alguma duvida não hesite em colocar.

Quer dizer não estão a conseguir resolver o meu problema onde dão primeiro razões como Furacões e ataques de chineses e agora ainda me dizem que poderão suspender a minha conta, conta essa que engloba horas e horas de trabalho meu e dinheiro gasto!

Eu respondi a este e-mail dizendo que sendo assim quero reaver o meu dinheiro de volta e se não era mesmo possível resolverem o meu problema, pois é o trabalho deles.

 E quanto ao nome do site, existiu e existem milhares de site com nintendo no nome e nunca tiveram problemas por isso, temos vários, este mesmo dominio que utilizo já existiu no passado igualzinho, tinhamos o nintendoportugal, temos o fnintendo, nintendoblast, etc etc.
Offline

GhostMaster 
Membro
Mensagens 1374 Gostos 0
Feedback +10

Troféus totais: 26
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1 1000 Posts

tens tido muitas visitas?

Eu lí e pareceu-me que tinhas cloudflare, mas eu recomendava que fosses tua a gerir o cloudflare e não a empresa de alojamento, o trabalho da empresa de alojamento e verificar que o servidor funcione bem, e defacto o teu websites está a consumir recursos de forma exagerada, vê se não tens plugins/temas desactualizados, etc

Offline

Jóni Oliveira 
Administrador
Mensagens 3427 Gostos 391
Feedback +28

Troféus totais: 35
Trófeus: (Ver todos)
Tenth year Anniversary Nineth year Anniversary Mobile User Apple User Level 6 Windows User Super Combination Combination Topic Starter 10 Poll Votes

...E verifica as politicas de utilização aceitável e os termos de serviço da empresa, antes de fazeres um pedido de reembolso.
Offline

GhostMaster 
Membro
Mensagens 1374 Gostos 0
Feedback +10

Troféus totais: 26
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1 1000 Posts

Outra coisa é tens um projecto virado para publico nacional, não devias ter apostado em alojamento em US, principalmente pelo PING, se quiseres apostar em internacional aposta em UK, tanto ficam os portugueses com bons acessos como o resto do mundo.  Cumps
Offline

Volchok 
Membro
Mensagens 38 Gostos 0
Troféus totais: 16
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Level 3 Level 2 Level 1 10 Posts First Post Karma Avatar

Obrigado pelas dicas. No meio disto se calhar até estou a ter um pensamento errado, mas eu apenas só queria que o meu site corre-se normal.
 Já enviei um e-mail à empresa com algumas dicas que recebi deste tópico.
Offline

asturmas 
Administrador
Mensagens 19734 Gostos 49
Feedback +2

Troféus totais: 39
Trófeus: (Ver todos)
Mobile User Windows User Super Combination Combination Topic Starter 100 Poll Votes 50 Poll Votes 10 Poll Votes Poll Voter Poll Starter

Tens aqui varias situações que eu não vou comentar por motivos obvios...
No entanto uma pequena achega: Estando ou não a seres atacado não poderás consumir todos os recursos de um servidor pois pelo que percebi contrataste um serviço de alojamento partilhado. Assim, o que o CloudLinux esta a fazer é te limitar os recursos de forma a não prejudicares outros utilizadores do mesmo servidor e essa situação estará certamente nos termos de utilização da empresa de alojamento.

Como estas a utilizar Wordpress recomendo ainda que instales um plugin de cache (ex W3 Total Cache) para te reduzir a carga de mysql e aumentar a velocidade de load da pagina.
Offline

GhostMaster 
Membro
Mensagens 1374 Gostos 0
Feedback +10

Troféus totais: 26
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1 1000 Posts

Obrigado pelas dicas. No meio disto se calhar até estou a ter um pensamento errado, mas eu apenas só queria que o meu site corre-se normal.
 Já enviei um e-mail à empresa com algumas dicas que recebi deste tópico.

Sim não referi mas parto do principio que já usas um plugin de cache como o caso do W3 Total Cache.

Quanto ao cloudlinux 300mb nem é muito e 10 processos em CPU :-?... mas mesmo assim ou tens muitas visitas ou tas mesmo a ser atacado.
Offline

Volchok 
Membro
Mensagens 38 Gostos 0
Troféus totais: 16
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Level 3 Level 2 Level 1 10 Posts First Post Karma Avatar

Já instalei o tal plugin, obrigado mais uma vez. A empresa obviamente que também não tem culpa de o meu site ter sido atacado.
 Eu abri esta thread para poder partilhar este tema com vocês que são pessoas que são mais experientes do que eu e assim saber que tipo de atitude iria adoptar face a este problema.

 Ao que fui informado agora os recursos estão totalmente estáveis, aumentaram por causa do ataque.

Offline

Rodrigues 
Membro
Mensagens 1786 Gostos 1
Feedback +5

Troféus totais: 26
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Não é culpa da empresa de estares a ser atacado, nenhuma empresa no mundo consegue evitar estas coisas a 100%, e mesmo as que oferecem protecção pagas a peso de ouro.

Quem sai mais prejudicado nisto tudo ainda é a empresa, pois o ataque ao teu site deve ter metido outros clientes deles em baixo... Se isto se voltar a repetir não duvides que ainda são eles que te cancelam o serviços, ataques DDoS não são brincadeira, sei por experiência própria.
Offline

Volchok 
Membro
Mensagens 38 Gostos 0
Troféus totais: 16
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Level 3 Level 2 Level 1 10 Posts First Post Karma Avatar

Olá Rodrigues, imagino também o lado de quem tenha uma empresa de alojamento. Provavelmente foi uma dor de cabeça tremenda.
Offline

Volchok 
Membro
Mensagens 38 Gostos 0
Troféus totais: 16
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Level 3 Level 2 Level 1 10 Posts First Post Karma Avatar

Parece que hoje voltou a subir os recursos, segundo o e-mail da empresa de alojamento!

Citar
Estimado cliente,
Durante a manha de hoje, entre o período das 7H00 e as 8H40, verificamos que, novamente, os seus recursos estão a ser utilizados no máximo. Desta vez não devido a um ataque externo, mas possivelmente a algum código defeituoso. Os ataques realizados durante o dia de ontem com o seu website, tanto no antigo servidor em que se encontrava como neste novo, também poderão ter sido originados por um plungin defeituoso ou com código malicioso que tenha aberto uma falha de segurança na sua instalação.
Como pode ver a partir do seu cPanel, na opção "Resourses usage", atingiu diversas vezes o limite dos 300MB de RAM e do processador dedicado para a sua conta. Por enquanto, não bloqueamos a sua conta, mas se o padrão continuar, para permitir que os restantes clientes não tenham problemas com os seus serviços, seremos obrigado a suspender a sua conta até o problema ficar resolvido.
Recomendamos que verifique as suas instalações e scripts, de forma a identificar alguns script ou código defeituoso e que esteja a causar problemas nos recursos.
Siga alguns passos para esta verificação:
- Caso tenha uma instalação ou script que permita plungins, desactive-os e verifique o uso dos recursos passadas 2-3 horas.
- Se tiver adicionado algum novo script ou plungin recentemente, desactive-o.
- Se tiver múltiplas instalações de scripts, como, por exemplo, um forum/blog na mesma conta, verifique se não existe nenhuma incompatibilidade ou erros na configuração entre eles.
Se tiver alguma questão não hesite em colocar.

Eu tenho uma bridge entre o meu SMF e o Wordpress. Será que é desse plugin?
Offline

Carlos Gandra 
Administrador
Mensagens 3081 Gostos 97
Feedback +1

Troféus totais: 34
Trófeus: (Ver todos)
Level 6 Super Combination Combination Topic Starter 50 Poll Votes 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4

Podes colocar aqui a lista de plugins que tens activos?

Em relação ao W3 Total Cache, pelo que vi no código fonte não tens isso bem configurado portanto e uma vez que estás em alojamento partilhado, experimenta o seguinte:

Performance - General Settings
Page Cache - Enable
Page Cache Method - Disk enhanced
Minify - Enable
Minify mode: Auto (se o site ficar com aparência desfigurada, passa para Manual, mais em baixo deixo detalhes)
Minify Cache Method: Disk
Database Cache: Disabled
Object Cache: Disabled
Browser Cache: Disabled

Page Cache
Selecciona todas as 5 opções em General

Minify (se tiveres escolhido modo Manual)
1. Vê o código fonte da tua página e copia os endereços de todos os ficheiros .css e .js que encontrares, menos o da barra de admin do Wordpress e os exclusivos do IE, se existirem.
2. Em HTML & XML selecciona as 3 primeiras opções e deixa em branco as 2 últimas
3. Em Javascript activa a primeira opção, clica em Add a Script e adiciona, um por linha, os ficheiros .js que recolheste
4. Em Cascading Style Sheets faz o mesmo, agora com os .css

Por fim acrescenta o seguinte ao teu .htaccess (sabes o que é?)
Código: [Seleccione]
# Proteger htaccess
<Files .htaccess>
Order Allow,Deny
Deny from all
</Files>

# Proteger wp-config
<Files wp-config.php>
Order Allow,Deny
Deny from all
</Files>

# Impedir browsing nos directórios
Options All -Indexes

# Compressão e Cache
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/css text/javascript application/x-javascript text/html text/plain text/xml image/x-icon
<IfModule mod_setenvif.c>
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
</IfModule>
<IfModule mod_headers.c>
Header append Vary User-Agent env=!dont-vary
Header append Vary Accept-Encoding
</IfModule>
</IfModule>
<IfModule mod_headers.c>
Header unset Pragma
Header unset ETag
# 1 ano = 31536000 seg
Header set Cache-Control "max-age=31536000, public, must-revalidate"
</IfModule>

# ETags
FileETag none

# mod_expires
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault A31536000
ExpiresByType text/html M3600
ExpiresByType text/css M3628800
ExpiresByType text/javascript M3628800
ExpiresByType application/x-javascript M3628800
ExpiresByType image/gif M3628800
ExpiresByType image/png M3628800
ExpiresByType image/jpg M3628800
ExpiresByType image/jpeg M3628800
ExpiresByType image/x-icon M3628800
</IfModule>
<FilesMatch "\.(php)$">
<IfModule mod_expires.c>
ExpiresActive Off
</IfModule>
<IfModule mod_headers.c>
Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform"
</IfModule>
</FilesMatch>
# Compressão e Cache

Depois de gravares tudo faz logout do painel de admin do WP e testa o site em 3 ou 4 browsers. Se estiver tudo ok, verifica se isso te ajuda a manter dentro dos limites impostos pelo teu servidor.

Contudo, esses limites que tens não vão ser suficientes quando o site crescer e tiver uma frequência de visitantes diária muito maior, independentemente de quão optimizado estiver.

--

No SMF também podes activar cache (recomendado nível 1), se o servidor tiver algum instalado (aparece essa informação no painel de admin).
Offline

Volchok 
Membro
Mensagens 38 Gostos 0
Troféus totais: 16
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Level 3 Level 2 Level 1 10 Posts First Post Karma Avatar

Olá Carlos Gandra, muito obrigado pelo teu post. Fiz tudo o que ai em cima mencionaste. E não foi preciso de por o Minify manual :)


Vou por aqui os plugins que tenho activos!
Portal (WORDPRESS)
  • BNS SMF Feeds
  • Category Icons
  • Contact Form 7
  • Get The Image
  • Page Links To
  • Smart Youtube
  • Video Sidebar Widgets
  • W3 Total Cache

Fórum (SMF)
  • BlogBridger (que desactivei hoje de manhã para ver se resolvia este problema)
  • RSS Feed Icon
  • ENotify
  • Board Viewers Mod
  • YouTube BBCode
  • nCode Image Resizer
  • SMFPacks Shoutbox
  • Good Post/Bad Post Mod
  • Simple Spoiler
Offline

GhostMaster 
Membro
Mensagens 1374 Gostos 0
Feedback +10

Troféus totais: 26
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1 1000 Posts

Plugins já bastante desactualizados:

Ex: Category Icons - Last Updated: 2009-8-11
Offline

Volchok 
Membro
Mensagens 38 Gostos 0
Troféus totais: 16
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Level 3 Level 2 Level 1 10 Posts First Post Karma Avatar

Ao que parece tenho um ficheiro que está a gerar erros e que o problema pode vir dai, só que esse ficheiro é bastante util pois é ele que faz os thumbnails ao meu portal. Segundo o email da empresa:
Citar
Estimado cliente,
 
Como uma edição ao nosso ultimo email, igualmente informamos que o erro poderá estar a acontecer com o plugin em “/public_html/wp-content/themes/telegraph/scripts/timthumb.php”.
Este ficheiro tem gerado diversas mensagens de erro no seu registo do cPanel e poderá também ser o causador do consumo dos recursos.
 
Recomendamos que desactive igualmente o mesmo e as possíveis ligações a este.
 
Atenciosamente

E agora vou ter de rever o ficheiro pois ele é muito importante para o meu WP, o ficheiro é este.
Código: [Seleccione]
<?php
/**
 * TimThumb script created by Ben Gillbanks, originally created by Tim McDaniels and Darren Hoyt
 * http://code.google.com/p/timthumb/
 * 
 * GNU General Public License, version 2
 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 *
 * Examples and documentation available on the project homepage
 * http://www.binarymoon.co.uk/projects/timthumb/
 */

define ('CACHE_SIZE'250); // number of files to store before clearing cache
define ('CACHE_CLEAR'5); // maximum number of files to delete on each cache clear
define ('CACHE_USE'TRUE); // use the cache files? (mostly for testing)
define ('VERSION''1.19'); // version number (to force a cache refresh)
define ('DIRECTORY_CACHE''./cache'); // cache directory
define ('MAX_WIDTH'1000); // maximum image width
define ('MAX_HEIGHT'1000); // maximum image height
define ('ALLOW_EXTERNAL'FALSE); // allow external website (override security precaution)

// external domains that are allowed to be displayed on your website
$allowedSites = array (
'flickr.com',
'picasa.com',
'blogger.com',
'wordpress.com',
'img.youtube.com',
);

// STOP MODIFYING HERE!
// --------------------

// sort out image source
$src get_request ('src''');
if (
$src == '' || strlen ($src) <= 3) {
    
display_error ('no image specified');
}

// clean params before use
$src clean_source ($src);

// get mime type of src
$mime_type mime_type ($src);

// check to see if this image is in the cache already
// if already cached then display the image and die
check_cache ($mime_type);

// cache doesn't exist and then process everything
// check to see if GD function exist
if (!function_exists ('imagecreatetruecolor')) {
    
display_error ('GD Library Error: imagecreatetruecolor does not exist - please contact your webhost and ask them to install the GD library');
}

if (
function_exists ('imagefilter') && defined ('IMG_FILTER_NEGATE')) {
$imageFilters = array (
=> array (IMG_FILTER_NEGATE0),
=> array (IMG_FILTER_GRAYSCALE0),
=> array (IMG_FILTER_BRIGHTNESS1),
=> array (IMG_FILTER_CONTRAST1),
=> array (IMG_FILTER_COLORIZE4),
=> array (IMG_FILTER_EDGEDETECT0),
=> array (IMG_FILTER_EMBOSS0),
=> array (IMG_FILTER_GAUSSIAN_BLUR0),
=> array (IMG_FILTER_SELECTIVE_BLUR0),
10 => array (IMG_FILTER_MEAN_REMOVAL0),
11 => array (IMG_FILTER_SMOOTH0),
);
}

// get standard input properties
$new_width =  (int) abs (get_request ('w'0));
$new_height = (int) abs (get_request ('h'0));
$zoom_crop = (int) get_request ('zc'1);
$quality = (int) abs (get_request ('q'90));
$align get_request ('a''c');
$filters get_request ('f''');
$sharpen = (bool) get_request ('s'0);

// set default width and height if neither are set already
if ($new_width == && $new_height == 0) {
    
$new_width 100;
    
$new_height 100;
}

// ensure size limits can not be abused
$new_width min ($new_widthMAX_WIDTH);
$new_height min ($new_heightMAX_HEIGHT);

// set memory limit to be able to have enough space to resize larger images
ini_set ('memory_limit''50M');

if (
file_exists ($src)) {

    
// open the existing image
    
$image open_image ($mime_type$src);
    if (
$image === false) {
        
display_error ('Unable to open image : ' $src);
    }

    
// Get original width and height
    
$width imagesx ($image);
    
$height imagesy ($image);

    
// generate new w/h if not provided
    
if ($new_width && !$new_height) {

        
$new_height floor ($height * ($new_width $width));

    } else if (
$new_height && !$new_width) {

        
$new_width floor ($width * ($new_height $height));

    }

// create a new true color image
$canvas imagecreatetruecolor ($new_width$new_height);
imagealphablending ($canvasfalse);

// Create a new transparent color for image
$color imagecolorallocatealpha ($canvas000127);

// Completely fill the background of the new image with allocated color.
imagefill ($canvas00$color);

// Restore transparency blending
imagesavealpha ($canvastrue);

if ($zoom_crop) {

$src_x $src_y 0;
$src_w $width;
$src_h $height;

$cmp_x $width $new_width;
$cmp_y $height $new_height;

// calculate x or y coordinate and width or height of source
if ($cmp_x $cmp_y) {

$src_w round (($width $cmp_x $cmp_y));
$src_x round (($width - ($width $cmp_x $cmp_y)) / 2);

} else if ($cmp_y $cmp_x) {

$src_h round (($height $cmp_y $cmp_x));
$src_y round (($height - ($height $cmp_y $cmp_x)) / 2);

}

// positional cropping!
switch ($align) {
case 't':
case 'tl':
case 'lr':
case 'tr':
case 'rt':
$src_y 0;
break;

case 'b':
case 'bl':
case 'lb':
case 'br':
case 'rb':
$src_y $height $src_h;
break;

case 'l':
case 'tl':
case 'lt':
case 'bl':
case 'lb':
$src_x 0;
break;

case 'r':
case 'tr':
case 'rt':
case 'br':
case 'rb':
$src_x $width $new_width;
$src_x $width $src_w;
break;

default:
break;
}

imagecopyresampled ($canvas$image00$src_x$src_y$new_width$new_height$src_w$src_h);

    } else {

        
// copy and resize part of an image with resampling
        
imagecopyresampled ($canvas$image0000$new_width$new_height$width$height);

    }

    if (
$filters != '' && function_exists ('imagefilter') && defined ('IMG_FILTER_NEGATE')) {
        
// apply filters to image
        
$filterList explode ('|'$filters);
        foreach (
$filterList as $fl) {

            
$filterSettings explode (','$fl);
            if (isset (
$imageFilters[$filterSettings[0]])) {

                for (
$i 0$i 4$i ++) {
                    if (!isset (
$filterSettings[$i])) {
$filterSettings[$i] = null;
                    } else {
$filterSettings[$i] = (int) $filterSettings[$i];
}
                }

                switch (
$imageFilters[$filterSettings[0]][1]) {

                    case 
1:

                        
imagefilter ($canvas$imageFilters[$filterSettings[0]][0], $filterSettings[1]);
                        break;

                    case 
2:

                        
imagefilter ($canvas$imageFilters[$filterSettings[0]][0], $filterSettings[1], $filterSettings[2]);
                        break;

                    case 
3:

                        
imagefilter ($canvas$imageFilters[$filterSettings[0]][0], $filterSettings[1], $filterSettings[2], $filterSettings[3]);
                        break;

                    case 
4:

                        
imagefilter ($canvas$imageFilters[$filterSettings[0]][0], $filterSettings[1], $filterSettings[2], $filterSettings[3], $filterSettings[4]);
                        break;

                    default:

                        
imagefilter ($canvas$imageFilters[$filterSettings[0]][0]);
                        break;

                }
            }
        }
    }

// sharpen image
if ($sharpen && function_exists ('imageconvolution')) {

$sharpenMatrix = array (
array (-1,-1,-1),
array (-1,16,-1),
array (-1,-1,-1),
);

$divisor 8;
$offset 0;

imageconvolution ($canvas$sharpenMatrix$divisor$offset);

}

    
// output image to browser based on mime type
    
show_image ($mime_type$canvas);

    
// remove image from memory
    
imagedestroy ($canvas);

// if not in cache then clear some space and generate a new file
clean_cache ();

die ();

} else {

    if (
strlen ($src)) {
        
display_error ('image ' $src ' not found');
    } else {
        
display_error ('no source specified');
    }

}


/**
 *
 * @global <type> $quality
 * @param <type> $mime_type
 * @param <type> $image_resized 
 */
function show_image ($mime_type$image_resized) {

    global 
$quality;

    
// check to see if we can write to the cache directory
    
$cache_file get_cache_file ($mime_type);

if (stristr ($mime_type'jpeg')) {
imagejpeg ($image_resized$cache_file$quality);
} else {
imagepng ($image_resized$cache_filefloor ($quality 0.09));
}

show_cache_file ($mime_type);

}


/**
 *
 * @param <type> $property
 * @param <type> $default
 * @return <type> 
 */
function get_request ($property$default 0) {

    if (isset (
$_GET[$property])) {

        return 
$_GET[$property];

    } else {

        return 
$default;

    }

}


/**
 *
 * @param <type> $mime_type
 * @param <type> $src
 * @return <type>
 */
function open_image ($mime_type$src) {

$mime_type strtolower ($mime_type);

if (stristr ($mime_type'gif')) {

        
$image imagecreatefromgif ($src);

    } elseif (
stristr ($mime_type'jpeg')) {

        
$image imagecreatefromjpeg ($src);

    } elseif (
stristr ($mime_type'png')) {

        
$image imagecreatefrompng ($src);

    }

    return 
$image;

}

/**
 * clean out old files from the cache
 * you can change the number of files to store and to delete per loop in the defines at the top of the code
 *
 * @return <type>
 */
function clean_cache () {

// add an escape
// Reduces the amount of cache clearing to save some processor speed
if (rand (1100) > 10) {
return true;
}

flush ();

    
$files glob (DIRECTORY_CACHE '/*'GLOB_BRACE);

if (count ($files) > CACHE_SIZE) {

        
$yesterday time () - (24 60 60);

        
usort ($files'filemtime_compare');
        
$i 0;

foreach ($files as $file) {

$i ++;

if ($i >= CACHE_CLEAR) {
return;
}

if (@filemtime ($file) > $yesterday) {
return;
}

if (file_exists ($file)) {
unlink ($file);
}

}

    }

}


/**
 * compare the file time of two files
 *
 * @param <type> $a
 * @param <type> $b
 * @return <type>
 */
function filemtime_compare ($a$b) {

$break explode ('/'$_SERVER['SCRIPT_FILENAME']);
$filename $break[count ($break) - 1];
$filepath str_replace ($filename''$_SERVER['SCRIPT_FILENAME']);

$file_a realpath ($filepath $a);
$file_b realpath ($filepath $b);

    return 
filemtime ($file_a) - filemtime ($file_b);

}


/**
 * determine the file mime type
 *
 * @param <type> $file
 * @return <type>
 */
function mime_type ($file) {

$file_infos getimagesize ($file);
$mime_type $file_infos['mime'];

    
// use mime_type to determine mime type
    
if (!preg_match ("/jpg|jpeg|gif|png/i"$mime_type)) {
display_error ('Invalid src mime type: ' $mime_type);
    }

    return 
$mime_type;

}


/**
 *
 * @param <type> $mime_type
 */
function check_cache ($mime_type) {

if (CACHE_USE) {

if (!show_cache_file ($mime_type)) {
// make sure cache dir exists
if (!file_exists (DIRECTORY_CACHE)) {
// give 777 permissions so that developer can overwrite
// files created by web server user
mkdir (DIRECTORY_CACHE);
chmod (DIRECTORY_CACHE0777);
}
}

}

}


/**
 *
 * @param <type> $mime_type
 * @return <type> 
 */
function show_cache_file ($mime_type) {

// use browser cache if available to speed up page load
if (isset ($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
if (strtotime ($_SERVER['HTTP_IF_MODIFIED_SINCE']) < strtotime('now')) {
header ('HTTP/1.1 304 Not Modified');
die ();
}
}

$cache_file get_cache_file ($mime_type);

if (file_exists ($cache_file)) {

// change the modified headers
$gmdate_expires gmdate ('D, d M Y H:i:s'strtotime ('now +10 days')) . ' GMT';
$gmdate_modified gmdate ('D, d M Y H:i:s') . ' GMT';

// send content headers then display image
header ('Content-Type: ' $mime_type);
header ('Accept-Ranges: bytes');
header ('Last-Modified: ' $gmdate_modified);
header ('Content-Length: ' filesize ($cache_file));
header ('Cache-Control: max-age=864000, must-revalidate');
header ('Expires: ' $gmdate_expires);

if (!@readfile ($cache_file)) {
$content file_get_contents ($cache_file);
if ($content != FALSE) {
echo $content;
} else {
display_error ('cache file could not be loaded');
}
}

die ();

    }

return FALSE;

}


/**
 *
 * @staticvar string $cache_file
 * @param <type> $mime_type
 * @return string
 */
function get_cache_file ($mime_type) {

    static 
$cache_file;
global $src;

$file_type '.png';

if (stristr ($mime_type'jpeg')) {
$file_type '.jpg';
    }

    if (!
$cache_file) {
// filemtime is used to make sure updated files get recached
        
$cache_file DIRECTORY_CACHE '/' md5 ($_SERVER ['QUERY_STRING'] . VERSION filemtime ($src)) . $file_type;
    }

    return 
$cache_file;

}


/**
 *
 * @global array $allowedSites
 * @param string $src
 * @return string
 */
function check_external ($src) {

global $allowedSites;

    if (
stristr ($src'http://') !== false) {

        
$url_info parse_url ($src);

// convert youtube video urls
// need to tidy up the code

if ($url_info['host'] == 'www.youtube.com' || $url_info['host'] == 'youtube.com') {
parse_str ($url_info['query']);

if (isset ($v)) {
$src 'http://img.youtube.com/vi/' $v '/0.jpg';
$url_info['host'] = 'img.youtube.com';
}
}

// check allowed sites (if required)
if (ALLOW_EXTERNAL) {

$isAllowedSite true;

} else {

$isAllowedSite false;
foreach ($allowedSites as $site) {
//$site = '/' . addslashes ($site) . '/';
if (stristr($url_info['host'], $site) !== false) {
$isAllowedSite true;
}
}

}

// if allowed
if ($isAllowedSite) {

$fileDetails pathinfo ($src);
$ext strtolower ($fileDetails['extension']);

$filename md5 ($src);
$local_filepath DIRECTORY_CACHE '/' $filename '.' $ext;

if (!file_exists ($local_filepath)) {

if (function_exists ('curl_init')) {

$fh fopen ($local_filepath'w');
$ch curl_init ($src);

curl_setopt ($chCURLOPT_TIMEOUT15);
curl_setopt ($chCURLOPT_USERAGENT"Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1");
curl_setopt ($chCURLOPT_URL$src);
curl_setopt ($chCURLOPT_RETURNTRANSFERTRUE);
curl_setopt ($chCURLOPT_HEADER0);
curl_setopt ($chCURLOPT_SSL_VERIFYPEERFALSE);
curl_setopt ($chCURLOPT_USERAGENT'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20041107 Firefox/1.0');
curl_setopt ($chCURLOPT_FILE$fh);

if (curl_exec ($ch) === FALSE) {
if (file_exists ($local_filepath)) {
unlink ($local_filepath);
}
display_error ('error reading file ' $src ' from remote host: ' curl_error($ch));
}

curl_close ($ch);
fclose ($fh);

                } else {

if (!$img file_get_contents($src)) {
display_error ('remote file for ' $src ' can not be accessed. It is likely that the file permissions are restricted');
}

if (file_put_contents ($local_filepath$img) == FALSE) {
display_error ('error writing temporary file');
}

}

if (!file_exists ($local_filepath)) {
display_error ('local file for ' $src ' can not be created');
}

}

$src $local_filepath;

} else {

display_error ('remote host "' $url_info['host'] . '" not allowed');

}

    }

    return 
$src;

}


/**
 * tidy up the image source url
 *
 * @param <type> $src
 * @return string
 */
function clean_source ($src) {

$host str_replace ('www.'''$_SERVER['HTTP_HOST']);
$regex "/^((ht|f)tp(s|):\/\/)(www\.|)" $host "/i";

$src preg_replace ($regex''$src);
$src strip_tags ($src);
$src str_replace (' ''%20'$src);
    
$src check_external ($src);

    
// remove slash from start of string
    
if (strpos ($src'/') === 0) {
        
$src substr ($src, -(strlen ($src) - 1));
    }

    
// don't allow users the ability to use '../'
    // in order to gain access to files below document root
    
$src preg_replace ("/\.\.+\//"""$src);

    
// get path to image on file system
    
$src get_document_root ($src) . '/' $src;

    return 
$src;

}


/**
 *
 * @param <type> $src
 * @return string
 */
function get_document_root ($src) {

    
// check for unix servers
    
if (file_exists ($_SERVER['DOCUMENT_ROOT'] . '/' $src)) {
        return 
$_SERVER['DOCUMENT_ROOT'];
    }

    
// check from script filename (to get all directories to timthumb location)
    
$parts array_diff (explode ('/'$_SERVER['SCRIPT_FILENAME']), explode ('/'$_SERVER['DOCUMENT_ROOT']));
    
$path $_SERVER['DOCUMENT_ROOT'];
    foreach (
$parts as $part) {
        
$path .= '/' $part;
        if (
file_exists ($path '/' $src)) {
            return 
$path;
        }
    }

    
// the relative paths below are useful if timthumb is moved outside of document root
    // specifically if installed in wordpress themes like mimbo pro:
    // /wp-content/themes/mimbopro/scripts/timthumb.php
    
$paths = array (
        
"./",
        
"../",
        
"../../",
        
"../../../",
        
"../../../../",
        
"../../../../../"
    
);

    foreach (
$paths as $path) {
        if (
file_exists ($path $src)) {
            return 
$path;
        }
    }

    
// special check for microsoft servers
    
if (!isset ($_SERVER['DOCUMENT_ROOT'])) {
        
$path str_replace ("/""\\"$_SERVER['ORIG_PATH_INFO']);
        
$path str_replace ($path''$_SERVER['SCRIPT_FILENAME']);

        if (
file_exists ($path '/' $src)) {
            return 
$path;
        }
    }

    
display_error ('file not found ' $srcENT_QUOTES);

}


/**
 * generic error message
 *
 * @param <type> $errorString
 */
function display_error ($errorString '') {

    
header ('HTTP/1.1 400 Bad Request');
echo '<pre>' htmlentities ($errorString);
echo '<br />Query String : ' htmlentities ($_SERVER['QUERY_STRING']);
echo '<br />TimThumb version : ' VERSION '</pre>';
    die ();

}
?>