【问题标题】:How to handle an abandoned PID file when the user cancels a script?用户取消脚本时如何处理废弃的PID文件?
【发布时间】:2012-01-19 01:14:24
【问题描述】:

这更多是关于最佳实践的问题。我的服务器允许用户使用 FontForge 将字体从一种格式转换为另一种格式。为防止冲突,在任何给定实例中只允许进行一种字体转换。

当一个用户启动转换时,会创建一个充当锁的 PID 文件。如果其他用户在第一次转换仍在运行时尝试启动转换,则脚本将暂停片刻并再次检查 PID 文件。

这会一直重复,直到第一个进程删除 PID 文件,从而解锁对 FontForge 的访问。但是,如果第一个用户在脚本完成之前取消了脚本(通过按浏览器上的停止按钮),那么脚本会在 PID 文件被删除之前退出。第二个用户将永远无法继续。

处理这个问题的最佳方法是什么?

【问题讨论】:

标签: php pid


【解决方案1】:

查看此 PHP 手册页:

http://php.net/manual/en/features.connection-handling.php

我引用:

您可以决定是否希望客户端断开连接导致 你的脚本被中止。有时,始终拥有您的 即使没有远程浏览器接收,脚本也会运行完成 输出。然而,默认行为是让您的脚本成为 当远程客户端断开连接时中止。可以设置此行为 通过ignore_user_abort php.ini 指令以及通过 对应的php_value ignore_user_abort Apache httpd.conf 指令 或使用ignore_user_abort() 函数。如果你不告诉 PHP 忽略用户中止并且用户中止,您的脚本将终止。

一个例外是,如果您使用以下方法注册了关闭功能 register_shutdown_function()。具有关机功能,当 远程用户点击他的 STOP 按钮,下次您的脚本尝试 输出 PHP 将检测到连接已中止的内容 并调用关闭函数。这个关机功能也将 在脚本正常终止时被调用,所以这样做 如果客户端断开连接,您可以使用不同的东西 connection_aborted() 函数。此函数将返回TRUE,如果 连接已中止。

【讨论】:

    【解决方案2】:

    停止等待 PID 文件消失。开始使用flock,如果你过早退出,操作系统会清理锁。

    来自http://tuxradar.com/practicalphp/8/11/undefined的示例代码:

    <?php
        $fp = fopen("foo.txt", "w");
        if (flock($fp, LOCK_EX)) {
            print "Got lock!\n";
            sleep(10);
            flock($fp, LOCK_UN);
        }
    ?>
    

    另外,http://php.net/manual/en/function.flock.php

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      • 2019-03-21
      相关资源
      最近更新 更多