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


Автор: Viroman 22.7.2009, 15:15
Здравствуйте дорогие форумчане!

У меня возник вопрос, необходимо между двумя запущенными скриптами создать обмен информацией. Каким образом это можно реализовать не прибегая к сокетам, поскольку на конечном сервере сокетные пхп соединения запрещены, и как это сделать не прибегая к обмену через файлы, и коль уже нельзя иначе, чем ререз файлы, как сделать так, чтобы скрипт реагировал только тогда, когда в файле новые данные поступили.
Есть ли идеи реализации? Буду очень прекрайне благодарен за наводку.

Далее вопрос номер два, скрипт подаёт данные на скачку, предположим какой нибудь файл, мне очень крайне важно контроллировать скорость этой передачи, чтобы та не превышала опеределённого значения заданного мною. Можно ли и это сделать? Именно скажем, чтобы данные не поступали быстрее одного байта в секунду, предположим. И за решение этой задачи буду прекрайне благодарен.

Автор: skyboy 22.7.2009, 20:45
вопрос об ограничении скорости отдачи вынеси в новую тему. 
обсуждение двух вопросов в одной теме - это будет бардак.

Автор: MoLeX 23.7.2009, 05:25
Цитата(Viroman @  22.7.2009,  15:15 Найти цитируемый пост)
У меня возник вопрос, необходимо между двумя запущенными скриптами создать обмен информацией.

скрипты запущены на одном домене? или же вообще на разный хостинг-площадках?

Автор: nerezus 24.7.2009, 05:36
Цитата

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

Цитата

Можно ли и это сделать? 
 Да. Паузами.

Автор: Viroman 25.7.2009, 14:08

Цитата

скрипты запущены на одном домене? или же вообще на разный хостинг-площадках? 

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

Цитата

Купить платный хостинг.

Плохой совет, ещё идеи?


Цитата

 Да. Паузами. 

Но паузами будет ведь не совсем то, или? Какой это контроль за скоростью, если данные будут рывками передаваться, но с полной скоростью.

Автор: Mal Hack 25.7.2009, 14:15
Цитата(Viroman @  22.7.2009,  16:15 Найти цитируемый пост)
как сделать так, чтобы скрипт реагировал только тогда, когда в файле новые данные поступили.

Смотрите в область Семафоров и мютексов (этого в пхп нет, придется самому реализовывать).
http://ru2.php.net/manual/en/book.shmop.php
http://ru2.php.net/manual/en/book.sem.php

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

Цитата(Viroman @  22.7.2009,  16:15 Найти цитируемый пост)
и как это сделать не прибегая к обмену через файлы,

В PHP никак, т.к. доступ к другим ресурсам напрямую, как пямять, у PHP закрыт.

Автор: ksnk 25.7.2009, 14:33
Viroman, О каких скоростях/реактивностях обмена информацией идет речь? Чем не устраивают простые реализации chat'ов?
Все, что немного посложнее/побыстрее/пореактивнее - требует открытых портов и отдельного гемороя с настройкой соответствующего софта.

Для частной задачи общения специально подобранных юзеров можно написать Java аpplet, ActiveX или еще какую фенечку...

Автор: Viroman 25.7.2009, 23:16
Ладно, фиг с ним со скоростью, не так страшно, если по байту отдавать на растяжении определённого времени. А вот обмен между скриптами нужно сделать не только для одного юзверя, а доступным для всех, как при случае записи в файл. Конечно можно постоянно чекать дату последнего изменения файла, но не будет ли это слишком накладно, если один и тот же скрипт запущенный тысячью пользователями будет проверять изменение какого либо файла, пусть хоть и не одного файла, а разного, но тем не менее.

Автор: Mal Hack 25.7.2009, 23:36
Viromanksnk, вы мой пост видели? 

Автор: Viroman 26.7.2009, 00:10
Mal Hack, спасибо большое, буду разбираться, единственное что пока хотелось бы, это простите за наглость, именно пример такого использования. Я конечно понимаю, если самому велосипед изобретать, но надеялся на пример готовой реализации. Спасибо большое, я буду разбираться.

Автор: Mal Hack 26.7.2009, 01:02
Примера дать не могу, т.к. сам такую реализацию на PHP не писал.
Глобально, смысл такой. Что юзайте shared memory по аналогии с общим файлом. Тут проблем быть не должно.
Что касается симафоров и мьютексов, то тут надо "вкуривать". Неплохой пример объяснения что это вообще - тут: http://doc.trolltech.com/4.5/threads-semaphores.html, правда не на PHP.
Про мьютексы тамже.

Автор: xZ0RGx 28.7.2009, 05:33
Скорость надо файрволлом шейпить, а не на PHP. smile

