简介这是一套经过实测的720全景云系统以PHPMySQL为技术栈既能生成小程序端也附带PC端适合有云服务器或独立服务器的开发者与建站者尤其适合房产、文旅、展馆等需要全景展示的场景。系统要求Linux下Nginx环境以保障稳定与安全强调它并非依赖phpStudy的简易全景通方案更适合生产部署。资源包共2000个文件124.5MB含651个PHP核心逻辑、249个JS脚本、68个CSS样式及上千张PNG/GIF图片另有LBI模板、XML配置、SQL数据库与krpano全景工具和批处理脚本便于二次调整。当前已有456人学习下载可据此系统掌握环境配置、数据导入、小程序生成与PC端发布的关键步骤快速落地自己的全景展示项目。1. 这套 720 全景云系统先想清楚它解决什么问题做全景展示的开发者通常卡在两个点上一是全景图切好了不知道往哪儿传二是传上去之后 PC 能看、小程序端却打不开。这套 720 全景云系统解决的就是「一套全景资源多端分发」的问题——后台用 PHP 跑存储挂七牛或阿里云 OSS前端同时输出 PC 网页版和微信小程序版不是拿 phpstudy 在本机装个全景通那种玩具思路。它的安装要求写得清楚云服务器或独立服务器推荐 Linux Nginx PHP 5.3 MySQL 5.5 以上。适合谁手里已经有全景拍摄和 krpano 切片能力、但缺一套能发布和管理全景资源的后台的人以及接单做全景看房、景区导览、展会展示的从业者。下文我会把环境选型、部署步骤、krpano droplet 工作流和踩坑记录一次过拆完。2. 为什么是 Linux Nginx PHP/MySQL 对象存储选型与运行逻辑全景云系统说白了是一个「上传全景图 → 生成或托管切片 → 通过 H5 页面或小程序展示」的内容管理系统。和本地全景通最大的区别在于本地工具只管切图不管分发而云系统要同时处理文件存储、数据库记录、前端页面渲染和小程序 API 对接。这四件事挤在一台机器上时环境选错就是连环翻车。2.1 全景云系统和本地全景通系统的本质差别本地全景通比如 phpstudy 一键包里的那些通常是单机演示型——数据库、文件、页面全塞在 Windows 本机访问量稍大就慢更谈不上给小程序提供接口。而云系统默认就是多租户或至少可公网访问的架构用户上传全景图系统把图推到对象存储数据库里只存路径和配置PC 端和小程序端分别通过 HTTP 接口拉取全景数据和封面图。这个差别直接决定了为什么摘要里反复强调 Linux Nginx。PHP 在 Linux 下的运行稳定性比 Windows 高一个量级Nginx 处理静态文件全景切片就是大量静态文件的效率远高于 Apache。全景图的 multires 切片动辄几百个小文件Nginx 的 sendfile 和异步 IO 机制能扛住Apache 在这种场景下经常把 CPU 吃满。另一个关键点是对象存储七牛或阿里云 OSS。全景图原图一张动辄 50-100MB切成 multires 瓦片后文件数量巨大如果全部存在服务器本地磁盘 IO 会成为瓶颈备份也是噩梦。挂上对象存储后服务器只跑 PHP 和数据库图片访问走 CDN这是能支撑实际业务的结构。2.2 存储层、应用层、前端层的依赖关系与参数表整个系统分三层理解依赖关系比记命令重要层级组件作用关键参数存储层七牛 / 阿里云 OSS存放全景切片、封面图、场景 XMLbucket、AccessKeyId、AccessKeySecret、bucket 域名应用层Linux Nginx PHP MySQL处理上传、生成小程序接口、管理场景PHP 5.3、MySQL 5.5、Nginx 1.10前端层PC H5 页面 微信小程序加载切片并渲染 720 全景krpano JS 组件、小程序 web-view 或内置浏览器存储层和应用层的衔接点在于系统后台配置时填的七牛/OSS 的 bucket 域名必须是有效 HTTPS 地址否则小程序端会因为域名校验失败直接黑屏。这里有个很多新手栽进去的坑七牛测试域名 30 天过期过期后原图还在但访问域名 404全景就裂了。应用层内部也有依赖PHP 5.3 是老版本的典型要求因为系统源码可能用了 mcrypt 等在新版本中被移除的扩展。如果你的服务器默认装了 PHP 7.x大概率会报函数不存在。处理方式不是改代码而是装 PHP 5.6 并启用对应扩展下文避坑章节会细说。2.3 PHP 5.3 与 MySQL 5.5 的兼容边界这套系统写于 PHP 5.3 时代MySQL 5.5 的要求对应的是 MyISAM/InnoDB 混合引擎和 utf8 编码。实际部署时PHP 5.6 MySQL 5.7 通常也能跑但有两个边界要留意第一PHP 7.0 以上如果没开兼容层mysql_connect 这类函数直接没影第二MySQL 8.0 默认认证插件是 caching_sha2_password老代码连不上得改回 mysql_native_password。我一般会在安装前先跑一条检查命令确认环境再动手php -v mysql --version nginx -v提示不要用宝塔面板自带的 PHP 7.x 直接跑除非你明确知道怎么切换扩展。这个系统按 5.x 写的别跟版本较劲浪费的时间够再装两台服务器。3. Linux Nginx 环境下把系统跑起来部署步骤与配置解读这一章直接照着我惯用的部署流程走。假设你已经有一台 CentOS 7.x 或 Ubuntu 20.04 的云服务器域名已经解析到 IP并且申请好了七牛或阿里云 OSS 的 bucket。没有的话先去搞定这两件事否则装完也存不了图。3.1 环境准备与目录规划先把基础环境装齐。以下命令在 CentOS 7 上执行Ubuntu 的话把 yum 换成 apt-get。# 安装 Nginx yum install -y nginx # 安装 PHP 5.6 及相关扩展含 mcrypt、gd、pdo_mysql yum install -y php56 php56-fpm php56-mysqlnd php56-gd php56-mcrypt # 安装 MySQL 5.7替代 MySQL 5.5兼容性一样 yum install -y mysql-community-server装完顺手设置开机自启并启动服务systemctl enable nginx systemctl enable php-fpm systemctl enable mysqld systemctl start nginx systemctl start php-fpm systemctl start mysqld目录规划上把系统源码解压到/data/www/720cloud站点根目录指向public或web目录看压缩包里的实际结构。千万别把整个源码目录设成 site root否则 PHP 文件会被下载而不是执行。3.2 Nginx 站点配置与 PHP-FPM 对接这是我踩过最多坑的一步问题基本都出在 fastcgi 参数上。下面这份配置是我调过多次能稳定跑全景系统的版本server { listen 80; server_name yourdomain.com; root /data/www/720cloud; index index.php index.html; # 全景切片文件数目多关闭目录浏览并做浏览器缓存 location ~* \.(jpg|jpeg|png|gif|xml|js|css|swf)$ { expires 7d; access_log off; } # PHP 请求走 fastcgi location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location / { try_files $uri $uri/ /index.php?$query_string; } }这份配置里最关键的是try_files它能保证不带 .php 后缀的伪静态路由比如/index.php/vtour/1这种路径也能正确处理。全景系统后台的菜单基本都走这种伪静态路由缺了这一行后台点啥都 404。expires 7d也很重要因为全景切片文件是静态的、内容不变加缓存后第二次加载速度会明显提升。但注意如果你改动了切片文件要记得清理浏览器缓存或改路径版本号否则用户看到的是旧图。3.3 七牛 / 阿里云 OSS 参数与系统后台配置系统安装的后半段是在后台填存储参数。登录后台后找到「系统设置」或「存储配置」把以下信息填进去参数七牛阿里云 OSSBucket 名称如720cloud-img如720cloud-imgAccessKeyId在七牛控制台「密钥管理」里找在 RAM 访问控制里创建AccessKeySecret同上同上Bucket 域名如img.720cloud.com如img.720cloud.oss-cn-hangzhou.aliyuncs.com填写时注意两个细节第一Bucket 域名必须填写你在存储服务商那边绑定的自定义域名或默认域名且要选 HTTPS——小程序端强制要求 HTTPS第二AccessKey 权限建议只给目标 bucket 的上传和下载权限不要用主账号密钥权限太大出了事不好收场。填完保存后上传一张全景图测试。如果后台返回成功但图片打不开先看存储服务商的访问日志绝大多数是 bucket 权限设成了私有而系统访问又没有签 URL。3.4 生成小程序和 PC 端的流程系统装好后PC 端的页面结构一般是登录后台 → 添加场景 → 上传全景图 → 系统自动把切片推到 OSS → 生成一个带场景 ID 的分享链接。把这个链接绑到 PC 端导航或首页即可。小程序端走的是另外一套逻辑要么系统直接输出一个小程序源码包你在微信开发者工具里导入并替换 appid要么系统后台提供一个开启小程序模式的开关开放 H5 页面给小程序 web-view 嵌套。实际操作中我用的是第二种方式简单直接。在微信开发者工具里建一个小程序项目app.json 里配一个 web-view 页面地址填系统生成的分享链接然后真机预览。如果你电脑上装的是新版微信开发者工具导入前要确认「不校验合法域名」的开关在哪里——开发阶段可以临时关发布前必须把域名加到后台的 request 合法域名列表里。4. krpano 全景制作链路从 droplet 批处理到系统上传这份资源包里最显眼的部分就是一排 droplet.bat——这是 krpano 的批处理工具。droplet 的意思是「水滴」你把全景图文件拖到对应的 .bat 图标上松手它就会按预设参数自动跑完整个切割流程。不写一行代码出图效率比手动敲命令行高得多。4.1 droplet 文件到底做什么krpano 的 droplet 本质是封装了 krpano 命令行工具的批处理脚本。每个 droplet 对应一套 preset预设参数。拖文件进去后它按预设执行三件事切分全景图生成瓦片、生成预览用的缩略图、输出一个 XML 配置文件这个 XML 里记录了场景名、初始视角、切片的 URL 模板。全景云系统上传时实际上要的就是这套 XML 瓦片目录。系统会在后台要求你上传「切好的全景目录」或「原始全景图」如果是后者就需要服务器端装 krpano 工具来切——这会让服务器负载瞬间飙高。所以我一般建议在本地电脑切好再把目录传到系统里服务器只管存储和分发。4.2 CUBE 与 SPHERE 的转换逻辑资源包里的两个文件值得单独讲Convert CUBE to SPHERE droplet.bat 和 Convert SPHERE to CUBE droplet.bat。CUBE立方体格式全景图被切成 6 个面的单张图前后左右上下每张是正方形。这是 krpano 内部处理和 web 显示时的标准格式加载效率高。SPHERE球体格式指 equirectangular 投影的全景图宽高比 2:1也就是你从相机直接导出的那种长条图。拍摄设备出来的原图通常都是 SPHERE 格式2:1 长条而切片前最好转成 CUBE因为 CUBE 形式每个面的分辨率独立加载时可以根据视点只请求对应的面省流量。转换时直接把 SPHERE 图拖到 Convert SPHERE to CUBE droplet.bat 上等它跑完会输出 6 张图加一个 XML。需要 CUBE 转 SPHERE 的场景比较少一般是你要把全景图导出去给其他不支持 CUBE 的平台用。两条命令都留着别删。4.3 MAKE PANO 各档位参数差异包里有三个 MAKE PANO 档位NORMAL、MULTIRES、FLAT解释得很清楚droplet输出内容适用场景MAKE PANO (NORMAL)单分辨率全景全图一张加载快但放大模糊低端手机、轻量展示MAKE PANO (MULTIRES)金字塔多分辨率切片放大清晰720 看房、景区、官方推荐MAKE PANO (FLAT)平面平铺图非全景大图分解展示跟全景无关MAKE PANO (SINGLE-SWF)单个 Flash 文件已被 HTML5 淘汰除非有老设备兼容需求MAKE VTOUR (MULTIRES)多场景漫游同一项目多套全景切换MAKE OBJECT droplet.bat物体展示360°旋转看商品产品展示做全景云系统的内容源优先用 MAKE VTOUR (MULTIRES)因为云系统后台管理的就是「多个场景」一个项目可能包含客厅、卧室、阳台共 3-5 个场景VTOUR 会生成一个多场景切换的框架系统后台只需要把这些场景的 XML 和瓦片传上去就行。MULTIRES 的默认参数里slice 宽度通常 512pxquality 是 70这会影响清晰度和文件大小。如果你拍的图像素特别高比如 8000x4000建议把切片的 maxsize 调大一些否则放大后画面会糊。改法是在 krpano 安装目录的 templates 文件夹里找到对应模板文件改 level 参数。4.4 导出文件与云系统的对接krpano 跑完后会生成 vtour 文件夹结构如下vtour/ ├── tour.xml ├── tour.js ├── vtour.swf ├── preview.jpg ├── pano/ │ ├── pano_1.jpg │ └── pano_1.tiles/ │ ├── thumb.jpg │ └── L1/ L2/ L3/ # 多分辨率分层目录上传时把 vtour 里的 pano 目录压缩成 ZIP在系统后台选择「导入 Tour 目录」系统解压后会把瓦片目录整体推到对象存储然后生成场景记录。真正上传到服务器的文件体积可能只有原图的 30%因为切片的压缩率高这也是为什么云系统要配 OSS——哪怕 500 张全景推送和访问都不会拖垮服务器。注意不要改 tour.xml 里瓦片路径的相对关系。有些同学为了让名字好看手动改 pano 目录名导致 XML 里的路径全失效后台一片黑。要改名就在 krpano 导出前改导出后别动。5. 部署与制作避坑指南现象、原因、解决这章把我在部署和内容制作过程中真实遇到过的坑列出来每一条都是拿时间换来的你看了能省至少两天。5.1 数据库导入后后台白屏现象按照安装教程把 .sql 文件导入 MySQL配置好数据库连接打开后台首页一片白浏览器 F12 无报错。原因PHP 5.3 时代源码用了 mcrypt 扩展而环境里 PHP 7.x 没有这个扩展函数调用直接 fatal error。白屏是因为错误输出被关闭真正错误写进了 PHP-FPM 日志。解决一条命令看错误日志tail -f /var/log/php-fpm/error.log如果是 mcrypt 相关报错要么降级到 PHP 5.6 并启用 mcrypt要么在源码里搜索 mcrypt_ 函数改为 openssl 的替代写法。但从零开始的话直接重装 PHP 5.6 更省事改代码涉及加密解密逻辑容易改出新问题。5.2 小程序端加载全景黑屏现象PC 端访问正常小程序里用 web-view 打开全景链接页面黑屏偶尔转圈后白屏。原因两个原因叠加——第一web-view 组件的业务域名和后台配置的 HTTPS 域名不一致被微信拦截第二krpano 的 JS 在 web-view 里加载时如果全景图 URL 是 HTTP 而页面是 HTTPS属于混合内容也会被拦截。解决第一步把全景域名加到微信公众平台「设置 → 开发设置 → 业务域名」里下载校验文件放到服务器根目录校验通过后才生效第二步确认 bucket 域名已经配置为 HTTPS并且 SSL 证书没有过期。5.3 全景图上传后 PC 端正常、小程序打不开现象同一个链接PC 浏览器秒开小程序里就是转圈。原因小程序 web-view 的域名校验和生产环境的「不校验合法域名」开关状态不同。开发工具里关了开关能看但真机预览或线上版本会走正式校验域名只要没备案或没加入业务域名白名单一律拦截。解决在微信公众平台后台把访问域名的根域不是子域加进业务域名同时确认该域名已完成 ICP 备案。这两项缺一不可纯海外服务器备案都没有的域名小程序里面基本不用想打开。5.4 七牛测试域名过期导致图片裂开现象系统用了两周后台能看到记录但全景图和封面全部裂开访问链接直接 404。原因七牛分配给 bucket 的测试域名只有 30 天有效期到期自动回收。很多教程让用户直接用默认测试域名没提醒绑定自定义域名。解决别用测试域名。在七牛控制台绑定一个已经备案的自定义域名如 img.yourdomain.com生成 HTTPS 证书然后把系统后台的 bucket 域名改成这个。阿里云 OSS 的默认域名没有有效期问题但同样建议绑自定义域名因为 OSS 默认域名的访问带宽和并发限制比较低。5.5 PHP 版本过高导致 mcrypt 报错现象装好系统后后台能打开但一点登录就 500日志里写着Call to undefined function mcrypt_encrypt()。原因PHP 7.2 移除了已废弃的 mcrypt 扩展但老系统的登录加密和 cookie 生成还依赖它。解决两个方向——如果服务器上有多版本 PHP切换到 PHP 5.6 或 7.0并在 php.ini 里启用 extensionmcrypt.so如果必须用新 PHP把源码里 mcrypt_encrypt、mcrypt_decrypt 改为 openssl_encrypt、openssl_decrypt注意 IV 和 padding 参数要保持一致否则加密结果对不上登录逻辑会被打破。改完三个函数后建议全局搜索一遍确保没有遗漏。6. 收尾小程序端调试与验证的硬技巧系统装完、全景图导入后真正的上线考验在小程序端。这里说一个我每次必做的调试动作用抓包工具直接看小程序发出去的请求而不是盯着页面猜。我惯用 Charles跑两步手机连上代理打开小程序观察请求列表。重点看三个位置——第一全景瓦片请求的域名是不是你配置的 bucket 域名第二请求协议是不是 HTTPS第三返回状态码是不是 200。如果瓦片请求命中了某个 HTTP 域名马上能定位问题是后台配置写错还是业务域名漏配。另一个高频问题是页面列表加载更多失效。全景系统的小程序端通常有一个场景列表列表用了分页接口加载更多触发条件是滚动到底部。如果页面高度计算错误滚动永远触发不了。常见解决是把页面容器的 height 设为 100vh并启用enable-pull-down-refresh或 onReachBottom 事件。不要在 scroll-view 里嵌套全屏列表那样 onReachBottom 永远不触发。还有一个小程序顶部导航栏高度适配问题。全景页面经常要全屏沉浸但如果用小程序的默认导航栏切全景时顶部会露一截白边。我的做法是用navigationStyle: custom自定义导航栏然后拿wx.getMenuButtonBoundingClientRect()拿到胶囊按钮位置把全景容器的高度按这个值做偏移视觉上就完全沉浸了。上线前过一遍验收清单后台能登录、能上传全景、PC 分享链接打开正常、小程序业务域名校验通过、HTTPS 证书 30 天内不过期、OSS bucket 权限是公开读私有写、删除场景后存储文件同步清理。这七项我每次都会强制走一遍因为任何一项挂了用户都会直接找你售后。这套系统我前后拆过三次每次都被同一个逻辑教训全景展示的技术难点从来不在「能看」而在「多端都稳定能看」。把那几个域名、证书、版本的事情一次配好后面维护就很省心。希望这份拆解能帮你在部署时少走几条弯路祝一次跑通。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?