kotcich
@kotcich
Я скучный.

Что быстрее: file_get_contents к json файлу или запрос к бд?

На сколько я понимаю, зависит от того, насколько сильно заполнен json файл, но опять же, мб кто знает статьи толковые или сам распишет?
Каков должен быть вес json файла, чтобы быть эффективнее запроса к бд? Можно какие то конкретные цифры?
P.S.
Я это спрашиваю, так как есть условные сокеты для чатов, там же вряд ли прям каждое сообщение сразу же в бд записывают(или так и делают?).
  • Вопрос задан
  • 413 просмотров
Решения вопроса 2
DevMan
@DevMan
вопрос абсолютно дебильный. и по содержанию, и по задаче.
скорость – в подавляющем кол-ве случаев вообще не является критерием.
критерий – удобство использования.

показываю на пальцах:
в десять раз быстрее. звучит круто, да?
а если взять не относительно, а абсолютно: насколько в разрезе вэба 0.001 секунды быстрее 0.01 секунды?
эту разницу вообще не заметить пока у вас не миллионы хитов хотя бы в час.

а если вам так уж уперлось получить ответ, то делайте замеры. потому что замеры других не имеют никакого отношения к вашим условиям.
Ответ написан
Комментировать
kotcich
@kotcich Автор вопроса
Я скучный.
Крч, если коротко, то в задачах, где происходит частое обращение к бд(ну я лично так думаю, не бейте), выгоднее использовать json файл.
Я использовал php функцию microtime, записывая в переменную ее значение вот так $time=microtime(true), первой строчкой в методе контроллера, далее выполнял код и самой последней строчкой ритернул return round(microtime(true) - $time, 4);, таким образом замеряя исполнение кода с округлением в 4 символа после запятой.
Вот пример всего кода в метода:
public function actionIndex()
    {
        $time = microtime(true);

        $user = User::findOne(['username' => 'www']);
        $user->username = 'www';
        $user->update();

        $json = json_decode(file_get_contents(__DIR__ ."/../../common/models/test.json"), true);
        $json['b'] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
        file_put_contents(__DIR__ . "/../../common/models/test.json", json_encode($json));

        return round(microtime(true) - $time, 4);
    }

Как вы понимаете, либо обращение к бд, либо обращение к файлу было закомментировано. Ну и для чистоты эксперимента я не просто получал данные из бд или файла, но и делал какую то обработку, селектил и менял значение поля модели, а потом делал updated(), либо менял значение объекта по ключу в файле. Так же стоит заметить, что при работе с файлом я использовал json_encode() и json_decode(), так как в реальной задаче вам вряд ли будет нужный чистый json.

Теперь к цифрам:
Среднее значение занимаемого времени при работе с бд, это - 0.850, а вот время исполнения получения и перезаписи файла зависит от его объема. Я судил не по кб, а по кол-ву символов в файле, так как IDE показывает это. И дело в том, что json файл с 1 млн символов, запись с декодом, смена какого то значения и потом перезапись с инкодом занимает в среднем 0.100. Другими словами 1 млн === 0.100.
Когда файл имел символов 200, то вся операция занимала в 100 процентах случаев 0.002.

Будут вопросы, пишите.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
sergiks
@sergiks Куратор тега PHP
♬♬
есть условные сокеты для чатов, там же вряд ли прям каждое сообщение сразу же в бд

для сокетов и скорости можно всё держать в памяти: пришло сообщение – сразу ушло получателям, плюс в очередь задание на отложенную запись этого сообщения в БД для товарища майора тех, кто оффлайн, напотом. Немного другая архитектура: события, корутины. В контексте PHP посмотрите на Swoole.

JSON файл можно использовать для каких-то редко меняющихся данных, настроек. Например, для ключа-подписи-настроек доступа к какому-то стороннему API. С БД я бы не сравнивал. JSON надо весь считать и весь распарсить; БД держит все файлы открытыми, наготове, только отмотать на нужную позицию. В БД кэширование и оптимиация всякая.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы