Для Windows я попробовал AMD Codeanalyst, Intel VTune и профилировщик в Выпуске Команды Visual Studio.
Codeanalyst является багги (катастрофические отказы часто) и на моем коде, его результаты часто неточны. Его UI неинтуитивен. Например, для достижения дисплея стека вызовов в результатах профиля необходимо нажать вкладку "Processes", затем нажать имя файла EXE программы, затем нажать кнопку на панели инструментов с крошечными буквами "CSS" на нем. Но это - бесплатное программное обеспечение, таким образом, можно также попробовать его, и это работает (с меньшим количеством функций) без процессора AMD.
VTune (700$) имеет ужасный пользовательский интерфейс IMO; в большой программе трудно найти конкретное дерево вызова, которое Вы хотите, и можно только посмотреть на один "узел" в программе за один раз (функция с ее непосредственными вызывающими сторонами и вызываемыми) - Вы не можете посмотреть на полное дерево вызова. Существует представление графа вызовов, но я не мог найти способ заставить относительное время выполнения появиться на графике. Другими словами, функции в графике выглядят одинаково независимо от того, сколько времени было проведено в них - это - как будто они полностью упустили суть профилирования.
у профилировщика Visual Studio есть лучший GUI этих трех, но по некоторым причинам это неспособно собрать образцы у большинства моего кода (образцы только собраны для нескольких функций в моей всей программе C++). Кроме того, я не мог найти цену или способ купить его непосредственно; но это идет с подпиской MSDN моей компании. Управляемые поддержки Visual Studio, собственный компонент и смешанный код; я не уверен в других двух профилировщиках в том отношении.
В заключение я еще не знаю о хорошем профилировщике! Я, несомненно, проверю другие предложения здесь.
Вам нужно либо подождать, как описано выше, либо заставить дочерний процесс отсоединиться от родительского с помощью posix_setsid
exec(PATH_TO_PHP . " email_script.php $params > /dev/null 2>&1 &");
Таким образом, родитель не ждет ответа от ребенка, и у вас не будет зомби. В файле email_script.php обрабатывайте отправку вашей электронной почты и записывайте ответ в файл, который вы можете анализировать из родительского скрипта или чего-то еще.
Обычным решением этой проблемы является использование хорошо настроенного ретранслятора локального хоста. Обычно я настраиваю рассылку локального хоста с использованием постфикса.
Затем я отправлю электронное письмо на локальный ретранслятор, который поставит его в очередь и отправит получателю как можно скорее.
Хорошая вещь. об отправке его на локальный ретранслятор заключается в том, что вы можете настроить его для сообщений о недоставке электронной почты и других ответов.
Если вы задаетесь вопросом о несуществующем, насколько я знаю, SIGKILL - очень сложный метод завершения процесса , вы пробовали (SIGSTOP или SIGTSTP)?
Если у вас есть дети-зомби, это означает, что вы не ждете
их. Не эксперт по PHP, но системный вызов - waitpid (2)
. например, время от времени звоните
waitpid(-1, NULL, WNOHANG);
или всякий раз, когда вы получаете SIGCHILD
. Каждый призыв пожнет до одного зомби. WNOHANG заставляет его немедленно возвращаться, а не блокировать, если нет вышедших потомков.
На странице руководства wait
есть хороший раздел примечаний о том, как все это работает ...
Чтобы завершить ответ Питера, взгляните на pcntl_waitpid
Просто сделайте это после убийства:
pcntl_waitpid ($ pid)