<?php 
 
set_time_limit(0); 
ignore_user_abort(true); 
 
// this file wants to simulate a real large process that have to be executed in background 
 
require_once __DIR__.'/../../vendor/autoload.php'; 
 
use JLaso\ToolsLib\Json; 
use JLaso\ToolsLib\Status; 
 
$id = isset($_POST['id']) ? $_POST['id'] : null; 
$fileName = isset($_POST['name']) ? $_POST['name'] : ""; 
$fileSize = isset($_POST['size']) ? $_POST['size'] : ""; 
 
if ((null === $id) || !$fileName || !$fileSize) { 
 
    Json::error("you have to send 'id','name' and 'size' to start processing"); 
    exit(); 
 
} 
 
$status = new Status($_POST["_task"]); 
 
// if the status file exists means that another instance of this task is working 
if ($status->existsStatusFile()) { 
    Json::ok(array('id'=>$id, 'status'=>Status::QUEUED)); 
    exit(); 
} 
 
$status->touchStatusFile(); 
 
// the next lines terminates the output buffer and let believe the requester that the program had finished 
ob_start(); 
Json::ok(); 
header("Content-Length: ".ob_get_length()); 
header('Connection: close'); 
ob_end_flush(); 
flush(); 
session_write_close(); 
 
// wait a little before the huge work 
sleep(1); 
 
// this is some kind of magic, in order to copy the status file  if something wrong happens 
function master_shutdown() 
{ 
    global $status; 
    $status->hangOn(); 
} 
register_shutdown_function('master_shutdown'); 
 
$tasks = array(); 
 
do { 
    // get the first task in the queue 
    if (!$id){ 
        foreach($tasks as $key=>$task){ 
            $id = $key; 
            break; 
        } 
    } 
 
    if ($status->getInfo($id) != Status::DONE) { 
 
        $status->updateStatus($id, Status::PROCESSING); 
        process($status, $id, $fileName, $fileSize); 
        $status->updateStatus($id, Status::DONE); 
 
    } 
 
    // continue while existing pending tasks 
    $id = null; 
    $tasks = $status->getNotDoneTasks(); 
 
} while(count($tasks)); 
 
sleep(2);   // give time to frontend to recover updated status 
 
// frees status file indicating that this process has been terminated 
$status->freeStatusFile(); 
 
 
function process(Status $status, $id, $name, $size) 
{ 
    $factor = intval($size/100); 
    for($i=0;$i<=$size;$i+=$factor){ 
        usleep(100000);  // simulate that is copying a piece of the file 
        $status->updateStatus($id, Status::PROCESSING.":".intval($i/$factor)); 
    } 
    sleep(1); 
    $status->updateStatus($id, Status::DONE); 
    sleep(2); 
}
 
 |