Я хочу определить переменную с суперглобальной областью в php - PullRequest
0 голосов
/ 18 августа 2011

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

Я хочу сделать что-то вроде следующего: у меня есть скрипт php, и этот скрипт обычно занимает от 5 до 15 минут, но в некоторых особых случаях это может занять более одного часа. Этот скрипт запускается с использованием задания cron с интервалом в 15 минут. Этот скрипт также может быть запущен вручную любым пользователем.

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

Итак, я хочу, чтобы переменная хранила количество выполняемых в данный момент скриптов. Я не хочу использовать БД или файлы для хранения одного значения.

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 18 августа 2011

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

(Старая) статья о IPC (межпроцессное взаимодействие) может помочь вам

http://zez.org/article/articleview/46/

Из интереса, почему вы не хотите использовать файлы или базу данных?

Другое решение (несмотря на то, что, скорее всего, технически с использованием файлов илибазы данных) будет заставлять сценарий использовать определенный идентификатор сеанса.

<?php

$maximum = 1;

session_id(md5('myscript'));
session_start();

if( !isset( $_SESSION['count'] ) ) {
    $_SESSION['count'] = 1;
} else {
    if( $_SESSION['count'] >= $maximum ) {
        die( "too many processes running" );
    } else {
        $_SESSION['count']++;
    }
}

session_write_close();

// simulate running something
sleep(10);

session_id(md5('myscript'));
session_start();

$_SESSION['count']--;

session_write_close();

echo "<br />executed";

?>

Обратите внимание, что в приведенном выше примере вызов метода session_write_close () важен, поскольку выполнение сценария предотвратит счетчик.увеличивается до тех пор, пока не закончится иначе.И затем, когда он закрывает его, ему нужно открыть его, чтобы уменьшить счетчик.

Очевидно, что из-за повторного открытия сеанса любой выход из скрипта должен был быть буферизован (см. http://www.php.net/ob_start), чтобы предотвратить уже заголовкиотправленные ошибки

1 голос
/ 18 августа 2011
  1. проверить, достигнут ли предел
  2. когда пользователь получит доступ к скрипту, добавьте его в БД
  3. когда пользователь существует (или скрипт заканчивается), удалите его из БД

нет способа сохранить это где-нибудь еще для всех без файла и базы данных

0 голосов
/ 18 августа 2011

Без БД и файлов, насколько я знаю, это невозможно. Вместо этого, если у вас есть доступ к серверу (root-доступ), вы можете проверить с помощью команды ps (если работает ОС Linux), запущен ли сценарий и, если да, вы можете увидеть, сколько его экземпляров. *

0 голосов
/ 18 августа 2011

Ваши предварительные условия довольно ограничительны.Память не распределяется (или не обычно ) между сценариями, и мы не можем использовать файлы или базы данных: это фактически не оставляет общего пространства доступным для обмена информацией, поэтому вам приходится вычислять информацию каждыйвремя.Ваш лучший вариант - это, вероятно, проверить запущенные процессы, определить, какие из них принадлежат вашему сценарию, и подсчитать их.Ваше упоминание cron предполагает Unix, что облегчает задачу.Расширение POSIX , вероятно, позволяет контролировать выполнение процесса до такой степени, и, как последний ресурс, вы всегда можете запустить команду ps из PHP.

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