当前位置:首页>python>Python 实战 | 自己造数据:一键生成带GPS经纬度的测试图片

Python 实战 | 自己造数据:一键生成带GPS经纬度的测试图片

  • 2026-06-28 06:37:30
Python 实战 | 自己造数据:一键生成带GPS经纬度的测试图片

Python 实战 | 自己造数据:一键生成带GPS经纬度的测试图片,支持全球任意坐标

开场白

做地图类应用开发时,你一定遇到过这个头疼的问题——手头没有带 GPS 信息的测试照片。

想测试照片定位功能,你需要一张包含精确经纬度的 EXIF 图片。但现实是:截图没有 GPS、微信传来的照片 EXIF 被剥离、网上下载的图大多也被清除了地理信息。你当然可以掏出手机跑到楼下拍一张,但如果你想要一张"位于巴黎埃菲尔铁塔"或"悉尼歌剧院"的测试图呢?难道要买张机票飞过去?

今天我们用 Python + Tkinter + Pillow + piexif 打造一款 GPS 测试图片生成器。这不是一个简陋的脚本工具,而是一个拥有完整图形界面的桌面应用——你可以通过下拉框选择全球 11 个地标位置(北京天安门、上海东方明珠、巴黎铁塔、纽约自由女神...),也可以手动输入任意经纬度坐标;可以自定义拍摄设备品牌和型号、拍摄时间、光圈快门 ISO 等参数;还能选择 5 种不同风格的图片样式(风景、城市、纯色、渐变、随机噪点)。

点击"生成"按钮,一张带有完整 EXIF 元数据(GPS 坐标、设备信息、拍摄参数等)的 JPG 图片就出现在你的目录下了。用任何 EXIF 查看工具打开它,都能读到你设定的经纬度和拍摄信息。

这个工具的核心价值在于:让你不再依赖真实拍摄的照片来做测试。无论是开发照片定位功能、验证坐标转换算法、还是制作演示 Demo,都可以用它批量生成任意位置的测试数据。整个工具不到 200 行核心代码,依赖仅需 Pillow 和 piexif,跨平台可运行。

接下来,我们从 EXIF 写入原理、GUI 交互设计、图片生成算法 三个维度详细解析实现过程。


一、工具效果预览

┌──────────────────────────────────────────────────────────┐
│            📷 GPS测试图片生成器                            │
├──────────────────────────────────────────────────────────┤
│                                                          │
│  ┌─ 📍 位置信息 ───────────────────────────────────────┐ │
│  │  预设位置: [北京天安门 ▼]                            │ │
│  │  纬度: [39.9042]    (-90~90, 正=北, 负=南)          │ │
│  │  经度: [116.3974]   (-180~180, 正=东, 负=西)        │ │
│  │  海拔: [44.0] 米                                    │ │
│  └──────────────────────────────────────────────────────┘ │
│                                                          │
│  ┌─ 📱 设备信息 ───────────────────────────────────────┐ │
│  │  品牌: [Xiaomi]        型号: [Xiaomi 14 Ultra]      │ │
│  │  拍摄时间: [2024:06:03 15:30:00]                    │ │
│  └──────────────────────────────────────────────────────┘ │
│                                                          │
│  ┌─ 📸 拍摄参数 ───────────────────────────────────────┐ │
│  │  焦距: [23]mm    光圈: F/[1.8]                      │ │
│  │  快门: 1/[1000]  ISO: [100]                         │ │
│  └──────────────────────────────────────────────────────┘ │
│                                                          │
│  ┌─ 🖼️ 图片设置 ───────────────────────────────────────┐ │
│  │  宽度: [1920]  高度: [1080]  风格: [风景 ▼]         │ │
│  └──────────────────────────────────────────────────────┘ │
│                                                          │
│         [✨ 生成图片]      [💾 另存为...]                 │
│                                                          │
│  ✅ 已生成: test_photo_gps.jpg | 1920×1080 | GPS: ...   │
└──────────────────────────────────────────────────────────┘

核心功能:

功能
说明
🌍 全球预设
11个地标一键选择(北京、上海、巴黎、东京等)
📍 自定义坐标
手动输入任意经纬度和海拔
📱 设备模拟
自定义品牌、型号、拍摄时间
📸 参数设置
焦距、光圈、快门、ISO 全可配置
🎨 多种风格
风景/城市/纯色/渐变/随机噪点
📐 自定义尺寸
任意宽高像素设置

二、核心技术解析

2.1 piexif 写入 EXIF 数据

piexif 是一个纯 Python 的 EXIF 读写库,可以在不依赖外部工具的情况下向 JPEG 文件写入完整的 EXIF 元数据。

EXIF 数据按 IFD(Image File Directory)分组:

IFD 分组
包含内容
0th (ImageIFD)
设备品牌、型号、软件、日期
Exif (ExifIFD)
光圈、快门、ISO、焦距、拍摄时间
GPS (GPSIFD)
经纬度、海拔、方向

GPS 坐标需要以有理数元组格式写入(度、分、秒各一个分数):

defto_rational(value):
"""将十进制度数转为 EXIF 有理数格式"""
    value = abs(value)
    d = int(value)
    m = int((value - d) * 60)
    s = int(((value - d) * 60 - m) * 60 * 10000)
return ((d, 1), (m, 1), (s, 10000))

# 写入GPS
gps_ifd = {
    piexif.GPSIFD.GPSLatitudeRef: 'N'if lat >= 0else'S',
    piexif.GPSIFD.GPSLatitude: to_rational(lat),
    piexif.GPSIFD.GPSLongitudeRef: 'E'if lon >= 0else'W',
    piexif.GPSIFD.GPSLongitude: to_rational(lon),
    piexif.GPSIFD.GPSAltitude: (int(alt * 100), 100),
}

最终通过 piexif.dump() 序列化,然后在 Image.save() 时传入 exif= 参数写入文件。

2.2 程序化图片生成

我们使用 Pillow 的 Image 和 ImageDraw 来生成不同风格的测试图片:

# 风景风格:上半部分天空渐变 + 下半部分绿地
if style == "风景":
for y in range(height):
if y < height * 0.6:
# 天空:从浅蓝渐变到深蓝
            r = 80 + int(y / height * 100)
            g = 140 + int(y / height * 60)
            b = 200 + int(y / height * 40)
else:
# 地面:绿色渐深
            prog = (y - height * 0.6) / (height * 0.4)
            r, g, b = int(80 - prog*30), int(160 - prog*50), int(60 - prog*20)

