Не запускайте php srcipt снова, если он уже запущен - PullRequest
0 голосов
/ 14 февраля 2019

Я читаю данные с листа и хочу внедрить синглтон в моем процессе, чтобы я мог запускать функцию чтения, по одному за раз.но я узнал, что я не могу сделать это с синглтоном, так как я могу сделать это без использования мьютекса или семафора.

Я написал код для того же самого, который вызывает класс и устанавливает статическую переменную, а затем вызываетфункция, чтобы проверить, есть ли у нее класс, поэтому, если класс существует, не запускайте функцию чтения.

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, не хочет использовать мьютекс или семафор

1 Ответ

0 голосов
/ 14 февраля 2019

Используете ли вы базу данных в вашем приложении?Задание чтения выполняется в распределенной среде или всегда на одном сервере?Я предлагаю рассмотреть вопрос о консультативной блокировки.И 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);
...