Попробуйте переключить ['event_name'] и [i] в операторе if
pcntl довольно прекрасные работы пакета - это просто использует согласно функциям Unix. Единственный дефицит - то, что Вы не можете использовать их, если php вызывается от контекста веб-сервера. т.е. можно использовать его в сценариях оболочки, но не на веб-страницах - по крайней мере, не используя взлом как вызов разветвляющегося сценария с должностным лицом или подобный.
[редактирование] я просто нашел страницу, объясняющую, почему mod_php не может разветвиться. В основном это - проблема безопасности. [/редактирование]
Единственный возможный способ иметь код php, выполняющийся в нескольких потоках, состоит в том, чтобы выполнить php как модуль потокового веб-сервера, который бесполезен, потому что потоки полностью изолируются, и Ваш код не имеет никакого контроля над ними. Насколько я знаю, pcntl только справляется с процессами, не потоками.
Это не управление потоком, это - управление процессом. Библиотека для потоков является pthreads (потоки POSIX), и она не включена в PHP, таким образом, нет никаких функций многопоточности в PHP.
С многопроцессорной обработки Вы не можете использовать это в mod_php, поскольку это было бы гигантской дырой в системе безопасности (порожденный процесс будет иметь полномочия всего веб-сервера).
Если бы я должен был сделать руководство crontab выполнение и т.п. от PHP, то я, вероятно, использовал бы очередь. Имейте таблицу базы данных, к которой Вы добавляете задания. Другой процесс, или от крона или работающий как демон, выполняет задания, как они обнаруживаются.
Другой способ сделать это состоит в том, чтобы настроить отдельный сценарий и сделать HTTP ДОБИРАЕТСЯ до него. Это не совсем распараллеливает, но это - один способ окружить к другой команде в PHP.
Например, если я хотел работать /usr/bin/somescript.sh
по требованию у меня был бы a somescript.php
это сделало системный вызов. Это было бы на виртуальном хосте, только доступном от localhost.
Я сделал бы вызов сокета к веб-серверу и ПОЛУЧИЛ бы сценарий. Ключ не должен читать на сокете, таким образом, он не блокируется. Если я хотел проверить возвращаемое значение somescript.php
, Я сделал бы это позже в моем основном сценарии для предотвращения блокирования.
Если somescript.php
занимает много времени для выполнения (дольше, чем сценарий выполнения вызова), необходимо будет сделать некоторое волшебство мешать апачу уничтожить сценарий, когда сокет закрывается.
Мультиплатформенный механизм многопоточности PHP http://anton.vedeshin.com/articles/lightweight-and-multiplatform-php-multithreading-engine
Примеры многопоточности, работающей в PHP (с выдержками из их страницы проекта):
По состоянию на 25 октября 2011 года этот модуль «подошел к концу» и является устаревшим в пользу таких проектов, как Elysia Cron ]. Этот модуль не был полностью бесполезным, поскольку основной патч, вдохновленный Cron MT, был привязан к D7.
... обеспечивает кэширование статических страниц для Drupal, что позволяет значительно повысить производительность и масштабируемость сайтов, которые получают в основном анонимный трафик. Для виртуального хостинга это лучший вариант с точки зрения повышения производительности. На выделенных серверах вы можете использовать Varnish.