基本上我只是想知道我是否可以将libPHP5.so文件拖放到没有
PHP的另一台服务器上,并具有
PHP的功能和静态编译到其中的所有扩展. (源自一堆扩展的源代码编译)
我尝试在so文件(在我的服务器上)上使用ld工具,但它只是吐出一堆未定义的引用.这是因为它的工作安装无关紧要.
编辑:
我现在意识到我使用的是ld而不是ldd.
现在我得到一个依赖项列表.我猜我需要所有这些文件正确吗?所以我的问题是,如果我递归获取所有共享对象文件并将它们放在目标服务器上的相同位置(可能通过自定义RPM),PHP将在没有正式安装PHP的情况下运行新服务器吗?
我可以错过任何ldd找不到的隐藏依赖项吗?
解决方法
.so库是一个共享库 – 与静态库完全相反.如果您静态编译PHP安装,您将拥有一个(非常大)可执行文件,可能称为“PHP”,但不会有.so文件.
我认为“静态地”编译.so文件是不可能的(或者至少是一个非常糟糕的主意).原因是您将有效地将数百个(如果不是数千个)函数复制到.so文件中,这不仅会使其变大,而且还会在加载库时导致错误.例如,如果一个应用程序(例如Web服务器)加载了标准C库,其中包含函数strcpy(),那么它会加载你的’static’.so文件,里面还有一个strcpy()函数,是一场冲突.你可以通过小心地只导出必要的符号或在应用程序中使用dlopen()来解决这个问题,但最多你会得到一个大量超大的.so文件,浪费了大量的内存.
你可以做的是使用ldd来挑选运行所有扩展所需的所有.so文件,然后将它们全部放在与.so文件相同的文件夹中.如果在运行应用程序之前将LD_LIBRARY_PATH环境变量设置为该目录,它应该从该文件夹中获取PHP及其所有依赖项.这不会给你神奇的单文件方法,但至少可以让你把所有内容都包含在一个文件夹中.