Межсессионная переменная в PHP - PullRequest
3 голосов
/ 09 декабря 2011

Я полагаю, что глобалы и суперглобалы умирают, когда сценарий или сеанс заканчиваются. Каков наилучший способ хранения межсессионной переменной в PHP? Другими словами, я хочу, чтобы каждый сеанс имел доступ к переменной. (Это будет логическое значение для синхронизации доступа к ресурсу на сервере.) Есть ли решение помимо простого сохранения значения в файле? Было бы неплохо сохранить переменную в памяти ...

EDIT:

Я просто хочу иметь возможность сделать это:

while ($beingused)
   sleep(5);
$beingused = true;
// Do something

РЕШЕНИЕ:

Большое спасибо всем за помощь. Вот мое решение, основанное на ваших данных.

memcache_pconnect('localhost');
while (memcache_get('inuse') == 'true')
    usleep(10);
memcache_set('inuse', 'true');
// Do something
memcache_set('inuse', 'false');

UPDATE

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

Ответы [ 4 ]

2 голосов
/ 09 декабря 2011

Я бы использовал пустой файл с определенным именем (например, PID-файлы в Linux). Перед выполнением команды скрипт проверяет, существует ли файл, и если нет, он создает файл. После выполнения сценария оболочки удалите файл. Но будьте осторожны с кешем файловой системы.

Другим быстрым вариантом является сохранение флага в базе данных в памяти, такой как memcache или Redis.

2 голосов
/ 09 декабря 2011

Я думаю, что в соответствии с вашим вопросом вам нужно использовать " база данных в памяти ", например база данных SQlite в памяти , или созданная база данныхиспользуя MySQL Memory Storage и т. д.

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

См. Подробнее: http://en.wikipedia.org/wiki/In-memory_database

РЕДАКТИРОВАНИЕ:

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

http://www.php.net/manual/en/function.sem-get.php

http://www.php.net/manual/en/function.sem-acquire.php

http://www.php.net/manual/en/function.sem-get.php

0 голосов
/ 09 декабря 2011

Одним из принципов PHP является НИЧЕГО ПОДЕЛИТЬСЯ .Это означает, что вы ничего не можете разделить между двумя исполнениями PHP / обработкой / обработкой запросов.Каждая общедоступная вещь должна быть передана за пределы PHP.

Для вещи того же пользователя у вас есть сеанс.Для общего доступа, в классических установках LAMP у вас есть база данных.Но вы также можете использовать файловую систему (семафоры, блокировки).Использование базы данных для установки блокировок приложений - классическая вещь, но это может плохо отразиться на классической базе данных Relationnal, где операции записи выполняются довольно медленно.Некоторые механизмы хранения NOSQL, такие как Redis, имеют очень быструю поддержку операций блокировки.

0 голосов
/ 09 декабря 2011

Для сохранения в разных браузерах: используйте куки.Для доступа к ним используйте $_COOKIE[] и set_cookie().

. Для сохранения на сервере: используйте поле базы данных.

ОБНОВЛЕНИЕ

Несмотря наdownvotes, и после вашего обновления, кажется, вы можете просто установить логическое значение в базе данных и проверить его значение соответствующим образом.Конечно, на странице есть запись в базе данных - узел, или журнал, или что-то.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...