Я создал плагин, который извлекает некоторые данные из API и создает пользовательские сообщения. Плагин работает правильно, поскольку он извлекает и правильно добавляет сообщения, как показано в следующем коде. Проблема, с которой я столкнулся, заключается в том, что этот плагин выполняет слишком много запросов и приводит к ошибке 504 gateway timeout nginx
.
Мой подход заключался в том, чтобы запускать функцию выборки до тех пор, пока не станут доступны массивы или пустой массив, и остановит процесс .
if( !is_array($experts[0]->users) || empty($experts[0]->users)){
return false;
}
Но похоже, что функция работает бесконечно и приводит к проблеме тайм-аута шлюза 504. Я предполагаю, что эти строки в конструкторе вызывают проблему.
add_action('init',array($this, 'get_expertsdup_from_api'));
add_action('wp_ajax_nopriv_get_expertsdup_from_api','get_expertsdup_from_api');
add_action('wp_ajax_get_expertsdup_from_api','get_expertsdup_from_api');
Это потому, что я вызываю get_expertsdup_from_api
в конструкторе?
Я очень новичок в wordpress и PHP разработка. Я также пробовал различные настройки в настройках моего nginx сервера. Но я пришел к выводу, что проблема заключается в этом плагине.
<?php
/**
* Plugin Name: Experts Duplicate
* Description: Wordpress plugin for Experts.
* Version: 1.2
* Author: TestName
*/
if (!defined('ABSPATH'))
{
die;
}
class SerwExpertsDupPlugin
{
function __construct()
{
add_action('init',array($this, 'custom_post_type'));
add_action('init',array($this, 'get_expertsdup_from_api'));
add_action('wp_ajax_nopriv_get_expertsdup_from_api','get_expertsdup_from_api');
add_action('wp_ajax_get_expertsdup_from_api','get_expertsdup_from_api');
}
function expert_activate()
{
$this->custom_post_type();
}
function expert_deactivate()
{
}
function expert_uninstall()
{
}
function custom_post_type()
{
register_post_type(
'expert-dup',[
'public' => true,
'label' => 'ExpertsDuplicate',
'capability_type' => 'post',
'rewrite' => array( 'slug' => '/' ),
'supports' => array( 'title','editor','thumbnail' )
]);
}
function get_expertsdup_from_api()
{
$skip = ( !empty($_POST['skip'])) ? $_POST['skip'] : 0;
$experts = [];
$results = wp_remote_retrieve_body(wp_remote_get('https://myapi/v1/users?take=10&isOwner=true&basic=true&skip=' . $skip));
$results = json_decode($results);
$experts[] = $results;
if( !is_array($experts[0]->users) || empty($experts[0]->users)){
return false;
}
foreach($experts[0] as $expert)
{
foreach($expert as $profile)
{
$owner_profile = $profile->ownerProfile;
$expert_slug = sanitize_title($owner_profile->username);
$existing_expert = get_page_by_path($expert_slug, 'OBJECT', 'expert-dup');
if($existing_expert === null && $expert_slug !== "")
{
$inserted_expert = wp_insert_post([
'post_name' => $service_slug,
'post_title' => $expert_slug,
'post_type' => 'expert-dup',
'post_status' => 'publish',
'post_content' => '[md-react-app]'
]);
if(is_wp_error($inserted_expert))
{
continue;
}
}
}
}
$skip = $skip + 10;
wp_remote_post(admin_url('admin-ajax.php?action=get_expertsdup_from_api'),[
'blocking' => false,
'sslverify' => false,
'body' => [
'skip' => $skip
]
]);
}
}
if(class_exists('SerwExpertsDupPlugin'))
{
$serwExpertsDupPlugin = new SerwExpertsDupPlugin();
}
//activation
register_activation_hook(__FILE__,array($serwExpertsDupPlugin, 'expert_activate'));
//deactivation
register_deactivation_hook(__FILE__,array($serwExpertsDupPlugin, 'expert_deactivate'));
//uninstall
register_uninstall_hook(__FILE__,array($serwExpertsDupPlugin, 'expert_uninstall'));