@steamgryshan1998

PHP. Возможно ли добавление контента без Базы Данных?

Необходимо создать сайт-визитку с возможностью добавления/редактирования/удаления/обновления новостных публикаций на чистом PHP. Возможно ли сделать это без использования базы данных, различных CMS и фреймворков? Необходимо реализовать проэкт на PHP.
  • Вопрос задан
  • 357 просмотров
Пригласить эксперта
Ответы на вопрос 6
Zoominger
@Zoominger Куратор тега Веб-разработка
System Integrator
В теории - да, будете костылить свою простенькую реализацию базы данных, но это же геморрой.
Ответ написан
Комментировать
@NinjaNickName
Web разработчик
Если нет возможности использовать MySQL\PostregSQL\Mongo или что-то подобное, всегда можно использовал SQLite, ну или в крайнем случаи хранить все в файлах: parse_ini_file, file_get_contents и т.д.

Mongo, к слову, можно использовать бесплатно в облаке, не устанавливая на сервер (но расширение для работы с Mongo все равно нужно)
Ответ написан
Комментировать
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Делайте админку, в конце редактирования записывайте в файл. Лучше все-же в json и пусть фронт отрисовывает.
Или возьмите какой-нибудь шаблонизатор и записывайте результат.

Хотя паршивый вариант. Попробуйте пререндер на основе vue, в итоге получаете чистый html и немного интерактивности по желанию.

// vue.config.js
var path = require('path')
const PrerenderSPAPlugin = require('prerender-spa-plugin')
const Renderer = PrerenderSPAPlugin.PuppeteerRenderer
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;

module.exports = {
    configureWebpack: {
        module: {
            rules: [
                {
                    test: /\assets\/.*.css$/i,
                    use: ['style-loader', 'css-loader'],
                },
            ],
        },
        plugins: [
            new BundleAnalyzerPlugin(),
            new PrerenderSPAPlugin({
                // Required - The path to the webpack-outputted app to prerender.
                staticDir: path.join(__dirname, 'dist'),

                // Optional - The path your rendered app should be output to.
                // (Defaults to staticDir.)
                outputDir: path.join(__dirname, 'prerendered'),

                // Optional - The location of index.html
                indexPath: path.join(__dirname, 'dist', 'index.html'),

                // Required - Routes to render.
                routes: ['/', '/about'],

                // Optional - Allows you to customize the HTML and output path before
                // writing the rendered contents to a file.
                // renderedRoute can be modified and it or an equivelant should be returned.
                // renderedRoute format:
                // {
                //   route: String, // Where the output file will end up (relative to outputDir)
                //   originalRoute: String, // The route that was passed into the renderer, before redirects.
                //   html: String, // The rendered HTML for this route.
                //   outputPath: String // The path the rendered HTML will be written to.
                // }
                postProcess(renderedRoute) {
                    // Ignore any redirects.
                    renderedRoute.route = renderedRoute.originalRoute;
                    // Basic whitespace removal. (Don't use this in production.)
                    renderedRoute.html = renderedRoute.html.split(/>[\s]+</gmi).join('><')
                    // Remove /index.html from the output path if the dir name ends with a .html file extension.
                    // For example: /dist/dir/special.html/index.html -> /dist/dir/special.html
                    if (renderedRoute.route.endsWith('.html')) {
                        renderedRoute.outputPath = path.join(__dirname, 'dist', renderedRoute.route);
                    }

                    return renderedRoute;
                },

                // Optional - Uses html-minifier (https://github.com/kangax/html-minifier)
                // To minify the resulting HTML.
                // Option reference: https://github.com/kangax/html-minifier#options-quick-reference
                minify: {
                    collapseBooleanAttributes: true,
                    collapseWhitespace: true,
                    decodeEntities: true,
                    keepClosingSlash: true,
                    sortAttributes: true
                },

                // Server configuration options.
                server: {
                    // Normally a free port is autodetected, but feel free to set this if needed.
                    port: 8001
                },

                // The actual renderer to use. (Feel free to write your own)
                // Available renderers: https://github.com/Tribex/prerenderer/tree/master/renderers
                renderer: new Renderer({
                    // Optional - The name of the property to add to the window object with the contents of `inject`.
                    // injectProperty: '__PRERENDER_INJECTED',
                    // Optional - Any values you'd like your app to have access to via `window.injectProperty`.
                    //  inject: {
                    //    foo: 'bar'
                    // },

                    // Optional - defaults to 0, no limit.
                    // Routes are rendered asynchronously.
                    // Use this to limit the number of routes rendered in parallel.
                    maxConcurrentRoutes: 4,

                    // Optional - Wait to render until the specified event is dispatched on the document.
                    // eg, with `document.dispatchEvent(new Event('custom-render-trigger'))`
                    // renderAfterDocumentEvent: 'custom-render-trigger',

                    // Optional - Wait to render until the specified element is detected using `document.querySelector`
                    // renderAfterElementExists: 'my-app-element',

                    // Optional - Wait to render until a certain amount of time has passed.
                    // NOT RECOMMENDED
                    // renderAfterTime: 5000, // Wait 5 seconds.

                    // Other puppeteer options.
                    // (See here: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#puppeteerlaunchoptions)
                    headless: true //  было false Display the browser window when rendering. Useful for debugging.
                })
            })
        ]
    }
}
Ответ написан
Комментировать
IgorPI
@IgorPI
Файловая система как база данных )))
Ответ написан
Комментировать
gzhegow
@gzhegow
aka "ОбнимиБизнесмена"
Любую программу стоит рассматривать в отрыве от базы данных

