Простой веб-сервер, написанный на C #, запускает PHP Project. Почему он явно медленнее, чем Mongoose?

Я хочу написать php desktop проект в C #, но нет доступного встроенного веб-сервера, который я мог найти в C # (я пробовал Mongoose, но мне не удалось скомпилировать его файлы в dll), поэтому я строю простой веб-сервер в C #, с Встроенный NET HTTP-сервер, и сам пишу код процесса php-cgi.

Но после того, как я закончу работу сервера и запустите тот же PHP-проект (Laravel) с Mongoose и моим сервером. Я обнаружил, что сервер Mongoose работает быстрее, чем мой сервер, по скорости отклика.

Я не могу понять, какой момент я упустил.

HTTP-сервер использует System.Net.Sockets.Socket класс для выполнения асинхронного сетевого взаимодействия.

Часть кода (Init Server), как это:

ss = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );
ss.Bind(new IPEndPoint(IPAddress.Any, port));
ss.Listen(100);
ss.BeginAccept(new AsyncCallback(AcceptCallback), ss);

Метод PHP-обработчика:

    bool phpHandler(HttpRequest request, HttpResponse response)
{
string phpScript = rootScriptPath + "\\index.php";
Dictionary<string, string> envs = new Dictionary<string, string>();

setEnvs(envs, request);
PHPProcess pp = new PHPProcess(phpScript, envs);

pp.start();
if (request.Method == "POST")
{

pp.process.StandardInput.AutoFlush = true;
pp.process.StandardInput.Write(request.Content);

pp.process.StandardInput.Close();
}
string outPutContent = pp.readRes();

//separate header and body in php-cgi output
string[] outPutSlices = outPutContent.Split(new String[] { "\r\n" }, StringSplitOptions.None);

bool headerEndFlag = false;

string bodyContent = "";
foreach (string outPutSlice in outPutSlices)
{

if (outPutSlice.Length > 0)
{
if (headerEndFlag)
{
bodyContent += outPutSlice + "\r\n";

}
else
{
if (outPutSlice.IndexOf(':') > 0)
{
string[] headerSingleSlices = outPutSlice.Split(new Char[] { ':' });
if (!response.Header.ContainsKey(headerSingleSlices[0]))
response.Header.Add(headerSingleSlices[0], headerSingleSlices[1]);
}
}

}
else
{
headerEndFlag = true;
}

}
if (bodyContent.Length > 2)
{
bodyContent = bodyContent.Remove(bodyContent.Length - 2);
}

response.Content = bodyContent;
response.ReturnCode = 200;
pp.destory();
return true;
}

Класс процесса PHP:

class PHPProcess
{
private string phpDir = System.Environment.CurrentDirectory + "\\" + Properties.HcParams.Default.php_path;
public Process process;

public PHPProcess(string entranceScript,Dictionary<string,string> envs){
process = new Process();
string scriptName = "\\" + entranceScript.Split(new Char[]{'\\'}).Last();
Console.WriteLine("ScriptName:" + scriptName);
process.StartInfo.FileName = phpDir + "\\php-cgi.exe";
process.StartInfo.Arguments = entranceScript;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.StandardOutputEncoding = Encoding.UTF8;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.EnvironmentVariables.Add("REDIRECT_STATUS", "200");
process.StartInfo.EnvironmentVariables.Add("SCRIPT_NAME", scriptName);
process.StartInfo.EnvironmentVariables.Add("SCRIPT_FILENAME", entranceScript);
process.StartInfo.EnvironmentVariables.Add("SERVER_INTERFACE", "CGI/1.1");
process.StartInfo.EnvironmentVariables.Add("GETWAY_INTERFACE", "CGI/1.1");
process.StartInfo.EnvironmentVariables.Add("SERVER_PROTOCOL", "HTTP/1.1");
process.StartInfo.EnvironmentVariables.Add("SERVER_PORT", Bmain.StartPort.ToString());
foreach (var env in envs)
{
process.StartInfo.EnvironmentVariables.Add(env.Key, env.Value);
}
}

public void start(){
process.Start();

}
public string readRes()
{
string OutputText = process.StandardOutput.ReadToEnd();
return OutputText;
}

public void destory(){
process.WaitForExit();
process.Close();
}
}

Что я могу сделать, чтобы оптимизировать скорость?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]