Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > "вечный" процесс


Автор: klyxa 28.7.2008, 16:12
привет. у меня следущая ситуация..
есть сервер А(интерфейс), он получает запросы от клиентов(пользователей). далее,предположим, ему необходимо сделать выборку из базы расположенной на сервере Б.запрос передается скрипту,навешенному на базу,на сервере Б.
у меня вопрос-можно ли сделать,чтобы процесс на сервере Б постоянно выполнялся? ну т.е. я пропишу set_time_limit(0);, а не обрубит ли сам сервер процесс?
т.е. если грохнеца скрипт на сервере Б..то.хана..)

Автор: WolfON 28.7.2008, 16:31
ага и для каждого нового обращения у вас будет висеть в памяти еще один бесконечный скрипт, пока не кончится память и не упадет апач

Автор: skyboy 28.7.2008, 16:31
Цитата(klyxa @  28.7.2008,  15:12 Найти цитируемый пост)
а не обрубит ли сам сервер процесс?

вполне возможно. даже если по соображениям безопасности set_time_limit прокатит, то уж превышение лимита памяти, вполне вероятное при малюсенькой утечке, но особо длительном выполнении, сервер "не простит".
Цитата(klyxa @  28.7.2008,  15:12 Найти цитируемый пост)
ему необходимо сделать выборку из базы расположенной на сервере Б.запрос передается скрипту,навешенному на базу,на сервере Б.

ну. скрипт А обращается к скрипту Б на другом сервере, тем самым инициируя его выполнение. скрипт А по отношению к скрипту Б - такой же клиент, как какой-то браузер в отношении скрипта А. категорически не понимаю, зачем тебе "вечный цикл скрипта Б". скрипт А же не закольцован! Вполне себе запускается только при обращении клиента...
Цитата(klyxa @  28.7.2008,  15:12 Найти цитируемый пост)
чтобы процесс на сервере Б постоянно выполнялся?

гарантировано от сбоев - т.е. чтоб процесс выполнялся даже тогда, когда сервер упал - нельзя. но в любом случае, исполняемый файл-демон-сервер, запускаемый под (Fast)CGI более стабилен, потому как зависит от меньшего количества параметров. Зачем тебе в данном случае скрипт, исполняемый РНР, который запускается из-под Apache или другого НТТР-сервера - я не понимаю.

Автор: klyxa 28.7.2008, 16:53
мне надо скрыть существование сервера Б и сделать безопасным передачу данных А-Б. вобще, насчет "скрыть существование" таким способом это какбы сказать пожелание заказчика..
Цитата

ага и для каждого нового обращения у вас будет висеть в памяти еще один бесконечный скрипт, пока не кончится память и не упадет апач

Цитата

даже если по соображениям безопасности set_time_limit прокатит, то уж превышение лимита памяти, вполне вероятное при малюсенькой утечке, но особо длительном выполнении, сервер "не простит".

согласен.

мне кажется,что наиболее оптимальным будет установка ssl соединения  с сервером Б. передача непосредственно запросов и получие ответов, без интерфейса на сервере Б..?
http://dev.mysql.com/doc/refman/5.0/en/secure-connections.html
ээ,что скажете?)

Автор: Mal Hack 28.7.2008, 16:58
Есть два варианта.
1. Нормальная реализация на ПХП, без циклов и т.п. Тут либо шифровать, либо SSL. Шифровать - в данном случае достаточно, хотя надо более детально задачу смотреть.
2. Пишите демон на С++ например или Перле. Тогда проблем не будет.

Цитата(skyboy @  28.7.2008,  17:31 Найти цитируемый пост)
вполне возможно.

Будет 100%. Зависит от настроек веб-сервера.

Автор: skyboy 28.7.2008, 17:37
Цитата(klyxa @  28.7.2008,  15:53 Найти цитируемый пост)
мне надо скрыть существование сервера Б

от клиента, обратившегося к А, существование Б и так незаметно. Если у тебя не редирект на сервер Б, конечно.
Цитата(klyxa @  28.7.2008,  15:53 Найти цитируемый пост)
передача непосредственно запросов и получие ответов, без интерфейса на сервере Б..?

в любом случае интерфейса нету. в одном случае, браузер парсит полученный HTML и строит "внешний вид". в другом случае, сервер А получает от сервера Б HTML(xml?) и ничего не "строит", а строит логику на основании полученных данных. В любом случае, скрипту на сервере Б нет нужды входить в "вечный цикл". От тебя, кстати, аргументации вечному зацикливанию так и не увидел.
Цитата(klyxa @  28.7.2008,  15:53 Найти цитируемый пост)
и сделать безопасным передачу данных А-Б

обезопасить от чего? впрочем, если про SSL сам заговорил, то, пожалуй, в подробности вдаваться и не буду. Хотя общение между "своими" двумя серверами можно и чем попроще шифровать...

