PHP getimagesize 通过 https 导致 Apache 超时。在 http 上工作正常

PHP getimagesize 通过 https 导致 Apache 超时。在 http 上工作正常

看起来 PHP getimagesize() 在 https 上的 apache 上造成了一些问题。当我通过 https 调用此函数时,在页面加载之前,会有与 apache conf 文件中的超时设置相等的延迟。例如,如果我将 apache 超时值设置为 12 秒,则调用会挂起 12 秒后才能执行。如果我通过 http 访问相同的脚本,则一切正常。我在下面编写了一些调试代码:

<?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'])
);
}
?>

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

可以看出,完成 getimagesize() 调用需要 13 秒。

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

apache.conf 中的超时设置为 12。如果我更改此超时值,则通过 https 所花费的时间也会相应更改。图像的大小只有 32KB。

我的虚拟主机如下所示:

<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>

vhost conf 文件包含一个 *:80 部分,其详细信息与上述内容相同。此服务器上还托管其他站点(不同子域的不同 vhost)。每个站点的 vhost 都遵循与此站点相同的模式(*:443、*:80),并且它们都位于不同的 .conf 文件中。它们中的大多数都有自签名证书,而其中一个与此站点共享证书(该证书是通配符证书)。将证书更改为自签名证书也无济于事。禁用共享相同证书的其他站点也无济于事。

error.log 显示了一些其他站点的以下内容:

[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

除上述错误外,error.log中没有其他错误。

我已经检查了 ssllabs.com 上的网站,证书没有问题。

apache2ctl -S 的输出显示该站点是端口 80 和端口 443 的默认服务器。我尝试禁用所有其他站点,但仍然出现这种情况。

更多详细信息:Apache 版本为 2.4.7。PHP 版本为 5.6.30 操作系统为 Ubuntu 14.04

任何帮助都非常感谢。如果需要任何其他信息,请告诉我。我真的很想弄清楚为什么 getimagesize 在通过 https 返回数据之前会导致 apache 超时。

相关内容