Files
2026-10-25 18:52:36 +08:00

73 lines
38 KiB
JavaScript
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import{_ as a,o as i,c as e,a2 as t}from"./chunks/framework.B-QBKwc1.js";const c=JSON.parse('{"title":"Laragon 环境搭建","description":"本项目推荐使用 Laragon 在 Windows 下搭建本地开发环境(Apache + PHP 8.3 + MySQL + Redis)。","frontmatter":{},"headers":[],"relativePath":"zh/quickstart/laragon.md","filePath":"zh/quickstart/laragon.md"}'),n={name:"zh/quickstart/laragon.md"};function l(p,s,h,d,o,k){return i(),e("div",null,[...s[0]||(s[0]=[t(`<h1 id="_2-2-Laragon-环境搭建" tabindex="-1">2.2 Laragon 环境搭建 <a class="header-anchor" href="#_2-2-Laragon-环境搭建" aria-label="Permalink to &quot;2.2 Laragon 环境搭建&quot;">​</a></h1><div class="tip custom-block"><p class="custom-block-title">概述</p><p>本项目推荐使用 Laragon 在 Windows 下搭建本地开发环境(Apache + PHP 8.3 + MySQL + Redis)。本页基于实际部署记录整理,涵盖 Laragon 目录结构、hosts 域名解析、Apache 虚拟主机配置、phpredis 扩展安装、php.ini 关键配置、Redis 密码与故障排查。完成本页后,即可进入 <a href="/zh/quickstart/backend-start.html">2.3 后端服务启动</a>。</p></div><h2 id="环境概况" tabindex="-1">环境概况 <a class="header-anchor" href="#环境概况" aria-label="Permalink to &quot;环境概况&quot;">​</a></h2><table tabindex="0"><thead><tr><th>项目</th><th>说明</th></tr></thead><tbody><tr><td>操作系统</td><td>Windows 10 / 11</td></tr><tr><td>集成环境</td><td>Laragon(如 <code>D:\\laragon</code>)</td></tr><tr><td>Web 服务器</td><td>Apache 2.4(Laragon 内置,mod_php 方式)</td></tr><tr><td>PHP</td><td>8.3.x Win64 <strong>TS(线程安全)</strong>,项目要求 ≥ 8.3</td></tr><tr><td>数据库</td><td>MySQL 8.x(Laragon 内置)</td></tr><tr><td>缓存</td><td>Redis(Laragon 内置,<code>127.0.0.1:6379</code>)</td></tr></tbody></table><p><strong>关键目录:</strong></p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span>D:\\laragon\\www\\ # 站点根目录(Apache 主 DocumentRoot)</span></span>
<span class="line"><span>D:\\laragon\\bin\\apache\\httpd-2.4.x-...\\ # Apache 主目录(下称 $HTTPD_HOME)</span></span>
<span class="line"><span>D:\\laragon\\bin\\php\\php-8.3.x-Win32-vs16-x64\\ # PHP 8.3 目录(下称 $PHP_HOME)</span></span>
<span class="line"><span>D:\\laragon\\www\\RXThinkCMF_Laravel13_EleVue\\ # 项目根目录(下称 $PROJECT)</span></span></code></pre></div><div class="warning custom-block"><p class="custom-block-title">PATH 中的 php 版本陷阱</p><p>Laragon 默认 shell PATH 指向的可能是旧版 PHP(如 7.3),直接执行 <code>php artisan</code> 会报 <code>requires PHP &gt;= 8.3</code>。执行 artisan、pint、composer 时<strong>必须使用 8.3 的完整路径</strong>:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;">$PHP_HOME</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\p</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">hp.exe artisan list</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;">$PHP_HOME</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\p</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">hp.exe vendor</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\b</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">in</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\p</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">int --test</span></span></code></pre></div></div><h2 id="安装-PHP-8-3" tabindex="-1">安装 PHP 8.3 <a class="header-anchor" href="#安装-PHP-8-3" aria-label="Permalink to &quot;安装 PHP 8.3&quot;">​</a></h2><ol><li>打开 Laragon 菜单 <strong>PHP → Version</strong>,选择 8.3.x;</li><li>列表中没有 8.3 时,手动下载 <code>php-8.3.x-Win32-vs16-x64.zip</code>(<strong>TS 线程安全版</strong>,Laragon 的 Apache 以 mod_php 方式运行,必须用 TS),解压到 <code>D:\\laragon\\bin\\php\\</code> 下,重启 Laragon 后重新选择;</li><li>验证版本与线程安全类型:</li></ol><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;">$PHP_HOME</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\p</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">hp.exe -v</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># PHP 8.3.x (ts) ...</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;">$PHP_HOME</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\p</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">hp.exe -i </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">|</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> findstr</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">Thread Safety</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># Thread Safety =&gt; enabled ← TS(Apache mod_php 需要)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;">$PHP_HOME</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\p</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">hp.exe -i </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">|</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> findstr</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">extension_dir</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># extension_dir =&gt; D:/laragon/bin/php/php-8.3.x-Win32-vs16-x64/ext ← 记下扩展目录</span></span></code></pre></div><h2 id="hosts-域名解析" tabindex="-1">hosts 域名解析 <a class="header-anchor" href="#hosts-域名解析" aria-label="Permalink to &quot;hosts 域名解析&quot;">​</a></h2><p>编辑 <code>C:\\Windows\\System32\\drivers\\etc\\hosts</code>(管理员权限):</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span>127.0.0.1 admin.laravel13.elevue file.laravel13.elevue</span></span></code></pre></div><table tabindex="0"><thead><tr><th>域名</th><th>用途</th></tr></thead><tbody><tr><td><code>admin.laravel13.elevue</code></td><td>应用入口(DocumentRoot 指向项目 <code>public/</code>)</td></tr><tr><td><code>file.laravel13.elevue</code></td><td>附件目录(DocumentRoot 指向项目 <code>uploads/</code>)</td></tr></tbody></table><p>同系列项目域名格式为 <code>admin.&lt;项目&gt;.&lt;前端品牌&gt;</code>,如 <code>admin.laravel13.antdvue</code>、<code>admin.laravel13.naivevue</code>。</p><h2 id="Apache-虚拟主机配置" tabindex="-1">Apache 虚拟主机配置 <a class="header-anchor" href="#Apache-虚拟主机配置" aria-label="Permalink to &quot;Apache 虚拟主机配置&quot;">​</a></h2><h3 id="配置位置" tabindex="-1">配置位置 <a class="header-anchor" href="#配置位置" aria-label="Permalink to &quot;配置位置&quot;">​</a></h3><p><code>httpd.conf</code> 末尾有两处 Include,均可放置虚拟主机:</p><div class="language-apache vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">apache</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">IncludeOptional</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> &quot;D:/laragon/etc/apache2/sites-enabled/*.conf&quot; # Laragon 自动生成</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">Include</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> &quot;conf/vhost/*.conf&quot; # 手动配置(本项目在此)</span></span></code></pre></div><p>本项目使用 <code>$HTTPD_HOME\\conf\\vhost\\laravel13.conf</code>。</p><h3 id="配置模板-Directory-块缺一不可-" tabindex="-1">配置模板(Directory 块缺一不可) <a class="header-anchor" href="#配置模板-Directory-块缺一不可-" aria-label="Permalink to &quot;配置模板(Directory 块缺一不可)&quot;">​</a></h3><div class="language-apache vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">apache</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 项目应用本地虚拟主机配置</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">&lt;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">VirtualHost</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> *:80</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">&gt;</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> ServerAdmin</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> rxthinkcmf@</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;">163</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">.com</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> ServerName</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> admin.laravel13.elevue</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> DocumentRoot</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> &quot;D:\\laragon\\www\\RXThinkCMF_Laravel13_EleVue\\public&quot;</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> ErrorLog</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> &quot;logs/laravel13-error.log&quot;</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> CustomLog</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> &quot;logs/laravel13-access.log&quot; common</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> &lt;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">Directory</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> &quot;D:\\laragon\\www\\RXThinkCMF_Laravel13_EleVue\\public&quot;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">&gt;</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> AllowOverride</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> All</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> Require</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> all granted</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> &lt;/</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">Directory</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">&gt;</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">&lt;/</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">VirtualHost</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 项目附件目录本地虚拟主机配置</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">&lt;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">VirtualHost</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> *:80</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">&gt;</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> ServerName</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> file.laravel13.elevue</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> DocumentRoot</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> &quot;D:\\laragon\\www\\RXThinkCMF_Laravel13_EleVue\\uploads&quot;</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> ErrorLog</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> &quot;logs/laravel13-error.log&quot;</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> CustomLog</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> &quot;logs/laravel13-access.log&quot; common</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> &lt;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">Directory</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> &quot;D:\\laragon\\www\\RXThinkCMF_Laravel13_EleVue\\uploads&quot;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">&gt;</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> AllowOverride</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> All</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> Require</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> all granted</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> &lt;/</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">Directory</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">&gt;</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">&lt;/</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">VirtualHost</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">&gt;</span></span></code></pre></div><h3 id="为什么-Directory-块必须写-404-根因-" tabindex="-1">为什么 Directory 块必须写(404 根因) <a class="header-anchor" href="#为什么-Directory-块必须写-404-根因-" aria-label="Permalink to &quot;为什么 Directory 块必须写(404 根因)&quot;">​</a></h3><p>主 <code>httpd.conf</code> 中的默认设置为 <code>AllowOverride None</code>(全局忽略 <code>.htaccess</code>)。Apache 的 <code>&lt;Directory&gt;</code> 写在某个 <code>&lt;VirtualHost&gt;</code> 内部时<strong>只对该虚拟主机生效</strong>,因此 vhost 必须自带 <code>&lt;Directory&gt;</code> 块,把本虚拟主机范围内的 <code>AllowOverride</code> 覆盖为 <code>All</code>,Laravel 的 <code>public/.htaccess</code>(URL 重写规则)才能生效。</p><p><strong>症状特征(识别此问题的关键):</strong></p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span>GET / → 200 正常(DirectoryIndex 命中物理文件 index.php)</span></span>
<span class="line"><span>GET /api/captcha → 404,且是 Apache 原生 HTML 404 页</span></span>
<span class="line"><span> &lt;title&gt;404 Not Found&lt;/title&gt;(不是 Laravel 的 JSON 响应)</span></span></code></pre></div><p>解读:物理文件能访问、非物理 URL 无法重写进 <code>index.php</code>,说明请求根本没有进入 Laravel。<strong>只要 404 页面是 Apache 原生的,问题一定在 Web 服务器配置,而不是 Laravel 路由。</strong></p><h3 id="配置校验与重启" tabindex="-1">配置校验与重启 <a class="header-anchor" href="#配置校验与重启" aria-label="Permalink to &quot;配置校验与重启&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 改动配置后必做:校验语法(输出 Syntax OK 即通过;AH00112 警告可忽略)</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;">$HTTPD_HOME</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\b</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">in</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\h</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">ttpd.exe -t</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># Apache 未注册为 Windows 服务,-k restart 会报 &quot;No installed service&quot;,需手动重启:</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">taskkill</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> //F</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> //IM</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> httpd.exe</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">cmd</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> //c</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> start</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;&quot;</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">D:\\laragon\\bin\\apache\\httpd-2.4.x-...\\bin\\httpd.exe</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 验证进程(应看到 2 个 httpd.exe:父进程 + 工作进程)</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">tasklist</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> //FI</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">IMAGENAME eq httpd.exe</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span></span></code></pre></div><div class="tip custom-block"><p class="custom-block-title">TIP</p><p>Laragon 菜单 <strong>Apache → Reload</strong> 亦可;手动部署环境下以上命令最可靠。</p></div><h2 id="安装-phpredis-扩展" tabindex="-1">安装 phpredis 扩展 <a class="header-anchor" href="#安装-phpredis-扩展" aria-label="Permalink to &quot;安装 phpredis 扩展&quot;">​</a></h2><p>项目强依赖 Redis(验证码、JWT 会话、字典缓存),PHP 必须安装 redis 扩展,否则报 <code>Class &quot;Redis&quot; not found</code>。</p><h3 id="判断线程安全类型-决定下载哪个包-" tabindex="-1">判断线程安全类型(决定下载哪个包) <a class="header-anchor" href="#判断线程安全类型-决定下载哪个包-" aria-label="Permalink to &quot;判断线程安全类型(决定下载哪个包)&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;">$PHP_HOME</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\p</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">hp.exe -i </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">|</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> findstr</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">Thread Safety</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># Thread Safety =&gt; enabled → TS 包(Laragon 的 Apache 用 TS)</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># Thread Safety =&gt; disabled → NTS 包(php-fpm 用)</span></span></code></pre></div><h3 id="下载" tabindex="-1">下载 <a class="header-anchor" href="#下载" aria-label="Permalink to &quot;下载&quot;">​</a></h3><p>官方 Windows 扩展仓库(<code>windows.php.net</code> 会 302 跳转到 <code>downloads.php.net</code>):</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span>https://downloads.php.net/~windows/pecl/releases/redis/</span></span>
<span class="line"><span># 目录按版本号分子目录:6.0.0/ 6.1.0/ 6.2.0/ 6.3.0/ ...</span></span></code></pre></div><p>文件名命名规则(<strong>四个要素必须全部匹配</strong>):</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span>php_redis-{扩展版本}-php-{PHP主次版本}-{ts|nts}-vs16-{x64|x86}.zip</span></span>
<span class="line"><span></span></span>
<span class="line"><span>本次实际下载(PHP 8.3 + TS + 64 位 + VS16 编译器):</span></span>
<span class="line"><span>https://downloads.php.net/~windows/pecl/releases/redis/6.3.0/php_redis-6.3.0-8.3-ts-vs16-x64.zip</span></span></code></pre></div><h3 id="安装" tabindex="-1">安装 <a class="header-anchor" href="#安装" aria-label="Permalink to &quot;安装&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 解压后将 php_redis.dll 复制到扩展目录</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">copy</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> php_redis.dll</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> D:</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\l</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">aragon</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\b</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">in</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\p</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">hp</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\p</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">hp-8.3.x-Win32-vs16-x64</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\e</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">xt</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\</span></span></code></pre></div><h3 id="php-ini-配置" tabindex="-1">php.ini 配置 <a class="header-anchor" href="#php-ini-配置" aria-label="Permalink to &quot;php.ini 配置&quot;">​</a></h3><p>编辑 <code>$PHP_HOME\\php.ini</code>(mod_php 与 CLI 共用同一份),在扩展区按字母序新增一行:</p><div class="language-ini vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ini</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">extension_dir</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">D:/laragon/bin/php/php-8.3.x-Win32-vs16-x64/ext</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">...</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">;extension=pgsql</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">extension</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">redis ← 新增此行(PHP 8 写法:不带 php_ 前缀和 .dll 后缀)</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">;extension=shmop</span></span></code></pre></div><div class="danger custom-block"><p class="custom-block-title">常见坑</p><ul><li>写成 <code>extension=php_redis.dll</code> 是 PHP 5 时代的旧写法,PHP 8 下报错;</li><li>只改 <code>php.ini-development</code> / <code>php.ini-production</code> 无效,PHP 加载的是 <code>php.ini</code>;</li><li><strong>改完必须重启 Apache</strong>(mod_php 常驻进程,不会热加载)。</li></ul></div><h3 id="验证" tabindex="-1">验证 <a class="header-anchor" href="#验证" aria-label="Permalink to &quot;验证&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># CLI 验证(应输出 redis)</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;">$PHP_HOME</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\p</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">hp.exe -m </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">|</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> findstr</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> redis</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># HTTP 验证(重启 Apache 后调用依赖 Redis 的接口,见下方「部署验证清单」)</span></span></code></pre></div><h2 id="php-ini-关键配置" tabindex="-1">php.ini 关键配置 <a class="header-anchor" href="#php-ini-关键配置" aria-label="Permalink to &quot;php.ini 关键配置&quot;">​</a></h2><p><code>$PHP_HOME\\php.ini</code> 中与本项目相关的关键配置:</p><table tabindex="0"><thead><tr><th>配置项</th><th>建议值</th><th>说明</th></tr></thead><tbody><tr><td><code>extension</code> 系列</td><td>按需启用</td><td>项目必需:<code>pdo_mysql</code>、<code>mbstring</code>、<code>gd</code>、<code>bcmath</code>、<code>zip</code>、<code>redis</code>、<code>openssl</code>、<code>fileinfo</code>、<code>curl</code>;跨库迁移目标为 PostgreSQL 时另启用 <code>pdo_pgsql</code></td></tr><tr><td><code>memory_limit</code></td><td><code>256M</code></td><td>Excel 导出等大内存场景</td></tr><tr><td><code>max_execution_time</code></td><td><code>60</code></td><td>导入导出超时上限</td></tr><tr><td><code>upload_max_filesize</code> / <code>post_max_size</code></td><td><code>50M</code></td><td>与 <code>.env</code> 中 <code>FILE_MAX_SIZE</code> 配合(业务限制更小)</td></tr><tr><td><code>date.timezone</code></td><td><code>Asia/Shanghai</code></td><td>与应用时区一致</td></tr><tr><td><code>opcache.enable</code></td><td><code>1</code></td><td>本地开发可保持 <code>opcache.validate_timestamps=1</code>,改代码即时生效</td></tr></tbody></table><p>修改后重启 Apache 生效。</p><h2 id="Redis-密码配置" tabindex="-1">Redis 密码配置 <a class="header-anchor" href="#Redis-密码配置" aria-label="Permalink to &quot;Redis 密码配置&quot;">​</a></h2><h3 id="状态确认" tabindex="-1">状态确认 <a class="header-anchor" href="#状态确认" aria-label="Permalink to &quot;状态确认&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">tasklist</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> //FI</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">IMAGENAME eq redis-server.exe</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 进程</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">netstat</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -an</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> |</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> findstr</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">:6379</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 应看到 127.0.0.1:6379 LISTENING</span></span></code></pre></div><h3 id="设置密码-实际踩坑记录-" tabindex="-1">设置密码(实际踩坑记录) <a class="header-anchor" href="#设置密码-实际踩坑记录-" aria-label="Permalink to &quot;设置密码(实际踩坑记录)&quot;">​</a></h3><div class="warning custom-block"><p class="custom-block-title">WARNING</p><p>Redis 无密码直连可用;一旦 Redis 侧设置了 <code>requirepass</code> 而 <code>.env</code> 未同步(或 <code>.env</code> 配了 <code>REDIS_PASSWORD</code> 而 Redis 侧没设密码),Laravel 所有 Redis 操作(验证码、JWT 会话、限流)会全部失败。验证码接口此时返回「缓存服务(Redis)连接失败,请检查 Redis 配置(地址、端口、密码)后重试」,真实错误(如 <code>ERR AUTH ...</code>)记录在日志 <code>验证码写入 Redis 失败</code> 中。</p></div><p>处理步骤(缺一不可):</p><ol><li>Redis 服务端设置密码(<code>redis.conf</code> 的 <code>requirepass</code> 或 <code>CONFIG SET requirepass</code>);</li><li><code>.env</code> 同步配置:</li></ol><div class="language-ini vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ini</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">REDIS_CLIENT</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">phpredis</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">REDIS_HOST</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">127.0.0.1</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">REDIS_PASSWORD</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">你的密码 ← 原为 null,必须改</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">REDIS_PORT</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">6379</span></span></code></pre></div><ol start="3"><li>清除配置缓存并重启 Apache:</li></ol><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;">$PHP_HOME</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\p</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">hp.exe artisan config:clear</span></span></code></pre></div><h3 id="单独验证-Redis-连通-绕开业务代码-" tabindex="-1">单独验证 Redis 连通(绕开业务代码) <a class="header-anchor" href="#单独验证-Redis-连通-绕开业务代码-" aria-label="Permalink to &quot;单独验证 Redis 连通(绕开业务代码)&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;">$PHP_HOME</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\p</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">hp.exe artisan tinker </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;">--execute</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">try { \\Illuminate\\Support\\Facades\\Redis::setex(&#39;test:key&#39;, 10, &#39;ok&#39;); echo &#39;OK: &#39;.\\Illuminate\\Support\\Facades\\Redis::get(&#39;test:key&#39;); } catch (\\Throwable </span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\$</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">e) { echo get_class(</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\$</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">e).&#39;: &#39;.</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\$</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">e-&gt;getMessage(); }</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 输出 OK: ok 即连接正常(测试键 10 秒自动过期)</span></span></code></pre></div><h2 id="部署验证清单" tabindex="-1">部署验证清单 <a class="header-anchor" href="#部署验证清单" aria-label="Permalink to &quot;部署验证清单&quot;">​</a></h2><p>按顺序全部通过即环境就绪:</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span>□ $PHP_HOME\\php.exe -v → PHP 8.3.x (ts)</span></span>
<span class="line"><span>□ $PHP_HOME\\php.exe -m | findstr redis → redis</span></span>
<span class="line"><span>□ httpd.exe -t → Syntax OK</span></span>
<span class="line"><span>□ tasklist 查看 redis-server.exe → 进程存在,6379 LISTENING</span></span>
<span class="line"><span>□ curl http://admin.laravel13.elevue/api/captcha</span></span>
<span class="line"><span> → {&quot;code&quot;:0,&quot;ok&quot;:true,&quot;msg&quot;:&quot;操作成功&quot;,&quot;data&quot;:{...}}</span></span>
<span class="line"><span>□ curl -X POST http://admin.laravel13.elevue/api/login</span></span>
<span class="line"><span> → {&quot;code&quot;:1,&quot;ok&quot;:false,&quot;msg&quot;:&quot;参数验证失败&quot;,&quot;data&quot;:{...}} (路由已通)</span></span></code></pre></div><p>验证码接口返回 <code>code=0</code> 的 JSON 即部署成功——它同时验证了 Apache 重写、PHP 8.3、Redis 连通三条链路。</p><h2 id="常见问题" tabindex="-1">常见问题 <a class="header-anchor" href="#常见问题" aria-label="Permalink to &quot;常见问题&quot;">​</a></h2><table tabindex="0"><thead><tr><th>症状</th><th>原因</th><th>处理</th></tr></thead><tbody><tr><td><code>/</code> 正常,<code>/api/*</code> 返回 Apache 原生 HTML 404</td><td>vhost 缺 <code>&lt;Directory&gt;</code> 块,<code>.htaccess</code> 被忽略</td><td>补 <code>AllowOverride All</code> 块,<code>httpd -t</code> 后重启 Apache</td></tr><tr><td><code>Class &quot;Redis&quot; not found</code></td><td>PHP 缺 redis 扩展</td><td>装 <code>php_redis.dll</code> + <code>php.ini</code> 加 <code>extension=redis</code></td></tr><tr><td>验证码接口返回「缓存服务(Redis)连接失败…」</td><td>Redis 密码不匹配或服务未启</td><td>日志搜 <code>验证码写入 Redis 失败</code> 看真实错误;<code>.env</code> 配 <code>REDIS_PASSWORD</code>,tinker 单测 Redis 连通</td></tr><tr><td>artisan/pint 报 requires PHP &gt;= 8.3</td><td>shell PATH 的 php 是旧版</td><td>用 <code>$PHP_HOME\\php.exe</code> 完整路径调用</td></tr><tr><td><code>httpd -k restart</code> 报 No installed service</td><td>Apache 未注册 Windows 服务</td><td><code>taskkill</code> 后重新启动 <code>httpd.exe</code></td></tr><tr><td>改了配置 / 扩展不生效</td><td>mod_php 常驻不热加载</td><td>必须重启 Apache</td></tr></tbody></table><h2 id="相关页面" tabindex="-1">相关页面 <a class="header-anchor" href="#相关页面" aria-label="Permalink to &quot;相关页面&quot;">​</a></h2><ul><li><a href="/zh/quickstart/environment.html">2.1 开发环境准备</a> — 版本要求总览</li><li><a href="/zh/quickstart/backend-start.html">2.3 后端服务启动</a> — 安装依赖、初始化项目</li><li><a href="/zh/quickstart/env-vars.html">2.6 环境变量配置</a> — <code>.env</code> 全部配置项说明</li><li><a href="/zh/quickstart/faq.html">2.9 常见问题 FAQ</a> — 更多启动期问题</li></ul>`,71)])])}const g=a(n,[["render",l]]);export{c as __pageData,g as default};