А относительно обмена могу предложить только не лучший вариант с БД.

Автор: IZ@TOP 31.7.2009, 12:57
Цитата(Viroman @  25.7.2009,  15:08 Найти цитируемый пост)
Цитата

Купить платный хостинг.

Плохой совет, ещё идеи?


Отличный совет. Решает сразу и второй вопрос.

Цитата(Viroman @  25.7.2009,  15:08 Найти цитируемый пост)
Цитата

 Да. Паузами. 

Но паузами будет ведь не совсем то, или? Какой это контроль за скоростью, если данные будут рывками передаваться, но с полной скоростью. 


Купить платный хостинг. Ограничить скорость на уровне системы. А вообще зависит от способа, которым Вы реализуете "общение" между процессами.

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

Как вариант дешевого способа решения задачи (хотя не много не оптимального), могу посоветовать SOAP.

Автор: nerezus 31.7.2009, 16:15
Автор теоретик просто.
Ну не знает, что нельзя 1k видео онлайн на фри хостинге сделать)

Автор: Viroman 3.8.2009, 02:09
Цитата

Отличный совет. Решает сразу и второй вопрос.

Ни первый, ни второй, никакой вопрос это не решает, у меня и так платный хостинг. Знаю, что его можно сменить, но я может это смогу сделать, а второй, третий жаждущий итп, нет.


Цитата

Автор теоретик просто.
Ну не знает, что нельзя 1k видео онлайн на фри хостинге сделать) 

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

Цитата

Скорость надо файрволлом шейпить, а не на PHP. smile

А относительно обмена могу предложить только не лучший вариант с БД. 

Не вопрос, чем надо шейпить, а что возможно, надо будет, можно и копытами шейпить, однако не решение. 
Насчёт БД, вот представьте ситуёвину.

Два физических клиента стучатся на внешний php скрипт(находящийся на одном и том же хостинге), стучатся они на неопределённое время, один стучится с намерением аплоадить, то есть посылает на вызванный скрипт нескончаемое количество информации, которая поступает время от времени(рывками, а может залпом, неважно, но постоянно, при этом максимальное время работы скрипта упускаем пока из виду, представим, что оно бесконечно), а другой наоборот, стучится к скрипту с намерением скачать с этого скрипта. Моя задача сконнектить этих двух индивидов так, чтобы у того, который информацию аплоадит, другой эту информацию забирал. По сути unixовые файл сокеты, это то, что нужно, то бишь мне не надо порт открывать(ибо как известно, их количество всё таки ограничено), и по сути можно совершать действия по мере поступления данных, то есть мне по сути не надо постоянно отпрашивать через скрипт, поступили ли новые данные или нет, за меня это сделает система, но загвоздка, даже платные хостинги не всегда любят сокетные соединения разрешать, вот поэтому и спрашивал, а что ещё возможно, может даже через обычные файлы, но с намёком на изменения в файле.
Вот было названо очень умное решение с шарингом памяти, очень заслуживающее внимания идея, только как там реализовать сокетное поведение, чтобы скрипт забирал данные именно по мере их поступления, а не постоянно отпрашивал в цикле, а не поступили ли новые данные? В общем такие вот дела. Да, я знаю, что это мои теории, предположения, как лучше сделать, чтобы не изобретать велосипед по новой, но судя по всему сознание отвечающих ограничено фразами о покупке платного хостинга, толковые мысли тяжело выудить.

Автор: youri 3.8.2009, 04:38
Viroman, расскажи подробнее про свой скрипт, что за данные передаются? Для чего все это?

Цитата(Viroman @  3.8.2009,  02:09 Найти цитируемый пост)
и по сути можно совершать действия по мере поступления данных

как? Принимающий скрипт запуститься когда закачка завершена. Как внешний скрипт может узнать, имя файла назначения? Это задача из области прогресс бар закачки, которая (насколько я знаю) исключительно средствами php не решается (есть вариант патчить php и еще можно perl-скрипт использовать)

Автор: IZ@TOP 3.8.2009, 15:42
Viroman, описанная Вами задача сильно напоминает онлайн-вещание. А столь оголтелые ответы Вы получили лишь потому, что реального вопроса толком не задали.
Для решения подобных задач существует множество проектов, однако, как организовать медиа-стриминг без использования сетевых технологий я не представляю.

Цитата(youri @  3.8.2009,  05:38 Найти цитируемый пост)
Принимающий скрипт запуститься когда закачка завершена. Как внешний скрипт может узнать, имя файла назначения? Это задача из области прогресс бар закачки, которая (насколько я знаю) исключительно средствами php не решается (есть вариант патчить php и еще можно perl-скрипт использовать) 

Или использовать http://habrahabr.ru/blogs/nginx/41502/  smile 

