账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    php的file_get_contents为什么很慢?
    23
    0

    测试代码

    <?php
    function sendGetByCurl($url, $time)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, $time);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $time);
        $return = curl_exec($ch);
        curl_close($ch);
        return $return;
    }
    
    $url = 'http://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTIrQKRNquic8GwsU951TC7PDCFzIew3RFwTOFoNx8u1fln0FOzHv04YBoEqXPTHHfyU0Xa1qoFULCw/132';
    
    $start1 = microtime(true);
    $data1 = file_get_contents($url);
    file_put_contents('1.jpg', $data1);
    $end1 = microtime(true);
    $span1 = $end1 - $start1;
    echo $span1 . PHP_EOL;
    
    $start2 = microtime(true);
    $data2 = sendGetByCurl($url, 3);
    file_put_contents('2.jpg', $data2);
    $end2 = microtime(true);
    $span2 = $end2 - $start2;
    echo $span2 . PHP_EOL;
    
    exit;

    测试结果

    16.397258043289
    0.18160080909729

    那张图片浏览器访问或者wget下载都很快的,很奇怪

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 掏枪毙了你 普通会员 1楼

      file_get_contents() 是 PHP 中用于读取文件内容的一个内置函数,它的工作方式是从指定的文件中读取数据并将其作为字符串返回。如果在某些情况下你发现 file_get_contents() 执行起来很慢,可能存在以下几个原因:

      1. 文件大小:如果你尝试读取的是一个非常大的文件(例如几十 MB 或几百 MB),那么该函数可能需要花费较长时间来加载整个文件到内存中,从而导致速度变慢。

      2. 网络 I/O:如果 file_get_contents() 用于从远程 URL 获取内容,那么它的速度将受限于网络带宽、服务器响应时间以及可能存在的网络延迟等问题。尤其是在目标服务器响应较慢或者网络状况不佳的情况下,获取内容会显得比较慢。

      3. PHP 配置限制:PHP 的配置参数如 memory_limit(内存限制)和 max_execution_time(脚本最大执行时间)等也会影响 file_get_contents() 的性能。当文件大小接近或超过 PHP 设置的内存限制时,可能会出现问题。

      4. 文件系统 I/O:对于本地文件系统,如果磁盘 I/O 性能较差(如硬盘驱动器速度较慢或存在大量碎片),读取文件也会变得缓慢。

      5. 缓存机制:PHP 默认并未对 file_get_contents() 提供缓存支持,所以每次调用都会重新读取文件内容。如果频繁读取同一文件且文件内容相对稳定不变,可以考虑使用适当的缓存策略以提高效率。

      6. 其他并发操作:在同一时刻如果有其他大量并发操作正在访问同一文件,也可能影响到 file_get_contents() 的执行速度。

      针对以上情况,你可以采取以下措施进行优化:

      • 对于大文件,尝试分段读取而非一次性加载。
      • 如果是远程请求,考虑使用 cURL 函数,并设置合理的超时时间和重试机制,或者采用异步处理方式。
      • 调整 PHP 配置参数以适应实际需求。
      • 对于频繁读取的静态文件,可考虑使用 opcode 缓存(如 APCu、OpCache)或其他缓存方案。
      • 优化服务器硬件和存储设备性能。
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部