LINUX.ORG.RU

Ответ на: комментарий от visual_pipe

Хм.. Дрочерство конечно, но попробовать стоит)))

boombick ★★★★★
() автор топика

>Как лучше это сделать?

pcntl_fork()

Основной тред пошёл дальше, а форк запускает программу и ждёт. Как закончит, кидает данные куда нужно или дёргает тред-диспетчер через тот же gearman. Или, там, в shared memory складывает. В общем, смотря что требуется.

KRoN73 ★★★★★
()
Ответ на: комментарий от boombick

Узеру - страничку, а сами ждем дальше

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

Висит отдельный PHP-процесс, слушающий gearman'а и для полученных данных пускающий форк с их обработкой, запрашивая следующую порцию: gearman.php

И уже запущенный процесс делает что-то медленное, скажем, tasks.php

Ну и вызов этого дела делается через посылку сообщения gearman'у, например:

class balancer_board_topic extends bors_object_db
{
// ...
    function topic_updated($post, $notifyed_user = NULL)
    {
        $user = $post->owner();
        $text = "{$post->topic()->title()}:\n"
            .trim(html_entity_decode(make_quote($user->title(), htmlspecialchars($post->source()), false), ENT_COMPAT, 'UTF-8'))
            ."\n\n// #{$post->id()} {$post->url_for_igo()} «{$post->topic()->title()}», подписка";

        bors()->do_task('balancer_balabot_notify_post', array(
            'post_id' => $post->id(),
            'text' => $text,
            'notifyed_user' => $notifyed_user,
        ));
    }
// ...
}

do_task() выглядит так:

    function do_task($task_class, $data = array())
    {
        $client= new GearmanClient();
        $client->addServer();

        $data['worker_class_name'] = $task_class;

        $client->doBackground('balabot.work', serialize($data));
    }

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Не, в данном случае сервер очередей - это из пушки по воробьям. Суть такова, что юзер вводит некие исходные параметры и по ним прогоняются тесты. Результаты тестов уходят на мыло. Процесс тестирования занимает около 5 минут, там все довольно просто. Форки не работают под вебом, насколько я помню, они только в CLI-режиме. Мне надо было просто показать юзеру, что запрос его принят и пусть спит спокойно. Так как у меня php-fpm как FCGI-менеджер работает, то я просто воспользовался его функцией fastcgi_finish_request

А если уж очереди рассматривать, то 0MQ мне куда больше нравится)))

boombick ★★★★★
() автор топика
Ответ на: комментарий от boombick

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

Ну так просто пускай форк и делай всё длительное из него :) Но, вообще, какая же это пушка — он же жрёт совсем мало и очень удобен даже для мелких применений :) Если же чужой хостинг без возможности установки своих сервисов, то можно сделать свой велосипед с MySQL-таблицей и отдельным процессом для обработки. У меня такой вариант тоже есть, правда, мало использовался. Кидаешь в «быстром» коде задачу с параметрами в БД, а фоновый процесс достаёт запись, обрабатывает (можно с форком, можно в один поток) и удаляет.

Форки не работают под вебом, насколько я помню, они только в CLI-режиме


Не проверял, может и так. Тогда — точно делать нужно отдельный cli-обработчик и средство обмена данными (БД или хотя бы простой текстовый файл, если нагрузка невысокая :))

А если уж очереди рассматривать, то 0MQ мне куда больше нравится)))


Мне как-то сразу gearman понравился :)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

> Но, вообще, какая же это пушка — он же жрёт совсем мало и очень удобен даже для мелких применений :)

Мне все это обошлось в 1 (одну) строчку кода и отсутствие лишних телодвижений. Из всех ресурсов я наиболее ценю собственное время :)

boombick ★★★★★
() автор топика
Ответ на: комментарий от boombick

>Из всех ресурсов я наиболее ценю собственное время

Именно поэтому я предпочитаю один раз «день потерять», зато потом каждый раз «за 5 минут долетать» :)

KRoN73 ★★★★★
()

Есть 2 мнения: моё и неправильноею Мой таково:

1) Ставим в web-скрипте выполнение программы на очередь (очередь делай хоть табличкой в БД, хоть каталогом с файлами).

2) Кроном от правильного пользователя, с правильными привилегиями запускаем внешнюю программу, обрабатывающую элемент очереди и записывающую результат в журнал

3) Читаем web-скриптом состояни очереди и записи в журнале (хоть аяксом, хоть нажимая F5)

...

N) ВЫГОДА!

r_asian ★☆☆
()
Ответ на: комментарий от r_asian

Да, в итоге все равно пришлось делать очередь))) Сэкономил блин))))

boombick ★★★★★
() автор топика
Ответ на: комментарий от r_asian

> N) ВЫГОДА!

Гениально! Всегд думал каким русским словом заменить «profit», в словарь было лезть лень, а в голову не приходило.

VirRaa ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.