我有一个PHP脚本文件夹,它们主要是实用程序脚本。如何在不同的PHP应用程序之间共享这些脚本,以便轻松地重用和部署?
我必须将我的应用程序打包到安装程序中,然后让用户安装它。
我可以将lib和硬编码放在include
路径中,但这意味着我每次将Web应用程序部署到新客户时都不会更改PHP代码。这是不可取的。
我考虑的另一个方法是将lib复制到其他应用程序,但是,由于lib不断更新,这意味着我需要不断进行复制,这会引入很多问题。我想要一种自动化的方法来做到这一点。
编辑:有些应用程序是Symfony,有些则不是。
答案 0 :(得分:5)
您可以创建一个PEAR包。
有关如何执行此操作的详细信息,请参阅Easy PEAR Package Creation。
这假设当你说任何人时,你的意思是在你的直接组织之外。
更新:您无需上传到网站即可安装PEAR包。只需将存档解压缩到pear文件夹即可在PHP应用程序中使用。
补充:为什么不为您的库创建新的SVN存储库?假设您创建了一个名为FOO的库。在repostory里面你可以使用trunk \ lib \ foo的文件夹heirachy。然后你的模块可以进入trunk \ lib \ foo \ modules并有一个名为trunk \ lib \ foo \ libfoo.php的文件。现在libfoo.php可以根据需要包含一次或需要一次所有模块。
答案 1 :(得分:4)
PHP现在支持Phar档案。 php.net上有完整的文档。 IBM网站上也有一个完整的教程。
使用Phar档案可以做的一件好事就是将整个应用程序打包并以这种方式分发。
http://www.ibm.com/developerworks/opensource/library/os-php-5.3new4/index.html
答案 2 :(得分:1)
啊,图书馆......
这里有两个相互矛盾的目的:
我建议您仔细查看 git 和 git submodules
为此,我们广泛使用git子模块。它允许两全其美,因为共享脚本可以在任何项目中随意升级,然后当您有时间并且正确测试时,可以将该更改移动到其他项目(故意)。
当然,你需要使用git来利用子模块,但是如果你不使用git,并且你开始,你最终会想知道你是如何生活的它
修改:由于原始海报使用的是svn,请考虑使用SVN Externals。
答案 3 :(得分:1)
更新:
你只需要将lib放在某个可以通过你的应用程序访问的地方(在你可以通过http或ftp或https或其它方式访问它的地方)并包含它。
如果您必须经常更新它,您可以将库打包在一个phar文件中,然后您可以为您的客户端提供一个功能,以便从某个远程路径中提取库并相应地更新其本地配置中的参数,例如: / p>
function updateLocalLibary(){
//read the remote library in a variable
$file= file_get_content($remoteLibraryRepository.$libraryPharFile);
//give it a unique name
$newLibraryName=$libraryPharFile."_".date('Ymdhsi');
//store the library it on a local file
file_put_content($localLibraryPath.$newLibraryName,$file);
//update the configuration, letting your app point to the new library
updateLatestLibraryPathInConfig($newLibraryName);
//possibly delete the old lib
}
在你的包含路径中,你没有必要的硬编码路径,你可以根据你的配置包含一个参数,如:
include( getLatestLibraryPathFromConfig() )
(您有责任保护检索,以便只让您的客户看到图书馆)
您的conf可以在db中,因此当您调用updateLibraryPathInConfig()时,您可以执行原子操作,并且您确定不会让客户端读取脏数据。
然后,客户可以根据需要更新其库。他们甚至可能安排定期更新。
答案 4 :(得分:0)
有很多选择:
我建议使用持续集成软件(Atlassian Bamboo,CruiseControl);检查您的存储库,构建一个包,然后使用rsync。自动。
答案 5 :(得分:0)
您还应该考虑使用命名空间,以避免与您可能使用的其他库发生冲突。 pear对于传递方法可能是一个好主意,但是,你可以将它放在标准路径/ usr / share / php /,或者在php设置文件中设置为包含路径的任何其他地方。
答案 6 :(得分:0)
好问题,可能是一个没有明确答案的问题。您基本上可以选择两种不同的策略来分发代码:您可以将常用代码放在一个位置,让各个应用程序从同一个共享位置加载,或者使用源控制系统在本地副本之间进行同步。它们不是互斥的,因此您经常会同时看到两种模式的使用。
您可以对include_path
进行分层,以创建不同的包含范围。此模式最明显的应用是全局维护的PEAR存储库和本地应用程序。如果您的it系统由多个共享一组通用库的应用程序组成,则可以在这些库之间添加一个层(框架层)。如果构造include_path
以使本地路径位于全局路径之前,则可以使用此方法对文件进行本地覆盖。这是扩展代码的一种相当粗略的方式,因为它可以按文件工作,但在某些情况下它可能很有用。
另一种策略是对单个共享存储库进行大量本地检出。分层包含模式的一些好处是,您可以进行更细粒度的本地更改。管理应用程序层(基础架构,框架,应用程序)之间的分离可能是一个挑战。 svn:externals
可以使用,但有一些限制。将全局更改传播到所有应用程序也稍微复杂一些。自动部署过程可以为此提供帮助。