Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Глобальная переменная


Автор: Prontit 9.7.2015, 08:11
Здравствуйте,

имеется несколько PHP-скриптов, каждый выполняет свою функцию и вызывается разными пользователями в разное время (какие-то дёргаются кроном). Для работы каждый скрипт должен использовать переменную, принимать ее текущее значение и изменять на какое-то другое. Эту переменную необходимо где-то хранить. Я думаю, не очень рационально для одной переменной создавать таблицу (например, на mysql), чтобы там в одном поле хранить это значение. Создать файл, и читать значение из него, тоже вариант не оптимальный. Есть возможность в PHP создать глобальную переменную, чтобы получать/изменять ее значение из любого скрипта на этом сервере?

Может вопрос глупый, но я не смогу найти информацию...
 smile 
Заранее благодарю!

Автор: ksnk 9.7.2015, 10:48
Prontit, memcache?

Автор: baldina 9.7.2015, 14:34
вопрос глупый - в том смысле, что скрипты, запускаемые кроном, это разные процессы, не связанные между собой, общей переменной у них быть не может. для обмена данными между процессами используется https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%B6%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BD%D0%BE%D0%B5_%D0%B2%D0%B7%D0%B0%D0%B8%D0%BC%D0%BE%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B5(interprocess communication) - это различные методы (в т.ч. файлы и каналы). 
можно использовать и сетевые службы (в том числе сетевые субд, memcache и т.д.)
php поддерживает и ряд механизмов IPC (в т.ч. каналы, семафоры, разделяемую память), и многие сетевые службы.
во всех случаях есть преимущества и недостатки, поэтому выбор зависит от конкретной задачи. 
а чем вам не нравятся файлы и субд?

Автор: Prontit 9.7.2015, 14:47
Цитата(baldina @ 9.7.2015,  14:34)
вопрос глупый - в том смысле, что скрипты, запускаемые кроном, это разные процессы, не связанные между собой, общей переменной у них быть не может. для обмена данными между процессами используется https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%B6%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BD%D0%BE%D0%B5_%D0%B2%D0%B7%D0%B0%D0%B8%D0%BC%D0%BE%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B5(interprocess communication) - это различные методы (в т.ч. файлы и каналы). 
можно использовать и сетевые службы (в том числе сетевые субд, memcache и т.д.)
php поддерживает и ряд механизмов IPC (в т.ч. каналы, семафоры, разделяемую память), и многие сетевые службы.
во всех случаях есть преимущества и недостатки, поэтому выбор зависит от конкретной задачи. 
а чем вам не нравятся файлы и субд?

не то что не нравится, просто думаю что нецелесообразно ради хранения одной переменной поднимать мускуль, создавать базу/таблицу. С файлом тоже самое. Я думал, что можно создать какую-то глобальную переменную, которая будет отовсюду доступна. Мне нужно хранить всего-то одно значение. Ну если нет такой возможности, придется БД или файл использовать.

Вот был бы какой-нибудь конфиг файл в пхп, куда можно было написать 
Код

$_MYVARIABLE['abc'] = 'cba';
, а потом использовать это во всех скриптах на этом серваке:

Код

echo $_MYVARIABLE['abc'];
$_MYVARIABLE['abc'] = 123123;


глупости?)

Добавлено через 50 секунд
Цитата(ksnk @ 9.7.2015,  10:48)
Prontit, memcache?

возможно, не знал о существовании. почитаю. Спасибо!

Автор: baldina 9.7.2015, 15:40
если у вас еще не используется субд или memcache, поднимать их для этой цели - из пушки по воробьям.
файл имхо наиболее легковесное решение

Код

class PersistentData {
   private static $filename = '/temp/persist.php.dat';
   static function set ($data) {
      file_put_contents (self::$filename, serialize ($data));
   }
   static function get () {
      return unserialize(file_get_contents (self::$filename));
   }
}

use PersistentData as PD;

PD::set (['abc'=>'cba']);
echo PD::get()['abc'];
PD::set (['abc'=>'123123']);

Автор: Prontit 9.7.2015, 16:01
Цитата(baldina @ 9.7.2015,  15:40)
если у вас еще не используется субд или memcache, поднимать их для этой цели - из пушки по воробьям.
файл имхо наиболее легковесное решение

Код

class PersistentData {
   private static $filename = '/temp/persist.php.dat';
   static function set ($data) {
      file_put_contents (self::$filename, serialize ($data));
   }
   static function get () {
      return unserialize(file_get_contents (self::$filename));
   }
}

use PersistentData as PD;

PD::set (['abc'=>'cba']);
echo PD::get()['abc'];
PD::set (['abc'=>'123123']);

согласен, но доя того чтобы считать/записать переменную необходимо написать неодну строчку кода. Хотелось бы сделать проще. Типа того, как я описал выше.

Автор: Prontit 13.7.2015, 14:24
Прочитал про SetEnv в Апаче. Ее потом можно из пхп читать 
Код

$_SERVER["MYVARIABLE"];

и писать 
Код

putenv("MYVARIABLE=dfgdfg");
 ,но значение сохраняется только в текущей сессии. Короче, почти то что нужно)

Автор: _zorn_ 14.7.2015, 06:14
А крон дергает скрипты через апач ?

Автор: Prontit 14.7.2015, 07:48
Цитата(_zorn_ @ 14.7.2015,  06:14)
А крон дергает скрипты через апач ?

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

Автор: ksnk 14.7.2015, 10:42
Цитата(Prontit @  14.7.2015,  07:48 Найти цитируемый пост)
Скрипт запускается программно из десктопных приложений

На компьютере-сервере есть пользователи с десктопными приложениями? 

Цитата(Prontit @  14.7.2015,  07:48 Найти цитируемый пост)
пользователями из браузера

Не смущает, что в этих случаях будут в каждом случае собственные переменные окружения?

Автор: Prontit 14.7.2015, 14:54
Цитата(ksnk @  14.7.2015,  10:42 Найти цитируемый пост)
На компьютере-сервере есть пользователи с десктопными приложениями? 


На компьютерах установлена программа, которая время от времени запрашивает эту переменную у скрипта.


Цитата(ksnk @  14.7.2015,  10:42 Найти цитируемый пост)
Не смущает, что в этих случаях будут в каждом случае собственные переменные окружения? 


Смущает, поэтому и говорю, что это не решение задачи.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)