如何在事务中执行php文件系统?

时间:2014-06-19 04:14:34

标签: php mysql sql transactions filesystems

如何使用事务执行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) {

}
用户删除时

如果查询失败,如何恢复unlink文件?

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

  if (!unlink($file_path)) {

  }

  // execute other query

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

}

2 个答案:

答案 0 :(得分:3)

你做不到。

通常文件系统不提供任何事务功能,除非您使用的是某些奇特的文件系统。如果是这样 - 请查看其文档。

  

如果查询失败,如何删除文件? (问题)

使用unlink()

  

如果查询失败,如何恢复取消链接文件?

请勿立即删除。安排删除任务,并在必要时取消。

答案 1 :(得分: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());
        }
    }

}

使用示例:

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();
}
运气好,代码好! 由MundialSYS