Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сохранение ресурсов php 
V
    Опции темы
lollollollol
Дата 23.9.2014, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



на php окрывается порт,

Код

        $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        if ($sock === false) { throw new Exception('socket_create() failed: '.socket_strerror(socket_last_error())."\n"); } 
        socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1);
        if (($ret = socket_bind($sock, $address, $port1)) === false) { throw new Exception('socket_bind() failed: '.socket_strerror(socket_last_error())."\n");    }
        if (($ret = socket_listen($sock, $MaxServer)) === false) {    throw new Exception('socket_listen() failed: '.socket_strerror(socket_last_error())."\n");    }




переменная $sock явяется ресурсом, т.е. указателем на некую структуру.


Можно ли как-то сохранить $sock  в бд, чтобы Второй скрипт обратился к нему, и дальше уже работал с открытом портом?


т.е. цель такая:

Скрипт1 открывает порт, сохраняет ресурс в бд
Скрипт2 берёт ресурс из бд, и работает с открытым портом


Возможна ли такая схема? Как сохранить ресурс в БД?
PM MAIL   Вверх
tzirechnoy
Дата 24.9.2014, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Цитата
переменная $sock явяется ресурсом, т.е. указателем на некую структуру.


Нет, у слова "указатель" есть устоявшэеся значение, и $sock ему не соответствует.

Цитата
Можно ли как-то сохранить $sock  в бд, чтобы Второй скрипт обратился к нему, и дальше уже работал с открытом портом?


Чтобы сокет был открыт и доступен для пользовательских программ -- обязательно требуется, чтобы он в каждый момент времени открыт в каком-нибудь выполняющемся процэссе. Открытие -- это вот то, что делаешь ты, по факту эта последовательность действий вызывает похожэ поименованные функцыи ядра ОС для того, чтобы ядро проделало внутри себя операцыи по открытию (заполнение нескольких структур и посылка нескольких пакетов в есть) -- и вернуло номер, который будет использоваться для идэнтификацыи сокета в этом процэссе. Передать открытый сокет другому процэссу в том жэ экземпляре ОС (до перезагрузки) -- вполне реально (см. SCM_RIGHTS).
 Поскольку существующие сервера БД совершэнно не предназначены работать хранителями пользовательских сокетов -- то передать открытый сокет в существующую БД никак невозможно (в БД нет процэдуры, спецыального кода, который мог бы получить ужэ открытый сокет), обратно -- тожэ, да и хранить его в БД негде.
Но, конечно, можно написать свою БД, которая будет работать именно свалкой открытых сокетов.

PM MAIL   Вверх
lollollollol
Дата 24.9.2014, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



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


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


Тогда такой вопрос, установлен обычный FreeBSD сервер, с ISPManager, существуют ли какие модули или расширения для разработки многопоточного приложения, и работы с сокетами?
PM MAIL   Вверх
baldina
Дата 24.9.2014, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



можно форкнуть дочерний процесс через pcntl_fork(). все открытые дескрипторы будут ему доступны.
http://ideone.com/ngUvH1

Добавлено через 5 минут и 6 секунд
хотя идея передавать в разные процессы дескриптор сокета, открытого на прослушивание, весьма странная.
слушает один процесс. при запросе соединения запускается дочерний для его обработки (при этом accept() возвращает новый дескриптор, связанный с конкретным соединением).
PM MAIL   Вверх
baldina
Дата 24.9.2014, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



ЗЫ: проблема хранения в бд не только в том, что resource это внутренняя структура zend engine, но и в правах на дескриптор. даже зная значение, произвольный процесс не сможет им воспользоваться: в php нет способа установить права на сокет (если таки есть, поправьте меня).
PM MAIL   Вверх
tzirechnoy
Дата 24.9.2014, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Цитата
но и в правах на дескриптор. даже зная значение, произвольный процесс не сможет им воспользоваться: в php нет способа установить права на сокет (если таки есть, поправьте меня).


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

Передать любой дескриптор другому процэссу -- вполне можно, см. man unix по слову SCM_RIGHTS.

Добавлено через 8 минут и 40 секунд
Цитата
Получается в php запуск нового скрипт можно сравнить с запуском нового приложения? 


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


Цитата
существуют ли какие модули или расширения для разработки многопоточного приложения, и работы с сокетами?


Наверное, есть, не знаю (если потребуется -- пойду в гугль). А Вам зачем? То есть  мне просто достаточно сложно представить задачу, в которой приложэние на php имело бы смысл делать многопоточным. Сложная асинхронная логика с большыми временами ожыдания? Это всё равно web-API -- так и делай логику через собирание RPC/веб-запросов.
Нужна скорость при большых объёмах операцый на совместно используемой памяти? Перепишы с PHP на C -- будет в разы быстрее, чем все варианты php с трэдами.
PM MAIL   Вверх
baldina
Дата 24.9.2014, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



Цитата(tzirechnoy @  24.9.2014,  16:30 Найти цитируемый пост)
см. man unix

в unix, но не php

файловые дескрипторы у каждого процесса свои, но ОС умеет делать копии для другого процесса. для дочерних процессов это делается автоматически, для чужих есть sendmsg. не очень понятно как это использовать в php даже несмотря на наличие в 5.5 socket_sendmsg()

Цитата(tzirechnoy @  24.9.2014,  16:30 Найти цитируемый пост)
модули или расширения для разработки многопоточного приложения

помимо упомянутого fork() в php есть расширение pthreads, представленное классами Thread, Worker и тд

Цитата(tzirechnoy @  24.9.2014,  16:30 Найти цитируемый пост)
сложно представить задачу, в которой приложэние на php имело бы смысл делать многопоточным

а на Python?
PM MAIL   Вверх
tzirechnoy
Дата 24.9.2014, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Цитата
а на Python?


А для питона сложно представить хоть какую-то задачу, которую бы имело смысл на нём делать.

Но, в отличие от PHP -- python -- это менее обязательно web, а в варианте классического демона асинхронная логика на трэдах можэт иметь смысл. И в варианте пользовательского приложэния -- тожэ. Хотя это само по себе, конечно, несколько на любителя. Ну, то есть, по сравнению например с erlang все такие вещи, кроме сделанных на Си для скорости или на java для простоты установки на кофеварки, выглядят безсмысленно переусложнёнными. А уж на мой личный взгляд -- так и событийно-ориентированная машына состояний удобнее будет.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0734 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.