diff --git a/src/ipc-types.d.ts b/src/ipc-types.d.ts index 9142f191c..2c1c3d259 100644 --- a/src/ipc-types.d.ts +++ b/src/ipc-types.d.ts @@ -86,6 +86,7 @@ interface FeatureFlags { interface BetaFeatures { studioSitesCli: boolean; + multiWorkerSupport: boolean; } interface AppGlobals extends FeatureFlags { diff --git a/src/lib/beta-features.ts b/src/lib/beta-features.ts index 860720813..13ab20b43 100644 --- a/src/lib/beta-features.ts +++ b/src/lib/beta-features.ts @@ -14,6 +14,12 @@ const BETA_FEATURES_DEFINITION: Record< keyof BetaFeatures, BetaFeatureDefinitio default: false, description: '"studio site" command to manage local sites from terminal', }, + multiWorkerSupport: { + label: 'Multi-Worker Support', + key: 'multiWorkerSupport', + default: false, + description: 'Enable multi-worker PHP processing for faster performance', + }, } as const; export const BETA_FEATURES: Record< keyof BetaFeatures, BetaFeatureDefinition > = diff --git a/src/lib/wordpress-provider/playground-cli/playground-cli-provider.ts b/src/lib/wordpress-provider/playground-cli/playground-cli-provider.ts index c49441653..923aeecbd 100644 --- a/src/lib/wordpress-provider/playground-cli/playground-cli-provider.ts +++ b/src/lib/wordpress-provider/playground-cli/playground-cli-provider.ts @@ -5,6 +5,7 @@ import { RecommendedPHPVersion } from '@wp-playground/common'; import { recursiveCopyDirectory, pathExists, isWordPressDirectory } from 'common/lib/fs-utils'; import { DEFAULT_LOCALE } from 'common/lib/locale'; import { isOnline } from 'common/lib/network-utils'; +import { getBetaFeatures } from 'src/lib/beta-features'; import { getPreferredSiteLanguage } from 'src/lib/site-language'; import { keepSqliteIntegrationUpdated } from 'src/lib/sqlite-versions'; import { isValidWordPressVersion } from 'src/lib/wordpress-version-utils'; @@ -25,6 +26,7 @@ export interface PlaygroundCliOptions { autoMount: boolean; skipWordpressSetup: boolean; blueprint?: Blueprint; + enableMultiWorker?: boolean; } export const PLAYGROUND_CLI_PROVIDER_NAME = 'playground-cli'; @@ -65,6 +67,13 @@ export class PlaygroundCliProvider implements WordPressProvider { const phpVersion = options.phpVersion || '8.3'; const hasWordPress = isWordPressDirectory( options.path ); + // Get beta features to check if multi-worker support is enabled + const betaFeatures = await getBetaFeatures(); + + if ( betaFeatures.multiWorkerSupport ) { + console.log( '[PlaygroundCliProvider] Multi-worker support is enabled via beta features' ); + } + const playgroundOptions: PlaygroundCliOptions = { port, phpVersion, @@ -72,6 +81,7 @@ export class PlaygroundCliProvider implements WordPressProvider { autoMount: true, skipWordpressSetup: hasWordPress, blueprint: options.blueprint, + enableMultiWorker: betaFeatures.multiWorkerSupport, }; const serverOptions: WordPressServerOptions = { diff --git a/src/lib/wordpress-provider/playground-cli/playground-server-process-child.ts b/src/lib/wordpress-provider/playground-cli/playground-server-process-child.ts index 9239e91b7..49c4fb9bb 100644 --- a/src/lib/wordpress-provider/playground-cli/playground-server-process-child.ts +++ b/src/lib/wordpress-provider/playground-cli/playground-server-process-child.ts @@ -1,3 +1,4 @@ +import { cpus } from 'os'; import { SupportedPHPVersion, PHPRunOptions } from '@php-wasm/universal'; import { runCLI, RunCLIArgs, RunCLIServer } from '@wp-playground/cli'; import { sanitizeRunCLIArgs } from 'src/lib/sentry-sanitizer'; @@ -161,6 +162,7 @@ async function startServer( const defaultConstants = { WP_SQLITE_AST_DRIVER: true, }; + const mounts = [ { hostPath: options.documentRoot, @@ -189,6 +191,15 @@ async function startServer( skipWordPressSetup: options.skipWordpressSetup, }; + // Enable multi-worker support if beta feature is enabled + if ( options.enableMultiWorker ) { + const workerCount = Math.max( 1, cpus().length - 1 ); + console.log( + `[playground-cli] Enabling experimental multi-worker support with ${ workerCount } workers (CPU cores - 1)` + ); + args.experimentalMultiWorker = workerCount; + } + if ( options.phpVersion ) { args.php = options.phpVersion as SupportedPHPVersion; } @@ -207,6 +218,13 @@ async function startServer( server = await runCLI( args ); + // Log actual worker count for verification + if ( options.enableMultiWorker ) { + console.log( + `[playground-cli] Server started with ${ server.workerThreadCount } worker thread(s)` + ); + } + if ( serverOptions.adminPassword ) { await setAdminPassword( server, serverOptions.adminPassword ); }