【问题标题】:PHP function getimagesize() gives "Read error" when trying to get https urlPHP 函数 getimagesize() 在尝试获取 https url 时给出“读取错误”
【发布时间】:2014-06-05 07:25:45
【问题描述】:

我正在尝试将 getimagesize 与 URL 和 http 一起使用,一切都很好。但是,当尝试在 https url 上使用函数时,我收到“读取错误”通知,结果为 false。我检查并在服务器上安装了 OpenSSL 0.98(因此它也应该与 https 一起使用)。 我知道我可以先下载图像然后使用它,但在我看来这应该可以工作并且我遗漏了一些东西。能否请您提供一些解决方案(除了先下载图像然后打开它)?

提前谢谢你。

【问题讨论】:

  • 虽然它可能与此无关(因为可能没有检查):您尝试下载的域的证书是否由系统已知的权威签名?
  • 我正在使用 FB 图片进行测试,所以是的...
  • 最后我下载了图片...

标签: php ssl https openssl getimagesize


【解决方案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】:

    更新 OpenSSL 可能会解决您的问题。

    从您报告的服务器上的 OpenSSL 版本来看,此问题可能是由于服务器的 SSL 版本比您的客户端更新。

    Facebook 服务器可能使用 >= 1.0.0 或自定义 SSL 库,而您使用的是旧的 0.9.8。

    心跳溢出问题迫使许多网络服务器更新其 OpenSSL 版本。

    一篇关于使用 0.9.8 版本的客户端的 OpenSSL 1.0.0 握手问题的随机文章:

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

    【讨论】:

    • 感谢您的回答。我们将上传 OpenSSL 扩展并尽快通知您。
    【解决方案3】:

    您可以使用file_get_contents() 作为替代解决方案..

    <?php
    $filename='something';
    file_put_contents($filename,file_get_contents($url));
    $size = getimagesize($filename);
    var_dump($size);
    

    【讨论】:

    • “除了先下载图像然后打开它”我希望有一些服务器|| php配置来解决问题...
    • @Goran,作为替代解决方案.. 这就是答案所说的.. 会找到解决您问题的方法。
    • 主要问题是第三方库中使用了getimagesize。这意味着如果我更改其中的任何内容,任何人第一次使用 composer 更新它都会回滚。这就是为什么我需要看看为什么会出现这个错误,如果我找不到答案,我会调整我的编码方式(先下载然后给出文件路径)。谢谢你的替代答案!
    • @Goran,你能发布关于这个问题的确切通知/错误吗?
    • 该死,奇怪的是它可以在我的系统上运行。 (实际问题
    猜你喜欢
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2021-08-20
    • 2020-12-30
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多