gearman - выполнения задачи в фоне

gta4kvs

Новичок
приветствую.

что есть сейчас - программист присылает мне запрос (/?service=test&param=bla-bla), я лезу за данными в удаленный источник (если их нету в кэше), запрос может занять от 1 до N (60+) секунд, всё это время я "держу его на линии". Этот вариант не очень удачный, в связи с чем, я решил переделать, и сделать так - мне присылают запрос, я выдаю какой-либо уникальный ID, по-которому с другой стороны будут посылать другой запрос, проверяя пришли ли данные, или нет.

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

Ну и если нет, то как мне правильнее поступить?
 

Absinthe

жожо
Легко.

PHP:
$response = получаешьДанные();
ignore_user_abort(true);
header("Connection: close");
header("Content-Length: " . strlen($response));
echo $response;
flush();
// тут делаешь все остальное, пользователь отвалится.
На винде может не работать.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Т.к надо выдать пользователю ID и при этом его отключить, но продолжить выполнять запрос к удаленному хосту я решил использовать Gearman. Дело я с ним никогда не имел, посему хочу спросить подойдет ли он под мою задачу, и и если да, прошу ткнуть меня в похожий пример, или хотя бы в нужные функции на php.net.
Да.
http://www.php.net/manual/ru/gearmanjob.unique.php
 

gta4kvs

Новичок
Решил перед gearman попробовать вариант с закрытием коннекта, странно, но так и не получилось - перелопатил все примеры с php.net, но или коннект не закрывается, или в итоге код после не выполняется.

Вот например:

PHP:
    private function get()
    {

        // buffer all upcoming output
        ob_start();
        echo "Here's my awesome web page";

// get the size of the output
        $size = ob_get_length();

// send headers to tell the browser to close the connection
        header("Content-Length: $size");
        header('Connection: close');

// flush all output
        ob_end_flush();
        ob_flush();
        flush();

        while(TRUE)
        {
            file_put_contents(CORE . uniqid(), file_get_contents('https://launchpad.net/gearmand/trunk/0.12/+download/gearmand-0.12.tar.gz'));
        }
    }
(ignore_user_abort=true)

Коннект всё равно не разрывается, хотя если нажать Стоп вручную - скрипт продолжает работу.

Почему может не закрываться коннект?
 

gta4kvs

Новичок
Как оказалось, дело было не в ОС, а в php-fpm, вместе с:

PHP:
fastcgi_finish_request();
всё заработало
 
Сверху