Botman Studio结合PHP artisan与ngrok时本地图片附件失效问题
问题原因分析
核心问题出在你使用的php artisan serve Laravel内置开发服务器上,该服务为单线程工作模式,同一时间仅能处理1个HTTP请求:
- Botman接收VK/Telegram的回调请求时,已经占满了唯一的工作线程
- 后续Botman主动请求同站点的ngrok图片链接属于第二个HTTP请求,没有空闲线程可以处理,就会进入无限等待,最终触发60秒最大执行时间报错
- 调用Imgur等外链图片正常、tinker执行逻辑正常,都是因为这两类场景不会产生同站点的二次HTTP请求,不会出现线程抢占问题,和你的代码逻辑、CSRF配置没有关系
解决方案
方案1:更换多线程服务器(推荐)
直接使用XAMPP集成的Apache服务运行项目,不要用php artisan serve:
- 打开XAMPP的Apache配置文件,新增虚拟主机,将站点根目录指向Laravel项目的
public文件夹 - 配置完成后启动Apache,后续所有请求由多线程的Apache处理,可同时响应回调请求和图片资源请求,不会出现阻塞
方案2:临时测试双实例方案
如果仅需本地临时调试,可启动两个独立的php artisan serve实例规避问题:
- 第一个实例监听8000端口,用于处理Botman平台回调:
php artisan serve --port=8000 - 第二个实例监听8001端口,用于提供图片资源:
php artisan serve --port=8001 - 把图片链接的域名映射到8001端口的服务,两个请求分别走独立进程,不会出现线程抢占
方案3:直接读取本地资源规避HTTP请求
直接读取本地图片资源传给Botman附件,跳过二次HTTP请求环节:
// 动态生成的图片直接存临时文件调用 $img = ImageManagerStatic::make(base64_decode($img_url)); $tmpPath = tempnam(sys_get_temp_dir(), 'img') . '.jpg'; $img->save($tmpPath); $attachment = new Image($tmpPath); $message = OutgoingMessage::create('📷')->withAttachment($attachment); $this->say($message); // 使用完可删除临时文件 unlink($tmpPath);
内容的提问来源于stack exchange,提问作者ale24
相关产品推荐
相关产品推荐

