PHP包(phpspreadsheet)安装记录

你好,为了安装phpspreadsheet,我在项目目录中执行php composer.phar require phpoffice/phpspreadsheet,输出是: 

Cannot use phpoffice/phpspreadsheet’s latest version 5.0.0 as it requires ext-mbstring * which is missing from your platform. 

Cannot use phpoffice/phpspreadsheet 1.14.1 as it requires php ^7.2 which is not satisfied by your platform. 

Installation failed, deleting ./composer.json. 

In RequireCommand.php line 226: 

  No composer.json present in the current directory (./composer.json), this may be the cause of the following exception. 

In PackageDiscoveryTrait.php line 325: 

  Package phpoffice/phpspreadsheet has requirements incompatible with your PHP version, PHP extensions and Composer version: 

    – phpoffice/phpspreadsheet 5.0.0 requires ext-mbstring * but it is not present. 

require [–dev] [–dry-run] [–prefer-source] [–prefer-dist] [–prefer-install PREFER-INSTALL] [–fixed] [–no-suggest] [–no-progress] [–no-update] [–no-install] [–no-audit] [–audit-format AUDIT-FORMAT] [–update-no-dev] [-w|–update-with-dependencies] [-W|–update-with-all-dependencies] [–with-dependencies] [–with-all-dependencies] [–ignore-platform-req IGNORE-PLATFORM-REQ] [–ignore-platform-reqs] [–prefer-stable] [–prefer-lowest] [-m|–minimal-changes] [–sort-packages] [-o|–optimize-autoloader] [-a|–classmap-authoritative] [–apcu-autoloader] [–apcu-autoloader-prefix APCU-AUTOLOADER-PREFIX] [–] [<packages>…] 

请问问题是什么,如何解决? 

显示思路

好的,我们来分析一下这个错误信息。

这个问题非常明确和常见:您用来运行 Composer 的 PHP 环境(命令行环境)缺少一个名为 mbstring 的关键扩展


问题诊断 🧐

让我们分解一下错误信息的核心部分:

  1. ...requires ext-mbstring * which is missing from your platform. 这行是关键。phpoffice/phpspreadsheet 这个库需要 mbstring 扩展来处理多字节字符串(比如中文字符、特殊符号等),而 Composer 在检查您的 PHP 环境时,发现这个扩展没有被加载。
  2. Package phpoffice/phpspreadsheet has requirements incompatible with your PHP version, PHP extensions... 这是 Composer 的总结性陈词。它尝试了最新版的 phpoffice/phpspreadsheet,发现缺少 mbstring;然后它可能尝试了旧版本,发现有其他不兼容问题,最终放弃安装。

根本原因:您服务器上的 PHP 环境(特别是命令行 CLI 使用的配置)没有启用 mbstring 扩展。这与之前我们讨论的 PHP 配置混乱问题是一脉相承的。即使 Apache(网页服务器)的 PHP 环境加载了它,命令行环境也可能没有。


解决方案 🛠️

我们需要为您的 PHP 命令行 (CLI) 环境安装并启用 mbstring 扩展。这通常非常简单。

步骤一:安装 PHP mbstring 扩展

首先,我们需要确保对应您 PHP 8.2 版本的 mbstring 扩展包已经安装。

请在您的服务器上运行以下命令:

Bash

sudo apt-get update
sudo apt-get install php8.2-mbstring
  • apt-get update:更新软件包列表,确保能找到最新的包。
  • apt-get install php8.2-mbstring:为 PHP 8.2 版本专门安装 mbstring 扩展。

注意:根据您之前的输出,系统可能提示您这个包已经安装了。这没关系,执行一遍可以确保万无一失。如果已安装,它会直接告诉您。

步骤二:验证扩展是否被加载

安装完成后,我们需要验证命令行的 PHP 环境是否成功加载了它。

运行以下命令:

Bash

php -m | grep mbstring
  • php -m 会列出所有当前已加载的 PHP 模块。
  • | grep mbstring 会筛选出包含 “mbstring” 的那一行。

期望的输出结果: 如果您看到输出了 mbstring,那就说明扩展已经成功加载,问题解决了!

如果没有任何输出: 这说明扩展虽然安装了,但没有在 php.ini 配置文件中被启用。这在我们之前的讨论中也遇到过。请执行以下操作:

  1. 找到 CLI 的 php.ini 文件:Bashphp --ini 这会显示 Loaded Configuration File: 后面的路径,例如 /etc/php/8.2/cli/php.ini
  2. 编辑这个文件:Bashsudo nano /etc/php/8.2/cli/php.ini (请将路径替换为您上一步找到的实际路径)
  3. 在文件中找到(使用 Ctrl + W 搜索) extension=mbstring 这一行,确保它前面的分号 ; 被移除了。如果找不到这一行,可以在文件末尾手动添加 extension=mbstring
  4. 保存文件 (Ctrl + X, 然后按 Y, 最后按 Enter)。
  5. 再次运行 php -m | grep mbstring 来验证。这次应该就能看到了。

