将50多个安装升级到PHP 5.3

时间:2012-05-10 16:30:11

标签: php compatibility backwards-compatibility

作为网页设计师,我们在2011年迎来了超过50个(不同)的cms&其他php 5.2驱动的应用程序。有些人也对核心进行了自定义。 有人如何将这么多的应用程序升级到php 5.3?

php的开发人员有没有想过这个? 很多(流行的)功能只是折旧,导致像我们这样的人做了很多工作。

我真的不知道如何最好地继续

7 个答案:

答案 0 :(得分:11)

简答

取决于。

迁移策略将受到源本身的质量和内容以及体系结构和工作流程的影响。 使其正常工作没有“银弹”。

更长的答案

应该怎么做

您自动升级所有staging sites,运行所有unit tests,如果全部通过,请运行acceptance tests。修复出现的问题,直到您通过所有测试。然后让你的QA人确保一切都是100%好的。整个过程主要由您的continuous integration系统/框架运行。

当所有工作都在暂存环境中运行时,您将删除每个站点进行维护,将更新的代码部署到生产环境,升级服务器的软件,并重新启动站点。

你将如何(最有可能)做到这一点

由于您的软件都没有任何单元/验收测试,没有最新的规范,甚至没有持续集成系统的概念,您将不得不这么做:

'step 1' take a survey of different servers setups on which your projects 
         are deployed (if you have all project on single box with 
         virtual-hosts, you can skip this bit )
'step 2' find somewhere a computer, which can temporary act as local server
<foreach setup>

    'step 3' install/configure this temporary server to be exactly like 
             the "setup"
    <foreach project on that setup>

        'step 4' BACKUP ALL THE STUFF
        'step 5' copy the latest source and DB from the production server
        'step 6' upgrade the software
        'step 7' see what has *blown* up and fix what you can find    
        'step 8' pass to the QA team 
        'step 9' store the source

    </endforeach project>
    'step 10' take the server with this configuration down for maintenance
    'step 11' upgrade software on the server
    'step 12' deploy all the projects from this server 
    'step 13' prayer (optional)

<endforeach setup>

这有点像“简短”版本。基本上你必须逐个服务器,在本地克隆它,然后升级,修补项目。然后升级每个服务器并打开修补版本。希望。

你应该升级吗?

  

客户不会为此付费。

由于你有大约50个不同的项目,你必须调查它是否值得花时间和金钱。在进行此类分析之后,您可能会发现,将大多数项目标记为“legacy”并将服务器升级到最新的5.2.x会更有意义。然后不管它。

当然,即使您决定不升级大部分项目,也会有一些需要它。特别是正在进行的合同项目,为公司带来稳定的收入来源。

我建议开始升级那些现金牛项目,因为无论如何你都必须这样做。然后根据这种经验,您可以计算其余“投资组合”的成本。

下次怎么办?

PHP 5.4已经发布(在上次编辑时,5.5已经到来)。到今年年底,大多数公司将面临一个问题:“是时候开始使用5.4了吗?”。一些更快,一些稍后。您使用的框架和CMS也倾向于获取更新。

底线:贵公司应该开始研究简化此流程的方法。

当你升级到PHP 5.5并且mysql_*函数开始显示E_DEPRECATE警告时呢?请参阅mysql_affected_rows()文档中的红色框。这不是一次性的事情。

投资实施更好的部署策略(涉及单元测试和持续集成)可能是明智之举。


<子> <rant>

  

php的开发人员有没有想过这个?许多(流行的)功能只是折旧,导致像我们这样的人做了很多工作。

已弃用的功能和功能已在文档中标记为多年。例如,自从我开始学习PHP以来,不应该使用ereg()并且不应该使用通过引用传递对象的通知。弃用警告会主要影响PHP4代码库(在这种情况下,您的问题有点不诚实)。

我不知道多年来在社区中被接受的强制执行是如何“造成大量工作”。

<子> </rant>

答案 1 :(得分:3)

首先,通过包管理系统(yum,apt-get等)安装程序存储在程序包(RPM,DEB等)中,并正确设置依赖性信息。

然后通过一个带有集成步骤的正确发布链来测试升级依赖项时代码是否中断。像Jenkins这样的CI服务器可以为您运行自动化测试并构建软件包。

如果有问题,它们会很快出现,您可以开始修复它们。使用您通常的内部流程来确定错误的优先级和修复错误(注意,值得关注特定包中的依赖性升级引入的所有错误,而不是通过并行处理十几个程序来分解工作量。)

答案 2 :(得分:3)

显然,您应该遵循建议的升​​级做法;其他答案正在提供它们。

需要采取流程和程序步骤;我在那里没有具体的建议,事实上tereško的答案非常好恕我直言

但是,如果必须更改代码库本身,您可以选择:

  • 你可以手工完成(这似乎是隐含的假设)。这并不奇怪。
  • 您可以自动应用更改。

