cron 作业或 PHP 调度程序

Posted

技术标签:

【中文标题】cron 作业或 PHP 调度程序【英文标题】:cron jobs or PHP scheduler 【发布时间】:2010-11-19 01:50:32 【问题描述】:

我使用 mysql 作为我的数据库,使用 php 作为我的编程语言。我想运行一个 cron 作业,该作业将一直运行到当前系统日期与我的名为“PROJECT”的数据库表中的“deadline(date)”列匹配。一旦日期相同,则必须运行更新查询,这会将状态(项目表的字段)从“打开”更改为“关闭”。

我不确定 cron 作业是否是最好的方法,或者我可以使用触发器,或者可能是其他东西。另外,我使用 Apache 作为我的网络服务器,我的操作系统是 windows vista。

另外,最好的方法是什么? PHP调度程序或cron作业或任何其他方法?有谁能赐教吗?

【问题讨论】:

危险地类似于***.com/questions/1263237/… - 虽然不同之处在于他询问他是否应该使用计划任务或数据库的内部调度程序 还有kaushik - 你有什么版本的mysql服务器? 【参考方案1】:

我总是会为任何与日程安排相关的事情找一个 cron 作业。

最大的好处是您也可以回显信息,然后通过电子邮件发送给您。

你会发现一旦开始使用 cronjobs,就很难停下来。

【讨论】:

但它是如何在网站上完成的?像商业网站一样在 cron 作业的帮助下做到这一点? cron 工作也是最好的方式吗?因为我们可以更改主机,并且可能需要在每次更改主机时进行设置。? 您需要通过主机本身的 shell 帐户进行操作。如果您通过 SSH 连接到您的 Web 服务器,请查明您要运行的 php 文件,键入 crontab -e 然后添加命令,即 */5 * * * * /usr/bin/php /home/youraccount/website/file。 php 那应该每五分钟左右运行一次。在 google 上搜索 crontab 生成器,它们将帮助您微调时间并为您生成命令字符串。在主机之间传输时,您需要保存 crontab: crontab -l > myct.​​txt 在新服务器上,我认为它是 crontab 【参考方案2】:

cron 本身在 vista 中不存在,但存在的是标准的 Windows 调度管理器,您可以使用“php -q -f myfile.php”之类的命令行运行该管理器,它将在以下位置执行 php 文件给定的时间。

你也可以使用 cron 程序的一个端口,那里有很多。

如果对第二个不重要,任何 Windows 调度应用程序都可以,只需确保在 PATH 变量中包含 PHP bin 路径即可。

【讨论】:

【参考方案3】:

PHPscheduler..R 怎么样?它们不比 cronjobs 好?我认为 crons 将独立于应用程序,因此如果必须更改主机会很困难..虽然我不太确定..如果有人可以对此发表评论,那就太好了!谢谢!

【讨论】:

【参考方案4】:

我认为您的概念需要改变。

PHP 不能调度作业,MySQL 也不能。 MySQL 中的触发器在发生 mysql 查询时执行,而不是在特定时间执行。都没有

这个限制在 Web 开发中通常不是问题。原因是您的 PHP 应用程序应该控制所有进出的数据。通常,这仅意味着向用户或其他程序显示该数据或其他格式的 html

在您的情况下,您可以这样考虑。截止日期是一个确定的日期。您可以将其视为数据,并将其保存到数据库中。当截止日期发生时并不重要,重要的是您在数据库中发送的数据被正确查看。

当对您的申请提出请求时,检查截止日期是否过去,如果是,则显示项目已关闭 - 或在显示之前更新项目已关闭。

确实没有理由独立于您的 PHP 应用程序来更新数据。

通常,您想要安排的唯一事情是在负载方面会影响您的应用程序的作业,或者只需要执行一次,或者并发或时间存在问题的作业。

在你的情况下,这些都不适用。

PS:我没有尝试过 PHPscheduler,但我猜它不是真正的调度器。 Cron 是一个守护进程,它休眠直到给定任务在其队列中到期,执行任务,然后休眠直到下一个任务到期(至少在当前算法中它是这样做的)。如果没有套接字和 fork 扩展,PHP 就无法做到这一点,因为这是特殊设置。因此,PHPscheduler 很可能只是在每次加载网页时(每当 PHP 执行页面时)检查任务的日期是否已过期。这与您只检查项目的日期是否已过期没有什么不同,而没有 PHPScheduler 的开销。

【讨论】:

为了使 PHPScheduler 正常工作,您需要启动调度程序以定期检查作业,这是通过在活动页面上放置一些代码来完成的。因此,如果您每小时获得一个页面视图,您可以安排一个作业每小时运行一次,而不是每分钟运行一次。对于至关重要的工作,我不会推荐这种解决方案。【参考方案5】:

对于 Windows CRON 作业,我不能推荐PyCron。

【讨论】:

【参考方案6】:

虽然 CRON 和 Windows 计划任务是计划作业/任务定期运行的久经考验的真正方法,但在某些用例中,在 CRON/Windows 中执行不同的计划任务可能会变得乏味。即当您想让用户安排运行时,或者您更喜欢简单/可维护性/可移植性/等等或以上所有的情况。

如果我不想将 CRON/Windows 用于计划任务,我会在应用程序中构建一个任务计划系统。这仍然需要安排 1 个 CRON 作业或 Windows 任务。这个想法是将作业详细信息存储在数据库中(作业名称、作业属性、上次运行时间、运行间隔,以及对您的实施很重要的任何其他内容)。然后,您在 CRON 或 Windows 中安排一个“主”作业,它会为您处理所有其他作业的运行。您需要这个主作业至少与您的最短间隔一样频繁地运行;如果您希望能够安排每分钟运行的作业,则主作业需要每分钟运行一次。

然后,您可以轻松地从 PHP 后台启动每个计划的作业(如果您愿意的话)。在内存受限的系统中,您可以monitor memory usage 或跟踪 PID(各种方法)并限制在给定时间运行的 N 作业。

我用这种方法取得了很大的成功,但 YMMV 取决于您的需求和您的实施。

【讨论】:

以上是关于cron 作业或 PHP 调度程序的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 队列(数据库驱动程序)+ Cron 作业(任务调度程序)堆叠并且在服务器崩溃后不再发送

如何在线运行 Laravel 调度命令作为 Cron Job

cron 如何在内部调度作业?

使用 aws eb 和 laravel 任务调度的 Cron 作业

Elastic Beanstalk 未调度 cron.yaml 中定义的作业

石英调度程序中每30秒的cron表达式?