步骤三:重新运行 Composer 命令

在确认 mbstring 扩展已经加载后,回到您的项目目录,然后再次运行安装命令:

Bash

cd /path/to/your/project
php composer.phar require phpoffice/phpspreadsheet

这一次,Composer 检查环境时会发现 mbstring 已经存在,应该就能顺利完成 phpoffice/phpspreadsheet 的下载和安装了。

我执行了1、sudo apt-get update 

sudo apt-get install php8.2-mbstring;2、php -m | grep mbstring,这次观察到了有输出mbstring;3、于是我直接执行cd /path/to/your/project 

php composer.phar require phpoffice/phpspreadsheet,现在输出: 

./composer.json has been created 

Running composer update phpoffice/phpspreadsheet 

Loading composer repositories with package information 

Updating dependencies 

Lock file operations: 9 installs, 0 updates, 0 removals 

  – Locking composer/pcre (3.3.2) 

  – Locking maennchen/zipstream-php (3.1.2) 

  – Locking markbaker/complex (3.0.2) 

  – Locking markbaker/matrix (3.0.1) 

  – Locking phpoffice/phpspreadsheet (5.0.0) 

  – Locking psr/http-client (1.0.3) 

  – Locking psr/http-factory (1.1.0) 

  – Locking psr/http-message (2.0) 

  – Locking psr/simple-cache (3.0.0) 

Writing lock file 

Installing dependencies from lock file (including require-dev) 

Package operations: 9 installs, 0 updates, 0 removals 

  – Downloading psr/simple-cache (3.0.0) 

  – Downloading psr/http-message (2.0) 

  – Downloading psr/http-factory (1.1.0) 

  – Downloading psr/http-client (1.0.3) 

  – Downloading markbaker/matrix (3.0.1) 

  – Downloading markbaker/complex (3.0.2) 

  – Downloading maennchen/zipstream-php (3.1.2) 

  – Downloading composer/pcre (3.3.2) 

  – Downloading phpoffice/phpspreadsheet (5.0.0) 

  – Installing psr/simple-cache (3.0.0): Extracting archive 

  – Installing psr/http-message (2.0): Extracting archive 

  – Installing psr/http-factory (1.1.0): Extracting archive 

  – Installing psr/http-client (1.0.3): Extracting archive 

  – Installing markbaker/matrix (3.0.1): Extracting archive 

  – Installing markbaker/complex (3.0.2): Extracting archive 

  – Installing maennchen/zipstream-php (3.1.2): Extracting archive 

  – Installing composer/pcre (3.3.2): Extracting archive 

  – Installing phpoffice/phpspreadsheet (5.0.0): Extracting archive 

6 package suggestions were added by new dependencies, use `composer suggest` to see details. 

Generating autoload files 

2 packages you are using are looking for funding. 

Use the `composer fund` command to find out more! 

No security vulnerability advisories found. 

Using version ^5.0 for phpoffice/phpspreadsheet 

现在表示安装成功了吗?有什么注意事项吗? 

显示思路

太棒了!是的,这表示已经完全成功安装了。🎉

我们可以从您的输出日志中看到几个关键的成功标志:

  • ./composer.json has been created:Composer 为您的项目创建了配置文件。
  • Locking phpoffice/phpspreadsheet (5.0.0):Composer 锁定了 phpspreadsheet 及其所有依赖包的版本。
  • Downloading ... 和 Installing ...:成功下载并安装了所有必需的软件包。
  • Generating autoload files:这是最重要的一步,Composer 创建了 vendor/autoload.php 文件,您之后在代码中需要引入它来使用这些库。
  • No security vulnerability advisories found:没有发现已知的安全漏洞。

注意事项和后续步骤

现在您已经成功安装了库,接下来是在您的 PHP 代码中使用它。

1. 引入 autoload.php 文件

这是使用 Composer 安装的库的核心。在您的 PHP 代码(比如您在 wpcode 中编写的 PHP snippet)的最开始,您必须引入 Composer 生成的 autoload.php 文件。

这个文件会自动加载所有您需要的类,您无需再为每个库文件写 require 或 include

根据您的项目结构,这个文件通常位于您执行 composer.phar 命令的目录下的 vendor 文件夹中。所以,您的代码会是这样:

PHP

