composer安装Laravel 11报错:laravel/framework[v11.9.0, …, v11.23.3] require fruitcake/php-cors ^1.3 -> found fruitcake/php-cors[dev-feat-setOptions, dev-master, dev-maincomposer…

我在使用composer安装Laravel 11的时候,遇到如下错误:

Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - laravel/framework[v11.9.0, ..., v11.23.3] require fruitcake/php-cors ^1.3 -> found fruitcake/php-cors[dev-feat-setOptions, dev-master, dev-main, dev-test-8.2, v0.1.0, v0.1.1, v0.1.2, v1.0-alpha1, ..., 1.2.x-dev (alias of dev-master)] but it does not match the constraint.
    - Root composer.json requires laravel/framework ^11.9 -> satisfiable by laravel/framework[v11.9.0, ..., v11.23.3].

原因是阿里云composer镜像源中没有fruitcake/php-cors包的最新版。

解决方法是,切换回默认的composer镜像源:

composer config -g --unset repos.packagist

执行composer install就安装成功了,不再报错。

参考

https://github.com/laravel/framework/issues/51201

升级PHP版本导致WordPress无法显示文章,而是显示“有点尴尬诶!该页无法显示。”的解决方法

我的WordPress版本是5.4.15,当我把服务器系统里的PHP 7.2升级到PHP 8.2后,通过浏览器访问WordPress网站,无法显示文章,而是显示“有点尴尬诶!该页无法显示。”这句话。

经测试,PHP可以正常连接到MySQL数据库。

原因应该是WordPress 5.4.15用到的某些PHP函数在PHP 8.2过时了。

升级WordPress到最新版本解决了这个问题。

为什么PHP的Composer包管理使用vendor模式而非全局模式?

vendor模式即在每个项目都创建一个vendor目录,用来存储本项目依赖的第三方模块的包或库文件。

全局模式即在操作系统的某个全局目录(一般是用户家目录里的某个子目录或者操作系统的某个系统目录)里,存储第三方模块的包或库文件,可以被多个项目共用,优点是相对于vendor模式节省存储空间。

都说PHP项目上线速度快,最大原因是PHP项目可以热更新热部署,通过FTP把整个PHP项目的源代码文件上传到服务器就部署好了,都不用重启Web服务器软件的。但是如果使用全局模式就会破坏这种方便的部署方式,因为你把PHP项目的源代码文件上传到服务器后,要么你还要把全局目录上传到服务器,要么你还需要在服务器运行composer命令安装本项目所缺的依赖项。使用vendor模式,就没有这个烦恼了。

Composer包管理器使用vendor模式,而非全局模式,应该就是出于这点考虑。像Go的go get、Java的maven、Node.js的npm、Python的pip使用全局模式,是因为它们无法做到像PHP那样热更新热部署Web项目。

PHP Warning: Module ‘curl‘ already loaded in Unknown on line 0警告的解决方法

我的软件环境是:Ubuntu 22操作系统,使用apt安装的PHP 8.2。

如果在执行PHP相关命令时,看到一条警告消息:

PHP Warning: Module ‘curl‘ already loaded in Unknown on line 0

那是由于curl模块被重复启用。如果在/etc/php/8.2/fpm/php.ini和/etc/php/8.2/fpm/conf.d/20-curl.ini两处配置文件里都启用了curl扩展,就会报这个警告。

解决方法是在/etc/php/8.2/fpm/conf.d/20-curl.ini配置文件中启用curl扩展即可,而在其他配置文件中都不启用curl扩展。

/etc/php/8.2/fpm/conf.d/里的配置文件其实都是/etc/php/8.2/mods-available/里的配置文件的符号链接,这些配置文件中的扩展是被PHP默认启用的。

修改了配置文件记得重启php-fpm服务。最后只要在php -m命令的输出中或者通过浏览器访问phpinfo函数的PHP脚本的输出中看到curl了,就说明已启用curl扩展。

Ubuntu22安装PHP8.2的方法

首先更新系统:

sudo apt update && sudo apt upgrade -y

Ondrej sury PPA仓库是目前维护PHP最新版本的仓库,我们添加这个仓库:

sudo add-apt-repository ppa:ondrej/php

再次更新系统以使添加的Ondrej sury PPA仓库生效:

sudo apt update && sudo apt upgrade -y

安装php8.2:

sudo apt install php8.2 -y

安装完成后,检查php的版本:

php --version

使用sudo apt-get install php8.2-PACKAGE_NAME命令安装php常用扩展,把PACKAGE_NAME替换为具体的扩展名:

sudo apt-get install -y php8.2-cli php8.2-common php8.2-fpm php8.2-mysql php8.2-zip php8.2-gd php8.2-mbstring php8.2-curl php8.2-xml php8.2-bcmath

查看已经安装了哪些php扩展:

php -m

参考

https://techvblogs.com/blog/install-php-8-2-ubuntu-22-04

CentOS7安装PHP8的方法

前置条件

在Centos7上安装PHP8之前,必须安装EPEL(企业Linux的额外软件包)存储库。你可以通过运行以下命令进行安装:

sudo yum install epel-release

在Centos7上安装PHP8

1.将Remi存储库添加到你的CentOS7的系统中。此存储库为各种Linux发行版提供了PHP的更新版本:

sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
sudo yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm

2.通过运行以下命令禁用Remi存储库中的旧PHP版本的安装包:

sudo yum install yum-utils
sudo yum-config-manager --disable remi-php*
sudo yum-config-manager --disable php-5*

否则你运行sudo yum install php命令安装PHP时,可能找到的是PHP 5.x版本的安装包。

3.通过运行以下命令启用Remi存储库中的PHP 8.x版本的安装包:

sudo yum-config-manager --enable remi-php82

截至2023/09/22,Remi存储库中还没有php8.3版本的安装包,于是我们启用php8.2的安装包。

4.通过运行以下命令更新系统里的程序包列表:

sudo yum update

5.通过运行以下命令安装PHP:

sudo yum install php

如果yum说php8.2依赖httpd,但是系统里没有安装httpd。CentOS7系统的默认仓库/etc/yum.repos.d/CentOS-Base.repo里已经包含了httpd软件的安装包,执行以下命令安装:

sudo yum install httpd

成功安装httpd后,再次运行以下命令安装PHP:

sudo yum install php

可以看到yum找到的是PHP8.2版本的安装包:

键入y再按回车键,开始下载安装……

6.通过运行以下命令查看PHP是否安装成功:

php -v

如果输出如下信息,就表示我们成功安装PHP8.2了:

PHP 8.2.10 (cli) (built: Aug 29 2023 15:31:38) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.2.10, Copyright (c) Zend Technologies

7.通过运行以下命令安装常用PHP扩展库:

sudo yum install php-fpm php-mysqlnd

在yum解析依赖过程中的输出信息中,我们需要注意一下这些即将被安装的PHP扩展库的版本应该也是8.2,并且应该也是从remi-php82仓库里下载的。

可以通过运行以下命令查看目前安装了哪些PHP扩展库:

php -m

参考

https://baransel.dev/post/how-to-install-php8-on-centos/

https://www.tecmint.com/install-php-8-on-centos/

Server sent charset (255) unknown to the client. Please, report to the developers的解决方法

MySQL 8将默认字符集更改为utf8mb4。但是有些客户端不知道这个字符集。因此,当服务器向客户端报告其默认字符集,而客户端不知道其含义时,就会抛出此错误。

该错误针对C++实现的MySQL Connector,因此它影响的不仅仅是PHP。

正确的解决方案是升级你的客户端,但与此同时我通过将服务器的字符集更改为utf8来使其正常工作,以与未升级的客户端兼容。我将以下配置添加到/etc/my.cnf并重新启动mysqld:

[mysqld]
collation-server = utf8_unicode_ci
character-set-server = utf8

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

参考

https://stackoverflow.com/questions/43437490/pdo-construct-server-sent-charset-255-unknown-to-the-client-please-rep

https://bugs.mysql.com/bug.php?id=71606