Comments (4)
I made a simple POC to validate my idea.
Here a simple PHP script which handle signals and runs forever:
<?php
declare(ticks = 1);
class SigtermException extends \Exception {}
pcntl_signal(SIGTERM, function () {
throw new SigtermException('SIGTERM received');
});
set_exception_handler(function ($exception) {
// Log exception as usual
echo "Exception thrown: " , $exception->getMessage(), "\n";
// If it's a Sigterm one, stop execution
if ($exception instanceof SigtermException) {
exit(1);
}
});
for(;;){
echo "Running\n";
usleep(100000);
}
And here is the javascript handler which runs the PHP script:
const spawn = require('child_process').spawn;
var script = spawn('php', ['test.php']);
var timeoutHandler = setTimeout(() => script.kill('SIGTERM'), 2000);
script.on('close', (code) => {
console.log('Process closed with code: ' + code);
clearTimeout(timeoutHandler);
});
script.stdout.on('data', function(data) {
console.log(data.toString());
});
script.stderr.on('data', function(data) {
console.log('[STDERR] ' + data.toString());
});
And finally the execution output:
$ nodejs handler.js
Running
Running
[...]
Running
Exception thrown: SIGTERM received
Process closed with code: 1
So it seems to be working as expected and would allows us to to gracefully shut down the PHP process before the lambda shuts down.
from bref.
A simple solution is the following:
pcntl_async_signals(true);
pcntl_signal(SIGALRM, function () {
throw new \RuntimeException('Maximum execution time reached');
});
pcntl_alarm(2); // a SIGALRM will be triggered after 2 seconds
This could work and wouldn't require any modification in Bref.
from bref.
Yes that is really interesting!
Just to be the devil's advocate: when not using AWS lambda (i.e. Apache/Nginx setup) there is a time limit too and there is the same problem right? So in a way my opinion is that since it's not a new constraint specific to lambdas, it's not critical to offer a solution for this.
However if it's easy and doesn't impact a lot the architecture of Bref then why not! And since we control the PHP binary we can make sure pcntl is available.
from bref.
Just to be the devil's advocate: when not using AWS lambda (i.e. Apache/Nginx setup) there is a time limit too and there is the same problem right? So in a way my opinion is that since it's not a new constraint specific to lambdas, it's not critical to offer a solution for this.
We shouldn't think as if we were working on a classic setup. On natively supported languages, AWS provides a context object which provides a method to get the remaining execution time. That's exactly why I had this idea, in other languages we can check the time left and that's not possible at the moment with PHP/Bref.
Another solution could be to give access to that context object, this could be done through socket for example.
from bref.
Related Issues (20)
- Symfony CLI DATABASE_URL Not Found HOT 1
- Can I fire putJobSuccessResult event from AWS Lambda which is developed with Bref? HOT 1
- Feedback for “Custom domain names” HOT 1
- I am getting this issue :-
- OPENSSL_3.3.0' not found (required by /opt/lib/libssl.so.3) HOT 10
- Stopping 1.x maintenance
- Feedback for “Serverless Laravel - Getting started” HOT 3
- NOTICE since upgrading to v2 HOT 1
- Brefv2 500 Errors Not In Logs HOT 5
- PHP ext-intl is required on layer 8.3 HOT 1
- CURL SSL_ERROR_SYSCALL calling another Lambda HOT 7
- Env always return null after update packages to bref 2 version
- max_execution_time not working HOT 3
- Laravel 11, PHP 8.3 mysql driver not enabled, also can't use postgress
- Bref Serverless v4 HOT 12
- php (not fpm) with BREF_LOOP_MAX=1 is 2x slower than php-fpm
- PDO_SQLITE version HOT 4
- Invalid configuration encountered: at 'functions.app.image': unsupported string format HOT 3
- Better documentation around function runtime and Symfony in Docker HOT 5
- Lambda error: Call to undefined method Bref\Event\Http\HttpRequestEvent::getRequestContext() HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from bref.