在上周哈维硬件网改用新的新闻发布平台后,由于暂时的需要,原有的新闻平台并没有彻底停止使用,所以在新平台开始使用后便发现一个让人头痛的问题,网站首页总是被更新为原来的系统内容,最终导致某此新闻链接不能正常访问。新系统对URL做了优化,新闻页面的网址和原系统不同。最初的时候以为是仍旧有人在使用旧的系统操作,可在第二天这样的情况仍旧出现,便想到应当是旧系统的问题,后来检查发现帝国CMS系统有一个默认的刷新首页的任务,取消后网站首页的更新便正常了。
解决这个问题后,我对php任务有了兴趣,以前也有所了解,但却没有真正的去实践,也许是考虑到这个功能对网站系统开发的重要性,所以现在决定研究一下,并编写一套成熟的代码以便于以后应用。
首先是上网查找相关的资料,通过阅读这些资料,知道了PHP任务大体上可以分为三类。
服务器计划任务
WIN服务器可以直接使用定时任务执行相关的应用程序,linux服务器则可以通过在/etc/crontab里添加定时任务来实现。
通过死循环实现任务自动执行
建立一个程序文件页面,通过ignore_user_abort来设置关闭浏览器页面后仍可执行,那么,在运行该程序页面后,您所需要的任务计划便会一直自动执行。对于一般的PHP程序员来说,如果没有足够的把握,这种操作是不被允许的,因为死循环极容易使用服务器当机。
触发式定时任务
在我所了解的几套程序中,像Discuz、帝国CMS等等,均使用这种方式来完成系统的定时任务,相对前面的两种方法,这是最为安全和简单的。
有这么多选择,那么在设计程序的时候应当根据实际的需要选择最为恰当的方式去做程序。下面就用实例做个介绍。
爱上文学网的电子杂志在网站上线不久便制作出来了,这是通过电子邮箱传递的电子杂志,将最新一期的电子杂志发送到订阅用户的邮箱里是一个庞大的工作,单纯的页面批量发送显然是行不通的。主要原因是目前还没有自己的邮件服务器,像新闻、腾讯以及163所提供的邮箱,尽管支持SMTP发送邮件,但却不允许大批量的发送电子邮件,条件有限,那么就只能通过程序来解决这个问题。
首先,我选择触发式定时任务,为了避免发送邮件的程序不影响用户访问网站的体验,主要是打开网站页面的速度,因此选择使用Ajax来实现触发。在公共JS文件里增加触发函数,用户在访问任何页面的时候便可以触发邮件发送任务。
为了限定邮件发送的频率,防止因为过度频繁发送邮件被邮件服务器禁止,在程序上也做了时间的限制,使用RAND随机生成一个等待时间,解决发送邮件不是固定间隔时间,实际上触发模式中间隔时间本来就不确定,但当网站访问量大的时候,还是有可能出现这样的问题,所以加一下这方面的设置还是比较稳妥。
尽管有了上面的一些措施,在实际应用中还是发现会被邮件服务器禁止发送邮件,但不是永久禁止。解决这个问题的办法是建立一个数组,将不同的邮件服务SMTP参数保存起来,当一个邮件服务器不能正常发送邮件的时候,则会自动跳转使用另一个邮件服务器。
在所收集的邮箱地址列表中,会有一些无效的地址,在发送邮件的过程中,如果一次发送不同功,则切换另一个邮件服务器再次发送,如果均不成功,则将这个邮件地址设为无效,以后便不会再向这个地址发送邮件,从而提高邮箱地址列表的有效率,也为下次发送邮件节省了时间。
有朋友说我太小气,在这类日志里分享的代码太少,其实我们上网查资料的时候便会发现,许多网站分享的代码并不一定实用,有时候还会因为参考这些代码而耽误了许多时间,所以我在总结的时候往往总结解决问题的方法,并把关键的技术参数记下,以便于以后再遇到类似的问题自己也有了可以参考的信息。如果你有这方面的问题,可以通过留言、电子邮件和我联系。
作者 快乐男孩 的个人空