嗨,我有一个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);
}