2017.12,我在公司开发与维护的iOS包内审系统在上传一个ipa包到苹果ITC后台的时候突然报了一个504错误:
超时了。
这个功能是这样的:我的服务器通过PHP的curl函数库调用公司另一台服务器(专门进行ipa包的审核与上传)的接口,那个接口中再去调用python脚本上传ipa包文件(ipa包文件已经在那台服务器上的)到苹果ITC后台,最后将ITC后台返回的结果返回给我的服务器。
这个功能上传其他ipa包是没问题的,可是上传那个包的时候就报504了。到苹果ITC后台检查的时候发现,其实那个ipa包是上传成功了的,这是因为接口调用了上传包的python脚本之后,python脚本会一直运行直到ipa包上传完成,所以包文件的上传是没问题的,但是由于上传花费时间太长了,nginx等不了那么长的时间,所以就报504错误了。
查看nginx配置文件发现超时限制已经达到5分钟了,一味地调大超时限制可不是好办法,那怎么办呢?最后决定做成异步的,既然nginx等不了那么久,那就不等了!Php调用python脚本之后,将脚本挂载在后台执行并将执行结果输出到文件中(即将执行指令“xxxxxxx”改为“xxxxxxx > ... &”),然后马上返回,告诉用户静待通知。那怎么获得脚本执行的结果呢?写一个定时任务,每隔1分钟就到那个服务器扫描设定目录中的文件内容,若发现已有结果则将结果返回,发rtx消息通知上传操作者,同时将已经读取结果的文件移动到另一个目录,避免重复读取,同时也可作为日志文件,方便查问题。
异步程序运行起来之后,重新上传那个包,发现用了整整18分钟才上传完成,所以修改nginx的超时限制根本不是办法啊!就这样,异步执行程序完美解决了问题,同时也给用户带来了很好的体验,用户完成操作之后便可以先去忙其他事情,有结果了rtx就会发出通知了!