加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP编程:PHP进程同步代码实例

发布时间:2020-12-13 02:24:56 所属栏目:PHP教程 来源:网络整理
导读:《PHP进程同步代码实例》要点: 本文介绍了PHP进程同步代码实例,希望对您有用。如果有疑问,可以联系我们。 经常遇到这样一种情况,计划任务定时后台执行某个php程序,有时候也必要手动执行,可能多个人都必要执行这个程序,如果任务持续时间非常长,就很容易造

《PHP进程同步代码实例》要点:
本文介绍了PHP进程同步代码实例,希望对您有用。如果有疑问,可以联系我们。

经常遇到这样一种情况,计划任务定时后台执行某个php程序,有时候也必要手动执行,可能多个人都必要执行这个程序,如果任务持续时间非常长,就很容易造成重复执行,所以就开发了下面的类.PHP实例

作用:在实际代码运行前检查与当前相同操作的进程是否正在运行,高并发运行是可靠的,运行中的进程中途异常中断不会发生任何影响.PHP实例

构造办法传递pid文件目录的绝对路径,需要自己保证不同进程对应不同pid文件.PHP实例

代码如下:

<?php

/*
?* 同一个PHP进程只运行一次,根据进程名字判断是否为排重进程,只能运行于linux,高并发条件下是并发平安的.
?*/PHP实例

class SyncProcess {PHP实例

?private $pidFile;PHP实例

?function __construct($pidFile) {
??$this->pidFile = $pidFile;
?}PHP实例

?/**
? * 非阻塞方式返回过程是否正在运行
? */
?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;
??}
?}PHP实例

?/**
? * 如果正在运行或者发生未知差错返回true,如果没有运行返回false
? * @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);
???//返回值有空格
???$line = trim($line);
???if ($line == $pid) {
????return true;
???} else {
????if (empty($output)) {
?????return false;
????} else {
?????if (php_sapi_name() == 'cli')
??????$n = "n";
?????else
??????$n = "<br>";
?????//到这一步的话应该是出什么问题了
?????$output = implode($n,$output);
?????debug_print($output,E_USER_WARNING);
?????return true;
????}
???}
??}else {
???return false;
??}
?}PHP实例

}
PHP实例

Demo:PHP实例

代码以下:

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

欢迎参与《PHP进程同步代码实例》讨论,分享您的想法,编程之家 52php.cn为您提供专业教程。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读