PHP语言 根据url自动生成缩略图,并处理高并发问题
小标 2018-07-12 来源 : 阅读 55 评论 0

摘要:本文主要向大家介绍了PHP语言 根据url自动生成缩略图,并处理高并发问题,通过具体的实例向大家展示,希望对大家学习php语言有所帮助。

本文主要向大家介绍了PHP语言 根据url自动生成缩略图,并处理高并发问题,通过具体的实例向大家展示,希望对大家学习php语言有所帮助。

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

 

1.上传文件时生成

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

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

 

2.访问时生成

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

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

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

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

 

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

 

高并发处理原理:

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

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

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

 

createthumb.php

[php] view plain copy

1. <?php  

2. define('WWW_PATH', dirname(dirname(__FILE__))); // 站点www目录  

3.   

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

5. require(WWW_PATH.'/ThumbConfig.php');    // include ThumbConfig.php  

6.   

7. $logfile = WWW_PATH.'/createthumb.log';  // 日志文件  

8. $source_path = WWW_PATH.'/upload/';      // 原路径  

9. $dest_path = WWW_PATH.'/supload/';       // 目标路径  

10.   

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

12.   

13. // 检查path  

14. if(!$path){  

15.     exit();  

16. }  

17.   

18. // 获取图片URI  

19. $relative_url = str_replace($dest_path, '', WWW_PATH.$path);  

20.   

21. // 获取type  

22. $type = substr($relative_url, 0, strpos($relative_url, '/'));  

23.   

24. // 获取config  

25. $config = isset($thumb_config[$type])? $thumb_config[$type] : '';  

26.   

27. // 检查config  

28. if(!$config || !isset($config['fromdir'])){  

29.     exit();  

30. }  

31.   

32. // 原图文件  

33. $source = str_replace('/'.$type.'/', '/'.$config['fromdir'].'/', $source_path.$relative_url);  

34.   

35. // 目标文件   

36. $dest = $dest_path.$relative_url;  

37.   

38. if(!file_exists($source)){ // 原图不存在  

39.     exit();  

40. }  

41.   

42. // 高并发处理  

43. $processing_flag = '/tmp/thumb_'.md5($dest); // 用于判断文件是否处理中  

44. $is_wait = 0;                                // 是否需要等待  

45. $wait_timeout = 5;                           // 等待超时时间  

46.   

47. if(!file_exists($processing_flag)){  

48.     file_put_contents($processing_flag, 1, true);  

49. }else{  

50.     $is_wait = 1;  

51. }  

52.   

53. if($is_wait){ // 需要等待生成  

54.     while(file_exists($processing_flag)){  

55.         if(time()-$starttime>$wait_timeout){ // 超时  

56.             exit();  

57.         }  

58.         usleep(300000); // sleep 300 ms  

59.     }  

60.   

61.     if(file_exists($dest)){ // 图片生成成功  

62.         ob_clean();  

63.         header('content-type:'.mime_content_type($dest));  

64.         exit(file_get_contents($dest));  

65.     }else{  

66.         exit(); // 生成失败退出  

67.     }  

68. }  

69.   

70. // 创建缩略图  

71. $obj = new PicThumb($logfile);  

72. $obj->set_config($config);  

73. $create_flag = $obj->create_thumb($source, $dest);  

74.   

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

76.   

77. if($create_flag){ // 判断是否生成成功  

78.     ob_clean();  

79.     header('content-type:'.mime_content_type($dest));  

80.     exit(file_get_contents($dest));  

81. }  

82.   

83. ?>  

以上就介绍了PHP的相关知识,希望对PHP有兴趣的朋友有所帮助。了解更多内容,请关注职坐标编程语言PHP频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论
X
免费获取海同IT培训资料
验证码手机号,获得海同独家IT培训资料
获取验证码
提交

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号