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

Я хочу написать настольный проект php в C#, но нет доступного встроенного веб-сервера, который я мог бы найти в C#(я пробовал Mongoose, но мне не удалось скомпилировать его файлы в dll), поэтому я создаю простой веб-сервер в C#, с Встроенный HTTP-сервер NET, и я сам пишу код процесса 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 ответов

Другие вопросы по тегам