>  기사  >  백엔드 개발  >  PHP가 URL을 기반으로 썸네일을 자동으로 생성하고 높은 동시성 문제를 처리하도록 하는 방법

PHP가 URL을 기반으로 썸네일을 자동으로 생성하고 높은 동시성 문제를 처리하도록 하는 방법

jacklove
jacklove원래의
2018-06-09 14:18:081813검색

서버가 썸네일을 생성하는 타이밍은 일반적으로 두 가지 유형으로 나뉩니다.

1. 파일을 업로드할 때 생성됩니다.

장점: 업로드할 때 필요한 썸네일이 이미 생성되어 있으므로 읽을 때 재판단하고 CPU 작업을 줄입니다.

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

2. 접속 시 생성

장점: 1. 접속하는 사용자가 있을 때만 생성하면 되고, 접속하지 않는 경우에는 생성하지 않아도 되므로 공간이 절약됩니다. .

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

단점: 썸네일이 존재하지 않아 생성해야 하는 경우 동시 접속률이 높으면 서버 리소스가 많이 소모됩니다.

접속 시 동시성 문제가 높겠지만, 다른 장점은 첫 번째 방법보다 낫기 때문에 동시성 문제만 해결하면 됩니다.

URL을 기반으로 썸네일을 자동으로 생성하는 방법의 원리와 구현은 앞서 제가 작성한 "php가 URL을 기반으로 썸네일 자동 생성"을 참고하시면 됩니다.

높은 동시성 처리 원칙:

1 그림을 생성해야 한다고 판단되면 tmp/ 디렉터리에 임시 mark 파일을 만들고 파일 이름을 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 중국어 웹사이트를 참조하세요.

관련 권장 사항:

PHP 문자열 압축 방법 간의 비교에 대해

PHP 타이머 페이지 실행 시간 모니터링 클래스 관련 소개에 대해

PHP 생성자가 지원하는 여러 가지 수의 방법에 대해 매개변수 소개

위 내용은 PHP가 URL을 기반으로 썸네일을 자동으로 생성하고 높은 동시성 문제를 처리하도록 하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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