看起来 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 超时。