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

时间:2015-06-12 05:00:34

标签: php locking

您好我有一个PHP功能,它需要大约20分钟(或更长时间)才能运行并完成。

但如果其他人在上次运行期间运行它...函数会中断不需要的结果。

这是结构:

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

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

我创建了一个文本文件...如果该文本的内容为“1”,则该函数为lock。如果没有,该功能是免费的。

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 
}

我认为逻辑上一定是真的......但是不行!首次运行后,lock.txt文件的内容保持为1.(完成后不更改为0)

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

4 个答案:

答案 0 :(得分:1)

已经有一个实现锁Called 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 可以锁定它

答案 1 :(得分:0)

到目前为止,我体验的最佳方式与此相似

<?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

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

答案 2 :(得分:0)

感谢我的朋友们的回答..

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

但是我用插入函数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.";
}

希望帮助sombody其他...

答案 3 :(得分:0)

我使用这些函数(我称之为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);
    }