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

在不同的PHP应用程序之间共享PHP脚本的最佳实践是什么?,php,Php,我有一个PHP脚本文件夹,它们大多是实用程序脚本。如何在不同的PHP应用程序之间共享这些脚本,以便易于重用和部署 我必须将我的应用程序打包到安装程序中,然后让用户安装它 我可以将lib和硬代码放在include路径中,但这意味着每次将web应用程序部署到新客户时,我都不必更改PHP代码。这是不可取的 我考虑的另一条途径是将LIB复制到其他应用程序,但是,由于LIB不断更新,这意味着我需要不断地进行复制,这会带来很多问题。我想要一个自动化的方法来做这件事 编辑:有些应用程序是Symfony,有些不

我有一个PHP脚本文件夹,它们大多是实用程序脚本。如何在不同的PHP应用程序之间共享这些脚本,以便易于重用和部署

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

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

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

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

这里有两个相互冲突的目的:

  • 更新脚本时保持清醒(即不破坏10个其他应用程序)
  • 将事情保持在一个有组织的逻辑位置,以提高开发效率
  • 我建议你仔细看看

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

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



    <> > >编辑:>原始海报使用的是VSN,考虑使用.< /P> < p>可以创建一个PEAR包。

    有关如何执行此操作的更多信息,请参阅

    这是假设当你说任何人时,你的意思是在你的直接组织之外

    更新:安装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归档文件可以做的一件整洁的事情是打包整个应用程序并以这种方式分发

    更新:

    你只需要把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可以在数据库中,这样当您调用updateLibraryPathInConfig()时,您就可以执行原子操作,并且确保不会让客户端读取脏数据


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

    有很多选择:

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

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

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

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

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

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

    我知道这两种选择。但是如果我把lib和硬代码放在include路径中,那意味着