Показать сообщение отдельно
  #5 (permalink)  
Старый 17.02.2012, 13:02
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

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

<?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;
		}
	}
?>
Ответить с цитированием