file_get_contents() 与使用 http/1.1 的上下文显着降低下载速度

2023-11-24

使用每个图像下载下面的代码) file_get_contents() )平均需要 8-15 秒......

如果我不在 file_get_contents() 上使用上下文,则图像下载时间不到一秒。

如果我将 $opts 更改为,下面,我将获得与 file_get_contents() 相同的性能,而无需上下文,处理 2,500 个图像大约需要 13 秒。

$opts = array(
    'http'=>array(
        'protocol_version'=>'1.1',
        'method'=>'GET',
        'header'=>array(
            'Connection: close'
        ),
        'user_agent'=>'Image Resizer'
     )
); 

复制:

    $start_time = mktime();
$products = array(
        array( 'code'=>'A123', 'image_url'=>'http://www.google.com/intl/en_ALL/images/srpr/logo1w.png' ),
        array( 'code'=>'A124', 'image_url'=>'http://www.google.com/intl/en_ALL/images/srpr/logo1w.png' ),
        array( 'code'=>'A125', 'image_url'=>'http://www.google.com/intl/en_ALL/images/srpr/logo1w.png' ),
        array( 'code'=>'A126', 'image_url'=>'http://www.google.com/intl/en_ALL/images/srpr/logo1w.png' ),
        array( 'code'=>'A127', 'image_url'=>'http://www.google.com/intl/en_ALL/images/srpr/logo1w.png' ),
        array( 'code'=>'A128', 'image_url'=>'http://www.google.com/intl/en_ALL/images/srpr/logo1w.png' ),
        array( 'code'=>'A134', 'image_url'=>'http://www.google.com/intl/en_ALL/images/srpr/logo1w.png' ),
        array( 'code'=>'A135', 'image_url'=>'http://www.google.com/intl/en_ALL/images/srpr/logo1w.png' ),
        array( 'code'=>'A146', 'image_url'=>'http://www.google.com/intl/en_ALL/images/srpr/logo1w.png' ),
        array( 'code'=>'A165', 'image_url'=>'http://www.google.com/intl/en_ALL/images/srpr/logo1w.png' )
    );

    if ( count( $products ) > 0 ) {
        $opts = array(
            'http'=>array(
                'protocol_version'=>'1.1',
                'method'=>'GET',
                'user_agent'=>'Image Resizer'
            )
        ); 
        $context = stream_context_create($opts);
        $def_width = 100;
        $max_width  = $def_width;
        foreach( $products as $product ) {
            $code = $product['code'];
            $folder = substr( $code, 0, 3 );
            echo( 'Looking at: ' .$product['code'] ."<br />" );
            $file = '/tmp/' .$folder .'/' .$code .'_' .$def_width .'.jpg';
            $filemtime = @filemtime($file);
            $gen_file = true;
            if ( $filemtime !== false ) {
                $file_age = (time() - $filemtime);
                if ( $file_age <= 300 ) {
                    $gen_file = false;
                }
            }
            echo( '&nbsp;&nbsp;&nbsp;&nbsp;File not cached or cached file has expired<br />' );
            if ( $gen_file ) {
                echo( '&nbsp;&nbsp;&nbsp;&nbsp;Getting File...');
                $imgStr = file_get_contents( $product['image_url'], false, $context );
                $img = @imagecreatefromstring($imgStr);
                if ( is_resource( $img ) ) {
                    echo( 'DONE' .'<br />' );
                    $image_x = imagesx($img);
                    $image_y = imagesy($img);
                    if ( $def_width >= $image_x ) {
                        $def_width = $image_x;
                    }
                    echo( '&nbsp;&nbsp;&nbsp;&nbsp;Calculating Scale<br />' );
                    $ts = min( $max_width/$image_x,$max_width/$image_y);
                    $thumbhght = $ts * $image_y;
                    $thumbwth = $ts * $image_x;

                    $thumb_image_resized = imagecreatetruecolor( $thumbwth, $thumbhght);
                    imagecopyresampled($thumb_image_resized, $img, 0, 0, 0, 0, $thumbwth, $thumbhght, $image_x, $image_y );
                    echo( '&nbsp;&nbsp;&nbsp;&nbsp;Checking For Directory<br />' );
                    if ( !is_dir( '/tmp/' .$folder ) ) {
                        mkdir( '/tmp/' .$folder );
                    }
                    echo( '&nbsp;&nbsp;&nbsp;&nbsp;Writing File<br />' );
                    $new_file = '/tmp/' .$folder .'/' .$code .'_' .$def_width .'.jpg';

                    imagejpeg( $thumb_image_resized, $new_file, 100);
                    echo( '&nbsp;&nbsp;&nbsp;&nbsp;DONE<br />' );

                    imagedestroy($img);
                    imagedestroy($thumb_image_resized);
                } else {
                    echo( 'Problem Getting Image<br />' );
                    die();
                }
            } else {
                echo( '&nbsp;&nbsp;&nbsp;&nbsp;Already Exists<br />' );
            }
        }
    }
    $end_time = mktime();
    echo( 'Completed In...' .($end_time - $start_time ) .' seconds(s)<br />' );

默认情况下,HTTP 1.1 请求是管道式的。如果您不“连接:关闭”,则它假定“连接:保持活动”,然后您必须等待连接超时(因为您从未明确关闭它),然后才能开始下一个循环。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

file_get_contents() 与使用 http/1.1 的上下文显着降低下载速度 的相关文章