纯手动方法要求您发现所有类型的不兼容性(语言更改,框架更改,基础结构替换,...​​),找出如何一般地修复它们,然后在适当的地方应用每种修复类型。最后一部分非常昂贵,因为它要求你检查每一行代码,并在错误的情况下修复它。

自动更改无助于发现问题或解决方案的一般问题。但是一旦你弄清楚如何解决问题,它可能有助于在所有必要的地方应用该解决方案。

每个问题需要的是“如果您在代码中看到这一点,请将其更改为”。这种非正式的想法可以打包成程序转换,即修改代码的正式规则。

我的公司提供了一个工具DMS Software Reengineering Toolkit,它是一个程序转换引擎。它可以使用特定语言的前端分析和转换多种计算机源代码;它有PHP front end (parser/prettyprinter)适合此任务。 DMS专为此类任务而设计,这就是为什么它的部分名称是“软件再造工具包”。我们已将它用于much nastier reengineering tasks

因此,我们的想法是将所需的更改打包为程序转换,并使用像DMS这样的工具来应用它们。编写修复代码中问题的规则将付出努力,但一旦完成,DMS就可以可靠地应用这些规则。因此,您需要投资前几个系统(以获得调整和验证的规则),以便更新最后48个有效数据。

这不是灵丹妙药;你不能总是轻易地为你想要的东西写一个转换。但是当你需要进行大量的更改,并且想要将它们全部放在代码上时,使用工具执行可靠的操作远比手动执行任何操作要好得多。

答案 3 :(得分:2)

我想这个清单:http://php.net/manual/en/migration53.incompatible.php就是你需要担心的。

答案 4 :(得分:2)

最好的方法是关注PHP 5.3 Migration Guide(然后转到PHP 5.4)。

答案 5 :(得分:2)

更新到PHP 5.3 / 5.4时脚本中的问题:

5.3和5.4不是100%向后兼容的!简单地更新到5.3 / 5.4会使您的应用程序完全无法使用 - 并严重损坏您的数据库数据(如果您使用现在已损坏的函数/方法)。

5.3 / 5.4的更新可以为您提供大量的通知,警告和错误。 通知只是警告你“糟糕的编程风格”,而警告和错误可以&amp;将使您的申请无法使用。 您必须重写代码的部分内容。

5.3更新中最常见的事情:PHP发出大量通知,由于“未定义的变量”,即使很多高度专业的工具也没有准备好在PHP 5.3上使用很长时间(wordpress,几个框架,主要脚本等)。您可以通过将错误报告设置为error_reporting来覆盖这些消息(E_ALL ^ E_NOTICE); 但请记住:这只是一个快速而简单的解决方案!这样做的风格很糟糕。

PHP 5.3 / 5.4的官方向后不兼容列表相当长,并列出了许多致命错误和大量变化的逻辑,如何工作的东西和很多错误修复顺便说一句(这也可能会改变一些事情的表现方式)。

官方落后不兼容名单5.3:http://php.net/manual/en/migration53.incompatible.php

官方落后不兼容名单5.4:http://php.net/manual/en/migration54.incompatible.php

根据你的初步问题,这让我提出了一个大问题:

我真的需要更新到更新的PHP版本吗?

什么时候有一个空闲时间的项目,并且想要获得最新信息,因为它很高兴:做到这一点!但是如果你是在一个专业的环境中工作,那些付钱给你并且绝对需要让他们的网站100%在线的客户,那么问问自己他/他们真的需要吗?如果对您的应用程序,性能,现金流或与客户的关系产生负面影响,请不要进行更新。在糟糕的情况下,PHP会默默地弄乱您的应用程序,并且您在几个月后意识到一个主要错误(数据库中有重复数据库等)。问问自己:更新的优点是什么?有什么缺点?这总是一个时间和时间金钱的东西,所以不要做不必要的事情。

我个人意见:如果您不需要,请不要更新您的PHP!总是在环境中运行它已经开发了!只要你知道你为什么这么做就会更新。

如何将多个php应用程序升级到较新版本/ PHP 5.3 / 5.4:

  • 镜像你的服务器完全包括配置(php,mysql,apache,...)
  • 在这些新服务器上镜像您的应用程序
  • 将您的开发服务器更新为您需要的版本(请注意您的操作方式)
  • 阅读PHP不兼容列表(见上文)
  • 逐行浏览您的代码(开发服务器),并检查上述任何不兼容性
  • 测试,测试,测试,测试,测试,测试
  • 如果一切都很酷,请更新实时服务器并部署重写的应用程序

答案 6 :(得分:0)

如果您使用像cherokee这样的替代Web服务器,则可以使用PHP的并行安装。如果由于安装限制而无法执行此操作,则可以始终使用chrooted环境并更改php解释器的端口。

如果我必须更新php版本,我将第二个域添加到页面e。 G。 updated.domain.com使用新的PHP版本。普通用户将看不到任何差异。但遗憾的是,只有使用相对路径并且文件中没有硬编码域时,这才有效。