2014-09-13 6 views
2

Я знаю, что php не имеет потоков. Но в этом уроке они показывают, что, используя возможности операционных систем хоста, мы можем достичь этого. Он также сказал, что не делать этого в производственном кодексе. Почему это не очень хорошая идея?Почему не рекомендуется использовать многопоточность в php?

Вот пример кода

$processID = pcntl_fork(); 
if($processID) { 
    echo "I'm in the parent process!"; 
} else { 
    echo "I'm in the child process!"; 
} 

Вот tutorial.

+2

Вы проверили комментарии на странице [docpage] функции (http://php.net/manual/en/function.pcntl-fork.php)? Они могут быть довольно просвещенными. – raina77ow

+0

Прошу прощения, мне это не приходило в голову. Я буду смотреть в него. –

+1

Процесс forking часто является важной функцией для автономных приложений, а не в контексте запуска PHP в веб-сервере. – mario

ответ

8

Форкирует ли нить?

Когда мы разворачиваем процесс, пространство процесса, то есть область памяти, где находятся библиотеки и код, которые требуется выполнить процессу, повторяется, отдельные, но связанные процессы затем продолжают выполняться по желанию планировщик операционных систем в разных областях памяти.

В чем разница между процессом Forked и Thread?

Когда мы создаем Thread, мы говорим операционной системе, что хотим, чтобы другая единица исполнения могла работать в той же области памяти, что и процесс, который ее создал.

Как разные операционные системы фактически реализуют потоки и процессы, выходит за рамки этого ответа и не имеет значения.

Почему на передней панели возникает плохая идея?

При копировании всего адресного пространства вы дублируете область памяти, в которой работает веб-сервер, это, очевидно, может привести к хаосу для вашей операционной системы.

Зачем наводнение плохой идеей на фронте?

Если клиентский скрипт инструктирует операционную систему создавать 8 потоков в прямом ответе на веб-запрос, а 100 клиентов одновременно запрашивают сценарий, вы будете инструктировать, чтобы ваша операционная система выполняла 800 потоков одновременно.

ЦП и операционные системы должны были бы выглядеть очень сильно, чтобы сделать это хорошей идеей!

Где Threading хорошая идея?

Многопоточное программное обеспечение и чрезвычайно надежное оборудование, является вездесущим; вычисление не было бы тем, чем оно без него.

В контексте веб-инфраструктуры mysql и другие серверы баз данных являются многопоточными, а Apache может развернуть PHP в многопоточной инфраструктуре, хотя я бы не рекомендовал его.

Когда мы рассматриваем, как предприимчивые приложения, такие как mysql, фактически предоставляют свои чрезвычайно сложные сервисы, мы видим, что их процесс (и, следовательно, потоки) полностью изолирован от инфраструктуры вашего веб-приложения.

Так мы используем Threads на языках, которые их поддерживают; мы разрабатываем системы, средства которых предоставляют свои услуги через простую форму IPC, мы полностью изолируем нашу комплексную инфраструктуру от того, что должно быть простым: наши веб-приложения.

Действительно ли PHP подходит для потоков?

Модель памяти для PHP не имеет ничего общего: это означает, что каждый контекст интерпретатора в смысле структур и памяти, которые требуется PHP для работы, изолирован от любого другого контекста.

Этот всегда должен быть правдой для PHP, чтобы он работал по назначению; реализация потоковой передачи для PHP, которая не знала, как работает PHP, просто не будет функционировать.

Pthreads идет на большие длины, чтобы обеспечить модель памяти не нарушена, каждая тема действительно не разделяет память непосредственно с любой другой Thread.

Действительно ли темы подходят для меня?

Во-первых, серьезно задуматься над следующими вопросами:

  • ли Threading действительно необходимо?
  • Какие еще способы вы можете найти для достижения того, что вы собираетесь делать?

Многопоточное программное обеспечение является сложным по своей природе; что-то сложное не является оправданием для того, чтобы избежать этого, на мой взгляд.

Но имейте в виду, что многопоточное программное обеспечение принципиально отличается от вашего обычного приложения PHP, вы должны думать о вещах, о которых вам никогда не приходилось думать раньше, помните о вещах, которые не имели значения, прежде чем вы начали свой первый Нить.

Вы не должны угадать, что это такое, вы должны стараться как можно полнее воспитывать себя в предмете и даже быть готовым к неудаче и упорству.

Сложность ничего уменьшается по мере увеличения знаний, это как обучение работает, вот где она начинается:

https://gist.github.com/krakjoe/6437782

Он по-прежнему в руководстве, во многих примерах, распределенных с Pthreads, в StackOverflow поиски и вопросы, а также результаты в славе, на мой взгляд.

0

ничего «достигнуто» здесь, pcntl_fork создает новый процесс. Если вы создадите несколько процессов, скорее всего, в какой-то момент вы столкнетесь с гоночными условиями - PHP не был разработан для параллельного выполнения, у вас будут все виды странных ошибок и проблем управления.

Использование нескольких процессов в рамках одной программы также может стать очень сложным - вам придется синхронизировать мьютексы и алгоритмы секвенирования, которые зависят друг от друга.

Вместо этого вы можете писать классы, которые называют методы друг друга, что позволяет решить практически любую проблему - те, которые не могут быть решены без использования fork, скорее всего, из-за плохого дизайна; веб-сайтам не нужно выполнять многолетние задачи, но они могут QUEUE их, добавив записи crontab, будет одним из примеров.

+2

Различные процессы разделены ... ничего (непосредственно) делать с условиями гонки или мьютексами. – johannes

+2

PHP - это общая архитектура без изменений, у разных процессов есть отдельное состояние. Это отличается от потоков, которые используют одну и ту же память в одном процессе. Конечно, вы можете делиться состоянием между процессами (т. Е. Сетевым соединением, установленным перед вилкой), но это напрямую не связано с процессами. – johannes

+0

вы обнаружили тот факт, что процессы arent threads. Хорошо - продолжайте учиться. – specializt

1

PHP должен работать на веб-сервере, обслуживающем интерфейс. В типичной среде у вас несколько пользователей (веб-клиентов) параллельно, полностью используя ваши ядра процессора. Разделение работы из одного потока на несколько, как правило, не имеет смысла в такой среде. Поскольку система уже загружена, и для потоковой передачи требуется дополнительная синхронизация и т. Д. Обычно лучше разгружать «сложные» задачи для поддержки бэкэнд-системы и затем отчитываться. Благодаря этому бэкэнд-система, выполняющая сложную вещь, может масштабироваться независимо. Кроме того, задания могут быть поставлены в очередь, поэтому пользователь получает мгновенный отчет («мы работаем»), а затем получает отчет о его выполнении.

Использование pcntl_fork() создает копию процесса, это может быть полная копия процесса веб-сервера, который попытается как поговорить с клиентом по тому же сетевому соединению (это тоже скопировано), что приводит к полному беспорядку. Это также приведет к беспорядку с существующими соединениями с базой данных и т. Д. (По крайней мере оба процесса будут пытаться закрыть его ... так что вторая получит путаную ошибку в базе данных)

Для фактической резьбонарезки есть pthreads extension in PECL, который не создает копию процесса, но разделяет тот же процесс, который испортится с моделью памяти PHP (которая предполагает, что в одном потоке есть один запрос в то время, который не имеет ничего общего с кем-либо еще) некоторые люди используют это, но выгружают в другие системы обычно лучше

Что люди часто имеют операции ввода-вывода (т.е. вызовы базы данных), которые требуют времени. В этом случае асинхронные операции могут идти (см. mysqli_poll и mysqli_reap_query), в основном это позволит вам что-то делать на процессоре, ожидая ввода-вывода и время от времени проверяя IO.

Смежные вопросы