EZ Publish/EZ Publish Cronjob脚本的使用

来自站长百科
跳转至: 导航、​ 搜索

EZ Publish | EZ Publish安装与卸载 | EZ Publish的使用 | EZ Publish常见问题 | EZ Publish其他

某些eZ Publish 的特性需要依赖于一个运行于后台的脚本。这个脚本位于eZ Publish 根目录且应该按照一定时间间隔被反复执行。这个脚本是"runcronjobs.php"。除其它功能外,它负责处理工作流,检查/验证URL,发送通知邮件等等。尽管如果"runcronjobs.php"不被定期执行,eZ Publish 也可以使用,还是建议在后台运行这个脚本。某些特性,如“通知”系统必须需要这个脚本。

最常用的解决方案是要求系统每隔30-60 分钟便自动执行这个脚本。但是,某些任务应该执行得更频繁。因此,建议将cronjob 分成不同的组并分别执行它们。请参阅“配置cronjob”和“运行cronjob”节了解更多。

Cronjob脚本[ ]

"cronjobs"目录包含各种cronjob,它们被用于各种自动的周期和计划维护任务。如下表所示。

EzpublishCronjob1.jpg

eZ Publish 网络商店功能允许用户将商品放入购物篮。购物篮中的商品可以通过启动结帐流程来购买。系统在数据库表"ezbasket"中保存用户的购物篮信息。与用户会话有关的信息被保存在"ezsession"表中。如果用在购物篮中添加了商品然后终止了购物流程(例如:关闭了浏览器)而没有结帐,用户的会话在一段时间后会过期。过期的会话可以被自动或被管理员手动删除。当系统删除用户会话时,系统不会处理与这个会话对应的购物篮。换言之,系统会从"ezsession"中删除一条记录,但是"ezbasket"中的对应记录(如果有)不会被删除。这种行为由"site.ini"重设文件中"[Session]"下的"BasketCleanup"配置。如果它被设置为"cronjob"(默认值),将需要通过"basket_cleanup.php"来删除不用的购物篮。

请注意,对于一个有很多用户的站点而言,删除不用的购物篮通常会耗费很多时间。建议每周执行一次购物篮清理脚本。如果希望与其它(更频繁)的脚本一起使用,可以配置"BasketCleanupAverageFrequency"来指定当"basket_cleanup.php"被执行时,购物篮实际清除的频度。如果希望将"basket_cleanup.php"与其它脚本分开执行,则配置"BasketCleanupAverageFrequency“如下:

BasketCleanupAverageFrequency=1

请注意,如果站点不使用网络商店功能,没有必要运行这个脚本(或者执行它但是配置"BasketCleanup"为"pageload")。

  • 在特定时间隐藏节点

当系统时间超过指定的时间后,系统可以自动隐藏特定节点。例如:如果希望发布的一篇文章在一天/周/月后被隐藏。但是,不想删除这篇文章,只是希望隐藏这篇文章。在这种情况下,需要为您的文章类添加一个日期时间类型的属性并配置隐藏cronjob。以下文字描述了如何做到。

  • 为“文章”类添加一个属性

在管理界面中选择“设置-”然后选择“内容”类组并显示这一组内的类。找到文章类然后点击编辑按钮。系统会显示类编辑界面。选择“日期时间”数据类型,点击“添加属性”按钮并做如下编辑。

EzpublishCronjob2.jpg

注意,属性名和属性标识符可以随意指定(参阅以下内容)并点击“确定”按钮。系统会为类添加一个新属性"Hide date"(新添加的属性名称),因而它会在对象编辑界面中显示。当编辑文章时,这个字段可以被用来指定何时文章应该被隐藏。如果属性被设为空,文章不会受隐藏cronjob 影响。请注意,"hide.php"必须定期执行。

  • 配置"hide" cronjob

在"content.ini.append.php"中添加如下内容:

[HideSettings]
RootNodeList[]=2
HideDateAttributeList[article]=hide_date

应该在"HideDateAttributeList"中添加新添加的属性标识符并用类标识符作为键值。此外,需要在"RootNodeList"中指定文章的父节点ID

  • 推迟的检索索引

如果“推迟的索引”特性被启用,新的和重新发布的对象不会被立刻编入索引。换言之,eZ Publish 不会在发布过程中为内容建立索引。相反,索引cronjob 会在后台建立索引,因而发布过程会变得更快(因为不需要等待内容被编入索引)。要启用推迟的索引,必须在后台执行"indexcontent.php"cronjob(否则内容会被发布但是永远不会被编入索引)。

