有没有办法自动找出具有源代码的特定项目使用哪些PHP扩展?
当将网站从一个服务器迁移到另一个服务器时,我经常发现自己想知道我应该为网站正常运行启用哪些PHP扩展。是的,如果项目使用Docker或有详尽的安装指南,这个用例可能无关紧要,但情况并非总是如此。
我正在考虑一个遍历所有.php文件并查找特定函数调用或类的脚本,例如:
new mysqli(
或mysqli_connect(
:mysqli imagecreate(
或imagepng
或imagejpeg
或......:gd curl_init(
:curl 是否已存在类似的脚本?如果没有,写它会有意义吗?
答案 0 :(得分:4)
我可以建议两种不同的方法:Composer 和 PHP CompatInfo。
对于安装了依赖项的 Composer 项目,您可以使用命令检查需求
composer check-platform-reqs
注意它不分析代码,它只检查来自 composer.lock
文件的信息
或 vendor
目录中的文件,以存在者为准。
结果示例:
composer-plugin-api 1.1.0 success
ext-ctype 7.2.24 success
ext-curl 7.2.24 success
ext-dom 20031129 success
ext-zip n/a phpoffice/phpspreadsheet requires ext-zip (*) missing
php 7.2.24 success
软件包的开发人员应在 require
的 composer.json
部分包含有关所需 PHP 扩展的信息,
例如"ext-curl": "*"
。
显然,这种方法的有效性很大程度上取决于开发人员的准时性
但这种检查快速且易于使用。
最新版本和开发文档见here。
可以找到最终用户文档
here,
您也可以从那里下载 PHAR 文件,但它可能已过时
(目前它托管版本 5.0.12,而 GitHub 和 Packagist 版本为 5.4.2)。
推荐的安装这个库的方法是通过 Composer。
我建议单独安装它,而不是在您要测试的项目中,因为:
symfony/config: ^4.4|^5.0
,如果您的项目已经需要 symfony/config: ^3.0
那么您无法安装最新版本的 PHP CompatInfo 作为该项目的一部分,
即使您的系统可能允许。在要测试的项目之外运行:
composer create-project bartlett/php-compatinfo
- 此命令将安装 PHP CompatInfo
及其所有依赖项,包括开发依赖项,然后构建一个 PHAR 文件。
如果您在安装开发依赖项时遇到问题,您可以忽略它们
composer create-project --no-dev --no-scripts bartlett/php-compatinfo
,
在这种情况下,也不会构建 PHAR 文件,但无论如何都不需要。
./php-compatinfo/bin/phpcompatinfo analyser:run --progress path/to/project
- 此命令将分析代码
并且可能会产生一个巨大的报告,但开头应该是这样的:
Extensions Analysis
Extension REF EXT min/Max PHP min/Max
Core Core 5.1.0 5.1.0
json json 5.2.0 5.2.0
C mongo mongo 0.9.0 5.0.0
pcre pcre 4.0.0 4.0.0
session session 4.0.0 4.0.0
standard standard 5.2.3 5.2.3
Total [6] 5.2.3
有关详细信息,请参阅上述文档和内置帮助:
帮助信息
./php-compatinfo/bin/phpcompatinfo --help
列出可用命令
./php-compatinfo/bin/phpcompatinfo list
关于命令的帮助信息
./php-compatinfo/bin/phpcompatinfo analyser:run --help
PHP CompatInfo 无法解析无效的 PHP 代码,因此如果您在分析过程中得到 Fatal error
那么这可能就是原因。
某些软件包可能包含带有错误 PHP 代码的测试文件,这些文件从未执行但用于测试,
此类包的示例是 squizlabs/php_codesniffer
。
我建议暂时删除整个包或只删除它的测试,以避免在分析过程中出错。
PHP CompatInfo 可能会产生假阳性和假阴性结果。
假阴性示例:库可以检测到您的项目使用了PDO
,但无法检测是否使用
使用 pdo_mysql
或 pdo_pgsql
驱动程序或其他东西。虽然我打赌你知道你使用的是哪个数据库。
误报示例:某些 PHP 框架和库可能包含用于处理众多服务的类
出于同样的目的。
例如,Yii 2 框架具有与 APC
、APCu
、memcache
、memcached
和 XCache
一起使用的类。
PHP CompatInfo 会列出所有这些扩展,但这并不意味着它们真的在项目中使用,
你必须弄清楚自己。
图像处理 PHP 扩展 GD
、Gmagick
和 Imagick
以及其他扩展也可能出现相同的情况。
答案 1 :(得分:2)
根据OP in their comment
的要求写答案虽然不是一个完整的解决方案,但这将减少您必须完成的手动工作:https://github.com/glenscott/php-dependencies
有一些警告;
您可以在此处阅读作者的博文:http://www.glenscott.co.uk/blog/finding-function-dependencies-in-your-php-applications/
运行
您可以通过命令行或Web浏览器执行这些操作。
步骤1)获取PHP环境详细信息:
php get-env-functions.php
步骤2)查找依赖项:
php scan-dependencies.php