如何自动确定项目使用哪些PHP扩展?

时间:2015-12-02 11:11:26

标签: php

有没有办法自动找出具有源代码的特定项目使用哪些PHP扩展?

当将网站从一个服务器迁移到另一个服务器时,我经常发现自己想知道我应该为网站正常运行启用哪些PHP扩展。是的,如果项目使用Docker或有详尽的安装指南,这个用例可能无关紧要,但情况并非总是如此。

我正在考虑一个遍历所有.php文件并查找特定函数调用或类的脚本,例如:

  • new mysqli(mysqli_connect(:mysqli
  • imagecreate(imagepngimagejpeg或......:gd
  • curl_init(:curl

是否已存在类似的脚本?如果没有,写它会有意义吗?

2 个答案:

答案 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

软件包的开发人员应在 requirecomposer.json 部分包含有关所需 PHP 扩展的信息, 例如"ext-curl": "*"
显然,这种方法的有效性很大程度上取决于开发人员的准时性 但这种检查快速且易于使用。

PHP 兼容性信息

最新版本和开发文档见here
可以找到最终用户文档 here, 您也可以从那里下载 PHAR 文件,但它可能已过时 (目前它托管版本 5.0.12,而 GitHub 和 Packagist 版本为 5.4.2)。
推荐的安装这个库的方法是通过 Composer。
我建议单独安装它,而不是在您要测试的项目中,因为:

  • PHP CompatInfo 还需要一些 PHP 扩展并且您想测试自己的项目 无需添加额外的依赖项。
  • PHP CompatInfo 可能需要与您的项目冲突的软件包版本, 例如5.4.2 版需要 symfony/config: ^4.4|^5.0,如果您的项目已经需要 symfony/config: ^3.0 那么您无法安装最新版本的 PHP CompatInfo 作为该项目的一部分, 即使您的系统可能允许。

在要测试的项目之外运行:

  1. composer create-project bartlett/php-compatinfo - 此命令将安装 PHP CompatInfo 及其所有依赖项,包括开发依赖项,然后构建一个 PHAR 文件。 如果您在安装开发依赖项时遇到问题,您可以忽略它们 composer create-project --no-dev --no-scripts bartlett/php-compatinfo, 在这种情况下,也不会构建 PHAR 文件,但无论如何都不需要。

  2. ./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_mysqlpdo_pgsql 驱动程序或其他东西。虽然我打赌你知道你使用的是哪个数据库。

误报示例:某些 PHP 框架和库可能包含用于处理众多服务的类 出于同样的目的。 例如,Yii 2 框架具有与 APCAPCumemcachememcachedXCache 一起使用的类。 PHP CompatInfo 会列出所有这些扩展,但这并不意味着它们真的在项目中使用, 你必须弄清楚自己。 图像处理 PHP 扩展 GDGmagickImagick 以及其他扩展也可能出现相同的情况。

答案 1 :(得分:2)

根据OP in their comment

的要求写答案

glenscott / PHP的依赖性

虽然不是一个完整的解决方案,但这将减少您必须完成的手动工作: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