我曾在 PHP 下 Bencode 库差异及性能对比 一文中,通过对比指出NPHP在解析多文件(>1k)种子时,因为原解析库的低效率问题,导致性能过差的问题,并给出了相关解决方法。
但是随着TJUPT代码库变成private状态(示例没了),以及 Rhilip/Bencode
以基础库形式发布在 https://packagist.org/
上并维护。势必有必要重新写一个commit来说明如何替换Bencode库。
以下讲解和代码patch均基于本人fork的官方源码 Rhilip/NexusPHP(v1.5.beta5.20120707),不提供除本文外的任何形式的说明以及免费讲解。
具体请见: Rhilip/NexusPHP#1
include/benc.php
调用分析
通过对 NPHP 原使用的benc.php
文件中函数调用关系进行分析,我们可以知道在以下文件中调用了NPHP原benc库相关方法并进行替换。
相关修改步骤
使用Composer进行
rhilip/bencode
库加载(注意,rhilip/bencode 库要求PHP大于5.6),并在include/core.php
中添加autoload。 (@888b2107)composer require rhilip/bencode
- 替换一系列和benc相关的文件,涉及列表如下 (@a24393a2)
- 移除原benc文件 (@c5903c39)
嗯,文中的PR只适用与PHP7,对于PHP5.6还需要做一些调整,如下:
/** 索引数组:所有键名都为数值型,注意字符串类型的数字键名会被转换为数值型。 * 判断数组是否为索引数组 * @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_indexed_array')) {
}
if (!function_exists('is_iterable')) {
function is_iterable($value) { return is_array($value) || $value instanceof stdClass || $value instanceof Traversable; }}
格式乱了,为了广泛的应用于5.6,问题为:
is_indexed_array存在php7的语法需要定义is_iterable function不做任何PHP5.6的考虑,该升级就升级。