PHP文件写线程问题

时间:2011-04-14 12:28:05

标签: php multithreading file-io deadlock

在PHP网页中,我以写入模式打开文件,读取并删除第一行并关闭文件。 (该文件有1000行)

现在,问题是,如果有100个用户连接到该页面,则所有人都将以写入模式打开该文件,而不是在删除第一行后尝试写入该文件。 在这种情况下是否会出现任何僵局?

有关您的信息,我们使用的是带有IIS服务器和PHP5的Windows服务器 在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:6)

使用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 />';

运行此代码两次(它将文件锁定3秒,因此我们将手动脚本视为异步运行)。你会看到这样的东西:

第一个例子:

  • 文件被锁定在1302788738.授予写入的独占访问权
  • 文件锁已在 1302788741
  • 发布

第二

  • 文件被锁定在 1302788741 。授予独家访问权限
  • 文件锁已于1302788744发布

注意,第二个实例等待首先释放文件锁。

如果它不符合您的要求,那么......尝试发明其他解决方案,例如: 用户可以读取文件,然后编辑一行并将其保存为临时文件,其他用户保存其临时文件等等,一旦所有用户都发布文件锁定,您将新文件组合为所有临时文件的补丁(使用保存文件mtime以定义哪个文件应该对其他文件进行分层)...这样的事情......也许......我不是这类任务的专家,不幸的是 - 只是我对你如何得到的假设这样做了。

答案 1 :(得分:2)

使用file locking或允许并发访问的数据库。否则你会遇到麻烦。