Windows环境PHP服务器请求排队无响应,如何实现多任务同时处理?
Laravel 10 + PHP 8.2 实现多请求并行处理解决方案
问题描述
- 运行环境:Windows 11 本地XAMPP服务器,通过
php artisan serve启动Laravel 10应用 - 业务场景:页面接收上传文件,使用Spatie库执行图片缩放操作
- 遇到的问题:PHP服务器需等待图片缩放完成后才会响应新请求,所有新请求被排队处理;尝试执行以下代码未解决问题:
session_start(); session_write_close();
解决方案
1. 替换单进程开发服务器
php artisan serve是PHP内置的单进程单线程开发服务器,本身不支持并行处理请求,需要替换为多进程/多线程服务器:
- 直接用XAMPP的Apache托管项目:将Laravel项目放到XAMPP的
htdocs目录,配置虚拟主机,Apache默认支持多请求并行处理 - 使用Windows版Valet:配置完成后会以Nginx作为服务器,天然支持并发请求
- 部署RoadRunner/Swoole:这两个是高性能常驻内存服务器,支持异步任务与并行处理,适合高并发场景(需额外安装配置)
2. 异步处理耗时的图片缩放任务
图片缩放属于I/O密集型耗时操作,应该剥离到异步任务中执行,避免阻塞当前请求:
- 使用Laravel队列:
- 配置队列驱动(本地可先用
database驱动,需执行php artisan queue:table生成队列表并完成迁移) - 创建图片缩放任务:
php artisan make:job ResizeImage - 在
ResizeImage任务类的handle方法中编写Spatie图片缩放逻辑 - 文件上传完成后,将缩放任务推入队列:
ResizeImage::dispatch($filePath); - 启动队列监听进程:
php artisan queue:work
- 配置队列驱动(本地可先用
- 简易异步调用:如果场景简单,可直接使用闭包异步任务:
dispatch(function () use ($filePath) { // 这里写入Spatie图片缩放逻辑 });
3. 正确处理Session锁(按需使用)
Laravel已封装Session管理,直接调用session_start()和session_write_close()无效。若需提前释放Session锁以避免排队,可在完成Session相关操作后执行:
session()->save(); // 若无需保留Session数据,可追加session()->flush();
注意:此方法仅解决Session锁导致的排队问题,无法突破单进程服务器的并发限制,优先推荐前两种方案。
内容的提问来源于stack exchange,提问作者Burak ER
相关产品推荐
相关产品推荐

