PHP - Уничтожение дочернего процесса, запущенного pcntl_fork

Для Windows я попробовал AMD Codeanalyst, Intel VTune и профилировщик в Выпуске Команды Visual Studio.

Codeanalyst является багги (катастрофические отказы часто) и на моем коде, его результаты часто неточны. Его UI неинтуитивен. Например, для достижения дисплея стека вызовов в результатах профиля необходимо нажать вкладку "Processes", затем нажать имя файла EXE программы, затем нажать кнопку на панели инструментов с крошечными буквами "CSS" на нем. Но это - бесплатное программное обеспечение, таким образом, можно также попробовать его, и это работает (с меньшим количеством функций) без процессора AMD.

VTune (700$) имеет ужасный пользовательский интерфейс IMO; в большой программе трудно найти конкретное дерево вызова, которое Вы хотите, и можно только посмотреть на один "узел" в программе за один раз (функция с ее непосредственными вызывающими сторонами и вызываемыми) - Вы не можете посмотреть на полное дерево вызова. Существует представление графа вызовов, но я не мог найти способ заставить относительное время выполнения появиться на графике. Другими словами, функции в графике выглядят одинаково независимо от того, сколько времени было проведено в них - это - как будто они полностью упустили суть профилирования.

у профилировщика Visual Studio есть лучший GUI этих трех, но по некоторым причинам это неспособно собрать образцы у большинства моего кода (образцы только собраны для нескольких функций в моей всей программе C++). Кроме того, я не мог найти цену или способ купить его непосредственно; но это идет с подпиской MSDN моей компании. Управляемые поддержки Visual Studio, собственный компонент и смешанный код; я не уверен в других двух профилировщиках в том отношении.

В заключение я еще не знаю о хорошем профилировщике! Я, несомненно, проверю другие предложения здесь.

7
задан Tim 12 November 2009 в 09:51
поделиться

5 ответов

Вам нужно либо подождать, как описано выше, либо заставить дочерний процесс отсоединиться от родительского с помощью posix_setsid

6
ответ дан 6 December 2019 в 15:23
поделиться
exec(PATH_TO_PHP . " email_script.php $params > /dev/null 2>&1 &");

Таким образом, родитель не ждет ответа от ребенка, и у вас не будет зомби. В файле email_script.php обрабатывайте отправку вашей электронной почты и записывайте ответ в файл, который вы можете анализировать из родительского скрипта или чего-то еще.

1
ответ дан 6 December 2019 в 15:23
поделиться

Обычным решением этой проблемы является использование хорошо настроенного ретранслятора локального хоста. Обычно я настраиваю рассылку локального хоста с использованием постфикса.

Затем я отправлю электронное письмо на локальный ретранслятор, который поставит его в очередь и отправит получателю как можно скорее.

Хорошая вещь. об отправке его на локальный ретранслятор заключается в том, что вы можете настроить его для сообщений о недоставке электронной почты и других ответов.

Если вы задаетесь вопросом о несуществующем, насколько я знаю, SIGKILL - очень сложный метод завершения процесса , вы пробовали (SIGSTOP или SIGTSTP)?

1
ответ дан 6 December 2019 в 15:23
поделиться

Если у вас есть дети-зомби, это означает, что вы не ждете их. Не эксперт по PHP, но системный вызов - waitpid (2) . например, время от времени звоните

waitpid(-1, NULL, WNOHANG);

или всякий раз, когда вы получаете SIGCHILD . Каждый призыв пожнет до одного зомби. WNOHANG заставляет его немедленно возвращаться, а не блокировать, если нет вышедших потомков.

На странице руководства wait есть хороший раздел примечаний о том, как все это работает ...

4
ответ дан 6 December 2019 в 15:23
поделиться

Чтобы завершить ответ Питера, взгляните на pcntl_waitpid

Просто сделайте это после убийства: pcntl_waitpid ($ pid)

2
ответ дан 6 December 2019 в 15:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: