我正在尝试创建一个 PHP“编辑器”,因此,我有一个带有 PHP 编辑器的表单和一个处理作为输入提交并作为对象返回的代码的文件。
为了捕获一些数据,比如执行时间和缓冲区长度,我需要在代码被评估后获取它们。这里的问题是,如果用户使用
die
终止程序的执行,它将不会获得该信息。
这是处理提交代码的文件:
<?php
$path = $_SERVER['DOCUMENT_ROOT'];
require_once $path . '/wp-load.php';
require WP_PLUGIN_DIR . '/php-editor/vendor/autoload.php';
$output = [];
$data = json_decode( file_get_contents( "php://input" ), true );
// Remove E_WARNING from output
error_reporting(E_ALL ^ E_WARNING);
ini_set('display_errors', true);
if ( $data['data'] ) {
ob_start();
$start_time = microtime(1);
try {
// Execute client's code
eval( $data['data'] );
} catch (\Exception $e) {
$output['output'] = 'N/A';
}
// Generate response
$output['output'] = ob_get_contents();
$output['execution_time'] = number_format(microtime(1) - $start_time, 2, '.', '') * 100 . 'ms';
$output['buffer_length'] = number_format((float)ob_get_length(), 0, ',', '.') . 'B';
ob_end_clean();
// Return response as Pretty JSON
echo json_encode($output, JSON_PRETTY_PRINT);
}
如果用户提交
var_dump("test"); die;
(例如),则不会显示之后的任何内容,因为程序已停止使用 die()
函数运行(即使在捕获它之后)并且不会返回 $output
对象。关于如何防止这种情况有什么建议吗?