我正在使用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) {
}
临时/中间文件应由调用的 ImageMagick 线程自动清理。您描述的模式行为暗示了使用 ImageMagick 的应用程序中的一个错误。
我建议...
- 检查应用程序的错误日志。
- 评估调用代码的错误报告。
- 确保调用正确的
imagick.Initialize
和imagick.Terminate
例程
如果没有其他方法,请使用环境变量 MAGICK_TMPDIR
来控制将图像魔术工件写入的位置。
更新
imagick.Initialize
包装底层MagickCoreGenesis
,并imagick.Terminate
MagickCoreTerminus
例程。它们对于管理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
}
您可以设置一个cron
,该在一天或一小时后运行,清理临时文件夹中的所有临时magick
文件。 您也可以使用此在线命令删除所有 magick 文件
sudo find /tmp/ -name "magick-*" -type f -delete
实际上它应该包含在func main()
中,而不是包含在 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) {
}