首页 \ 问答 \ PHP flock()非阻塞仍然阻塞为什么?(PHP flock() non-blocking still block why?)

PHP flock()非阻塞仍然阻塞为什么?(PHP flock() non-blocking still block why?)

我使用flock()函数通过获取临时文件上的锁来检查脚本的另一个实例是否已在运行,因此下一个实例应该检查文件是否未锁定,否则它会停止

<?php    
$fp = fopen("/var/tmp/your.lock", "w");
if (!flock($fp, LOCK_EX|LOCK_NB)) { // try to get exclusive lock, non-blocking
    die("Another instance is running");
} 

//my script 
sleep(10);
echo 'completed successfully';

当从同一浏览器同时打开两个实例时,该脚本在不同浏览器同时调用两次文件时工作正常,即第一次调用获取锁定,第二次调用等待锁定而不关闭

我知道可能有其他方法来检查一个实例文件是否已经正常工作,但其中大多数会做一件事情然后撤消它,在我的用例中,脚本可能随时结束,因为它可能需要很长时间或超过内存限制或无论如何

任何帮助?


I'm using flock() function to check if another instance of the script is already running by obtaining the lock on a temporary file so next instance should check if the file is not locked otherwise it stops

<?php    
$fp = fopen("/var/tmp/your.lock", "w");
if (!flock($fp, LOCK_EX|LOCK_NB)) { // try to get exclusive lock, non-blocking
    die("Another instance is running");
} 

//my script 
sleep(10);
echo 'completed successfully';

the script works without problem when calling the file twice at the same time from different browsers while it waits if I opened two instances at the same time from the same browser i.e the first call get the lock and the second wait for the lock and not closing

I know there may be other ways to check if a file an instance is already working but most of them will do a thing then undo it and in my use case the script may end any time as it may take long time or exceed memory limit or by any reason

any help ?


原文:https://stackoverflow.com/questions/13331809
更新时间:2023-06-28 10:06

最满意答案

你可以使用以下(progromatically)

ed.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL);
ed.setKeyListener(DigitsKeyListener.getInstance("0123456789.$"));

您可以在DigitsKeyListener.getInstance定义所需的任何字符

或者如果不希望用户输入$符号并且您希望在用户完成编辑后手动输入...

@Override
protected OnFocusChangeListener getOnFocusChangeListener() {
return new OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            //Member variable in the class which contains an EditText
            CurrencyTextbox.this.hadFocus = true;
        } else {
            // Thes EditText has lost focus
            Log.v(TAG, "Lost focus.");
            if (CurrencyTextbox.this.hadFocus) {
                // We previously had focus, now we lost it, format the user input!
                // Get current value of the Textbox
                String value = CurrencyTextbox.this.textbox.getText().toString();
                // Formatting the user input
                value = String.format(//Doing some formatting);
                // Reset the had focus
                CurrencyTextbox.this.hadFocus = false;
            }
        }
    }
};

you can use the following (progromatically)

ed.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL);
ed.setKeyListener(DigitsKeyListener.getInstance("0123456789.$"));

you can define whatever characters you want within the DigitsKeyListener.getInstance

or if dont want the user to enter the $ sign and you want to be entered manually after the user finishes editting...

@Override
protected OnFocusChangeListener getOnFocusChangeListener() {
return new OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            //Member variable in the class which contains an EditText
            CurrencyTextbox.this.hadFocus = true;
        } else {
            // Thes EditText has lost focus
            Log.v(TAG, "Lost focus.");
            if (CurrencyTextbox.this.hadFocus) {
                // We previously had focus, now we lost it, format the user input!
                // Get current value of the Textbox
                String value = CurrencyTextbox.this.textbox.getText().toString();
                // Formatting the user input
                value = String.format(//Doing some formatting);
                // Reset the had focus
                CurrencyTextbox.this.hadFocus = false;
            }
        }
    }
};

相关问答

更多

相关文章

更多

最新问答

更多
  • 如何使用自由职业者帐户登录我的php网站?(How can I login into my php website using freelancer account? [closed])
  • 如何打破按钮上的生命周期循环(How to break do-while loop on button)
  • C#使用EF访问MVC上的部分类的自定义属性(C# access custom attributes of a partial class on MVC with EF)
  • 如何获得facebook app的publish_stream权限?(How to get publish_stream permissions for facebook app?)
  • 如何并排放置两个元件?(How to position two elements side by side?)
  • 在MySQL和/或多列中使用多个表用于Rails应用程序(Using multiple tables in MySQL and/or multiple columns for a Rails application)
  • 如何隐藏谷歌地图上的登录按钮?(How to hide the Sign in button from Google maps?)
  • Mysql左连接旋转90°表(Mysql Left join rotate 90° table)
  • 带有ImageMagick和许多图像的GIF动画(GIF animation with ImageMagick and many images)
  • 电脑高中毕业学习去哪里培训
  • 电脑系统专业就业状况如何啊?
  • IEnumerable linq表达式(IEnumerable linq expressions)
  • 如何在Spring测试中连接依赖关系(How to wire dependencies in Spring tests)
  • Solr可以在没有Lucene的情况下运行吗?(Can Solr run without Lucene?)
  • 如何保证Task在当前线程上同步运行?(How to guarantee that a Task runs synchronously on the current thread?)
  • 在保持每列的类的同时向数据框添加行(Adding row to data frame while maintaining the class of each column)
  • 的?(The ? marks in emacs/haskell and ghc mode)
  • 一个线程可以调用SuspendThread传递自己的线程ID吗?(Can a thread call SuspendThread passing its own thread ID?)
  • 延迟socket.io响应,并“警告 - websocket连接无效”(Delayed socket.io response, and “warn - websocket connection invalid”)
  • 悬停时的图像转换(Image transition on hover)
  • IIS 7.5仅显示homecontroller(IIS 7.5 only shows homecontroller)
  • 没有JavaScript的复选框“关闭”值(Checkbox 'off' value without JavaScript)
  • java分布式框架有哪些
  • Python:填写表单并点击按钮确认[关闭](Python: fill out a form and confirm with a button click [closed])
  • PHP将文件链接到根文件目录(PHP Linking Files to Root File Directory)
  • 我如何删除ListView中的项目?(How I can remove a item in my ListView?)
  • 您是否必须为TFS(云)中的每个BUG创建一个TASK以跟踪时间?(Do you have to create a TASK for every BUG in TFS (Cloud) to track time?)
  • typoscript TMENU ATagParams小写(typoscript TMENU ATagParams lowercase)
  • 武陟会计培训类的学校哪个好点?
  • 从链接中删除文本修饰(Remove text decoration from links)