您好我有一个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'?
答案 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);
}