2014-06-19 3 views
1

트랜잭션을 사용하여 PHP 파일 시스템을 수행하는 방법은 무엇입니까?트랜잭션에서 PHP 파일 시스템을 수행하는 방법은 무엇입니까?

나는이 문제를 해결하는 방법을 궁금해하는 사람들이있을 수 없다는 것을 알고 있습니다.
사용자가 파일을 업로드 할 때마다 db와 store 파일 (move_uploaded_file)을 올바른 위치에 삽입하고 업로드 파일이 들어있는 새 폴더를 만들어야합니다.

사용자가 생성 할 때
쿼리가 실패하면 파일의 연결을 해제하는 방법은 무엇입니까?

try { 
    $connect_db->beginTransaction(); 
    // .. execute insert query 
    // .. execute other query 

    if (!is_dir($folder_path)) { 
    if(mkdir($folder_path, 0755) == false) { 
     // rollback query execute before 
    } 
    } 

    // .. execute other query 

    $connect_db->commit(); 
} catch (PDOException $e) { 

} 

사용자가 쿼리가 실패 할 경우, 연결 해제 파일을 복구하는 방법
을 삭제 하시겠습니까?

try { 
    $connect_db->beginTransaction(); 
    // .. execute delete query 
    // .. execute other query 

    if (!unlink($file_path)) { 

    } 

    // execute other query 

    $connect_db->commit(); 
} catch (PDOException $e) { 

} 
+1

내 질문에 링크 해제 또는 다른 파일 시스템 기능 RMDIR에서 mkdir을 사용하는 방법입니다 ... 롤백 할 수있게하십시오 – user1775888

답변

3

당신은 그렇게 할 수 없습니다.

일반적으로 파일 시스템은 어떤 이국적인 파일 시스템을 사용하지 않는 한 어떠한 트랜잭션 기능도 제공하지 않습니다. 그렇다면 해당 문서를 확인하십시오.

쿼리가 실패하면 파일을 삭제하는 방법은 무엇입니까? (질문)

쿼리가 실패 할 경우, unlink()

방법 링크 해제 된 파일을 복구하는 데 사용?

바로 삭제하지 마세요. 제거 작업을 예약하고 필요한 경우 취소하십시오.

+0

답장을 보내 주셔서 감사합니다. 나는 그것을 할 수 없다는 것을 알고 있지만 궁금한 사람들은 대개 이런 종류의 문제를 어떻게 해결할 것인가? 지금 나는 cron을 사용하고 있는데 파일을 지우지 만 바보처럼 보입니다. – user1775888

+1

@ user1775888 : 실제로 어떤 문제가 있습니까? 질문에서 어떤 문제도 설명하지 않았습니다. – zerkms

+0

내 업데이트 질문을 참조하십시오 – user1775888

0

트랜잭션 관리를위한 클래스를 생성 할 수 있습니다. 사용

class Archivo { 

    private static $filesPendingDelete = array(); 

    public static function commit(){ 
     foreach (self::$filesPendingDelete as $file){ 
      if (file_exists($file)) { 
       unlink($file); 
      }else{ 
       throw new Exception('the file does not exite: '.$file); 
      } 
     } 
     self::$filesPendingDelete = array(); 
    } 

    public static function rollBack(){ 
     self::$filesPendingDelete = array(); 
    } 


    private $path; 

    public function __construct($path) { 
     if (file_exists($path)) { 
      $this->setPath($path); 
     } else { 
      throw new Exception('Invalid path '.$path); 
     } 
    } 

    public function getPath() { 
     return $this->path; 
    } 

    private function setPath($path) { 
     $this->path = $path; 
    } 

    public function delete() { 
     if (file_exists($this->getPath())) { 
      self::$filesPendingDelete[] = $this->getPath(); 
     } else { 
      throw new Exception('the file does not exite: '.$this->getPath()); 
     } 
    } 

} 

예 : 예를 들어

MundialSYS에 의해

require_once 'Archivo.php'; 

try { 
    /* 
     Other code..... 
    */ 

    $file1 = new Archivo('test1.jpg'); 

    $file2 = new Archivo('test2.jpg'); 

    $file1->delete(); 

    $file2->delete(); 

    Archivo::commit(); 

} catch (Exception $ex) { 

    Archivo::rollBack(); 
} 

행운과 좋은 코드!

관련 문제