Автор: sTa1kEr 28.7.2008, 22:02
Цитата(klyxa @  28.7.2008,  17:12 Найти цитируемый пост)
ну т.е. я пропишу set_time_limit(0);, а не обрубит ли сам сервер процесс?

Помимо таймаута PHP, есть так же http://httpd.apache.org/docs/trunk/mod/core.html#TimeOut. Однако скрипту запущенному отдельным интерпретатором не что не помешает работать сколько угодно долго.

Цитата(klyxa @  28.7.2008,  17:53 Найти цитируемый пост)
мне надо скрыть существование сервера Б и сделать безопасным передачу данных А-Б. вобще, насчет "скрыть существование" таким способом это какбы сказать пожелание заказчика..

Я правильно понял, что вы хотите скрыть сам факт наличия apache на сервере Б? Тогда проще всего просто повесить apache на другой порт, отличный от 80.

Автор: klyxa 29.7.2008, 00:25
Цитата

От тебя, кстати, аргументации вечному зацикливанию так и не увидел.

да я просто отказался от этой идеи..и решил промолчать..) сорь еси чо)
Цитата

обезопасить от чего?

ну я уже могу перехватить трафик,поэтому разумно будет шифровать)
Цитата

отя общение между "своими" двумя серверами можно и чем попроще шифровать... 

а подскажи как именно, ssl не подарок,конечно.
Цитата

Помимо таймаута PHP, есть так же таймаут apache. Однако скрипту запущенному отдельным интерпретатором не что не помешает работать сколько угодно долго.

да не..идея плохая. по сути..если ломается сервак А, то узнаются настройки доступа к Б и все ssl и пр. идут лесом.
Цитата

Я правильно понял, что вы хотите скрыть сам факт наличия apache на сервере Б? Тогда проще всего просто повесить apache на другой порт, отличный от 80.

хмм..ну я об этом не думал,но идейка то хороша..

Автор: Mal Hack 29.7.2008, 09:50
Цитата(klyxa @  29.7.2008,  01:25 Найти цитируемый пост)
а подскажи как именно, ssl не подарок,конечно.

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

Автор: klyxa 29.7.2008, 14:02
а вот 2 ключа..известных серверу(ам)..т.е...шифрование на php. я предположу,что и дешифровка на php т.е. уже образуется интерфейс вокруг базы..) или я не знаю всех тонкостей?если так, то дайте плиз,что почитать.

Автор: Mal Hack 29.7.2008, 16:01
Цитата(klyxa @  29.7.2008,  15:02 Найти цитируемый пост)
а вот 2 ключа..известных серверу(ам)..т.е...шифрование на php. я предположу,что и дешифровка на php т.е. уже образуется интерфейс вокруг базы..) или я не знаю всех тонкостей?если так, то дайте плиз,что почитать. 

Принцип такой. То, что вы хочеше отправить на удаленный сервер - шифруете, с ключом.  На удаленном сервере дешифровываете.
В вашем случае - можете передавать SQL запрос таким образом, в качестве строки, а в начало вставить подстроку вида "AAA#", чтобы можно было удостовериться, что расшифровали верно. Вырезаем эту часть, а оставшуюся (SQL запрос) отправляем на выполнение.

http://ru.php.net/manual/ru/book.mcrypt.php - шифрование/дешифрование
http://ru.php.net/manual/ru/book.mhash.php - тоже гляньте
http://ru.php.net/manual/ru/book.openssl.php - OpenSSL  на крайний случай

Автор: klyxa 29.7.2008, 18:00
спасибо

ууу. юбилейный пост..)

Автор: Resha 22.10.2008, 17:58
Цитата(sTa1kEr @ 28.7.2008,  22:02)
Цитата(klyxa @  28.7.2008,  17:53 Найти цитируемый пост)
мне надо скрыть существование сервера Б и сделать безопасным передачу данных А-Б. вобще, насчет "скрыть существование" таким способом это какбы сказать пожелание заказчика..

Я правильно понял, что вы хотите скрыть сам факт наличия apache на сервере Б? Тогда проще всего просто повесить apache на другой порт, отличный от 80.

Или сделать ответ 404 для любых чуваков, у которых IP не является IP сервера A smile

А лучше все вместе.

При этом еще и авторизацию повесить.

Потом шифрование (желательно по известному обоим ключу и еще и времени, когда был сделан запрос сервером А), из параметров проверки безопасности передавать только ключ и время запроса. Сервер Б смотрит, чтобы время запроса отличалось не более чем, предположим, на 1 минуту, потом сверяет какие-нибудь sha1 по ключу и времени запроса. Если время больше 1 минуты - выдает 404. Смысл передачи времени, думаю, понятен - если кто-то затырит шифрованный ключ, то через минуту он станет уже невалидным smile

От серверов требуется синхронное время (с разницей не более чем в 10-15 секунд) и общий ключ для шифрования.



Вообще, тоже не понимаю, зачем нужен именно демон. По-моему, мы говорим о RESTе или веб-сервисах smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)