如何创建php预定进程?

时间:2009-07-24 02:33:18

标签: php

我被要求创建一个网络应用程序,它会在一段时间内向用户发送更新。

例如

  1. user1在2009年6月至8月期间每隔5分钟要求更新
  2. user2仅在今天每10分钟要求更新
  3. user3从2009年6月至8月每1天要求更新
  4. 我不知道如何自动后台进程...我应该添加到cron吗? cron可以在Windows服务器上运行(Windows上的apache)吗?

6 个答案:

答案 0 :(得分:3)

在Windows Server上,您可以编写计划任务。在计划任务中,您可以将其设置为将更新运行到所需的频率。

来自Microsoft Knowledge Base

  

使用计划任务,您可以安排任何脚本,程序或文档在最方便的时间运行。

更具程序性的方法是保存用户的设置和上次更新时间。然后,您可以使用一个脚本来检查并根据需要运行更新。

您可以让计划任务每​​隔一分钟左右运行一次,根据用户的设置进行更新。

答案 1 :(得分:1)

正如Marcel所建议的,我会创建一个单独的cron作业(* nix)/计划任务(Windows),并让它每分钟运行一次。

然后,此作业将查看所有用户的更新订阅,确定哪个需要发送新更新,然后发送它们。显然,你需要在不到一分钟的时间内完成这项工作(如果工作每分钟运行一次),如果你试图一次性处理很多用户,这可能会有问题。

建议尝试从PHP中创建和管理cron作业/计划任务。将一个作业设置一次,然后用PHP代码处理其余的作业要容易得多。

如果cron作业/计划任务不适合您,您还可以考虑对您网站的普通请求进行捎带。这是例如维基百科的MediaWiki软件如何处理后台任务 - 它们被排除在作业队列之外,并作为无关页面请求的一部分进行处理。

答案 2 :(得分:1)

添加以最低常用间隔(5分钟?1分钟?)执行的Cron或计划任务。

计划任务应查询包含用户任务频率信息的数据库表。我会以秒为单位表示频率,然后使用UNIX时间戳来确定执行的资格。然后计算有点容易:

  • 查找当前时间,向下舍入到最近的公共区间(假设间隔为60秒):NOW = TIMESTAMP - (TIMESTAMP%60)
  • 查找间隔为当前时间段的偶数除数的用户

表格看起来像这样:

CREATE TABLE `scheduled_tasks` (
  `id` int(7) unsigned NOT NULL auto_increment,
  `user_id` int(7) unsigned NOT NULL,
  `task` varchar(32) NOT NULL,
  `interval` int(10) NOT NULL,
  `date_start` date NOT NULL default '0000-00-00',
  `date_end` date NOT NULL default '2030-12-31', -- Hopefully you won't be still maintaining this app 
  PRIMARY KEY  (`id`)
) ;
INSERT INTO `scheduled_tasks` (user_id, task, interval, date_start, date_end )
VALUES
  (1, 'standard_job', 5*60,  '2009-06-01', '2009-08-01'),
  (2, 'standard_job', 10*60, CURDATE(),  CURDATE() ),
  (3, 'standard_job', 24*60*60, '2009-06-01', '2009-08-01')

要查找要运行的作业,此查询可以起作用:

SELECT `user_id`, `task`
FROM `scheduled_tasks` 
WHERE (UNIX_TIMESTAMP() - (UNIX_TIMESTAMP() % 60 ) ) % `interval` = 0
  AND CURDATE() BETWEEN `date_start` AND `date_end`

返回一个要运行的用户/任务列表。如有必要,您可以为每个用户添加多个条目。

答案 3 :(得分:0)

windows不使用cron,但我认为它确实有某种调度。答案一般来说是肯定的,cron工作是在后台运行这些工作的方法。

答案 4 :(得分:0)

如果您在专用服务器上,则可以使用系统工具> Windows服务器上的计划任务。 如果您真的无法更改服务器上的任何内容,可以尝试在Linux服务器上运行cron,向Windows服务器发送请求...呵呵

答案 5 :(得分:0)

我刚刚编写了一个在Windows XP和2003下使用Apache,PHP和计划任务的项目。它非常简单,与cron类似。

有一点需要注意 - 计划任务的GUI控件不像命令行那样精细。我不能比一天更频繁地安排一次。幸运的是,您可以使用命令行来执行此操作。

schtasks / create / sc minute / mo 10 / st 00:00:00 / tn“Task Name Here”/ ru“System”/ tr“C:\ wamp \ bin \ php \ php5.3.0 \ php.exe \“C:\ Program Files \ script.php \”“

这将创建一个每10分钟(从午夜开始)运行的计划任务,在“系统”用户标识下称为“此处的任务名称”。你看到路径周围的逃脱报价吗?您需要在其中包含空格的路径周围放置转义引号。