примерно так:
<?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;
		}
	}
?>