Как я могу общаться через Perl CGI-скрипты? - PullRequest
1 голос
/ 11 октября 2010

Я ищу эффективные способы связи между двумя сценариями Perl.У меня есть два сценария;Скрипт 1 генерирует некоторые данные.Я хочу, чтобы мой скрипт 2 имел доступ к этой информации.

Самый простой / тупой способ - записать данные, сгенерированные сценарием 1, в виде файла и прочитать их позже, используя сценарий 2. Есть ли другой способ, кроме этого?Могу ли я сохранить данные в памяти и сделать их доступными для сценария 2 (конечно, при поддержке моего Linux)?Значение malloc для некоторых данных по сценарию 1 и возможность доступа к нему сценария 2.

Нет гарантии, что сценарий 2 будет запущен после сценария 1. Поэтому должен быть какой-то способ освободить эту память с помощью сторожевого таймера,

Позвольте мне раскрыть еще немного контекста.Я запускаю эти скрипты на веб-сервере с использованием CGI-Perl.Таким образом, по нажатию кнопки запускается скрипт 1, который генерирует HTML-страницу.Теперь пользователь может добавить некоторые входные данные на эту сгенерированную веб-страницу и щелкнуть кнопку на этой новой странице. Теперь сценарий 2 должен иметь возможность считывать данные на новой веб-странице. Я могу снова публиковать данные на веб-сервере.но более эффективный способ - сохранить копию сгенерированной страницы на сервере и сделать ее доступной для сценария 2. Теперь я бы хотел не записывать сгенерированную страницу в виде файла.Я думал о сохранении его в памяти

Ответы [ 2 ]

2 голосов
/ 11 октября 2010

Это зависит в некоторой степени от вашего использования ... один большой набор данных? Много маленьких сообщений? Ди ты можешь вообще о сохранности данных? Это полностью асинхронный?

Некоторые из опций:

  • Для любых, кроме самых высокопроизводительных веб-сайтов, наилучшим подходом является запись наших HTML-страниц в файлы! . Если взаимодействие между процессорами и процессами не является узким местом в производительности, не используйте оба решения, не связанных с файлами (общая память, кэш, промежуточный сервер).

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

    В качестве альтернативы используйте Apache :: Session session для хранения данных между сессиями.

  • Как вы заметили, общая память. Например, используйте IPC :: ShareLite , IPC :: Cache или это решение от perlmonks .

    Также, пожалуйста, ознакомьтесь с Главой 16, Рецепт 12 «Совместное использование переменных в разных процессах» из «Поваренной книги Perl» О'Рейли (нет ссылки, так как непиратские версии не доступны в сети, где я знаю)

  • Используйте постоянную среду. Файл является одним из вариантов. База данных - это другое.

  • Для асинхронной работы используйте промежуточную систему обмена сообщениями (MQ, Tibco, что-то более легкое). Вероятно, это немного излишне в этом сценарии, но правильный вариант, о котором нужно знать. Этот, вероятно, будет довольно стабильным и надежным, но, возможно, не свободным и менее гибким / адаптированным.

  • Или сверните свой собственный простой сервер системы обмена сообщениями - это НЕ ТАК сложно для очень простого сервера, который вам нужен.

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

1 голос
/ 11 октября 2010

Вы пометили свой вопрос как "cgi". Это обе программы CGI? В этом случае они могут просто общаться друг с другом, отправляя HTTP-запросы.

Однако вам придется рассказать намного больше о том, почему вы пытаетесь это сделать, и о том, что вам нужно сделать, чтобы мы могли вам помочь. Конечно, Perl-программы легко могут общаться друг с другом каким-то образом, но это не значит, что это правильный ответ для вас.

Когда у вас есть сложные требования к взаимодействию между программами CGI, вы, вероятно, захотите перейти к веб-среде, которая обрабатывает многие из этих деталей для вас. Catalyst может быть, с чего бы вы хотели начать. Для этого даже есть книга.

...