PHP 中的锁定功能仅适用于一个用户


lock function in php only for one user

嗨,我有一个php函数,运行和完成大约需要20分钟(或更长时间)。

但是如果有其他人在上次运行中运行它......函数中断并产生不需要的结果。

这是结构:

function myfunc()
{
   foreach()
   {
      //do somthing
   }
}

我想我可以通过这样的文件来做到这一点:

我创建了一个文本文件...如果该文本的内容为"1",则函数为锁定。如果不是,则函数是免费的。

function myfunc()
{
    $file = "lock.txt";
    $f = fopen($file, 'r');
    $line = fgets($f); 
    fclose($f);
    if($line == 0)
        file_put_contents($file, "1");
    else 
        return false;
    foreach()
    {
    }
    //after finish for each
    file_put_contents($file, "0"); // free function for other user 
}

我认为从逻辑上讲,这一定是真的...但不要工作!首次运行后,锁定.txt文件的内容仍为 1。(完成后不更改为 0)

我想也许函数在过程中会因为时间长而中断! 因为我处理函数中的所有中断状态。 可以打电话给我如何处理这个问题? 我如何确定 lock.txt 在完成或中断功能后将为"0"?

好吧,已经有一个函数来实现锁,称为 flock()

<?php
$file = fopen("test.txt","w+");
// exclusive lock
if (flock($file,LOCK_EX))
  {
  fwrite($file,"Write something");
  // release lock
  flock($file,LOCK_UN);
  }
else
  {
  echo "Error locking file!";
  }
fclose($file);
?> 

使用标志LOCK_SH您可以锁定它

到目前为止,根据我的经验,最好的方法与此类似

<?php
define('LOCK_FILE', "/var/run/" . basename($argv[0], ".php") . ".lock");
if (!tryLock())
    die("Already running.'n");
 # remove the lock on exit (Control+C doesn't count as 'exit'?)
register_shutdown_function('unlink', LOCK_FILE);
# The rest of your script goes here....
echo "Hello world!'n";
sleep(30);
exit(0);
 function tryLock()
{
     # If lock file exists, check if stale.  If exists and is not stale, return TRUE
     # Else, create lock file and return FALSE.
    if (@symlink("/proc/" . getmypid(), LOCK_FILE) !== FALSE) # the @ in front of 'symlink' is to suppress the NOTICE you get if the LOCK_FILE exists
        return true;
    # link already exists
    # check if it's stale
    if (is_link(LOCK_FILE) && !is_dir(LOCK_FILE))
    {
        unlink(LOCK_FILE);
        # try to lock again
        return tryLock();
    }
    return false;
}
?>

摘自评论

http://php.net/manual/en/function.getmypid.php

这将锁定到进程,

因此如果进程失败,您可以删除锁定

感谢我的朋友的回答。

我无法运行您的代码...也许是因为我不能很好地配置它们...

但我解决了插入函数 insile 代码的问题,如下所示:

$file = "lock.txt";
$f = fopen($file, 'r');
$line = fgets($f); 
fclose($f);
if($line == 0)
{
    file_put_contents($file, "1");
    myfunction();
    file_put_contents($file, "0");
}
else
{
    echo "Already running.";
}

希望帮助索姆博迪其他人...

我使用这些函数(例如,我称它们为my_lock和my_unlock):

function my_lock($name) {
    $lockFile = 'myfolder/' . $name . '.lck';
    $lock = fopen($lockFile, 'w');
    if (!$lock) {
        return false;
    }
    if (flock($lock, LOCK_EX)) {
        return $lock;
    } else {
        fclose($lock);
        return false;
    }
}
function my_unlock($lock) {
    if ($lock !== false) {
        flock($lock, LOCK_UN);
        fclose($lock);
    }
}

使用示例:

    $lock = my_lock('hello_world');
    if ($lock === false) {
      throw new Exception('Lock error');
    }
    try {
      //... your locked code here ...
    } finally {
      my_unlock($lock);
    }