Сохранение файловых ресурсов в PHP

Я разрабатываю простое веб-приложение для чата на основе протокола MSN. Сервер связывается с сервером MSN через файловый ресурс, возвращенный из fsockopen (). Клиент обращается к серверу через XMLHttpRequest. Сначала сервер входит в систему и распечатывает список контактов (отформатированный в виде таблицы HTML), который клиент получает через responseText () объекта XMLHttpRequest.

Вот в чем проблема. Файловый ресурс, отвечающий за связь с сервером MSN, должен поддерживаться в рабочем состоянии, чтобы все функции, связанные с чатом, работали (создание бесед, отслеживание изменений состояния офлайн/онлайн и т. д.). Однако для завершения XMLHttpRequest скрипт PHP должен завершить выполнение. Это означает, что клиент не получит ответа от XMLHttpRequest во время сеанса чата.

Что еще хуже, файловый ресурс нельзя сериализовать, то есть я не могу просто сохранить сеанс чата в заполнителе $_SESSION [].

Итак, мой вопрос: есть ли какой-либо способ «перенести» файловый ресурс из одного файла в другой?


person Dr. Johnson    schedule 10.02.2010    source источник


Ответы (4)


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

Решение состоит в том, чтобы серверный процесс работал как демон, что означает, что он должен работать вне веб-сервера.

Видеть

http://symcbean.blogspot.com/2010/02/php-and-long-running-processes.html

и

http://www.phpclasses.org/browse/package/5758.html

C.

person symcbean    schedule 10.02.2010

Возможным решением было бы иметь PHP-скрипт на стороне сервера, который просто не заканчивается ; таким образом, ресурс, соответствующий вызову fsockopen, никогда не будет удален, и соединение не будет закрыто.

По этому поводу вы можете выполнить поиск по термину "comet" ; Основная идея состоит в том, чтобы иметь сценарий, который вечно работает на стороне сервера и отправляет обновления клиенту всякий раз, когда это необходимо.

Вместо того, чтобы браузер отправлял запрос Ajax каждые X секунд, вы бы поддерживали открытое соединение между клиентом и сервером - просто обратите внимание, что, к сожалению, PHP часто называют не лучшим инструментом для этой работы...

В stackoverflow: [php] комета

person Pascal MARTIN    schedule 10.02.2010

Ресурс не может пережить конец запроса, если вы не создадите расширение PHP, которое делает это (например, постоянные соединения MySQL с mysql_pconnect()). Однако вы можете использовать технологию Comet и, например, протокол Bayeux, поддерживаемый набором инструментов Dojo. среди прочего, чтобы поговорить с сервером. Для этого потребуется либо автономный сервер, либо длительный запрос, в последнем случае убедитесь, что ограничения времени PHP и веб-сервера не уничтожат этот запрос из-за слишком долгого выполнения.

person StasM    schedule 10.02.2010

Спасибо всем за предложения. До того, как я начал этот проект, я рассматривал возможность использования кометной технологии, но отказался от нее (похоже, что PHP/Apache плохо реализованы). Я придумал взломанное решение, не самое элегантное, но работоспособное.

Один PHP-скрипт отвечает за связь с сервером MSN, он будет работать, пока пользователь активен. Он записывает данные в файл (email_out), а также считывает данные из файла (email_in). Всякий раз, когда клиент отправляет запрос AJAX, отдельный сценарий PHP будет записывать любые данные POST в файл (email_in) и возвращать любые данные из (email_out). Оба скрипта не будут читать/записывать данные, пока наконец не получат доступ к файлу (поскольку будет борьба за файловый ресурс).

Я не знаю, предложения? Это, безусловно, не самый эффективный способ ведения дел, но это действительно единственное решение для PHP/apache, о котором я мог подумать.

person Dr. Johnson    schedule 10.02.2010