在没有cron的PHP中调度任务

时间:2012-07-04 23:11:33

标签: php ruby-on-rails django

是否可以使用PHP安排任务?比如,我想用jQuery datepicker选择一个日期,并提交它。当该日期等于今天的日期时,将发送电子邮件(例如,或任何其他PHP脚本)。根据用户的不同,日期也会有所不同,每个用户都可以运行多个计划任务。

修改

操作系统是Linux,该网站托管在godaddy.com上 此外,最终用户将选择何时运行这些任务,因此他们可以使用命令行。

修改

欢迎任何Ruby on Rails或Django解决方案。

3 个答案:

答案 0 :(得分:1)

如果您使用的是Unix服务器,请尝试at

http://www.manpagez.com/man/1/at/

它的工作方式与cron类似,因为它完全独立于PHP,你需要shell_exec()一个外部命令。但是,它有一个简单的命令行界面。与cron工作一样,at工作可以在重新启动后继续工作。

如果您使用at,则必须编写单独的脚本来执行您要安排的任务。

示例:

shell_exec("echo 'php script.php' | at -t 201208011234.56");

将于2012年8月1日12:34:56运行script.php。

答案 1 :(得分:1)

您需要在服务器端使用某个进程在预定时间运行任务。

一种流行的方法是将任务信息存储在某个数据库中,并且有一个cron作业不时检查任务队列 - 它非常可靠和安全。

如果没有关于部署环境的更多信息,就无法给出更好的答案。例如:

  • 目标操作系统
  • 托管类型(专用,共享,云)
  • 你有管理员权限吗?
  • 是否暴露在互联网上?

最有可能你无法在共享托管环境中做到这一点,但我必须说,从安全的角度来看,拥有一个调用shell_exec的网站并不是很明智,所以如果网站暴露,我会避免这样做上网。

一个好的托管服务提供商应该有某种后台任务调度程序,即使它不是crontab。如果您的托管服务提供商没有,试图通过一些特技填补空白可能是一个坏主意。

[更新]

  

正如我在原帖的编辑部分所说,我在godaddy.com上托管它,我不能让客户运行这些命令行等。是否有其他语言的解决方案?

我不再在godaddy主持,但他们曾经在他们的控制面板上有一个“Cron Manager”。我认为正确的goDaddy cron设置是

/usr/bin/wget -O - -q "http://yoursite.com/cron.php" > /dev/null 2>&1 

在Cron Manager的命令选项中。这个“cron.php”将检查任务队列以查看是否有任何要发送的电子邮件(任务队列是数据库中的一个简单表,您将记录客户安排的任何任务)。

答案 2 :(得分:0)

只需在主索引页面或标准包含文件中添加一个检查,即可在没有cron的情况下执行此操作 - 但这仅适用于您无法访问cron(例如共享主机)的情况。在此检查中,您可以获取未完成的操作列表并执行它们,可能使用

if (time_since_last_run > 5*60) // minutes
    shell_exec("/usr/bin/php /var/www/check-tasks.php &");

最佳解决方案是使用cron启动PHP脚本,该脚本将检查系统中的计划项目并执行它们。您可以通过wget或直接通过调用PHP来执行此操作。

我拥有的一个共享托管网站是通过cron和wget http://othersite.example.com从我的另一台服务器进行外部安排的。

示例crontab条目:

0 * * * * wget -O - -q -t 1 http://othersite.example.com/cron.php