后台导出码问题记录及解决

    系统后台提供激活卡的导出功能,之前单次的导出量的需求最多在几万,最近尝试30W次的导出各种出现问题。下面是问题记录和解决。

    问题一:后台点击导出后无反应,经查看日志出现错误Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes) in ***

    分析:内存分配不足导致的错误,在php.ini中默认能够申请到的最大内存字节数是134217728 bytes,如果程序执行时需要更多的内存,就会报错。

    解决:由于这是后台请求,当时也是想先解决问题,通过设置ini_set ('memory_limit', '-1'),设置该接口可申请的最大内存,或者直接修改php.ini中的 memory_limit= 来设置不同的值,但该修改对所有接口有效。出现内存分配不足的原因感觉是php框架导致的,因为每次都会进行select,具体原因待补充。

    问题二:Maximum execution time of ***

    分析:这是由于每次程序的执行都有默认的执行时间,超过这个是金没有返回则会返回超时错误。

    解决:一是直接修改PHP.ini的max_execution_time = **s,但这样会延长所有PHP执行的最大时间;否则使用ini_set('max_execution_time', '0')设置本次执行的超时时间,0表示不限制执行的时间;或者使用PHP的set_time_limit()函数设置,表示最大时间加上设置的时间,在非安全模式或设置了php.ini的超时时间起作用。

    问题三:上一次生成出错后插入数据库提示primary key重复的情况

    分析:orimry key是自动产生的id值,上一次生成时产生的id插入到数据库但是没有更新id_genter,可能是因为php框架在实现id生成时,不是每次都是获取并更新id_gengter而是挡都插入之后在更新或者是最后出错的时机正式子更新id_genter之前,具体待排查。

    解决办法:由于每次都是读取id_genter,因此将id_genter中的id值修改超过当前数据库中的最大值即可。

    问题四:线下生成正常,但在线上出现没有出错但是执行中断的问题。

    分析:原因待排查

    解决:终极方案,直接写脚本从console调接口生成激活码,放弃使用后台web请求。生成用脚本生成,导出从后台导出。

    问题五:在使用激活卡时出现卡多次激活的情况

    分析:经排查发现是在适用激活款之后没有更新卡的状态,但程序中使用了框架的update方法,$codeObj->update(0) codeObj是激活码对应的对象。但这条语句没有执行,原因是在此语句执行之前的操作中框架已执行过commit操作,之后codeObj已经失效,因此并没有更新对应激活码的状态。此为推测。

    解决:不能直接用$codeObj->update(0)换成Dwriter::ins()->update_code_set_status_by_id(0, $codeObj->entityid->id);

    问题六:连续点击偶尔存在激活两次的现象。

    分析:激活流程是 点击发出激活请求-》验证激活码-》加时长-》更新码状态,但由于这是同步的流程,而加时长中会有多次IO操作,造成用时较长,这样当第一次请求还未更新状态第二次请求就会再加一次奖励,因为是并发执行的,因此造成多次激活。

    解决:将更新码状态提前到验证激活码后,先更新状态再加时长,若加时长出现问题则回滚码的状态。

猜你喜欢

转载自wangjixiang.iteye.com/blog/2246443