PHP процесс не завершается после завершения скрипта - PullRequest
0 голосов
/ 16 марта 2020

Я работаю над пользовательским веб-сервером в C#. Я звоню php -chi.exe. Мой код для этого выглядит следующим образом:

System.Diagnostics.Process proc = new System.Diagnostics.Process();
string sOutput = "";

proc.EnableRaisingEvents = false;
proc.StartInfo.FileName = "php/php-cgi.exe";

proc.StartInfo.Arguments = "-f " + filePath + " " + queryString;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.CreateNoWindow = true;

proc.Start();

StreamReader hOutput = proc.StandardOutput;

proc.WaitForExit(2000);

if (proc.HasExited)
            return hOutput.ReadToEnd();

return "Web Server attempted to call PHP, however the call has timedout. output = " +hOutput.ReadToEnd();

Это работает абсолютно нормально для меня, когда я передаю ему файл php ниже определенного размера. Но если размер файла php превышает 4 или 5 КБ, процесс php не завершается после его завершения, что приводит к зависанию кода до истечения времени ожидания 2000 мс. Я делаю что-то неправильно? Вывод по таймауту возвращает полный HTML, который я пытаюсь получить. Просто процесс не заканчивается, и он должен ждать.

Я искал в Google около часа и не могу понять, почему он это делает.

Спасибо за ваше помощь: D

1 Ответ

0 голосов
/ 16 марта 2020

Я решил это сам. После еще нескольких копаний я понял, что он остановится, если стандартный поток вывода заполнится. Итак, в конце я непрерывно читаю поток в процессе его обработки. Мой окончательный код выглядит так и отлично работает:

System.Diagnostics.Process proc = new System.Diagnostics.Process();
string sOutput = "";

proc.EnableRaisingEvents = false;
proc.StartInfo.FileName = "php/php-cgi.exe";

proc.StartInfo.Arguments = "-f " + filePath + " " + queryString;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.CreateNoWindow = true;

proc.Start();

StreamReader hOutput = proc.StandardOutput;

Stopwatch timeout = new Stopwatch();
timeout.Start();

string buffer = "";
int timeoutMS = 2000;
while (timeout.ElapsedMilliseconds < timeoutMS)
{
    buffer += hOutput.ReadToEnd();
    if (proc.HasExited)
    {
        break;
    }
}
if (timeout.ElapsedMilliseconds >= timeoutMS)
{
    return "Web Server attempted to call PHP, however the call has timedout.";
}

return buffer;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...