Мы используем PHP только как интерпретатор сценариев (без Apache / IIS). Мы столкнулись с ситуацией, когда процесс PHP.exe зависает после завершения кода. Я могу подтвердить, что была выполнена последняя строка кода (например, эхо-сообщение на консоль кода возврата), но процесс PHP.exe остается. Хотя в некоторых случаях код использует exec () и passthru (), ведение журнала подтверждает, что управление передано обратно процессу PHP и продолжается весело на протяжении всего пути.
Используя Process Hacker, я обнаружил, что всегда выполняются следующие три потока:
- php.exe + 0x2d78
- ntdll.dll! RtlSetLastWin32ErrorAndNtStatusFromNtStatus + 0x59
- mswsock.dll + 0x58ab
Адресные точки всегда одинаковы во всех случаях. Все три потока сообщают «Состояние: ожидание: UserRequest», а потоки php.exe и ntdll.dll имеют одинаковое время запуска, а mswsock.dll запускается через несколько секунд. Используя способность Process Hacker «Анализировать», чтобы увидеть, почему они зависают, он говорит, что ни один из потоков не ожидает.
Мне кажется странным, что mswsock.dll запускается после других - не знаю, почему это произойдет, так как код завершен. Но мне кажется, что php.exe использует экспорт SetLastError () для записи последнего кода ошибки, но не может завершиться?
Есть еще идеи о том, что здесь может происходить?