php 根据url自动生成缩略图,并处理高并发问题

2023-05-16

服务器生成缩略图的时机一般分为两种:


1.上传文件时生成

优点:上传时就已经生成需要的缩略图,读取时不需要再判断,减少cpu运算。

缺点:当缩略图尺寸变化时或新增尺寸时,需要重新生成所有的缩略图。


2.访问时生成

优点:1.当有用户访问时才需要生成,没有访问的不用生成,节省空间。

           2.当修改缩略图尺寸时,只需要修改设置,无需重新生成所有缩略图。

缺点:当缩略图不存在需要生成时,高并发访问会非常耗服务器资源。

虽然访问时生成会有高并发问题,但其他优点都比第一种方法好,因此只要解决高并发问题就可以。


关于如何根据url自动生成缩略图的原理及实现,可以参考我之前写的《php 根据url自动生成缩略图》。


高并发处理原理:

1.当判断需要生成图片时,在tmp/目录创建一个临时标记文件,文件名用md5(需要生成的文件名)来命名,处理结束后再将临时文件删除。

2.当判断要生成的文件在tmp/目录有临时标记文件,表示文件正在处理中,则不调用生成缩略图方法,而等待,直到临时标记文件被删除,生成成功输出。

修改的文件如下,其他与之前一样。


createthumb.php

<?php
define('WWW_PATH', dirname(dirname(__FILE__))); // 站点www目录

require(WWW_PATH.'/PicThumb.class.php'); // include PicThumb.class.php
require(WWW_PATH.'/ThumbConfig.php');    // include ThumbConfig.php

$logfile = WWW_PATH.'/createthumb.log';  // 日志文件
$source_path = WWW_PATH.'/upload/';      // 原路径
$dest_path = WWW_PATH.'/supload/';       // 目标路径

$path = isset($_GET['path'])? $_GET['path'] : '';     // 访问的图片URL

// 检查path
if(!$path){
    exit();
}

// 获取图片URI
$relative_url = str_replace($dest_path, '', WWW_PATH.$path);

// 获取type
$type = substr($relative_url, 0, strpos($relative_url, '/'));

// 获取config
$config = isset($thumb_config[$type])? $thumb_config[$type] : '';

// 检查config
if(!$config || !isset($config['fromdir'])){
    exit();
}

// 原图文件
$source = str_replace('/'.$type.'/', '/'.$config['fromdir'].'/', $source_path.$relative_url);

// 目标文件 
$dest = $dest_path.$relative_url;

if(!file_exists($source)){ // 原图不存在
    exit();
}

// 高并发处理
$processing_flag = '/tmp/thumb_'.md5($dest); // 用于判断文件是否处理中
$is_wait = 0;                                // 是否需要等待
$wait_timeout = 5;                           // 等待超时时间

if(!file_exists($processing_flag)){
    file_put_contents($processing_flag, 1, true);
}else{
    $is_wait = 1;
}

if($is_wait){ // 需要等待生成
    while(file_exists($processing_flag)){
        if(time()-$starttime>$wait_timeout){ // 超时
            exit();
        }
        usleep(300000); // sleep 300 ms
    }

    if(file_exists($dest)){ // 图片生成成功
        ob_clean();
        header('content-type:'.mime_content_type($dest));
        exit(file_get_contents($dest));
    }else{
        exit(); // 生成失败退出
    }
}

// 创建缩略图
$obj = new PicThumb($logfile);
$obj->set_config($config);
$create_flag = $obj->create_thumb($source, $dest);

unlink($processing_flag); // 删除处理中标记文件

if($create_flag){ // 判断是否生成成功
    ob_clean();
    header('content-type:'.mime_content_type($dest));
    exit(file_get_contents($dest));
}

?>

源码下载地址:点击查看



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

