Skip to content

Commit cdda69f

Browse files
Add multi-worker support to the beta features menu. (#2058)
* Add multi-worker support to the beta features menu. * Making linter happy. * Remove "experimental" from multi-worker description because it is already in the beta menu * Fix types * Fix tests --------- Co-authored-by: Fredrik Rombach Ekelund <fredrik.rombach.ekelund@automattic.com>
1 parent d603f0b commit cdda69f

File tree

5 files changed

+35
-3
lines changed

5 files changed

+35
-3
lines changed

src/ipc-types.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ interface FeatureFlags {
8686

8787
interface BetaFeatures {
8888
studioSitesCli: boolean;
89+
multiWorkerSupport: boolean;
8990
createSiteFromRemote: boolean;
9091
}
9192

src/lib/beta-features.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@ const BETA_FEATURES_DEFINITION: Record< keyof BetaFeatures, BetaFeatureDefinitio
1414
default: false,
1515
description: '"studio site" command to manage local sites from terminal',
1616
},
17+
multiWorkerSupport: {
18+
label: 'Multi-Worker Support',
19+
key: 'multiWorkerSupport',
20+
default: false,
21+
description: 'Enable multi-worker PHP processing for faster performance',
22+
},
1723
createSiteFromRemote: {
1824
label: 'Site creation from existing remote site',
1925
key: 'createSiteFromRemote',

src/lib/wordpress-provider/playground-cli/playground-cli-provider.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { WordPressInstallMode } from '@wp-playground/wordpress';
66
import { recursiveCopyDirectory, pathExists, isWordPressDirectory } from 'common/lib/fs-utils';
77
import { DEFAULT_LOCALE } from 'common/lib/locale';
88
import { isOnline } from 'common/lib/network-utils';
9+
import { getBetaFeatures } from 'src/lib/beta-features';
910
import { getPreferredSiteLanguage } from 'src/lib/site-language';
1011
import { keepSqliteIntegrationUpdated } from 'src/lib/sqlite-versions';
1112
import { isValidWordPressVersion } from 'src/lib/wordpress-version-utils';
@@ -26,6 +27,7 @@ export interface PlaygroundCliOptions {
2627
autoMount: boolean;
2728
wordpressInstallMode: WordPressInstallMode;
2829
blueprint?: Blueprint;
30+
enableMultiWorker?: boolean;
2931
}
3032

3133
export const PLAYGROUND_CLI_PROVIDER_NAME = 'playground-cli';
@@ -64,6 +66,13 @@ export class PlaygroundCliProvider implements WordPressProvider {
6466
const phpVersion = options.phpVersion || '8.3';
6567
const hasWordPress = isWordPressDirectory( options.path );
6668

69+
// Get beta features to check if multi-worker support is enabled
70+
const betaFeatures = await getBetaFeatures();
71+
72+
if ( betaFeatures.multiWorkerSupport ) {
73+
console.log( '[PlaygroundCliProvider] Multi-worker support is enabled via beta features' );
74+
}
75+
6776
const playgroundOptions: PlaygroundCliOptions = {
6877
port,
6978
phpVersion,
@@ -73,6 +82,7 @@ export class PlaygroundCliProvider implements WordPressProvider {
7382
? 'install-from-existing-files-if-needed'
7483
: 'download-and-install',
7584
blueprint: options.blueprint,
85+
enableMultiWorker: betaFeatures.multiWorkerSupport,
7686
};
7787

7888
const serverOptions: WordPressServerOptions = {

src/lib/wordpress-provider/playground-cli/playground-server-process-child.ts

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { cpus } from 'os';
12
import { SupportedPHPVersion, PHPRunOptions } from '@php-wasm/universal';
23
import { __ } from '@wordpress/i18n';
34
import { runCLI, RunCLIArgs, RunCLIServer } from '@wp-playground/cli';
@@ -186,6 +187,7 @@ async function startServer(
186187
const defaultConstants = {
187188
WP_SQLITE_AST_DRIVER: true,
188189
};
190+
189191
const mounts = [
190192
{
191193
hostPath: options.documentRoot,
@@ -201,7 +203,7 @@ async function startServer(
201203
},
202204
];
203205

204-
const args: RunCLIArgs = {
206+
const args: RunCLIArgs & { command: 'server' } = {
205207
command: 'server',
206208
internalCookieStore: false,
207209
login: false,
@@ -214,6 +216,15 @@ async function startServer(
214216
wordpressInstallMode: options.wordpressInstallMode,
215217
};
216218

219+
// Enable multi-worker support if beta feature is enabled
220+
if ( options.enableMultiWorker ) {
221+
const workerCount = Math.max( 1, cpus().length - 1 );
222+
console.log(
223+
`[playground-cli] Enabling experimental multi-worker support with ${ workerCount } workers (CPU cores - 1)`
224+
);
225+
args.experimentalMultiWorker = workerCount;
226+
}
227+
217228
if ( options.phpVersion ) {
218229
args.php = options.phpVersion as SupportedPHPVersion;
219230
}
@@ -232,8 +243,11 @@ async function startServer(
232243

233244
server = await runCLI( args );
234245

235-
if ( ! server ) {
236-
throw new Error( 'Could not start server' );
246+
// Log actual worker count for verification
247+
if ( options.enableMultiWorker ) {
248+
console.log(
249+
`[playground-cli] Server started with ${ server.workerThreadCount } worker thread(s)`
250+
);
237251
}
238252

239253
if ( serverOptions.adminPassword ) {

src/stores/beta-features-slice.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const initialState: BetaFeaturesState = {
1111
features: {
1212
studioSitesCli: false,
1313
createSiteFromRemote: false,
14+
multiWorkerSupport: false,
1415
},
1516
loading: false,
1617
};

0 commit comments

Comments
 (0)