最近项目上在使用yourls来做运营短链。在批量生成短链的时候,发现请求很慢,记录下解决这个问题的过程。
使用yourls的API生成短链时,单个请求耗时大约在300毫秒以上,每秒钟生成大约2-3个链接,效率太低。
首先考虑是开多个进程,并发生成。但当进程数 > 3时,接口返回报错概率很高,后起的进程大部分时间处于重试的状态,多进程无法继续提升转换效率。
官方文档中的API每次只能转换一个链接,考虑到yourls本身有较多的插件,所以决定在插件库中尝试引入批量生成的插件。通过查询插件库,发现了如下两个插件比较适合:
没办法了,只能看源码了。生成短链的源码在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倍,这个效率基本满足了大批量生成短链的需求。