WordPress常见502 Bad Gateway错误的解决办法

出现这个错误的很大原因是执行时间过长,php-fpm超时退出;但是为了准确查找原因,我们需要查看nginx以及php-fpm的运行日志来确定问题的关键所在。

nginx日志位置

同时查看nginx.conf中的配置情况,对几个timeout的值作必要修改,他们的原值是600或者300,我比较粗暴,直接在原基数基础上加0.(存疑,实际上这里并没有报错,但是我还是进行了加0操作)

php-fpm日志

在下方的日志中可以明确看出是因为执行时长原因导致自动终结。

所以我们需要对php/etc/php-fpm.conf中request_terminate_timeout的值做适当增加(我直接加了三个0),这样问题就解决了。

然而还有一个问题需要了解,那就是如何让其在后台运行而不影响前端体验?wp_schedule_single_event() 或者wp_schedule_event(), 部分可参见https://www.wpdaxue.com/wp-cron.html

// 重新生成缩略图---一下功能将依据已经注册的所录入尺寸重新生成缩略图
// Put the function in a class to make it more extendable
class GB_regen_media {
    public function gb_regenerate($imageId) {
        $imagePath = wp_get_original_image_path($imageId);

        if ($imagePath && file_exists($imagePath)) {
            // unlink();
            wp_generate_attachment_metadata($imageId, $imagePath);
        }
    }
}

// Add a load function
function gb_regen_load() {
    // Instantiate the class
    $gb_regen_media = new GB_regen_media();

    $regenerate_thumbnail_value = get_option('xcm_regenerate_thumbnail_enable', '');
    $args = array('post_type'=>'attachment','numberposts'=>null,'post_status'=>null);
    $attachments = get_posts($args);

    // You can get the image Id from the url of the media screen
    if($attachments){
        require_once(ABSPATH . 'wp-admin/includes/image.php');
        foreach($attachments as $attachment){
            $gb_regen_media->gb_regenerate($attachment->ID);
        }
    }
}
add_action('sck_regen_thumbs_event','gb_regen_load');// Create the event which will execute the automated task.

function sck_regen_thumbs_in_5s($new_value,$old_value) {
    // Schedule the event.
    if( ! wp_next_scheduled( 'notesontech_refresh_feed_event' ) && $new_value == '1' ){
        wp_schedule_single_event( time() + 60 , 'sck_regen_thumbs_event');//crontab最小间隔是1分钟
        $new_value = '';
    }
    return $new_value;
}
add_filter('pre_update_option_xcm_regenerate_thumbnail_enable', 'sck_regen_thumbs_in_5s',10,2);