<?php
// 引入 Composer 的自动加载文件
// 'path/to/your/project/vendor/autoload.php' 需要替换成您的实际路径
require_once '/path/to/your/project/vendor/autoload.php';

// 引入 PhpSpreadsheet 库中的类
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

// 现在您就可以开始使用 PhpSpreadsheet 的功能了
// 例如,创建一个新的电子表格对象
// $spreadsheet = new Spreadsheet();
// ... 您的后续代码 ...

2. 确定 autoload.php 的正确路径

您需要确定 /path/to/your/project/ 到底是什么。既然您是在项目目录中执行的安装命令,那么现在您可以在该目录下运行 ls -l 命令,您应该会看到:

  • 一个 vendor 文件夹
  • 一个 composer.json 文件
  • 一个 composer.lock 文件

所以,autoload.php 的完整路径就是 您当前目录的绝对路径/vendor/autoload.php

3. 忽略 vendor 目录

如果您使用 Git 等版本控制工具,通常会将 vendor/ 目录添加到 .gitignore 文件中。因为这个目录里的所有内容都可以通过运行 composer install 命令(根据 composer.lock 文件)重新生成,无需将它们提交到代码库中。

恭喜您解决了这个棘手的环境问题!现在您可以专注于编写核心功能的代码了。

在这此前,我有两个问题:1、请你总结一下这个过程,并分析一下前面的问题出在哪里,我想作为以后问题的分析参考(我的记忆中确实没有执行过sudo apt-get install php8.2-mbstring,尤其是显示的带着8.2的版本号)2、以后我的所有composer安装都需要以php composer.phar require的方式吗?这有点恼火,我还是希望以composer require的方式进行,有方法吗? 

显示思路

当然,这两个问题都非常好,能帮助您在未来更高效地解决问题。我们来逐一分析。

1. 过程总结与问题根源分析

过程总结

我们这次的调试过程像一个“侦探解谜”,层层深入,最终找到了根源:

  1. 最初目标:使用 Composer 安装 phpoffice/phpspreadsheet
  2. 初次碰壁:Composer 报错,提示缺少 mbstring 扩展。
  3. 尝试解决:您之前尝试过安装 php-mbstring,但问题依旧。我们甚至一度怀疑是 Composer 版本或者 PHP 核心配置的问题。
  4. 深入诊断:通过一系列诊断命令 (php --iniphp -mfind ... mbstring.so 等),我们发现了一个核心矛盾:您的系统似乎存在多个 PHP 配置,导致命令行(CLI)运行的 php 程序,无法加载到它所需要的模块 (.so 文件)。
  5. 锁定真凶:问题的根源在于,PHP 的模块安装需要和 PHP 的主程序版本精确匹配。一个通用的 apt install php-mbstring 命令可能会为系统默认的 PHP 版本安装模块,但未必是您正在使用的 php8.2
  6. 精准打击:我们最终执行的 sudo apt-get install php8.2-mbstring 命令,就是告诉系统:“请为 PHP 8.2 版本 安装它对应的 mbstring 模块”。这个命令会确保:
    • 下载与 PHP 8.2 ABI (应用程序二进制接口) 兼容的 mbstring.so 文件。
    • 将其放置在 PHP 8.2 该去寻找的目录 (/usr/lib/php/20220829/)。
    • 自动在 PHP 8.2 的配置目录中 (/etc/php/8.2/cli/conf.d/) 创建一个 .ini 文件来启用这个扩展。
  7. 问题解决:完成这一步后,php -m 成功列出了 mbstring,Composer 的环境检查也顺利通过,安装成功。

核心教训 (Key Takeaways)

  • PHP 环境并非铁板一块:一个服务器上,命令行 (CLI) 的 PHP 和 网页服务器 (Apache/Nginx) 的 PHP可以使用完全不同的配置文件 (php.ini) 和加载不同的扩展。解决 Composer 问题,就要聚焦于 CLI 环境。
  • 包管理要精确到版本:在使用 apt 等包管理器为特定版本的软件(如 PHP 8.2)安装插件或模块时,最佳实践是明确指定版本号,如 php8.2-mbstringphp8.2-xmlphp8.2-zip 等。这能避免因系统上存在多个 PHP 版本而导致的混乱。

2. 如何全局使用 composer 命令

您完全不必忍受每次都输入 php composer.phar 的烦恼。这只是运行 Composer 的一种方式,通常用于单个项目或无法获得系统权限的情况。将其变成一个全局命令非常简单。

composer.phar 本质上是一个 PHP 的可执行归档文件。要让它变成像 lscdapt 一样的全局命令,我们只需要做两件事:

  1. 把它移动到一个位于您系统 PATH 环境变量中的目录里。
  2. 给它可执行权限,并去掉 .phar 后缀。