php 根据url自动生成缩略图,并处理高并发问题 的相关文章

  • 登录授权验证之OAuth2.0

    实际应用项目 xff1a http github crmeb net u long 本文将从几个方面了解和学习使用OAuth2 0 对不对就不管了 xff0c 反正我也几乎不会用到 ps 有个项目用到了 xff0c 所以才会有本文 OAut
  • PostgreSQL的视图以及物化视图的特点

    1 视图 PostgreSQL视图其实和mysql视图是一样的 xff0c 视图其实是个虚拟的表 xff0c 实际上是一个SQL拼接而成的虚拟表 xff08 假表 xff09 xff0c 可能是有一个表或者多个表 视图关联而成的复杂的SQL
  • 尚硅谷---Vue3同步笔记

    一 初识Vue3 Vue3带来了什么 xff1f 1 性能上的提升 xff1a 更快 占用内存更少 2 源码的升级 xff1a 使用Proxy代替defineProperty实现响应式 重写虚拟DOM的实现和Tree Shaking Tre
  • 移动mgv2000_JL代工_s905l2_MT7668_emmc_免拆卡刷固件包

    移动mgv2000 JL代工 s905l2 MT7668 emmc 免拆卡刷固件包 特点 xff1a 1 适用于卡刷 xff1b 2 开放原厂固件屏蔽的市场安装和u盘安装apk xff1b 3 修改dns xff0c 三网通用 xff1b
  • 魔百和CM311-1A_YST、(YM)_安卓9_S905L3A_默认开启ADB_纯净精简语音_完美线刷包

    魔百和CM311 1A YST YM 安卓9 S905L3A 默认开启ADB 纯净精简语音 完美线刷包 固件特点 xff1a 1 修改dns xff0c 三网通用 xff1b 2 开放原厂固件屏蔽的市场安装和u盘安装apk xff1b 3
  • C++11:变长模板的迭代与递归扩展

    迭代的运行效率始终强于递归 xff0c 递归始终比迭代方便开发 变长模板属于C 43 43 11中比较复杂的技术 xff0c 在此简单介绍下 include lt iostream gt using namespace std templa
  • 虚拟机Secure Boot安全启动

    概述 Secure Boot 作为 UEFI 的一个选项 xff0c 它可以被设置为开启或关闭 Secure Boot 所需要的公钥证书被保存在计算机的主板的 FLASH 里面 xff0c FLASH 里面保存着 PK xff0c KEK
  • 端口被占用的原因及解决办法

    运行软件或者项目的时候 xff0c 出现以下问题 xff1a panic blademaster listen tcp 0 0 0 0 8080 listen tcp 0 0 0 0 8080 bind An attempt was mad
  • Rust 学习,与 node.js 交互

    1 背景 近期 xff0c 参与了一个活动 xff1a 学 Rust xff0c 免费拿树莓派 主要内容为开发应用 xff0c 在 node js 中调用 Rust 函数 实际上我认为在很多地方都能用上 Rust xff0c 鉴于活动要求
  • Zeal--一款支持207个离线文档的浏览器

    小编作为一个全栈工程师 xff0c 每个语言都会一点 xff0c 在写前端和后端的时候 xff0c 时长会打开好几个开发文档 xff0c 比如java css html 等 xff0c 有没有打开一个软件 xff0c 就能打开所有的帮助文档
  • Linux之间图像界面的传输 ssh -X username@{remote ip}

    之前用windows平台连接Linux平台 xff0c 总是通过Xshell 43 Xming来传输Linux系统的界面 现在在linux系统平台下 xff0c 通过ssh连接另一个Linux系统 xff0c 如何将远程Linux的图形界面
  • 利用图片Etag判断用户

    原理 xff1a 不使用Javascript xff0c SESSION xff0c COOKIES xff0c FLASH 利用图片Etag识别用户 1 根据用户的 REMOTE ADDR 与 HTTP USER AGENT 生成唯一Et
  • 音视频基础知识---封装格式介绍

    音视频基础知识汇总 xff1a 音视频基础知识 协议相关RTSP RTMP HLS 音视频基础知识 封装格式 音视频基础知识 视频编码格式 音视频基础知识 音频编码格式 音视频基础知识 像素格式RGB 音视频基础知识 像素格式YUV 1 什
  • php output_buffering 缓存使用

    buffer是一个内存地址空间 xff0c linux系统默认大小一般为4096 4kb 主要用于存储速度不同步的设备或优先级不同的设备之间传递数据的区域 通过buffer可以使进程之间的相互等待变少 例如 xff0c 当你打开一个文本编辑
  • 同一域名对应不同IP,访问指定主机文件内容的方法

    PHP获取远程主机文件内容方法很多 xff0c 例如 xff1a file get contents xff0c fopen 等 lt php echo file get contents 39 http demo fdipzone com
  • php 实现BigPipe分块输出

    原理 xff1a 利用 ob flush 与 flush 将缓冲区的内容提前输出 xff0c 浏览器可提早加载这部分的内容 xff0c 无需等待所有输出完成再加载 将页面内容划分为一个个小块 xff0c 输出一个后再输出下一个 xff0c
  • php 利用fsockopen GET/POST 提交表单及上传文件

    php 利用 fsockopen GET POST 提交表单及上传文件 1 GET get php lt php host 61 39 demo fdipzone com 39 port 61 80 errno 61 39 39 errst
  • php 过滤html标记属性类

    php 过滤html标记属性类 HtmlAttributeFilter class php lt php HTML Attribute Filter Date 2013 09 22 Author fdipzone ver 1 0 Func
  • php HTTP请求类,支持GET,POST,Multipart/form-data

    PHP HTTP请求类 xff0c 支持GET POST Multipart form data HttpRequest class php lt php HttpRequest class HTTP请求类 xff0c 支持GET POST
  • HTTP 204 与 205 应用

    HTTP 204 no content 表示响应执行成功 xff0c 但没有数据返回 xff0c 浏览器不用刷新 xff0c 不用导向新页面 HTTP 205 reset content 表示响应执行成功 xff0c 重置页面 xff08

