Как заставить процесс Excel завершиться после автоматизации COM?

В PHP я создаю XLS-файл, используя COM-объект.

$excel = new COM("Excel.Application") or die("Excel is not installed!");
$excel->WorkBooks->Add();
...
$excel->WorkBooks[1]->SaveAs($path);
$excel->Quit();
$excel->Release();
$excel = null;

После запуска этого кода процесс Excel.exe все еще будет находиться в памяти в течение ~ 6 минут. Как заставить этот процесс немедленно завершить работу?


person demidov-alex    schedule 25.01.2012    source источник


Ответы (3)


Вы используете COM-объекты, поэтому вы должны говорить о php в Windows. По сути, вы можете убивать задачи с помощью инструмента командной строки тасккилл. Вы можете вызвать это с помощью php-команды shell_exec, например

shell_exec('taskkill /F /IM "excel.exe"');

Если у вас нет прав (но я считаю, что вы должны, потому что вы начали этот процесс), запустите строку cmd, используя runas.

НО! Вы используете php, поэтому, если вы используете его в веб-среде, и люди одновременно обращаются к вашему веб-сайту, у вас может быть запущено несколько экземпляров Excel. Если это так, вам придется выяснить, кого вы хотите убить.

person Olaf    schedule 25.01.2012

Процесс задерживается на некоторое время на случай, если будет запрошен другой объект «Excel.Application», и в этом случае мы можем избежать затрат на запуск нового процесса и загрузку всех библиотек DLL.

Я бы просто рассматривал это как особенность.

person Simon Richter    schedule 25.01.2012
comment
хм, но на другом сервере с теми же Windows 2008 Server R2 и Excel 2003 процесс немедленно завершается. - person demidov-alex; 26.01.2012
comment
Насколько я знаю, Windows некоторое время не выгружает исполняемый файл после завершения выполнения, но процесс становится невидимым в диспетчере задач. В моем случае процесс Excel.exe остается видимым в диспетчере задач. И когда я снова запускаю код PHP, система создает новый процесс. - person demidov-alex; 26.01.2012

Есть еще один способ... Попробуйте деинициализировать COMS. Вместо того, чтобы сделать это только один раз, сделайте это 4 раза. Это было установлено путем проб и ошибок, поэтому у меня нет для этого веской причины, кроме того, что это работает. Однако это работает не всегда. Это может просто работать в вашем случае

person dRagonsRage    schedule 31.07.2012
comment
Это должен быть комментарий, а не ответ. Проверьте этот метаСО-вопрос и Джон Скит: Блог о программировании о том, как дать правильный ответ. - person Yaroslav; 11.10.2012