ホームページ > バックエンド開発 > PHPチュートリアル > PHP で URL に基づいてサムネイルを自動的に生成し、同時実行性の問題を処理する方法

PHP で URL に基づいてサムネイルを自動的に生成し、同時実行性の問題を処理する方法

jacklove
リリース: 2023-03-31 09:40:01
オリジナル
1947 人が閲覧しました

サーバーがサムネイルを生成するタイミングは、通常、次の 2 種類に分けられます。

1. ファイルのアップロード時に生成します。

#メリット:アップロード時に必要なサムネイルが生成済みで、読み込み時に再判定する必要がないため、CPU負荷が軽減されます。

欠点: サムネイルのサイズが変更されるか、新しいサイズが追加されると、すべてのサムネイルを再生成する必要があります。

#2.

# にアクセスするときに生成します。 利点: 1. がある場合にのみ生成する必要があります。ユーザーアクセス、アクセスなし 生成する必要がなく、スペースを節約します。

2. サムネイルのサイズを変更する場合、すべてのサムネイルを再生成することなく、設定を変更するだけで済みます。

欠点: サムネイルが存在せず、サムネイルを生成する必要がある場合、同時アクセスが多くなるとサーバー リソースが大量に消費されます。

アクセス時に同時実行性が高い問題が発生しますが、他の利点は最初の方法よりも優れているため、同時実行性が高い問題のみを解決する必要があります。

URLに基​​づいてサムネイルを自動生成する原理と実装については、以前書いた「phpがURLに基​​づいてサムネイルを自動生成する」を参照してください。

高同時処理原理:

1. 画像が正常であると判断された場合。 tmp/ ディレクトリに一時マーク ファイルを作成し、そのファイルに md5 (生成する必要があるファイル名) という名前を付け、処理が完了したら一時ファイルを削除します。

2. 生成されるファイルの tmp/ ディレクトリに一時マーク ファイルがあると判断された場合 (ファイルが処理中であることを意味します)、サムネイル生成メソッドは実行されません。が呼び出されますが、一時マーク ファイルが削除され、成功した出力が生成されるまで待機します。

修正したファイルは以下の通りで、他は以前と同じです。

createthumb.php

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

<?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 中国語 Web サイトを参照してください。

関連する推奨事項:

php 文字列圧縮方法の比較について

php タイマー ページの実行時間の監視についてクラス

##さまざまな数のパラメータをサポートする PHP コンストラクターのメソッドの紹介

#

以上がPHP で URL に基づいてサムネイルを自動的に生成し、同時実行性の問題を処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート