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


Автор: Rodman 11.6.2010, 22:28
Дароф

интересует вопрос - "Как написать веб сервис, который бы слушал конкретный порт и получал пакеты для обработки?"

Сейчас пока выкручиваюсь так что запускаю PHP.EXE + скрипт для обработки входящего пакета.

но это временное решение и интересует как мне это сделать программно?

Сенкс

Автор: Vasay 11.6.2010, 22:53
Rodman

Поставить апач (или другой web сервер), настроить его на нужный порт. Реализовать бизнес логику средствами PHP (коли раздел по PHP). 

А в чем, собственно проблема?


Цитата

PHP.EXE + скрипт для обработки входящего пакета.

??? Не представляю техническую реализацию подобного.  (Ну, впринципе, можно конечно - но не нужно)

Автор: Rodman 11.6.2010, 22:56
Цитата(Vasay @  11.6.2010,  22:53 Найти цитируемый пост)
Поставить апач (или другой web сервер), настроить его на нужный порт. Реализовать бизнес логику средствами PHP (коли раздел по PHP). 

стоит пока на локалке денвер и работает с провайдером сервиса в инете... который ответы присылает сам и я их принимаю и парсю.

так вот если апач то как и где настроить?

т.е. мой сервис должен в любой момент быть готовым принять пакет

Автор: gcc 11.6.2010, 22:58
Socket?

Автор: Vasay 11.6.2010, 23:00
Цитата


стоит пока на локалке денвер и работает с провайдером сервиса в инете... который ответы присылает сам и я их принимаю и парсю.



Не понял.... так кто инициирует соединение? Т.е. Вам нужно сделать web-сервис? Или клиент для чужого web-сервиса?

Автор: Fortop 12.6.2010, 15:05
Цитата(Rodman @  11.6.2010,  22:28 Найти цитируемый пост)
Как написать веб сервис, который бы слушал конкретный порт и получал пакеты для обработки?

SOAP/RPC нет?

Автор: Rodman 13.6.2010, 20:23
сори... перефразирую... не правильно начал понятие продвигать....
итак

1. Необходим серверный агент (демон), который будет постоянно работать на сервере и слушать нужный порт.
2. Скрипт работы его уже есть
3. Вопрос - как запустить этого агента (демона) на хостинге в интернете?
4. Будет ли сервак хостига - его рубить? следовательно - что делать в этом случае? агент должен работать постоянно.

Автор: Vasay 13.6.2010, 21:15
Rodman


Цитата

1. Необходим серверный агент (демон), который будет постоянно работать на сервере и слушать нужный порт.


А чем не устраивает Apache web сервер который есть на любом хостинге, разве что порт могут не дать поменять?


Вы пытаетесь изобрести велосипед. Читайте про Web-сервисы.  По сути все так же как и в случае с WEB сайтом, только вместо HTML вы должны отдать XML.

http://www.google.com/#hl=en&source=hp&q=web+%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81+%D0%BD%D0%B0+php&aq=f&aqi=&aql=&oq=&gs_rfai=&fp=8e221186758f4b31. Особо не вчитывался, но на первый взгляд на хабре неплохо написано http://habrahabr.ru/blogs/php/46374/ 


Ну если уж так хочется изобрести велосипед, и написать свой сервер, то выбирать нужно из языков поддерживающих многопоточность.  Только писать свой web-сервер Вам не нужно.

Автор: Rodman 13.6.2010, 22:28
так вот про велосипеды.

апач веб сервер слушающий порты 80 (8080)...
но есть мой агент который должен может параллельно. а мож быть интергирован в апач но постоянно работать и получать пакеты...

Цитата(habrahabr.ru @  13.6.2010,  21:15, [URL=http://habrahabr.ru/blogs/php/4637)
http://habrahabr.ru/blogs/php/46374[/URL]]Теперь заставим наш граббер отрабатывать раз в сутки в 10:00 утра, путем добавления команды запуска граббера в таблицы cron:

0 10 * * * /usr/bin/php /path/to/grabber.php

тут вот тока запускается, но мне надо чтобы он работал без перерыва!

т.е. 
1. как проверить и поднять?
2. что и где прописать (поднят или нет)?
3. сколько позволено работать в бесконечном цикле?

Автор: Vasay 13.6.2010, 22:40
Rodman

Цитата


апач веб сервер слушающий порты 80 (8080)


Апач может слушать любой порт.  
Цитата(Rodman @  13.6.2010,  22:28 Найти цитируемый пост)
Цитата(habrahabr.ru @  13.6.2010,  21:15, http://habrahabr.ru/blogs/php/46374
Теперь заставим наш граббер отрабатывать раз в сутки в 10:00 утра, путем добавления команды запуска граббера в таблицы cron:

0 10 * * * /usr/bin/php /path/to/grabber.php

тут вот тока запускается, но мне надо чтобы он работал без перерыва!



Во первых поправьте ссылку на хабру (4-ку потеряли)

Во вторых - прочитайте статью, а не пролистайте.   Grabber.php в данном примере к веб-сервису отношения имеет весьма косвенное - этот скрипт лишь раз в сутки выдирает курсы валют с со страниц сайта НБУ (Национального Банка Украины). 

Автор: HmeL 18.6.2010, 14:47
ЗАБУДЬТЕ ПРО ВЕБ-СЕРВИС

С самомго начала:

1. Есть сайт на удаленном хостинге.
2. Есть другой сайт, к которому можно подконнектиться с помощью fsockopen, послать определенный пакет  - тогда в ответ начнут сыпаться пакеты. если ничего не слать - в ответ ничего сыпаться не будет.
3. Есть скрипт (php), который осуществляет коннект к другому сайту и обработку этих ответных пакетов. Скрипт запускался вручную на локальной машине (php.exe <имя_скрипта>)

ВНИМАНИЕ, ВОПРОС!
Как на удаленном хостинге стартовать этот скрипт?
Как автоматически запустить его снова, если он вдруг выключится по неперехватываемому exception?
Как долго разрешено такому скрипту находится в рабочем состоянии?

Автор: skyboy 18.6.2010, 15:08
HmeL, ты - Rodman? или просто влом новую тему создать?

Автор: HmeL 18.6.2010, 15:18
Я, это я. Родман - мой коллега, который сидит в соседнем кабинете. Бьемся над одной проблемой. Гугл мне не в помощь - потому что не уверен в правильности терминологии. Поэтому и обращаюсь к вам за помощью

Автор: Vasay 18.6.2010, 15:30
HmeL

Что-то мне кажется, что вы сильно мудрите.  


С какой периодичностью вам надо забирать данные?  Может не надо ничего держать постоянно запущенным  и достаточно использовать CRON ?

На обычном хостинге вам никто не даст иметь своего демона. Нужен, как минимум, какой-нибудь "продвинутый" хостинг или vps. 

Автор: Fortop 18.6.2010, 15:32
HmeL

Показываю на пальцах.

Есть сайт на нем размещаем скрипт SOAP-сервер (можно делать и на сокетах).
Есть другой сайт где стоит скрипт SOAP-клиент (можно делать и на сокетах)

Делаем раз 
В браузере site1.com/client.php?start=&get=content
Делаем два
В командной строке wget site1.com/client.php?start=&get=content
Делаем три
На удаленном хостинге ssh user@serverip php /path/to/script/client.php start get=content

О том как поднимать скрипт автоматически - гуглим "демоны на php"




Автор: HmeL 18.6.2010, 15:54
Цитата(Vasay @  18.6.2010,  15:30 Найти цитируемый пост)
С какой периодичностью вам надо забирать данные?  Может не надо ничего держать постоянно запущенным  и достаточно использовать CRON ?


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

CRON, хм... сейчас погуглю


Цитата(Fortop @  18.6.2010,  15:32 Найти цитируемый пост)
На удаленном хостинге ssh user@serverip php /path/to/script/client.php start get=content


а эту строку где прописывать надо? в httpd.conf ?



Цитата(Fortop @  18.6.2010,  15:32 Найти цитируемый пост)
О том как поднимать скрипт автоматически - гуглим "демоны на php"


Погуглю

Автор: Fortop 18.6.2010, 16:04
Цитата(HmeL @  18.6.2010,  15:54 Найти цитируемый пост)
Цитата(Fortop @  18.6.2010,  15:32 Найти цитируемый пост)
На удаленном хостинге ssh user@serverip php /path/to/script/client.php start get=content

а эту строку где прописывать надо? в httpd.conf ?

Эм?

Вы же запускать что-то собирались на удаленном хостинге?
Это команда для linux набираете ее в консоли на локальной машине.
Под Win проще воспользоваться putty

Хотя было бы еще проще, если бы вы немного пояснили задачу. Возможно, половина танцев с бубном просто не нужна.



Автор: HmeL 18.6.2010, 16:14
в предыдущем посте задачу прояснил - конкретнее некуда.

Цитата(Fortop @  18.6.2010,  16:04 Найти цитируемый пост)
Это команда для linux набираете ее в консоли на локальной машине.Под Win проще воспользоваться putty


стартанул я его, отлично. а что делать когда он упал? просыпаться в 3 ночи и прописывать в командной строке снова?



Vasay, За КРОН - большое человеческое, буду ковырять

Автор: Vasay 18.6.2010, 16:31
HmeL


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


Правильно?


И Вам нужно написать клиента к этому серверу?

Автор: HmeL 18.6.2010, 17:15
Vasay, Понял правильно, только этот сервер по своему таймауту шлет запрос на разрыв соединения. в этом случае агент засыпает на минуту и создает новое соединение. Клиент уже написали. Протестирован на локале, на денвере, тепреь пытаемся запустить эту неведомую #@$ню на хостинге smile

Автор: Vasay 18.6.2010, 17:38
HmeL

Если хостинг дает доступ по ssh (если он не дает, то Вам такой хостинг не подходит) заходите на сервер по ssh (длы виндовс используете программу putty).

Я запускаю демонов таким скриптом (т.е. создаю файлик с этим скриптом, ставлю на него права на исполнение):

Код

#!/usr/bin/perl
use POSIX qw(setsid);
chdir 'Путь к папке с программой'                 or die "Can't chdir to /: $!";
umask 0;
open STDIN, '/dev/null'   or die "Can't read /dev/null: $!";
open STDOUT, '>run.log' or die "Can't write run.log: $!";
open STDERR, '>error.log' or die "Can't write error.log: $!";
defined(my $pid = fork)   or die "Can't fork: $!";
exit if $pid;
setsid                    or die "Can't start a new session: $!";
system("команда запуска нашей программы");


комманда запуска в вашем случае "php имя_скрипта"

Но вот хостинг, скорей всего будет этот скрипт убивать. Так что лучше взять какой-нибудь дешевый VPS

Автор: HmeL 18.6.2010, 17:47
Vasay, хостер поддерживает ssh и cron. я уже поменял код демона, он отрабатывает 100 циклов и шатдаунится. в крон прописал старт каждые 5 минут - так что с этим проблем нет.

пока что мучаемся через putty подключится к хостингу с помощью сгенеренного .ppk файла, но безрезультатно.

может есть другие методы? напрямую по айпи можно подключится?

Автор: Fortop 18.6.2010, 18:18
Цитата(HmeL @  18.6.2010,  16:14 Найти цитируемый пост)
в предыдущем посте задачу прояснил - конкретнее некуда.

Абстрактно и ни о чем.
Мы пульнем пакеты, нам начнут сыпаться пакеты. 
Зачем, почему - не понятно. Кто сказал что вообще нужно делать именно так?

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

Цитата(HmeL @  18.6.2010,  16:14 Найти цитируемый пост)
стартанул я его, отлично. а что делать когда он упал? просыпаться в 3 ночи и прописывать в командной строке снова?

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

Автор: Rodman 21.6.2010, 00:40
Fortop, задача - отправить пакет одним агентом. а вторым получить подтверждение доставки.

вроде все получилось с отправкой. вот с получением подтверждением пока не справились, но возник вопрос - как проверить количество запущенных агентов кроном и рубануть их при надобности (есть подозрения что запустилось несколько)?

Автор: Fortop 21.6.2010, 10:56
Цитата(Rodman @  21.6.2010,  00:40 Найти цитируемый пост)
Fortop, задача - отправить пакет одним агентом. а вторым получить подтверждение доставки.

Вот если бы не выдумывали велосипедов, то и проблем бы не имели.
SOAP дает возможность получить подтверждение о приеме данных.

Цитата(Rodman @  21.6.2010,  00:40 Найти цитируемый пост)
но возник вопрос - как проверить количество запущенных агентов кроном и рубануть их при надобности

А вы не хотите сделать 1 вопрос - 1 тема?

запущенные процессы можно посмотреть при помощи 
Код

ps ax | grep progname

Автор: Rodman 21.6.2010, 12:03
Цитата(Fortop @  21.6.2010,  10:56 Найти цитируемый пост)
Вот если бы не выдумывали велосипедов, то и проблем бы не имели.
SOAP дает возможность получить подтверждение о приеме данных.

работа происходит по определенному протоколу. поэтому SOAP отбросили.


Цитата(Fortop @  21.6.2010,  10:56 Найти цитируемый пост)
запущенные процессы можно посмотреть при помощи 

я не имею доступа к серверу через командную строку.
я думал на РНР есть какой нить вариант

Автор: Fortop 21.6.2010, 17:17
Цитата(Rodman @  21.6.2010,  12:03 Найти цитируемый пост)
работа происходит по определенному протоколу. поэтому SOAP отбросили.

Я об этом и писал. Зачем придумывать свой левый протокол, который не поддерживает подтверждения успешности операции?
Вот теперь и отгребаете проблемы на ровном месте.

Цитата(Rodman @  21.6.2010,  12:03 Найти цитируемый пост)
я думал на РНР есть какой нить вариант 

PHP тем и удобен что он позволяет легко связывать кучу разных вещей, которых в нем нет.
А вариант есть - я писал о нем.
Цитата(Fortop @  18.6.2010,  18:18 Найти цитируемый пост)
Для этого надо стартовать не сам процесс, а мастер-процесс.
Который и будет контролировать работу дочерних. Упал дочерний - подняли его. 


Вопрос множества мастер-процессов решается путем lock.файла

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