2011-10-01 70 views
0

我正在尝试创建一个允许我启动和停止PHP脚本的网页。该脚本是站点后端的一部分,需要访问,读取数据,处理数据以及更新脚本所在服务器上的数据库。此外,我希望网页允许管理员查看当前状态(正在运行或已停止),甚至链接到由脚本创建的日志。 我开始走下去学习PHP的exec,passthru和相关函数的路径。这是正确的道路吗?还有其他方法可以做到这一点吗?是否有可能以平台不可知的方式做到这一点?我正在开发Windows中的LAMPP + CakePHP堆栈,并希望在我选择的任何虚拟主机上存在这些功能。从后端管理页面启动和停止PHP脚本

+0

您想运行一个连续运行的脚本吗?或者你想避免他的开始?你在标签列表中提到守护进程是否是这种你想创建的东西? –

+0

我想创建一个可以持续运行的脚本(或者直到我停下来)。我希望能够通过点击网站上的网页上的按钮来启动和停止该脚本。我想坚持HTML,PHP和Javascript(如有必要),我想创建一个平台不可知的解决方案。 – reggie3

回答

3

我在最近的工作中已经完成了这项工作,但这对您来说可能是矫枉过正。我做了一个作业处理器,它基本上在数据库中设置了2个表格,最少2个控制器,最少2个控制器。

第一部分是作业处理单元,它由作业处理器控制器组成,它负责管理启动或继续作业的请求,并附带两个activerow模型JobQueue和Job。你可以删除这个队列,但是在这样的系统中排队是非常实用的,所以你可以说2,3,4个任务可以一次执行。

这个队列只是它的一个插槽,它连接了几个作业,它有一个队列状态来确定它是否正在运行。

作业是一个虚拟对象,映射到描述必须完成的作业表。在我的实现中,我创建了一个必须在被调用的控制器中实现的接口和一个字段+数据库中的一个类型。 Job实例调用控制器类来调用(而不是作业处理器控制器,另一个控制器来管理操作),并调用其中的方法来启动任务处理。

现在,变得棘手,我强迫我的系统在专用服务器上运行,因为我不希望任务加载主服务器或堵塞Apache的处理队列。所以我有两台服务器,我的Queue类负责通过一个IP地址调用另一台服务器上的一个页面来专门在该服务器上运行作业。作业完成后,它会使用HTTP请求重新启动处理并执行下一个任务。如果没有任何工作,那么它就会正常死亡。

这样做的好处是它不需要cronjob(只要你的脚本超稳定并且不会崩溃),因为它在你想要的时候被你触发,然后你可以放手并用fsockopen调用自己以触发另一个触发下一个作业的页面视图。

工作单位

明白,如果你的工作是非常大的,你应该分割他们是很重要的。我使用“工作单位”的原则来描述工作必须进行多次的1个部分。那么队列处理器成为了经理的时间也让他能够检测一个工作比X秒花了,它只会推迟后的剩下的步骤并调用自身回来,继续进行他的。这样,您不需要“设置时间限制”,并且在30秒的脚本执行时不会阻塞服务器。

我希望这有助于!

+0

感谢您的回答。这听起来像我正在做的事情的矫枉过正。我只想执行以下操作:每24小时根据某些条件从我的数据库中选择一些行数,更新数据库中每行的字段,然后在24小时内再次重复。我认为最好的办法是在服务器上连续运行脚本。最后,我希望能够使用管理员可访问的网页上的两个按钮启动该脚本,另外,我希望网页显示脚本的状态(正在运行/已停止)。 – reggie3

+0

你最好的选择是依靠具有cron功能的服务器。每个CPANEL像服务器都有CRON命令,它允许您运行CLI脚本或使用一点wget --remove-after URL让您像脚本一样调用脚本。你也可以使用外部cron,比如http://webcron.org/在你的网站上触发一个脚本,我“认为”它是免费的,我从来没有用过它们...... –

0

要运行的持续运行脚本,你需要考虑到:

  • 你的PHP脚本应该由作业调度比如cron或者其他什么东西被推出,CLI(命令行)。不要忘记,您的Web服务器配置定义了执行脚本的超时。

  • 要每天运行24小时,也许您想象实现无限循环。在这种情况下,您可以编写一个像jobIsActive这样的测试,如果应该执行作业,它可以在每个循环中读入文件或数据库中。如果你点击按钮,只需更改作业状态(更新文件,db ...)。你的两个按钮可以停止治疗或激活它,但不会停止无限循环。

  • 无限循环并不是最优雅的解决方案,为什么不在cron选项卡中编写条目以便每晚执行作业,并且单击按钮可以手动触发它。