1

我正在使用imagick库在 http 处理程序中调整和裁剪图像的大小。这不会在/tmp文件夹中写入任何内容。但是我可以在该文件夹中创建很多这些文件,并且它的大小每天都在增长,目前它消耗了大约 90% 的分区大小。此外,我也无法阅读他们的内容。那么,为什么要创建这些文件以及它们会在一段时间后被删除还是我需要手动删除它们。

    -rw------- 1 ubuntu ubuntu   16M Feb 22 09:46 magick-d6ascKJV
    -rw------- 1 ubuntu ubuntu   16M Feb 22 09:46 magick-46ccZIfq
    -rw------- 1 ubuntu ubuntu  1.8M Feb 22 09:47 magick-vUET7vyh
    -rw------- 1 ubuntu ubuntu  1.8M Feb 22 09:47 magick-OLkGWTX8
    -rw------- 1 ubuntu ubuntu   15M Feb 22 09:48 magick-LNMV7YvE
    -rw------- 1 ubuntu ubuntu   16M Feb 22 09:49 magick-0LMYt6Kc
    -rw------- 1 ubuntu ubuntu   16M Feb 22 09:50 magick-ceNxX5CY
    -rw------- 1 ubuntu ubuntu   16M Feb 22 09:50 magick-nQ1M3y6I

编辑 :

我没有在我的 http 处理程序中使用以下两行。原因是我找不到任何解释这样做。此外,go http 处理程序工作正常。那么,这些声明的目的是什么?

imagick.Initialize() 
defer imagick.Terminate()

我假设有一些理由将它们包含在代码中。所以,在 go http 处理程序中。它应该包含在里面func main()还是里面serveHTTP

func main() {                                           
    myMux := http.NewServeMux()
    myMux.HandleFunc("/", serveHTTP)

    if err := http.ListenAndServe(":8085", myMux); err != nil {
        logFatal("Error when starting or running http server: %v", err)
    }       

}

func serveHTTP(w http.ResponseWriter, r *http.Request) {

}
4

3 回答 3

1

调用 ImageMagick 线程应自动清理临时/中间文件。您描述的模式行为暗示了使用 ImageMagick 的应用程序中的错误。

我会建议...

  1. 检查应用程序的错误日志。
  2. 评估调用代码的错误报告。
  3. 确保调用正确的imagick.Initialize例程imagick.Terminate

如果没有其他方法,请使用环境变量MAGICK_TMPDIR来控制 imagemagick 工件的写入位置。

更新

imagick.Initialize包装底层MagickCoreGenesis和例程imagick.TerminateMagickCoreTerminus它们对于管理 ImageMagick 运行的环境很重要。它们应该在将处理任何 ImageMagick 任务的工作线程上调用,因此在您的情况下,serveHTTP方法。但是,对每个 HTTP 请求执行此类例程并不是最佳的,并且应该评估一个附加条件 - 如果可能的话。

func serveHTTP(w http.ResponseWriter, r *http.Request) {
   // if request will do image work
   imagick.Initialize() 
   defer imagick.Terminate()
   // ... image methods ...
   // end if
}
于 2016-02-22T12:25:53.530 回答
1

您可以设置一个cron在一天或一个小时后运行的清理临时文件夹中所有临时magick文件的选项。您也可以使用此在线命令删除所有魔法文件

sudo find /tmp/ -name "magick-*" -type f -delete

于 2016-09-12T08:19:59.410 回答
0

实际上它应该包含在func main()not 中 func serveHTTP()。它意味着为长时间运行的应用程序调用一次,它解决了我的问题。

func main() {   

    imagick.Initialize() 
    defer imagick.Terminate()                                        
    myMux := http.NewServeMux()
    myMux.HandleFunc("/", serveHTTP)

    if err := http.ListenAndServe(":8085", myMux); err != nil {
        logFatal("Error when starting or running http server: %v", err)
    }       

}

func serveHTTP(w http.ResponseWriter, r *http.Request) {

}
于 2016-02-25T04:56:20.213 回答