NexusPHP 建站优化 (2) 替换Bencode库

Rhilip 2020-02-06 PM 4938℃ 3条

我曾在 PHP 下 Bencode 库差异及性能对比 一文中,通过对比指出NPHP在解析多文件(>1k)种子时,因为原解析库的低效率问题,导致性能过差的问题,并给出了相关解决方法。

但是随着TJUPT代码库变成private状态(示例没了),以及 Rhilip/Bencode 以基础库形式发布在 https://packagist.org/ 上并维护。势必有必要重新写一个commit来说明如何替换Bencode库。

以下讲解和代码patch均基于本人fork的官方源码 Rhilip/NexusPHP(v1.5.beta5.20120707),不提供除本文外的任何形式的说明以及免费讲解

具体请见: Rhilip/NexusPHP#1

image-20200206120615167.png

include/benc.php 调用分析

通过对 NPHP 原使用的benc.php 文件中函数调用关系进行分析,我们可以知道在以下文件中调用了NPHP原benc库相关方法并进行替换。

image-20200206104748443.png

image-20200206104819933.png

相关修改步骤

  1. 使用Composer进行rhilip/bencode库加载(注意,rhilip/bencode 库要求PHP大于5.6),并在include/core.php中添加autoload。 (@888b2107)

    composer require rhilip/bencode
  2. 替换一系列和benc相关的文件,涉及列表如下 (@a24393a2)

image-20200206115358707.png

  1. 移除原benc文件 (@c5903c39)

非特殊说明,本博所有文章均为博主原创。

评论啦~



已有 3 条评论


  1. kkk
    kkk

    嗯,文中的PR只适用与PHP7,对于PHP5.6还需要做一些调整,如下:
    if (!function_exists('is_indexed_array')) {

    /** 索引数组:所有键名都为数值型,注意字符串类型的数字键名会被转换为数值型。 * 判断数组是否为索引数组 * @param array $arr * @return bool */ function is_indexed_array($arr) { if (is_array($arr)) { return count(array_filter(array_keys($arr), 'is_string')) === 0; } return false; }

    }

    if (!function_exists('is_iterable')) {

    function is_iterable($value) { return is_array($value) || $value instanceof stdClass || $value instanceof Traversable; }

    }

    回复 2020-07-08 18:11
    1. kkk
      kkk

      格式乱了,为了广泛的应用于5.6,问题为:

      is_indexed_array存在php7的语法需要定义is_iterable function

      回复 2020-07-08 22:03
      1. Rhilip
        Rhilip 博主

        不做任何PHP5.6的考虑,该升级就升级。

        回复 2020-07-09 08:58