примерно так:
<?php
// Создаем сессию
$expireTime = 60*60*24*30;
session_set_cookie_params( $expireTime );
session_start();
// Подготавливаем массив процессов
if ( !isset( $_SESSION['forks'] ) ) {
$_SESSION['forks'] = array();
}
if ( isset( $_GET['action'] ) ) {
switch( $_GET['action'] ) {
case "startProcess":
// генерим уникальный ключ для процесса
$processId = md5( mktime() );
// ставим процессу статус не завершен
$_SESSION['forks'][ $processId ] = false;
// создаем процесс
$pid = pcntl_fork();
// С этого участка кода сразу же начнет работать дочерний поток
if ( $pid == -1 ) {
// Если поток создать не удалось
// Уничтожаем инфу о процессе
unset( $_SESSION['forks'][ $processId ] );
exit( "Create process failed" );
} else if ( $pid ) {
// Сюда попадет родительский поток, тоесть основной
exit( "Process started. Current process PID: ".$processId );
} else {
// сюда попадет дочерний/порожденный поток
// ......... обрабатываем данные
// ставим статус завершен
$_SESSION['forks'][ $processId ] = true;
// завершаем процесс
exit();
}
break;
case "processStatus":
// Если передали ID процесса и он есть в массиве процессов
if ( isset( $_GET['pid'] ) && isset( $_SESSION['forks'][ $_GET['pid'] ] ) ) {
// Проверяем статус
if ( $_SESSION['forks'][ $_GET['pid'] ] ) {
// Уничтожаем инфу о процессе
unset( $_SESSION['forks'][ $processId ] );
$status = "complete";
} else {
$status = "working";
}
exit( "Process status ".$status );
}
exit( "Process not found" );
break;
default;
}
}
?>