PHP函数getimagesize()在尝试获取https url时给出“读取错误”

时间:2014-04-21 08:41:28

标签: php ssl https openssl getimagesize

我正在尝试使用带有URL的getimagesize和http一切都很好。但是,当尝试在https url上使用函数时,我收到“读取错误”通知,结果为false。我查了一下,我在服务器上安装了OpenSSL 0.98(因此它也应该与https一起使用)。 我知道我可以先下载图像,然后再使用它,但在我看来,这应该可行,而且我错过了一些东西。你能不能给我一些解决方案(除了首先下载图像然后打开它)?

提前谢谢。

3 个答案:

答案 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握手问题的随机文章:

https://groups.google.com/forum/#!topic/msysgit/jSOTOQXPnwU