请注意,不需要执行这个脚本除非已经在"site.ini"的重设文件的"[SearchSettings]"中设置了"DelayedIndexing=enabled"。

  • 清除旧的/不用的草稿

一般草稿(状态"0")

"old_drafts_cleanup.php"脚本的用途是从数据库中删除旧的草稿。如果启用,这个脚本会删除系统中超过90 天的草稿。要设置草稿过期的时间,在"content.ini"重设文件中"[VersionManagement]"下配置"DraftsDuration[]"。每次脚本执行最多可以删除草稿数量(默认值100)由"DraftsCleanUpLimit"指定。

  • 内部/未处理草稿(状态"5")

"internal_drafts_cleanup.php"的用途是删除那些可能永远都不会被发布的草稿。如果一个对象的版本被创建但是没有被改变(例如:如果某个用户点击了“添加注释”按钮但是没有真正提交任何内容),版本的状态为"5"。"internal_drafts_cleanup.php"脚本会删除系统中超过24 小时(一天)的内部草稿。要设置内部草稿的过期时间,可以修改"content.ini"重设文件中"[VersionManagement]"下的"InternalDraftsDuration[]"。脚本每次最多可以删除的内部草稿数(默认值100)由"InternalDraftsCleanupLimit"控制。

  • 与LDAP 服务器同步用户帐号信息

如果通过LDAP 服务器验证用户,eZ Publish 会从外部数据源提取用户帐户信息并保存在本地数据库。系统会在用户成功登录后,在本地创建帐号。

"ldapusermanage.php"脚本可以用来与LDAP 服务器同步用户帐号信息。建议站点与LDAP 服务器连接后,定期执行这个脚本。这个脚本会负责典型的维护任务。例如:如果用户被从LDAP 服务器删除,eZ Publish 的帐号会被禁用。

请注意,这个脚本只会更新eZ Publish 数据库。不支持对外部数据(保存在LDAP 服务器中)的修改。

  • 检查URL

在eZ Publish 中,每个在XML 块中输入的链接或在"URL"数据类型中输入的链接都会被保存在URL 表中,因此这些发布的URL 可以被调查,编辑而不需要处理对象。这意味着,不需要编辑或重新发布对象,如果您只是想修改URL。

URL 表包含所有关于地址的信息,包括:状态(有效或无效)和最后检查时间(系统最近一次检查URL的时间)。默认情况下,所有的URL 都是有效的。"linkcheck.php"脚本通过访问URL 表中的每个URL 来逐个检查这些链接。如果发现不可访问的链接,链接的状态被设置为“无效”。最后检查时间总会被更新。

必须在"cronjob.ini.append.php"中的"[linkCheckSettings]"配置"SiteURL"来指定站点的URL。这会确保"linkcheck.php"可以正确处理相对URL(内部链接)。

请注意,链接检查脚本必须可以通过80 端口与外部网站通讯。换言之,防火墙必须允许80 端口的HTTP出栈数据。从3.9 版本开始,可以通过HTTP 代理服务(在"site.ini"重设文件中的"[ProxySettings]"配置)器获得数据(PHP 需要支持CURL)。

  • 发送通知

eZ Publish 内建的通知系统允许用户接收不同时间的信息。当对象被修改或发布时,当工作流被执行等等。如果需要在您的站点使用通知功能,需要定期运行"notification.php"脚本。它会负责向信息订阅者发送通知(这是通过启动主通知处理脚本"kernel/classes/notificationeventfilter.php"来完成的)。

如果使用通知系统,建议每15-30 分钟执行一次这个脚本。

RSS 导入功能允许从不同站点接收RSS 数据。例如:来源于ez.no 的最新的社区新闻(http://ez.no/rss/feed/communitynews)。需要在管理界面中用“设置-RSS ”来配置RSS 导入。然后定期运行"rssimport.php"脚本。这个脚本会从您的活动RSS 导入获得最新的项目并将它们发布到您的站点(如果项目已经存在,则逃过这个项目)。

请注意,RSS 导入脚本必须可以通过80 端口与外部网站通讯。换言之,防火墙必须允许80 端口的HTTP出数据。从3.9 版本开始,可以在"site.ini"重设文件中的"[ProxySettings]"中配置HTTP 代理服务器(需要PHP 支持CURL)。

  • 清除过期的模板缓存

如果使用模板"cache-block"功能,且指定了"subtree_expiry“参数,缓存块只有在指定的子树(而不是整个内容树)下有对象被发布才会过期。"site.ini"重设文件中"[TemplateSettings]"下的"DelayedCacheBlockCleanup"用来控制使用"subtree_expiry"的缓存块是否应该立刻被删除。如果这个设置被启用,过期的缓存块必须用"subtreeexpirycleanup.php"来清除。

  • 在指定时间删除对象

当系统时间超过指定时间时,"unpublish.php"脚本可以用来删除特定的对象。例如:可能希望在一天/周/月后删除某些文章。参阅如下步骤。

1. 为“文章”类添加一个日期时间数据类型的属性。用"unpublish_date"作为属性标识符;这个属性在编辑文章时候会显示。这个字段可以被用来指定何时删除对象。如果这个属性为空,对象不会受这个脚本的影响。

2. 在"content.ini.append.php"中做如下配置:

[UnpublishSettings]
RootNodeList[]=2
ClassList[]=2

应该在"ClassList"中指定文章类的ID 并将文章父节点ID 添加到"RootNodeList"中。

  • 分析Apache 日志文件

可以通过分析Apache 日志文件来得到站点页面的页面访问量,并把结果保存在eZ Publish 中。需要定期运行"updateviewcount.php"。这个脚本会通过分析Apache 日志文件来更新每个节点的访问量(访问量被保存在"ezview_counter"表中)。当执行脚本时,它会更新"var/example/log/updateview.log"(用"site.ini"重设文件中的"varDir"代替example)。这个文件包含的信息告诉脚本下次执行时应从Apache 日志的哪一行开始。

需要重设"logfile.ini"并添加如下配置:

[AccessLogFileSettings]
StorageDir=/var/log/httpd/
LogFileName=access_log
SitePrefix[]=example
SitePrefix[]=example_admin

用apache 日志目录替换"/var/log/httpd",用实际的日志文件替换"access_log",用实际的站点入口名替换"example"和"example_admin"(如果有超过两个站点入口,将它们全部列出)。一旦指定了正确的配置且定期执行"upateviewcount.php“脚本,可以用"view_top_list"模板函数提取最流行(最高访问量)的节点或检查一个节点被访问了多少次。

  • 处理工作流

要使用工作流,必须定期执行"workflow.php"。这个脚本会处理工作流。例如:假设使用协作系统且所有在标准分区中的改动必须经过您的批准才能发布(可以在一个由"content-publish-before"触发器触发的工作流中创建一个“审批”事件来实现)。如果某个用户(除站点管理员外)修改了文章A,系统会为您生成一个新的协作消息“文章A 等待您的批准”,并为编辑者生成一个消息“文章A 等待编辑的批准”。(定期运行"notification.php"来通过电子邮件向用户发送新的协作消息。)可以在管理界面中“我的帐号-协作”中查看协作消息并查看/批准/拒绝对内容的修改。但是,在批准了对文章的修改后,修改不会立刻被应用。修改会在下次运行"workflow.php"时生效。

配置cronjob[ ]

可以在"settings/cronjob.ini"的重设文件中配置哪些cronjob 会被启用(可以被"runcronjobs.php"执行)。以下列表揭示了在"[CronjobSettings]"中可以使用的配置选项。

• ScriptDirectories 数组指定eZ Publish 会在哪些位置搜索内建cronjob 脚本(默认使用"cronjobs"目录)。

• ExtensionDirectories 数组指定eZ Publish 会在哪些位置搜索附加的/自定义的cronjob 脚本。默认情况下,eZ Publish 会在您的扩展中的"cronjobs"子目录中搜索。

• Scripts 数组包含了一组cronjob 脚本,如果在执行"runcronjobs.php"脚本时不指定"group_of_tasks"选项,这些脚本会被执行。在这个数组中的脚本被称为主脚本。

  • cronjob parts

某些cronjob 必须比其它脚本更频繁地执行。可以在"cronjob.ini"重设文件中添加特定的cronjob parts 来配置附加的cronjob 组。

下例演示了如何配置。

例1(默认配置)

以下配置是在"cronjob.ini"中的"[CronjobSettings]"的默认配置:

[CronjobSettings]
ScriptDirectories[]=cronjobs
Scripts[]=unpublish.php
Scripts[]=rssimport.php
Scripts[]=indexcontent.php
Scripts[]=hide.php
Scripts[]=subtreeexpirycleanup.php
Scripts[]=internal_drafts_cleanup.php
ExtensionDirectories[]

这意味着主脚本包含以下六个任务:

• unpublish.php

• rssimport.php

• indexcontent.php

• hide.php

• subtreeexpirycleanup.php

• internal_drafts_cleanup.php

如果不指定"group_of_tasks"选项,这些脚本会在每次执行"runcronjobs.php"脚本时被执行。系统会期望这些脚本被放置在"cronjobs"目录中。

以下的cronjob parts 定义了两个cronjob 的附加组:"infrequent"和"frequent":

[CronjobPart-infrequent]
Scripts[]=basket_cleanup.php
Scripts[]=linkcheck.php
[CronjobPart-frequent]
Scripts[]=notification.php
Scripts[]=workflow.php

在"[CronjobPart-infrequent]"中的配置要求系统用如下选项执行"runcronjobs.php"时执行"basket_cleanup.php"和"linkcheck.php":

php runcronjobs.php infrequent

在"[CronjobPart-frequent]"中的配置要求系统用如下选项执行"runcronjobs.php"时执行notification 和workflow脚本:

php runcronjobs.php infrequent

通过以上配置,可以独立运行每一组脚本,如:

• workflow.php 和notification.php - 每15 分钟

• basket_cleanup.php 和linkcheck.php - 每周

• 主脚本 - 每天

例2 如果希望每个月执行"old_drafts_cleanup.php“,可以在"settings/siteaccess/example/cronjob.ini.append.php“中添加如下配置:

[CronjobPart-monthly]
Scripts[]=old_drafts_cleanup.php

可以用如下命令行运行脚本:

php runcronjobs.php monthly -s example

例3

可以开发自定义脚本扩展系统。例如:如果有一个扩展"nExt"包含一个脚本"myjob.php",您可以在"cronjob.ini"重设文件中添加如下配置:

[CronjobSettings]
ExtensionDirectories[]=nExt
Scripts[]=myjob.php

[CronjobSettings] ScriptDirectories[]=extension/nExt/cronjobs Scripts[]=myjob.php

以上配置会要求eZ Publish 把"extension/nExt/cronjobs/myjob.php"作为一个cronjob 脚本。这个脚本会被添加到主脚本中并且每次不指定"group_of_tasks"选项执行"runcronjobs.php"时,这个脚本都会被执行。

运行cronjob[ ]

在eZ Publish 根目录中的"runcronjobs.php"负责在后台执行您的cronjob。这个脚本应该被定期执行。最常用的解决方案是要求操作系统(或某些应用程序)按固定的时间间隔自动执行这个程序。在Linux/UNIX操作系统中,这可以通过使用"cron"来实现。在Windows 上,可以用“计划任务”系统服务来定期执行这个脚本。

以下文字描述了如何执行这个脚本。

  • 在命令行中执行cronjob

可以在命令行中手动执行"runcronjobs.php"脚本:

1. 进入eZ Publish 根目录

2. 运行脚本(用实际的站点入口名替换"example"):

php runcronjobs.php group_of_tasks -s example

"group_of_tasks"选项表示只有在"cronjob.ini"重设文件中"[CronjobPart-group_of_tasks]"组内的脚本会被执行。如果省略这个选项,"cronjob.ini"重设文件中"[CronjobSettings]"下的脚本会被执行。(请参阅“配置cronjob”一节了解更多。)

"-s example"表示这个脚本应该对哪个站点入口执行。如果您执行脚本的时候不指定站点入口,默认的站点入口会被使用。

也可以用"-d"选项要求脚本在结束时显示调试信息,例如:

php runcronjobs.php group_of_tasks -d -s example

也可以用"all"选项来获得更多的调试信息:

php runcronjobs.php group_of_tasks -dall -s example

还可以使用以下选项:"accumulator","debug","error","include","notice","timing","warning"。请注意,这些选项需要用","分隔。下例会告诉脚本显示调试注意信息并生成include 列表:

php runcronjobs.php group_of_tasks -dinclude,notice -s example

默认情况下,这个脚本不会修改任何日志文件("var/log"目录中的文件)。如果需要记录日志,可以使用"-d"和"—logfiles"选项:

php runcronjobs.php group_of_tasks -d -s example --logfiles
  • 在linux/UNIX 系统中运行cronjob

"cron"是系统中在后台运行任务的工具。它主要用来定期自动执行系统管理与维护的任务(例如:创建每周的备份)。被称为"cron daemon"(cron 精灵)的程序通常在后台安静地等待执行间隔到达,然后执行cronjob。一个"cronjob"是由cron daemon 定期执行的一个脚本或一个程序。cronjob 必须在crontab 中设置。crontab 是一个文本文件,它不能直接被编辑。下表揭示了哪些命令可以用来维护crontab。

EzpublishCronjob3.jpg

下例演示了如何在crontab 中设置eZ Publish 的cronjob。它假设eZ Publish 被安装在"/var/www/ezpublish/“,PHP 命令行接口在"/usr/local/bin/php"且目标站点入口名称为"example"。

# The path to the eZ Publish directory.
EZPUBLISH=/var/www/ezpublish
# Location of the PHP command line interface binary.
PHPCLI=/usr/local/bin/php
# Instruct cron to run the main set of cronjobs
# at 6:35am every day
35 6 * * * cd $EZPUBLISH && $PHPCLI runcronjobs.php -q -s example 2>&1
# Instruct cron to run the "infrequent" set of cronjobs
# at 5:20am every Monday
20 5 * * 1 cd $EZPUBLISH && $PHPCLI runcronjobs.php infrequent -q -s example 2>&1
# Instruct cron to run the "frequent" set of cronjobs
# every 15 minutes
0,15,30,45 * * * * cd $EZPUBLISH && $PHPCLI runcronjobs.php frequent -q -s example 2>&1
# Instruct cron to run the "monthly" set of cronjobs
# at 4:10am the first day of every month
10 4 1 * * cd $EZPUBLISH && $PHPCLI runcronjobs.php monthly -q -s example 2>&1

当添加到crontab 后,cron daemon 会用PHP 命令行接口定期执行"runcronjobs.php"。基于这个配置,主脚本会在每天的6:35am执行。这意味着"[CronjobSettings]"下的所有脚本每天会被执行一次。

"infrequent"组中的脚本会在每周一的5:20am执行。例如:"[CronjobPart-infrequent]"下的脚本。

"frequent"组中的脚本会每15 分钟执行一次。只有"[CronjobPart-frequent]"中的脚本会被执行。

"monthly"组中的脚本会在每个月第一天的4:10am执行。"[CronjobPart-monthly]"下的脚本会被执行。

"-q"参数要求脚本运行于安静模式(去除不必要的输出)。"-s example"表明脚本应该使用哪个站点入口的配置。"2>&1"符号要求系统将系统标准输出和标准出错合并为一个流。

  • Windows 计划任务

与linux/UNIX 系统不同,Windows 不支持cron。但是,Windows 提供了称为“计划任务”的解决方案。一个计划任务可以通过在控制面板中选择“计划任务”来创建。这会启动一个安装向导并帮助您配置计划任务。它应该被设置为定期执行一个批处理(.bat)文件。这个.bat 文件应该进入eZ Publish 目录并执行"runcronjobs.php"脚本。

参考来源[ ]

EZ Publish使用手册导航

EZ Publish安装卸载

EZ Publish正常安装 | EZ Publish手动安装 | EZ Publish自动安装 | EZ Publish安装向导 | EZ Publish虚拟主机设置 | EZ Publish使用扩展 | EZ Publish的卸载

EZ Publish的使用

模板使用:

EZ Publish节点模板 | EZ Publish系统模板 | EZ Publish Pagelayout页头信息 | EZ Publish Pagelayout变量 | EZ Publish 模板注释 | EZ Publish 模板变量类型 | EZ Publish 模板变量用法 | EZ Publish 调查数组和对象 | EZ Publish 模板控制结构 | EZ Publish 函数与操作符 | EZ Publish URL处理 | EZ Publish 内容提取 | EZ Publish 模板重设系统
系统功能: EZ Publish 系统记帐 | EZ Publish 策略功能 | EZ Publish 多语言使用(一) | EZ Publish 多语言使用(二) | EZ Publish 集群的使用 | EZ Publish 安装包的使用 | EZ Publish Cronjob脚本的使用 | EZ Publish 多货币功能 | EZ Publish 通知功能
其他功能: EZ Publish 增值税(VAT)系统 | EZ Publish 改进的商品配送系统 | EZ Publish 多语言URL别名 | EZ Publish 登录后高级重定向 | EZ Publish 检索引擎 | EZ Publish WebDAV | EZ Publish 视图缓存

EZ Publish常见问题

EZ Publish 安装常见问题 | EZ Publish 使用常见问题

EZ Publish其他

EZ Publish内部结构 | EZ Publish内容与界面 | EZ Publish内容管理(一) | EZ Publish内容管理(二) | EZ Publish配置模型 | EZ Publish模块与视图 | EZ Publish URL 翻译 | EZ Publish 界面 | EZ Publish访问控制 | EZ Publish网络商店 | EZ Publish工作流