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