Реализация потоков в PHP (fork/форк)
Ноябрь 17, 2007
Сложилось так, что разработчики от порождения к последней версии PHP обходят стороной многопоточность... А ведь довольно часто приходится выполнять задачи в многопоточном режиме. Первое, что приходит на ум (самое здравое, кстати) — использовать форк — подход порождения процессов. Вот что говорит нам Википедия:
В Unix-системах, fork () — системный вызов, создающий новый (дочерний) процесс, идентичный выполняющему этот вызов. После вызова fork () алгоритм обычно разветвляется (родительский процесс получает от fork () PID дочернего, а дочерний получает нуль).
Технически это реализуется следующим образом: строится т.н. дерево:
- Обработчик процессов
- Индикатор процессов
- Сам процесс
Начнем по-порядку.
Обработчик процессов
Запустившись, он смотрит на следующие параметры: количество допустимых потоков, количество исполняемых потоков, сигнал запуска (true/false). На основе этих данных он принимает решение — запускать или нет еще один процесс.
Индикатор процессов
Каждый процесс, после запуска, оставляет о себе метку: мол, взял кусок данных — это моё, запускать на 1 процесс меньше, чем получил. Отработав — говорит «я отработал. данные записал. метку оставил».
Ну и сам процесс
Выполняет то, что должен, включая код индикатора...
Реализуется это довольно просто. Будет время — выложу «многопоточный» парсер чего-нибудь =)
Удачного коденга
Январь 1, 2008 в 04:23
Выложи плз, хотя бы элементарный пример, что бы механику просмотреть
Июнь 19, 2008 в 23:44
Fork вряд ли на виртуальных хостингах доступен... Это же сильно нагружает сервер — каждый вызов создаёт новый процесс интерпритатора php, вроде около 15 метров памяти. Имхо, curl с поддержкой мультипоточности или fsockopen лучше (вижу что пост давний, просто интересно твоё мнение на данный момент услышать про это, так как сам сейчас столкнулся с похожей задачей)