一步到位的解决方案

请在您存放 composer.phar 的目录下,执行以下命令:

Bash

sudo mv composer.phar /usr/local/bin/composer

让我们分解一下这个命令:

  • sudo:因为 /usr/local/bin 是一个系统目录,需要管理员权限才能写入。
  • mv composer.phar:移动 composer.phar 这个文件。
  • /usr/local/bin/composer:这是目标路径和新的文件名。
    • /usr/local/bin 是 Linux 系统中专门用来存放用户自行安装的软件可执行文件的目录,并且它默认就在系统的 PATH 环境变量中。
    • 我们将 composer.phar 重命名为 composer,这样您就可以直接输入 composer 来执行它了。

验证一下

操作完成后,关闭当前的终端再重新打开一个新的(或者运行 source ~/.bashrc 来刷新环境),然后尝试在任何目录下运行:

Bash

composer --version

如果命令成功执行并输出了 Composer 的版本号,那就恭喜您!现在您可以在任何项目目录下直接使用 composer require ...composer installcomposer update 等简洁的命令了。

有没有可能是前面没有执行sudo apt-get update?导致sudo apt-get install php-mbstring没能获得新版本。现在有什么命令可以检测如果我在执行sudo apt-get install php-mbstring时,预期获得的安装版本是什么? 

显示思路

您提出了一个非常好的问题,这确实是 apt 包管理中一个常见的关键点,也触及到了我们之前问题的核心。

您的猜测是非常有可能的,并且是部分正确的

  1. sudo apt-get update 的作用:这个命令本身不安装或升级任何软件。它的唯一作用是连接到 Ubuntu 的软件源服务器,下载最新的软件包列表。这个列表包含了所有可用软件包的名称、它们的版本号以及它们依赖的其他包的信息。
    • 如果您长时间没有运行 update,您本地的软件包列表就会过时。
    • 当您运行 apt-get install 时,系统会根据这个过时的本地列表去查找软件包,这很可能导致它找不到最新的版本,或者安装了一个不兼容的旧版本。
  2. php-mbstring vs php8.2-mbstring:这是更关键的一点。php-mbstring 是一个“虚拟包”或“元包”。它本身不包含文件,而是作为一个指针,指向系统默认 PHP 版本所对应的 mbstring 包。
    • 在一个干净的、只有一个 PHP 版本的系统上,php-mbstring 可能会正确地指向 php8.2-mbstring
    • 但是在一个像您这样可能通过 PPA (比如 ondrej/php) 安装了多版本 PHP 环境的服务器上,这个“默认”指向可能就不那么可靠了。

所以,整个问题的完整图景可能是: “由于可能没有运行 apt-get update,导致包列表陈旧,再加上使用了模糊的 php-mbstring 包名,最终系统没能为您的 PHP 8.2 环境找到并安装正确的模块。”


如何检测预期安装的版本?

是的,有非常好的命令可以做到这一点,而且这是日常服务器管理中非常有用的技巧。

方法一:使用 apt-cache policy (推荐)

这个命令会显示一个软件包的版本信息,包括哪个版本已安装、哪个版本是可用的安装候选,以及它们来自哪个软件源。

请运行:

Bash

apt-cache policy php-mbstring

您可能会看到类似这样的输出:

php-mbstring:
  Installed: (none)
  Candidate: 2:8.2+92+ubuntu22.04.1+deb.sury.org+1
  Version table:
     2:8.2+92+ubuntu22.04.1+deb.sury.org+1 500
        500 http://ppa.launchpad.net/ondrej/php/ubuntu jammy/main amd64 Packages

输出解读

  • Installed: (none):表示当前没有安装这个包。
  • Candidate: 2:8.2+...:这就是答案。它告诉您,如果现在执行 apt-get install php-mbstring,系统将会安装版本号为 2:8.2+... 的这个包。从版本号里我们可以清晰地看到它对应的是 PHP 8.2
  • Version table:列出了所有可用的版本和它们的来源。

方法二:使用模拟安装 (Dry Run)

您可以在 install 命令后加上 -s 或 --simulate 标志,apt 会模拟整个安装过程,列出它将要执行的所有操作(包括要安装哪些包、版本是什么),但并不会真的执行

请运行:

Bash

sudo apt-get install -s php-mbstring

或者

Bash

sudo apt-get install --simulate php-mbstring

这个命令的输出会比较长,但它会明确告诉您 The following NEW packages will be installed: (将会安装以下新软件包),并在列表中显示出包的精确名称和版本号。

通过这两个命令,您就可以在执行任何安装操作之前,精准地预知将会发生什么,从而避免安装错误的软件版本。

https://g.co/gemini/share/507b46eb794c

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top