WordPress REST API: загрузка больших изображений не доходит до серверной части, несмотря на правильные настройки PHPApache

Ответить
Anonymous
 WordPress REST API: загрузка больших изображений не доходит до серверной части, несмотря на правильные настройки PHP

Сообщение Anonymous »

Описание проблемы:
Я разрабатываю приложение чата с функцией загрузки изображений с использованием WordPress REST API. Когда пользователи прикрепляют несколько больших изображений (3 изображения), запрос не достигает конечной точки серверного API, но изображения меньшего размера работают нормально.
Основные симптомы:
  • 3 маленьких изображения работают без ошибок.
  • Большие изображения не вызывают никаких серверных журналов или ошибок.
  • Отладка WordPress отсутствует. созданные журналы
  • Поставщик сервера подтверждает, что проблем на стороне сервера не обнаружено
Среда
  • WordPress: 6.0+
  • PHP: 8.2
  • Сервер: Apache (общий) хостинг)
Настройки PHP:
  • upload_max_filesize = 600M
  • post_max_size = 650M
  • max_execution_time = 500
  • max_input_time = 500
  • memory_limit = 300M
  • max_input_vars = 3000
Внешний код JavaScript

Код: Выделить всё

function sendImageRequest(question, imagesArray, country, conversationHistory) {
console.log('🖼️ Starting image analysis request with', imagesArray.length, 'images...');

// Prepare image data array with pure base64
const imageDataArray = imagesArray.map(img => {
let pureBase64 = img.data;
if (img.data.startsWith('data:')) {
pureBase64 = img.data.split(',')[1];
}
return {
id: img.id,
data: pureBase64,  // Base64 string
name: img.name
};
});

const requestBody = {
question: question,
image_data: imageDataArray, // Array of base64 images
country: country,
conversation_history: conversationHistory
};

console.log('📤 Image request payload with', imageDataArray.length, 'images, total size:', JSON.stringify(requestBody).length, 'bytes');

$.ajax({
url: '/wp-json/chat2find/v1/image',
method: 'POST',
contentType: 'application/json',
data: JSON.stringify(requestBody),
success: function(response) {
console.log('✅ Image analysis successful');
},
error: function(xhr, status, error) {
console.error('❌ Image analysis error:', error);
}
});
}
Верхний PHP-код WordPress

Код: Выделить всё

class API_Handler {
public function handle_image_request(WP_REST_Request $request) {
try {
error_log('🎯 Image endpoint reached'); // This never fires for large images

$params = $request->get_params();
$question = sanitize_text_field($params['question'] ?? '');
$image_data = $params['image_data'] ?? [];
$country = sanitize_text_field($params['country'] ?? '');
$conversation_history = $params['conversation_history'] ?? [];

if (empty($question)) {
return new WP_Error('invalid_input', 'Question is required', array('status' => 400));
}

if (empty($image_data) || !is_array($image_data)) {
return new WP_Error('invalid_input', 'Image data array is required', array('status' => 400));
}

// Validate each image data
foreach ($image_data as $img) {
$img_data = is_array($img) ? ($img['data'] ?? '') : $img;
if (!preg_match('/^[a-zA-Z0-9+\/]+={0,2}$/', $img_data)) {
return new WP_Error('invalid_input', 'Invalid image data format', array('status' => 400));
}
}

// Limit to maximum 3 images
if (count($image_data) > 3) {
return new WP_Error('invalid_input', 'Maximum 3 images allowed', array('status' => 400));
}

// External API call
$api_endpoint = get_option('chat2find_api_endpoint', 'https://example.com/api/');
$image_url = rtrim($api_endpoint, '/') .  '/image';

$response = $this->make_api_call($image_url, [
'question' => $question,
'image_data' => $image_data,
'country' => $country,
'conversation_history' => $conversation_history
], false);

if (is_wp_error($response)) {
error_log('Chat2Find Image API Error: ' . $response->get_error_message());
return new WP_Error('api_error', 'Image analysis service unavailable', array('status' => 503));
}

$response_data = json_decode($response, true);
return new WP_REST_Response($response_data, 200);

} catch (Exception $e) {
error_log('Chat2Find Image Exception: ' . $e->getMessage());
return new WP_Error('internal_error', 'Internal server error', array('status' => 500));
}
}

public function register_routes() {
register_rest_route('chat2find/v1', '/image', array(
'methods' => 'POST',
'callback' => array($this, 'handle_image_request'),
'permission_callback' => array($this, 'check_permission')
));
}

public function check_permission() {
return true;
}
Попытки отладки
Журнал отладки WordPress

Код: Выделить всё

// In wp-config.php
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
Наблюдения
Маленькие изображения (~100 КБ каждое): работает
Большие изображения (~3 МБ каждое): размер запроса ~12–15 МБ, никогда не достигает серверной части
Вкладка "Сеть": показывает отправленный запрос, но не получен ответ
Ошибок сервера нет Журналы Apache/WordPress
Ошибок PHP нет даже при включенной отладке
Вопрос
Что может молча блокировать большие запросы JSON до того, как они достигнут WordPress? Как это исправить?

Подробнее здесь: https://stackoverflow.com/questions/797 ... proper-php
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Apache»