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

时间:2009-07-02 06:14:40

标签: php

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

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

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

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

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

7 个答案:

答案 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://php.net/phar

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

答案 2 :(得分:1)

啊,图书馆......

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

  1. 更新脚本时的完美性(即不破坏其他10个应用程序)。
  2. 将事物保存在一个有组织的逻辑位置,以提高开发人员的效率。
  3. 我建议您仔细查看 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)

有很多选择:

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

使用文件系统共享代码

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

使用source-control

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