1. Задавайте здесь вопросы о коде, которые не подходят в другие разделы, такие как:
    Дизайн > Верстка
    PHP > Как сделать на PHP
    Скрыть объявление

Как реализовать многопоточность в PHP через fork?

Тема в разделе "Web Coding", создана пользователем nick1m, 24 фев 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. nick1m

    nick1m Постоялец

    Регистр.:
    20 фев 2008
    Сообщения:
    119
    Симпатии:
    8
    Как реализовать многопоточность в PHP через fork?
    Что бы был обработчик и индикатор процессов. Если можно, с примером.
     
  2. n42

    n42

    Регистр.:
    8 фев 2008
    Сообщения:
    206
    Симпатии:
    25
    А в пхп нет форка.

    И пхп может работаь в двух режимах. Thread Safe и обычном

    Обычных это значит один процес - один пхп поток.
    В таком режиме в принцепе можно сделать форк.

    Но в апач 2 появилась подержка потоков.
    например в режине worker=mpm в апаче есть неслькомо процесов ив каждом процесе несколько потоков (трид).

    Если сделать форк в таком процесе то остальный потоки будут тоже скопированы. Это абсолютно не то что ты хочешь. в тех потоках могут испольнять чужие скрипты которые не ожидают что они будут распаралелины.

    Поэтому в пхп нет форк.

    Если тебе нужен форк юзай перл.
     
  3. durman

    durman Постоялец

    Регистр.:
    18 фев 2008
    Сообщения:
    87
    Симпатии:
    8
    когда то я тоже задавался вопросом как сделать многопоточность в пхп (все решения довольно кривые). Я в то время ничего не знал о не_блокирующих сокетах, а в конечном итоге именно они позволили ускорить мою утилиту в надцать раз.
    Конечно это не ответ на твой вопрос но вдург натолкнёт тебя на мысль :)
     
  4. nick1m

    nick1m Постоялец

    Регистр.:
    20 фев 2008
    Сообщения:
    119
    Симпатии:
    8
    Мне нужен не форк, а многопоточность, с перлом вообще не знаком и желания нет по индивидуальным причинам. Просто где-то читал, что в пхп тоже так делают. А вот отрывок из Википедии:

    [qute]В Unix-системах, fork() — системный вызов, создающий новый (дочерний) процесс, идентичный выполняющему этот вызов. После вызова fork() алгоритм обычно разветвляется (родительский процесс получает от fork() PID дочернего, а дочерний получает нуль).[/quote]

    Поэтому я и подумал, что для пхп это тоже вполне реализуемо.

    Добавлено через 2 минуты
    Пасиб, будем капать, кстати, а ты форк не пробовал задействовать? Просто ты сказал, что много вариантов пробовал, но про форк ничего.
     
  5. mister

    mister Писатель

    Регистр.:
    10 фев 2008
    Сообщения:
    6
    Симпатии:
    0
    В php есть pcntl_* функции, в том числе и pcntl_fork()
    (только *nix).
     
  6. Mendel

    Mendel

    Регистр.:
    27 янв 2008
    Сообщения:
    217
    Симпатии:
    64
    мысля хорошая, но есть одно но:
    т.е. нужно плясать с бубном чтобы оно заработало... ну не плясать конечно но далеко не всегда есть возможность чтото перекомпилировать и перенастраивать.
    да и на самом деле довольно щекотливый вопрос эти дочерние процессы.... особенно в плане стабильности и целостности... начинающий програмист может натворить много чудес.

    вообще ТС, укажите для чего именно оно вам надо?
    во многих задачах можно обойтись без реальной многопоточности без потерь производительности. Просто схем много, все так сразу и не озвучишь, может ваша задача уже решена без многопоточности :)
     
  7. nick1m

    nick1m Постоялец

    Регистр.:
    20 фев 2008
    Сообщения:
    119
    Симпатии:
    8
    Любая задача, где требуется многопоточность, парсрес SE, спамилка
     
  8. Mendel

    Mendel

    Регистр.:
    27 янв 2008
    Сообщения:
    217
    Симпатии:
    64
    в том то все и дело что не любая...
    у многих парсеров есть довольно большой промежуток между запросом от нового ip.... если капать в сторону
    PHP:
    curl_setopt($chCURLOPT_INTERFACE$ip);
    то часто можно обойтись одним потоком там где некоторые умники поднимали 20....
    дальше, есть такой хитрый ход - открывать удаленные файлы, пачкой, а только потом уже в цикле их скачивать - это позволяет не ждать пока выполнится скрипт на удаленной стороне, а в это время открывать следующие.. иногда такой метод экономит до 90% времени работы парсера... чего бывает достаточно. всетаки канал то не бесконечный, и до бесконечности многопоточностью ты скорость не нарастишь...
    Просто я отношу многопоточность к тем средствам которых по возможности надо избегать... не отказываться от них конечно, но если есть простое решение которое дает такой же результат без многопоточности, то IMHO лучше выбрать его.
     
  9. nick1m

    nick1m Постоялец

    Регистр.:
    20 фев 2008
    Сообщения:
    119
    Симпатии:
    8
    Ок, такой пример, у тебя есть 500 кил урлов, которые нужно проверить на 200-ю, вообщем нужны одни заголовки
    второй пример - ту же базу нужно проверить на количество страниц в индексе

    Нужна ли здесь многопоточность? мне кажется да, возможно я и не прав.

    Как бы ты поступил в таких задачах?
     
  10. n42

    n42

    Регистр.:
    8 фев 2008
    Сообщения:
    206
    Симпатии:
    25
    Это означает, что такой пхп не будет работать в много поточных серверах как модуль.

    Зачем такое писать вообще на ПХП?

    Сейчас можно писать на чём, то удобном и запускать на домашнем компе. Или если нет дешевого домашнего инета то на ВПС.

    Я бы парсер писал бы на джава. Там есть тридс и супер штука для скачивания.
    http://hc.apache.org/httpclient-3.x/

    И такая прога будет работать везде.
     
Статус темы:
Закрыта.