Parece que o PHP getimagesize () está causando alguns problemas no apache em https. O que acontece é que quando eu chamo isso de https, há um atraso igual à configuração de tempo limite no arquivo conf do apache antes que a página seja carregada. Por exemplo, se eu definir o valor de tempo limite do apache para 12 segundos, a chamada será interrompida por 12 segundos antes de ser executada. Se eu acessar o mesmo script sobre http, tudo funciona bem. Eu escrevi um pouco de código de depuração abaixo:
<?php
echo "The start time is " . date("h:i:sa");
echo "<br>";
$img_url = url()."/assets/img/logo/45.jpg";
print $img_url;
echo "<br>";
echo "The time before getimagesize() is " . date("h:i:sa");
echo "<br>";
$img_dimen = getimagesize($img_url);
print_r($img_dimen);
echo "<br>";
echo "The time after getimagesize() is " . date("h:i:sa");
echo "<br>";
function url(){
return sprintf(
"%s://%s%s",
isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http',
$_SERVER['SERVER_NAME'],
dirname($_SERVER['REQUEST_URI'])
);
}
?>
A saída em https é:
The start time is 07:02:17pm
https://myserver.mydomain.com/assets/img/logo/45.jpg
The time before getimagesize() is 07:02:17pm
Array ( [0] => 226 [1] => 78 [2] => 2 [3] => width="226" height="78" [bits] => 8 [channels] => 3 [mime] => image/jpeg )
The time after getimagesize() is 07:02:30pm
Como pode ser visto, leva 13 segundos para completar a chamada getimagesize ().
A saída por http é:
The start time is 07:05:30pm
https://myserver.mydomain.com/assets/img/logo/45.jpg
The time before getimagesize() is 07:05:30pm
Array ( [0] => 226 [1] => 78 [2] => 2 [3] => width="226" height="78" [bits] => 8 [channels] => 3 [mime] => image/jpeg )
The time after getimagesize() is 07:05:30pm
O tempo limite no apache.conf é definido como 12. Se eu alterar esse valor de tempo limite, o tempo gasto em https será alterado de acordo. O tamanho da imagem é de apenas 32 KB.
Meu vhost se parece com:
<VirtualHost *:443>
ServerName myserver.mydomain.com
ServerAlias myserver.mydomain.com
DirectoryIndex index.php
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /root/apache-keys/mycert.crt
SSLCertificateKeyFile /root/apache-keys/mykey.key
SSLCertificateChainFile /root/apache-keys/mybundle.crt
<Directory "/var/www/html">
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
O arquivo vhost conf contém uma seção para *: 80 com os mesmos detalhes do acima. Existem outros sites (diferentes vhosts para diferentes subdomínios) hospedados neste servidor. O vhost para cada um segue o mesmo padrão que este (*: 443, *: 80) e todos eles estão em arquivos .conf diferentes. A maioria deles possui certificados autoassinados, enquanto um deles compartilha o certificado com este site (o certificado é um certificado curinga). Mudar o certificado para um auto-assinado também não ajudou. Nem desativou o outro site que compartilha o mesmo certificado.
O error.log mostra o abaixo para alguns dos outros sites:
[Wed Jan 03 08:07:03.067875 2018] [ssl:warn] [pid 1328] AH01909: RSA certificate configured for othersite1.mydomain.com:443 does NOT include an ID which matches the server name
[Wed Jan 03 08:07:03.068056 2018] [ssl:warn] [pid 1328] AH01909: RSA certificate configured for othersite2.mydomain.com:443 does NOT include an ID which matches the server name
Além do acima, não há outros erros no error.log.
Eu verifiquei o site em ssllabs.com e não há problemas com os certificados.
A saída do apache2ctl -S mostra que este site é o servidor padrão para a porta 80 e a porta 443. Eu tentei desabilitar todos os outros sites e isso ocorre.
Mais alguns detalhes: A versão do Apache é 2.4.7. Versão do PHP é 5.6.30 OS é o Ubuntu 14.04
Qualquer ajuda é muito apreciada. Por favor, deixe-me saber se alguma informação adicional é necessária. Eu realmente gostaria de saber por que getimagesize causa um tempo limite do apache antes de retornar os dados por https.
Tags php https apache-2.4