繁体   English   中英

在不同的PHP应用程序之间共享PHP脚本的最佳实践是什么?

[英]What is the Best Practices to share PHP scripts among different PHP applications?

我有一个PHP脚本文件夹,它们主要是实用程序脚本。 如何在不同的PHP应用程序之间共享这些脚本,以便轻松地重用和部署?

我必须将我的应用程序打包到安装程序中,然后让用户安装它。

我可以将lib和硬编码放入include路径,但这意味着我每次将Web应用程序部署到新客户时都不会更改PHP代码。 这是不可取的。

我考虑的另一个途径是将lib复制到其他应用程序,但是,由于lib不断更新,这意味着我需要不断进行复制,这会引入很多问题。 我想要一种自动化的方法来做到这一点。

编辑:有些应用程序是Symfony,有些则不是。

您可以创建一个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可以根据需要包含一次或需要一次所有模块。

PHP现在支持Phar存档。 php.net上有完整的文档。 IBM网站上也有一个完整的教程。

使用Phar存档可以做的一件好事是将整个应用程序打包并以这种方式分发。

http://php.net/phar

http://www.ibm.com/developerworks/opensource/library/os-php-5.3new4/index.html

啊,图书馆......

这里有两个相互矛盾的目的:

  1. 更新脚本时的完美性(即不破坏其他10个应用程序)。
  2. 将事物保存在一个有组织的逻辑位置,以提高开发人员

我建议你仔细看看gitgit子模块

为此,我们广泛使用git子模块。 它允许两全其美,因为可以在任何项目中随意升级共享脚本,然后当您有时间并且正确测试时,可以将该更改移动到其他项目(故意)。

当然,你需要使用git来利用子模块,但是如果你不使用git, 并且你开始了 ,你最终会想知道没有它你是如何生活的。


编辑:由于原始海报使用svn,请考虑使用SVN外部

更新:

你只需将lib放在你的应用程序可以访问的某个地方(在你可以通过http或ftp或https或其他东西到达它的地方)并包含它。

如果您必须经常更新它,您可以将库打包在一个phar文件中,然后您可以为您的客户端提供一个函数来从某个远程路径中提取库并相应地更新其本地配置中的参数,例如:

 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()时,您可以执行原子操作,并且您确定不会让客户端读取脏数据。

然后,客户端可以根据需要更新其库。 他们甚至可能安排定期更新。

有很多选择:

  • tar + ftp / scp
  • 梨(见上文@Wayne)
  • SVN
  • rsync的
  • NFS

我建议使用持续集成软件(Atlassian Bamboo,CruiseControl); 检查您的存储库,构建一个包,然后使用rsync。 自动。

您还应该考虑使用命名空间,以避免与您可能使用的其他库冲突。 pear可能是交付方法的一个好主意,但是,您可以将它放在标准路径/ usr / share / php /,或者在php设置文件中设置为包含路径的任何其他位置。

好问题,也许是一个没有明确答案的问题。 您基本上可以选择两种不同的策略来分发代码:您可以将常用代码放在一个位置,让各个应用程序从同一个共享位置加载,或者使用源控制系统在本地副本之间进行同步。 它们不是互斥的,因此您经常会同时看到两种模式的使用。

使用文件系统共享代码

您可以对include_path进行分层以创建不同的包含范围。 此模式最明显的应用是全局维护的PEAR存储库和本地应用程序。 如果您的it系统由多个共享一组通用库的应用程序组成,则可以在这些库之间添加一个层(框架层)。 如果构造include_path以使本地路径位于全局路径之前,则可以使用此路径来进行文件的本地覆盖。 这是扩展代码的一种相当粗略的方式,因为它可以按文件工作,但在某些情况下它可能很有用。

使用源代码控制

另一个策略是对单个共享存储库进行大量本地检出。 分层包含模式的一些好处是,您可以进行更细粒度的本地更改。 管理应用程序层(基础架构,框架,应用程序)之间的分离可能是一个挑战。 svn:externals可以工作,但有一些限制。 将全局更改传播到所有应用程序也稍微复杂一些。 自动部署过程可以提供帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM