PHP - отправка данных из одного процесса в другой - PullRequest
0 голосов
/ 06 ноября 2010

У меня есть два PHP-файла, которые выполняются в течение длительного времени (без ограничений на выполнение). Один из файлов используется для проверки некоторых данных на удаленном сервере. Чтобы сделать его более эффективным, я запустил несколько экземпляров файла # 1. Предполагается, что второй файл выполняет действие после получения верного ответа любым из файлов # 1.

Вопрос - как передать данные из одного исполняемого файла в другой? Первой идеей было сохранить данные в файл по файлу № 1 и с файлом № 2 регулярно проверять время изменения файла. Проблема в том, что это вызывает большую нагрузку на сервер, и если я ограничиваю его с помощью функции ожидания, минимальное время ожидания, которое я могу достичь, составляет 1 мс (квант времени системы Linux - есть ли способ изменить его)? Итак - может быть, у кого-нибудь есть идеи, как еще передавать информацию от одного процесса другому?

$last = filemtime('action.txt');
while(!$stop) {
  if($last != filemtime('action.txt')) { echo microtime(true); $stop = 1; }
  clearstatcache('action.txt');
  usleep(100);
  $i++;
}

Все, что ниже

С уважением, Jonas

Ответы [ 3 ]

1 голос
/ 06 ноября 2010

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

1 голос
/ 06 ноября 2010

Множество отзывов.

Во-первых, я прав, предполагая, что вы размещаете эти файлы на веб-сервере и вызываете их, «открывая» их в веб-браузере.Я спрашиваю об этом из-за "нет предела исполнения", упомянутого в вопросе.вам следует подумать о написании и запуске ваших PHP-скриптов в CLI, если только у вас нет каких-либо ограничений в вашей архитектуре хостинга.Игнорируйте это, если вы уже запускаете их как скрипты CLI.

Во-вторых, поскольку другие предлагают использовать API сокетов TCP / IP, доступный в PHP, для соединения между двумя скриптами, при этом один скрипт является сервером ивторое - клиент.Если вы не знакомы с этим, может пройти некоторое время, прежде чем вы сможете сделать это правильно.так что вы можете пока игнорировать это.

В-третьих, почему проблема в том, что минимальная продолжительность сна составляет 1 мс?это сбивает с толку меня, потому что, с одной стороны, вы говорите, что используете сон, потому что без него нагрузка высока.С другой стороны, вы хотите спать менее 1 мс ... в идеале вы должны спать 5 секунд, 10 секунд или более, в зависимости от того, как часто будет обновляться файл, и сколько времени вам нужноответь на это.если вам нужен почти мгновенный ответ, вы можете попытаться сделать то, что делает хвостовая утилита Linux.Это то, что делает расширение груши inotify (упомянутое другим плакатом передо мной).Если это очень серьезное приложение, и вам нужно очень быстрое время отклика, вам следует рассмотреть возможность использования операционной системы в реальном времени.RTOS даст вам спать менее 1 мс.

В-четвертых, если эти два сценария будут находиться на одном и том же сервере (и всегда на одном и том же сервере), вы можете рассмотреть другие варианты, например совместную память.

1 голос
/ 06 ноября 2010

использовать расширения PHP inotify (http://www.php.net/manual/en/intro.inotify.php, URL-адрес расширения http://pecl.php.net/package/inotify). Он сообщит вашему процессу об изменении файла. В противном случае вы можете использовать простой сокет для вызова второго сценария.

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