对我来说,将PHP部署到服务器或将其从一台服务器移动到另一台服务器并使其完全因数据库或cookie错误而失败并非罕见。我希望在这些问题发生之前能够更好地避免这些问题。
PHP中有哪些潜在的可移植性问题,关于不同的服务器,操作系统和PHP配置,以及它们如何解决?让我们假设我(不幸的是)除了FTP之外无法控制服务器环境。 (我会添加一个答案来开始)
答案 0 :(得分:1)
实际上,列出的内容太多了。原因是很难编写一个有用的应用程序,只启用了php的核心(根本没有扩展)。因此,如果您希望它非常便携,您需要能够回退到不同的扩展(例如,如果您使用MySQL的数据库,它应该能够使用PDO,MySQL和MySQLi扩展)。
实际上,您需要检查大量的依赖项。在这里列出所有内容是不切实际的(不是长镜头)。如果您在Windows上运行或启用安全模式,即使是包含路径这样简单的事情也是一个问题。这甚至没有考虑到不同的可能的ini设置。
幸运的是,有一个相当简单的解决方案。使用框架。大多数框架都有回退方法,可以根据服务器配置以多种方式执行操作。有很多框架,所以我不会详细说明我推荐的那个。通过使用抽象层,他们能够处理多种不同的可能配置(另一个例子是缓存技术,带有APC,Eacellerator,MySQL,XCache,Memcache等驱动程序)。
唯一能让你真正100%确定的事情就是测试。我建议你尽可能多地编写单元,集成和功能测试。 PHPUnit和Selenium等工具可以为此提供很大帮助。
一旦你进行了自动化测试,我建议使用持续集成工具(例如Hudson)来自动化基于SVN提交的测试。有了它,您可以设置多个目标平台进行测试。因此,您可以运行10或15个不同的虚拟服务器,并自动针对每个配置测试每个提交(Hudson将为您管理)。这样,无论如何,您都可以立即(很快,很快)知道您的代码是否适用于每次提交,而无需您做任何其他事情。
这不是一个容易解决的问题。但它可以通过一点点努力和一些独创性来解决。
您可以做的另一个合理的事情是宣布最低要求并检查它们。因此,如果您需要MySQL支持,请在安装期间检查它...同样可以使用INI设置...只需列出所需的最低配置,然后检查它。这样,如果有人想出一个“不受支持的平台”,你就不必担心,因为他们会被告知彻底不行......
最好的运气......
答案 1 :(得分:0)
某些服务器配置了启用魔术引号(magic_quotes_gpc=1
中的php.ini
),会自动调用addslashes()
上的$_GET
,$_POST
,{{1} }和$_COOKIE
。它最初是为了帮助初学者不知不觉地编写更安全的代码而引入的,但它的使用现在已被折旧。
要模拟在运行时禁用此错误,如果已启用,请在使用任何请求变量(改编自this comment)之前运行以下代码:
$_REQUEST
答案 2 :(得分:0)
魔术引用当然是个大问题,但是对于所有部署使用单个php.ini文件将是一个好主意。该文件可以在/ etc / php5(或者您使用的任何PHP版本)中找到。这将确保跨所有服务器的PHP配置相同(包括魔术引号设置)。此外,请确保您还检查phpinfo()函数,以确保您在所有服务器上使用相同版本的PHP。此外,确保在将PHP部署到新服务器时,您有一个已安装的所有软件包的列表,例如MCrypt,PEAR,PECL Libraries,ImageMagick等。