mirror of
https://github.com/dunglas/frankenphp.git
synced 2025-12-24 13:38:11 +08:00
* refactor: rely on context.Context for log/slog and others * optimize * refactor * Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix watcher-skip * better globals handling * fix --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
58 lines
1.7 KiB
Go
58 lines
1.7 KiB
Go
package frankenphp
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
)
|
|
|
|
// EXPERIMENTAL: Workers allows you to register a worker.
|
|
type Workers interface {
|
|
// SendRequest calls the closure passed to frankenphp_handle_request() and updates the PHP context .
|
|
// The generated HTTP response will be written through the provided writer.
|
|
SendRequest(rw http.ResponseWriter, r *http.Request) error
|
|
// SendMessage calls the closure passed to frankenphp_handle_request(), passes message as a parameter, and returns the value produced by the closure.
|
|
SendMessage(ctx context.Context, message any, rw http.ResponseWriter) (any, error)
|
|
// NumThreads returns the number of available threads.
|
|
NumThreads() int
|
|
}
|
|
|
|
type extensionWorkers struct {
|
|
name string
|
|
fileName string
|
|
num int
|
|
options []WorkerOption
|
|
internalWorker *worker
|
|
}
|
|
|
|
// EXPERIMENTAL: SendRequest sends an HTTP request to the worker and writes the response to the provided ResponseWriter.
|
|
func (w *extensionWorkers) SendRequest(rw http.ResponseWriter, r *http.Request) error {
|
|
fr, err := NewRequestWithContext(
|
|
r,
|
|
WithOriginalRequest(r),
|
|
WithWorkerName(w.name),
|
|
)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return ServeHTTP(rw, fr)
|
|
}
|
|
|
|
func (w *extensionWorkers) NumThreads() int {
|
|
return w.internalWorker.countThreads()
|
|
}
|
|
|
|
// EXPERIMENTAL: SendMessage sends a message to the worker and waits for a response.
|
|
func (w *extensionWorkers) SendMessage(ctx context.Context, message any, rw http.ResponseWriter) (any, error) {
|
|
fc := newFrankenPHPContext()
|
|
fc.logger = globalLogger
|
|
fc.worker = w.internalWorker
|
|
fc.responseWriter = rw
|
|
fc.handlerParameters = message
|
|
|
|
err := w.internalWorker.handleRequest(contextHolder{context.WithValue(ctx, contextKey, fc), fc})
|
|
|
|
return fc.handlerReturn, err
|
|
}
|