随机推荐

  • 使用 R 查找字符串中的重复模式

    我有一个很大的文本 其中包含以下表达式 aaaahahahahaha that was a good joke 处理后 我想要 aaaaahahahaha 消失 或者至少将其更改为简单 ha 目前 我正在使用这个 gsub 1 str 当带
  • JQuery:如何找出一个元素有多少个子元素?

    如何使用 jQuery 找出一个元素有多少个子元素 假设我有以下结构 div div div div div div div div div div div div div div 我想知道 div 元素 container 有多少个子元素
  • 在 python 解释器提示符中添加颜色,无法正确换行

    我希望在终端中有一个更丰富多彩的 Python 提示符 只是为了便于阅读 我目前有 sys ps1 033 96m gt gt gt 033 0m sys ps2 033 96m 033 0m in my PYTHONSTARTUP文件 它
  • 使用“void_t”检查类是否具有具有特定签名的方法

    此刻 我是使用此方法检查类是否具有具有特定签名的方法 参加后Walter E Brown 的元编程 CppCon2014 演讲 我开始想知道是否void t可以在这种特殊情况下使用 以使代码更清晰 更具可读性 但是我很难思考void t 到
  • Angular 2 中路线更改时的结束间隔

    我在路由器插座内的 Angular 2 组件中启动一个计时器 setInterval gt 10000 当我离开嵌入组件的路线时 计时器不会退出 我怎样才能做到这一点 您可以从此挂钩中清除间隔 我的是从组件 视图控制的 export cla
  • 如何检查c中是否有被零除的情况

    include
  • ggplot2 条形图上的舍入百分比标签

    q1 lt qplot factor Q1 data survey geom histogram fill factor Q1 ylim c 0 300 options digits 2 q1 geom bar colour black s
  • 如何使用线程执行单元测试? [复制]

    这个问题在这里已经有答案了 执行摘要 当线程中抛出断言错误时 单元测试不会终止 这是有道理的 因为不应该允许一个线程使另一个线程崩溃 问题是我该如何 1 在第一个辅助线程崩溃时使整个测试失败 或者 2 循环并在每个线程全部完成后确定它们的状
  • 如何通过Fiddler捕获Visual Studio Code流量?

    如何通过Fiddler抓取VS Code流量 我运行了我的 Fiddler 看起来工作正常 它可以捕获浏览器的流量 但不能捕获 VS Code 的流量 如果有人能给我解决方案 我真的很感激 Thanks 假设您正在使用一些 REST 客户端
  • 使用 typescript 创建猫鼬模型 - 子文档

    我正在使用打字稿实现猫鼬模型 如本文所述 https github com Appsilon styleguide wiki mongoose typescript models并且不确定当您使用子文档数组时这会如何翻译 假设我有以下模型和
  • 如何检查存储过程是否存在?

    我在网上搜索了一下 发现了一个post它使用以下代码片段来检查存储过程是否存在 select from USER SOURCE where type PROCEDURE and name my stored procedure 还有其他方法
  • Django,使用 ModelForm 更新用户配置文件

    我正在尝试为用户的个人资料显示一个简单的 ModelForm 并允许用户更新它 这里的问题是我的逻辑存在某种缺陷 在成功调用 form save 后 旧值显示在页面上 直到刷新才会显示适当的值 这里有什么问题吗 login required
  • 如何使用 Swift 4 在 UICollection 视图中进行多项选择

    我是 swift 的新手 从头开始构建 iOS 应用程序 使用 swift 4 想要执行如下操作 1 在UICollectionView中实现多单元格选择 2 将选定的单元格数据传递到服务器 请任何人都可以帮助我 该怎么做 告诉我执行此操作
  • 如何在 Windows 上获取硬件 MAC 地址

    我正在尝试从 NIC 检索 MAC 地址 有多种方法可以获取它 本文介绍了最常见的方法 http www codeguru com Cpp I N network networkinformation article php c5451 我
  • 单击传单标记即可转到 URL

    在 R 的传单包中 有没有办法单击标记并定向到 URL 这是JS解决方案 在 R 中 添加带有 URL 的弹出窗口 library leaflet content lt paste sep br b a href http www samu
  • 如何在 mac os x yosemite (10.10) 上安装 mcrypt 扩展

    我已将 Mac OS X 更新到 Yosemite 但这样做会覆盖我的所有开发环境 所以现在 要在本地 apache 上运行 Laravel 4 我需要安装 Mcrypt 扩展 但我尝试的一切都失败了 即使是在 OS X Mavericks
  • Android 蓝牙 VS 低功耗蓝牙

    我正在尝试创建一个应用程序 只要智能手机正在运行 就需要交换少量数据 只是为了通知设备足够接近 据我了解 传统的蓝牙会消耗大量电池 因此打开几个小时是不可行的 我正在考虑 BLE 但仍然担心电池容量 Q0 是否可以在手机运行时就开启BLE
  • JQuery DatePicker 背景颜色

    我正在使用 JQuery DatePicker 的示例链接文本 在我的 asp net 页面上 但是 日期选择器的背景颜色是白色 我不知道如何改变这个 更改为默认颜色 我的asp net页面背景页面是白色的 可能是这个原因 任何帮助将不胜感
  • 如何在模板中迭代 Django CHOICES - 不使用表单或模型实例

    我目前使用选项来定义月份列表和星期几列表 我想在我的模板中显示这些选择列表 而不必与特定实例或表单相关 例如 在我的模型中 MONTH CHOICES 01 January 02 February 03 March etc DAY CHOI
  • file_get_contents() 与使用 http/1.1 的上下文显着降低下载速度

    使用每个图像下载下面的代码 file get contents 平均需要 8 15 秒 如果我不在 file get contents 上使用上下文 则图像下载时间不到一秒 如果我将 opts 更改为 下面 我将获得与 file get c