hap*_*dik 3 php file-io multithreading deadlock
在PHP网页中,我以写入模式打开文件,读取并删除第一行并关闭文件.(该文件有1000行)
现在,问题是,如果有100个用户连接到该页面,所有将在写入模式下打开该文件,而不是在删除第一行后尝试写入该文件.在这种情况下会有任何僵局吗?
为了您的信息,我们使用Windows服务器与IIS服务器和PHP5.
在此先感谢您的帮助.
使用flock一次只为一个用户授予文件访问权限.
但不要忘记通过fclose释放文件锁
更新.考虑以下代码:
<?php
$start = time();
echo 'Started at '.$start.'<br />';
$filename = 'D:\Kindle\books\Brenson_Teryaya_nevinnost__Avtobiografiya_66542.mobi';
$fp = fopen($filename, 'w+') or die('have no access to '.$filename);
if (flock($fp, LOCK_EX)) {
echo 'File was locked at '.time().'. Granted exclusive access to write<br />';
}
else {
echo 'File is locked by other user<br />';
}
sleep(3);
flock($fp, LOCK_UN);
echo 'File lock was released at '.time().'<br />';
fclose($fp);
$end = time();
echo 'Finished at '.$end.'<br />';
echo 'Proccessing time '.($end - $start).'<br />';
Run Code Online (Sandbox Code Playgroud)
运行此代码两次(它将文件锁定3秒,因此我们将手动脚本视为异步运行).你会看到这样的东西:
第一个例子:
第二:
请注意,第二个实例首先等待释放文件锁定.
如果它不符合您的要求,那么......尝试发明其他解决方案,例如:用户可以读取文件,然后编辑一行并将其保存为临时文件,其他用户保存其临时文件等等,一旦您拥有所有用户释放文件锁,你将新文件组合成彼此所有临时文件的补丁(使用保存文件mtime来定义哪个文件应该对其他文件进行分层)......像这样......可能......我不是不幸的是,这类任务的专家 - 只是我对你如何完成这项任务的假设.