Как побороть ошибку 504 Gateway Timeout (time out)?

176
09 декабря 2019, 02:50

Есть общий скрипт:

<?php
$connect=new mysqli("localhost","","","");
$connect->query("SET NAMES 'utf8'");
clear_table("a",$connect);  
clear_table("b",$connect);
clear_table("c",$connect);
...
include_once 'data_new.php';
exec('php data_new.php');    //insert данных в foreach
include_once 'data_old.php';
exec('php data_old.php');   //insert данных в foreach
include_once 'data_fut.php';
exec('php data_fut.php');    //insert данных в foreach

function clear_table($table, $connect){
    $sql = "DELETE FROM ".$table;
    $connect->query($sql);
    $sql = "ALTER TABLE ".$table." AUTO_INCREMENT = 1";
    $connect->query($sql);   
}
?>  

Каким образом сделать так, чтобы каждый clear_table и каждый exec выполнялся поочередно, а то при запуске выдает ошибку (Ошибка 504 Gateway Timeout (time out) nginx) ?

Answer 1

Можно поочерёдно выполнять разные блоки case'ов, передавая в switch() GET-параметры, и в каждом case'е выполнять перенаправление на следующий по порядку case. Теоретически, этот код должен запускаться при клике по ссылке "Запуск", и останавливаться после выполнения последнего блока case: 3:

$connect=new mysqli("localhost","","","");
$connect->query("SET NAMES 'utf8'");
$k = isset($_GET['k']) ? abs($_GET['k']) : 0;
switch ($k) {
    case 1:
        clear_table("a", $connect);
        // include_once 'data_new.php';
        exec('php data_new.php');    //insert данных в foreach
        header('Refresh:0; url=?k=' . ++$k);
        break;
    case 2:
        clear_table("b",$connect);
        // include_once 'data_old.php';
        exec('php data_old.php');   //insert данных в foreach
        header('Refresh:0; url=?k=' . ++$k);
        break;
    case 3:
        clear_table("c",$connect);
        // include_once 'data_fut.php';
        exec('php data_fut.php');    //insert данных в foreach
        header('Refresh:0; url=' . basename(__FILE__));
        break;
    default:
        echo '<a href="?k=1">Запуск</a>';
        break;
}

function clear_table($table, $connect){
    $sql = "DELETE FROM ".$table;
    $connect->query($sql);
    $sql = "ALTER TABLE ".$table." AUTO_INCREMENT = 1";
    $connect->query($sql);   
}
Answer 2

Надо просто убрать строчки с exec() (или include, на выбор)

Тогда этот код перестанет выполнять каждый скрипт по два раза и станет работать значительно быстрее.

Плюс, если там вставки в цикле, то заключить их в транзакции

Answer 3

Ошибка 504 Gateway Timeout (time out) nginx

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

<?php 
set_time_limit(0); // 0 Без-конечно или же другое время в секундах

Раз у вас ругается NGINX нужно править его конфиг, на ограничения ngixn влияют следующие настройки, это с учетом что у вас за ним стоит apache а не что-то вроде PHP-FPM

# Где-то в nginx.conf - файле
proxy_connect_timeout 600; 
proxy_send_timeout 600; 
proxy_read_timeout 600; 
send_timeout 600;
READ ALSO
как распознать аудио в текст гуглом на php?

как распознать аудио в текст гуглом на php?

Пробую демо код с главной страницы https://cloudgoogle

180
MongoDB + PHP конвектирование документа в массив

MongoDB + PHP конвектирование документа в массив

прошу помочь в новых начинанияхВынимаю из монги коллецию

177