贝利信息

php调用听书插件如何设置播放优先级_php设置听书播放优先级技巧【排序】

日期:2026-01-16 00:00 / 作者:星夢妙者
PHP无法控制播放顺序,因音频播放由前端决定;PHP仅负责生成并返回已排序的完整列表,前端必须严格按该顺序加载和播放,避免异步竞态、二次排序或依赖DOM顺序。

PHP 调用听书插件时无法控制播放顺序?优先级不是靠 PHP 设置的

PHP 本身不参与音频播放逻辑,所谓“播放优先级”实际由前端播放器(如 HTML5 、第三方 JS 插件如 Howler.js、或原生 App SDK)决定。PHP 的角色仅限于:生成播放列表、提供元数据、返回排序后的书目数组。如果你在 PHP 层调用 usort()array_multisort() 排好了数组,但前端仍乱序播放,问题一定出在前端没按 PHP 返回的顺序渲染或加载。

如何让 PHP 输出的列表真正影响播放顺序

关键不是“设置优先级”,而是确保前端按 PHP 排好序的结构加载音频。常见错误是前端用异步请求逐个拉取单本书,导致竞态和顺序丢失。

PHP 排序示例:按 priority 字段升序,priority 相同则按 updated_at 降序

假设你从数据库查出听书记录,需按业务规则稳定排序:

$books = [
    ['id' => 101, 'title' => '三国演义', 'url' => '/audio/sanguo.mp3', 'priority' => 2, 'updated_at' => '2025-03-15'],
    ['id' => 102, 'title' => '红楼梦', 'url' => '/audio/honglou.mp3', 'priority' => 1, 'updated_at' => '2025-04-01'],
    ['id' => 103, 'title' => '西游记', 'url' => '/audio/xiyou.mp3', 'priority' => 1, 'updated_at' => '2025-02-20'],
];

usort($books, function($a, $b) {
    if ($a['priority'] !== $b['priority']) {
        return $a['priority'] <=> $b['priority']; // 升序:数字小的优先
    }
    return strtotime($b['updated_at']) <=> strtotime($a['updated_at']); // 同 priority 时,新更新的靠前
});

// 输出给前端时保持索引连续(不保留原始键)
echo json_encode(array_values($books), JSON_UNESCAPED_UNICODE);

容易被忽略的兼容性坑:iOS Safari 不认 audio preload="auto" 的顺序

iOS 上 标签即使按顺序写死,也不保证按 DOM 顺序触发 canplaythrough 事件。这意味着你监听第一个音频就跳第二个,极易错乱。

前端播放逻辑比 PHP 排序复杂得多,而多数人卡在以为“PHP 排好序就完了”。真正起作用的是那个被传到 JS 里的数组下标。