Skip to content
This repository was archived by the owner on Sep 8, 2021. It is now read-only.

Commit 88e106a

Browse files
committed
Check for webserver startup every millisecond
This cuts down cold starts from over one second to usually around 50 to 100 milliseconds.
1 parent fc86f1c commit 88e106a

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

bootstrap

+14-3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ $AWS_LAMBDA_RUNTIME_API = getenv('AWS_LAMBDA_RUNTIME_API');
99
$http_codes = [100=>'Continue',101=>'Switching Protocols',102=>'Processing',200=>'OK',201=>'Created',202=>'Accepted',203=>'Non-Authoritative Information',204=>'No Content',205=>'Reset Content',206=>'Partial Content',207=>'Multi-Status',208=>'Already Reported',226=>'IM Used',300=>'Multiple Choices',301=>'Moved Permanently',302=>'Found',303=>'See Other',304=>'Not Modified',305=>'Use Proxy',306=>'Switch Proxy',307=>'Temporary Redirect',308=>'Permanent Redirect',400=>'Bad Request',401=>'Unauthorized',402=>'Payment Required',403=>'Forbidden',404=>'Not Found',405=>'Method Not Allowed',406=>'Not Acceptable',407=>'Proxy Authentication Required',408=>'Request Timeout',409=>'Conflict',410=>'Gone',411=>'Length Required',412=>'Precondition Failed',413=>'Request Entity Too Large',414=>'Request-URI Too Long',415=>'Unsupported Media Type',416=>'Requested Range Not Satisfiable',417=>'Expectation Failed',418=>'I\'m a teapot',419=>'Authentication Timeout',420=>'Enhance Your Calm',420=>'Method Failure',422=>'Unprocessable Entity',423=>'Locked',424=>'Failed Dependency',424=>'Method Failure',425=>'Unordered Collection',426=>'Upgrade Required',428=>'Precondition Required',429=>'Too Many Requests',431=>'Request Header Fields Too Large',444=>'No Response',449=>'Retry With',450=>'Blocked by Windows Parental Controls',451=>'Redirect',451=>'Unavailable For Legal Reasons',494=>'Request Header Too Large',495=>'Cert Error',496=>'No Cert',497=>'HTTP to HTTPS',499=>'Client Closed Request',500=>'Internal Server Error',501=>'Not Implemented',502=>'Bad Gateway',503=>'Service Unavailable',504=>'Gateway Timeout',505=>'HTTP Version Not Supported',506=>'Variant Also Negotiates',507=>'Insufficient Storage',508=>'Loop Detected',509=>'Bandwidth Limit Exceeded',510=>'Not Extended',511=>'Network Authentication Required',598=>'Network read timeout error',599=>'Network connect timeout error'];
1010

1111
function start_webserver() {
12+
$SERVER_STARTUP_TIMEOUT = 1000000; // 1 second
13+
1214
$pid = pcntl_fork();
1315
switch($pid) {
1416
case -1:
@@ -25,11 +27,20 @@ function start_webserver() {
2527
exec("PHP_INI_SCAN_DIR=/opt/etc/php-7.${phpMinorVersion}.d/:/var/task/php-7.${phpMinorVersion}.d/ php -S localhost:8000 -c /var/task/php.ini -d extension_dir=/opt/lib/php/7.${phpMinorVersion}/modules '$handler_filename'");
2628
exit;
2729

28-
// return the child pid to parent
2930
default:
3031
// Wait for child server to start
31-
sleep(1);
32-
return $pid;
32+
$start = microtime(true);
33+
34+
do {
35+
if (microtime(true) - $start > $SERVER_STARTUP_TIMEOUT) {
36+
die("Webserver failed to start within one second\n");
37+
}
38+
39+
usleep(1000);
40+
$fp = @fsockopen('localhost', 8000, $errno, $errstr, 1);
41+
} while ($fp == false);
42+
43+
fclose($fp);
3344
}
3445
}
3546

0 commit comments

Comments
 (0)