48

我的 webhotel 上有一个网站,我想在上面运行一些计划任务。您会推荐什么方法来实现这一目标?

到目前为止,我的想法是在每个页面的顶部都包含一个脚本,然后让这个脚本检查是否该运行该作业。

这只是我正在考虑的一个简单示例:

if ($alreadyDone == 0 && time() > $timeToRunMaintainance) {
   runTask();
   $timeToRunMaintainance = time() + $interval;
} 

还有什么我应该考虑的,或者有比这更好的方法吗?

4

13 回答 13

35

这就是 cronjobs 的用途。 man crontab假设您正在运行 linux 服务器。如果您没有 shell 访问权限或无法设置 cronjobs,则可以使用免费服务在外部服务器上设置 cronjobs 并 ping 您的 URL 之一。

于 2008-09-23T10:28:34.357 回答
18

我现在正在回答这个问题,因为似乎没有人提到这个确切的解决方案。

在我目前正在开发的网站上,我们使用 cPanel 设置了一个 cron 作业,但不是直接运行 PHP 解释器(因为我们使用的是 CodeIgniter 并且我们的代码被映射到控制器函数,这可能不是t 一个好主意)我们正在使用wget.

wget -q -O cron_job.log http://somehost/controller/method

-q这样 wget 就不会产生任何输出(所以你不会一直收到电子邮件)。-O cron_job.log会将控制器生成的任何内容保存到日志文件中(每次都被覆盖,因此它不会继续增长)。

我发现这是让 cron 正常工作的最简单方法。

于 2008-12-16T14:32:57.867 回答
15

如果您有 cPanel 主机,您可以通过 Web 界面添加 cron 作业。转到高级 -> Cron 作业并使用非高级表单设置 cron 频率。你想要这样的命令:

/usr/bin/php /path/to/your/php/script.php
于 2008-09-23T16:36:36.483 回答
6

你看过ATrigger吗?PHP 库也可用于开始创建计划任务而无需任何开销。

免责声明:我在他们的团队中。

于 2013-08-26T11:28:52.413 回答
5

如果您想知道如何从 cron 实际运行 PHP 脚本,有两种选择:直接调用 PHP 解释器(即“php /foo/myscript.php”),或使用 lynx(lynx http://mywebsite.php)。 com/myscript.php)。您选择哪一个主要取决于您的脚本需要如何配置其环境 - 路径和文件访问权限会有所不同,具体取决于您是通过 shell 还是 Web 浏览器调用它。我建议使用lynx。

一个副作用是每次运行时都会收到一封电子邮件。为了解决这个问题,如果它们成功完成,我让我的 cron PHP 脚本不输出任何内容(并且它必须是任何内容,甚至不是空格),如果它们失败则输出错误消息。然后我使用来自 cron 的一个小型 PHP 脚本调用它们。这样,如果失败,我只会收到一封电子邮件。这与 lynx 方法基本相同,只是我的 shell 脚本发出 HTTP 请求而不是 lynx。

将此脚本称为“docron”或其他名称(记住 chmod +x),然后在您的 crontab 中使用命令:“docron http://mydomain.com/myscript.php ”。如果页面返回某些内容,它会将页面的输出作为 HTML 电子邮件通过电子邮件发送给您。

#!/usr/bin/php
<?php

$h = @file_get_contents($_SERVER['argv'][1]);

if ($h === false)
{
        $h = "<b>Failed to open file</b>: " . $_SERVER['argv'][1];
}

if ($h != '')
{
        @mail("cron@mydomain.com", $_SERVER['argv']['1'], $h, "From: cron@mydomain.com\nMIME-Version: 1.0\nContent-type: text/html; charset=iso-8859-1");
}

?>
于 2008-09-23T10:36:57.147 回答
4

如果您想避免设置 cron 作业等(尽管我建议这是一种更好的方法),那么您提供的解决方案非常好。在许多项目中,我让 PHP 脚本本身进行检查以查看是否该运行更新。

不利的一面(好的,不利的一面)是如果在特定时期内没有人使用该应用程序,则脚本将无法运行。

好处是,如果在一段时间内没有人使用该应用程序,则脚本将不会运行。我设置它要做的任务是“更新缓存文件”、“每日备份”等等。如果有人不使用该应用程序,那么您将不需要更新的缓存文件,也不需要任何数据库更改来备份。

我建议对您的方法进行的唯一修改是,您仅在有人成功登录时才运行这些检查。您不需要检查每个页面加载。

于 2008-10-11T13:48:12.353 回答
4

Cron 是用于调度问题的通用解决方案。但是当你做大并且日程安排频率很高时,可能会出现可靠性/重叠问题。如果您看到此类问题,请考虑使用supervise或更复杂的monit之类的东西。

于 2010-06-23T02:28:26.637 回答
3

如果你使用 cpanel,你应该像这样添加:

/usr/local/bin/php -q /home/yoursite/public_html/yourfile.php
于 2015-05-26T10:45:31.457 回答
1

如果您不想使用 cronjobs 或任何外部的东西,您使用的方法很好,但是每次加载页面时检查这些方法可能很繁重。

起初,一些 cronjobs 可能会被替换。例如,如果您有一个计数器来记录有多少用户在您的网站上注册,您可以在用户注册时简单地更新此数字,因此您不必为此使用 cronjob 或任何计划任务。

如果你想使用定时任务,我建议你使用你现在正在使用的方法,但稍作修改。如果您的网站一天有足够的点击量,您可以简单地让任务运行(或任务检查功能运行)仅 1% 或 0.01% 的点击量而不是全部,您应该使用的百分比取决于在您拥有的页面点击次数以及您想要运行任务的次数。因此,只需添加一个随机化器即可实现此功能。

您可以简单地使用这样的功能;

if(rand (1, 100) <= 1) { // 1, 100 is used to generate a number between 1 and 100. 1 is for one percent.
    // Run the tasks system
}
于 2013-03-01T12:05:42.937 回答
1

我会用 www.guardiano.pm 外包 cronjobs 并每 X 分钟调用一个 url。当您的网址(即 www.yoursite.com/dothis.php)被调用时,您将执行一些代码。如果您不想让网页在您需要时请求页面,您可以只允许在 POST 中请求并发送一些只有您知道的参数,使用 Guardiano.pm

这就是我会做的,因为我在我的宠物项目上这样做。玩得开心!

于 2015-06-12T16:03:56.373 回答
0

命令行 PHP + cron 将是我要走的路。这很简单,应该符合要求。它通常与 PHP 一起安装,这是理所当然的。

于 2008-09-23T16:32:36.587 回答
0

如果您没有设置 cronjob 的选项,您可以使用 cUrl 调用脚本(作为 wget 的替代 - 相同的功能)。只需在执行 cUrl 功能的本地计算机上执行计划任务。

于 2012-06-27T22:41:01.637 回答
0

如果你想要更抽象的东西,你可以考虑使用 PHP 调度器之类的东西。例如:

此外,要解析 cron 表达式,您可以使用现有的库,例如https://github.com/mtdowling/cron-expression。它提供了许多有用的方法来帮助您找出 cron 作业的信息。

希望有帮助。

于 2017-08-02T01:17:35.180 回答