PHP process synchronization code example_PHP tutorial

WBOY
Release: 2016-07-13 10:06:51
Original
694 people have browsed it

PHP process synchronization code examples

This article mainly introduces PHP process synchronization code examples. This article directly gives the implementation code. Friends who need it can refer to it

We often encounter a situation where a scheduled task executes a certain PHP program in the background at a scheduled time. Sometimes it also needs to be executed manually. Multiple people may need to execute this program. If the task duration is very long, it is easy to cause repeated execution. , so the following class was developed.

Function: Before running the actual code, check whether the process with the same operation as the current one is running. High-concurrency operation is reliable, and abnormal interruption of the running process will not have any impact.

The construction method passes the absolute path of the pid file directory, and you need to ensure that different processes correspond to different pid files.

The code is as follows:


/*
* The same PHP process only runs once. Based on the process name, it is judged whether it is a deduplication process. It can only run on Linux. It is concurrency-safe under high concurrency conditions.
*/

class SyncProcess {

private $pidFile;

function __construct($pidFile) {
$this->pidFile = $pidFile;
}

/**
* Non-blocking method returns whether the process is running
*/
function check() {
if (PHP_OS == 'Linux') {
$pidFile = $this->pidFile;
if (!empty($pidFile)) {
$flag = false;
$pidDir = dirname($pidFile);
if (is_dir($pidDir)) {
$flag = true;
}
if ($flag) {
$running = true;
clearstatcache(true, $this->pidFile);
if (!file_exists($this->pidFile))
file_put_contents($this->pidFile, '', LOCK_EX);
$f = fopen($this->pidFile, 'r+');
if (flock($f, LOCK_EX ^ LOCK_NB)) {
$pid = trim(fgets($f));
if (!$this->is_process_running($pid)) {
$running = false;
}
}
if (!$running) {
fseek($f, 0);
ftruncate($f, 0);
fwrite($f, getmypid());
}
flock($f, LOCK_UN);
fclose($f);
return $running;
} else {
debug_print("pid file($pidFile) is invalid", E_USER_WARNING);
}
} else {
debug_print("pid file cant't be empty", E_USER_WARNING);
}
} else {
debug_print(__CLASS__ . ' can only run in Linux', E_USER_WARNING);
return true;
}
}

/**
* Returns true if it is running or an unknown error occurs, false if it is not running
* @param mixed $pid
*/
private function is_process_running($pid) {
if (is_numeric($pid) && $pid > 0) {
$output = array();
$line = exec("ps -o pid --no-headers -p $pid", $output);
//The return value has spaces
$line = trim($line);
if ($line == $pid) {
return true;
} else {
if (empty($output)) {
return false;
} else {
if (php_sapi_name() == 'cli')
$n = "n";
else
$n = "
";
//If we get to this point, there must be something wrong
$output = implode($n, $output);
debug_print($output, E_USER_WARNING);
return true;
}
}
}else {
return false;
}
}

}

Demo:

The code is as follows:


$sync = new SyncProcess(APP_PATH . '/data/pid'.implode('', $this->getRoute()));
if ($sync->check()) {
exit("process is runningn");
}

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/957536.htmlTechArticlePHP process synchronization code examples This article mainly introduces PHP process synchronization code examples. This article directly gives the implementation code. Friends in need can refer to this situation that we often encounter, plan...
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!