From c23dd927a92501fa94fd38d6eebc0d0ff39699eb Mon Sep 17 00:00:00 2001 From: Bero Date: Fri, 16 Feb 2024 12:34:19 +0100 Subject: [PATCH] Display debug.log for request --- packages/php-wasm/universal/src/lib/base-php.ts | 12 ++++++++++++ .../php-wasm/universal/src/lib/universal-php.ts | 1 + .../playground-includes/playground_logger.php | 6 +----- .../playground/remote/src/lib/worker-thread.ts | 9 +++++++++ packages/playground/website/src/lib/hooks.ts | 15 ++++++++++++--- packages/playground/website/src/lib/logger.ts | 7 +++++-- 6 files changed, 40 insertions(+), 10 deletions(-) diff --git a/packages/php-wasm/universal/src/lib/base-php.ts b/packages/php-wasm/universal/src/lib/base-php.ts index c45b910800..fd9356e5f1 100644 --- a/packages/php-wasm/universal/src/lib/base-php.ts +++ b/packages/php-wasm/universal/src/lib/base-php.ts @@ -234,6 +234,14 @@ export abstract class BasePHP implements IsomorphicLocalPHP { return this.requestHandler.request(request, maxRedirects); } + getPhpErrorLog() { + const logPath = '/wordpress/wp-content/debug.log'; + if (!this.fileExists(logPath)) { + return ''; + } + return this.readFileAsText(logPath); + } + /** @inheritDoc */ async run(request: PHPRunOptions): Promise { /* @@ -243,6 +251,7 @@ export abstract class BasePHP implements IsomorphicLocalPHP { * be dispatched before the first one is finished. */ const release = await this.semaphore.acquire(); + const logSize = this.getPhpErrorLog().length; let heapBodyPointer; try { if (!this.#webSapiInitialized) { @@ -288,6 +297,9 @@ export abstract class BasePHP implements IsomorphicLocalPHP { release(); this.dispatchEvent({ type: 'request.end', + data: { + log: this.getPhpErrorLog().substring(logSize), + }, }); } } diff --git a/packages/php-wasm/universal/src/lib/universal-php.ts b/packages/php-wasm/universal/src/lib/universal-php.ts index f75d734f25..74210dbaf8 100644 --- a/packages/php-wasm/universal/src/lib/universal-php.ts +++ b/packages/php-wasm/universal/src/lib/universal-php.ts @@ -6,6 +6,7 @@ import { PHPResponse } from './php-response'; */ export interface PHPRequestEndEvent { type: 'request.end'; + data?: {[log: string]: string}; } /** diff --git a/packages/playground/remote/src/lib/playground-mu-plugin/playground-includes/playground_logger.php b/packages/playground/remote/src/lib/playground-mu-plugin/playground-includes/playground_logger.php index 23cd0b33cb..acb45646d5 100644 --- a/packages/playground/remote/src/lib/playground-mu-plugin/playground-includes/playground_logger.php +++ b/packages/playground/remote/src/lib/playground-mu-plugin/playground-includes/playground_logger.php @@ -6,8 +6,4 @@ ini_set('error_log', $log_file); ini_set('ignore_repeated_errors', true); ini_set('display_errors', false); -ini_set('log_errors', true); - -error_log('playground_logger.php loaded'); - -throw new Exception('test'); +ini_set('log_errors', true); \ No newline at end of file diff --git a/packages/playground/remote/src/lib/worker-thread.ts b/packages/playground/remote/src/lib/worker-thread.ts index 0401c73b80..b669d5f9ef 100644 --- a/packages/playground/remote/src/lib/worker-thread.ts +++ b/packages/playground/remote/src/lib/worker-thread.ts @@ -268,6 +268,15 @@ try { }); } + // Enable the WordPress debug mode + await defineWpConfigConsts(php, { + consts: { + WP_DEBUG: true, + WP_DEBUG_LOG: true, + WP_DEBUG_DISPLAY: false, + }, + }); + // Always install the playground mu-plugin, even if WordPress is loaded // from the OPFS. This ensures: // * The mu-plugin is always there, even when a custom WordPress directory diff --git a/packages/playground/website/src/lib/hooks.ts b/packages/playground/website/src/lib/hooks.ts index b3140c68c0..313c96a144 100644 --- a/packages/playground/website/src/lib/hooks.ts +++ b/packages/playground/website/src/lib/hooks.ts @@ -2,7 +2,8 @@ import { useEffect, useRef, useState } from 'react'; import { Blueprint, startPlaygroundWeb } from '@wp-playground/client'; import type { PlaygroundClient } from '@wp-playground/client'; import { getRemoteUrl } from './config'; -import { get_logger } from './logger'; +import { LogSeverity, get_logger } from './logger'; +import { PHPRequestEndEvent } from '@php-wasm/universal/src/lib/universal-php'; interface UsePlaygroundOptions { blueprint?: Blueprint; @@ -35,15 +36,23 @@ export function usePlayground({ blueprint, storage }: UsePlaygroundOptions) { remoteUrl.searchParams.set('storage', storage); } - get_logger(undefined); + const logger = get_logger(undefined); startPlaygroundWeb({ iframe, remoteUrl: remoteUrl.toString(), blueprint, }).then(async (playground) => { playground.onNavigation((url) => setUrl(url)); + playground.addEventListener('request.end', (event) => { + event = event as PHPRequestEndEvent; + if (event.data && event.data.log) { + logger.logRaw(event?.data.log); + } + } ); setPlayground(() => playground); - }); + }).catch((error) => { + logger.log(error, LogSeverity.Fatal); + } ); // eslint-disable-next-line react-hooks/exhaustive-deps }, [iframe, awaitedIframe]); diff --git a/packages/playground/website/src/lib/logger.ts b/packages/playground/website/src/lib/logger.ts index 6ed08ba606..d7b94bbaa2 100644 --- a/packages/playground/website/src/lib/logger.ts +++ b/packages/playground/website/src/lib/logger.ts @@ -33,7 +33,7 @@ export class Logger { } private collectPlaygroundLogs() { - if (typeof window !== 'undefined') { + if (typeof window !== 'undefined') { window.addEventListener('error', (event) => { this.log( `${event.message} in ${event.filename} on line ${event.lineno}:${event.colno}`, @@ -41,7 +41,6 @@ export class Logger { ); }); window.addEventListener('unhandledrejection', (event) => { - console.log(event); this.log( `${event.reason.stack}`, LogSeverity.Fatal @@ -74,6 +73,10 @@ export class Logger { } const now = this.formatLogDate(new Date()); const log = `[${now}] ${this.LOG_PREFIX} ${LogSeverity[severity]}: ${message}`; + this.logRaw(log); + } + + public logRaw(log: string): void { console.debug(log); }