# 城市风格:深色背景 + 随机建筑轮廓 + 窗户灯光
elif style == "城市":
for i in range(15):
        bw = random.randint(width//20, width//8)  # 建筑宽度
        bh = random.randint(height//4, height*3//4)  # 建筑高度
        draw.rectangle([bx, height-bh, bx+bw, height], fill=(color, color, color+20))
# 随机亮灯的窗户
        draw.rectangle([wx, wy, wx+8, wy+12], fill=(255240150))

同时在图片上叠加 GPS 坐标和设备名称的文字水印,方便视觉确认。

2.3 预设位置系统

内置 11 个全球知名地标的精确坐标,通过下拉框选择后自动填充经纬度和海拔:

PRESETS = {
"北京天安门": (39.9042116.397444.0),
"上海东方明珠": (31.2397121.499810.0),
"广州塔": (23.1066113.324512.0),
"深圳市民中心": (22.5431114.057915.0),
"成都天府广场": (30.6571104.0657500.0),
"杭州西湖": (30.2421120.14808.0),
"西安钟楼": (34.2609108.9426410.0),
"纽约自由女神": (40.6892-74.044510.0),
"巴黎埃菲尔铁塔": (48.85842.294535.0),
"东京塔": (35.6586139.745420.0),
"悉尼歌剧院": (-33.8568151.21535.0),
}

南半球纬度为负数、西半球经度为负数,程序会自动处理 LatitudeRef (N/S) 和 LongitudeRef (E/W) 的方向标识。


三、完整代码

以下是完整可运行代码,复制保存为 create_test_image_gui.py 即可使用:

"""
带GPS经纬度的测试图片生成器 - GUI版
可自定义经纬度、设备信息、拍摄时间等,生成带完整EXIF信息的JPG图片
依赖:pip install Pillow piexif
"""

import tkinter as tk
from tkinter import ttk, filedialog, messagebox
from PIL import Image, ImageDraw, ImageFont, ImageTk
import piexif
import os
import random
from datetime import datetime


PRESETS = {
"北京天安门": (39.9042116.397444.0),
"上海东方明珠": (31.2397121.499810.0),
"广州塔": (23.1066113.324512.0),
"深圳市民中心": (22.5431114.057915.0),
"成都天府广场": (30.6571104.0657500.0),
"杭州西湖": (30.2421120.14808.0),
"西安钟楼": (34.2609108.9426410.0),
"纽约自由女神": (40.6892-74.044510.0),
"巴黎埃菲尔铁塔": (48.85842.294535.0),
"东京塔": (35.6586139.745420.0),
"悉尼歌剧院": (-33.8568151.21535.0),
"自定义位置": (000),
}


classTestImageGeneratorApp:
def__init__(self):
        self.root = tk.Tk()
        self.root.title("GPS测试图片生成器")
        self.root.geometry("650x700")
        self.root.configure(bg='
#1e1e2e')
        self._build_ui()

def_build_ui(self):
        style = ttk.Style()
        style.theme_use('clam')
        style.configure('TFrame', background='#1e1e2e')
        style.configure('TLabel', background='#1e1e2e', foreground='#cdd6f4', font=(''10))
        style.configure('TLabelframe', background='#1e1e2e', foreground='#89b4fa')
        style.configure('TLabelframe.Label', background='#1e1e2e', foreground='#89b4fa',
                        font=(''11'bold'))
        style.configure('Header.TLabel', font=(''14'bold'), foreground='#a6e3a1')

        main = ttk.Frame(self.root, padding=15)
        main.pack(fill=tk.BOTH, expand=True)

        ttk.Label(main, text="GPS测试图片生成器", style='Header.TLabel').pack(pady=(015))

# 位置信息
        loc_frame = ttk.LabelFrame(main, text="位置信息", padding=10)
        loc_frame.pack(fill=tk.X, pady=(010))

        preset_row = ttk.Frame(loc_frame)
        preset_row.pack(fill=tk.X, pady=(08))
        ttk.Label(preset_row, text="预设位置:").pack(side=tk.LEFT)
        self.preset_var = tk.StringVar(value="北京天安门")
        preset_combo = ttk.Combobox(preset_row, textvariable=self.preset_var,
                                     values=list(PRESETS.keys()), state='readonly', width=20)
        preset_combo.pack(side=tk.LEFT, padx=(100))
        preset_combo.bind('<<ComboboxSelected>>', self._on_preset_change)

        coord_row = ttk.Frame(loc_frame)
        coord_row.pack(fill=tk.X, pady=2)
        ttk.Label(coord_row, text="纬度:").grid(row=0, column=0, sticky=tk.W)
        self.lat_var = tk.StringVar(value="39.9042")
        ttk.Entry(coord_row, textvariable=self.lat_var, width=15).grid(row=0, column=1, padx=5)
        ttk.Label(coord_row, text="经度:").grid(row=1, column=0, sticky=tk.W, pady=4)
        self.lon_var = tk.StringVar(value="116.3974")
        ttk.Entry(coord_row, textvariable=self.lon_var, width=15).grid(row=1, column=1, padx=5, pady=4)
        ttk.Label(coord_row, text="海拔(米):").grid(row=2, column=0, sticky=tk.W)
        self.alt_var = tk.StringVar(value="44.0")
        ttk.Entry(coord_row, textvariable=self.alt_var, width=15).grid(row=2, column=1, padx=5)

# 设备信息
        device_frame = ttk.LabelFrame(main, text="设备信息", padding=10)
        device_frame.pack(fill=tk.X, pady=(010))
        dev_grid = ttk.Frame(device_frame)
        dev_grid.pack(fill=tk.X)
        ttk.Label(dev_grid, text="品牌:").grid(row=0, column=0, sticky=tk.W)
        self.make_var = tk.StringVar(value="Xiaomi")
        ttk.Entry(dev_grid, textvariable=self.make_var, width=20).grid(row=0, column=1, padx=5, pady=2)
        ttk.Label(dev_grid, text="型号:").grid(row=0, column=2, sticky=tk.W, padx=(150))
        self.model_var = tk.StringVar(value="Xiaomi 14 Ultra")
        ttk.Entry(dev_grid, textvariable=self.model_var, width=20).grid(row=0, column=3, padx=5, pady=2)
        ttk.Label(dev_grid, text="拍摄时间:").grid(row=1, column=0, sticky=tk.W)
        self.datetime_var = tk.StringVar(value=datetime.now().strftime("%Y:%m:%d %H:%M:%S"))
        ttk.Entry(dev_grid, textvariable=self.datetime_var, width=20).grid(row=1, column=1, padx=5, pady=2)

# 拍摄参数
        param_frame = ttk.LabelFrame(main, text="拍摄参数", padding=10)
        param_frame.pack(fill=tk.X, pady=(010))
        param_grid = ttk.Frame(param_frame)
        param_grid.pack(fill=tk.X)
        ttk.Label(param_grid, text="焦距(mm):").grid(row=0, column=0, sticky=tk.W)
        self.focal_var = tk.StringVar(value="23")
        ttk.Entry(param_grid, textvariable=self.focal_var, width=10).grid(row=0, column=1, padx=5)
        ttk.Label(param_grid, text="光圈 F/:").grid(row=0, column=2, sticky=tk.W, padx=(150))
        self.fnum_var = tk.StringVar(value="1.8")
        ttk.Entry(param_grid, textvariable=self.fnum_var, width=10).grid(row=0, column=3, padx=5)
        ttk.Label(param_grid, text="快门 1/:").grid(row=1, column=0, sticky=tk.W)
        self.shutter_var = tk.StringVar(value="1000")
        ttk.Entry(param_grid, textvariable=self.shutter_var, width=10).grid(row=1, column=1, padx=5)
        ttk.Label(param_grid, text="ISO:").grid(row=1, column=2, sticky=tk.W, padx=(150))
        self.iso_var = tk.StringVar(value="100")
        ttk.Entry(param_grid, textvariable=self.iso_var, width=10).grid(row=1, column=3, padx=5)

# 图片设置
        img_frame = ttk.LabelFrame(main, text="图片设置", padding=10)
        img_frame.pack(fill=tk.X, pady=(010))
        img_grid = ttk.Frame(img_frame)
        img_grid.pack(fill=tk.X)
        ttk.Label(img_grid, text="宽度:").grid(row=0, column=0, sticky=tk.W)
        self.width_var = tk.StringVar(value="1920")
        ttk.Entry(img_grid, textvariable=self.width_var, width=8).grid(row=0, column=1, padx=5)
        ttk.Label(img_grid, text="高度:").grid(row=0, column=2, sticky=tk.W, padx=(150))
        self.height_var = tk.StringVar(value="1080")
        ttk.Entry(img_grid, textvariable=self.height_var, width=8).grid(row=0, column=3, padx=5)
        ttk.Label(img_grid, text="风格:").grid(row=0, column=4, sticky=tk.W, padx=(150))
        self.style_var = tk.StringVar(value="风景")
        ttk.Combobox(img_grid, textvariable=self.style_var,
                     values=["风景""城市""纯色""渐变""随机噪点"],
                     state='readonly', width=10).grid(row=0, column=5, padx=5)

# 按钮
        btn_frame = ttk.Frame(main)
        btn_frame.pack(fill=tk.X, pady=10)
        tk.Button(btn_frame, text="✨ 生成图片", command=self.generate_image,
                  bg='#a6e3a1', fg='#1e1e2e', font=(''11'bold'),
                  padx=20, pady=8, relief=tk.FLAT).pack(side=tk.LEFT, padx=(010))
        tk.Button(btn_frame, text="💾 另存为...", command=self.save_as,
                  bg='#89b4fa', fg='#1e1e2e', font=(''11'bold'),
                  padx=20, pady=8, relief=tk.FLAT).pack(side=tk.LEFT)

        self.status_var = tk.StringVar(value="就绪")
        ttk.Label(main, textvariable=self.status_var, font=(''9),
                  foreground='#a6adc8').pack(fill=tk.X, pady=(50))

def_on_preset_change(self, event=None):
        name = self.preset_var.get()
if name in PRESETS:
            lat, lon, alt = PRESETS[name]
            self.lat_var.set(str(lat))
            self.lon_var.set(str(lon))
            self.alt_var.set(str(alt))

def_create_image(self, w, h, style):
        img = Image.new('RGB', (w, h))
        draw = ImageDraw.Draw(img)
if style == "风景":
for y in range(h):
for x in range(w):
if y < h * 0.6:
                        r = min(80 + int(y / h * 100), 255)
                        g = min(140 + int(y / h * 60), 255)
                        b = min(200 + int(y / h * 40), 255)
else:
                        prog = (y - h * 0.6) / (h * 0.4)
                        r = max(int(80 - prog * 30), 20)
                        g = max(int(160 - prog * 50), 60)
                        b = max(int(60 - prog * 20), 20)
                    img.putpixel((x, y), (r, g, b))
elif style == "城市":
            img.paste((405080), (00, w, h))
for i in range(15):
                bw = random.randint(w // 20, w // 8)
                bh = random.randint(h // 4, h * 3 // 4)
                bx = random.randint(0, w - bw)
                color = random.randint(50120)
                draw.rectangle([bx, h - bh, bx + bw, h], fill=(color, color, color + 20))
for wy in range(h - bh + 10, h - 1020):
for wx in range(bx + 5, bx + bw - 515):
if random.random() > 0.3:
                            draw.rectangle([wx, wy, wx + 8, wy + 12], fill=(255240150))
elif style == "纯色":
            colors = [(52152219), (46204113), (2317660), (15589182)]
            img.paste(random.choice(colors), (00, w, h))
elif style == "渐变":
for y in range(h):
                r = int(255 * y / h)
                g = int(100 + 155 * (1 - y / h))
                b = int(200 * (1 - y / h))
                draw.line([(0, y), (w, y)], fill=(r, g, b))
elif style == "随机噪点":
            pixels = img.load()
for y in range(h):
for x in range(w):
                    pixels[x, y] = (random.randint(0255), random.randint(0255), random.randint(0255))
try:
            font = ImageFont.truetype("arial.ttf", max(w // 3016))
except (IOError, OSError):
            font = ImageFont.load_default()
        draw.text((2020), f"GPS: {self.lat_var.get()}{self.lon_var.get()}", fill=(255255255), font=font)
        draw.text((2050), f"{self.make_var.get()}{self.model_var.get()}", fill=(200200200), font=font)
return img

def_build_exif(self):
        lat = float(self.lat_var.get())
        lon = float(self.lon_var.get())
        alt = float(self.alt_var.get())

defto_rational(value):
            value = abs(value)
            d = int(value)
            m = int((value - d) * 60)
            s = int(((value - d) * 60 - m) * 60 * 10000)
return ((d, 1), (m, 1), (s, 10000))

        gps_ifd = {
            piexif.GPSIFD.GPSLatitudeRef: 'N'if lat >= 0else'S',
            piexif.GPSIFD.GPSLatitude: to_rational(lat),
            piexif.GPSIFD.GPSLongitudeRef: 'E'if lon >= 0else'W',
            piexif.GPSIFD.GPSLongitude: to_rational(lon),
            piexif.GPSIFD.GPSAltitudeRef: 0if alt >= 0else1,
            piexif.GPSIFD.GPSAltitude: (int(abs(alt) * 100), 100),
        }
        exif_ifd = {
            piexif.ExifIFD.DateTimeOriginal: self.datetime_var.get(),
            piexif.ExifIFD.FocalLength: (int(self.focal_var.get()), 1),
            piexif.ExifIFD.FNumber: (int(float(self.fnum_var.get()) * 10), 10),
            piexif.ExifIFD.ExposureTime: (1, int(self.shutter_var.get())),
            piexif.ExifIFD.ISOSpeedRatings: int(self.iso_var.get()),
        }
        zeroth_ifd = {
            piexif.ImageIFD.Make: self.make_var.get(),
            piexif.ImageIFD.Model: self.model_var.get(),
            piexif.ImageIFD.Software: 'GPS Test Image Generator',
            piexif.ImageIFD.DateTime: self.datetime_var.get(),
        }
return piexif.dump({'0th': zeroth_ifd, 'Exif': exif_ifd, 'GPS': gps_ifd})

defgenerate_image(self):
try:
            w, h = int(self.width_var.get()), int(self.height_var.get())
            float(self.lat_var.get()); float(self.lon_var.get())
except ValueError:
            messagebox.showerror("错误""请检查输入参数"); return

        img = self._create_image(w, h, self.style_var.get())
        exif_bytes = self._build_exif()
        output_path = os.path.join(os.path.dirname(__file__), 'test_photo_gps.jpg')
        img.save(output_path, 'JPEG', exif=exif_bytes, quality=95)
        filesize = os.path.getsize(output_path) / 1024
        self.status_var.set(f"✅ 已生成: {os.path.basename(output_path)} | {w}×{h} | {filesize:.0f}KB")
        messagebox.showinfo("成功"f"图片已保存到:\n{output_path}")

defsave_as(self):
try:
            w, h = int(self.width_var.get()), int(self.height_var.get())
            float(self.lat_var.get()); float(self.lon_var.get())
except ValueError:
            messagebox.showerror("错误""请检查输入参数"); return
        filepath = filedialog.asksaveasfilename(title="保存", defaultextension=".jpg",
                                                 filetypes=[("JPEG""*.jpg")])
ifnot filepath: return
        img = self._create_image(w, h, self.style_var.get())
        img.save(filepath, 'JPEG', exif=self._build_exif(), quality=95)
        messagebox.showinfo("成功"f"已保存到:\n{filepath}")

defrun(self):
        self.root.mainloop()


if __name__ == '__main__':
    app = TestImageGeneratorApp()
    app.run()

四、知识点总结

知识点
说明
EXIF 写入
使用 piexif 库将元数据序列化后通过 Pillow 保存时注入
有理数格式
EXIF 中的浮点数以分数 (分子, 分母) 形式存储
GPS DMS
GPS 坐标以度/分/秒格式存储,非十进制
经纬度方向
N/S 表示北/南纬,E/W 表示东/西经
Pillow Image
Python 图像处理核心库,支持创建/编辑/保存
ImageDraw
Pillow 的绘图接口,支持矩形、文字、线条等
Tkinter StringVar
用于 GUI 控件和数据的双向绑定
ttk.Combobox
下拉选择框组件
filedialog
Tkinter 文件对话框模块
随机图片生成
通过数学公式和随机数生成不同风格的像素数据
piexif.dump
将 EXIF 字典序列化为可嵌入 JPEG 的二进制数据
EXIF IFD 结构
分为 0th/Exif/GPS/1st 等多个目录

五、拓展场景与测试步骤

5.1 测试步骤

# 1. 安装依赖
pip install Pillow piexif

# 2. 运行生成器
python create_test_image_gui.py

# 3. 测试操作
# - 选择预设位置(如"巴黎埃菲尔铁塔")→ 观察经纬度自动填充
# - 修改设备品牌为 "Apple",型号为 "iPhone 15 Pro"
# - 选择风格为"城市"
# - 点击「生成图片」
# - 用 gui_app.py 打开生成的图片 → 验证 GPS 坐标是否正确显示在法国巴黎

# 4. 验证 EXIF 是否完整写入
python -c "
import exifread
with open('test_photo_gps.jpg', 'rb') as f:
    tags = exifread.process_file(f)
    for k, v in sorted(tags.items()):
        if 'GPS' in k or 'Make' in k or 'Model' in k:
            print(f'{k}: {v}')
"

5.2 可拓展方向

方向
说明
批量生成
读取 CSV/Excel 坐标列表,批量生成多张不同位置的测试图
轨迹模拟
输入起点终点,自动在路径上等距生成多张图片模拟移动轨迹
真实照片注入
给已有无GPS的照片写入指定坐标(隐私测试/水印追踪)
随机坐标
一键生成随机全球位置的图片(压力测试用)
EXIF 模板
保存/加载常用的设备参数配置为模板
地图预览集成
生成后直接在 GUI 内显示地图预览确认位置
命令行模式
添加 CLI 参数支持,方便集成到自动化测试脚本中

有了这个工具,测试地图功能再也不用满世界找带 GPS 的照片了。复制代码,跑起来就能用。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-03 05:24:40 HTTP/2.0 GET : https://f.mffb.com.cn/a/497574.html
  2. 运行时间 : 0.082857s [ 吞吐率:12.07req/s ] 内存消耗:4,764.77kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=daaddb9f487475770324e9be0f764146
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000870s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000853s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000316s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000301s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000469s ]
  6. SELECT * FROM `set` [ RunTime:0.000189s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000566s ]
  8. SELECT * FROM `article` WHERE `id` = 497574 LIMIT 1 [ RunTime:0.000505s ]
  9. UPDATE `article` SET `lasttime` = 1783027480 WHERE `id` = 497574 [ RunTime:0.002838s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000240s ]
  11. SELECT * FROM `article` WHERE `id` < 497574 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000501s ]
  12. SELECT * FROM `article` WHERE `id` > 497574 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000759s ]
  13. SELECT * FROM `article` WHERE `id` < 497574 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001498s ]
  14. SELECT * FROM `article` WHERE `id` < 497574 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.002422s ]
  15. SELECT * FROM `article` WHERE `id` < 497574 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001764s ]
0.084445s