Файл урезан при чтении - PullRequest
       4

Файл урезан при чтении

0 голосов
/ 16 февраля 2019

Я пишу некоторые результаты json в файлах на PHP на общем хостинге (fwrite).

Затем я читаю эти файлы для извлечения результатов json (file_get_contents).

Это происходит несколько раз (может быть один из более чем тысячи), что, когда я читаю этот файл, он выглядит усеченным: я могу прочитать только несколько первых 32768 байт файла.

Я добавил некоторый код для копирования / вставки файлаЯ читаю, если строка json неверна, и я получаю 2 разных файла: исходный был правильно написан, так как содержит допустимую строку json, а скопированная содержит только начало исходной и имеет размерx * 32768 байт.

Не могли бы вы представить, в чем может быть проблема и как ее решить?(Я не знаю, как продолжить расследование)

Спасибо

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Как следует из комментария @UlrichEckhardt, это было связано с проблемой параллелизма чтения / записи.Я пытался прочитать файл, который был написан.Я решил это, просто подождав, прежде чем пытаться снова прочитать файл

0 голосов
/ 17 февраля 2019

Без примера кода невозможно дать ответ «исправить мой код», но при программировании записи / чтения файлов вы должны следовать простому процессу (в описании которого отсутствует один довольно важный шаг!)

Сначала запишите в файл TEMP (вы записываете в файл, но здесь важно записать в файл TEMP - в противном случае вы можете столкнуться с условиями гонки .......;);

простой способ сделать это в php

$yourData = "whateverYourDataIs....";
$goodfilename = 'whateverYourGoodFileNameIsForYourData.json';
$tempfilename = 'tempfile' . time(); // MANY ways to do this (lots of SO posts on it - just get a unique name every time you write ('unique' may not be needed if you only occasionally do a write, but it is a good safety measure to avoid collisions and time() works for many programs.)
// Now, use $tempfilename in your fwrite.
$fwrite = fwrite($tempfilename,$yourData);
if ($fwrite === false) { 
    // the write failed, so do whatever 'error' function you may need
    // since it failed, there should be no file, but not a bad idea to attempt to delete it
    unlink ($tempfile);
}
else {
    // the write succeeded, so let's do a 'sanity check' on the file to make sure it is good JSON (this is a 'paranoid' check, but "better safe than sorry", right?)
    if(json_decode($tempfile)){
        // we know the file is good JSON, so now RENAME (this is really fast, so collisions are almost impossible)  NOTE: see http://php.net/manual/en/function.rename.php comments for some potential challenges and workarounds if you have trouble with rename.
        rename($tempfilename,$goodfilename);
    }
    // Now, the GOOD file will contain your new data - and those read issues are gone! (though never say 'never' - it may be possible, but very unlikely!)  
}

Это может быть / не ваша проблема напрямую, и вам придется подойти, чтобы соответствовать вашему коду, но как фактор безопасности -и хороший способ избежать коллизий, он должен дать вам ~ 100% успеха при чтении, что, я считаю, то, что вы ищете!)

Если это не поможет, тогда потребуется какой-то прямой код для обеспеченияболее полный ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...