现在,桌面应用程序可以自我更新,这是非常标准的做法。在Mac上,我书中使用Sparkle的每个非Apple程序都是即时获胜。对于Windows开发人员,this has already been discussed at length。我还没有找到有关自我更新的Web应用程序的信息,我希望你能提供帮助。
我正在构建一个像Wordpress或Drupal一样安装的Web应用程序 - 将其解压缩到一个目录中,点击一些安装页面,它就可以了。为了获得广泛的服务器兼容性,我被要求使用PHP和MySQL - 那是** MP吗?无论如何,它必须是广泛的跨平台。对于上下文,这基本上是针对小型企业的统一Web消息传递应用程序。它不是另一个CMS平台,想想网络邮件。
我想了解自我更新的网络应用程序。首先,(1)这是一个坏主意吗?从Wordpress 2.7开始,自动更新只是一个按钮,看起来很简单,但我可以想象这么多的方式可能会非常糟糕,非常错误。另外,网络进程是不是可以写入安全漏洞的想法?
(2)是否值得开发时间?世界上可能有数百万个WP安装,所以值得花时间让WP团队轻松实现,在全球范围内节省数百万工时。我只能想象我的软件安装了几千 - 建立自我升级是值得的时间投资,还是我可以假设用户足够先进,下载和安装网络软件可以通过升级核对清单?
如果这不是安全灾难或浪费时间,那么(3)我正在寻找任何以前做过的人的建议。你在数据库中保留了一个版本表吗?你如何管理数据库升级?在自我更新的Web应用程序的上下文中,您使用什么方法回滚部分升级?使用ORM层是否更容易或更难?您是否保留了版本更改的增量,或者您是否每次都吹灭整个事物?
感谢您对此的看法。
答案 0 :(得分:13)
坦率地说,它确实取决于您的用户群。有大量PHP应用程序不会自动升级。他们的用户要么技术足以处理升级过程,要么就是不升级。
我的目的是两个步骤:
1)认真问自己,用户可能真正需要什么。自我更新是否足以提高采用率以证明额外工作的合理性?如果你确信答案是肯定的,那就去做吧。
既然你在这里问我,我猜你还不知道。在那种情况下,我的目的是第2步:
2)发布没有该功能的1.0版。等待用户反馈。您的用户可能会立即为更简单的升级过程而哭泣,在这种情况下您应该优先考虑它。或者,您可能会发现您的用户更关心其他一些功能。
在不询问用户的情况下猜测用户的需求是一种浪费大量开发时间的好方法。
答案 1 :(得分:4)
我最近一直在考虑数据库架构更改。目前我正在深入研究WordPress以了解他们如何处理修订版之间的数据库更改。这是我到目前为止所发现的:
$wp_db_version
已从wp-includes/version.php
加载。此变量对应于Subversion修订号,并在wp-admin/includes/schema.php
更改时更新。 (可能通过钩子?我不确定。)加载wp-admin/admin.php
时,从数据库中读取名为db_version
的WordPress选项。如果此数字不等于$wp_db_version
,则会加载wp-admin/upgrade.php
。
wp-admin/includes/upgrade.php
包含一个名为dbDelta()
的函数。 dbDelta()
扫描$wp_queries
(一串将从头创建最新数据库模式的SQL查询)并将其与数据库中的模式进行比较,根据需要更改表,以便提出模式-to-日期。
upgrade.php
然后运行名为upgrade_all()
的函数,如果upgrade_NNN()
小于目标值,则会运行特定的$wp_db_version
函数。 (即。upgrade_250()
,如果数据库版本小于7499,将运行WordPress 2.5.0升级。)这些函数中的每一个都运行自己的数据迁移和填充过程,其中一些在初始化期间调用数据库设置脚本。很好地减少了重复的代码。
所以,这是一种方法。
答案 2 :(得分:4)
是的,如果PHP在没有任何警告的情况下从互联网上的某个地方覆盖了文件,那将是一个安全功能。无法保证服务器正确连接到您的更新服务器(如果发生DNS中毒,它可能会下载其他人制作的代码) - 让其他人访问您客户的数据。因此,数字签名很重要。
用户可以通过在Web目录上设置权限来控制更新,以便PHP只具有对文件的读取权限 - 此过程可以简单地记录在您的程序中。
还有一个问题(我真的不知道答案):如果文件正在使用它们,PHP是否会覆盖文件(例如,如果需要更新update.php文件本身)?值得测试。
答案 3 :(得分:3)
我想你已经排除了这一点,但你可以将它作为一项服务托管。 (想想wordpress.com)
答案 4 :(得分:3)
我建议您使用pear和set up a channel打包您的应用程序。然后,您的用户可以通过标准界面(pear)升级应用程序。它不是完全自动的(除非用户在梨上运行某种自动化),但它是标准的,所以任何系统管理员都可以维护它。
答案 5 :(得分:1)
我认为您最好的选择是更新检查机制,当有更新时会提醒管理员。
正如您所提到的,存在许多潜在的安全问题。由于这些,我建议不要这样做。相反,尝试创建一个相当智能的升级脚本。
答案 6 :(得分:1)
仅仅是我的2美分:我认为CMS中的自动更新应用程序是一个安全漏洞,所以如果你决定编写这个功能,你应该考虑实现这种行为的不同级别: