Мне дали много устаревшего кода с использованием Symfony2, который работал на Linux, но мне нужно запустить его на Windows. Почти все работает (XAMPP), но у меня есть проблема с одной вещью.
Во время регистрации пользователя отправка писем занимала слишком много времени, чтобы загрузить страницу подтверждения (в зависимости от параметров может быть несколько писем), поэтому для каждого письма в БД добавляется запись, которая содержит только такую команду, как "php /path/to/app/console product:send_some_mail address@host"
и т.п.
Затем есть команда, которая берет все не отправленные письма и отправляет их по одному. Эта команда ранее называлась так:
$proc = new Process('php /var/www/product/app/console product:send_all_mails ' . $mailAddress .' --env='. $env . ' ');
Это совершенно очевидно, что путь в Windows был не совсем верным, поэтому я попытался сделать его более универсальным. Я вставлю весь тестовый код:
$proc = new Process('php ' . realpath($this->get('kernel')->getRootDir() . '/console') . ' product:send_all_mails ' . $mailAddress .' --env='. $env . ' ');
$proc->setEnhanceWindowsCompatibility(false); // this doesn't change anything...
$proc->start();
while($proc->isRunning()); // stupid debug
file_put_contents("MailProcessResult.txt", $proc->getCommandLine() . ' :: ' . $proc->getExitCodeText());
Странно, все, что я вижу в файле псевдо-журнала:
php C:\gitrepos\product\app\console product:send_all_mails [email protected] --env=my_env :: General error
Понятия не имею, что происходит. Я перепроверил все, что мог придумать:
cmd /V:ON /E:ON /C "(my_commandline)"
)Ранее я пытался запустить продукт: send_all_mails как команда, но это не было в фоновом режиме. Это совершенно очевидно, PHP имеет некоторые проблемы с выполнением PHP 🙂
Что еще я мог попробовать? Мне просто нужно запустить пакет разных команд с разными аргументами из одной команды (или процесса) в фоновом режиме.
Измените эту команду на событие.
Таким образом, вам не понадобится Process () — я считаю, что это проблема — слишком много сложностей (создание процесса для вызова команд из системы).
Подключите Event к доктрине к postPersist — это будет запускать событие каждый раз, когда создается новая запись.
В случае события проверьте, добавлен ли fing в БД как User Entity, и если да, отправьте письмо с события
Других решений пока нет …