>  기사  >  백엔드 개발  >  PHP는 URL을 기반으로 자동으로 썸네일을 생성하고 높은 동시성 문제를 처리합니다.

PHP는 URL을 기반으로 자동으로 썸네일을 생성하고 높은 동시성 문제를 처리합니다.

黄舟
黄舟원래의
2017-02-17 10:18:101009검색

서버가 썸네일을 생성하는 시점은 크게 두 가지로 구분됩니다.


1. 파일 업로드 시 생성

장점: 업로드 시 필요한 썸네일이 이미 생성되어 있어 필요하지 않습니다. 읽을 때 판단하려면 CPU 작업을 줄이십시오.

단점: 썸네일 크기가 변경되거나 새 크기가 추가되면 모든 썸네일을 다시 생성해야 합니다.


접속시 생성

장점: 1. 액세스하는 사용자가 있을 때만 생성하면 되며, 액세스 권한이 없으면 생성할 필요가 없으므로 공간이 절약됩니다.

2. 썸네일 크기 수정 시, 썸네일 전체를 재생성하지 않고 설정만 수정하면 됩니다.

단점: 썸네일이 존재하지 않아 생성해야 하는 경우 높은 동시 액세스로 인해 서버 리소스가 많이 소모됩니다.

접속 시 동시성이 높은 문제가 있겠지만, 첫 번째 방법보다 다른 장점이 있어서 동시성이 높은 문제만 해결하면 됩니다.


URL을 기반으로 썸네일을 자동으로 생성하는 방법의 원리와 구현은 "php 기반"을 참조하세요. on url" 이전에 자동으로 썸네일 생성을 작성했습니다.


높은 동시 처리 원칙:

1. 사진을 생성해야 한다고 판단되면 tmp/ 디렉터리에 임시 마크 파일을 생성합니다. 파일 이름은 md5(생성할 파일 이름)입니다. 처리 완료 후 삭제됩니다.

2. 생성할 파일의 tmp/ 디렉터리에 임시 마크 파일이 있다고 판단되면, 이는 해당 파일이 처리 중임을 의미하므로 썸네일 생성 방법은 실행되지 않습니다. 호출되지만 임시 표시 파일이 삭제될 때까지 기다려 성공적인 출력을 생성합니다.

수정된 파일은 아래와 같으며, 그 외는 기존과 동일합니다.


createthumb.php


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

require(WWW_PATH.&#39;/PicThumb.class.php&#39;); // include PicThumb.class.php
require(WWW_PATH.&#39;/ThumbConfig.php&#39;);    // include ThumbConfig.php

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

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

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

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

// 获取type
$type = substr($relative_url, 0, strpos($relative_url, &#39;/&#39;));

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

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

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

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

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

// 高并发处理
$processing_flag = &#39;/tmp/thumb_&#39;.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(&#39;content-type:&#39;.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(&#39;content-type:&#39;.mime_content_type($dest));
    exit(file_get_contents($dest));
}

?>


위는 PHP가 URL을 기반으로 자동으로 썸네일을 생성하고 높은 동시성을 처리하는 방법입니다. 이슈 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!



성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.