Автор: Viroman 3.8.2009, 16:53
Цитата

как? Принимающий скрипт запуститься когда закачка завершена. Как внешний скрипт может узнать, имя файла назначения? Это задача из области прогресс бар закачки, которая (насколько я знаю) исключительно средствами php не решается (есть вариант патчить php и еще можно perl-скрипт использовать)

1. Нет, принимающий скрипт запускается без ожидания, в этом то и фишка заключается.
2. Это не проблема, свой менеджер сессий это решит.
3. Прогресс бар мне за даром не нужен smile


Цитата

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

Я задал вопрос в корень, отмёл уже существующие возможности и прибавил свойство существующего окружения, в какой то мере это может на стриминг похоже, но это мне дефакто не нужно, мне всего лишь хотелось знать, можно ли между двумя запущенными скриптами на сервере без сокетов обмениваться информацией в реальном времени так, чтобы один скрипт забирал данные по мере их поступения, и всё. Конечно, я бы мог сделать так для худшего случая, например, один скрипт получает данные, предположим по килобайту и пишет их в файл, например, получил 1кб, записал в файл, ждёт, пока другой заберёт, другой смотрит последнюю дату изменения с последнего отпроса, если видит, что что то изменилось, считывает и обнуляет, и такая игра по новой. Естественно, я должен буду для такого случая в цикле отпрашивать состояния файлов, как же иначе. И вот этого мне хотелось бы избежать. Понимаю, что говорите, что никто не знает, ну раз нет, то нет, тогда тему можно закрывать. Любые другие склоки на тему, что типа не так вопрос задал, не так мы поняли, меня честно, не волнует, раз с первого раза до кого то не дошло, значит просто тот с этой проблемой не сталкивался, тогда и отвечать не стоит.

Автор: youri 3.8.2009, 17:21
Цитата(Viroman @  3.8.2009,  16:53 Найти цитируемый пост)
1. Нет, принимающий скрипт запускается без ожидания, в этом то и фишка заключается.

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

Цитата(Viroman @  3.8.2009,  16:53 Найти цитируемый пост)
Конечно, я бы мог сделать так для худшего случая, например, один скрипт получает данные, предположим по килобайту и пишет их в файл, например, получил 1кб, записал в файл, ждёт, пока другой заберёт, другой смотрит последнюю дату изменения с последнего отпроса, если видит, что что то изменилось, считывает и обнуляет, и такая игра по новой. Естественно, я должен буду для такого случая в цикле отпрашивать состояния файлов, как же иначе. И вот этого мне хотелось бы избежать

напиши функцию read, которая будет это делать. А потом забудь про ее реализацию. Как ты этого избежать хочешь. При передаче через сокеты ожиданий нету что ли?

p.s. мы так и будем решать сферическую проблему в вакууме или ты расскажешь все-таки, что ты делаешь?

Автор: IZ@TOP 3.8.2009, 18:31
Viroman, я полагаю, основная проблема при реализации данной задачи - состояние ожидания данных. Решить этот вопрос использованием функции sleep выглядит неподобающим образом, а другого способа, честно говоря, я не вижу/не знаю.

Цитата(Viroman @  3.8.2009,  17:53 Найти цитируемый пост)
можно ли между двумя запущенными скриптами на сервере без сокетов обмениваться информацией в реальном времени так, чтобы один скрипт забирал данные по мере их поступения

Думаю, это основная проблема, которую стандартными средствами PHP не решить.

И все же, можно не совсем скромный вопрос? 
Неужели 150 рублей в месяц (за хостинг с socket on), такая нереальная сумма?

Автор: WIPS 5.8.2009, 21:33
Тоже может быть не разрешено на хостинге, но можно еще посмотреть в сторону кешеров, кот. работают с памятью - http://ru2.php.net/manual/en/book.apc.php/http://xcache.lighttpd.net/. Такой себе аналог shared memory.

Автор: nerezus 5.8.2009, 22:50
Цитата

Тоже может быть не разрешено на хостинге
 А зачем пользоваться таким хостером?

Или так низко ценим свой труд, что за разницу в 150р готовы писать куеву хучу кода?

Автор: gcc 5.8.2009, 23:09
если я правильно понял, то тут можно придумать:

на 2 хостингах создать каталог вход и выход, в них файлы в которых записывать время передачи и т.д. или в 2 файлах записвать и парсить их..

UPDATE::bla::3434534345
INSERT::bla2::234234234
или в XML

чтобы 2 скрипта скачивали через 2-4 сек файлы друг у друга (смотря что они делают) и смотреть что передается, дальше думаю понятно... как обычные сокеты... на низкоуровневом программировании прейдется поработать  smile 

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