2012-12-12 3 views
0

Я построил небольшой PHP-сервер/клиентский код. Когда я говорю клиентский сервер, я имею в виду, что он действует как клиент и сервер, чередующийся на 5 секунд в каждом режиме.PHP socket alternate listen/connect

Теперь код запускается на двух серверах и запускается cron.

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

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

Кому-нибудь удается это сделать успешно? Как?

+0

Это, вероятно, способ облегчить нам помощь. В чем разница между сервером и клиентом? Для чего это? Если вы хотите, чтобы это работало, без смешивания двух процессов - я предлагаю каждому графику кода следующий процесс сервер/клиент. Поэтому, когда сервер завершает свою работу, вы планируете процесс клиента - и когда клиентский процесс выполняется, вы планируете процесс сервера. – Daniel

+0

Купил триггер тот же процесс. Отправка выбранных данных в другую. И поскольку я не хочу, чтобы кто-то был сервером, а другой клиент вызывал на каком-то этапе, в игре будет больше одного сервера. – transilvlad

+0

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

ответ

1

Здесь вы указали race condition. Независимо от того, как вы попытаетесь синхронизировать их, вы в конце концов столкнетесь с проблемой.

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

+0

Пробовал это. Первое, что я пробовал. Тот же вопрос. Иногда два сервера подключались к серверной части друг друга, но они находились в клиентской части по требованию и просто висели там, ожидая ответа другого до истечения времени ожидания. и затем цикл начинается снова. Пробовал с небольшим случайным периодом сна. Еще одно и то же. Если я каким-то образом не отсоединяю серверную часть, не закрывая ее, как закрывающие причины порой неспособность переподчинить один и тот же порт. Постскриптум Да, я установил возможность повторного использования addr. – transilvlad

+0

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