我正在尝试使用带有URL的getimagesize和http一切都很好。但是,当尝试在https url上使用函数时,我收到“读取错误”通知,结果为false。我查了一下,我在服务器上安装了OpenSSL 0.98(因此它也应该与https一起使用)。 我知道我可以先下载图像,然后再使用它,但在我看来,这应该可行,而且我错过了一些东西。你能不能给我一些解决方案(除了首先下载图像然后打开它)?
提前谢谢。
答案 0 :(得分:2)
您可以使用file_get_contents()
作为替代解决方案..
<?php
$filename='something';
file_put_contents($filename,file_get_contents($url));
$size = getimagesize($filename);
var_dump($size);
答案 1 :(得分:1)
当您不更改任何 SSL 设置时,使用 file_get_contents()
只会转移问题而不是解决问题。但是您可以通过 stream_context_create
实现这一点,然后摆弄 SSL settings。完成此操作后,您还可以传递 SSL 想要保护您免受的威胁。
<?php
error_reporting( E_ALL );
header( 'Content-type: text/plain' );
// The remote file to check
$sPic= 'https://picture.to/check/for/details.png';
// Does it work right away?
$aInfo= @getimagesize( $sPic );
if( $aInfo=== FALSE ) {
// No. Then a temporary file needs to be created.
if( $sTmp= tempnam( sys_get_temp_dir(), 'sig' ) ) {
// Tweaking the HTTPS options to weaken/ignore security
$hCtx= stream_context_create
( array
( 'ssl'=> array
( 'verify_peer'=> FALSE // Certificate verification
, 'verify_peer_name'=> FALSE
, 'allow_self_signed'=> TRUE
, 'SNI_enabled'=> TRUE // Multiple certificates on same IP address
)
)
);
// Download file
$sPayload= file_get_contents( $sPic, FALSE, $hCtx );
if( $sPayload!== false ) {
// Success: write to temporary file
if( file_put_contents( $sTmp, $sPayload ) ) {
$aInfo= @getimagesize( $sTmp );
} else die( 'Could not write to tempfile!' );
} else die( 'Could not download file!' );
// Delete temporary file
unlink( $sTmp );
} else die( 'Could not get tempfile name!' );
}
// Picture file details
print_r( $aInfo );
答案 2 :(得分:0)
更新OpenSSL可能会解决您的问题。
根据您在服务器上报告的OpenSSL版本判断,此问题可能是因为服务器的SSL版本高于您的客户端。
Facebook服务器可能使用版本&gt; = 1.0.0或自定义SSL库,而您使用的是旧版0.9.8。
心跳溢出问题迫使许多网络服务器更新其OpenSSL版本。
关于使用0.9.8版本的客户端的OpenSSL 1.0.0握手问题的随机文章: