2015-10-02 3 views
0

Я хочу вернуть false пользователю (который имеет очень большие данные для обработки), а не ждать завершения обработки фактических данных, FALSE означает, что данные уже находятся в процессе, и теперь пользователь может перейти для проверки позже.Есть ли другой способ продолжить выполнение функции после возврата?

ПРИМЕЧАНИЕ: пользователь - пользователь мобильного приложения (клиент).

В основном код выглядит следующим образом:

function accept_data($data){ 
if(is_this_data_already_processed($data)) { 
    return true; 
} else { 
    return false; 
    now_process_data($data); 
} 
} 

К тому времени, пользователь снова проверяет данные, он будет вызывать функцию is_this_data_already_processed(). Если значение true, то оно обрабатывается.

Я знаю, что оператор return завершает все исполнения. Есть ли способ сделать то, что я хочу?

+0

'now_process_data ($ данных);' никогда не будет выполнена, я не знаю, что эта функция точно делает, но из 'return false' под ним – swidmann

+1

положил ваше возвращение ложным; ниже now_process_data ($ data) –

+0

какой тип сущности является «клиентом» в ситуации? – Flosculus

ответ

0

Ну, получается, что мне нужно было просто создать еще одну функцию:

function accept_data($data){ 
if(is_this_data_already_processed($data)) { 
    return true; 
    // return true to user 
    // user can now go offline 
} else { 
    data_not_processed(); 
    // return false to user 
    // user can now go offline while data is being processed 
    // and not wait to the process to finish 
    now_process_data($data); 
} 
} 

function data_not_processed(){ 
return false; 
} 
1

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

define('PROCESS_STATE_SLEEP', 0); 
define('PROCESS_STATE_RUNNING', 1); 

function accept_data($data) 
{ 
    if (is_this_data_already_processed($data)) { 
     return true; 
    } 

    // determine if the process is already running, or not, 
    // if not, start running. 
    if (get_process_state($data) === PROCESS_STATE_SLEEP) { 

     // initiate a background process, such as a gearman worker, 
     // amqp, or background exec 
     now_process_data($data); 
    } 

    return false; 
} 

Если ваш «клиент» кто-то на веб-браузере, они не получат ответ до того, как процесс будет завершен, даже если вы каким-то образом вернуть false перед его запуском.

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