PHP библиотека с общими данными

Serg Klyk

Новичок
Привет. Есть простая задачка: организовать некую функцию доступа к данным в файле.

В файле хранятся необходимые флаги, настройки.

1. Берем данные из файла
2. Работаем в скрипте (иногда пару секунд)
3. Изменяем флаги и сохраняем обратно

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

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

К примеру, можно было бы использовать сокеты и там контролировать процесс, но это лишние движения, и не везде разрешены сокеты.
Вопрос: есть ли класс или библиотека, экземпляр которой будет одним для разных вызовов?
 

WMix

герр M:)ller
Партнер клуба
Код:
class X3{
// придумай сам остатки
    public function function islocked() {
        return file_exists($this->lock);
    }

    public function lock() {
        file_put_contents($this->lock, "");
    }
    public function unlock() {
        unlink($this->lock);
    }
}
 

Serg Klyk

Новичок
Спасибо, функция у меня умеет блокировать и ставить в очередь, если файл кем то открыть.

Больше интересует класс или функция с глобальной памятью для разных процессов.
К примеру:

1. Обращение 1 процесса к функции
2. Функция открывает файл и отдает данные
3. Обращение 2 процесса к функции (чтение/запись)
...
5. Первый процесс завершил работу
6. Второй также завершил работу
7. Вызывается Terminalize или как то так, и только теперь мы сохраняем результат в файл.

Такой себе сервер данных получается, только без winsocket'ov надо придумать.
 

Serg Klyk

Новичок
Не то, мне просто необходим класс с общей переменной, для нескольких процессов, если в кратце.
 

WMix

герр M:)ller
Партнер клуба
процесс это что? в файл можно сериализовать если что, до тех пор пока путь к файлу у разных процессов одинаковый они пользуются одним файлом
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@WMix, чую товарищ хочет мультитрединг и головную боль
 

WMix

герр M:)ller
Партнер клуба
тоже чую, но что такое "мультитрединг" тут и форкать и эксечить и курлить
 

Adelf

Administrator
Команда форума
А еще есть базы данных. хоть SQL хоть не SQL. Я слышал, это весьма полезные вещи.
 

Serg Klyk

Новичок
Спасибо. Да, что то в этом роде.
Хотя хочется попроще, чтобы просто переменная была доступна в разных процессах.

Базу данных не вариант юзать, не всегда и не везде доступна.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@Serg Klyk, не выйдет у тебя юзать "одну переменную в разных процессах". Думаю сам догадаешься почему.
 

Serg Klyk

Новичок
Ну в ПК программах получается через СОМ подключать dll-ку, и там делать общую глобальную переменную, что очень удобно, но были утечки.
Спасибо, я так понял трудноразрешимая задача.
 

Breeze

goshogun
Команда форума
Партнер клуба
Ну в ПК программах получается через СОМ подключать dll-ку, и там делать общую глобальную переменную, что очень удобно, но были утечки.
Спасибо, я так понял трудноразрешимая задача.
Это обычная задача, только в модели "запрос-новый процесс-ответ-процесс помер" она не решается теми способами, которые привычны при написании десктопного софта.
Тем более она не решается такими вещами, когда у тебя больше одного сервера :)
 

Serg Klyk

Новичок
Это обычная задача, только в модели "запрос-новый процесс-ответ-процесс помер" она не решается теми способами, которые привычны при написании десктопного софта.
Тем более она не решается такими вещами, когда у тебя больше одного сервера :)
Так тут один сервер, какие проблеммы. Придется вынсокеты юзать по принципу базы данных.

Код:
...
  function __get($k){
    while($this->islocked()){
      sleep(1);
    }
    return unserialize($this->data);
  }
..
Код:
echo $x3->user_name;
Так понимаю этот код ждет освобождения файла и только потом его открывает. Если да, то уже говрил, что функция моя это умеет, спасибо. А если разрешает доступ к переменной с разных процессов, то круто.
 

fixxxer

К.О.
Партнер клуба
У тебя в голове каша, ты веришь в существование какой-то магии.
Если ты неатомарно изменяешь какие-то данные, то в любом случае у тебя будет либо блокировка параллельных процессов, либо грязное чтение неконсистентных данных. Хоть файл, хоть shared memory, хоть чего там.
А с чтением проблем нет и с файлами.
 

stalxed

Новичок
Базу данных не вариант юзать, не всегда и не везде доступна.
Придется вынсокеты юзать по принципу базы данных.
Т.е. база данных не доступна, а винсокеты можно заюзать?
Если пишешь под Windows, то уж лучше сразу тогда взять C#...
 

Adelf

Administrator
Команда форума
+1 за C#. Если пишешь под винду - юзай всю мощь, что называется.
 
Сверху