Просмотр исходного кода

解决并发请求触发的报错:mkdir(): File exists

shizhongqi 11 месяцев назад
Родитель
Сommit
380ccb0d5c
2 измененных файлов с 10 добавлено и 6 удалено
  1. 5 3
      app-ghs/controllers/UploadController.php
  2. 5 3
      app-hd/controllers/UploadController.php

+ 5 - 3
app-ghs/controllers/UploadController.php

@@ -38,9 +38,11 @@ class UploadController extends BaseController
         $month = date("Ym");
         $date = date("d");
         $path = dirUtil::getImgUploadDir() . "/{$mainId}/{$shopId}/{$month}/{$date}/";
-        if (!file_exists($path)) {
-            //检查是否有该文件夹,如果没有就创建,并给予最高权限
-            mkdir($path, 0700, true);
+        // 检查目录是否存在,如果不存在则尝试创建。
+        // 使用 @ 抑制 mkdir 在目录已存在时(并发导致)的 warning。
+        // 如果 mkdir 失败,则再次检查目录是否存在,以区分是并发创建成功还是真的创建失败。
+        if (!is_dir($path) && !@mkdir($path, 0700, true) && !is_dir($path)) {
+            throw new \yii\web\ServerErrorHttpException("目录 '{$path}' 创建失败。");
         }
         $preFileName = stringUtil::uniqueFileName();
         $newFile = $preFileName . ".jpg";

+ 5 - 3
app-hd/controllers/UploadController.php

@@ -38,9 +38,11 @@ class UploadController extends BaseController
         $month = date("Ym");
         $date = date("d");
         $path = dirUtil::getImgUploadDir() . "/{$mainId}/{$shopId}/{$month}/{$date}/";
-        if (!file_exists($path)) {
-            //检查是否有该文件夹,如果没有就创建,并给予最高权限
-            mkdir($path, 0700, true);
+        // 检查目录是否存在,如果不存在则尝试创建。
+        // 使用 @ 抑制 mkdir 在目录已存在时(并发导致)的 warning。
+        // 如果 mkdir 失败,则再次检查目录是否存在,以区分是并发创建成功还是真的创建失败。
+        if (!is_dir($path) && !@mkdir($path, 0700, true) && !is_dir($path)) {
+            throw new \yii\web\ServerErrorHttpException("目录 '{$path}' 创建失败。");
         }
         $preFileName = stringUtil::uniqueFileName();
         $newFile = $preFileName . ".jpg";