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

问题描述 投票:0回答:2

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

我已经编写了相同的代码,该代码调用该类并设置一个静态变量,然后调用该函数以检查其是否具有该类,因此如果该类存在,则不要运行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运行,不想使用互斥或​​信号量

php multithreading asynchronous parallel-processing singleton
2个回答
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);

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.