Wordpress REST Api: как обслуживать несколько одновременных звонков? - PullRequest
0 голосов
/ 28 октября 2019

Я разрабатываю плагин для WordPress и сталкиваюсь с проблемами производительности, когда дело касается работы с REST API. Я зарегистрировал маршрут следующим образом (код внутри класса):

public function __construct()
{
    add_action('rest_api_init', array($this, 'register_rest_load'));
    add_action('admin_enqueue_scripts', array($this, 'enqueue_scripts'));
}

public function register_rest_load()
{
    //Versioned namespace 
    $namespace = 'scs/v1';

    // Register the route
    register_rest_route($namespace, '/load/(?P<id>\d+)', array(
        'methods'   => WP_REST_Server::ALLMETHODS,
        'callback'  => array($this,'loadProfile'),
        'args' => array()
    ));
}

Функция «loadProfile» проходит через скрипт загрузки, который возвращает сообщения xhr внешнему ajax, в то время как он собирает данные из множества другихбазы данных. Поскольку это работает отлично, я не буду включать это здесь. Проблема, с которой я здесь сталкиваюсь, заключается в том, что если я сделаю несколько вызовов ajax на

"my-url.de/wp-json/scs/v1/load/[any_int_here]"

нав то же время, он обслуживает только 1 AJAX-вызов за раз. Но бывает так, что функция loadProfile занимает 3 минуты. Когда я перешел с собственного жесткого кода с прямым вызовом ajax (возможно 6 одновременных вызовов) на более безопасный WordPress REST (только 1 вызов), я потерял производительность. Я тоже пробовал WordPress ajax, но там тоже самое ... только 1 порция.

Есть ли какой-нибудь способ, которым я испортил создание маршрута и конечной точки? Могу ли я изменить свой маршрут и конечную точку для нескольких порций на клиента? Или я должен просто вернуться к ручному AJAX?

Спасибо, прежде чем. Если мне не хватает какой-либо информации, пожалуйста, не стесняйтесь спрашивать.

1 Ответ

0 голосов
/ 29 октября 2019

Поскольку это PHP, вы не можете выполнять многопоточность. Вы не сможете одновременно обслуживать несколько вызовов одного и того же клиента.

Однако в прошлом я совершил некрасивый хак, чтобы преодолеть это, вы можете создать несколько поддоменов, указывающих на один и тот же сервер, с одним и тем же корнем документа.

Пример:

    http://api1.test.com   \
    http://api2.test.com    - /var/www/htdocs/wp-api
    // .....               /
    http://apiN.test.com  /

Таким образом, вы можете делать столько асинхронных запросов, сколько пожелаете (конечно, каждый запрос к другому поддомену) или, по крайней мере, сколько может обработать ваш сервер.

...