mirror of
https://github.com/dunglas/frankenphp.git
synced 2025-12-24 13:38:11 +08:00
* Decouple workers. * Moves code to separate file. * Cleans up the exponential backoff. * Initial working implementation. * Refactors php threads to take callbacks. * Cleanup. * Cleanup. * Cleanup. * Cleanup. * Adjusts watcher logic. * Adjusts the watcher logic. * Fix opcache_reset race condition. * Fixing merge conflicts and formatting. * Prevents overlapping of TSRM reservation and script execution. * Adjustments as suggested by @dunglas. * Adds error assertions. * Adds comments. * Removes logs and explicitly compares to C.false. * Resets check. * Adds cast for safety. * Fixes waitgroup overflow. * Resolves waitgroup race condition on startup. * Moves worker request logic to worker.go. * Removes defer. * Removes call from go to c. * Fixes merge conflict. * Adds fibers test back in. * Refactors new thread loop approach. * Removes redundant check. * Adds compareAndSwap. * Refactor: removes global waitgroups and uses a 'thread state' abstraction instead. * Removes unnecessary method. * Updates comment. * Removes unnecessary booleans. * test * First state machine steps. * Splits threads. * Minimal working implementation with broken tests. * Fixes tests. * Refactoring. * Fixes merge conflicts. * Formatting * C formatting. * More cleanup. * Allows for clean state transitions. * Adds state tests. * Adds support for thread transitioning. * Fixes the testdata path. * Formatting. * Allows transitioning back to inactive state. * Fixes go linting. * Formatting. * Removes duplication. * Applies suggestions by @dunglas * Removes redundant check. * Locks the handler on restart. * Removes unnecessary log. * Changes Unpin() logic as suggested by @withinboredom * Adds suggestions by @dunglas and resolves TODO. * Makes restarts fully safe. * Will make the initial startup fail even if the watcher is enabled (as is currently the case) * Also adds compareAndSwap to the test. * Adds comment. * Prevents panic on initial watcher startup.
79 lines
2.0 KiB
Go
79 lines
2.0 KiB
Go
package frankenphp
|
|
|
|
// #include "frankenphp.h"
|
|
import "C"
|
|
import (
|
|
"net/http"
|
|
)
|
|
|
|
// representation of a non-worker PHP thread
|
|
// executes PHP scripts in a web context
|
|
// implements the threadHandler interface
|
|
type regularThread struct {
|
|
state *threadState
|
|
thread *phpThread
|
|
activeRequest *http.Request
|
|
}
|
|
|
|
func convertToRegularThread(thread *phpThread) {
|
|
thread.setHandler(®ularThread{
|
|
thread: thread,
|
|
state: thread.state,
|
|
})
|
|
}
|
|
|
|
// beforeScriptExecution returns the name of the script or an empty string on shutdown
|
|
func (handler *regularThread) beforeScriptExecution() string {
|
|
switch handler.state.get() {
|
|
case stateTransitionRequested:
|
|
return handler.thread.transitionToNewHandler()
|
|
case stateTransitionComplete:
|
|
handler.state.set(stateReady)
|
|
return handler.waitForRequest()
|
|
case stateReady:
|
|
return handler.waitForRequest()
|
|
case stateShuttingDown:
|
|
// signal to stop
|
|
return ""
|
|
}
|
|
panic("unexpected state: " + handler.state.name())
|
|
}
|
|
|
|
// return true if the worker should continue to run
|
|
func (handler *regularThread) afterScriptExecution(exitStatus int) {
|
|
handler.afterRequest(exitStatus)
|
|
}
|
|
|
|
func (handler *regularThread) getActiveRequest() *http.Request {
|
|
return handler.activeRequest
|
|
}
|
|
|
|
func (handler *regularThread) waitForRequest() string {
|
|
select {
|
|
case <-handler.thread.drainChan:
|
|
// go back to beforeScriptExecution
|
|
return handler.beforeScriptExecution()
|
|
|
|
case r := <-requestChan:
|
|
handler.activeRequest = r
|
|
fc := r.Context().Value(contextKey).(*FrankenPHPContext)
|
|
|
|
if err := updateServerContext(handler.thread, r, true, false); err != nil {
|
|
rejectRequest(fc.responseWriter, err.Error())
|
|
handler.afterRequest(0)
|
|
// go back to beforeScriptExecution
|
|
return handler.beforeScriptExecution()
|
|
}
|
|
|
|
// set the scriptFilename that should be executed
|
|
return fc.scriptFilename
|
|
}
|
|
}
|
|
|
|
func (handler *regularThread) afterRequest(exitStatus int) {
|
|
fc := handler.activeRequest.Context().Value(contextKey).(*FrankenPHPContext)
|
|
fc.exitStatus = exitStatus
|
|
maybeCloseContext(fc)
|
|
handler.activeRequest = nil
|
|
}
|