-
在 PHP 8.0 及以上版本中,联合类型(Union Types) 是一个重要特性,它允许一个参数、返回值或属性声明为多个可能的类型。这为模拟泛型行为提供了更强的类型安全性。1. 联合类型基础联合类型用 | 分隔多个类型,表示值可以是其中任意一种类型。示例:函数参数与返回值function printId(int|string $id): void { echo "ID: " . $id; } printId(100); // 合法(int) printId("abc123"); // 合法(string) printId([]); // 报错:TypeError 示例:类属性class User { public int|string $id; } $user = new User(); $user->id = 1; // 合法 $user->id = "abc"; // 合法 $user->id = []; // 报错:TypeError 2. 联合类型与泛型结合虽然 PHP 没有原生泛型,但可以通过联合类型 + @template(PHPDoc)模拟泛型行为。示例:模拟泛型函数/** * @template T * @param T $value * @return T */ function identity(int|string|array $value): int|string|array { return $value; } $num = identity(42); // 返回 int $str = identity("foo"); // 返回 string $arr = identity([1, 2]); // 返回 array 示例:泛型集合类/** * @template T */ class Box { /** @var T */ private mixed $value; /** * @param T $value */ public function __construct(mixed $value) { $this->value = $value; } /** * @return T */ public function getValue(): mixed { return $this->value; } } $intBox = new Box(42); // Box<int> $strBox = new Box("foo"); // Box<string> 3. 联合类型的高级用法(1) 可空类型(Nullable Types)PHP 8.0 之前用 ?Type 表示可空,现在也可以用联合类型:function greet(?string $name): void { echo "Hello, " . ($name ?? "Guest"); } // 等价于: function greet(string|null $name): void { /* ... */ } (2) 联合类型与 null 结合function findUser(int $id): User|null { // 返回 User 或 null } (3) 联合类型与 false(PHP 8.1+)PHP 8.1 允许 false 作为联合类型的一部分(常用于兼容 false 返回值):function strpos(string $haystack, string $needle): int|false { // 返回 int 或 false } 4. 联合类型的运行时检查PHP 不会自动检查联合类型,但可以手动验证:function processInput(int|string $input): void { if (is_int($input)) { echo "Integer: " . $input; } elseif (is_string($input)) { echo "String: " . $input; } else { throw new TypeError("Invalid type"); } } 5. 联合类型 vs. 泛型特性联合类型泛型(如 Java/C#)类型检查运行时手动检查编译时自动检查适用范围参数、返回值、属性类、接口、方法类型参数固定几种类型(如 `AB`)IDE 支持部分支持完全支持6. 最佳实践优先使用 PHP 8.0+ 类型系统(联合类型、mixed、never)。结合 PHPDoc 的 @template 模拟泛型,提升 IDE 类型提示。避免过度使用联合类型,否则可能导致代码可读性下降。运行时手动验证类型(如 is_int()),确保安全性。总结PHP 8.0+ 的联合类型允许一个变量接受多种类型,但不是真正的泛型。结合 PHPDoc 的 @template 可以模拟泛型行为。对于复杂场景,可以考虑使用 静态分析工具(如 Psalm、PHPStan) 增强类型检查。如果需要更强的泛型支持,可以关注 PHP RFC 进程 或使用 Hack 语言(Facebook 的 PHP 衍生语言)。
-
在 ShowDoc 中,如果单引号(')被自动转义为 ',通常是由于 HTML 转义 或 模板引擎的默认行为 导致的。以下是几种可能的解决方案:1. 修改 ShowDoc 的模板渲染配置ShowDoc 可能使用了 Smarty、Twig 或其他模板引擎,默认会对 HTML 特殊字符进行转义。可以尝试:(1)关闭自动转义Smarty 模板引擎(如果 ShowDoc 使用):{$var nofilter} {* 禁用转义 *} 或全局配置:$smarty->setEscapeHtml(false); Twig 模板引擎:{{ var|raw }} {# 禁用转义 #} (2)修改 ShowDoc 的 PHP 源码找到 server/Application/Home/Controller/ItemController.class.php(或类似文件),检查是否有 htmlspecialchars() 或 htmlentities() 调用,例如:// 错误:强制转义 $content = htmlspecialchars($content, ENT_QUOTES); // 修改为:仅在必要时转义,或直接输出 $content = $content; // 不转义 2. 修改数据库存储逻辑如果 ShowDoc 在 存储数据到数据库时 就转义了单引号,可以检查:(1)禁用 magic_quotes_gpc(旧版 PHP)在 php.ini 中确保:magic_quotes_gpc = Off(但现代 PHP 版本已移除该选项)(2)修改 addslashes() 或 PDO::quote() 调用检查是否有类似代码:$content = addslashes($content); // 转义单引号 改为:$content = $content; // 不主动转义 3. 修改前端 JS 处理逻辑如果 ShowDoc 在 前端 JavaScript 中处理了数据(如 AJAX 返回),检查是否有:// 错误:手动转义 let content = response.content.replace(/'/g, "'"); // 修改为:不处理 let content = response.content; 4. 使用 raw 或 htmlspecialchars_decode 输出如果 ShowDoc 使用了 PHP 输出,可以尝试:// 错误:默认转义 echo $content; // 修改为:反转义后输出 echo htmlspecialchars_decode($content); 5. 检查 ShowDoc 插件或扩展某些 ShowDoc 插件(如 Markdown 解析器)可能会转义字符,例如:Parsedown(Markdown 解析器)默认不会转义单引号,但可能被二次处理。自定义过滤器:检查是否有 str_replace("'", "'", $text) 之类的代码。6. 临时解决方案(前端替换)如果无法修改源码,可以在 前端 JS 中动态替换:// 在页面加载后执行 document.addEventListener('DOMContentLoaded', () => { document.querySelectorAll('.item-content').forEach(el => { el.innerHTML = el.innerHTML.replace(/'/g, "'"); }); }); 总结方法适用场景风险修改模板引擎配置适用于 Smarty/Twig 渲染无风险修改 PHP 存储逻辑适用于数据库存储前转义可能影响安全性前端 JS 替换快速修复显示问题仅影响前端检查插件适用于第三方扩展需测试兼容性推荐步骤先定位问题:检查是 存储时转义、渲染时转义 还是 前端处理。优先修改后端:调整模板引擎或 PHP 输出逻辑。临时前端修复:如果无法改源码,用 JS 替换。
-
[root@centos7-os ~]# systemctl status php-fpm ● php-fpm.service - The PHP FastCGI Process Manager Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled) Active: failed (Result: start-limit) since Fri 2025-09-12 13:15:42 CST; 4s ago Process: 31554 ExecStart=/usr/local/php8/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php8/etc/php-fpm.conf (code=exited, status=78) Main PID: 31554 (code=exited, status=78) Sep 12 13:15:42 centos7-os systemd[1]: Unit php-fpm.service entered failed state. Sep 12 13:15:42 centos7-os systemd[1]: php-fpm.service failed. Sep 12 13:15:42 centos7-os systemd[1]: php-fpm.service holdoff time over, scheduling restart. Sep 12 13:15:42 centos7-os systemd[1]: start request repeated too quickly for php-fpm.service Sep 12 13:15:42 centos7-os systemd[1]: Failed to start The PHP FastCGI Process Manager. Sep 12 13:15:42 centos7-os systemd[1]: Unit php-fpm.service entered failed state. Sep 12 13:15:42 centos7-os systemd[1]: php-fpm.service failed. 从最新的 systemctl status php-fpm 输出来看,PHP-FPM 仍然启动失败,错误代码依然是 status=78(配置问题),并且 systemd 因 “start request repeated too quickly” 进入了保护状态(停止自动重启)。关键问题分析错误代码 78在 PHP-FPM 中,78 通常表示 配置文件错误(如语法错误、路径无效、权限问题等)。虽然日志没有直接显示具体错误,但我们可以手动测试配置文件。systemd 限制由于多次启动失败,systemd 暂时禁止重启服务。需要先重置失败计数:systemctl reset-failed php-fpm详细排查步骤1. 检查 PHP-FPM 配置文件语法运行以下命令测试配置文件是否正确:/usr/local/php8/sbin/php-fpm --test --fpm-config /usr/local/php8/etc/php-fpm.conf如果输出 configuration file ... is valid,说明配置文件语法正确,问题可能是其他原因(如权限、端口冲突)。如果有错误,根据提示修改 /usr/local/php8/etc/php-fpm.conf 或其包含的子配置文件(如 *.conf 在 pool.d/ 目录下)。2. 检查 PHP-FPM 监听端口/套接字查看配置文件中 listen 的值(通常是 127.0.0.1:9000 或 /run/php-fpm.sock):grep "listen" /usr/local/php8/etc/php-fpm.conf检查端口是否被占用:netstat -tulnp | grep 9000 # 如果 listen 是 9000 # 或 ss -tulnp | grep 9000 如果端口被占用,修改 php-fpm.conf 中的 listen 为其他端口(如 9001),或停止占用进程。3. 检查 PHP-FPM 运行用户权限PHP-FPM 默认以 www-data、nginx 或 nobody 用户运行,确保该用户有权访问:PID 文件路径(如 /var/run/php-fpm/php-fpm.pid)日志目录(如 /var/log/php-fpm/)套接字文件路径(如 /run/php-fpm.sock)检查权限示例:ls -ld /var/run/php-fpm/ /var/log/php-fpm/如果权限不足,修改属主:chown -R www-data:www-data /var/run/php-fpm/ /var/log/php-fpm/4. 检查 PHP-FPM 错误日志查看 PHP-FPM 的错误日志(路径通常在 php-fpm.conf 中定义,如 error_log = /var/log/php-fpm/error.log):tail -n 50 /var/log/php-fpm/error.log如果日志不存在,可能是权限问题,手动创建并设置权限:mkdir -p /var/log/php-fpm/ touch /var/log/php-fpm/error.log chown www-data:www-data /var/log/php-fpm/error.log5. 检查系统资源限制如果 PHP-FPM 因 ulimit 或 systemd 限制无法启动,修改服务文件:vim /usr/lib/systemd/system/php-fpm.service在 [Service] 部分添加:LimitNOFILE=65535 然后重新加载 systemd:systemctl daemon-reload6. 手动启动 PHP-FPM 调试绕过 systemd,直接运行 PHP-FPM 并观察错误:/usr/local/php8/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php8/etc/php-fpm.conf终端会输出详细错误信息(如缺少模块、权限问题等)。临时解决方案如果急需恢复服务,可以尝试:重置 systemd 失败计数:systemctl reset-failed php-fpm修改 PHP-FPM 配置(如更换端口或用户)后重启:systemctl start php-fpm总结优先检查配置文件(php-fpm --test)。检查端口/权限(netstat + ls -ld)。查看错误日志(/var/log/php-fpm/error.log)。手动运行调试(直接执行 php-fpm 命令)。
-
[root@centos7 ~]# /usr/local/php8/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php8/etc/php-fpm.conf [12-Sep-2025 13:16:58] ERROR: unable to bind listening socket for address '127.0.0.1:9000': Address already in use (98) [12-Sep-2025 13:16:58] ERROR: FPM initialization failed问题定位从手动启动 PHP-FPM 的错误日志来看,关键错误是:ERROR: unable to bind listening socket for address '127.0.0.1:9000': Address already in use (98) 这表明 127.0.0.1:9000 端口已被其他进程占用,导致 PHP-FPM 无法绑定到该端口,从而启动失败。解决方案1. 确认占用端口的进程运行以下命令查看哪个进程占用了 9000 端口:netstat -tulnp | grep 9000 # 或 ss -tulnp | grep 9000 可能的结果:另一个 PHP-FPM 实例(如旧版本或未停止的服务)。其他服务(如 Nginx、Apache 或某些应用)。2. 终止占用端口的进程如果确认是无关进程占用端口,可以终止它:kill -9 <PID> # 替换 <PID> 为实际进程 ID 示例:kill -9 12345 # 假设 12345 是占用 9000 端口的进程 3. 修改 PHP-FPM 监听端口如果无法终止占用进程(如另一个关键服务正在使用 9000 端口),可以修改 PHP-FPM 的监听端口:编辑 PHP-FPM 配置文件:vim /usr/local/php8/etc/php-fpm.conf找到 listen 参数,修改为其他端口(如 9001):listen = 127.0.0.1:9001 保存文件并重启 PHP-FPM:systemctl restart php-fpm4. 检查 PHP-FPM 配置重复如果系统中有多个 PHP-FPM 实例(如 PHP 7.x 和 PHP 8.x),确保它们的 listen 端口不冲突。例如:PHP 7.x 监听 127.0.0.1:9000PHP 8.x 监听 127.0.0.1:90015. 验证修改再次检查端口占用情况:netstat -tulnp | grep 9000 # 确认原端口已释放 netstat -tulnp | grep 9001 # 确认新端口已监听 附加建议检查 systemd 服务文件确保 /usr/lib/systemd/system/php-fpm.service 中的 ExecStart 路径与实际 PHP-FPM 路径一致:grep ExecStart /usr/lib/systemd/system/php-fpm.service如果路径错误,修正后运行:systemctl daemon-reload查看 PHP-FPM 错误日志如果问题仍然存在,检查日志获取更多信息:tail -n 50 /var/log/php-fpm/error.log防火墙/SELinux 检查如果修改端口后仍无法访问,确保防火墙或 SELinux 未阻止新端口:firewall-cmd --list-ports # 查看防火墙开放端口 firewall-cmd --add-port=9001/tcp # 开放端口(示例) setenforce 0 # 临时关闭 SELinux(测试用) 总结根本原因:127.0.0.1:9000 端口被占用,导致 PHP-FPM 启动失败。解决步骤:确认占用端口的进程(netstat/ss)。终止无关进程或修改 PHP-FPM 的监听端口。重启 PHP-FPM 并验证。
-
● php-fpm.service - The PHP FastCGI Process Manager Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled) Active: failed (Result: start-limit) since Fri 2025-09-12 12:17:16 CST; 7s ago Main PID: 25554 (code=exited, status=78) 从日志来看,php-fpm 服务启动失败,但手动测试配置文件 (php-fpm -t) 却显示配置成功。以下是可能的原因和解决步骤:问题分析服务启动失败原因:日志显示 status=78(配置问题)和 start-limit(频繁重启被系统限制)。虽然配置文件测试通过,但可能存在以下问题:权限问题:php-fpm 进程用户(如 nginx 或 apache)无权访问某些目录(如 /var/log/php-fpm 或 /run/php-fpm)。PID 文件冲突:旧的 PID 文件未被清理,导致新进程无法启动。端口占用:9000 端口可能被其他进程占用。SELinux 限制:如果启用了 SELinux,可能阻止 php-fpm 运行。关键日志线索:Main PID: 25554 (code=exited, status=78):通常与配置或权限相关。start request repeated too quickly:系统因连续失败而暂停重启。解决步骤1. 检查详细错误日志查看 php-fpm 的错误日志(路径通常在配置文件中指定):cat /usr/local/php8/var/log/php-fpm.log 或 journalctl -u php-fpm --no-pager -n 50 如果日志文件不存在,可能是权限问题或路径配置错误。2. 检查 PID 文件和套接字路径确认配置文件中的 pid 和 listen 路径是否存在且可写:grep -E 'pid|listen' /usr/local/php8/etc/php-fpm.conf确保目录(如 /run/php-fpm)存在且权限正确:mkdir -p /run/php-fpm chown -R nginx:nginx /run/php-fpm # 根据实际用户调整 3. 检查端口占用确认 9000 端口未被占用:netstat -tulnp | grep 9000 或 ss -tulnp | grep 9000 如果被占用,修改 php-fpm 监听端口或终止冲突进程。4. 手动启动并调试以调试模式运行 php-fpm,观察实时输出:/usr/local/php8/sbin/php-fpm -F按 Ctrl+C 终止后,根据错误信息进一步排查。5. 检查 SELinux 状态如果 SELinux 启用,尝试临时设置为宽容模式:setenforce 0 如果问题解决,需调整 SELinux 策略:chcon -R -t httpd_sys_rw_content_t /usr/local/php86. 重置服务启动限制系统因连续失败禁止了重启,需重置计数器:systemctl reset-failed php-fpm7. 验证配置文件确保配置文件中没有语法错误(虽然 -t 已通过,但需检查包含的子配置):grep -i "include" /usr/local/php8/etc/php-fpm.conf检查所有引用的文件(如 pool.d/*.conf)是否存在。常见修复命令# 1. 清理旧进程和文件 pkill php-fpm rm -f /run/php-fpm/php-fpm.pid # 2. 确保目录权限正确 chown -R nginx:nginx /usr/local/php8/var/log/ mkdir -p /run/php-fpm chown -R nginx:nginx /run/php-fpm # 3. 重置服务并启动 systemctl reset-failed php-fpm systemctl start php-fpm systemctl status php-fpm总结优先检查日志:php-fpm 的详细错误日志是关键。权限和路径:确保 pid、socket、日志目录的权限正确。端口冲突:确认 9000 端口可用。SELinux:如果是生产环境,建议配置策略而非禁用。如果仍无法解决,请提供 php-fpm 错误日志的具体内容进一步分析。
-
checking for libjpeg... no configure: error: Package requirements (libjpeg) were not met: No package 'libjpeg' found Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables JPEG_CFLAGS and JPEG_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. [root@sas-plat php-8.3.24]# sudo yum install -y libjpeg-devel Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * epel: d2lzkl7pfhq30w.cloudfront.net Package libjpeg-turbo-devel-1.2.90-5.el7.x86_64 already installed and latest version Nothing to do 这个错误表明 pkg-config 无法找到 libjpeg,即使你已经安装了 libjpeg-turbo-devel。这通常是因为:libjpeg.pc 文件不在 pkg-config 的搜索路径中(常见于 CentOS 7)。libjpeg-turbo 和 libjpeg 的包名不匹配(某些旧版 PHP 配置脚本可能只识别 libjpeg)。解决方案方法 1:手动创建 libjpeg.pc 符号链接CentOS 7 的 libjpeg-turbo-devel 默认安装 .pc 文件到 /usr/lib64/pkgconfig/,但 pkg-config 可能只搜索 /usr/lib/pkgconfig/。解决方法:# 检查 libjpeg.pc 是否存在 sudo find / -name "libjpeg.pc" 2>/dev/null # 如果找到(通常在 /usr/lib64/pkgconfig/),手动链接到标准路径 sudo ln -s /usr/lib64/pkgconfig/libjpeg.pc /usr/lib/pkgconfig/ # 重新检查 pkg-config 是否能识别 pkg-config --modversion libjpeg如果输出版本号(如 6.2.0),说明成功。方法 2:强制指定 JPEG_CFLAGS 和 JPEG_LIBS如果 pkg-config 仍然找不到 libjpeg,可以手动指定编译参数:export JPEG_CFLAGS="-I/usr/include/jpeg" export JPEG_LIBS="-L/usr/lib64 -ljpeg" 然后重新运行 PHP 的 ./configure:./configure \ --enable-gd \ --with-jpeg \ --with-freetype \ --with-png \ ... # 其他配置 方法 3:安装 libjpeg 兼容包(可选)某些旧版 PHP 可能需要 libjpeg(而非 libjpeg-turbo)。可以尝试安装:sudo yum install -y libjpeg-devel # 如果未安装 如果 yum 找不到,可以手动下载 RPM 包:sudo yum install -y http://mirror.centos.org/centos/7/os/x86_64/Packages/libjpeg-turbo-devel-1.2.90-8.el7.x86_64.rpm方法 4:检查 PKG_CONFIG_PATH确保 PKG_CONFIG_PATH 包含 /usr/lib64/pkgconfig:export PKG_CONFIG_PATH="/usr/lib/pkgconfig:/usr/lib64/pkgconfig:$PKG_CONFIG_PATH" 然后重新运行 ./configure。验证是否解决重新运行 PHP 的 ./configure,检查是否仍然报错:./configure --help | grep jpeg # 确认 --with-jpeg 可用 如果仍然失败,可以查看 config.log 查找具体错误:grep -i jpeg config.log总结方法适用场景命令方法 1libjpeg.pc 不在 pkg-config 路径sudo ln -s /usr/lib64/pkgconfig/libjpeg.pc /usr/lib/pkgconfig/方法 2pkg-config 无法识别export JPEG_CFLAGS="-I/usr/include/jpeg" + export JPEG_LIBS="-L/usr/lib64 -ljpeg"方法 3需要 libjpeg 而非 libjpeg-turbosudo yum install -y libjpeg-devel方法 4PKG_CONFIG_PATH 未设置export PKG_CONFIG_PATH="/usr/lib/pkgconfig:/usr/lib64/pkgconfig"推荐顺序:方法 1 → 方法 4 → 方法 2 → 方法 3如果仍然失败,可能是 PHP 版本与系统库不兼容,建议:升级到 CentOS 8+ 或 Ubuntu 20.04+(避免旧版库问题)。使用 remi 或 SCL 仓库安装新版 PHP(如 PHP 8.3)。
-
configure: error: Package requirements (libjpeg) were not met: No package 'libjpeg' found这个错误表明 PHP 编译时缺少 libjpeg 依赖,导致 GD 库无法支持 JPEG 图像处理。以下是解决方案:1. 安装 libjpeg 开发包CentOS / RHELsudo yum install -y libjpeg-turbo-devel说明:libjpeg-turbo-devel 是 libjpeg 的高性能替代品,兼容 GD 库。如果 yum 找不到,尝试 sudo yum install -y libjpeg-devel。Ubuntu / Debiansudo apt update sudo apt install -y libjpeg-dev2. 重新运行 PHP 的 ./configure确保在 PHP 配置时启用了 GD 库并指定了 libjpeg:./configure \ --enable-gd \ --with-jpeg \ # 确保包含此选项 ... # 其他配置 3. 验证 libjpeg 是否安装成功检查 pkg-config 是否能识别 libjpeg:pkg-config --modversion libjpeg如果输出版本号(如 6.2.0),说明安装成功。如果没有输出,可能是 PKG_CONFIG_PATH 未正确设置,可以手动指定:export PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/lib64/pkgconfig pkg-config --modversion libjpeg4. 其他可能缺失的依赖如果仍然报错,可能是 GD 库还依赖其他库,如 libpng、freetype。可以一次性安装:CentOS / RHELsudo yum install -y libpng-devel freetype-develUbuntu / Debiansudo apt install -y libpng-dev libfreetype6-dev然后在 ./configure 中添加:--with-freetype \ --with-png \ 5. 重新编译 PHPmake clean # 清理之前的编译缓存 ./configure [你的配置选项] # 确保包含 --with-jpeg make -j$(nproc) sudo make install 6. 验证 GD 库是否支持 JPEG安装完成后,检查 PHP 的 GD 库是否支持 JPEG:/usr/local/php8/bin/php -i | grep -i jpeg如果输出包含:GD Support => enabled JPEG Support => enabled说明配置成功。常见问题1. 仍然报错 No package 'libjpeg' found可能是 pkg-config 未正确识别 libjpeg,尝试:sudo ln -s /usr/lib64/pkgconfig/libjpeg.pc /usr/lib/pkgconfig/ # 64位系统 或者手动指定路径:export OPENSSL_CFLAGS="-I/usr/include/jpeg" export OPENSSL_LIBS="-L/usr/lib64 -ljpeg" 2. 编译后 PHP 的 GD 库不支持 JPEG确保 php.ini 启用了 GD 扩展:extension=gd重启 PHP-FPM:sudo systemctl restart php-fpm8总结✅ 主要步骤:安装 libjpeg-turbo-devel(CentOS)或 libjpeg-dev(Ubuntu)。在 ./configure 中添加 --with-jpeg。重新编译 PHP 并验证 GD 库支持 JPEG。如果仍有问题,可能是系统环境变量未正确设置,可以尝试 方法 2(手动指定路径) 或检查 pkg-config 配置。 🚀
-
configure: error: Package requirements (openssl >= 1.0.2) were not met: Requested 'openssl >= 1.0.2' but version of OpenSSL is 1.0.1e Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables OPENSSL_CFLAGS and OPENSSL_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. 这个错误表明你的系统安装的 OpenSSL 版本过低(1.0.1e),而 PHP 8 需要 OpenSSL ≥ 1.0.2。以下是解决方案:方法 1:升级系统 OpenSSL(推荐)1. 检查当前 OpenSSL 版本openssl version如果输出类似 OpenSSL 1.0.1e,说明版本过低。2. 升级 OpenSSLCentOS / RHELsudo yum remove openssl-devel openssl # 卸载旧版本(可选) sudo yum install -y epel-release sudo yum install -y openssl11-devel openssl11 # 安装 OpenSSL 1.1.x 注意:CentOS 7 默认仓库可能没有 openssl11,需要启用 EPEL 或 SCL 仓库。如果 yum 找不到 openssl11,可以手动编译安装 OpenSSL 1.1.x(见方法 2)。Ubuntu / Debiansudo apt update sudo apt install -y openssl libssl-dev # 通常版本较新 如果默认仓库的 OpenSSL 仍然过低,可以手动编译安装(见方法 2)。方法 2:手动编译安装 OpenSSL 1.1.x如果系统仓库没有新版 OpenSSL,可以手动编译:1. 下载并编译 OpenSSLcd /usr/local/src sudo wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz # 最新稳定版 sudo tar -zxvf openssl-1.1.1w.tar.gz cd openssl-1.1.1w sudo ./config --prefix=/usr/local/openssl-1.1.1w --openssldir=/usr/local/openssl-1.1.1w sudo make -j$(nproc) sudo make install 2. 指定 PHP 编译时使用新 OpenSSL在 PHP 的 ./configure 命令中,添加:export OPENSSL_CFLAGS="-I/usr/local/openssl-1.1.1w/include" export OPENSSL_LIBS="-L/usr/local/openssl-1.1.1w/lib -lssl -lcrypto" 然后重新运行 ./configure。方法 3:使用 --with-openssl 指定路径如果 OpenSSL 安装在非标准路径(如 /usr/local/openssl-1.1.1w),可以在 PHP 配置时指定:./configure \ --with-openssl=/usr/local/openssl-1.1.1w \ ... # 其他配置 方法 4:降级 PHP 版本(不推荐)如果无法升级 OpenSSL,可以安装 PHP 7.4(对 OpenSSL 1.0.1 兼容):sudo yum install -y php74 php74-php-fpm # CentOS/RHEL sudo apt install -y php7.4 php7.4-fpm # Ubuntu/Debian 验证 OpenSSL 版本确保 PHP 编译时使用的是正确的 OpenSSL 版本:/usr/local/php8/bin/php -i | grep "OpenSSL" 输出应类似:OpenSSL support => enabled OpenSSL Library Version => OpenSSL 1.1.1w OpenSSL Header Version => OpenSSL 1.1.1w总结方法适用场景备注方法 1系统仓库有新版 OpenSSL最简单方法 2系统仓库无新版 OpenSSL推荐手动编译方法 3OpenSSL 安装在非标准路径适用于自定义安装方法 4无法升级 OpenSSL降级 PHP(不推荐)推荐顺序:方法 1 → 方法 2 → 方法 3升级 OpenSSL 后,重新编译 PHP 即可解决问题。 🚀
-
以下是 编译安装 PHP 8 的详细步骤,适用于 Linux 系统(如 CentOS、Ubuntu 等)。我们将以 PHP 8.2 为例,但你可以根据需要调整版本。1. 安装依赖在编译 PHP 之前,需要安装必要的依赖:CentOS / RHELsudo yum install -y gcc make libxml2-devel openssl-devel sqlite-devel \ curl-devel libpng-devel libjpeg-devel libicu-devel oniguruma-devel \ libxslt-devel libzip-devel bzip2-develUbuntu / Debiansudo apt update sudo apt install -y build-essential libxml2-dev libssl-dev libsqlite3-dev \ libcurl4-openssl-dev libpng-dev libjpeg-dev libonig-dev libicu-dev \ libxslt1-dev libzip-dev libbz2-dev2. 下载 PHP 8 源码访问 PHP 官方下载页面 获取最新版本,或使用 wget 下载:cd /usr/local/src sudo wget https://www.php.net/distributions/php-8.2.12.tar.gz # 替换为最新版本 sudo tar -zxvf php-8.2.12.tar.gz cd php-8.2.123. 配置编译选项运行 ./configure 设置安装参数:sudo ./configure \ --prefix=/usr/local/php8 \ # 安装目录 --with-config-file-path=/usr/local/php8/etc \ # PHP 配置文件路径 --enable-fpm \ # 启用 PHP-FPM --with-fpm-user=nginx \ # PHP-FPM 运行用户(根据需要调整) --with-fpm-group=nginx \ # PHP-FPM 运行组 --with-mysqli \ # MySQLi 扩展 --with-pdo-mysql \ # PDO MySQL 扩展 --with-openssl \ # OpenSSL 支持 --with-zlib \ # zlib 压缩 --with-curl \ # cURL 支持 --with-libzip \ # Zip 支持 --enable-mbstring \ # 多字节字符串支持 --enable-gd \ # GD 库(图像处理) --with-jpeg \ # JPEG 支持 --with-png \ # PNG 支持 --enable-opcache \ # 启用 Opcache --enable-intl \ # 国际化支持 --enable-bcmath \ # 数学计算扩展 --enable-sockets \ # 套接字支持 --enable-soap \ # SOAP 支持 --with-xsl \ # XSL 支持 --with-bz2 # Bzip2 支持 可选扩展:--with-redis(需先安装 Redis 扩展)--with-imagick(需安装 ImageMagick)4. 编译并安装sudo make -j$(nproc) # 使用所有CPU核心编译 sudo make install # 安装 5. 配置 PHP复制配置文件sudo cp php.ini-production /usr/local/php8/etc/php.ini sudo cp /usr/local/php8/etc/php-fpm.conf.default /usr/local/php8/etc/php-fpm.conf sudo cp /usr/local/php8/etc/php-fpm.d/www.conf.default /usr/local/php8/etc/php-fpm.d/www.conf修改 php-fpm.conf(可选)sudo vim /usr/local/php8/etc/php-fpm.d/www.conf调整:user = nginx group = nginx listen = /run/php-fpm/php-fpm.sock # 或 127.0.0.1:9000 6. 启动 PHP-FPM创建 systemd 服务文件sudo vim /etc/systemd/system/php-fpm8.service内容:[Unit] Description=PHP 8 FastCGI Process Manager After=network.target [Service] Type=simple PIDFile=/run/php-fpm/php-fpm.pid ExecStart=/usr/local/php8/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php8/etc/php-fpm.conf ExecReload=/bin/kill -USR2 $MAINPID [Install] WantedBy=multi-user.target启动 PHP-FPMsudo systemctl daemon-reload sudo systemctl start php-fpm8 sudo systemctl enable php-fpm87. 验证安装/usr/local/php8/bin/php -v输出应类似:PHP 8.2.12 (cli) (built: Nov 10 2023 12:34:56) (NTS) Copyright (c) The PHP Group Zend Engine v4.2.12, Copyright (c) Zend Technologies with Zend OPcache v8.2.12, Copyright (c), by Zend Technologies8. 设置环境变量(可选)如果希望全局使用 php 命令:echo 'export PATH="/usr/local/php8/bin:$PATH"' | sudo tee /etc/profile.d/php8.sh source /etc/profile.d/php8.sh9. 配置 Nginx / ApacheNginx 示例location ~ \.php$ { fastcgi_pass unix:/run/php-fpm/php-fpm.sock; # 或 127.0.0.1:9000 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } Apache 示例确保 mod_proxy_fcgi 已启用,并在虚拟主机中配置:<FilesMatch \.php$> SetHandler "proxy:fcgi://127.0.0.1:9000" </FilesMatch> 常见问题1. 缺少依赖如果 configure 报错,安装缺失的依赖(如 libzip-dev、libonig-dev)。2. PHP-FPM 启动失败检查日志:sudo tail -f /usr/local/php8/var/log/php-fpm.log3. 扩展安装如果需要额外扩展(如 Redis、Imagick),进入 PHP 源码目录的 ext/扩展名 并编译安装。总结✅ 编译安装 PHP 8 完成!✅ 支持自定义配置和扩展。✅ 适用于需要特定优化或最新版本的场景。如果需要更简单的安装方式,可以考虑 包管理器(如 remi 或 ondrej),但编译安装更适合深度定制。 🚀
-
要查看可用的 PHP 版本(特别是通过 Remi 仓库提供的版本),可以按照以下步骤操作:1. 启用 Remi 仓库(如果尚未启用)sudo yum install -y https://rpms.remirepo.net/enterprise/remi-release-$(rpm -E %rhel).rpm注:根据系统版本替换 $(rpm -E %rhel)(如 CentOS 7/8/9 或 RHEL 版本)。2. 列出所有可用的 PHP 版本Remi 仓库为每个 PHP 版本提供独立的模块流(stream),使用以下命令查看:sudo dnf module list php # CentOS 8+/RHEL 8+ # 或 sudo yum --disablerepo="*" --enablerepo="remi*" list available php* # 兼容旧版 yum 输出示例(CentOS 8+):Remi's Modular PHP Name Stream Profiles Summary php remi-7.4 common [d],... PHP 7.4 php remi-8.0 common [d],... PHP 8.0 php remi-8.1 common [d],... PHP 8.1 ... 3. 查看 Remi 仓库中的具体 PHP 包sudo yum --disablerepo="*" --enablerepo="remi*" list available php*这会显示所有以 php 开头的包,通过版本号可以识别支持的 PHP 版本(如 php74, php80, php81 等)。4. 检查已启用的仓库确认 Remi 仓库已正确启用:sudo yum repolist | grep remi5. 直接查看 Remi 仓库的 PHP 模块sudo dnf repoquery --enablerepo=remi-safe --enablerepo=remi-php* php*总结推荐方法:在 CentOS 8+/RHEL 8+ 上使用 dnf module list php。兼容方法:通过 yum list 或 repoquery 过滤 php* 包。Remi 仓库通常提供最新的 PHP 版本(如 7.4、8.0、8.1、8.2 等),具体取决于系统版本。如果需要安装特定版本(如 PHP 8.1),可以启用对应的模块:sudo dnf module reset php # 重置默认模块 sudo dnf module enable php:remi-8.1 sudo dnf install php php-cli php-fpm(旧版 CentOS 7 使用 yum-config-manager --enable remi-php81)
-
在 CentOS 7 上使用 httpd(Apache) 启动 ShowDoc 的完整流程如下,涵盖安装、配置和启动步骤:1. 安装依赖软件1.1 安装 httpd(Apache)yum install -y httpd systemctl start httpd systemctl enable httpd # 设置开机自启 1.2 安装 PHP 及相关扩展ShowDoc 需要 PHP 7.0+,推荐 PHP 7.3 或 7.4:yum install -y epel-release yum install -y php74 php74-php-fpm php74-php-mysqlnd php74-php-mbstring php74-php-curl php74-php-gd php74-php-pdo说明:如果系统默认是 PHP 5.x,需先移除旧版本:yum remove php*启用 PHP 短标签支持(避免 phpinfo() 无法输出):sed -i 's/short_open_tag = Off/short_open_tag = On/' /etc/opt/remi/php74/php.ini1.3 安装 MariaDB/MySQLyum install -y mariadb-server mariadb systemctl start mariadb systemctl enable mariadb mysql_secure_installation # 设置 root 密码并加固数据库 2. 配置数据库2.1 创建 ShowDoc 数据库mysql -u root -p输入密码后,执行:CREATE DATABASE showdoc CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; GRANT ALL PRIVILEGES ON showdoc.* TO 'showdoc_user'@'localhost' IDENTIFIED BY 'your_password'; FLUSH PRIVILEGES; EXIT; 3. 下载并部署 ShowDoc3.1 下载 ShowDoccd /var/www/html wget https://github.com/star7th/showdoc/archive/refs/heads/master.zip unzip master.zip mv showdoc-master showdoc chown -R apache:apache showdoc # 赋予 Apache 用户权限 chmod -R 755 showdoc # 设置目录权限 3.2 配置 Apache 虚拟主机创建 /etc/httpd/conf.d/showdoc.conf:<VirtualHost *:80> ServerName your_domain_or_ip DocumentRoot /var/www/html/showdoc <Directory /var/www/html/showdoc> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> ErrorLog /var/log/httpd/showdoc_error.log CustomLog /var/log/httpd/showdoc_access.log combined </VirtualHost> 启用重写模块:sed -i 's/AllowOverride None/AllowOverride All/g' /etc/httpd/conf/httpd.conf systemctl restart httpd4. 安装 ShowDoc4.1 访问安装页面在浏览器访问:http://your_server_ip/install填写数据库信息:数据库主机:localhost数据库名:showdoc用户名:showdoc_user密码:your_password4.2 完成安装按照网页提示完成安装。删除 install 目录(安全考虑):rm -rf /var/www/html/showdoc/install5. 启动 ShowDoc5.1 确保服务运行systemctl status httpd # 检查 Apache 是否运行 systemctl restart httpd # 重启 Apache 加载配置 5.2 访问 ShowDoc在浏览器访问:http://your_server_ip默认管理员账号:用户名:showdoc密码:123456(安装后建议修改)常见问题解决1. 500 Internal Server Error原因:目录权限不足或 SELinux 限制。解决:chown -R apache:apache /var/www/html/showdoc chmod -R 755 /var/www/html/showdoc setenforce 0 # 临时关闭 SELinux sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # 永久关闭 2. 页面空白或 PHP 错误原因:PHP 扩展未启用或配置错误。解决:yum install -y php74-php-mbstring php74-php-gd # 确保扩展已安装 systemctl restart php74-php-fpm httpd3. 数据库连接失败原因:数据库服务未运行或配置错误。解决:systemctl status mariadb # 检查数据库状态 mysql -u root -p -e "SHOW DATABASES;" # 测试数据库连接 总结安装依赖:httpd + PHP 7.4 + MariaDB。配置数据库:创建 showdoc 数据库和用户。部署 ShowDoc:下载源码并赋予权限。配置 Apache:设置虚拟主机并启用重写。访问安装:通过浏览器完成安装并启动。如果遇到问题,优先检查 Apache 错误日志(/var/log/httpd/showdoc_error.log)和 PHP 错误日志(/var/log/httpd/error_log)。
-
在 CentOS 7 的 httpd(Apache) 中启动 PHP 支持,需要正确配置 PHP-FPM 或 mod_php 模块。以下是详细步骤:方法 1:使用 mod_php(传统方式,适用于 PHP 5.x/7.x)1. 安装 PHP 和 Apache 模块yum install -y php php-mysqlnd php-gd php-mbstring php-xml php-json说明:此方式直接通过 libphp 模块运行 PHP,性能较低,但配置简单。2. 重启 Apachesystemctl restart httpd3. 测试 PHP创建 /var/www/html/info.php:<?php phpinfo(); ?> 访问 http://your_server_ip/info.php,确认 PHP 信息页正常显示。方法 2:使用 PHP-FPM(推荐,适用于 PHP 7.x/8.x)PHP-FPM(FastCGI Process Manager)性能更好,适合生产环境。1. 安装 PHP-FPM1.1 安装 PHP 7.4(推荐)yum install -y epel-release yum install -y httpd php74 php74-php-fpm php74-php-mysqlnd php74-php-gd php74-php-mbstring说明:如果使用其他 PHP 版本(如 7.3/8.0),替换 php74 为 php73 或 php80。1.2 启动 PHP-FPMsystemctl start php74-php-fpm systemctl enable php74-php-fpm2. 配置 Apache 支持 PHP-FPM2.1 修改 Apache 配置编辑 /etc/httpd/conf.d/php.conf(或新建文件):<FilesMatch \.php$> SetHandler "proxy:fcgi://127.0.0.1:9000" </FilesMatch> <IfModule proxy_module> ProxyTimeout 300 </IfModule> 说明:fcgi://127.0.0.1:9000 是 PHP-FPM 默认监听地址(可在 /etc/opt/remi/php74/php-fpm.d/www.conf 中修改)。2.2 确保 mod_proxy 和 mod_proxy_fcgi 已启用grep -E "proxy_module|proxy_fcgi_module" /etc/httpd/conf/httpd.conf如果未启用,在 /etc/httpd/conf/httpd.conf 中取消注释:LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so3. 重启 Apachesystemctl restart httpd4. 测试 PHP-FPM访问 http://your_server_ip/info.php,确认 PHP 信息页正常显示,且 Server API 显示为 FPM/FastCGI。常见问题解决1. PHP 页面无法解析(显示源码或 404)原因:Apache 未加载 PHP 模块(mod_php 或 mod_proxy_fcgi)。PHP-FPM 未运行或监听地址错误。解决:# 检查 PHP-FPM 是否运行 systemctl status php74-php-fpm # 检查 Apache 模块 httpd -M | grep -E "php|proxy" # 检查 PHP-FPM 监听地址 grep "listen" /etc/opt/remi/php74/php-fpm.d/www.conf2. 502 Bad Gateway原因:PHP-FPM 未运行或崩溃。SELinux 阻止 Apache 访问 PHP-FPM。解决:# 重启 PHP-FPM systemctl restart php74-php-fpm # 临时关闭 SELinux setenforce 0 # 永久关闭 SELinux(不推荐生产环境) sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config3. PHP 版本冲突现象:php -v 和 phpinfo() 显示版本不一致。原因:系统安装了多个 PHP 版本。解决:# 查看已安装的 PHP rpm -qa | grep php # 卸载冲突版本 yum remove php-common php-cli # 确保使用 remi 仓库的 PHP yum-config-manager --enable remi-php74总结方法适用场景关键命令mod_php简单测试环境yum install php + systemctl restart httpdPHP-FPM生产环境(推荐)yum install php74-php-fpm + 配置 proxy:fcgi推荐生产环境使用 PHP-FPM,性能更好且支持进程隔离。如果遇到问题,优先检查:PHP-FPM 是否运行(systemctl status php74-php-fpm)。Apache 配置是否正确(/etc/httpd/conf.d/php.conf)。SELinux 是否阻止连接(setenforce 0 测试)。
-
通俗理解PHP通俗:PHP就像“万能胶”,专为快速搭建中小型网站设计。它语法简单(类似C语言),免费且跨平台,适合新手和中小项目,比如博客、论坛。但大型项目可能显得力不从心。典型场景:WordPress、Discuz等开源系统常用PHP开发。JSP通俗:JSP是“Java的网页版”,适合大型企业级应用。它基于Java,能调用强大的Java库(如Spring),性能高且跨平台,但学习成本较高,适合银行、电商等复杂系统。典型场景:淘宝早期架构、金融系统后台。ASP通俗:ASP是“微软的老工具”,只能在Windows服务器上运行,使用VBScript开发,简单但局限大(如安全性差)。现在逐渐被淘汰,主要用于维护旧系统。典型场景:早期的企业内网管理系统。ASPX(ASP.NET)通俗:ASPX是“ASP的升级版”,属于微软.NET家族。它编译执行、效率高,支持C#等高级语言,适合开发高性能的Windows平台应用,比如大型门户网站。典型场景:Stack Overflow、微软官网。深入理解1.底层原理与执行方式PHP通过Zend引擎将代码转换为opcode(中间指令)执行,每次请求需重新解析,适合动态内容但性能低于编译型语言。支持扩展库(如GD图形处理),但数据库接口不统一(MySQL、Oracle需不同驱动。JSP首次请求时编译为Java Servlet(.class文件),后续直接运行,性能接近Java应用。依赖JVM,适合高并发场景。通过JDBC统一访问数据库,与Java生态(如Spring、Hibernate)无缝集成。ASP由IIS服务器解释执行,依赖COM组件和VBScript脚本,效率低且仅支持Windows平台。安全性差(如早期易受SQL注入攻击),代码与HTML混合,维护困难。ASPX(ASP.NET)代码编译为CLR(公共语言运行时)字节码,支持C#、VB.NET等语言,执行效率远超ASP。基于.NET框架,提供控件化开发(如拖拽按钮),分离界面(.aspx)与逻辑(.cs文件),适合大型工程。2.跨平台与生态PHP:支持Linux/Windows,搭配Apache/NGINX+MySQL形成LAMP经典组合,开源生态丰富(如Laravel框架)。JSP:依托Java“一次编写,处处运行”,可在Tomcat、WebLogic等服务器部署,适合混合云环境。ASP/ASPX:ASPX部分支持Linux(.NET Core),但主流仍依赖Windows Server+IIS,商业生态强(如Azure云服务)。3.性能与扩展性编译 vs 解释:JSP和ASPX编译后运行,性能优于PHP/ASP的解释执行。例如,JSP的线程模型比ASP的进程模型更高效。扩展能力:JSP可通过Java类库实现复杂功能(如分布式计算);ASPX借助.NET组件(如Entity Framework)处理企业级数据;PHP依赖第三方扩展(如Redis插件),但架构松散。4.适用场景总结技术适合项目类型优势劣势PHP中小型网站、快速原型开发快、成本低、生态活跃性能有限、大型项目维护难JSP高并发企业系统、金融平台高性能、Java生态整合学习曲线陡峭、部署复杂ASP老旧Windows系统维护简单易上手过时、安全性差、平台局限ASPX高性能Windows应用、微软生态集成控件化开发、企业级功能支持跨平台能力弱(.NET Core除外)
-
概述案例介绍WordPress是一款个人博客系统,也可以把 WordPress当作一个内容管理系统(CMS)来使用,它是使用PHP语言和MySQL数据库开发的,用户可以在支持PHP和MySQL数据库的服务器上搭建自己的博客。本案例借助开发者空间提供的免费云上资源环境,直观地展示如何在开发者空间部署一套个人博客系统。通过实际操作,让大家深入了解如何通过命令在开发者空间进行资源搭建的流程方法,体验其在应用开发中的优势。适用对象企业个人开发者高校学生案例时间本案例总时长预计60分钟。案例流程说明:用户开通开发者空间;下载WordPress软件包到开发者空间;在开发者空间上构建LNMP环境并运行WordPress网站。资源总览本案例预计花费总计0元。资源名称规格单价(元)时长(分钟)开发者空间—云主机2 vCPUs | 4 GB RAM免费60GitCode服务免费免费60开发者空间搭建WordPress博客平台云主机申请本案例中,使用开发者空间为环境搭建平台,开发者空间为开发者提供的免费云上资源环境,方便开发者进行环境搭建和项目部署。登录开发者空间页面,点击“配置云主机”进行云主机申请。搭建LNMP应用运行环境WordPress博客系统最新版本需要PHP7.4和MySQL 8.0或者MariaDB 10.5以上的版本来进行运行, 因此本次操作实战决定采用经典架构环境LNMP,L代表Linux,N代表Nginx,M代表MySQL或者MariaDB,P代表PHP。从官方建议网页中可知,虽然还是可以安装低一点版本的PHP和数据库版本,但官方提示担心各种漏洞而受到威胁,因此肯定按着官方建议,安装所要求的版本。安装Nginx登录云主机之后,在云主机桌面单击鼠标右键,选择“Open Terminal Here”,打开终端。本文章以 root 用户来执行操作命令。云主机登录默认账户为developer,所以理论上在每条命令前使用 sudo才有root权限执行,所以我们可使用命令 sudo -i 直接登录到 root 用户。在终端中输入:sudo -i回车,即可切换到root账户。然后在终端中输入:yum -y install nginx回车,进行nginx安装,待终端出现Complete表示 Nginx 安装完成。以下命令进行启动并设置开机自启动:systemctl start nginxsystemctl enable nginx在云主机的浏览器访问地址http://127.0.0.1/,若Nginx 安装成功,则会显示如下页面。安装MySQL在终端中输入:yum -y install mysql-server回车,待终端出现Complete表示 mysql 安装完成。然后输入:systemctl start mysqld启动mysql。在mysql 8.0的后续版本中,初次安装完成后可使用空密码来登录,输入:mysql -uroot -p回车,在“Enter password”时按回车即可登录。登录mysql后,再执行:ALTER USER 'root'@'localhost' IDENTIFIED BY 'Huawei@123';来修改数据库root账户的密码。(本案例使用Huawei@123,开发者可自定义)然后执行:flush privileges;quit刷新并退出mysql。最后在终端中执行:systemctl enable mysqld将数据库设置为开机自启动,然后执行:systemctl status mysqld查看mysql数据库状态显示如下即完成mysql的安装和配置,按ctrl+c退出。安装PHP在终端中输入以下命令:yum -y install php php-tidy php-common php-devel php-pdo php-mysql* php-gd php-ldap php-mbstring php-fpm来安装 PHP 和一些所需的 PHP 扩展,显示如下即表示安装成功。输入:php -v可查看php的版本,然后执行:systemctl start php-fpmsystemctl enable php-fpm来启动php,并将其设置为开机自启动。如果想查看php的监听端口,可通过执行:netstat -l | grep php来查看,执行:grep -v ";\|^$" /etc/php-fpm.d/www.conf | grep listen可从配置文件中可查出具体侦听配置。默认在安装旧的PHP版本后,需要在Nginx中配置好对应的PHP支持,但云主机集成的高版本的yum源安装后,会自动安装好对应的配置支持文件,因此开发者无需自行配置。通过执行:cat /etc/nginx/conf.d/php-fpm.confcat /etc/nginx/default.d/php.conf即可查看对应的配置文件,显示如下。最后测试LNMP的PHP支持,在终端输入:echo "<?php phpinfo(); ?>" > /usr/share/nginx/html/index.php来编辑PHP测试页面,修改完后输入:systemctl reload nginx来对php服务进行重载。使用浏览器访问http://127.0.0.1/index.php,显示如下图页面,说明PHP安装成功。数据库数据初始化登录数据库并创建WordPress系统所用的数据库wordpress和对应的用户wordpressuser,并使用密码Huawei@123。在终端输入:mysql -uroot -p在Enter password处输入root的密码“Huawei@123”,登录数据库后,执行:create database wordpress;创建数据库wordpress,执行:create user 'wordpressuser'@'localhost' identified by 'Huawei@123';创建用户wordpressuser并设置密码为Huawei@123,然后执行:grant all privileges on wordpress.* to 'wordpressuser'@'localhost';来进行授权,最后执行:flush privileges;quit刷新退出即可。然后输入:mysql -uwordpressuser -p回车,使用我们新建的wordpressuser账户登录数据库,密码为“Huawei@123”,登录成功后,输入:show databases;显示如下即完成了数据库的初始化配置。输入:quit退出,至此,WordPress所需要的运行环境已经搭建完毕,接下来可以进行WordPress博客系统的安装。安装并配置WordPress打开WordPress官网的下载页面:https://cn.wordpress.org/download/ ,下载wordpress-6.7.1软件包至本地。跳转到软件包目录。然后输入:cp -a /home/developer/下载/wordpress-6.7.1-zh_CN.zip .将软件包复制到当前目录,然后执行:unzip wordpress-6.7.1-zh_CN.zip来解压zip包,然后执行:mv wordpress /usr/share/nginx/html/chown -R apache:apache /usr/share/nginx/html/wordpress/将解压出来的项目目录移动至nginx页面目录下,并设置目录权限。接下来进行WordPress配置。首先执行:cd /usr/share/nginx/html/wordpress进入到WordPress 项目目录,然后执行:cp -a wp-config-sample.php wp-config.php将wp-config-sample.php文件复制名为wp-config.php的文件用作配置文件,并保留示例配置文件以作备份。然后开始编辑WordPress的配置文件,输入:vim wp-config.php按 “i”进入编辑模式来编辑配置文件,按照下图把DB_NAME(数据库名称)、DB_USER(数据库用户名)、DB_PASSWORD(数据库密码)更改为之前所配置的设置,参数如下:/** The name of the database for WordPress */define( 'DB_NAME', 'wordpress' );/** Database username */define( 'DB_USER', 'wordpressuser' );/** Database password */define( 'DB_PASSWORD', 'Huawei@123' );修改完后,按Esc,输入“:wq”,回车,保存并退出配置文件,然后执行:grep -n "^[a-z]\|^[A-Z]" wp-config.php来查看修改是否成功,显示如下即可。接下来进行安装WordPress。在浏览器地址栏输入http://127.0.0.1/wordpress,即可跳转至安装页面,然后按照提示填写对应的表单信息后,即可点击安装WordPress。若WordPress安装完成,会如下图所示,然后点击登录,输入用户名和密码,即可登录wordpress管理台,可在页面见到网站仪表盘,如下图所示。在浏览器输入http://127.0.0.1/wordpress 即可查看wordpress主页.可以在管理界面选择想要的主题和插件,可使用在线安装的方式进行安装,也可以在线更新各种插件(PS:前提是设置好此前所说的访问权限,不然会弹出授权界面)。安装完成后,点击启用即可使用,并可在已安装插件中查看。至此,已完成整个WordPress项目的部署。更多案例,点击案例中心查看~
-
支持版本除了庆祝新的版本发布以后,也需要注意一下:PHP 8.0 的生命周期即将结束,PHP 8.0 早已在2022 年 11 月 26 日结束了积极支持,而安全支持也将在 PHP8.3 发布的三天后2023 年 11 月 26 日停止。了解更多信息可查看Supported Versions。新特性PHP 8.3 引入了许多新功能。然而,它的功能比 PHP 8.1 或 PHP 8.2 相对较少。PHP 8.3 的主要新特性:类型化类常量动态类常量获取#[\Override]属性只读修改添加json_validate函数添加Randomizer::getBytesFromString()方法添加Randomizer::getFloat()和Randomizer::nextFloat()方法类型化类常量现在可以在定义常量时,增加类型。 // PHP < 8.3 interface I { // We may naively assume that the PHP constant is always a string const PHP = 'PHP 8.2'; } class Foo implements I { const PHP = []; // But it may be an array... } // PHP 8.3 interface I { const string PHP = 'PHP 8.3'; } class Foo implements I { const string PHP = []; } // Fatal error: Cannot use array as value for class constant Foo::PHP of type string 动态类常量获取在之前的版本中获取类的常量,除了直接调用以外,想要动态获取只能通过拼接后使用constant来实现,而现在可以直接使用变量来获取常量。这个方式在枚举类型中也可以使用。// PHP < 8.3 class Foo { const PHP = 'PHP 8.2'; } $searchableConstant = 'PHP'; var_dump(constant(Foo::class . "::{$searchableConstant}")); // PHP 8.3 class Foo { const PHP = 'PHP 8.3'; } $searchableConstant = 'PHP'; var_dump(Foo::{$searchableConstant});添加#[\Override]属性通过给方法添加 #[\Override] 属性,PHP 将确保在父类或实现的接口中存在同名的方法。添加该属性可以清楚地表明重载父类方法是有意为之,并简化了重构过程,因为重载父类方法的删除会被检测到。// PHP < 8.3 use PHPUnit\Framework\TestCase; final class MyTest extends TestCase { protected $logFile; protected function setUp(): void { $this->logFile = fopen('/tmp/logfile', 'w'); } protected function taerDown(): void { fclose($this->logFile); unlink('/tmp/logfile'); } } // The log file will never be removed, because the // method name was mistyped (taerDown vs tearDown). // PHP 8.3 use PHPUnit\Framework\TestCase; final class MyTest extends TestCase { protected $logFile; protected function setUp(): void { $this->logFile = fopen('/tmp/logfile', 'w'); } #[\Override] protected function taerDown(): void { fclose($this->logFile); unlink('/tmp/logfile'); } } // Fatal error: MyTest::taerDown() has #[\Override] attribute, // but no matching parent method exists只读修改只读属性现在可以在魔术方法 __clone 方法中修改一次,以实现只读属性的深度克隆。// PHP < 8.3 readonly class Foo { public \DateTime $dateTime; function __construct(\DateTime $dateTime) { $this->dateTime = $dateTime; } public function __clone() { $this->dateTime = clone $this->dateTime; } } $today = new Foo(new \DateTime()); $tomorrow = clone $today; // Fatal error: Cannot modify readonly property Foo::$dateTime // PHP 8.3 readonly class Foo { public \DateTime $dateTime; function __construct(\DateTime $dateTime) { $this->dateTime = $dateTime; } public function __clone() { $this->dateTime = clone $this->dateTime; } } $today = new Foo(new \DateTime()); $tomorrow = clone $today; $tomorrow->dateTime->modify('+1 day');添加json_validate函数在之前的版本中想要验证一个字符是否是语法上有效的JSON,需要先decode然后判断错误码,而现在可以直接调用json_validate函数。同时 json_validate() 性能比 json_decode() 要好不少,并且使用更加简单。// PHP < 8.3 function json_validate(string $string): bool { json_decode($string); return json_last_error() === JSON_ERROR_NONE; } var_dump(json_validate('{ "test": { "foo": "bar" } }')); // true // PHP 8.3 var_dump(json_validate('{ "test": { "foo": "bar" } }')); // true一次 Lint 多个文件PHP CLI 二进制文件的 -l 允许检查 PHP 文件以确保它没有语法错误。以前只允许一次检查一个文件,这意味着如果想检查整个项目,则必须为每个应用程序文件调用一次它。从 PHP 8.3 开始允许传递多个文件。// PHP < 8.3 php -l index.php // PHP 8.3 php -l src/**/*.php
推荐直播
-
HDC深度解读系列 - Serverless与MCP融合创新,构建AI应用全新智能中枢2025/08/20 周三 16:30-18:00
张昆鹏 HCDG北京核心组代表
HDC2025期间,华为云展示了Serverless与MCP融合创新的解决方案,本期访谈直播,由华为云开发者专家(HCDE)兼华为云开发者社区组织HCDG北京核心组代表张鹏先生主持,华为云PaaS服务产品部 Serverless总监Ewen为大家深度解读华为云Serverless与MCP如何融合构建AI应用全新智能中枢
回顾中 -
关于RISC-V生态发展的思考2025/09/02 周二 17:00-18:00
中国科学院计算技术研究所副所长包云岗教授
中科院包云岗老师将在本次直播中,探讨处理器生态的关键要素及其联系,分享过去几年推动RISC-V生态建设实践过程中的经验与教训。
回顾中 -
一键搞定华为云万级资源,3步轻松管理企业成本2025/09/09 周二 15:00-16:00
阿言 华为云交易产品经理
本直播重点介绍如何一键续费万级资源,3步轻松管理成本,帮助提升日常管理效率!
回顾中
热门标签