如果它已经在运行,请不要再次运行php srcipt

时间:2019-02-14 10:59:36

标签: php multithreading asynchronous parallel-processing singleton

我正在从工作表中读取数据,并希望在我的过程中实现单例,以便可以一次运行一次读取功能。但是我知道我无法使用单例来做到这一点,所以如何在不使用互斥或​​信号量的情况下做到这一点。

我已经为该类编写了代码,该类调用该类并设置一个静态变量,然后调用该函数以检查其是否具有该类,因此如果该类存在,则不要运行read函数。

class DataParser extends config {

   private static $_instance = false;

   public static
   function getInstance() {
    if (self::$_instance == false) {
     print_r("expression");
     self::$_instance = true;
     return self::$_instance;

    }
    return false;
   }

   function __construct($params) {}
}

$dataParser = new DataParser($confData);
$p = DataParser::getInstance();
if ($p) {
   $res = $dataParser - > read();

}

我想一次运行一次读取功能,如果一个读取正在运行,则另一读取将无法使用php运行不想使用互斥量或信号量

2 个答案:

答案 0 :(得分:0)

您是否在应用程序中使用数据库?阅读器任务是在分布式环境中运行还是始终在同一服务器上运行?我建议调查咨询锁定。 MySQLPHP都支持。

使用PHP中的文件专有锁定,看起来像这样。

class DataParser extends config {

   private static $_instance = false;

   public static
   function getInstance() {
    if (self::$_instance == false) {
     print_r("expression");
     self::$_instance = true;
     return self::$_instance;

    }
    return false;
   }

   function __construct($params) {}
}


$dataParser = new DataParser($confData);
$p = DataParser::getInstance();

$fp = fopen("/tmp/.lock", "r+");

if ($p && flock($fp, LOCK_EX)) {  
    $res = $dataParser->read();
    flock($fp, LOCK_UN);    
} else {
    // Skip silently or do something else?
}

fclose($fp);

答案 1 :(得分:0)

启动脚本后,您可以简单地创建一个空文件,然后在此之前检查该文件是否存在。 然后在脚本结尾处将其删除。