Это значит что во время разработки твой контент страниц находится прямо в коде и программа должна заработать. А потом в те места где был контент ты вставляешь функции типа getContent(), которые в своём коде забирают информацию оттуда, где она сейчас размещается. В первую очередь проверяются скоростные варианты - оперативная память (переменные) или redis (кэш), потом файловая система (кэш), потом база данных, расположенная на данной машине, потом возможно из локальной сети, потом базы данных на удаленных серверах амазона или гугла, в конце - апишки.

Разумеется, не нужно размещать её везде. Отталкивайся от этого приоритета и того, на что готова пойти нагрузка, ты и руководство компании. В идеале все бы хранить в оперативки, да её не хватит. Всё хранить на диске? Так это обычно HDD, SSD диски больших размеров денег стоят. Всё бы хранить в базе данных на этой машине? Так это минус половина оперативки на работу с запросами (обычно этот вариант для приложений поменьше), в случае предела нагрузки проект станет колом и будет валиться в ошибки постоянно, мгновенно не исправить, нужно покупать железо например. Базы на удаленных серверах амазонов или гуглов - это во первых постоянный платеж, во вторых - пинги на запросы. Апишки - это время на запрос, плюс написание оберток на эти апишки.

Можно базу разместить где-то в локальной сети на другой машине, чтобы пинг минимальный, или если нагрузки бешеные - тогда сразу идут в амазоны. Основное преимущество - возможность с помощью "бегунка" увеличить размер базы или количество памяти просто увеличив ежемесячный платеж за этот компьютер без дозакупы железа. Чтобы минимизировать пинги - делают кеширование в оперативку того, что ну очень часто нужно и редко меняется.

Одновременно не забывают продумать систему очистки кеша. Ведь когда ты меняешь запись - контент должен измениться, а если кеш останется старый - то будут вопросы. Ты конечно скажешь что "скоро оно поменяется", но бизнес не любит таких отмазок. И очень любит повторять один и тот же вопрос, ожидая на него почему-то другой ответ. Если они повторяют свой вопрос несколько раз, а ты отвечаешь одинаково - тебя увольняют.

Вот и решай.
Ответ написан
Комментировать
@cpanelhostig
hosting, php dev
Можно на файлах
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы