Все эти операции действительно зависят от базы данных. Так что вам не нужно заставлять PHP запускать код в критической секции; достаточно сериализовать эти операции в базе данных.
Самый простой способ сделать это - LOCK TABLES ... WRITE
во время выполнения этих действий; это гарантирует, что только один сценарий будет одновременно взаимодействовать с базой данных.
Другой подход заключается в SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
и запуске всех операций в транзакции с отключенной автоматической фиксацией (вы должны действительно использовать транзакцию для обеспечения целостности данных, даже если вы решите использовать блокировку таблицы, хотя ).
Обновление: Если вам абсолютно необходимо сделать это в PHP, вы можете достичь цели, используя flock
:
$fp = fopen('sunc_file', 'r+');
if (flock($fp, LOCK_EX)) {
// Perform database ops here
flock($fp, LOCK_UN); // release the lock
}
else {
die("Couldn't get the lock!");
}
fclose($fp);
flock
в эксклюзивном режиме предотвратит блокировку файла защиты любым другим процессом и, таким образом, позволит вашим сценариям выполняться строго сериализованно, , но, пожалуйста, прочитайте гигантские красные предупреждения на странице man !