【问题标题】:PHP file write threading issuesPHP文件写入线程问题
【发布时间】:2011-04-14 12:28:04
【问题描述】:

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

现在,问题出在哪里,如果有大约 100 个用户连接到该页面,所有人都将以写入模式打开该文件,而不是在删除第一行后尝试写入。 这种情况会不会出现死锁?

供您参考,我们正在使用带有 IIS 服务器和 PHP5 的 Windows 服务器。
提前感谢您的帮助。

【问题讨论】:

    标签: php multithreading file-io deadlock


    【解决方案1】:

    使用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 以定义哪个文件应该分层另一个文件)......像这样......也许......我不是这类任务的专家,不幸的是 - 只是我对如何完成这项工作的假设.

    【讨论】:

    • 但是如果文件被前一个用户锁定,其他用户会发生什么?
    • 在第一个释放锁之前,他无法获得锁。您需要编写器锁(独占)LOCK_EX(您可以在一些 cmets 到官方文档中阅读它)。
    • @Nemoden,如果你不关闭会发生什么? php脚本结束时锁会自动关闭吗?
    • 您能否澄清一下,是 fopen (fopen($filename, 'w+')) 还是 flock (flock($fp, LOCK_EX)) 调用将在第二个脚本中等待直到锁被移除? if (flock($fp, LOCK_EX)) ... else { ... } 是否用于检查访问问题以创建锁? else 中的消息令人困惑,脚本不会一直等到锁被移除吗?
    【解决方案2】:

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

    【讨论】:

    • 但是如果文件被前一个用户锁定,其他用户会发生什么?
    • 这取决于您的实现。您可以显示错误消息或等到文件不再锁定。是的,它变得令人讨厌。
    猜你喜欢
    • 2023-02-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多