2

是否可以使用 PHP 安排任务?比如,我想用 jQuery datepicker 选择一个日期,然后提交。例如,当该日期等于今天的日期时,将发送一封电子邮件(或任何其他 PHP 脚本)。日期会因用户而异,此外,每个用户都可以有许多计划任务要运行。

编辑

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

编辑

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

4

3 回答 3

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。

于 2012-07-04T23:17:11.153 回答
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 管理器的命令选项中。这个“cron.php”将检查任务队列以查看是否有任何电子邮件要发送(任务队列是数据库中的一个简单表,您将在其中记录客户安排的任何任务)。

于 2012-07-04T23:30:33.000 回答
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
于 2012-07-04T23:19:40.500 回答