随机推荐

  • apache mod_xsendfile 让php提供更快的文件下载

    服务器提供一个文件下载 xff0c 一般使用一个url指向服务器中的文件即可提供下载 但这样就不能进行统计 xff0c 权限检测等操作 因此 xff0c 一般使用php提供下载 xff0c 代码如下 xff1a lt php file 61
  • HTML5 使用application cache 接口实现离线数据缓存

    1 配置缓存文件 cache manifest MIME TYPE xff1a text cache manifest 文件名称 xff1a name appcache 作用 xff1a 用于配置需要缓存的文件 2 使用方法 在服务器上添加
  • XSS跨站测试代码大全

    XSS跨站测试代码大全 39 gt lt script gt alert document cookie lt script gt 61 39 gt lt script gt alert document cookie lt script
  • 范数、神秘值

    范数 格式 xff1a n 61 norm A p 功能 xff1a norm函数可计算几种不同类型的矩阵范数 依据p的不同可得到不同的范数 下面是Matlab中help norm 的解释 NORM Matrix or vector nor
  • anaconda3 安装(自用,记录用)

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 目录 前言 一 anaconda 卸载 二 anaconda3安装 1 Anaconda下载 2 Anaconda配置 三 Anacond
  • mysql 优化 insert 性能

    mysql 的 insert 语句语法 insert into 96 table 96 96 field1 96 96 field2 96 values 39 value1 39 39 value2 39 提高insert 性能的方法 1
  • 使用onbeforeunload事件检测窗口是否刷新或关闭

    onunload xff0c onbeforeunload 在页面刷新或关闭时调用 xff0c 区别在于 xff1a onbeforeunload 是在页面刷新或关闭前触发 xff0c 这时浏览器并未请求服务器读取新页面 xff0c 因此o
  • php 使用异或(XOR)加密/解密文件

    php 使用异或 xff08 XOR xff09 加密 解密文件 原理 xff1a 将文件每一个字节与key作位异或运算 xff08 XOR xff09 xff0c 解密则再执行一次异或运算 代码如下 xff1a lt php source
  • php 如何获取一个变量的名字

    PHP中 xff0c 所有的变量都存储在 34 符号表 34 的HastTable结构中 xff0c 符号的作用域是与活动符号表相关联的 因此 xff0c 同一时间 xff0c 只有一个活动符号表 我们要获取到当前活动符号表可以通过 get
  • PHP扩展开发报错解决[error: ‘PHP_FE_END’ undeclared here (not in a function)] .

    PHP扩展开发报错解决 error PHP FE END undeclared here not in a function 解决方法 xff1a 进到php包的目录 sed i 39 s PHP FE END NULL NULL NULL
  • php 对象克隆 clone

    php 对象复制 xff0c 是复制对象的引用地址 xff0c 因此使用 objA 61 objB 这种写法时 xff0c objA与 objB会指向相同的内存地址 当 objA 发生变化时 xff0c objB也会受到影响 如果我们要 o
  • mysql general log

    mysql 打开 general log 后 xff0c 所有的查询语句都会记录在 general log 文件 xff0c 文件为只读方式 xff0c 但这样general log文件会非常大 xff0c 所以默认是关闭的 但有时需要查错
  • MessagePack 序列化格式

    MessagePack 是一种有效的二进制序列化格式 与JSON一样可以在多语言中转换数据 xff0c 但对比JSON xff0c 速度更快 xff0c 转换后数据更小 安装 1 下载msgpack xff0c 下载地址 xff1a 点击下
  • ubunut 管理开机程序

    安装 sysv rc conf sudo apt get install sysv rc conf 安装完成后输入命令 xff0c 可以管理开机程序 sudo sysv rc conf 带 X 的都是开机启动 xff0c 移动到要修改的位置
  • VC中TRACE()的用法,终于学会了点皮毛,好累!

    个人总结 xff1a 最近看网络编程是碰到了TRACE语句 xff0c 不知道在哪里输出 xff0c 查了一晚上资料也没找出来 xff0c 今天终于在CSDN上找到了 xff0c 真是个高地方啊 xff0c 方法如下 xff1a 1 在MF
  • php Cookies 操作类

    Cookies 操作类 功能 xff1a 1 保存 xff0c 读取 xff0c 更新 xff0c 清除cookies数据 2 可设置前缀 3 强制超时控制 4 cookies数据可以是字符串 xff0c 数组 xff0c 对象等 Cook
  • php 密码生成类

    php 密码生成类 功能 xff1a 1 可设定密码长度 2 可设定要生成的密码个数 xff0c 批量生成 3 可以指定密码的规则 xff0c 字母 xff0c 数字 xff0c 特殊字符等 GeneratePassword class p
  • php main 与 iframe 相互通讯类(同域/跨域)

    main 与 iframe 相互通讯类 之前写过一篇 iframe与主框架跨域相互访问方法 介绍了main与iframe相互通讯的原理 不了解原理的可以先看看 今天把main与iframe相互通讯的方法封装成类 主要有两个文件 JS Fra
  • php 异步调用方法

    php 异步调用方法 客户端与服务器端是通过HTTP协议进行连接通讯 xff0c 客户端发起请求 xff0c 服务器端接收到请求后执行处理 xff0c 并返回处理结果 有时服务器需要执行很耗时的操作 xff0c 这个操作的结果并不需要返回给
  • php 根据url自动生成缩略图,并处理高并发问题

    服务器生成缩略图的时机一般分为两种 xff1a 1 上传文件时生成 优点 xff1a 上传时就已经生成需要的缩略图 xff0c 读取时不需要再判断 xff0c 减少cpu运算 缺点 xff1a 当缩略图尺寸变化时或新增尺寸时 xff0c 需