Why cannot Apache handle multiple requests at the same time?

nicks picture nicks · May 25, 2016 · Viewed 20.3k times · Source

I have AMPPS installed.

My Apache server cannot handle multiple php requests at once (for example if I call localhost/script.php multiple times, they are processed in a consecutive order). script.php consists only of <?php sleep(10); ?>.

I read that MaxClients directive is responsible for concurrent access configuration, but it is missing in my httpd.conf at all.

Disabling Xdebug and writing session_write_close(); to the beginning of the script didn't work.

When I added session_start(); to the beginning of the file and my code looked like:

<?php

session_start();
session_write_close();
sleep(10);
phpinfo();

echo "Done";

When making 5 requests to localhost/script.php, last 4 waited for the first one to end and then ended concurrently.

Please, help me resolve the issue. If any information that is needed to help me resolve this problem is missing, please notify and I will add it.

Answer

kshitij picture kshitij · Jun 8, 2016

Apache can surely handle multiple requests at the same time, there is something surely going wrong within your apache configuration.

It depends on which version of Apache you are using and how it is configured, but a common default configuration uses multiple workers with multiple threads to handle simultaneous requests. See http://httpd.apache.org/docs/2.2/mod/worker.html for a rundown of how this works.

The reason why you are facing it is: There is some lock somewhere - which can happen, for instance, if the two requests come from the same client, and you are using file-based sessions in PHP : while a script is being executed, the session is "locked", which means the server/client will have to wait until the first request is finished (and the file unlocked) to be able to use the file to open the session for the second user.

The requests come from the same client AND the same browser; most browsers will queue the requests in this case, even when there is nothing server-side producing this behaviour.