Phalcon后台CLI邮件发送及通用脚本进程守护

服务器经常需要使用到一些比较耗费时间,却又不需要太强的用户实时性的任务。例如电子邮件的发送、资源抓取之类的。这些任务转到服务器后台执行相对来说比较有效率。

当前环境:Ubuntu14.04 LTS,Php5.6.7,Phalcon1.3.4

一、Phalcon内部的工作

Phalcon提供了CLI的模块,不过以结果而言基本没用上核心的功能。因为CLI不是面向用户的,就一切从简了。PHP的邮件发送功能使用的是PHPMailer,使用简单,包括Wordpress在内的很多项目都有在使用它。首先要做的是将其包装成Phalcon的一个组件,在Library目录内新建一个组件Mail.php。同时将phpmailer拷贝到这个目录中。

image

当前使用中的代码是这样的:

模块部分就像上面一样就可以了,CLI部分的结构参照官方给出的CLI结构进行。首先写一个通用的cli-bootstrap。所有的CLI都放在一个无法被外部访问的目录比较安全,如果是和我一样仿照Invo的文件结构的话,在根目录新建一个文件夹专门存放CLI脚本即可。当前使用的cli-bootsrap如下。

然后编写需要的邮件发送脚本就好了,邮件需要使用到的图片等文件保存在脚本所在目录。

在上面的代码中没有包含mail模块的注册代码,如果之前没有进行过类似的工作的话,请参考下面的代码:

至此,phalcon内部的操作就算是完成了,手工进行脚本执行就会开始读取数据库并发送邮件。

二、后台执行和进程守护

由于之前并没有进行过这方面的操作,在完成上面的代码之后。发现要让脚本后台执行会遇到不少问题,要保证服务器在大多数情况下都能持续的执行我们想要的操作会有不少未知的问题。虽然Phalcon官方提供了Beanstalk队列的实现,php也有很多Resque这样的队列解决方案,但是在功能代码完成的情况下要再对这些进行修改并且再去学习相关的队列的操作学习的话,时间成本上实在太高。而且我们需要的无间断执行和消息队列的功能设计上也有微妙的差别。在这里犹豫了一段之后,果断决定自己动手,丰衣足食。

好在linux系统上要自己编码的成本还是比较低的。努力回想起关于信号量的知识,参考Google搜索的资料完成了下面的代码。

|2015-0501| – 更新到实际生产环境使用的版本,修复bug,简化代码,删除调试输出。

功能上的一些解释:使用信号量来对进程的状态进行管理,通过读取List.txt中的脚本列表来执行对应的脚本。主guard进程会锁定信号量,防止crontab重复的运行guard进程。信号量的SEM_UNDO参数会使得系统在进程退出时自动清除其锁定的信号量,而ftok会根据文件路径生成一个唯一的token来作为信号量名称。使用wait等待进程的结束信号,在万一的情况下对脚本运行进行恢复。而guard的持续运行则依靠linux的cron服务进行管理。

将代码上传到脚本同一个目录,对其进行编译然后执行,然后使用crontab进行守护即可。对于某些操作不是很熟悉的童鞋可以参考下面的命令:

如果在使用进程查看命令

确定后台没有guard的进程的话,极有可能是和别的进程的信号量冲突了,将代码中guard的信号量修改后重新编译即可。脚本的信号量冲突时对脚本进行重命名即可,同样在操作之前确认下是否有后台进程仍在执行。

crontab相关指令

至此基本的守护操作就完成了,由于不是面向用户的,所以很多地方都以功能实现为主了。

 

本博客所有内容遵循CC BY-NC-SA 4.0协议, 如有转载,请注明出处。
1条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">