• 注册
  • 查看作者
  • 宫论项目开发记录

    记录2023年项目进度周期。

    刷新置顶
  • 2
  • 698
  • 0
  • 15.29w
  • 小小乐小可鸭鸭

    请登录之后再进行评论

    登录
  • 0
    小小乐lv.2实名用户
    2025年7月14日
    1、新增了一个名为xc_corn_unban_user的定时计划,用于执行对已解封用户的定时任务函数。之前的方法由于缺乏执行条件,无法满足需求,因此进行了重构。在执行过程中,该计划会进行两个重要的初始化操作。首先,将result变量初始化为空数组,这样后续的处理结果将以数组结构返回,便于进一步的处理和解析。其次,通过调用xc_is_redis_corn函数验证本次执行请求的可靠性。如果在获取锁的过程中失败,程序会立即中断执行,并返回code=1,同时通过msg字段提示用户执行失败的原因:“取锁失败无法继续执行”。这种设计确保返回的数组结构是标准化的,使得在错误发生时可以有效地解析错误信息,并执行相应的日志记录。
    2、完成初始化动作后,系统会引入超全局变量wpdb,并通过其构建一个sql语句:查询wp_xc_ban数据表,end_time(封禁时间)大于当前时间,并且unban 列的值必须为空字符串或为 NULL。系统原本的封禁逻辑和这两个字段有关,如果到了封禁时间,但是unban还未清除,则说明用户还处于封禁状态,因此需要筛选这些条件,并通过业务逻辑发起解封动作处理。注:为了防止 SQL 注入攻击,使用 WordPress 提供的 $wpdb->prepare() 方法来安全地处理 SQL 查询中的变量。这种方法可以确保传递给查询的变量被正确转义。
    3、通过wpdb查询到的结果会保存到xc_unban变量中,并对其进行二次检验,如果为空则跳过本次任务的执行。如果不为空,则通过for循环依次执行解封动作。在解封过程中,会获取以下参数信息:1、user_id(被封禁用户的ID)。2、id(封禁记录的ID)。3、type(解封类型)。4、restricted(功能解封)。后续的解封操作需要根据被封禁的原因执行对应的解封步骤,因此需要提前对上述变量进行赋值处理。需要注意的是,平台的封禁支持指定权限封禁,因此解封需要根据type来进行具体处理。
    4、在执行解封操作时,系统会首先进行一个上锁保护动作,以确保过程的安全性和稳定性。通过调用unban_user-' . $type来创建一个订单锁,这一步骤旨在防止可能出现的意外情况,确保解封过程的顺利进行。如果解封类型为'restricted',系统将自动调整为功能解封的值,以便在执行解封操作时能够正确识别解封的方式。随后,系统调用xc_unban_user函数来发起解封动作。值得注意的是,所有的封禁和解封操作都已被系统封装成事件处理,用户只需调用相应的事件即可进行操作。在解封动作完成后,系统会自动触发xc_unlock功能,解除之前的上锁保护,以确保资源的正常使用和释放。
    5、考虑到系统在执行解封操作时,需要通过文字提醒用户账户功能已解禁。管理员在手动解封时,会输入解封说明。然而,当系统按照定时计划自动解封时,则需要使用固定术语。因此,在封禁账户的后台配置页面新增了一个字段:xc_unban_system_content。在这个字段中,可以设定固定的术语,系统在执行自动解封操作时会将该术语发送给用户,作为消息提醒。需要注意的是,无论账户是被手动还是自动封禁或解封,都必须说明原因,以便用户了解其账户被封禁的原因以及解封的方式。
    6、xc_unban_user:对宫论用户账户解封钩子进行了优化处理。该方法现在返回标准化的数组结构,以确保后续处理能够通过code来验证解封操作的完成状态。如果解封成功,code将返回0;如果解封失败,code会返回1,并通过msg提供详细的错误信息。导致错误的原因可能包括权限不足、解封数据数组结构信息为空等。由于封禁和解封涉及的场景复杂多样,必须进行各种参数验证,以确保整体执行的安全性。尤其是在权限处理方面,某些解封操作仅允许管理员执行,而其他操作则需由超级管理员进行。因此,采用数组返回格式以便准确判断具体的失败原因。
    7、在xc_unban_user账户解封功能中,增加了一个日志写入机制,以便在解封操作中出现错误时进行详细记录。每当发起解封操作但执行失败时,系统会将错误信息写入日志。该日志具有唯一标识符:unban_user_error。日志的格式为:[解封时间:' . date("Y-m-d H:i:s") . '] - [解封用户:' . $user_id . '] - [错误原因:' . msg . '] - [操作用户:' . 系统或指定用户 . '] - [数据表主键:' . id . ']。这些日志信息将通过【xc_log_error_warn】进行处理。在执行过程中,无论发生何种错误,都会记录在日志中,以确保后续可以进行详细的追踪和溯源分析。这一机制的引入,旨在提升系统的稳定性和维护效率,为开发团队提供及时准确的错误信息。
    8、在使用xc_unban_user功能进行账户解封操作时,如果账户成功解封或特定功能被解封,系统会自动记录相关日志,以确保后续能够查询和处理这些操作记录。由于解封动作直接涉及到用户账户的操作,对于那些严重违规的用户而言,解封可能会影响平台的监管,因此有必要追踪解封操作的具体对象。日志中标识为“unban_user_success”,其格式相对简单,包括解封时间、解封用户、操作用户及数据表主键ID。日志的写入是通过xc_log_error_warn函数来处理,每次成功的解封操作都会被记录下来。需要注意的是,该日志的功能仅限于记录,不会触发任何形式的通知。
    9、新增了一个名为xc_unban_user_callback的回调钩子,旨在优化账户解封后的处理流程。该钩子在管理员或系统成功解封某个账户或功能(即返回码为【code=0】)时自动触发,负责执行一系列重要的后续处理任务。这些任务包括缓存清理、日志更新、自定义字段设定以及第三方系统的回调等。此前,这些业务逻辑都是通过内置方法来完成,导致维护起来较为繁琐。因此,我们引入了标准化钩子机制,将业务逻辑与回调逻辑分离,以提高代码的可维护性和灵活性。在调用xc_unban_user_callback钩子时,仅需传递封禁ID主键,不必传递过多的参数,从而简化了调用过程,增强了系统的可扩展性和模块化设计。此项优化将有效提升系统的响应速度和操作效率,同时为未来的功能扩展提供了更为稳固的基础。
    10、在执行xc_unban_user_callback时,系统会按照以下步骤进行操作:首先,通过wpdb查询数据库,获取与xc_ban相关的记录信息,以便检索封禁记录。若无法成功获取记录,则会返回相应的错误提示。接着,系统通过xc_insert_sql将解封相关信息写入数据库,其中包括解封的用户、功能、时间、操作用户以及设备指纹等详细信息。在第三步,系统会读取用户自定义字段account_status,该字段标识用户的功能状态。如果涉及到解封操作,系统会移除相关字段参数,以确保在用户执行操作时不会受到拦截。第四步是日志记录功能,将解封操作同步写入指定的日志文件,以便后续审查和记录。最后,系统会触发缓存更新处理动作,清除缓存状态,确保系统能够正确识别用户的功能封禁状态。通过这些步骤,系统有效地管理用户的封禁和解封操作,确保用户体验和系统稳定性。
    11、在宫论账户功能解封事件中,增加了日志记录和回调机制,以提升处理流程的透明度和可追溯性。同样地,对于账户封禁事件,也进行了相应的优化。当对账户实施封禁操作时,系统会首先返回一个标准化的数组结构,以确保结果能够被接收并进行后续处理。无论封禁操作是成功还是失败,都会触发日志写入功能,具体包括记录封禁操作的成功与失败情况。封禁失败或成功时,系统会写入一个名为xc_log_error_warn的日志,详细记录封禁操作的详细信息或错误原因,确保所有操作都能被溯源。日志在写入时会标识为ban_user_error或unban_user_success,以便于后续查询和分析。这些日志记录的目的是提供详细的操作记录,而不涉及报警通知的触发。
  • 0
    小小乐lv.2实名用户
    2025年7月11日
    1、在xc_transfer_collection_hook用户收款钩子完成所有拦截检测后,会触发xc_update_money事件,启动一项余额增加的处理动作,处理标识为【transfer】,备注说明为:xxxx转账。将执行结果赋值到update_money变量中,如果返回false,则表示余额处理失败,此时会反馈相应错误信息。如果余额增加成功,则表明转账收款工作完成。随后会触发xc_update_sql,将state标记为ok,并将state_time设置为当前时间。注:缓存的更新处理,因为挂载了xc_update_sql的监听处理,因此不需要再这里进行二次处理。系统会自动完成统一订单的缓存的处理动作。
    2、在转账收款动作完成余额更新后,为确保整个转账流程的稳定性,会随之触发两个关键动作。首先是wss_transfer通用回调处理动作,该动作会在任何状态变更时自动触发,旨在实现对转账动向的内部监听和处理,因此收款方需主动进行触发。其次,通过xc_push_hook机制,将收款成功的信息通过多种渠道如websocket、APP、短信、公众号等发送给转账人,及时告知对方转账已被成功处理。这两个动作处理完毕后,系统将返回code=0和msg=收款成功,标志着整个收款流程已圆满完成。
    3、在xc_transfer_collection_hook中,新增了一个有序集合的处理逻辑。当所有收款处理业务逻辑完成后(包括发送push消息通知),会调用update_redis_sorted_set方法来创建一个有序集合,用于记录每日的转账金额。集合中的成员名称为"xc_day_time",表示当天的时间单位,积分值为$transfer['money'],即本次转账的金额数值,业务标识为"transfer_ok"。记录的逻辑是:以当天00:00的时间戳作为成员单位,并将本次的转账金额作为积分(递增)记录在集合中。这样,可以统计出transfer_ok的每日收款记录,并通过排序功能来了解每日的具体收款金额排名。
    4、宫论定时计划系统新增了一个名为 xc_corn_transfer_return 的任务,该任务的主要功能是处理转账超时退回的情况,确保资金安全。具体而言,当转账超过24小时未被收取时,系统将自动冻结该笔转账,并尝试将资金退回至卖家账户。这一机制旨在避免因用户长时间未收款而导致资金长时间滞留甚至受损的问题。24小时自动退回的设定是参考了微信的转账机制,具有一定的合理性和实用性。此外,未来可以考虑在系统后台增加参数配置功能,允许管理员自由设定超时时间,以提升灵活性和适配性。该任务作为主副锁定时计划,每隔5分钟触发一次执行,以确保及时处理和高效运转。
    5、在触发xc_corn_transfer_return事件时,首先通过调用xc_is_redis_corn函数,确保避免由于并发处理引发的重复操作问题。然后,利用wpdb构建查询条件,筛选出所有转账时间已超过或等于24小时,并且转账状态标记为【yes_pay:已付款,但未收款】的记录。筛选出的这些记录将被存储到xc_transfer数组中,随后进行必要的验证处理。如果查询结果存在,则继续执行后续的业务逻辑;如果查询结果为空,则跳过当前任务,并返回一个标准的数组结构,其中包含code=1和msg:“没有可执行的转账超时记录”。需要特别注意的是,在初始化阶段,result变量应被设置为空数组,以确保后续操作的正确性。
    6、转账退款的处理流程如下:首先,系统会筛选出符合条件的转账记录,并提取相关参数,包括【payee:收款人信息、order:转账订单号、user_id:转账用户、money:转账金额】。为了确保退款金额的安全性,接下来系统会通过 xc_lock 机制对订单号进行唯一标识的上锁操作,上锁时间设置为20秒,以防止并发操作带来的风险。如果当前任务未能成功获取锁,则会跳过该记录,直接进入下一条转账记录的处理环节。由于退款涉及平台资金安全,整个流程需格外谨慎,确保严格执行,避免因并发操作导致重复退款等问题的发生。
    7、在完成上锁保护操作后,系统正式进入退款业务逻辑环节,整个流程具体包括以下几个步骤:首先,对订单状态进行进一步确认,确保订单符合退款要求,若不满足条件,则主动跳过该订单的处理。接着,系统获取支付订单的详细信息,并核实其支付状态,确认订单确已完成付款。随后,提取相关的付款信息,调用pay_return接口启动退款流程,对本次支付订单的全额款项进行退款处理。在退款操作完成后,系统会对退款状态进行检测,无论是成功还是失败,均有对应的处理机制。如果发现原支付订单已进入退款状态,则立即触发相关的回调操作以完成后续处理。最终,系统返回结果,包含code=0及提示信息“转账订单已完成退款”,标志着整个退款流程圆满结束。
    8、一旦通过xc_corn_transfer_return完成退款操作后,将会执行以下一系列步骤:首先,利用xc_update_sql对转账订单进行回调,将订单状态更新为“refund”,以防止后续任务再次发起退款请求。接着,触发wss_transfer事件,通知所有监听器该订单的退款操作已完成。此外,触发xc_push_hook以发送消息通知转账用户,告知由于订单超时,款项已退回。此通知标识为transfer_return,并支持通过微信公众号、短信、APP及站内信等多种渠道发送。最后,取消锁定保护并返回处理成功的确认信息。
    9、在业务监听中,当转账订单因超时被退回时,会触发一个有序集合统计功能,用于记录[今日转账退款金额]。该统计通过调用update_redis_sorted_set方法实现,有序集合的成员标识为transfer_refund,成员的时间戳由xc_day_time获取并作为标识,分数则记录为本次退款金额。值得注意的是,这里的分数是递增累计的,也就是说,一天内发生的所有退款金额都会被不断累加并统计入集合。通过将数据写入这个有序集合,不仅能够直观统计每日的退款金额,还可以进一步支持每周、每月,甚至是指定日期范围内的转账退款金额总数的统计分析,同时还能生成对应的日期排名记录,为后续的数据分析和业务决策提供了精准的数据支撑。
    10、在处理转账超时未接收的退款任务中,我们成功完成了xc_corn_transfer_return的流程封装,确保该任务能够自动处理相关退款事宜。具体流程如下:首先,系统会检查是否满足任务执行条件(is_redis_corn($key)),如果不满足,则流程会直接终止。接着,从数据库中查询所有符合条件的转账记录,这些记录的状态为yes_pay且state_time已超时。对于每一条符合条件的转账记录,我们都进行了详细的处理,包括执行退款逻辑。在处理过程中,我们为当前转账订单加锁(使用Redis锁)以避免重复处理或意外冲突。然后,根据转账订单号查询对应的支付记录,确保支付状态为ok且支付金额与转账金额一致。随后,调用退款函数pay_return()来执行退款操作,并根据返回结果进行处理:如果退款成功(code == 0),我们会将退款金额记录到Redis的有序集合中,用于统计每日退款金额。此外,还会更新转账记录状态为refund,并同步更新数据库。为了确保信息及时传达,我们会发送WebSocket通知(wss_transfer())以及统一通知事件(xc_push_hook())。最后,释放订单锁。若支付记录状态为return(已退款),但转账记录未更新状态,我们会更新转账记录状态为refund,并更新数据库,同时发送相应的WebSocket通知和统一通知事件。在整个过程中,确保及时释放Redis锁,以完成当前转账记录的处理。通过以上步骤,整个流程得以顺利封装和执行,确保转账超时未接收的退款能够高效处理。
    11、在后台新增了一个字段参数配置:xc_transfer_return_time,类型为整数,以小时为单位,默认值设定为24小时。该参数用于控制转账订单的超时自动退款限定。管理员可以根据实际需要调整该字段的值,例如将其设置为48小时,这样一旦转账记录超过48小时未完成收款,系统将自动执行退款操作。此外,在接受退款时增加了一项安全校验操作:如果转账时间超过xc_transfer_return_time的设定,即便转账仍处于可接收状态,用户也无法领取,系统会提示错误信息:“转账已过期,等待系统退回状态”。此举旨在应对定时计划可能出现的延迟,提供额外的安全保障。
  • 0
    小小乐lv.2实名用户
    2025年7月10日
    1、通过 xc_query_transfer 发起统一订单查询时,系统已具备自动更新缓存的机制。当转账记录的状态发生变化时,只需通过设置 uncache 变量为 true,即可触发系统同步更新 Redis 缓存,确保后续查询时获取的数据是准确且可靠的。同时,该缓存机制还具备一个特殊处理逻辑:当数据库查询(wpdb)结果为空时,系统会将 Redis 缓存更新为字符串 false,并在后续输出缓存数据时直接返回 false。这种设计确保了在查询不存在的订单时,系统依然能够通过缓存输出结果,提升查询效率并减少数据库压力。整体流程既保证了数据的实时性,也优化了查询性能。
    2、xc_update_sql_hook:宫论数据表内容更新成功钩子新增了一个监听器功能,当xc_transfer数据表中的记录通过xc_update_sql进行更新操作并成功时,将会触发xc_update_sql_hook钩子事件。此事件会读取记录的主键ID和转账单号,并在系统内部强制执行redis缓存更新操作,以刷新xc_query_transfer统一订单记录缓存。这一机制确保了后续redis缓存返回的数据始终是最新的记录。值得注意的是,宫论系统中所有数据表的更新操作必须严格通过xc_update_sql来进行处理,任何字段的变更都需通过此函数执行,以确保数据处理的一致性和规范性。
    3、xc_query_transfer方法已完成封装优化处理,后续所有的转账订单查询均将通过该方法统一发起。该方法具备高效的缓存特性,在未禁用缓存的情况下,系统会优先检查缓存中是否存在对应数据,若缓存命中则直接返回Redis中的结果,从而显著减少对wpdb的查询压力,大幅提升查询响应速度与系统整体性能。此外,xc_query_transfer还内置了可靠的缓存刷新机制,能够确保返回的数据始终保持最新、准确和有效,为数据一致性提供强有力的保障。随着该方法的全面接入,系统查询逻辑将更加规范统一,同时进一步优化性能表现,为后续功能扩展和稳定运行奠定坚实基础。
    4、转账成功钩子:xc_transfer_ok_hook,用户收款钩子:xc_transfer_collection_hook,转账资格验证逻辑:xc_transfer_detection_hook,这三个钩子已全面进行重构处理。重构的核心逻辑是针对返回结果的处理方式进行调整。之前,这三个方法均返回json数据包,但这不符合系统设定机制,因为API接口才需要返回json数据包。因此,将返回的数据结构更改为数组,以确保上级方法能够正确识别并处理这些数据。需要特别注意的是,hook钩子的执行必须严格遵循标准,返回的结构必须为数组类型。
    5、在通过xc_transfer_detection_hook进行转账资格验证处理时,系统不仅会对请求的安全性和可靠性进行拦截,还会使用xc_is_blacklist功能来核实双方的身份关系。如果转账用户已将收款方列入黑名单,或者收款方将转账用户列入黑名单,系统将立即拦截该请求,并返回相应的错误提示。因为当任何一方存在拉黑行为时,双方的互动会被彻底禁止,若允许发起转账,可能会引发一系列不可预见的错误。因此,严格验证双方的社交关系是至关重要的,以确保避免此类问题的发生。
    6、在转账资格验证处理方法的基础上,新增了针对转账金额的拦截处理机制,进一步提升了系统的安全性和灵活性。具体而言,系统允许后台通过参数设定单次转账金额的上下限,例如单次转账金额最多不得超过300元,最低不得低于1元,超出此范围的转账请求将被系统自动拦截。同时,系统还引入了每日转账金额上限的控制机制,例如用户每日转账上限为500元,当用户当天的累计转账金额已达到400元时,后续的单次转账金额不得超过100元。该限制操作的设计初衷在于防范用户利用转账功能进行单纯的资金转移操作,从而有效规避潜在的交易风险。需要特别说明的是,转账功能的定位是为商户提供售后补差价的工具,因此转账金额不宜过大,以免偏离实际用途。一旦转账金额不符合设定要求,系统将立即返回对应的错误提示,并终止本次处理操作。
    7、xc_transfer_ok_hook用户转账成功回调事件,增加一个redis计数器功能:记录平台的转账记录金额数量。用于后期的监管处理管理,系统会在后期开放统计绑定,记录每日的转账金额统计报表,如果出现大规模转账记录,系统可以及时跟踪处理,确保风险可控范围内。后续也可以通过get_redis_count($key)方法获取详细的统计数据。该功能支持多维度查询统计,包括总数、今日、昨日、本周、上周、本月、上月、今年及去年等时间维度,能够全面呈现不同时间段内转账记录,为后续分析和管理提供了便捷的数据支持。
    8、xc_transfer_collection_hook:在用户收款成功的回调事件中,新增了一个Redis计数器功能,用于实时记录转账收款的金额总量,从而实现对平台资金流向的动态监控与分析。该功能的核心在于,当用户完成收款操作时,资金会从A用户流向B用户,此过程中的资金流动信息将被记录下来。如果某些账户间的资金流动量过大,可能预示着潜在风险,需进一步进行追踪和判断。一旦发现某个用户通过多账户转账的方式聚集大量资金,便可能存在异常情况,需要及时采取相应的处理措施。此外,通过调用get_redis_count($key)方法,可以快速获取相关统计数据,支持多维度、多时间段的查询,包括总数、今日、昨日、本周、上周、本月、上月、今年及去年等维度。这种灵活全面的数据统计方式,不仅提升了平台对资金流向的掌控能力,也为后续的风险分析和管理决策提供了高效便捷的数据支持。
    9、当用户收款成功后,系统除了通过计数器记录平台上的转账收款金额外,还会自动触发两个用户字段的写入操作。第一是“用户转账收款记录”(transfer_income),用于记录用户累计收到的转账金额总数;第二是“用户转账支出记录”(transfer_expenditure),用于统计用户账户累计支出的转账金额总数。这两个字段均通过meta自定义的用户元字段实现,数据会以自动累计的方式进行更新。未来,平台计划开放一个内部榜单功能,用户可以通过该榜单查看收款总金额排名及支出总金额排名,并支持点击查看具体的收款或转账记录详情。通过这一设计,平台能够直观呈现用户的收支情况,便于在数据异常时快速排查问题,为用户提供更透明、更高效的服务体验。
    10、对用户收款钩子 xc_transfer_collection_hook 进行了优化处理,新增了关键的上锁保护机制。具体实现为:以 transfer-' . $order 作为锁的标识,设置有效期保护为30秒。在执行收款操作时,系统会先尝试获取锁,如果取锁失败,则说明该转账订单正在被其他操作处理,此时系统会拒绝当前请求并返回错误提示:“稍后再试”。此优化措施是出于平台资金安全的考虑,通过上锁保护,确保每笔操作的唯一性,防止用户在多个设备或账户上同时操作,导致同一时间重复执行收款动作,从而引发并发执行的安全隐患。有了锁的保护机制,可以有效避免因并发问题造成的重复收款处理,从根本上保障了平台资金操作的安全性和稳定性。
    11、用户收款动作在安全性方面进行了进一步的优化,除了已有的上锁保护机制外,还新增了一个安全环境检测的业务逻辑处理。在用户进行转账操作时,系统会详细记录转账用户的IP地址、用户代理(UA)、设备指纹等三个核心参数,并将这些信息同步写入到相应的数据库字段中。在用户进行收款处理时,系统会逐一核验这三个参数,以确保交易的安全性。如果任何一个参数与之前记录的匹配成功,系统将识别此操作为用户试图自我转账的行为,立即拦截交易并提示用户:由于网络风控的原因,无法进行收款操作。值得注意的是,转账收款功能是专门为商户和用户之间的交易设计的,不允许通过转账发起资金转移行为,因此对安全性和可靠性进行严格的校验,以防止不正当行为的发生。
  • 0
    小小乐lv.2实名用户
    2025年7月8日
    1、新增了名为xc_corn_transfer_overdue的定时任务,该任务旨在提醒用户转账即将到期。此次更新是在原有的corn_transfer_overdue方法基础上进行全面重构,以解决旧机制无法满足当前业务需求的问题。首先,为确保所有方法都符合命名规范,我们对函数名称进行了调整。随后,在原有功能上增加了一个名为is_transfer_overdue的验证处理,该方法通过一个switch开关进行控制,使用户可以选择是否启用提醒功能。如果开关处于关闭状态,系统将跳过该任务。此次更新不仅提升了处理逻辑的效率,还增加了灵活性,以便更好地支持业务需求。
    2、xc_corn_transfer_overdue模块现已集成xc_is_redis_corn验证机制。在初始化阶段,系统会通过Redis进行条件检测,确保符合执行条件后才继续处理,否则将终止操作。此优化旨在提高任务调度的准确性与效率。此外,模块在通过wpdb发起SQL查询请求时,采用了prepare函数进行参数化查询,确保所有查询参数得到正确转义,防止SQL注入风险。同时,通过使用intval函数确保$overdue_hours始终为整数,进一步强化数据的可靠性。在日期比较方面,系统采用DATE_ADD(NOW(), INTERVAL %d HOUR)的方式进行日期计算,以提升查询的可读性和性能。尽管查询返回的结果与之前保持一致,但SQL查询的安全性和整体性能都得到了显著提升。
    3、在通过wpdb获取符合条件的转账记录后,系统会将结果保存到变量xc_transfer中。接着,系统会使用empty函数检查返回结果是否为空。如果结果不为空,系统将通过foreach循环进行遍历并处理输出。在执行业务逻辑之前,系统会提前提取处理收款用户(payee)和交易单号(order),因为后续操作中会用到这些信息。随后,系统会触发一个名为xc_push_hook的统一事件(transfer_overdue),将通知对象设置为收款用户,并传递核心变量order(转账单号)。系统会向用户发送相应的消息通知,提醒他们及时进行收款,以避免因超时导致的系统退回事件。通过这种方式,系统确保用户能够及时处理转账事务,避免不必要的麻烦。
    4、在处理完xc_push_hook消息通知的下发后,xc_corn_transfer_overdue模块会构建一个名为update_data的数组,其中包含一个关键变量corn=1。这个变量用于标识转账提醒已成功下发,系统在后续的查询处理中会根据此参数过滤掉该转账记录。由于转账提醒只能被触发并通知一次,因此在完成通知下发时,需要将其标记为已处理,以防止重复触发。与此同时,where数组的构建相对简单,仅包含$order变量,该变量对应于具体的转账账单。接下来,系统会通过xc_update_sql函数来执行相应的SQL更新操作,确保数据库状态同步更新。此外,缓存也会同步刷新,以保证数据的一致性和实时性。
    5、通过 xc_corn_transfer_overdue 下发转账即将到期提醒时,除了常规消息通知,还会通过 WebSocket 发送消息提醒,通知在线用户有待处理的收款转账即将过期(以在线卡片消息的形式)。考虑到转账 WebSocket 消息种类繁多,如转账通知、转账到期通知、转账收款通知等,如果每个消息都单独封装一个处理方法,后期维护会变得不方便。由于后续还涉及状态变更处理,因此决定封装一个全新的方法【xc_wss_transfer】来处理所有转账相关的 WebSocket 消息。这样所有与转账相关的 WebSocket 消息都将通过这个方法发起,简化了维护工作,提高了系统的扩展性。
    6、在进行xc_wss_transfer操作时,需要传递两个关键变量。首先是status变量,该变量用于表示处理状态,目前支持的状态包括:yese_pay(付款成功)、overdue(过期提醒)、return(已过期或退回,通常指退款情况)、ok(用户已收款)。如果未来有新的状态需求,也可以轻松集成到此系统中。其次是order变量,这代表转账订单号,通过订单号可以触发相应的通知处理机制。在实际操作过程中,会使用switch语句遍历订单的状态,并根据不同的状态执行对应的WebSocket消息下发处理。为了确保消息的准确性,在触发消息时会通过wpdb读取现有的订单信息进行匹配和验证。只有当订单状态满足预设条件时,系统才会触发相应的消息提醒,以保证信息传递的及时性和准确性。
    7、xc_corn_transfer_overdue定时计划已经完成封装处理,该计划每30分钟触发一次(后台主副锁计划,设置1800秒触发并执行一次)为了确保转账过程的顺利进行。若转账在过期前的2小时仍旧会进行收款处理(该时间间隔可通过后台灵活调整),系统将自动触发相应的消息提醒。该提醒通过xc_push_hook和websocket实时发送给收款人,以便他们及时处理转账事务,避免因超时导致资金退回。程序内置了corn状态回调机制,确保每笔转账提醒仅触发一次,最大程度地提高了通知的准确性和效率。
    8、鉴于转账订单查询功能在许多场景中频繁使用,直接通过wpdb查询转账订单信息显得极为不便,因此决定开发一个统一的订单查询方法以简化转账记录的查询处理。该方法命名为:xc_query_transfer。使用时需传递一个固定的变量ID,该ID具有灵活性,并支持两种查询参数:一是转账数据表的主键ID值,二是转账的实际订单号。两者均具备查询功能。方法内部会进行参数校验,随后执行相应的查询逻辑,并最终返回查询结果。特别说明:通过封装统一的订单查询方法,可以显著减少wpdb的SQL处理负担,提升整体响应速度。
    9、通过发起的xc_query_transfer转账订单查询,处理流程如下:首先,系统会通过global引用wpdb对象,这是后续发起订单查询时所需的重要参数。在查询过程中,首先对ID进行严格的参数检查,确保其为数字且长度不超过8位。若ID符合条件,则利用wpdb进行主键查询匹配;否则,将通过order进行匹配查询。为了确保查询的安全性并防止SQL注入,系统在查询过程中会使用prepare函数进行过滤,规避潜在的风险。查询结果会被转换为ARRAY_A格式的空数组,以便后续处理。完成查询条件的处理后,结果将被保存到sql_result中。随后对sql_result进行检查:若返回结果为空,则说明订单不存在,系统将返回false;若查询结果存在,则直接返回对应的数据数组。通过这种方式,确保订单查询过程既高效又安全。
    10、在xc_query_transfer模块中,集成了第二个关键变量【uncache】,用于控制缓存机制。默认情况下,该变量设置为false,这意味着系统将优先使用缓存来提高查询效率。然而,如果将【uncache】设置为true,系统将跳过缓存,直接从数据库进行查询。初始化时,系统会构建一个Redis键名:query_transfer:id(变量),并使用get_redis_meta函数进行查询处理。如果查询结果存在且【uncache】为false,则系统会直接返回缓存结果,以保持高效的性能表现。但如果禁用了缓存或未能找到缓存结果,系统将通过wpdb执行SQL查询,并将查询结果同步到缓存中,设置有效期为24小时,以确保数据的及时性和准确性。缓存数据在超过有效期后会自动释放。通过Redis的有效控制,系统能够显著减少SQL请求次数,从而提升查询执行效率。
    11、在使用xc_query_transfer进行订单查询时,由于查询条件同时支持主键ID和转账单号order,因此在处理缓存时需要特别注意,以避免因查询条件不一致而导致信息偏差。处理方式主要是在涉及到wpdb查询时,不仅仅依赖之前初始化的redis键名来更新缓存,而是需要同步构建两个缓存键名:一个对应ID,一个对应order。两个redis缓存都需要同时进行更新,将查询结果保存到各自的缓存中。通过这种方式,系统返回的结果能够保持一致性,避免出现仅查询ID时只更新ID的redis缓存的情况。这样可以确保无论通过ID还是order进行查询,返回的数据始终保持一致。
  • 0
    小小乐lv.2实名用户
    2025年7月7日
    1、目前通过 gl_corn_daily 挂载并注册定时任务计划函数,实现了对 xc_corn_daily_callback 和 xc_corn_daily_fail 的全面集成处理。在任务执行完成后,系统会根据处理结果自动触发对应的成功或失败回调。成功回调将记录当前任务是否顺利完成,并对 corn_daily 进行更新,同时设定下次执行时间,从而优化任务调度,避免重复检测处理。而在任务失败的情况下,系统会记录错误次数,并在未达到重试次数上限时启动重试机制。如果重试次数达到预设上限,则会触发日志记录功能,同时终止当前任务的循环处理,确保资源消耗控制在合理范围内,并将任务推迟至次日重新执行。此流程设计全面提升了任务调度的自动化与容错性,为后续任务的稳定运行提供了保障。
    2、针对corn_daily每日固定计的回调机制,原本存在两个独立的回调方法(一个处理成功逻辑,另一个处理失败逻辑),在后期维护过程中稍显繁琐。为提升维护效率与简化逻辑,决定将原有的两个方法——xc_corn_daily_callback和xc_corn_daily_fail合并为一个统一的处理方法。合并后的逻辑相对简单:在原xc_corn_daily_callback方法基础上,新增一个变量status用于标识执行状态。该变量默认为success,表示成功状态;当回调失败时,则将其标记为fail。通过status变量的值,内部可灵活判断当前需要处理的回调逻辑,从而区分成功与失败的执行机制。值得注意的是,合并后的方法依然保持了与原有机制一致的执行逻辑,仅在实现方式上进行了优化与整合。
    3、宫论当前支持的定时计划功能均通过 add_filter 注册到 cron_schedules 中,已实现多种周期性任务调度,覆盖了从秒级到周级的多种时间间隔。其中,xc_cron_hour_add_custom_schedule 实现每小时执行一次,xc_cron_sec_add_custom_schedule 支持每30秒执行一次,xc_cron_sec_add_custom_schedule_10 则将间隔缩短至每10秒执行一次。此外,xc_cron_min_add_custom_schedule 可每分钟执行一次,five_min_cron_schedules 和 ten_min_cron_schedules 分别支持每5分钟和每10分钟的任务调度,而 thirty_min_cron_schedules 则扩展至每30分钟执行。对于更长时间的任务调度需求,系统提供了 xc_cron_twelve_hours_add_custom_schedule(每12小时执行一次)以及 xc_cron_weekly(每七天执行一次)。通过这些灵活的周期设置,结合宫论内置的任务调度机制,能够确保所有任务都在设定的时间范围内精准执行,从而满足不同场景下的任务管理需求,提升系统的自动化与高效性。
    4、通过 cron_schedules 注册的执行周期计划,在初始化时会通过 xc_redis 方法获取 Redis 对象,该方法具备自动重连机制。如果 Redis 连接已断开,系统会主动尝试重连以确保获取到有效的 Redis 实例。在成功获取 Redis 对象后,系统会根据任务的执行周期进行上锁操作。锁定时间与任务的执行周期成正比,从短至长不等,例如从 5 秒到更长时间不等,周期越长锁定保护时间越久。上锁操作是通过 $redis->set 方法直接实现的,如果获取锁失败,任务会直接跳过执行,并通过 close_redis 方法关闭 Redis 的连接状态,以防止出现内存泄漏问题。该上锁机制能够有效避免任务因并发导致的重复执行,从而保障任务的周期性执行逻辑的稳定性与准确性。
    5、鉴于任务计划的设计需要挂载大量执行计划,其中绝大部分通过异步方式发起处理,少部分采用同步执行方式。随着系统复杂度的提升,未来挂载的任务数量预计将持续增长,因此在触发定时计划时需特别关注性能与稳定性问题。为避免任务过载导致系统崩溃,可通过 set_time_limit 设置超时保护机制。具体设定建议根据实际执行场景灵活调整,最低超时时间为60秒,最大可设置为不限时。对于执行周期较长的任务,建议适当提高超时上限,以确保任务能够顺利完成。同时,为保障系统整体性能和运行效率,建议优先采用异步执行方式,尽量避免阻塞进程,从而实现任务处理的高效与稳定。
    6、宫论定时任务系统重构全面完成,整体设计严格遵循HOOK标准,实现了高效且灵活的任务调度处理。返回结构全面支持数组形式,确保数据传递的统一性与兼容性,任务调度均通过系统内置方法发起,采用Redis作为核心支撑,保障了任务执行的高精度与稳定性。同时,系统内置上锁保护机制,有效避免并发情况下任务的重复执行问题。针对固定计划任务,设计了智能重试机制,当任务执行出现错误时,只要未超过设定的重试上限,系统将自动进行重试,确保任务可靠完成。在执行过程中,系统采用try捕获异常的方式处理错误,并将详细的错误信息记录到日志中,以便后续追踪与问题排查。此外,任务的成功与失败均会触发计数器,实时统计任务的执行情况,为运行状态的监控与优化提供了数据支持。系统还全面支持异步Swoole处理机制,进一步提升了任务执行的效率与性能。整体重构后的宫论定时任务系统,凭借其高精度、高可靠性与灵活性,能够满足复杂场景下的任务调度需求,展现出卓越的稳定性与扩展能力。
    7、宫论is判断脚本库新增了一个名为xc_is_redis_corn的方法,主要用于任务执行的保护处理。该方法本质上是一种内置的上锁保护机制,通过对任务执行进行锁定来确保系统的安全性和稳定性。使用时需要传入一个key参数,通常该参数为任务名称,用作锁的唯一标识。方法内部会通过xc_redis获取Redis对象,并利用传入的key构建一个键名,随后执行取锁操作。如果成功获取锁,则返回true,表示任务可以继续执行;如果取锁失败,则返回false,表示当前任务被保护机制阻止,无法执行。此外,该方法与其他is脚本的设计一致,返回值为布尔值,而非标准数组结构。取锁成功后,系统才会执行后续任务函数,从而确保任务执行的安全性。需要特别注意的是,如果Redis对象获取失败,为了防止Redis系统崩溃导致任务系统瘫痪,该方法会默认返回true,避免影响整体任务流程的运行。
    8、对 xc_is_redis_corn 进行了优化,现阶段 key 变量不再支持自定义命名,而是通过内置函数自动读取当前执行函数名称作为 key,进一步提升了使用的规范性和一致性。在优化过程中,函数内部会先通过 xc_get_option 方法获取 xc_corn_config 配置信息,并结合 xc_is_config 检查具体任务的状态。如果任务信息无法正确读取,则表明该任务未被纳入主副锁计划范围内,此时函数将直接返回 false,终止后续处理,避免无效的任务执行。如果任务存在,则会进一步检查其配置中的 open 状态是否启用;若未启用,同样会返回 false,拒绝执行后续逻辑。优化还涉及到锁机制的保护期调整,上锁保护时间由后台设定的任务执行周期决定,例如若任务设置为每三分钟执行一次,则锁的保护期为 180 秒,确保任务运行的稳定性和安全性。
    9、在调度系统中,xc_is_redis_corn函数默认返回true,表示允许任务执行。然而,在执行过程中,若出现以下问题,该函数会返回false,从而标记任务不具备执行条件:任务查找失败、任务未启用、Redis对象获取失败、或者取锁失败(表示任务正在执行中)。所有已上调度的主副锁计划任务在初始化阶段都会调用xc_is_redis_corn方法,以验证是否符合执行条件。如果is_redis_corn($key)返回false,整个执行计划将被终止。这样设计的目的是确保系统在遇到上述异常情况时能够及时停止任务,避免资源浪费和潜在的错误传播。
    10、目前,通过宫论分配的任务调配系统已经引入了上锁保护机制,以避免任务在短时间内重复执行。然而,这一机制在执行成功后并没有自动释放锁的功能,必须等待锁的有效期结束才能自动释放,这带来了两个潜在的安全隐患。首先,由于任务时间精度问题,可能导致任务需要两个周期才能执行一次。其次,在极端情况下,如果Redis系统出现异常,可能导致锁无法释放,从而使任务永久无法执行。为了解决这些问题,建议在任务函数处理完成后,主动执行释放锁的动作,并在返回处理结果前确保Redis锁已被释放。这样可以确保在下次任务执行时,不会因锁保护机制而遇到障碍。需要注意的是,释放锁的操作应在任务返回结果后立即进行,无论任务是否成功完成。
    11、目前,宫论调度系统拥有四种任务分配方式:主副锁计划、固定计划、周期性计划以及00:00重置计划。每种计划都承载着多样化的任务。为了简化后期维护工作,我们意识到将所有任务函数整合到一个脚本中会导致管理上的复杂性。因此,决定在项目的function/corn/目录下分别创建四个独立的脚本,以便更好地组织和管理这些任务。首先是plan_daily脚本,它负责处理每日凌晨00:00重置计划的相关函数。其次是corn_plan脚本,用于周期性计划的任务分配,支持每隔特定的秒、分钟或小时执行的任务。此外,corn_daily脚本则负责每日固定计划,在特定时间主动执行一次相应任务。最后是corn_config脚本,它负责主副锁计划,这类任务需要每隔指定秒数触发一次,并通过Redis来精确控制时间。这样的架构设计不仅提升了代码的可维护性,也确保了任务调度的高效和精准。
  • 0
    小小乐lv.2实名用户
    2025年7月4日
    1、在重构【xc_corn_daily_check】后,已移除【fail】变量,因为【fail】的业务处理现在通过【xc_corn_daily_fail】机制进行,因此不需要在验证阶段传递该参数,这样的方法既不可靠也不安全。当任务执行失败出现异常时,只需统一进行【xc_corn_daily_fail】回调处理,该机制会自动对【corn_daily】进行重写,确保业务的一致性。这样,【xc_corn_daily_check】只需专注于对【corn_daily】进行验证即可,无需对失败进行回调修改。这种设计简化了任务验证的过程,使其更加专注和高效,同时通过集中处理失败的回调,提升了系统的安全性和稳定性,确保任务调度的逻辑清晰明确。通过这种优化,系统能够更有效地管理任务执行和异常处理,进一步提高了整体操作的可靠性。
    2、重构后的【gl_corn_daily】(宫论定时计划执行-每日固定任务计划)和【gl_corn_execution】(宫论定时计划执行-定时周期计划)现已具备多项高级功能,旨在提升任务执行的可靠性和效率。首先,引入了Redis拦截机制,以防止任务的重复执行,确保任务在设定周期内只执行一次。此外,这两个模块均配备了上锁保护处理,以确保执行周期严格符合后台的设定要求,从而避免因周期错乱导致的执行问题。异步请求处理功能则保证在开启异步任务时,任务能够被Swole服务器正确接受和处理。系统还具备日志处理能力,当发生错误或异常时,会自动记录详细日志,帮助管理员快速定位和解决问题。计时器统计功能则在任务执行成功后,记录每日成功执行的数量,为后续分析和优化提供数据支持。特别是【gl_corn_daily】,在任务执行失败时还具备重试机制,会进行多次尝试直到达到设定的重试次数上限。这些功能的整合不仅提升了任务调度的稳定性和安全性,也增强了系统的整体性能和可维护性。通过这些优化设计,系统能够更有效地管理复杂的任务调度,确保每个任务都能够在合适的时间和条件下顺利执行。
    3、在宫论任务系统中,除了每日固定计划和周期性计划之外,还新增了一个名为【xc_daily_plan_hook】的00:00重置计划。该任务在每日凌晨触发,专门用于重置和更新一些系统参数,以确保系统的正常运行和数据的一致性。具体来说,【xc_daily_plan_hook】负责清理Redis相关缓存,例如计数器数据,确保缓存数据不过期或错误累积。此外,它还会重置用户的每日字段参数,包括用户每日拦截器、短信发送限制、发帖限制等,以便用户在新的一天能够重新获得这些权限。该计划还会处理超过60分钟未在线但仍存在【client_id】的用户记录,确保用户数据的准确性和系统资源的合理使用。这些处理逻辑主要针对拦截器和用户每日行为限制的管理,通过【xc_daily_plan_hook】的整合,每日00:00系统会自动释放和更新相关额度。】
    4、【xc_daily_plan_hook】作为每日00:00清理计划的钩子,不需要传递任何变量参数,它在内部会读取任务组并按照批次进行执行。为了确保上级能够了解整体的执行效果,该方法会返回一个标准的数组结构。返回结果包括两个字段:首先是【code】状态标识,其中1表示执行未完成,表明执行过程中出现了意外或其他特殊情况。管理运维成员可以通过【msg】字段获取具体的执行中断原因,以便快速定位和解决问题。若【code】为0,则表示执行成功,整个流程顺利完成,当日的重置工作已经结束。
    5、在【xc_daily_plan_hook】的初始化阶段,会对【result】进行空数组处理,以便后续记录任务执行的状态和结果。接下来,它将执行一系列业务逻辑,首先是定时清理Redis相关缓存。这项清理工作包括以下几方面:首先,清理每日记录,例如用户行为日志和报警信息,具体操作是调用【clean_redis_key('day:*')】来移除相关键值。其次,进行有序集合的清理,使用【delete_redis_group('sortedset:day_')】来删除相关数据。在处理有序集合时,还会判断当前日期是否为周一、每月1号或1月1号。这是因为有序集合的处理涉及复杂的重置操作。例如,在周一需要将本周的数据清理,并将之前的统计数据划分为上周记录。同样的逻辑适用于每月的1号和每年的第一天,以确保统计数据的准确性和可靠性。这种处理方式不仅保证了数据的及时更新和清理,还确保了统计信息的有效性,为后续的数据分析和决策提供了可靠的基础。这种周密的设计使得【xc_daily_plan_hook】能够高效地管理和维护系统中的关键数据,为系统的稳定运行和用户的良好体验提供了重要支持。
    6、为了提高【delete_redis_group】方法的性能,对其进行了重构优化。该方法负责处理Redis缓存,通过使用SCAN命令自动获取所有以指定【$prefix】开头的键名,然后执行删除操作。然而,之前的实现采用了逐个执行DEL命令的方式,这在处理大量任务时会导致严重的性能瓶颈,处理时间过长,影响系统的效率。因此,重构后的方法在获取所有键名队列后,将这些键名合并到一个待删除数组中,随后进入Pipeline模式。通过将DEL命令添加到Pipeline中,系统能够一次性执行所有删除操作。这种优化方式显著减少了命令执行的次数,通过单次命令的执行即可完成所有键名的删除请求,避免了逐一处理的低效问题。这种批处理方式不仅提高了Redis操作的速度和效率,还有效降低了系统资源的消耗,使得任务执行更加流畅和高效,为系统的稳定运行提供了更强的支持。通过这种优化,【delete_redis_group】方法能够更好地满足高负载下的缓存清理需求,确保系统性能和响应速度的提升。
    7、在使用【delete_redis_group】进行Redis键名组清理时,为了避免因并发执行导致的重复发起和进程冲突,系统引入了一种上锁机制,作为进程锁,以确保任务执行的安全性和可靠性。该锁通过系统内部方法进行管理,其标识基于传递的【prefix】(前缀名称),并设置了10秒的有效期。在上锁保护期内,同一时间仅允许一个清理任务进行执行,从而避免了因多任务同时操作而可能引发的数据不一致或资源竞争问题。当清理任务完成后,系统会主动释放进程锁,以确保后续的请求能够顺利进入并继续处理。通过这种机制,系统能够在保证任务执行顺序的同时,最大限度地减少并发冲突的风险,从而提升任务的可靠性和稳定性。这种上锁设计为高并发环境下的任务调度提供了有效保障,使【delete_redis_group】方法在多任务场景中依然能够高效、安全地完成清理工作。
    8、在【xc_daily_plan_hook】的执行过程中,除了通过【delete_redis_group】进行用户缓存参数的清理外,还会调用【daily_plan_user_meta】来重置用户资料字段。这一方法通过【wpdb】执行SQL语句,将一系列用户自定义字段重置为0。这些字段包括:用户在线状态【online】、每日回收申请次数【apply_day】、短信每日验证次数【phone_day】、异地登录短信提醒次数【xc_day_login_security】、今日消息总数【today_msg】、用户今日发送消息记录【send_msg_times】、用户私信发送图片次数【day_im_image】、用户私信发送视频次数【day_im_video】以及今日用户下载视频次数【video_download_today】。通过重置这些字段,系统能够在每日任务中清零用户的相关操作计数,从而确保用户的使用记录能够在新的一天得到准确的统计和管理。
    9、在【xc_daily_plan_hook】完成Redis相关清理操作后,还需要对WebSocket产生的【client_id】进行清理。宫论的WebSocket逻辑设计高度优化,在绝大多数场景(约99%)下,能够在用户离线或断开连接时自动清理【client_id】,确保连接状态的准确性。然而,在某些极端环境下,例如设备意外断电或网络突然中断,用户的【client_id】可能无法及时清理,导致前端(APP或网页端)出现状态异常——用户实际上已经离线,但系统仍标记其为在线。这种异常状态会影响前端的判断逻辑和用户体验,因此需要额外的清理机制来解决。为此,将这一清理动作安排到【xc_daily_plan_hook】中进行,通过每日计划任务对滞后处理的【client_id】进行集中清理,确保连接状态的准确性和一致性。此机制不仅能解决因极端情况引发的用户状态异常问题,还进一步增强了系统的稳定性和可靠性,避免因在线状态误判造成的用户困扰和功能异常,为用户提供更流畅的交互体验。
    10、新增【xc_delete_client_id_hook】专门用于清理那些距离上次在线时间已超过30分钟,但【client_id】仍然存在的用户记录。该处理方式相对简单且高效:每当用户通过WebSocket连接时,系统会使用【update_user_meta】更新其【client_id】和【online_status】两个字段,其中【online_status】记录最后的在线时间。如果检测到【client_id】存在,而【online_status】的时间已经超过30分钟,则系统会主动通过【delete_user_meta】进行删除,以确保强制将用户下线。这一机制不仅有助于保持用户在线状态的准确性,还能有效清理因长时间未更新而产生的冗余数据。为了避免误操作,该方法被绑定到【xc_daily_plan_hook】,并仅在每日凌晨触发一次。这样做可以确保清理操作在系统负载较低时进行,减少对用户体验的影响,同时保证数据的整洁和系统的稳定运行。
    11、【xc_daily_plan_hook】目前默认执行的动作包括三个方面:首先是清理与Redis相关的缓存,其次是重置每日需要更新的用户字段,最后是清理因WebSocket意外断开而仍标记为在线的用户状态。此外,系统还支持【xc_corn_plan_group】数组配置,允许通过内置方法挂载后台配置的计划组,在每日00:00时主动触发的函数。这意味着除了默认的三个清理动作之外,还可以在后台定时计划组(00:00清理配置组)中自定义添加一些函数,作为任务扩展的一部分。在完成默认清理任务后,能够顺利触发其他自定义函数,进一步优化系统的整体运行效率和用户体验。
  • 0
    小小乐lv.2实名用户
    2025年7月3日
    1、在【xc_corn_daily_callback】完成对【$corn_daily[key]】的封装处理后,系统会通过【update_option】进行更新操作,将当前任务标记为已完成。这种处理方式确保当【xc_log_daily_warn】验证触发时,系统能够检测到【next_time】已经更新至第二天,从而跳过当天的执行阶段。通过这种机制,任务执行过程能够实现每日仅触发一次,避免重复执行。这不仅优化了任务调度的效率,还提高了系统资源的利用率,确保任务执行的准确性和稳定性。这样的设计对于维护系统的整体性能和确保任务的有效管理至关重要。
    2、通过xc_corn_daily_callback触发回调处理的时候,会触发计数器动作,记录每日固定时间任务的执行成功次数。计数器的标识为(corn_daily_success)统计操作通过xc_redis_count完成,用于记录所有每日固定任务执行。后续可以通过get_redis_count($key)方法获取详细的统计数据。该功能支持多维度查询统计,包括总数、今日、昨日、本周、上周、本月、上月、今年及去年等时间维度,能够全面呈现不同时间段内任务执行情况,为后续分析和管理提供了便捷的数据支持。注:只要触发xc_corn_daily_callback基本就说明任务已完成处理。
    3、【xc_corn_daily_callback】的执行场景是在定时任务顺利完成业务逻辑处理的情况下触发。如果任务执行失败,则需要触发另一种回调处理,记录任务执行失败的原因以及失败次数。这样,系统可以避免陷入无限重复执行的循环,同时允许管理和运维人员通过日志记录了解具体的失败原因,以便进行进一步的修复和调整。执行失败的处理回调是通过【xc_corn_daily_fail】事件来实现的。这一机制不仅保障了系统的稳定性和可靠性,还为问题的快速定位和解决提供了有效的支持。通过精确记录失败信息,运维人员能够更高效地优化系统,确保未来任务的顺利执行。
    4、xc_corn_daily_fail触发的时候需要主动传递一个key变量,这个变量是任务唯一标识,需要通过这个标识去匹配任务场景,如果未提供或者提供的标识与系统不匹配,会造成执行回调错误。除了key在触发错误记录的时候,还需要提供另外一个变量参数msg:字符串类型,任务执行失败是有原因的,比如是接口故障,参数错误,请求异常等等,需要通过msg将任务的执行错误原因同步过来,后续将通过日志或者报警的形式,将错误记录下来,方便运维排查。
    5、为了确保返回结果能够被直接接收和处理,在触发【xc_corn_daily_fail】错误回调时,系统会对【result】进行初始化,将其标记为空数组。后续的处理也遵循标准数组结构进行返回,固定返回值包括【code】和【msg】两个部分。其中,【code】用于表示处理状态:如果返回值为0,表示执行完毕,所有相关的业务逻辑已成功写入并执行;如果返回值为1,则表示处理中断,执行失败。在处理失败的情况下,可能会有多种原因,系统会通过【msg】详细描述具体的错误原因。这种设计不仅确保了返回结果的规范性和一致性,还为问题的快速定位和解决提供了明确的指导,帮助运维人员迅速采取相应措施,以提高系统的稳定性和可靠性。
    6、在触发【xc_corn_daily_fail】事件时,系统会进行一系列基础拦截验证,以确保处理过程的安全性和可靠性。整个验证过程如下:首先,通过【xc_get_option】读取相应的【xc_corn_daily】配置组信息,然后使用【xc_is_config】进行【key】匹配处理,并将返回的结果保存到【daily_group】。接着,对【daily_group】进行验证处理,如果为空,则返回相应的错误信息;如果不为空,则进一步检查【open】字段是否启用,如果未启用,说明任务已停用,此时也会返回错误并终止执行。最后,对【msg】参数进行检查,检测是否存在特殊字符,以防止SQL注入风险等安全问题。只有在上述验证过程中没有发现任何异常的情况下,系统才会进入执行阶段。
    7、在【xc_corn_daily_fail】完成基础验证后,整个处理流程如下:首先检查【corn_daily】是否存在,该参数通过【corn_daily】读取,保存着每个任务的执行进度。如果【corn_daily】不存在,则初始化为一个空数组,并将【$corn_daily[key]['fail']】标记为1,表示第一次失败。如果【corn_daily】已经存在,则在原有的【fail】值基础上进行加1处理,以记录失败次数。接下来,通过【update_option】对其进行更新操作,将执行失败的次数更新到配置组中。这一机制确保了失败次数的准确记录。在后续的【xc_corn_daily_check】中验证任务是否可执行时,会检查【fail】的重试次数,如果达到预设的上限,则系统会主动跳过该任务的处理,以避免重复执行和资源浪费。
    8、如果每日定时任务(该任务类型每天指定事件触发一次,如果触发失败)将会通过xc_corn_daily_fail进行日志写入,记录执行失败的原因。日志的格式为:[时间:' . date("Y-m-d H:i:s") . '] - [执行函数:' . $key . '] - [错误原因:' . msg . '],日志将通过【xc_log_error_warn】来完成处理,确保所有异常信息都能够被系统完整记录并妥善保存。同时该日志仅触发错误记录,并不会触发运维报警机制。完成日志的写入后,将会返回code=0,标记整个执行过程结束。
    9、经过优化处理,【xc_corn_daily_fail】现在通过【xc_get_option】读取【xc_log_daily_warn】配置,该配置设定了每日重试次数的固定计划。系统会检测当前任务的失败次数【$corn_daily[key]['fail']】。如果该次数大于或等于后台设定的值,系统将不再对【fail】进行计数加1处理,而是采取以下措施:首先,将【fail】计数清零,以避免对任务失败次数的进一步累积。接下来,系统会读取当前任务的每日执行时间,并进行格式化处理,以获取对应的时间戳。然后,在该时间戳的基础上增加86400秒(即一天的秒数),将更新后的时间写入【next_time】,确保任务在一天后重新执行。这一优化设计的目的是为了避免任务在同一天内因反复失败而浪费系统资源,同时确保任务能够在后续日期正常进行。
    10、xc_corn_daily_fail完成封装,整个处理流程如下:任务标识验证:检查传入的 key 是否有效,确保任务唯一标识存在且与系统匹配。通过 xc_get_option 获取每日任务配置组信息,并匹配任务场景。验证任务是否启用,若未启用则直接返回错误信息。对 msg 参数进行过滤,确保不存在特殊字符,避免安全风险(如 SQL 注入)。如果 corn_daily 数据不存在,则初始化为一个空数组,并将 fail 计数设置为 1。如果任务已存在,则对当前的失败次数进行累加,并通过 update_option 将更新后的数据保存到系统配置中。重试次数检测:检查当前任务的失败次数是否达到后台设定的重试次数上限(通过 xc_log_daily_warn 配置)。如果达到上限: 将失败计数清零,避免进一步累积。 计算下一次执行时间(当前时间 + 一天的秒数),并更新任务的 next_time 字段,确保任务在第二天重新执行。错误日志写入:通过 xc_log_error_warn 写入日志,记录任务失败的时间、任务标识 (key)、以及失败原因 (msg)。 日志格式为:[时间:...] - [执行函数:...] - [错误原因:...]。 日志用途:仅用于记录失败信息,不触发运维报警机制。标准化返回值: 成功处理:返回 ['code' => 0, 'msg' => '任务失败记录完成']。处理中断:返回 ['code' => 1, 'msg' => '具体错误原因']。
    11、由于新增了【xc_corn_daily_fail】错误回调机制,在任务执行失败时,系统会自动读取后台设置,并在重试次数达到上限时自动重置两个变量:将【fail】设为0,并将【next_time】更新为明天的时间戳。因此,【xc_corn_daily_check】的处理逻辑可以进行优化,不再需要在内部验证【fail】参数。是否具备执行条件只需通过对比【next_time】的时间戳与当前时间戳,符合时间即可允许执行。这种设计简化了任务调度的逻辑,使其更加高效和直接。需要注意的是,由于执行逻辑高度依赖【xc_corn_daily_fail】和【xc_corn_daily_callback】,因此每日固定计划必须严格遵循回调处理,以确保【corn_daily】数组的一致性。
  • 0
    小小乐lv.2实名用户
    2025年7月2日
    1、在【xc_corn_daily_check】功能中新增了一个可选变量【fail】,其默认值为【false】。当将该变量标记为【true】时,意味着本次任务执行失败,将触发错误重试机制。在任务执行过程中,系统会检查【$corn_daily[key]['fail']】是否存在。如果该变量存在,则会对计数器进行【+1】处理,累加本次任务的执行失败次数。通过这种设计,系统能够记录任务失败的频率,并在达到预设的失败次数阈值后,触发相应的业务逻辑处理。这一机制不仅提升了系统的鲁棒性,还为故障恢复提供了一个自动化的解决方案,确保任务在出现异常时能够及时采取补救措施,维护系统的正常运行和稳定性。
    2、在后台系统中新增了一个可选变量【xc_log_daily_warn】,用于灵活控制任务的重试次数。此前,该参数是通过固定值5来定义的,这种设置限制了系统的灵活性。为了满足后续需求,尤其是在调试过程中,开发运维人员需要能够灵活调整该参数,以便任务能够重新执行。例如,当A任务出现执行失败并触发日志写入时,开发人员可以通过修改【xc_log_daily_warn】的设置,来调整任务的重试次数。这种设计不仅提高了任务管理的灵活性,还确保了系统在出现问题后能够迅速进行修复和重试,从而增强任务执行的可靠性。通过允许开发和运维人员动态调整重试次数,系统能够更好地适应不同的业务场景和需求变化,提供更加稳定和高效的服务。
    3、在【xc_corn_daily_check】功能中新增了一个重要的拦截处理机制,以确保任务在执行条件检测时能够安全有效地进行。当系统检测到【$corn_daily[key]['fail']】的执行次数大于或等于【xc_log_daily_warn】时,将会触发拦截机制。此时,系统会直接返回【code=1】,并通过【msg】提示用户:“处理失败:任务当日执行失败次数已超过上限。”这一措施的设计目的是为了防止任务陷入死循环状态,避免其在不具备执行条件的情况下不断触发和执行。通过这种机制,系统能够有效地控制任务的重试频率,防止资源浪费和潜在的系统负载问题。
    4、如果当前任务失败次数已达到系统上限(xc_log_daily_warn),那么除了会返回code=1拦截处理外,还会触发一个日志报警装置,以日志的形式记录任务执行失败情况。具体格式如下:[执行函数] - [' . $key . '] [执行时间] - [' . date("Y-m-d H:i:s") . '] [任务说明] - [' . $name . '] [重试次数] - [' . xc_get_option('xc_log_daily_warn') . ']日志的写入通过宫论通用方法【xc_log_error_warn】进行处理,该方法专门用于错误记录,仅记录相关失败信息,并不会进一步触发报警机制。这一设计旨在为开发和运维人员提供详尽的任务执行失败信息,便于后续分析和问题排查,同时避免因频繁报警影响系统运行或干扰工作。通过该日志记录机制,系统能够清晰地追踪任务的失败原因和重试次数,进一步提升任务管理的透明度与可控性,为后续优化和故障处理提供可靠的数据支持。
    5、在【xc_corn_daily_check】功能中增加了一个至关重要的处理步骤,确保任务在执行的最后阶段能够根据返回的【code】状态进行相应处理。具体而言,如果【code=0】,则意味着任务符合条件并允许执行。在这种情况下,系统会计算出明天的任务执行时间,并将其转换为对应的时间戳,随后写入【next_time】,以确保任务在下次执行时跳过当日的任务处理。而如果【code=1】且执行次数已达上限,系统同样会更新【next_time】到明天的时间戳,以避免当天重复触发任务。通过这一机制,系统不仅能够有效地管理任务的执行频率,还能防止不必要的重复执行,确保资源的合理利用和任务的高效管理。
    6、xc_corn_daily_check完成封装处理,整个执行流程如下:创建一个空数组 $result 用于存储函数的执行结果。获取任务配置和执行记录:corn_daily:从数据库获取当前的任务执行记录。daily_group:从配置中获取每日任务的计划安排。如果 $corn_daily 不是数组或当前任务 $key 没有 next_time,表示任务从未执行过。 遍历 $daily_group 找到匹配的任务配置,获取执行时间 $time 和任务名称 $name。 如果未找到任务配置,返回错误信息 '未找到对应的key,说明任务不存在'。将中文时间格式转换为英文时间格式。 计算当天计划执行的时间戳 $timestamp。 如果当前时间小于计划执行时间,返回 '任务执行周期未到1'。如果任务有执行记录,比较当前时间戳 $timestamp 和下次执行时间戳 $next_timestamp。 如果当前时间小于下次执行时间,返回 '任务执行周期未到2'。如果任务执行失败并且 $fail 为真,增加失败计数。 如果失败次数超过预设的警告次数(xc_get_option('xc_log_daily_warn')),调用 xc_log_daily($key) 记录日志并重置失败计数。 更新失败记录到数据库,并记录日志到指定文件路径。如果所有条件符合,返回 ['code' => 0, 'msg' => '符合执行条件'],表示任务可以执行。
    7、对xc_corn_daily_check进行代码语法优化处理:1、使用 array_filter 和 reset 来获取任务信息,避免了繁琐的循环和条件判断。2、使用 sprintf 来格式化日志内容,使日志的生成更加直观和清晰。3、使用统一的 return 语句来处理不同的返回条件,避免重复代码。4、使用 isset 来检查数组键是否存在,防止未定义数组键导致的错误。5、确保日志记录路径和内容格式正确,使用更具描述性的函数名 xc_log_error_warn。6、在代码开头设置默认返回值 ['code' => 1, 'msg' => '任务执行周期未到'],统一处理返回逻辑。
    8、在执行每日固定计划时,【gl_corn_daily】会通过【xc_corn_daily_check】来验证当前任务是否允许执行,并将验证结果保存到【check】中。如果返回的结果是【code=1】,系统则会跳过本次任务的执行,避免不必要的资源浪费。而当返回【code=0】时,表明任务符合执行条件,此时系统将进一步验证任务的执行方式。如果【$data['asyn']】处于开启状态,系统会通过异步发起执行请求,利用【Swoole】来处理任务,从而提升执行效率和系统响应速度。而如果异步未开启,则任务将通过同步方式执行,确保任务能够按计划稳妥地完成。通过这种灵活的执行机制,系统不仅能够根据实际需求选择合适的执行方式,还能够优化资源使用,提高任务调度的灵活性和效率。这样的设计既增强了系统的适应性,又确保了每日计划的高效实施。
    9、由于每日固定计划中包含错误记录以及执行成功和失败的回调处理,因此需要在每个任务的业务逻辑中增加一个回调处理,以确保其处理状态能够同步到【xc_corn_daily_check】方法中去。如果每个任务都需手动处理这个回调,会导致两个主要问题:首先,每个任务都需要执行相应的业务逻辑,包括写入缓存和更新缓存等操作,增加了开发复杂度;其次,维护起来十分麻烦,若业务层级发生变动,则每个任务都需要进行更新处理,这显然是不理想的。为解决这些问题,系统新增了一个统一的回调方法【xc_corn_daily_ok】,用于集中处理任务的状态同步。此方法不仅简化了任务的开发和维护工作,还确保了任务执行状态的一致性和可靠性。通过【xc_corn_daily_callback】的统一管理,系统能够更高效地处理任务回调,减少冗余代码,提高系统的可维护性和灵活性,为后续的业务扩展提供了更稳固的基础。
    10、在触发【xc_corn_daily_callback】时,必须传递一个固定变量【key】,该变量作为任务的唯一标识,且必须是【xc_corn_daily】配置组的成员。在方法触发时,系统会首先通过【get_option】读取【corn_daily】配置,如果读取结果为空,则会将其设置为空数组,确保后续操作的安全性和稳定性。同时,系统还会通过【xc_get_option】读取【xc_corn_daily】中的相应配置,并对其进行检查。如果【daily_group】为空,则系统将返回阻断处理,以防止无效任务的继续执行。这样的设计不仅确保了任务调用的准确性和配置的完整性,还提高了系统的鲁棒性,防止因配置缺失而导致的潜在错误,从而保障了任务调度的顺畅运行。
    11、【xc_corn_daily_callback】触发后将执行以下步骤:首先,系统会通过【key】遍历每日计划配置,以找到对应的任务。接下来,系统获取任务的执行时间【time】,并通过【str_replace】对其格式进行转换处理,然后使用【strtotime】进行格式化处理,确保时间的标准化。在此过程中,系统还会在原有时间基础上进行加1处理,以更新任务的执行周期。随后,系统会检测【corn_daily】是否存在,如果不存在,则初始化为一个空数组,并对【$corn_daily[key]['number']】进行相同的处理,以确保数据结构的完整性和健壮性。最后,系统封装一个任务数组,其中包含以下参数:首先是【Last_time】,用于记录任务的上次执行时间;其次是【next_time】,用于记录任务的下次执行时间;然后是【number】,用于更新任务的执行次数;最后是【fail】,该参数用于记录执行失败次数,并初始化为1。
  • 0
    小小乐lv.2实名用户
    2025年7月1日
    1、在通过【gl_corn_daily】执行每日固定任务计划时,系统需要对任务计划本身进行严格的检测处理,以确保其未有过执行记录。由于这些任务安排在每日固定时间执行一次,因此系统必须确保每个任务在同一天内只能执行一次。正确的业务逻辑要求首先检测当前时间是否已到达预定的执行时间,例如设定为00:40,则任务仅在00:40或之后才被允许触发。此外,系统需在任务执行后实施上锁保护,以防止同一天出现多次执行的情况。这种上锁机制不仅保障了任务的唯一性执行,还提升了系统的稳定性和资源的合理分配,为运维人员提供了更加可靠的任务管理和监控工具。通过此流程,确保每日固定任务计划能够准确、有效地执行,避免重复执行带来的潜在风险。
    2、鉴于业务的复杂性,系统封装了一个全新的方法钩子【xc_corn_daily_check_hook】,用于检测当前任务是否满足执行条件。该方法在任务执行前进行检查,如果未达到执行条件或当天已执行过,则直接跳过处理。这种设计有效地避免了在不必要的时间段执行任务或出现重复执行的问题。验证方法需要传递一个固定变量:key,该变量作为任务的唯一标识符,确保每个任务的独立性和可追踪性。通过这个key,系统能够准确获取任务的执行情况,判断是否允许继续执行。此机制不仅提高了任务管理的精确性,还减少了资源浪费,为复杂业务环境中的任务调度提供了强有力的支持。
    3、【xc_corn_daily_check_hook】现已设计为返回标准的数组结构,以便上级系统能够直接接收到处理结果。返回的数组包含两个固定字段。第一个字段是code,用于表示处理状态:如果当前任务(key)被允许执行,则code返回值为0,表示任务符合执行条件并且当天尚未被执行过;如果任务不具备执行条件,则code返回值为1。第二个字段是msg,用于传递拒绝执行的具体原因。拒绝的原因可能包括函数不存在、内部错误、任务已执行过、未到执行时间等。
    4、在通过【xc_corn_daily_check_hook】检测任务是否符合执行条件时,系统首先会通过【get_option】读取【corn_daily】当天任务执行的整体情况,并将返回结果保存到【corn_daily】变量。同时,系统会通过【xc_get_option】获取配置任务组名单【xc_corn_daily】,并将返回结果保存到【daily_group】变量。随后,系统会对【corn_daily】和【daily_group】两个变量进行检查处理,如果存在参数错误,则返回对应的错误信息(需要保证返回的结果是数组类型,并且不为空)。因为【corn_daily】和【daily_group】这两个数组将在后续的业务逻辑中发挥重要作用。通过这种预先检查和处理机制,系统能够有效避免因参数错误导致的任务执行失败或其他业务异常,提升整体任务调度的稳定性和准确性。
    5、在执行固定计划任务时,系统会构建一个【corn_daily】数组结构,其中以【$corn_daily[key]['next_time']】的形式记录每个任务的执行周期。如果【next_time】字段不存在,则说明该任务尚未执行过。当任务成功执行后,系统会将【next_time】更新为任务的下一次准确执行时间。通过这种设计,系统在验证任务是否已执行时,只需检查当前时间与【next_time】字段的关系即可。只要当前时间未超过【next_time】,系统就允许任务触发执行;任务触发后,系统会同步更新【next_time】为新的时间点。这样的机制不仅简化了任务执行状态的判断逻辑,还有效避免了任务的重复执行问题,确保任务调度的精准性和业务流程的稳定性,同时提升了系统资源的利用效率。
    6、优化【xc_corn_daily_check】在执行过程中的性能表现,减少频繁的SQL读取操作,系统对【corn_daily】字段的处理进行了改进。此前通过【get_option】或【update_option】操作【corn_daily】字段时,数据是直接从【wpdb】中读取,由于定时任务通常会同时同步请求十几个甚至更多任务,这种频繁的数据库请求容易导致性能损耗,影响整体执行效率。为了解决这一问题,系统引入了Redis作为缓存机制,将任务调度相关的数据存储迁移至Redis。通过Redis进行数据的更新和检测,可以大幅降低数据库的访问频率,同时提升数据的读取和写入速度。这种优化不仅减轻了数据库的负载压力,还显著提高了任务调度的响应效率,为系统的高并发场景提供了更加稳定和高效的支持。
    7、当每日固定计划首次执行时,若【next_time】字段不存在或为空,整个执行流程如下:首先,系统通过【empty】函数检测【daily_group】是否为空;如果任务组为空,则跳过整个执行过程。接着,系统使用【xc_is_config】匹配当前任务的函数名称【key】,以获取对应的任务执行配置信息。如果获取的配置信息为空,则系统返回错误提示(未找到对应的【key】,说明任务不存在),并终止进一步的处理。在成功获取到配置后,系统将从中提取【time】字段(该字段表示执行的时间,格式为00:12),并将其转换为时间戳单位。后续将用到这个单位进行验证。
    8、通过内置方法成功读取【time】时间戳参数后,系统会对其进行转换处理因为于后台配置中的【time】字段是字符串类型,为确保转换顺利进行,系统首先使用【str_replace】进行兼容处理,以避免转换失败。接下来,系统通过【date("Y-m-d") . " " . $time】将时间与当天日期进行拼接,形成完整的时分格式,从而获取精准的时间戳。最后,系统通过【time】进行匹配处理;若获得的时间戳小于当前时间,则返回任务执行周期未到的状态,表明任务尚未满足执行条件。这一流程确保了任务的正确调度与执行,避免了不必要的提前触发,提升了系统的稳定性和准确性。
    9、在通过【xc_corn_daily_check】执行任务时,如果任务已有执行记录且【next_time】已成功写入,则系统会直接读取当前的【time】时间戳,并与【next_time】进行对比处理。如果当前时间大于设定的执行时间,则触发拦截处理,返回结果为【code=1、msg=任务执行周期未到2】,并终止后续执行。这一过程确保了任务不会在未达到执行条件的情况下被错误触发。验证任务是否具备执行条件的关键在于判断当前时间戳是否大于设定的时间戳,以此保证任务调度的准确性和系统的稳定性。
    10、在【xc_corn_daily_check】中增加了fail重试机制,以应对任务执行过程中可能出现的意外情况。当任务执行发生错误时,系统会通过【$corn_daily[key]['fail']】对错误次数进行计数处理,记录错误发生的次数。此时,系统不会更新【next_time】,以确保任务能够在下一次调度时继续尝试执行。然而,如果fail错误连续达到5次,系统将触发报警机制,将任务执行失败的信息记录下来,并更新【next_time】,使任务在次日重新尝试执行。当天的所有执行请求将被跳过处理,以避免重复错误并确保系统的稳定性。这一机制不仅增强了任务的容错能力,也为及时响应异常情况提供了保障,确保系统在面对多次失败时能够有效地管理和调整任务调度。
    11、在【gl_corn_daily】方法中增加了一个Redis上锁保护机制,以确保任务的唯一性和避免重复执行。当通过【xc_corn_daily_check_hook】验证任务是否具备执行条件时,系统会进行一个取锁动作,锁的有效期设定为30秒。如果在这30秒内再次尝试执行验证,则系统会直接返回【code=1】,指示跳过本次定时计划的执行处理。这一措施有效避免了因外部因素导致任务出现重复执行的问题。每日固定执行任务必须严格遵循每日执行一次的标准,避免重复执行,以防止引发一系列错误。
  • 0
    小小乐lv.2实名用户
    2025年6月30日
    1、在执行【gl_corn_execution】方法时,系统会通过【xc_get_option】读取对应的【xc_corn_config】配置,然后使用【foreach】进行遍历循环,对每个任务组进行执行检查。检查的原理主要基于两个关键点。首先,系统会检查$data['open']选项是否启用,这一选项是通过后台配置处理的,任务可以根据需要随时启用或关闭。如果某个任务未启用,则在执行过程中会直接跳过处理,以避免不必要的资源消耗。其次,系统会通过【get_redis_meta】读取缓存key是否存在。如果缓存key存在,则说明该任务可能已经执行过,因此系统会跳过处理,以避免重复执行。这种机制不仅提高了任务调度的效率,还确保了系统资源的合理使用,避免了因重复执行导致的资源浪费和系统负担。通过这些检查步骤,宫论能够实现精准的任务调度,确保各项任务在合适的时间被有效执行。
    2、为了避免异常错误,在【gl_corn_execution】执行宫论定时计划任务时,系统会使用【function_exists】来检查对应函数是否存在。如果发现函数不存在,系统会跳过执行阶段,以防止由于调用不存在的参数而导致系统返回异常错误。这种设计主要是为了解决异步进程可能未同步新方法的情况。在遇到这种异常时,只需对Swoole异步进程进行重启操作即可恢复正常。这一机制不仅提高了系统的稳定性,还确保了任务执行的可靠性,避免了因未同步更新而引发的潜在问题。通过这种预防性检查,宫论能够在复杂的任务调度环境中保持高效运作,减少因系统异常导致的中断和故障。
    3、在通过【function_exists】确认执行的脚本函数存在后,系统会继续验证$data['asyn']选项是否启用。如果启用,说明该方法需要通过Swoole进行异步处理。此时,系统会使用【is】语句检测Swoole环境的存在性。如果Swoole环境存在,系统将跳过转发过程,直接使用【func_name】进行主动处理;如果不存在,则会进行转发处理。需要注意的是,在定时计划任务中,除非必要情况,通常建议采用异步处理方式以提升整体执行性能。然而,如果任务涉及到全局变量或环境变量的处理,而异步处理不支持这些功能,则必须采用同步处理方式。在使用异步处理之前,务必进行充分的测试,以确保系统的稳定性和功能的正确性。通过合理地选择处理方式,宫论能够在性能与可靠性之间取得平衡,确保任务调度的高效和稳健运行。
    4、在【gl_corn_execution】执行过程中,系统会主动触发一个Redis保护锁,通过【xc_lock】进行上锁保护。该锁的唯一标识是当前任务的执行函数名称,其有效期由后台设定为特定的时间秒数。不同任务的限制条件各不相同。上锁机制确保在任务执行过程中,系统可以通过Redis快速判断是否需要继续执行;如果获取锁失败,系统则跳过当前处理,等待下次执行进行验证。这种机制有效地防止了任务重复执行,确保资源的合理利用和系统的稳定性。值得注意的是,之前系统使用【get_redis_meta】来设置保护,但这种方法效率较低,无法满足高效调度的需求。通过引入【xc_lock】,宫论能够在任务调度过程中实现更高效的资源管理和任务执行控制,提升整体性能和可靠性。
    5、在【gl_corn_execution】中新增了日志执行计划统计功能,每当定时计划任务被触发执行时,系统都会将执行记录写入日志中。这一功能使运维人员能够通过日志清晰了解系统的整体执行状况。日志记录通过【xc_log_error_warn】方法写入,日志的唯一标识为【corn_execution_list】。日志格式如下:[时间:' . date("Y-m-d H:i:s") . '] - [执行任务:' . 对应的函数名称 . ']。这种格式使得运维人员可以轻松追踪到某个任务最近的具体执行时间。值得注意的是,gl_corn_execution触发时,会遍历每个任务并触发相应的日志写入,这确保了所有任务执行的透明性和可追溯性,帮助运维人员进行有效的监控和分析,以保障系统的稳定运行和及时调整。
    6、为了有效的统计每日定时计划任务的执行情况,在通过foreach遍历输出任务的时候,系统会初始化一个变量number,默认值为1,每执行一个任务便会进行递增+1处理。当所有的任务都完成后,会获得本次任务的执行数量。然后在最末尾通过redis进行一个计数统计操作,记录定时任务的执行情况。后续可以通过get_redis_count($key)方法获取详细的统计数据。该功能支持多维度查询统计,包括总数、今日、昨日、本周、上周、本月、上月、今年及去年等时间维度,能够全面呈现不同时间段内媒体库文件的删除情况,为后续分析和管理提供了便捷的数据支持。
    7、【gl_corn_execution】的重置工作已经完成,新版本的定时任务执行具备了以下几项显著特性。首先,系统引入了数组结构返回机制,能够返回标准的状态码【code】,并在发生异常错误时进行技术记录,以便后续分析和解决问题。其次,系统整合了Redis内置锁功能,确保任务不会被重复执行,提高了资源利用效率。第三,所有任务优先通过Swoole服务器进行异步处理,这显著提升了任务执行的速度和系统的响应能力。第四,系统强化了日志功能,每当任务执行完毕时,会记录执行时间和任务名称,并将这些信息写入指定的文件中,方便运维人员进行监控和审查。最后,系统还加入了Redis计数器统计功能,将成功执行的任务同步到计数器中,这为任务执行的量化分析提供了可靠的数据支持。这些特性共同构成了一个高效、稳定且可追溯的定时任务执行体系,确保系统能够在高负荷下保持卓越的性能和可靠性。
    8、gl_corn_daily每日固定计划任务重构处理规划,该任务负责宫论每日固定时间执行一次的任务。比如A任务需要00:20执行、B任务需要12:33执行、C任务需要18:51执行。这些每日都需要执行一次的任务,都将通过gl_corn_daily进行触发并执行。但是旧的语法存在很多问题,不具备计时器、日志、异步的业务逻辑,这里需要做好重构处理,以确保高性能、高稳定性、可溯源性的特性。
    9、【gl_corn_daily】下发的每日固定计划任务现已支持数组结构返回处理,这一改进提升了任务执行的透明度和可管理性。在任务执行过程中,如果发生异常错误,系统将返回状态标识code=1,并通过msg字段详细说明具体的执行失败原因,帮助运维人员迅速定位问题并采取适当措施。如果所有任务执行成功,系统则返回code=0,表示任务顺利完成。在执行初始化阶段,系统会对result进行空数组赋值处理,以确保后续返回的数据结构完整性和一致性。通过这种数组结构返回机制,上级可以清晰接收到当前固定计划任务的处理情况,便于进行进一步的分析和决策。
    10、在【gl_corn_daily】执行过程中,系统首先初始化一个空数组result,以便后续存储任务执行结果。接下来,系统通过【xc_get_option】读取【xc_corn_daily】的配置信息。如果读取失败,则表明当前任务场景不存在,系统会跳过整个处理过程,避免不必要的资源消耗和错误发生。若读取成功,系统将任务队列赋值给【xc_corn_config】,然后通过【foreach】进行遍历处理,以确保每个任务都能够被正确触发并执行。此流程设计旨在保证任务的全面执行和高效管理,使运维人员能够更好地监控和调整系统任务,确保系统稳定运行和资源的合理利用。
    11、为了确保每日固定计划的可靠性,通过gl_corn_daily触发任务执行的过程中会使用function_exists检测执行函数是否存在,如果不存在则跳过。因为是队列批次进行处理的,如果函数不存在会导致整个的执行过程出现错误,造成后续的队列任务都失败。因此需要检测当前环境的函数是否存在,如果不存在则跳过处理,避免造成后续的问题。注:通常会造成失败的原因有两个,1、函数名称写错了。2、swoole异步还为支持,需要更新重新swoole脚本服务器。
  • 1
    小小乐lv.2实名用户
    2025年6月27日
    1、在【xc_task_clean_upload】方法中引入了try-catch异常捕获机制,以提高系统的稳定性和可靠性。在执行过程中,如果出现异常错误,系统会通过catch进行监听和处理。这些错误处理涵盖了网络故障、接口异常、执行错误、参数错误、权限不足等多种情况。由于该方法涉及批量请求处理,一旦发生故障或错误,可能会导致整个进程崩溃,进而影响后续任务的执行。因此,通过try-catch来捕获所有可能的错误,并对其进行处理和追踪是至关重要的。这样可以有效地避免因单个任务错误而导致整体进程失败的风险。处理方式包括跳过当前任务,以确保后续任务能够顺利执行,同时也为系统提供了更好的错误日志和追踪机制,帮助快速定位和解决问题。这种设计不仅增强了系统的健壮性,还提高了任务处理的灵活性和可靠性,使得批量处理任务更加安全高效。
    2、在宫论定时计划执行【xc_task_clean_upload】任务时,如果try-catch机制捕获到异常,系统将自动触发日志写入功能。这一功能会将错误信息通过$e->getMessage()记录下来,并写入到【task_clean_upload_error】日志中。在记录日志时,系统不仅保存错误信息,还会记录发生异常的时间、执行文件的地址以及对应的媒体库ID。这种日志写入设计旨在为后续的错误排查提供便利,因此不会触发任何报警机制,而是单纯地记录错误以便技术人员进行分析和解决。日志写入功能由【xc_log_error_warn】来完成处理,确保所有异常信息都能够被系统完整记录并妥善保存。
    3、xc_task_clean_upload在处理完成所有的任务后,会读取number字段,该字段是初始化为0,通过for遍历执行xc_delete_upload_hook请求后,会自动+1。也就是统计当前删除计划的执行成功数量(删除了多少文件)在完成了所有的处理后,系统会触发一个计数器,记录需要任务执行的文件的删除数量。计数器的标识为(task_delete_file)统计操作通过xc_redis_count完成,用于记录所有文件删除的数量。后续可以通过get_redis_count($key)方法获取详细的统计数据。该功能支持多维度查询统计,包括总数、今日、昨日、本周、上周、本月、上月、今年及去年等时间维度,能够全面呈现不同时间段内媒体库文件的删除情况,为后续分析和管理提供了便捷的数据支持。
    4、为了优化宫论定时计划组的调度机制,新增了【xc_corn_plan_group_hook】钩子,该方法位于【function/corn/recurring_task.php】文件中。这一新增方法旨在解决原有计划执行机制的落后问题,通过引入钩子实现灵活的调度和执行。为了确保系统的兼容性,选择在现有基础上新增钩子,而不是直接重构原有执行方法。这种策略允许在充分测试后进行无缝切换,确保整个系统能够一键迁移至新的机制。由于定时计划组是调度中心的核心部分,新增钩子后,我们将对其进行多方面的调整,以适应新的调度需求。后续会逐步适配所有相关功能,确保每个环节都能够稳定运行。
    5、【xc_corn_plan_group_hook】采用标准化的数组结构进行返回,以便上级监听处理能够准确了解任务的执行情况。这种设计不仅提高了信息传递的效率,还增强了系统的透明度和可追踪性。如果当前任务执行过程中出现异常,系统会首先记录错误信息,并启动重试机制以尝试解决问题。若重试仍然无法成功,则会触发报警机制以确保相关人员能够及时处理。返回的数组包含固定的字段,其中【code】作为状态标识,用于判断处理是否成功。具体来说,code=0表示任务执行完成且成功,而code=1则表明执行过程中出现异常。为了进一步了解异常的具体原因,数组中还包含【msg】字段,提供详细的错误信息。
    6、新版本的调度处理逻辑是通过宫论服务器内置的Linux脚本实现的,该脚本每隔1至5秒会请求并触发【WordPress自带的Cron系统】。为了优化性能,宫论系统已经对原生wp-cron作业进行了改造,使得该系统完全通过服务器主动触发,而非依赖来访者被动触发,从而确保任务执行的效率和稳定性。当Cron系统被触发时,会启动宫论定时计划组。这些计划组包括主副锁计划(周期性执行)、固定计划(每日固定时间执行一次)以及间隔XX(秒/分/小时)自动执行的计划组。不同计划组的任务机制各有特点,所有任务调度均通过后台进行配置,可以灵活地启用或关闭。计划组的触发执行依赖于【xc_corn_plan_group_hook】进行调度处理,该钩子会读取后台任务计划,并根据设定的参数检测是否具备执行条件。如果不具备执行条件,则主动拦截以避免资源浪费;如果条件满足,则执行计划。这种调度机制不仅提高了任务管理的灵活性,还确保了各类任务能够在最合适的时间和环境下执行,从而提升系统整体的运行效率和稳定性。
    7、在使用【xc_corn_plan_group_hook】进行任务调度处理时,必须提供一个初始化变量:key。这个参数用于指向后台计划组的具体配置,确保调度的准确性和针对性。目前,系统已经规划了多种计划类型,以满足不同的任务需求。这些计划类型包括:【xc_corn_plan_daily】,用于每日凌晨固定执行计划;【xc_corn_plan_seconds10】,每间隔10秒触发执行;【xc_corn_plan_seconds30】,每30秒触发执行一次;【xc_corn_plan_min】,每间隔1分钟触发执行一次;【xc_corn_plan_five_min】,每间隔5分钟触发执行一次;【xc_corn_plan_ten_min】,每间隔10分钟触发执行;【xc_corn_plan_hour】,每间隔1小时触发执行一次;【xc_corn_plan_thirty_min】,每间隔30分钟触发执行一次;【xc_twicedaily_plan】,每间隔12小时触发一次;【xc_corn_plan_weekly】,每间隔一周(七天)触发执行一次。这些任务类型通过系统内置的Cron机制自动触发和执行,确保在规定的时间内完成任务。通过这种结构化的调度方式,系统能够高效地管理和执行各种计划任务,满足不同场景下的调度需求,提供稳定而可靠的服务。
    8、宫论调度计划处理模块不仅支持定时计划(如每隔一定秒数触发一次),还引入了两个重要的计划类型,进一步增强了任务调度的灵活性和扩展性。首先是【主副锁计划】,它允许周期性执行,每隔XX秒触发一次。这个XX秒是可自定义的,不是固定的时间间隔。例如,用户可以设定A任务每100秒触发一次,B任务每3000秒触发一次,C任务每210秒触发一次。这样的设计使得任务调度能够灵活地适应不同任务的需求和优先级。其次是【每日固定计划处理】,每天在用户自定义的固定时间触发一次任务。例如,用户可以设置00:10触发A任务,03:20触发B任务,13:10触发C任务。不同的任务可以在不同的时间段执行,避免任务集中执行导致系统资源紧张或进程崩溃的问题。通过主副锁计划和固定计划的组合,宫论的任务调度不仅实现了灵活性和扩展性,还确保了任务安排的合理性和高效性,使用户能够更方便地管理和调度各类任务,确保系统的稳定运行。
    9、宫论主副锁计划通过内置的【gl_corn_execution】方法进行触发和处理,其核心执行逻辑依托于Redis来完成。在后台添加主副锁计划时,会设定一个锁的时间(单位为秒),这个时间决定了定时计划的执行周期。具体来说,【gl_corn_execution】会遍历整个任务组,逐一执行每个任务,并对其进行上锁操作。锁的有效期正好是后台设定的时间,这意味着在该时间段内,任务被锁定为执行状态。如果在尝试获取锁时失败,则说明该任务不在当前执行周期范围内,系统会选择直接跳过该任务而不执行。相反,如果获取锁成功,则说明任务处于可执行状态,系统会按计划进行执行动作。通过Redis的处理逻辑,宫论可以确保所有任务按照预定的时间循环执行,避免因资源冲突或任务重叠导致的执行问题。这种设计不仅提高了任务调度的效率,还增强了系统的稳定性和可靠性,使得复杂任务调度变得更加有序和可控。
    10、宫论固定计划 [每日固定时间执行一次]的处理逻辑是通过gl_corn_daily方法进行触发和处理,整个处理的机制:读取后台的固定任务组,并进行for遍历处理。获取任命的唯一标识。然后依次检测是否具备执行条件,具体检测判断如下:$corn_daily:从数据库获取当前的任务执行记录。$daily_group:从配置中获取每日任务的计划安排。如果 $corn_daily 不是数组或当前任务 $key 没有 next_time,表示任务从未执行过。遍历 $daily_group 找到匹配的任务配置,获取执行时间 $time 和任务名称 $name。如果未找到任务配置,返回错误信息 '未找到对应的key,说明任务不存在'。将中文时间格式转换为英文时间格式。计算当天计划执行的时间戳 $timestamp。如果当前时间小于计划执行时间,返回 '任务执行周期未到1'如果任务有执行记录,比较当前时间戳 $timestamp 和下次执行时间戳 $next_timestamp。如果当前时间小于下次执行时间,返回 '任务执行周期未到2'。如果任务执行失败并且 $fail 为真,增加失败计数。如果失败次数超过预设的警告次数(xc_get_option('xc_log_daily_warn')),调用 xc_log_daily($key) 记录日志并重置失败计数。更新失败记录到数据库,并记录日志到指定文件路径。如果所有条件符合,返回 ['code' => 0, 'msg' => '符合执行条件'],表示任务可以执行。注:相对处理逻辑比较负责,确保任务每日执行一次。
    11、宫论的主副锁计划和固定周期计划均被安排在【xc_seconds30_plan】调度处理中,这意味着系统每隔30秒会通过【gl_corn_execution】和【gl_corn_daily】进行一次执行检测。如果某项任务符合执行条件,系统将触发其执行处理;如果不符合条件,则会跳过该任务的处理。为了应对复杂的业务需求和确保进程的安全性,主副锁计划和固定周期计划尽量采用Swoole异步进程进行处理。这种设计旨在防止由于某个任务的崩溃而导致整个执行周期的失败,从而确保任务系统能够按照预期稳定运行。通过异步进程的处理方式,宫论有效地提高了任务调度的灵活性和稳定性,减少了任务执行过程中可能出现的资源竞争和进程阻塞问题,确保了系统的高效运作和可靠性。
  • 0
    小小乐lv.2实名用户
    2025年6月26日
    1、在执行媒体库文件清理动作时,【xc_task_clean_upload】会初始化一个名为result的数组,用于存储处理结果。这个数组采用标准结构进行返回,其中code=0表示操作成功,即文件删除成功;而在删除失败的情况下(如请求异常、权限不足、接口故障、参数异常等问题),返回的code为1,并且通过msg字段提供具体的错误信息。这种设计允许用户通过判断code的值来了解处理结果,从而快速识别问题并进行相应处理。通过这种方式,系统不仅能够有效管理临时文件的清理过程,还提供了明确的反馈机制,以帮助用户监控任务执行的状态和效果,确保系统的稳定运行和数据的安全处理。
    2、为满足灵活性扩展的需求,后台新增了一个字段【xc_upload_delete_time】,单位为分钟。该字段用于控制定时计划任务【xc_task_clean_upload】的处理逻辑。如果文件超过设定的时间还未标记为完成状态,则系统将其视为长时间存在的临时文件,并通过自动计划发起删除请求,以避免临时文件占用磁盘空间。之前,该清理机制固定为48小时,但考虑到未来的需求变化,此字段已变更为自定义参数,用户可以根据实际情况灵活调整时间设置。这一改动不仅增强了系统的可配置性和适应性,还使得临时文件管理更加高效,有助于优化资源使用和提升系统性能,确保系统能够更好地应对不同场景下的存储需求。
    3、为了增强系统的灵活性扩展,标记临时文件的机制进行了优化。除了通过检查state状态是否属于temporary来识别临时文件外,系统还会检查order字段是否存在关联记录。如果没有关联记录,则意味着该文件未绑定到任何商品或文章,也可以被视作临时文件,并通过接口进行删除处理。在初始化阶段,order字段通常为空。当用户发布内容时,上传表单中的图片地址会提交到后端处理,并在发布动作完成后,系统会检索对应的上传媒体库,将文件与order进行绑定,以完成身份标记处理。这一机制确保文件不会在发布后被误删除,提供了更为稳健的文件管理方式,避免了因误判导致的重要文件丢失,同时提升了系统的资源管理效率和操作灵活性。通过这一优化,系统能够更好地适应不同场景的需求,确保数据的安全性和完整性。
    4、xc_task_clean_upload在初始化阶段,会通过global来引入wpdb对象,并构建如下的处理语句:使用 $wpdb->prepare()方法用于安全地构造 SQL 查询语句,防止 SQL 注入。将动态参数(如 type 和 state 的值)通过占位符 %s 和 %d 进行安全替换。2、执行查询:$wpdb->get_results() 方法执行 SQL 查询并返回结果。第二个参数 ARRAY_A 指定返回结果为关联数组格式。3、最后通过get_results() 返回一个数组,其中每个元素都是一个关联数组(或对象),表示一行记录。注:整个执行条件,查询未设置 order 且状态为 temporary 的记录,并且时间加上 xc_upload_delete_time 分钟后仍小于当前时间的记录。
    5、为解决兼容性问题,系统在文件上传成功后,不再通过temporary字段来判断文件是否属于临时文件(即上传后被用户弃用的状态),因为该字段可能导致状态长时间无法被系统正确识别。取而代之的是通过order字段来判断文件是否有关联记录。如果文件存在关联记录,则说明它不是临时文件;若没有关联记录,则被视作临时文件。在用户进行发布动作时(如发布文章、朋友圈、商品上架、评论、申诉等场景),系统需要严格检查提交对象中是否包含图片或视频。如果存在这些媒体资源,则在发布成功后(即获取到订单号或对应文章编号),必须将其与媒体库资源进行关联处理,以防止系统误删这些文件。通过这一调整,系统不仅提高了对临时文件的识别准确性,还确保了重要文件的安全性,避免了误删现象。这种处理方式使得文件管理更加可靠和高效,适应性更强,能够更好地支持多样化的应用场景。
    6、通过xc_task_clean_upload发起媒体库删除请求时候,系统会通过$wpdb->get_results($query, ARRAY_A)来获取是否有具备条件的文件需要处理,如果不存在记录则直接返回code=0,如果存在则通过for遍历整个数组,依次执行宫论通用文件删除计划:xc_delete_upload_hook($id)删除操作中所需的文件ID是通过查询数组提取出来的。删除后,系统对返回结果进行判断,如果删除成功,则会使用一个临时计数器变量来统计此次删除的文件数量。
    7、在处理文件删除动作时,系统加入了一项强验证机制,以确保安全和稳定。首先,系统通过wpdb查询获取的结果,必须经过两个关键验证:一是确认结果不为空(使用empty函数进行验证),二是确保返回的数据是有效的数组(通过is_array函数进行检查)。只有在通过这两个验证后,系统才会执行xc_delete_upload_hook方法,发起删除请求。否则,系统将直接返回code=1并终止整个执行流程。这样做的目的是为了避免未验证的参数直接进入foreach遍历处理,从而导致执行异常。此验证机制尤为重要,因为在任务执行过程中,系统采用的是排队处理状态。如果安全效验处理不当,将可能导致整个计划组出现崩溃现象,进而影响一些定时计划的正常执行。
    8、为了确保执行的高效,xc_task_clean_upload在执行xc_delete_upload_hook处理动作的时候,一律会采用swwoole来发起进程转发出来,将删除动作全部转到异步进程处理。具体处理流程如下:for遍历时通过执行xc_swoole_asyn($functionName, $params = [])来进行转发动作,这样即便是成败上千的删除请求,都可以在一瞬间完成处理。而不会阻塞当前进程。注:在执行过程中系统会检测是否处于异步,如果本身就是异步环境则会跳过处理。之所以采用异步来执行具体任务,最关键的一个因素,定时计划进程触发的时候,可能有多个计划要排队处理,如果这个计划阻塞了进程,会导致后续的排队任务出现执行失败,造成不可预知的问题。
    9、在执行【xc_task_clean_upload】的wpdb查询时,系统特别增加了一项过滤处理,以确保数据的准确性和完整性。具体来说,如果文件的类型为map,则系统会跳过该查询。这种过滤机制是为了解决map上传场景中的特殊需求,即用户在私信聊天时通过发送自己位置坐标给对方,系统会读取到经纬度后,通过接口生成一个相应的地理图片。这些地理图片会存储到服务器,并被标记为type。然而,由于私信聊天的上传没有标记order,因此在删除过程中,如果不对map类型进行过滤处理,可能会导致这些地理图片被误删,从而影响用户的体验和数据的完整性。因此,通过这种过滤处理,系统能够有效防止误删情况的发生,确保用户私信聊天中上传的地理图片能够安全存储,不被清理。
    10、通过xc_task_clean_upload完成了本次删除任务后(文件成功删除数必须大于0),会触发日志写入。记录本次文件删除的具体情况。具体的格式如下[时间:' . date("Y-m-d H:i:s") . '] - [删除文件:' . $remote_file . '] 如果存在多个删除文件,remote_file会以;隔开进行展示。日志写入唯一标识为:task_clean_upload。通过宫论方法(xc_log_error_warn)来完成日志的写入处理动作。注:该日志不会触发报警,只是属于记录存档。
    11、【xc_task_clean_upload】在完成封装处理后,会自动清理临时文件,包括图片、视频、音频等类型。这项任务的执行调度是通过主副锁计划以周期性方式进行,目前设定为每3600秒执行一次。系统使用Redis计划锁来确保任务能够每小时触发一次。虽然该计划尚未开启异步处理,原因在于条数处理尚未完善,但具体的删除动作已经通过Swoole异步来完成。这种设计确保了任务能够在系统调度下稳定运行,不会因为执行时间或系统负荷问题而受到影响。该任务场景已经被加入到定时计划中,完全依赖系统调度进行定时处理,从而实现高效的资源管理和系统维护。
  • 0
    小小乐lv.2实名用户
    2025年6月25日
    1、为了更好地维护和更新脚本方法,upload脚本库中的每个方法都加入了详细的注释功能。这些注释包括对变量的使用、应用场景的描述、返回结构的说明以及该方法的执行流程说明。此外,在注释的下方还提供了完整的使用示例,采用标准的PHP注释方式来处理,确保后期的维护更加轻松。通过这种方式,所有方法都提供了内部执行的注释,使得后期在进行调整和改动时,可以清晰地了解每一步的处理过程。这不仅提高了代码的可读性和可维护性,还为开发者提供了清晰的指导,确保代码的长期稳定性和易于扩展性。
    2、宫论媒体库的文件管理执行流程大致如下:首先,前端通过 upload 发起文件上传请求。在这个阶段,系统会通过计数器等手段来确保用户操作的安全性和可靠性,同时对文件类型和安全性进行严格验证,以确保上传请求的可靠性。其次,经过验证的文件会根据上传场景同步到指定目录,该目录由后台预先设定和配置。接着,系统会读取后台配置以获取远程同步方式,并将上传记录写入到 upload 媒体表中。然后,发起 xc_cloud_upload 上传请求,系统会通过统一方法读取对应的上传记录,并根据上传类型执行相应的同步处理,支持COS、FTP/SFTP等多种方案。完成同步处理后,系统会触发计数器回调逻辑,以确保第三方业务和系统的回调能够得到及时响应。最后,系统将远程同步结果返回给前端,如果上传成功,会附带相应的CDN文件地址。这一流程不仅确保了文件上传的安全性和可靠性,还实现了高效的文件管理和同步,提升了系统的整体性能和用户体验。
    3、宫论媒体库文件的删除执行流程规划如下:首先,通过 xc_delete_upload_hook($id) 发起文件删除请求。在删除过程中,会进行一个安全校验,主要通过 xc_query_upload 进行统一订单查询以获取对应的上传记录。如果传递的不是主键ID,还会通过 xc_is_upload 进行匹配查找。如果查找成功,系统会读取数据表中的【method】字段,并根据返回结果执行不同的删除逻辑。由于系统支持多种远程同步方案,因此不同的远程文件删除需要不同的处理逻辑。然而,总体情况是,系统会首先通过对应的HOOK尝试删除远程或远端文件。如果删除成功,接下来会执行 xc_delete_upload_hook 来删除本地文件。最后,系统直接执行 xc_delete_upload_hook_callback 来触发回调处理,确保整个删除过程顺畅无误。在完成上述所有操作后,系统会返回一个代码,标记文件删除成功。这一流程不仅保证了文件删除的安全性和准确性,还确保了系统的高效运行和用户体验的稳定性。
    4、宫论的规范化处理旨在确保上传和删除操作的每一步都具有可追踪性。为此,upload脚本库中的每个方法都集成了日志写入功能。在执行过程中,如果发生任何异常错误,系统会通过 xc_log_error_warn 方法进行日志记录。日志记录过程中,会详细写入文件地址、媒体库主键ID以及执行过程中遇到的异常错误信息。这样的机制确保了在文件处理出现异常时,能够明确了解错误的具体原因,从而方便运维管理人员及时进行跟进和修复处理。此外,日志的名称是根据函数名来定义的,以便更清晰地定位和查找相关记录。这种详细的日志记录不仅提高了系统的可维护性和可靠性,还为快速响应和解决问题提供了有力的支持。
    5、由于上传和删除操作涉及用户行为,在执行过程中会触及回调响应、接口请求等一系列处理。这些操作由于是同步执行,可能在发生异常时严重阻塞进程,导致用户长时间等待响应,甚至出现未响应的情况。为了解决这一问题,系统进行了优化处理,所有的上传和删除行为都加入了Swoole异步处理逻辑。对于外部请求和回调操作部分,系统采用Swoole服务器转发机制进行处理,从而确保请求不会导致阻塞。这种优化不仅提升了系统的响应速度和用户体验,还增强了系统在高并发情况下的处理能力,确保操作的流畅性和可靠性。通过异步处理,用户能够更快地获得反馈,而系统也能更高效地管理资源和任务,达到性能和稳定性的最佳平衡。
    6、至此,宫论媒体库文件的【上传、删除】两个动作已全面完成封装处理,新版本相比之前有了显著的变化和提升。首先,新版本支持多平台方案,用户可以根据需求指定上传模式,包括FTP、SFTP、COS以及未来可能引入的其他云端上传方案。这种灵活性使得系统可以适应不同的业务需求和技术环境。同时,系统采用标准化钩子来定义每一步的处理逻辑,这样的设计确保了执行过程中的每一步都可以通过外部接管,实现更高的定制化和扩展性。此外,系统引入了日志追踪机制,能够详细记录所有异常行为,确保问题可以被及时发现和处理。这一机制为运维人员提供了强大的支持,能够快速定位和解决问题。最后,大部分处理逻辑支持回调操作和计数器功能,进一步提升了系统的响应能力和操作的可控性。这些改进不仅提高了系统的性能和稳定性,也增强了用户体验和操作的便捷性,为用户提供了更加可靠和高效的服务。
    7、为了解决媒体库文件长期占用磁盘空间的问题,宫论系统计划新增自动清理机制。用户在前端发起图片或视频上传行为后,如果未保存,这些文件作为临时资源会被同步到本地和远程服务器,但由于未启用,它们将永久占用存储空间。此外,当用户或管理员删除一篇文章时,与文章相关联或附属的图片或视频也应同步移除,否则将造成无效的资源占用。随着时间的推移,这类问题会占据相当大的存储比例。针对这些情况,宫论系统计划构建了一套自动清理机制,能够精准标记并清理无用的过期文件和临时文件。该机制通过定期扫描和清理未使用或已删除的资源,确保存储空间的高效利用和系统的长期健康运行。这不仅优化了资源管理,也减少了不必要的存储成本,提升了系统的整体性能和可维护性。通过自动清理,用户可以享受更流畅的操作体验,而系统也能保持良好的运行状态。
    8、宫论系统在数据表【xc_upload】中新增了一个状态字段标识【temporary:临时文件】,以优化文件管理流程。用户通过前端发起上传请求后,文件存储成功会自动将状态标记为temporary。当用户的内容成功发布(提交)后,这个标识会被移除,确保文件的长期保存。如果用户上传了文件但未提交处理,则这些文件被视为临时文件,系统将定期检查这些临时文件的状态。根据计划,若临时文件在超过XX小时后仍未提交标记,将会被系统自动删除处理。这种机制有效地防止了无效图片或文件长期占用磁盘空间,确保存储资源的高效利用。此外,这种管理方式不仅提高了系统的资源管理效率,也增强了用户体验,使用户能够更加专注于内容创建,而不必担心因未使用文件导致的存储冗余。通过定期清理机制,系统能够持续保持稳定和高效的运行状态,确保资源的合理分配和使用。
    9、宫论系统新增了定时清理计划【xc_task_clean_upload】,专门负责处理媒体库中临时文件的清理工作。每当该计划被触发时,系统会通过wpdb构建查询语句,搜索数据表xc_upload中state状态标记为temporary且上传时间超过48小时的记录。如果存在符合条件的记录,系统将启动删除逻辑,对这些文件进行清理处理。临时文件在上传后超过48小时仍未标记为完成状态,通常可以判断为无效文件,因此可以执行删除操作。为了确保数据安全和防止误删,如果对自动删除机制不放心,可以适当延长时间限制,以确保文件确实不再需要。通过这种定时清理计划,宫论系统能够有效管理存储空间,避免无效文件的长期占用。
    10、为了防止重复删除导致请求异常的问题,宫论系统在定时清理计划【xc_task_clean_upload】中增加了一个安全锁机制。在触发执行逻辑时,系统会通过redis进行上锁保护,锁的标识为:task_clean_upload,有效期为60秒。系统通过内置方法进行取锁操作,如果取锁失败则返回异常并终止后续的wpdb查询处理;如果取锁成功,则继续进行下一步操作。这一机制旨在避免因并发请求导致短时间内重复执行处理的情况。通过安全锁的保护,宫论系统能够确保定时清理任务的安全性和稳定性,防止因重复操作引发的系统异常,从而提升系统的可靠性和运行效率。该方法不仅有效地管理并发请求,还保证了文件清理过程的顺利进行,确保临时文件能够及时、安全地清理,维护系统的长期健康运行。
    11、媒体库文件删除钩子【xc_delete_upload_hook】进行了优化处理,以解决之前存在的问题并提升系统稳定性。具体优化内容如下:1、在远程或云端文件成功被移除后,系统会执行方法将本地文件同步移除。之前的代码逻辑存在错误,在执行删除动作时直接调用了【xc_delete_upload_hook】,导致任务删除过程中出现死循环,严重影响系统运行。现已更正为调用【xc_delete_local_file_hook】,从而避免因重复调用引发的系统崩溃问题,确保删除逻辑的安全性和稳定性。2、在完成所有删除操作后,系统会触发一个回调处理,将对应的上传记录状态更新为【delete】,并执行同步缓存刷新操作。状态【delete】表示文件已被删除并不可用,通过标记记录状态和同步缓存刷新,确保系统数据的实时性和一致性。
  • 0
    小小乐lv.2实名用户
    2025年6月24日
    1、在使用 xc_delete_upload_hook 发起文件删除请求时,如果目标是腾讯云对象存储(COS)中的文件,会调用 xc_delete_cos_file_hook($upload['remote']) 方法来进行处理。在文件被成功清理后,该方法会触发 xc_delete_file_hook 回调。然而,这个回调已经被整合到系统的内置方法中,因此直接触发会导致重复回调的情况。为了避免这种重复处理,我们需要对流程进行优化,确保文件删除过程的高效性和系统资源的合理利用。这种优化不仅能提升系统性能,还能减少不必要的处理负担,确保整个文件管理流程更加流畅和稳定。
    2、为了进一步优化 xc_delete_cos_file_hook 的处理逻辑,首先需要对变量进行统一化处理。之前固定传递的变量是 $file,现在将其改为 cdn_url。在所有的上传和删除事件中,基本上都采用了这个命名。这样的统一化处理不仅可以提高代码的可读性和一致性,还能减少因命名不一致而导致的潜在错误。此外,与之相关的方法中涉及调用 $file 变量的地方,也需要全部修改为 cdn_url。通过这样的统一命名,可以确保整个系统在处理文件时具有更高的效率和稳定性,同时也便于后续的维护和扩展。
    3、截止目前已完成封装并重构的上传关联钩子和事件:1、xc_cloud_upload($upload)将文件上传至云存储的函数。该函数用于处理文件上传至腾讯云 COS(对象存储),并更新上传状态。2、xc_hook_upload_remote($key, $local_file, $remote_file)根据协议类型(FTP 或 SFTP)上传文件到远程服务器。3、 xc_upload_hook($id)文件上传请求钩子,此函数根据不同的上传方式(本地、FTP/SFTP、COS)处理文件上传,并更新上传状态。4、xc_uplpad_cos_hook($local_file, $remote_file)将本地文件上传到腾讯云COS的处理函数。该函数使用腾讯云COS SDK将本地文件上传到指定的COS存储桶中,并返回上传结果。
    4、系统已完成封装并重构的删除文件关联钩子和事件:1、xc_delete_local_file_hook($file)删除本地文件的钩子函数。该函数用于根据文件ID或文件路径删除本地文件,并记录删除日志及统计信息。2、xc_delete_cos_file_hook($file)删除腾讯云COS上的文件。该函数使用腾讯云COS SDK删除指定存储桶中的文件,并同步执行本地文件的删除操作。3、xc_delete_ftp_file_hook($key, $remote_file)从FTP服务器删除指定文件。该函数连接到FTP服务器,尝试删除指定的远程文件,并返回操作结果。4、xc_delete_sftp_file_hook($key, $remote_file)从SFTP服务器删除指定文件。该函数使用phpseclib库连接到SFTP服务器,尝试删除指定的远程文件,并返回操作结果。5、 xc_delete_upload_hook($id)根据文件ID或URL删除上传的文件。该函数根据传入的文件ID或URL删除文件,支持本地文件、COS文件、FTP文件和SFTP文件的删除。
    5、为了更好的处理cos文件,已经构造了以下对CDN文件的处理钩子事件。1、xc_cos_cdn_ban_hook($cdn_url)禁用腾讯云COS的CDN缓存。此函数用于通过腾讯云API禁用指定URL的CDN缓存,并在成功时触发CDN刷新。2、xc_cos_cdn_refresh_hook($cdn_url)刷新腾讯云COS的CDN缓存。此函数用于通过腾讯云API刷新指定URL的CDN缓存。3、xc_cos_cdn_thaw_hook($url)启用腾讯云COS的CDN缓存并刷新。此函数用于通过腾讯云API启用指定URL的CDN缓存,并在成功启用后刷新缓存。
    6、所有的上传、管理、删除事件钩子现已统一整合至function/upload.php脚本中进行处理,极大地提升了维护和管理的便利性。所有事件均采用HOOK机制运行,首先确保返回的结构体为标准数组,以此保证事件能够直接接收并响应,尤其是在上级处理发生错误异常时,能够立即中断执行并返回至最上级。此外,日志记录、缓存功能、计数器以及数据回调处理等功能均需按照既定要求进行接入处理,以确保处理过程的一致性。
    7、所有的上传钩子现已全面支持try-catch的处理机制,这一改进确保了异常始终处于可控状态,并且支持以code+msg的数组结构返回处理结果。当在try块中遇到错误时,例如SDK异常、请求故障或参数错误等可识别解析的错误类型,系统会通过throw new Exception将错误转发到catch块中进行处理。此前的处理方式是直接返回code=1和相应的错误消息。此次改进的处理机制旨在更好地适配try-catch结构,提升系统的稳定性和错误处理的灵活性。
    8、在对xc_remove_domain_from_url方法进行结构性优化时,通过parse_url函数解析URL并提取路径部分,该方法在多个场景中广泛应用,尤其是在处理上传事件时,通过文件地址获取对应的媒体库ID。具体处理逻辑如下:首先检测URL的域名是否与宫论的域名一致。为了实现这一点,后台将开放一个字段组,用于集中管理所有宫论的域名,包括CDN域名。接下来,判断解析来源是否与这些域名匹配。如果匹配成功,则通过wpdb进行查询,获取相应的上传记录,最终返回解析后的记录。
    9、xc_remove_domain_from_url函数的返回值被设计为标准的数组结构,而非简单的布尔值true或false。当解析成功并通过wodb获取到相应记录时,函数会返回一个数组,其中包含code=0和msg为“解析成功”的信息。此外,在code=0的情况下,系统还会附加两个额外字段:ID表示在xc_upload上传数据表中的主键值,url则是通过parse_url解析后得到的本地路径信息,已去除域名部分,便于直接对文件进行操作的关键字段。如果解析失败,函数将返回code=1,并附带相应的错误提示信息。
    10、宫论后台的【上传管理配置页面】新增了一个名为xc_upload_cdn_lis_config的字段,该字段用于配置宫论域名与CDN域名列表,支持灵活添加多个域名。当系统同时启用了多个域名时,所有域名都需添加到该列表中,以确保解析过程中能够准确处理。在xc_remove_domain_from_url方法中,系统将通过parse_url方法解析并提取域名信息,然后与xc_upload_cdn_lis_config进行匹配。如果匹配失败,系统将返回code=1,并提示msg=不支持域名地址信息。值得注意的是,该方法专门用于处理宫论相关文件地址的解析,所有站外链接都将被忽略,因此维护好域名列表至关重要,以防止误判和不必要的错误。
    11、xc_remove_domain_from_url完成封装处理,由于该方法采用标注数组结构返回,进行了命名调整,新的版本命名为 xc_Local_domain_resolution_hook。此方法已整合到 function/upload.php 脚本中,并将所有先前的调用位置更新为新版本的钩子。此外,优化了该方法中通过 wpdb 查询匹配上传表的方式。考虑到 wpdb 的 SQL 请求可能影响性能,现改为使用 xc_query_upload($id) 方法来读取上传记录,优先从缓存中获取数据,以提升整体执行效率。
  • 0
    小小乐lv.2实名用户
    2025年6月19日
    1、xc_delete_upload_hook_callback完成了xc_do_action注册动作后,系统会触发一个计数器,记录今日文件的删除数量。计数器的标识为(delete_file)统计操作通过xc_redis_count完成,用于记录所有文件删除的数量。后续可以通过get_redis_count($key)方法获取详细的统计数据。该功能支持多维度查询统计,包括总数、今日、昨日、本周、上周、本月、上月、今年及去年等时间维度,能够全面呈现不同时间段内媒体库文件的删除情况,为后续分析和管理提供了便捷的数据支持。
    2、文件删除成功后,除了会统计文件删除数量外,还会通过计读取数据表的媒体信息,然后获取被删除文件的size的大小,然后使用redis出发计数器将其记录下来。记录服务器删除文件的占用磁盘空间,计数器的唯一标识为【delete_file_size】统计操作通过xc_redis_count完成,用于记录所有文件占用空间总数。后续可以通过get_redis_count($key)方法获取详细的统计数据。该功能支持多维度查询统计,包括总数、今日、昨日、本周、上周、本月、上月、今年及去年等时间维度,能够全面呈现不同时间段内媒体库文件的占用情况,为后续分析和管理提供了便捷的数据支持。
    3、xc_delete_upload_hook_callback方法已完成初步的封装处理,目前作为一个预留事件,预计未来将接入更多复杂的处理逻辑。删除文件不仅仅是简单的操作,它涉及到相关业务的附属处理。目前,该方法已具备标准的处理机制,包括数据库的回调处理、日志记录、计数器触发,以及外部动作钩子的挂载。这些功能为后续的扩展奠定了良好的基础。该方法采用标准的返回格式,在所有执行动作完成后,将返回一个包含code=0和msg=“回调操作已完成”的消息,以确认操作的成功执行。未来,随着需求的增加,我们将继续完善和丰富这一方法的功能。
    4、在完成回调操作后,会启动一个缓存清理过程。具体步骤是调用 xc_query_upload($id, true) 函数,强制执行一次统一媒体库的查询读取流程。此时,第二个参数被设置为 TRUE,表示此次查询需要禁用缓存。在执行过程中,系统会清理掉旧的缓存数据,并通过 SQL 构建查询,将最新的数据库结果保存到 Redis 中。通过这种缓存清理机制,确保后端在使用统一方法进行数据读取时,获得的是最新且可靠的结果,从而避免因缓存问题引发的异常情况。
    5、由于回调钩子涉及到复杂的处理流程,为了防止进程阻塞导致响应时间过长,在进行业务回调时,系统计划采用swoole【宫论异步服务器】方式进行处理,将其转移到异步进程中执行。这种方法能够确保执行过程的响应速度达到最佳。在执行swoole转发请求时,会使用相关的is方法来验证当前的执行环境,若检测到已经处于异步环境,则跳过处理,避免出现重复执行和嵌套调用的问题。通过这种机制,能够有效提升系统的效率和稳定性。
    6、xc_delete_upload_hook在完成回调的处理,整个删除请求就宣告结束。整个流程如下:1、函数开始时初始化一个返回结果数组 $result,其中包含默认的 code 和 msg。初始状态为成功,即 code 为 0,msg 为 '删除成功'。2、检查传入的 $id 是否为数字,确保它是有效的文件 ID。如果 $id 是数字,则通过 xc_query_upload($id) 从数据库中查询文件信息,并将结果存储在 $upload 中。3、如果 $upload 为空,则说明未找到该文件,返回错误信息:'删除失败:文件不存在-01'。使用 xc_remove_domain_from_url($upload['remote']) 提取文件的路径部分,存储在 $local_file 中。4、如果 $local_file 为空,则说明无法获取到有效的路径,返回错误信息:'删除失败:文件不存在-02'。5、根据文件上传方法 $upload['method'],选择适当的删除处理:本地文件:如果方法是 'local',不执行任何远程删除操作,因为本地文件会在后续步骤中处理。COS 文件:如果方法是 'cos',调用 xc_delete_cos_file_hook($upload['remote']) 删除远程 COS 文件。FTP 文件:如果方法是 'ftp',首先获取 FTP 配置,通过 xc_get_option 和 xc_is_config 检查配置有效性。根据配置类型,调用 xc_delete_ftp_file_hook 或 xc_delete_sftp_file_hook 删除远程 FTP 或 SFTP 文件。6、如果远程删除接口返回异常($delete['code'] == 1),则终止执行并返回错误信息。7、调用 xc_delete_local_file_hook($upload['local']) 删除本地服务器上的文件。8、最后,调用 xc_delete_upload_hook_callback($upload) 触发回调,以处理任何后续动作或通知。
    7、通过xc_delete_upload_hook发起删除请求时,目前仅支持通过ID进行参数传递处理,但这样操作起来很不方便。如果前端需要删除某张图片时,获取到的往往只有图片地址。如果要删除该图片,就需要先解析地址,然后再执行删除钩子。现在,这个解析处理集中在钩子内部进行。在初始化阶段,系统会判断传入的ID是否为数字或数字字符串。如果是,则按照原来的流程执行;如果不是,则通过wpdb查询文件地址是否存在于媒体库中,如果存在,则读取其ID,并以此ID作为删除对象进行下一步的处理。
    8、封装了一个名为 xc_is_upload_file 的检查方法。这个方法的主要功能是根据提供的文件地址,检查该文件是否已经存在于数据库的 xc_upload 表中。实现的方式是通过 wpdb 进行数据库查询。具体来说,该方法需要传递一个固定的变量【file:文件的完整路径,包括 HTTP 请求头,例如图片地址或视频地址】。在执行过程中,方法会检查数据表 xc_upload 中的字段 remote 是否与提供的文件路径匹配。如果匹配成功,方法将返回对应记录的数组;如果匹配不成功,则返回 false。
    9、为了提升执行效率,xc_is_upload_file 方法引入了缓存机制。具体实现步骤如下:在方法执行前,系统会构建一个 Redis 缓存键名,格式为 upload: . $file。接着,使用 get_redis_meta 函数检查 Redis 缓存中是否存在该键名。如果缓存存在且值不为空或不为 false,系统将直接返回缓存的结果,从而避免不必要的数据库查询。当缓存不存在时,系统会构建一个 wpdb 查询语句,查询 xc_upload 数据表中与该文件对应的 remote 记录。如果查询成功,结果将被转换为数组并返回。在返回结果前,系统会使用 update_redis_meta 方法将查询结果更新到 Redis 缓存中,以便下次请求时可以直接读取缓存。缓存的有效期设定为30天,超过此期限后会自动释放,以确保缓存的有效性和系统资源的合理使用。
    10、在xc_is_upload_file缓存机制的升级中,对原有设计进行了优化。之前的设计是从媒体库中读取整行记录,并将其以数组形式写入缓存。然而,由于媒体库表中包含info等字段,数据量较大,加之每天的文件上传量可能较高,直接将所有数据写入Redis可能会对内存造成压力。为了改善这一问题,决定仅缓存记录的ID值。如果成功从缓存中读取到ID,则通过xc_get_sql('xc_upload', $id)来获取对应的上传记录,并进行后续处理。值得注意的是,如果返回的是缓存数据,系统会在原有记录中加入cache字段,以标记此次返回结果是通过缓存获取的。这一优化不仅减少了内存使用,还提升了数据读取的效率。
    11、在xc_delete_upload_hook功能中,如果传递的变量【id】不是一个数字或数字字符串,系统会认为可能传递的是文件地址。这时,系统会使用xc_is_upload($id)函数查询数据表,以确认是否存在与该文件地址相匹配的记录。如果记录存在,系统会将结果保存到is_upload数组中,并从中提取出对应的ID主键,继续进行后续处理。在此之前,系统是通过直接使用wpdb进行查询操作,这涉及到一个SQL请求动作。现在,使用xc_is_upload函数处理,增加了一个缓存中间层,这一改进能够显著减少SQL请求次数,从而提升整体的执行效率。
  • 1
    小小乐lv.2实名用户
    2025年6月17日
    1、在系统处理删除请求时,无论是通过FTP、SFTP、COS还是本地(local),都会将处理结果存储在delete变量中。在执行完相应的条件判断后,系统会立即对delete中的code进行检查处理。如果code不存在,则返回“删除失败:接口发生异常错误”。如果code存在,则进一步判断其值是否为code=1。若返回code=1,则表示删除请求遇到了异常问题,此时系统会直接返回原有错误信息,并强制终止整个执行过程。此外,可以通过msg字段了解接口返回的具体错误原因,以便进一步分析和解决问题。
    2、目前,xc_delete_upload_hook功能已经全面支持local、ftp、sftp、cos四种场景的删除请求。对于超出这些场景的请求,系统会直接返回错误信息:“删除失败:当前删除场景($type)目前未接入,请联系管理员进行处理。”这样设计的目的是为了避免因传递不支持的type导致后续处理异常,从而影响整个执行过程的稳定性和可靠性。特别需要注意的是,如果未来新增了新的上传场景,例如第三方云存储如oss、OBS等,系统必须在上传钩子和删除钩子中进行接口扩展,以确保新场景下的上传和删除操作能够准确无误地执行。这样不仅提高了系统的灵活性,也增强了其在多种环境下的兼容性。
    3、一旦接口返回删除成功(code=0),系统会进一步验证upload['method']的值是否为local。若为local,则表示本地文件已经在之前的操作中完成清理,因此无需再进行本地服务器的文件清理动作。若非local上传场景,则会主动触发xc_delete_local_file_hook($upload['local'])函数,以确保本地文件也同步清理。此过程仅负责执行,不会监听删除计划,以防止出现错误或意外情况。如果删除失败,则通过日志进行追溯,以便后续分析和解决问题。此外,为确保数据的彻底清理,远程服务器上的文件删除成功后,必须同步删除本地服务器上的文件。这样可以保证数据清理的完整性和系统的稳定性。
    4、通过xc_delete_upload_hook成功完成了删除文件请求,会在结束后主动触发一个计数器:(delete_upload_ success)统计操作通过xc_redis_count完成,用于记录文件删除的数量。后续可以通过get_redis_count($key)方法获取详细的统计数据。该功能支持多维度查询统计,包括总数、今日、昨日、本周、上周、本月、上月、今年及去年等时间维度,能够全面呈现不同时间段内本地文件的删除情况,为后续分析和管理提供了便捷的数据支持。
    5、新增了一个名为xc_delete_upload_hook_callback的回调钩子,该钩子旨在文件删除成功后,触发相关业务调用。每当该钩子被触发时,会自动传递一个id变量,该变量代表媒体库的主键ID,并对应已删除文件的记录。无论是本地还是远程图片,只要通过xc_delete_upload_hook成功删除,该回调事件就会被激活。此功能的应用范围广泛,可以用于执行多种业务处理,例如向第三方系统发送通知、写入日志、更新缓存、记录系统行为等。目前,该钩子仅支持媒体库中的文件处理,为系统的文件管理提供了更灵活和自动化的解决方案。
    6、为了确保删除文件业务流程的统一性,设计了回调钩子支持数组结构的返回值。这种设计能够让上级在处理过程中全面了解回调接口的处理进度和具体情况。在回调过程中,涉及到数据表的操作,如果处理失败而没有及时响应,可能会被错误地认定为执行成功,从而引发不可预知的错误。因此,返回值需要经过严格处理。返回值中的字段“code”表示处理状态:1表示处理失败,即回调过程中出现错误。这种错误可能有多种原因,具体信息需要通过“msg”字段进行详细分析;0表示处理成功,意味着所有的操作已经顺利完成并通过回调处理。这样的设计不仅提高了错误处理的透明度,也确保了系统的稳定性和可靠性。
    7、在优化处理xc_delete_upload_hook_callback的变量传递时,我们从原先传递ID的方式转变为直接继承上级的upload数组。这种调整旨在减少查询次数,从而提升大量任务执行时的性能。原本的流程需要通过xc_query_upload来读取对应的数据表记录,这增加了查询的负担,影响了响应速度。而通过直接继承upload数组,利用已存在的upload数据,可以避免额外的ID传递与查询过程。在回调方法内,我们仍然会通过$upload['id']来赋值ID变量,以确保后续处理能够顺利进行。这种改进不仅简化了数据传递过程,还提高了系统的效率和响应速度。
    8、在触发xc_delete_upload_hook_callback时,首先执行的动作是记录回调处理。接着,通过xc_update_sql对数据表进行修改,以ID作为唯一标识进行查询,专门处理xc_upload数据表的单行记录,将其状态标记为【delete:文件已被系统删除,请求不可用】。一旦触发回调,系统基本可以确定文件已成功删除,因此需要同步更新数据表的状态,以防止状态仍显示为正常。这是因为许多定时计划任务通过状态来判断文件是否需要删除,如果删除后不进行回调处理,可能导致删除请求被重复执行。
    9、通过xc_update_sql发起回调处理,处理结果将被保存到update_sql变量中,并在之后对其进行返回结果验证。如果SQL执行失败,系统将返回code=1,并通过msg字段返回对应的错误信息;如果执行成功,则返回code=0。为了确保删除请求的正确执行处理,如果SQL写入更新失败,系统将回滚所有操作,包括日志的写入等,以确保下次能正确执行。这可以避免文件被删除后,状态仍保持正常,从而导致前端读取异常。
    10、在xc_delete_upload_hook_callback成功触发数据表回调后,将会记录一条日志,详细记录文件删除的时间。这一日志通过宫论的通用方法xc_log_error_warn进行处理,以确保日志格式和信息的一致性。每条日志都具有唯一标识符delete_upload,记录格式为:[时间:' . date("Y-m-d H:i:s") . '] - [删除文件:' . $remote_file . '] - [删除人:' . xinle_is_login() . '] - [媒体库ID:' . ID . ']。需要强调的是,这类日志的记录仅仅用于保存删除操作的详细信息,并不触发任何报警机制,仅作日后参考之用。
    11、现在,xc_delete_upload_hook_callback功能已经增强,能够支持第三方回调通知的处理。每当完成数据表的回调和日志写入后,系统会通过xc_do_action注册事件,使第三方或外部系统能够通过注册过滤动态钩子的方式接收到文件删除通知。在传递参数时,系统会将文件的ID一并传递。该动作利用Swoole的异步通知机制,将文件删除的消息传递给已挂载的处理方法,同时同步告知相关接口,确认文件已被彻底删除。值得注意的是,文件管理系统在文件上传成功和删除成功时都会进行同步下发,以确保外部接口能够及时响应和处理相关信息。
  • 0
    小小乐lv.2实名用户
    2025年6月16日
    1、xc_delete_sftp_file_hook完成封装处理,该方法用于SFTP远程服务器文件删除请求。整个执行流程如下。1、使用 require_once xc_get_option('xc_sdk_composer'); 引入必要的 SDK。2、使用 xc_get_option('xc_appkey_ftp_config') 获取 FTP 配置数组。遍历配置数组以找到与传入的 $key 匹配的配置项。如果找不到匹配项,抛出异常:删除失败:配置不存在。3、检查配置中的 open 属性是否为空,若为空则抛出异常:删除失败:应用场景已被管理员关闭。检查配置中的 type 是否为 'sftp',如果不是则抛出异常:删除失败:协议不支持sFTP。4、创建 phpseclib3\Net\SFTP 对象,使用配置中的 ip 和 port。使用 $sftp->login($config['user'], $config['pass']) 尝试登录。如果登录失败,设置结果代码为失败并返回错误信息:删除失败:无法通过凭据连接到SFTP服务器。5、使用 $sftp->delete($remote_file) 尝试删除文件。如果删除失败,设置结果代码为失败并返回错误信息:删除失败:无法删除文件。6、如果文件删除成功,设置结果代码为成功并返回成功信息:删除成功:文件已从服务器移除。记录日志信息,包括时间、删除的文件名和删除人的信息。使用 xc_log_error_warn('delete_sftp_file', $log) 记录日志。7、使用 try-catch 块捕获异常,设置结果代码和消息:删除失败:异常(...)。8、返回 $result 数组,其中包含操作的状态码和信息。
    2、在xc_delete_sftp_file_hook功能中,现已增加对ID主键的支持,使得key参数在传递时可以选择使用删除文件的相对路径或是xc_upload的主键ID值。系统在初始化阶段将使用is_numeric函数来判断传递的参数是否为数字或数字字符串。如果参数为数字,则会通过统一查询方法xc_query_upload来获取对应的记录。此记录已支持缓存设计方案,系统将优先读取缓存结果以提高效率。若缓存读取成功,则将使用$upload['local']作为远程删除的key值进行操作。如果删除操作失败,系统将返回相应的错误信息,确保用户能够及时了解操作状态。
    3、为了实现业务删除操作的统一性(由于删除场景存在多种,不同的上传来源对应不同的上传方式),我们特别封装了一个全新的方法——xc_delete_file_hook。该方法能够自动识别上传场景的来源,然后调用相应的删除钩子来发起删除请求。这样一来,可以避免在每次执行删除任务时,都需要进行繁琐的参数验证处理,而是可以直接通过统一的方法进行处理。原本封装好的钩子也具备自动判断和执行的能力,因此不会对后续的维护产生影响。
    4、xc_delete_upload_hook 方法采用标准数组结构返回结果,以便上级方法能够直接接收和处理返回值。当文件成功删除时,无论在何种场景下的删除请求,都会返回 code=0,这意味着服务器已经成功清理了文件。如果删除操作失败,则统一返回 code=1。导致删除失败的原因可能有很多,例如 SDK 错误、接口异常、参数错误或网络问题等。由于删除操作涉及云服务器、对象存储等不同场景,因此返回的信息可能会有所不同。具体的错误原因可以通过 msg 字段进行判断和处理。
    5、在xc_upload中新增了一个名为upload_method的自定义字段,该字段为【varchar(32)】类型,用于标识当前上传操作的同步方式。在进行文件上传时,系统会自动读取xc_upload_method的配置信息,并在构建上传数据表时,将相应的上传配置记录到upload_method字段中。此举确保了文件上传方式被系统准确保存。当后续需要进行删除操作时,系统会通过读取upload_method字段的信息来确认上传方式,从而执行相应的删除流程,确保远程服务器上的文件能够被正确移除。
    6、在使用 xc_delete_upload_hook 发起文件删除请求时,必须传递一个名为【id】的变量,该变量对应宫论媒体库中的主键ID值,这是此方法所需的唯一ID参数。该方法仅支持删除媒体库数据表中的记录,因为它需要通过 upload_method 字段来判断文件的上传来源。如果需要删除特定的文件,可以直接调用相应的HOOK进行操作。在初始化阶段,系统会通过 is_numeric 函数验证 id 是否为数字或数字字符串,如果验证不通过,系统将返回相应的错误信息,并终止整个执行过程。
    7、在发起删除文件请求时,系统首先会验证ID变量参数,通过xc_query_upload统一查询方法来获取相应的媒体库记录。如果查询成功,结果将被保存到一个名为upload的数组中,后续的所有业务处理都需要依赖于这个数组。如果查询失败,系统将返回一个错误信息:code=1、msg=删除失败:文件数据表记录查找失败。一旦成功获取到upload,系统会读取该数组中的$upload['local']字段,该字段存储的是文件在本地的路径,通常格式为/www/wwwroot/www.acocoa.com/wp-content/uploads/identify/。在后续调用删除方法时,这个路径信息是至关重要的。
    8、新增了一个名为 xc_remove_domain_from_url 的方法,该方法旨在接收一个固定的 URL 变量,并从中去除域名部分,仅保留特定的路径。此方法通过使用 parse_url 函数来解析给定的 URL,解析后返回一个关联数组,其中包含 URL 的各个组成部分,例如 scheme、host 和 path 等。在这个方法中,我们特别关注 $parsed_url['path'],以获取 URL 的路径部分,并最终返回该路径。举个例子,对于链接 链接 wp-content/uploads/consignment/m5eh35b6ctuyj.jpeg。需要注意的是,在执行删除任务时,这种提取路径的方法尤为重要,有助于精准地识别和处理文件路径。
    9、现已对以下方法中涉及的本地路径提取方式进行了全面的重构处理:xc_delete_upload_hook、xc_delete_sftp_file_hook、xc_delete_ftp_file_hook、xc_delete_cos_file_hook、xc_delete_local_file_hook。这些方法现已改用xc_remove_domain_from_url函数来解析【$upload['remote']】字段,以获取相应文件的相对路径。由于直接使用local方法会获取服务器的本地绝对路径,在处理远程服务器时该方法无法使用,会导致路径识别错误,从而引发整体处理异常。通过此次调整,路径解析更加准确,确保了在远程服务器环境下的操作稳定性和可靠性。
    10、如果获取local_file失败,系统会直接返回code=1、msg=删除失败:文件不存在-02。如果获取成功,则会使用$upload['method']来判断上传场景,然后执行对应的删除逻辑。具体判断规则如下。1、如果$upload['method']等于local,则表面上传方式,是同步到本地服务器,并未采用远程服务器或第三方存储,此时会直接通过执行xc_delete_local_file_hook($upload['local'])发起删除动作。如果是cos,则通过xc_delete_cos_file_hook($upload['remote'])发起删除请求。并将返回结果保存到delete数组中,如果delete返回code=1则会直接返回对应的msg,并终止整个执行计划。
    11、当$upload['method']等于FTP时,上传场景可能涉及到ftp或FTP协议,这需要进行进一步解析以确定具体的上传方式。具体操作步骤如下:首先,读取后台配置项xc_upload_ftp_method,以获取FTP上传的配置KEY。接下来,使用xc_is_config函数解析配置数组xc_appkey_ftp_config,并根据KEY进行匹配处理。一旦成功获取到对应的配置信息,需要解析其中的type字段以确定上传协议的类型。如果解析结果为ftp,则调用xc_delete_ftp_file_hook执行删除操作;如果解析结果为sftp,则调用xc_delete_sftp_file_hook进行删除处理。
  • 0
    小小乐lv.2实名用户
    2025年6月13日
    1、通过xc_delete_ftp_file_hook发起远程服务器的文件清理,现支持通过ID主键方式传参处理remote_file变量,而不是支持直接传递路径地址。系统内部将进行参数验证处理,使用is_numeric函数检查变量是否为数字或数字字符串。如果验证通过,则利用统一查询方法xc_query_upload进行查询处理。若查询结果为空,则返回错误信息:“删除失败:统一查询获取记录失败”。查询成功后,将读取【$upload['local']】并以此参数进行赋值处理,从而确保文件清理操作的准确性和安全性。
    2、在规范化处理方面,针对xc_delete_local_file_hook(本地文件删除请求钩子)和xc_delete_cos_file_hook(COS存储桶文件删除请求钩子)进行了适配兼容处理。删除变量remote_file现支持通过ID主键进行查询,并允许使用is_numeric函数判断其是否为数字或数字字符。如果判断结果为数字,则通过xc_query_upload函数进行查询处理。若查询成功,则将返回的$upload['local']作为删除对象,执行删除操作;若查询失败,则返回相应的错误信息。通过这种方式,进一步提升了删除请求的准确性和处理效率。
    3、新增SFTP远程服务器文件删除钩子:xc_delete_sftp_file_hook,负责将远程SFTP服务器的文件删除处理,该方法需要传递两个固定变量。首先是key,该变量用于匹配配置的键,与后台账户配置信息相关。通过key可以读取xc_appkey_ftp_config配置,并从中提取对应的SFTP账户信息。其次是remote_file,这个变量代表远程文件的路径,即需要删除的文件的具体地址。特别需要注意的是,由于上传接口的多样性,我们支持多个平台的上传操作,因此在删除文件时也必须支持多种渠道,以确保文件的一致性和完整性。在执行删除操作时,可以对对应服务器上的文件进行彻底清理,以维护系统的整洁和数据的准确性。
    4、在执行xc_delete_sftp_file_hook之前,会初始化一个空数组$result。这个钩子在处理SFTP远程服务器的文件删除请求时,采用标准化的数组结构进行返回,以确保接口的一致性和可用性。返回结果中必定包含两个关键字段:code和msg。code字段用于指示删除操作的状态,其中0表示文件删除成功,文件已从远程服务器上彻底移除。而1则表示删除操作失败。导致删除失败的原因可能多种多样,包括权限不足、SDK异常、接口错误、参数错误、网络故障等。具体的错误原因可以通过msg字段来获取,从而为上层应用提供明确的错误信息和处理指引。
    5、在通过钩子触发SFTP服务器上的文件删除操作之前,系统会使用require_once命令加载【xc_sdk_composer】项目包。这一步骤的目的是确保当前执行环境能够顺利加载phpseclib3库,以便后续的SFTP请求处理能够顺利进行。如果在加载过程中出现异常,系统将返回相应的错误信息并终止整个执行流程,以确保不会进行任何不安全的操作。一旦加载成功,系统会执行phpseclib方法的初始设置,以保证接下来的处理步骤能够获得有效的支持,从而顺利完成文件删除任务。
    6、在成功加载xc_sdk_composer之后,SFTP删除钩子会立即调用xc_appkey_ftp_config以读取后台远程服务器的账户配置信息。系统通过KEY进行配置匹配以获取相应账户的信息。如果匹配失败,系统将返回错误信息:“删除失败:配置不存在”。匹配成功后,系统会进一步验证config['open']的状态是否为启用。如果返回false,系统会提示“删除失败:应用场景已被管理员关闭”。在启用状态下,系统还会检查config['type']是否为sftp协议。如果类型不为sftp,系统将返回错误信息:“删除失败:协议不支持sFTP”。
    7、一旦通过xc_is_config读取到对应的配置信息后,会将其复制到$config,如果检测通过的话。则会立即通过new phpseclib3\Net\SFTP($config['ip'], $config['port']);发起远程SFTP服务器的链接请求,其中$config['ip']是远程服务器的IP地址,$config['port']是对应的端口号信息,这两个参数都是后台继续配置处理,这里直接读取即可。并将连接结果保存到sftp对象,随后会进行检查,如果链接失败则终止处理,并返回对应的错误信息。
    8、在成功获取到 SFTP 对象后,意味着服务器请求是正常的。此时,将通过 $sftp->login(config['user'], config['pass']) 发起登录请求,其中 config['user'] 是 SFTP 的登录账户,config['pass'] 是 SFTP 服务器的登录密码。如果登录失败(即账户密码鉴权失败),系统将返回错误信息:“删除失败:无法通过凭据连接到 SFTP 服务器”。需要注意的是,SFTP 服务器的登录过程是通过 SSH 账户和密码进行的,因此必须对账户进行严格的安全评估。通常,这类服务器仅用于存储文件,建议不要将业务逻辑放置其中,以防止信息泄露带来安全隐患。
    9、xc_delete_sftp_file_hook通过账户密码凭证成功登录到SFTP服务器后,则会立即使用$sftp->delete($remote_file)向服务器发起文件删除请求。此请求会进行严格的验证处理,以确保文件的确被从服务器移除。如果文件删除操作成功,系统将返回一个响应,其中包含code=0以及msg=删除成功:文件已从服务器移除的消息,确认文件已成功删除。如果文件删除操作未能成功,则系统返回code=1,并附带msg=删除失败:无法删除文件的消息,提示用户删除操作未能完成。
    10、为了确保返回结果的一致性,并避免在执行或加载过程中出现SDK或phpseclib3无法响应的异常错误,xc_delete_sftp_file_hook采用了try和catch结构来处理错误。在执行过程中,所有错误,包括自定义错误和内部错误,都会通过throw new Exception抛出到catch块中进行处理。在catch块中,系统会统一返回code=1,并通过e->getMessage()来传递具体的错误信息,从而确保错误信息的准确传递和问题的快速定位。
    11、在成功通过 xc_delete_sftp_file_hook 发起远程文件删除操作后,为了保证操作的可追溯性,将删除记录以日志的形式记录下来。这样一来,若日后出现误删等问题,可以通过日志进行详细的追查和溯源。日志记录使用宫论的通用方法 xc_log_error_warn 来处理,确保其格式和一致性。每条日志的唯一标识符为 delete_sftp_file,记录的格式为:[时间:' . date("Y-m-d H:i:s") . '] - [删除文件:' . $remote_file . '] - [删除人:' . xinle_is_login() . ']。值得注意的是,此类日志的写入仅用于记录,并不会触发任何报警机制,仅仅是单纯的保存删除操作的记录,以备不时之需。
  • 0
    小小乐lv.2实名用户
    2025年6月12日
    1、在使用xc_delete_cos_file_hook删除COS对象存储中的文件时,系统会自动触发【xc_delete_local_file_hook】,从而同步删除本地文件。这一机制确保了文件的一致性管理,避免出现远程服务器上的文件被成功清理后,本地文件却未同步删除的情况。通过这种操作,可以有效防止由于本地文件未及时清理而导致的数据冗余或存储空间浪费。通常情况下,一旦远程文件不再需要保留,相应的本地文件也应该被及时处理,以确保整个系统的文件管理更加高效和规范。
    2、为了更好地维护上传相关的钩子代码,我在宫论项目库中新增了一个名为upload.php的脚本,该脚本位于:function/upload.php。通过将所有的上传行为(包括但不限于附属脚本,如删除脚本、回调脚本、日志脚本、同步脚本等)整合到一起进行处理,我们可以大大简化管理和维护的复杂度。这样一来,所有与上传相关的操作都可以直接在upload.php中进行查找,避免了过去需要在hook.php和function.php中翻找的繁琐过程。随着项目的进一步扩展,这种集成方式将有效防止代码变得过于庞杂,确保系统的可维护性和清晰度。
    3、新增了一个名为xc_delete_ftp_file_hook的钩子,专门用于处理远程FTP服务器上的文件删除操作。此方法需要接收两个固定的变量:首先是key,该变量用于匹配配置的键,与后台账户配置信息相关。通过key可以读取xc_appkey_ftp_config配置,并从中提取对应的FTP账户信息。其次是remote_file,这个变量代表远程文件的路径,即需要删除的文件的具体地址。特别需要注意的是,由于上传接口的多样性,我们支持多个平台的上传操作,因此在删除文件时也必须支持多种渠道,以确保文件的一致性和完整性。在执行删除操作时,可以对对应服务器上的文件进行彻底清理,以维护系统的整洁和数据的准确性。
    4、为了确保业务流程的统一性,在发起FTP文件删除请求时采用了xc_delete_ftp_file_hook方法,该方法的返回结果遵循标准的数组结构。这一结构中包含两个固定值:code和msg。其中,code用于指示处理状态,当返回值为1时,表示删除操作未能成功。失败的原因可能多种多样,例如文件不存在、缺乏删除权限、FTP连接失败或请求异常等。具体的错误信息可以通过第二个变量msg来获取。如果删除操作成功,则返回的code值为0。采用这种标准化的数组结构返回结果的目的是为了确保上级在接收到结果时能够直接进行处理,而无需额外的解析步骤,从而提高处理效率和准确性。
    5、在执行xc_delete_ftp_file_hook的整个流程中,首先需要通过xc_get_option函数来读取后台FTP账户的配置信息【xc_appkey_ftp_config】。如果读取失败,系统会立即返回相应的错误提示;若读取成功,接下来将通过xc_is_config进行匹配,以确保传递的key能够获取到对应的账户信息。如果传递的key无法获取到相应的配置,则会返回“上传失败:配置不存在”的错误提示。在确认配置存在之后,系统还会进行两个额外的检查。首先,检测open是否启用,如果该功能被关闭,则会返回“上传失败:应用场景已被管理员关闭”的提示。其次,系统会检查上传协议是否为FTP,因为FTP和SFTP的配置是共享的,因此需要进行识别处理以确保协议正确无误。通过这些步骤,确保文件删除操作的安全性和准确性。
    6、如果成功取得config配置信息后,系统会通过ftp_connect来链接服务器,请求过程中会读取到【$config['ip']服务器地址IP, $config['port']对应的端口号信息】并将请求结果赋值到conn_id,随后会对conn_id进行验证处理,如果验证失败则说明请求失败,此时系统会返回错误:删除失败:无法连接到FTP服务器。。如果连接成功,则会通过ftp_login发起登录请求,登录会用到以下参数:$conn_id服务器对象信息, $config['user']登录的账户, $config['pass']登录的密码,并将登录结果保存到login_result。
    7、通过xc_delete_ftp_file_hook发起FTP文件删除请求的的时候,如果login_result获取失败,则会触发错误删除失败:无法通过凭据连接到FTP服务器。同时会通过ftp_close($conn_id);关闭本次链接请求,防止内存泄露。如果登录成功的话,则会立即执行【ftp_pasv($conn_id, true);】将当前模式切换到被动模式,这是一个兼容保护,很多FTP服务器仅支持被动模式,如果不及时切换可能会导致意外断开。造成后续的事件处理异常。
    8、login_result如果返回链接成功后,系统会立即执行ftp_delete方法来删除文件,删除过程中需要用到【$conn_id服务器链接登录对象, $remote_file:需要删除的文件地址】。若删除操作失败,系统会返回错误信息:“删除失败:无法删除文件”;而如果删除成功,系统则会返回code=0,并附带消息:“删除成功:文件已从服务器移除”。无论文件删除操作是否成功,系统都会执行ftp_close($conn_id)以关闭FTP连接,确保资源的正确释放。
    9、在通过xc_delete_ftp_file_hook发起FTP文件删除请求时,为了确保服务器返回的响应能够被准确识别,该钩子机制采用了try-catch结构来处理和监听异常错误。在执行过程中,如果出现任何错误,系统会统一通过throw new Exception来抛出异常,所有的错误信息则通过catch块来捕获并进行响应处理。这样设计的目的是确保无论发生何种错误,系统始终能够返回一个统一的错误提示结构,即code=1和msg=$e->getMessage()。这种结构不仅便于错误信息的统一管理和处理,也使得在判断文件是否成功删除时,只需简单地通过code进行判断即可,从而提高了系统的稳定性和可维护性。
    10、FTP文件一旦删除成功,会触发日志写入功能,记录本次文件删除的记录。日志标识为:delete_ftp_file,通过xc_log_error_warn进行写入操作。日志的格式为:[时间:' . date("Y-m-d H:i:s") . '] - [删除文件:' . $remote_file . '] - [删除人:' . xinle_is_login() . ']。该日志不会触发报警机制,只会写入删除记录,方便运维人员查看处理。注:删除人可能为空,因为删除计划可能是通过定时计划执行。
    11、xc_delete_ftp_file_hook完成封装处理,整个执行流程如下。1、函数开始时,初始化一个结果数组 $result,默认状态为失败,并设置默认的失败信息。2、调用 xc_get_option('xc_appkey_ftp_config') 来获取 FTP 配置。遍历配置数组以寻找匹配的配置项,其中键值与传入的 $key 相匹配。如果没有找到匹配的配置,抛出异常并返回错误信息。3、检查配置是否已启用(open 字段)检查配置的类型是否为 ftp。如果这些条件不满足,抛出相应的异常并返回错误信息。4、使用 ftp_connect() 函数尝试连接到指定的 FTP 服务器。如果连接失败,抛出异常并返回错误信息。5、使用 ftp_login() 函数进行登录。如果登录失败,关闭 FTP 连接并抛出异常返回错误信息。6、使用 ftp_pasv($conn_id, true) 切换到被动模式,以处理某些网络环境下的连接问题。7、使用 ftp_delete($conn_id, $remote_file) 尝试删除指定的远程文件。如果删除失败,关闭 FTP 连接并抛出异常返回错误信息。8、成功删除文件后,关闭 FTP 连接。9、如果文件删除成功,更新结果数组的状态为成功。创建日志字符串,包括删除时间、文件名和执行操作的用户。调用 xc_log_error_warn('delete_ftp_file', $log) 记录日志。10、在 catch 块中捕获异常,并将异常消息存储在 $result['msg'] 中。
  • 1
    小小乐lv.2实名用户
    2025年6月11日
    1、对xc_cos_cdn_refresh_hook进行了优化处理。首先,通过curl发起请求并将返回结果存储在response变量中。接着,使用json_decode函数将返回的内容转换为数组结构。随后,通过isset函数检测$json['Response']['RequestId']是否存在。如果该变量存在,则表示缓存刷新成功;如果不存在,则意味着刷新失败,此时直接返回code=1,并提供错误提示内容:“CDN缓存清除失败: 未知错误”。
    2、新增了一个名为xc_cos_cdn_thaw_hook的钩子,专门用于解封那些已经被封禁的CDN文件。之前,一旦对象存储文件通过xc_cos_cdn_ban_hook进行了封禁处理,该文件便会被永久禁用,无法通过外网(CDN节点)进行访问。如果不及时进行解封,文件将永远无法恢复使用。因此,新增的这个HOOK旨在解决这一问题,确保在文件被误判为违规后,能够及时解除限制。该方法需要传递一个固定变量url_cdn,该变量代表对应的CDN加速资源的访问路径。此举不仅提高了系统的灵活性和容错能力,也确保了文件资源的正常流通和使用。
    3、xc_cos_cdn_thaw_hook函数采用标准的数组结构进行返回,确保上级系统可以直接接管并识别处理响应结果。返回的固定值有两个:code用于表示执行处理的状态。如果返回值为1,则表示解封失败,接口返回了错误。此错误可能因多种原因引起,例如权限不足、接口异常、参数错误、文件不存在等。具体的失败原因需要通过第二个变量msg来获取。如果返回code=0,则表示解封成功。注:不管什么样的返回结果,都需要返回code+msg这两个参数。
    4、在初始化过程中,xc_cos_cdn_thaw_hook文件资源解封方法通过调用xc_get_option函数,读取后台设置的相关【腾讯云参数信息】,其中包括【xc_tencent_secret_id、xc_tencent_secret_key、xc_upload_cos_region、xc_upload_cos_bucket、xc_upload_cos_domain】等重要配置。这些参数分别代表腾讯云账户的身份识别ID、访问请求的密钥、对象存储桶所在的地域、存储桶的名称以及用于CDN加速的域名。通过对这些参数的统一封装,后续的API接口在执行解封动作时,能够顺利对文件进行相关操作和处理,确保资源的正常访问和流畅的用户体验。
    5、在执行xc_cos_cdn_thaw_hook的解封操作时,采用API接口而不是集成SDK的方法来发起请求。具体流程如下:首先,我们需要初始化腾讯云后台的相关账户参数,以便生成签名。这个过程中,会获取当前的时间戳和随机参数,并通过base64编码和hash_hmac方法进行签名处理,从而获得授权令牌。接下来,向腾讯云CDN的相关API接口发送请求,并提交生成的签名和需要解封的域名。在收到接口返回的结果后,根据具体响应执行相应的业务逻辑处理。需要注意的是,签名所需的所有参数均通过后台进行配置和处理。
    6、为了确保解封请求能够得到正常的响应处理,与腾讯云CDN接口进行API交互时,采用了curl方式进行处理。具体步骤包括:首先,通过签名机制封装好GET链接【cos_cdn】;然后,使用curl_init函数构建请求,并将返回结果存储在response变量中。为确保请求的有效性,通过curl_errno函数来检测是否存在错误,并在出现错误时返回一个包含code和msg的数组结构。接下来,判断返回结果是否为JSON格式,如果是,则使用json_decode函数将其转换为数组,并将结果赋值给json变量。最后,通过curl_close函数关闭CURL请求,以释放资源。这样一套流程确保了请求的准确性和响应的有效处理。
    7、在xc_cos_cdn_thaw_hook的开发中,引入了try-catch机制,从签名封装到curl返回结果的处理,整个流程都在try块中进行。如果在此过程中发生任何错误,catch块会捕获异常并处理,确保程序的稳健性。当catch捕获到异常时,系统会立即返回一个结构化的响应,其中包含code=1和msg='异常错误: ' . $e->getMessage()。这种设计不仅可以确保任何解封钩子过程中发生的错误都能被有效追踪,还能让上层系统通过判断返回的code来快速确定解封处理是否成功完成,极大地提高了故障诊断和修复的效率。
    8、为了确保接口的稳定性,在使用 xc_cos_cdn_thaw_hook 进行 CDN 资源解封时,我们增加了日志监听来处理错误情况。日志的唯一标识为 cos_cdn_thaw_error,并通过 xc_log_error_warn 方法写入日志系统。日志格式为:[时间:' . date("Y-m-d H:i:s") . '] - [解封资源:' . $url . '] - [错误:' . $e->getMessage() . ']。当系统通过 catch 捕获到异常错误时,会立即触发日志写入,以详细记录此次解封失败的具体原因。值得注意的是,该日志仅用于记录错误,不会触发报警机制,旨在为运维人员提供便捷的故障排查依据。
    9、在成功调用xc_cos_cdn_thaw_hook接口解封CDN资源文件(接口返回成功,code=0)后,将立即触发xc_cos_cdn_refresh_hook方法,以确保所有CDN节点刷新该文件的缓存状态。这一操作至关重要,因为它能够保证解封后的文件实时同步至所有节点,使用户能够及时访问最新的资源。如果不执行刷新动作,已解封的资源可能由于缓存机制的影响,仍需等待数小时才能正常访问。因此,在完成解封后,及时刷新CDN节点是确保用户体验的关键步骤。
    10、xc_cos_cdn_thaw_hook完成封装处理,整个执行流程如下:1、创建一个 $result 数组,用于存储操作结果。默认情况下,code 为 1(表示失败),msg 为“初始化失败”。2、使用 try-catch 块来捕获和处理任何可能发生的异常。3、通过 xc_get_option 函数获取必要的配置信息,包括 secretId、secretKey、region、bucket 和 cos_domain。这些信息用于生成请求签名和构建 API 请求。4、生成请求参数:构建请求字符串 $signStr,包含请求方法、API 版本、操作类型(EnableCaches)等信息。使用 hash_hmac 和 base64_encode 生成请求签名 $signature。5、使用 cURL 初始化请求,设置请求 URL 为 $cos_cdn,执行 cURL 请求,并将结果存储在 $response 中。6、使用 curl_errno 检查 cURL 请求是否出现错误。如果有错误,抛出异常并记录错误信息。7、使用 json_decode 将 $response 转换为关联数组 $json。检查 $json 中是否包含 SuccessUrls,以确定请求是否成功。8、如果请求成功(存在 SuccessUrls),调用 xc_cos_cdn_refresh_hook 函数刷新缓存。9、如果在请求或处理过程中抛出异常,进入 catch 块。记录错误日志,包括时间、URL 和错误信息,调用 xc_log_error_warn 记录日志。
    11、针对腾讯云【COS】对象存储的文件处理方法,所有相关的钩子函数已全面封装,确保文件管理更加高效和安全。具体包括以下几个方面:1、xc_delete_cos_file_hook:这是一个对象存储文件删除钩子,所有的文件删除操作必须通过这个方法进行,以确保操作的规范性和安全性。2、xc_cos_cdn_ban_hook:用于封禁CDN资源的方法。当对象存储中的文件被删除后,必须立即通过此方法封禁相应的CDN文件,以防止节点缓存中仍然存在被删除的文件。3、xc_cos_cdn_refresh_hook:此方法用于刷新CDN资源的缓存请求,通知所有CDN节点对文件进行更新处理,从而清除旧的缓存内容,确保用户访问的是最新的文件。4、xc_cos_cdn_thaw_hook:用于解封CDN资源的方法。在出现误删、误封或误判的情况下,可以通过这个方法解除对CDN节点的封禁状态,恢复文件的正常访问。这些钩子函数的封装,极大地提高了对象存储文件的管理效率,保障了数据的安全性和一致性。
  • 加载更多评论
    单栏布局 侧栏位置: