代码之家  ›  专栏  ›  技术社区  ›  koenHuybrechts

使用Zend框架的计划任务(cronjob aternative)?

  •  0
  • koenHuybrechts  · 技术社区  · 15 年前

    我有一个用PHP(Zend Framework)编写的web应用程序,我想每隔一段时间执行一些脚本。例如每天一次。我知道这可以通过使用crontab和cronjobs来实现,但并不是所有的hostingproviders都有这些功能。因此,我正在寻找一个不使用Cronjob的解决方案。

    你怎么解决这个问题? 有什么可能?

    5 回复  |  直到 15 年前
        1
  •  4
  •   Adrian Schneider    15 年前

    Cron作业实际上只提供一些基本的好处:调度、执行和日志记录。这些都是很容易在PHP应用程序中复制的东西。。。

    第一步:创建任务表

    你需要储存:

    1. 执行频率
    2. 执行什么(包括文件、回调、求值代码等)
    3. 计算下次运行日期
    4. 存储以前的运行日期

    第二步:执行

    对于如何实际触发任务,您有几个选项:

    1. 在每次运行页面时调用PHP生成的空白GIF图像,这将触发cron代码。
    2. 调用运行cron代码的AJAX脚本
    3. 在应用程序中正常调用它(可能会减慢执行速度)

    不管它如何启动,都会触发实际的cron代码,它决定是否有任何任务要运行,以及运行哪些任务。

    第三步:记录

    这个应该很简单。只需将任务期间发生的事情记录到一个文件中,然后您就可以读取该文件,以确保其正常工作。

    ...

    在运行任务之前,您需要更新上一个运行日期;在运行任务之后,您需要根据任务的频率设置下一个运行日期。这种方法的唯一退步是,当没有人访问站点时,在下一个访问者到来之前,不会执行任何cron作业。

        2
  •  4
  •   opHASnoNAME    15 年前

    您可以使用这样的服务:

    CronLess

    将脚本配置为可从外部访问,并让此服务调用url。为了安全起见,您可以使用某种令牌来保护脚本。

        4
  •  0
  •   Community Mohan Dere    9 年前

    我也做过类似的“阿德里安·施耐德解决方案”。如果你想给你的应用程序增加更多的一致性,你可以添加一个接口Cronable,强制实现它的类添加一个cron()函数来处理cron的内部逻辑,这有时是不同的。所有这些都可以通过cron包装器以类似的方式包装和调用,cron包装器将是系统中cron调用的唯一脚本,它将决定当前要执行的PHP cron作业是什么。你可以在我的回复中找到更多的细节 here .

        5
  •  0
  •   Community Mohan Dere    9 年前

    我同意Arne的回答,但是如果您已经在使用zend framework,那么您应该使用内置的zend_队列来实现您的解决方案,这实际上是为此而做的。 要了解如何实现这一点,这里有一个链接,指向描述如何设置基础设施的其他问题。 Infrastructure for Running your Zend Queue Receiver