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