Я думаю, что решение, основанное только на PHP, будет трудно (почти невозможно) реализовать. Я придумал два решения вашей проблемы.
PHP / Redis решение
Вопрос, заданный Кендаллом:
- Насколько стабилен redis:
Redis очень стабильный. Разработчик действительно пишет некоторый чистый C-код. Вы должны проверить это на github;). Также много больших сайтов используют Redis. Например, github. У них был действительно интересный блог post , как они сделали github быстрым :). Также superfeedr использует redis . Есть гораздо больше крупных компаний, которые используют Redis;). Я бы посоветовал вам за это погуглить;).
- Насколько PHP-дружественен redis:
PHP очень удобен для PHP. Многие пользователи пишут PHP-библиотеки для Redis. Протокол действительно прост. Вы можете отладить его с помощью telnet;). Например, для быстрого просмотра predis реализована блокировка.
Я думаю, вы должны использовать что-то вроде ZRemCommand .
Redis - это расширенное хранилище ключей.
Это похоже на memcached но
набор данных не является изменчивым, а значения
могут быть строки, так же, как в
memcached, но также списки, наборы и
упорядоченные наборы. Все эти типы данных могут
манипулировать атомными операциями
выдвигать / вставлять элементы, добавлять / удалять
элементы, выполняющие объединение на стороне сервера,
пересечение, разница между наборами,
и так далее. Redis поддерживает разные
сортировка способностей.
Что я придумал (Псевдокод ....):
processor.php:
<?php
######----processer.php
######You should do something like nohup php processor.php enough times for processors to run event.
#$key: should be unique, but should also be used by wakeup.php
while(true) {
$event = blpop($key); #One of the available blocking threads will wakeup and process event
process($event); #You should write process. This could take some time so this process could not be available
zrem($key1, $event); #Remove event after processing it. Added this later!!!!!!
}
client.php:
######----client.php
######The user/browser I guess should generate these events.
#$key1: should be unique.
#$millis: when event should run
#$event: just the event to work on.
if ("add event") {
zadd($key1, $millis, $event);
} else if ("delete event") {
zremove($key1, $event)
}
#Get event which has to be scheduled first
$first = zrange($key1, 0, 0);
if ($oldfirst <> $first) { #got different first event => notify wakeup.php.
lpush($key2, $first);
}
$oldfirst = $first;
wakeup.php:
####wakeup.php
#### 1 time do something like nohup php wakeup.php
#http://code.google.com/p/redis/wiki/IntroductionToRedisDataTypes => read sorted set part.
while(true) {
$first = zrange($key1, 0, 0);
$event = blpop($key2, $timeoutTillFirstEvent);
if ($event == nill) {
#Blockingqueue has timedout which means event should be run by 1 of blocking threads.
blpop($key2, $first);
}
}
Нечто подобное можно было бы написать довольно эффективный планировщик, используя только PHP (хорошо, redis - это C, так что быстро :)), и это тоже будет довольно эффективно :). Я также хотел бы закодировать это решение, так что следите за обновлениями;). Я думаю, что мог бы написать пригодный прототип за день ....
Мое решение Java
Этим утром я думаю, что создал Java-программу , которую вы можете использовать для решения своей проблемы.
скачать
Посетите страницу загрузки github , чтобы загрузить файл jar (со всеми зависимостями).
установить :
java -jar schedule-broadcaster-1.0-SNAPSHOT-jar-with-dependencies-1277709762.jar
Запуск простых фрагментов PHP
- Первый
php -f scheduler.php
- Далее
php -f receiver.php
Вопросы
Я создал эти маленькие фрагменты, чтобы, надеюсь, вы поняли, как использовать мою программу. В WIKI .
Task Engine TaskQueue
Быстрое решение состоит в том, чтобы использовать очередь задач Google, которая имеет разумную бесплатную квоту. После этого вы должны заплатить за то, что вы используете.
Использование этой модели, задача App Engine
API очереди позволяет указывать задачи
как HTTP-запросы (как содержимое
запрос как его данные, а
целевой URL запроса в качестве его кода
ссылка). Программно ссылаясь
на связанный HTTP-запрос в этом
моду иногда называют «паутиной»
крюк. "
Важно, что автономный характер
API очереди задач позволяет указать
веб-крючки раньше времени, без
в ожидании их фактического исполнения.
Таким образом, приложение может создать много
веб-крючки сразу, а затем передать их
выкл в App Engine; система будет
затем обрабатывать их асинхронно в
фон (путем «вызова» HTTP
запрос). Эта модель веб-хука позволяет
эффективная параллельная обработка - приложение
Engine может вызвать несколько задач, или
веб-крючки, одновременно.
Подводя итог, API очереди задач
позволяет разработчику выполнять работу в
фон, асинхронно,разбить эту работу на офлайн
крючки. Система вызовет те
веб-хуки от имени приложения,
планирование для оптимальной производительности
возможно выполнение нескольких веб-хуков
в параллели. Эта модель гранулированная
единицы работы, основанные на HTTP
стандарт, позволяет App Engine
эффективно выполнять фон
обработка таким образом, что работает с
любой язык программирования или веб
рамки приложения.