svelte / PHP Неожиданный конец ввода JSON - PullRequest
0 голосов
/ 18 марта 2020

Я прошел все связанные вопросы (с неожиданным концом ввода JSON) и пока не нашел решения.

В основном у меня есть MySQL view и PHP файл, который отображает эти данные. Пока не было только выборочных данных (около 50 тыс. Строк), у меня не было никаких проблем, только небольшая задержка. Теперь я добавил более полный набор данных (около 90 тыс. Строк) и столкнулся с задержкой при полной загрузке данных. Соответственно, когда я открываю этот PHP в браузере, он загружает только часть данных и непрерывно добавляет остаток, пока не покажет все. Но кажется, что await svelte не может справиться с этим.

Это код PHP, лишенный несущественных функций:

header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json');

require_once(__DIR__.'/protected/config.php'); //initial setting

try{
    $q = $db->prepare('SELECT * FROM my_view;'); //this is that view in MySQL
    $q->execute();
    $rows = $q->fetchAll();
    echo json_encode($rows);
    exit();
}catch(PDOException $ex){
    err('error executing query', __LINE__);
};
?>

Размер базовых данных для представления около 9 Мб. (5Mb были в порядке)

И вот код svelte снова без несущественных функций:

<script>
import Chart from "Chart.svelte";
let ready;
let data = loadDataUrl('http://127.0.0.1/myfile.php');

async function loadDataUrl(address) {
    try {
        const res = await fetch(address);
        const text = await res.json(); //here might be the ERROR arising

        if (res.ok && text) {
            ready = true;
            return text;
        } else {
            throw new Error(text);
        }
    } catch(ex) {
        alert(ex);
    };
};
</script>

{#await data}
    <p>...loading data...</p>
{:then ready}
    <Chart data="{data}" />
{:catch error}
    <p style="color: red">Chart not created because of: {error.message}</p>
{/await}

Я почти уверен, что проблема возникает, когда PHP показывает только частичные данные и функция loadDataUrl () пытается проанализировать этот неполный набор данных, но я совершенно не представляю, как сделать «ожидание полной загрузки данных». Это вообще возможно? Или мне нужно как-то сказать это в самом PHP, чтобы показать полный набор данных?

1 Ответ

0 голосов
/ 20 марта 2020

Я думаю, что достиг некоторого ограничения MySQL / PHP pipe ... (пожалуйста, поправьте меня, если я говорю бессмысленно). Я не нашел никаких доказательств этому, и мои ограниченные знания не позволяют мне найти более подробную информацию. Для этого большого объема данных я решил использовать выборку локальных JSON файлов:

let data = loadDataJson('assets/myfile.json');

async function loadDataJson(location) {
    try {
        const res = await fetch(location);
        const text = await res.json(); 

        if (res.ok && text) {
            ready = true;
            return text;
        } else {
            throw new Error(text);
        }
    } catch(ex) {
        alert(ex);
    };
};

Это прекрасно работает даже для больших наборов данных (до 50 Мб JSON протестированных файлов), но я буду более чем рад, если кто-то может помочь в решении этой проблемы и помочь другим решить аналогичные проблемы.

...