当前位置: 首页 > 工具软件 > Yourls > 使用案例 >

关于yourls生成短链耗时太长问题解决

燕超
2023-12-01

最近项目上在使用yourls来做运营短链。在批量生成短链的时候,发现请求很慢,记录下解决这个问题的过程。

问题描述

使用yourls的API生成短链时,单个请求耗时大约在300毫秒以上,每秒钟生成大约2-3个链接,效率太低。

解决思路

1.多进程并发

首先考虑是开多个进程,并发生成。但当进程数 > 3时,接口返回报错概率很高,后起的进程大部分时间处于重试的状态,多进程无法继续提升转换效率。

2.引入批量生成插件

官方文档中的API每次只能转换一个链接,考虑到yourls本身有较多的插件,所以决定在插件库中尝试引入批量生成的插件。通过查询插件库,发现了如下两个插件比较适合:

  1. Bulk Import and Shorten
    这个插件主要是支持上传csv文件,将文件的第一列批量转为短链。但该插件主要存在两个问题:
    • 在windows上创建的csv文件,上传的时候文件的type有可能不是csv,而该插件在代码中有判断,如果不是csv类型的文件直接返回失败;
    • 对于大批量的转换,耗时过长,在nginx和php层面都需要延长超时时间,而且转换时间过长并不利于程序的掌控;
  2. Bulk URL Shortening
    这个插件支持在get参数中传入url数组,批量转换后返回。比较适合在脚本中使用。
    但引入批量生成插件后,转换效率并没有得到明显的提升
3.分析源码

没办法了,只能看源码了。生成短链的源码在include/functions-shorturls.php中的yourls_add_new_link方法。这个方法里做了很多校验,每次只处理一个链接,所以也不好直接扩展成批处理。那么只好分析这个方法了。通过分析发现了问题所在:

if( isset( $title ) && !empty( $title ) ) {
    $title = yourls_sanitize_title( $title );
} else {
    $title = yourls_get_remote_title( $url );
}
$title = yourls_apply_filter( 'add_new_title', $title, $url, $keyword );

在这段代码里,会检查是否传入了title,如果没有传入,则会根据当前链接,获取它的title,这是一个http请求的过程。所以每次生成不带title的短连接时,都会带有一次http请求,可想而知这个过程是多么耗时。

解决方案

传入title,防止程序通过http请求去获取原始链接的title。

最终效果

传入title后,处理效率大约在25/s,比之前提升了10倍,这个效率基本满足了大批量生成短链的需求。

 类似资料: