在第一次安装模块时执行一些与数据库无关的PHP的适当/最佳实践方式



我正在创建一个模块,在安装模块时需要做一些事情(仅一次)。可能需要做很多事情,但我需要做的最基本的事情是对服务器进行API调用,让外部服务器知道模块已经安装,并获取一些更新的配置项。

我在stackoverflow上读到了这个问题,但在我的情况下,我真的对执行与数据库、固定装置、更新表等无关的代码感兴趣。此外,要明确的是,这个模块对前端没有影响。仅供参考,我也读过Alan Storm的这篇精彩文章,但这确实让我明白了安装/升级脚本不是用来执行随机PHP的。

在我看来,我有几种可能的方法来实现这一点:

  • 我做了我担心不是最佳实践的事情,并在我的设置/安装脚本中添加了一些PHP来执行这个PHP
  • 我创建了某种cronjob,它将只执行我需要的任务一次(不确定这将如何工作,但它似乎是一个"创造性"的解决方案——当然,如果cron设置不正确,那么这将失败,这是不好的
  • 我创建了一个core_config_data标志('mynamespace/mymodule/initialized'),在脚本运行后设置该标志,并检查模块所接触的adminhtml的每个区域(CMS/Pages和我自己的自定义adminhtml控制器)。这似乎是一个很好的解决方案,除了每次CMS/Pages被命中或我的控制器被命中时的所有额外开销之外,检查这个core_config_data设置。这个解决方案的好处是,如果我的API调用失败,我可以将此标志设置为false,它将再次运行,显示适当的消息,并继续运行,直到成功为止(或者具有额外的逻辑,在XX次尝试后停止初始化代码)

这些选择中有任何一种是"最好"的方式吗?在某个地方有没有这样的先例,比如受人尊敬的延期或马根托自己的延期?

提前感谢您抽出时间!

您提出了一个有趣的问题。

目前,我还不知道在模块安装上执行任何任意PHP的方法,显而易见的方法(正确/错误)是根据你的Q.中的1使用安装程序设置/升级脚本

2和3似乎是一种更耗费资源的方法,即不必要地检查每个页面加载(是否缓存)。

还有一种方法是使用./pear来安装模块(假设您使用Magento进行了打包)。我快速浏览了./downloader/pearlib/php/pearmage.php,但没有看到任何执行的行(与复制文件相比)。我本以为这是在安装时执行某些操作的最佳位置(除了上面提到的1)。

但是,我从来没有研究过这个问题,所以我对其他可能的答案很感兴趣。

最新更新