У меня есть рабочий, который охватывает новые задания с помощью pcntl_fork()
, я хотел бы повторно использовать одно и то же соединение в каждом ребенке без необходимости повторного подключения каждый раз в каждом ребенке, цель чтобы получить огромное повышение производительности.Предотвратить открытие потока в родительском закрытии дочерней вилкой
- В родительском я подключаюсь к службе SMTP, а затем отключаю ребенка.
- Первый ребенок успешно может использовать поток SMTP и может отправить сообщение.
- Розетка автоматически закрывается, когда ребенок заканчивается. Я не называю ни одной близкой функции ни деструкторами, вы можете увидеть в прилагаемом примере репо.
- После этого родитель или следующий ребенок больше могут использовать открытый сокет.
Я хочу предотвратить число 3., чтобы следующий ребенок мог повторно использовать сокет, без необходимости повторного подключения, поскольку вы знаете, что протокол SMTP является частым и требует времени для повторного подключения. SMTP-сервер может быть sendmail/sendgrid/Gmail, я попробовал несколько поставщиков, и проблема в моем PHP, а не в протоколе SMTP.
Я читал, что сигналы могут вызывать закрытие потока. Есть ли способ предотвратить это.
какие у меня варианты?
Я использую PHPMailer, я удалил close from destructor. Я активировал SMTPKeepAlive
, но не помог, как вы можете видеть в прилагаемом примере репо. Если вопросы, я использую PHP 5.4
Update 1
Я добавил образец кода в этом общественный репо: https://github.com/pentium10/php_stream_socket_test и вы можете проверить dispostable почтового ящика на http://www.dispostable.com/inbox/test/
Вы можете найти выход и SMTP ответ в файле README репо. Я подтверждаю, что удаление чего-либо из вызова fork/child/exit, пример работает и отправляет несколько сообщений один за другим.
Сокет не закрыт, пока все процессы, открывающие его, не закрывают его. Номер 4 не существует, родитель должен все еще использовать сокет. – Barmar
Направляет ли ребенок команду «QUIT» в соединение? Это заставит сервер закрыть соединение. – Barmar
Он не отправляет команду QUIT, я проверял использование sleep(), и соединение закрывается, когда ребенок завершает работу. – Pentium10