Постоянство файлового ресурса в PHP - PullRequest
3 голосов
/ 10 февраля 2010

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

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

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

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

Ответы [ 4 ]

2 голосов
/ 10 февраля 2010

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

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

См

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

и

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

С

0 голосов
/ 11 февраля 2010

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

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

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

0 голосов
/ 10 февраля 2010

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

0 голосов
/ 10 февраля 2010

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

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

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

В стеке потока: [php] комета

...