我正在从工作表中读取数据,并希望在我的过程中实现单例,以便我可以一次运行读取功能。但是我知道我不能用单例来做到这一点,所以我如何不使用互斥或信号量就可以做到这一点。
我已经编写了相同的代码,该代码调用该类并设置一个静态变量,然后调用该函数以检查其是否具有该类,因此如果该类存在,则不要运行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运行,不想使用互斥或信号量
您是否在应用程序中使用数据库?阅读器任务是在分布式环境中运行还是始终在同一服务器上运行?我建议调查咨询锁定。 MySQL和PHP都支持它。
使用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);
启动脚本后,您可以简单地创建一个空文件,然后在此之前检查该文件是否存在。然后在脚本末尾将其删除。