答案:composer卡住或timeout主因是默认访问境外packagist.org导致dns/tls失败或镜像未同步,需先禁用fallback(composer config repo.packagist false)、再设正确格式镜像(如https://mirrors.cloud.tencent.com/composer/)、清元数据缓存(composer update --refresh)并验证生效。

composer require encore/laravel-admin 直接卡住或报 timeout
根本不是 laravel-admin 本身有问题,而是 Composer 在拉取元数据或 ZIP 包时等不到响应。默认走 packagist.org,国内访问经常卡在 GET https://packagist.org/packages.json 或某个包的 p2/xxx.json 上,超时后直接中断。
- 先确认是否真被卡住:加
-vvv参数重试,比如composer require encore/laravel-admin -vvv,看最后卡在哪一行 URL - 别急着删 vendor 或改代码——90% 是网络层问题,不是项目配置错
- 阿里云、腾讯云、Laravel China 这三个镜像目前(2026年8月)同步稳定,优先选
https://mirrors.cloud.tencent.com/composer/(腾讯云延迟通常最低) - 执行
composer config -g repos.packagist composer https://mirrors.cloud.tencent.com/composer/,注意末尾必须有/,少一个斜杠就 fallback 到官方源
明明换了镜像,还是提示 Could not find package 或 version not found
这是缓存和镜像同步双重作用的结果:Composer 本地缓存了过期的 packages.json,而镜像站本身也还没同步新版本的 laravel-admin 元数据(尤其小版本号更新后 5–20 分钟内常见)。
- 运行
composer config -g repos.packagist确认当前生效的镜像地址,不是“设过”就等于“生效” - 手动查镜像是否已有该包:
curl -s https://mirrors.cloud.tencent.com/composer/p2/encore/laravel-admin.json | jq -r '.packages."encore/laravel-admin" | keys[]' | sort | tail -2 - 如果返回空或版本明显旧于你想要的(比如你要
^1.10,但只看到1.9.9),说明镜像未同步,等 10 分钟再试,或临时绕过镜像:composer require encore/laravel-admin --repository=https://packagist.org -
composer clear-cache不解决这个问题——它不清理packages.json缓存;要用composer update --refresh(仅 Composer ≥2.5 支持)
php artisan admin:install 执行失败,报 SQLSTATE[42000]: Specified key was too long
这不是 Composer 超时,但常被误认为安装流程卡在最后一步。本质是 MySQL 旧版本(utf8mb4 和 utf8mb4_unicode_ci。
- 错误典型出现在
alter table users add unique users_email_unique(email)这一步,MySQL 报max key length is 767 bytes - 不要改数据库配置里的
charset或collation——那会影响整个 Laravel 应用,且新版已弃用 - 正确做法:打开
app/Providers/AppServiceProvider.php,在boot()方法里加一行:Schema::defaultStringLength(191); - 确保已
use Illuminate\Support\Facades\Schema;,否则会报未定义类 - 改完后删掉
vendor/和composer.lock,重新composer install再运行php artisan admin:install
装完访问 /admin 404,但 composer 没报错
说明 Composer 安装成功了,但 Web 服务器没把请求正确转发给 Laravel 的路由。这跟超时无关,但新手常以为“装完了就该能进后台”,结果卡在这一步。
- 先确认
php artisan route:list | grep admin能列出 admin 相关路由,否则是 service provider 没加载成功 - Nginx 用户检查是否漏了
try_files $uri /index.php?$query_string;,Apache 用户确认.htaccess生效且AllowOverride All已启用 - 如果你用
php artisan serve,直接访问http://127.0.0.1:8000/admin即可,不用配虚拟主机 - 检查
config/admin.php里'prefix' => 'admin'是否被意外改成了空字符串或斜杠
--refresh 才真正丢弃元数据缓存。这两个动作不等价,但文档里几乎从不强调区别。











