Мы запускаем PHP на сервере Windows (на самом деле это источник многих проблем, но миграция в данный момент не является вариантом). Есть несколько моментов, когда действие, инициированное пользователем, должно начинаться с нескольких вещей, которые требуют времени, и о том, что пользователю не нужно знать, удастся ли им преуспеть или нет, например, отправив электронное письмо или убедиться, что некоторые сторонние учетные записи обновляются. Если бы я мог просто развиваться с pcntl_fork()
, это было бы очень просто, но функции PCNTL недоступны в Windows.
Кажется, что ближе всего я могу сделать что-то подобное:
exec( 'php-cgi.exe somescript.php' );
Однако это было бы намного сложнее. Действия, которые мне нужно выполнить, зависят от большого контекста, который уже будет существовать в текущем процессе; для использования вышеприведенного примера мне нужно было бы выяснить основные данные и каким-то образом предоставить их новому script. Если бы я мог раскошелиться, было бы просто позволить родительскому процессу вернуться раньше, оставив ребенка работать над еще несколькими вещами.
Я обнаружил, что несколько человек говорили о своей собственной работе по созданию различных функций PCNTL, скомпилированных в Windows, но ни у кого не было ничего доступного (сломанные ссылки и т.д.).
Несмотря на этот вопрос, имеющий практически то же имя, что и мое, кажется, проблема была больше времени выполнения, чем для вилки. Итак, мой лучший вариант - просто реорганизовать бит, чтобы иметь дело с вызовом php-cgi, или есть другие варианты?
Изменить: Кажется, что exec()
не будет работать для этого, по крайней мере, не без меня, чтобы понять какой-то другой аспект, поскольку он ждет, пока вызов не вернется. Я решил, что могу использовать START
, вроде как exec( 'start php-cgi.exe somescript.php' );
, но он все еще ждет, пока не закончится другой script.