我曾经在Windows 10上使用SimpleXMLElement:asXML()将XML写入文件时遇到了相同的问题。在使用fopen()打开文件并使用flock()锁定后,我的Linux机器可以正常工作并留下XML文档文件,但是在Windows机器上文件会被留空。我尝试在Windows机器上只使用一个单独的“锁文件”,以读取它来获取文件描述符,然后使用排他或共享锁进行锁定,然后在实际文件上使用PHP file_get_contents()、asXML()、simpleXML_load_file()等函数,最后使用flock()解锁锁文件并使用fclose()关闭它。这样做效果更好,因为在Windows上使用fopen()打开文件进行写入似乎会干扰这些PHP函数的操作。所以,你需要...
$fd=fopen("lockfile.txt", "r");
flock($fd, LOCK_EX);
$text=file_get_contents("myFile");
$text .= "Add some text.\n";
file_put_contents("myFile", $text);
flock($fd, LOCK_UN);
fclose($fd);
$fd=fopen("lockfile.txt", "r");
flock($fd, LOCK_SH);
$text = file_get_contents("myFile");
echo $text;
flock($fd, LOCK_UN);
fclose($fd);
“锁定文件”只是一个交通信号灯,用于保护程序中重要的实际文件。在Windows中,您需要以这种方式进行操作,因为理论上那些PHP函数不会对已被fopen()打开的文件进行操作,而您仍需要将文件描述符作为flock()的参数。
请确保“lockfile.txt”或您命名的任何文件都存在!
if (!file_exists("lockfile.txt")){
$fd = fopen("lockfile.txt", "w");
fwrite("lockfile.txt", "This lockfile now exists!\n");
fclose($fd);
}
file_put_contents
调用flock()时才有效,这可能不是这样的情况。) - Harry Johnstonfile_put_contents
失败。Windows默认执行您想要的操作并不是真正与问题相关的。 (在“linux文件锁定”上进行谷歌搜索表明您可能没有希望,但最好获取专业建议。) - Harry Johnston