Полные страницы сайта на одной странице! - PullRequest
0 голосов
/ 11 декабря 2010

привет Я работаю над отличным веб-сайтом (социальная сеть с php), и я решил создать только одну php-страницу (index.php), но эта php-страница будет содержать php, если условия и характеристики значения $ _GET будут отобразить требуемую страницу (но на той же странице index.php).

Это означает, что код (javascript + xhtml + php) будет очень большим (почти весь проект на одной странице).

Я также буду использовать Htaccess, чтобы переписать URL-адреса этих страниц, чтобы избежать любых вредоносных запросов (поэтому он будет выглядеть как обычный веб-сайт).

Но, прежде чем сделать это, я просто хочу узнать о преимуществах и недостатках этого метода, увидеть его со всех сторон (безопасность, ресурсы сервера и т. Д.) *

спасибо

Ответы [ 7 ]

7 голосов
/ 11 декабря 2010

Я думаю, что вы пытаетесь правильно и эффективно организовать свой код, что я рекомендую.

Однако, если я правильно понимаю, вы добавите весь свой javascript, html иPHP в одном файле, который очень плохо .Вы хотите, чтобы ваш код был модульным, а не слился воедино в одном файле.

Я думаю, вам следует изучить использование фреймворка (например, Zend) - фреймворки PHP специально разработаны, чтобы помочь вашему коду оставаться организованным, модульными безопасно.Ваше намерение (эффективная организация вашего кода) велико, но ваша идея о том, как организовать ваш код, не очень хороша.Если вы абсолютно недовольны тем, что не используете платформу (например, если это учебный / школьный проект), вы должны по крайней мере убедиться, что вы следуете рекомендациям .

4 голосов
/ 11 декабря 2010

Этот подход не хорош из-за использования ресурсов сервера. Чтобы получить доступ к сообщению jQuery.js, ваш веб-сервер собирается:

  1. Определите, что jQuery.js действительно проходит через index.php
  2. Передайте index.php через парсер php
  3. Подождите, пока php сгенерирует ответ.
  4. Подайте этот ответ.

Или вы могли бы подать это так:

  1. Определите, что jQuery.js существует в /var/www/mysite/jQuery.js
  2. Служите ответом.

Аналогично для всего, что "статично", т.е. не генерируется непосредственно из PHP. Чем больше число if в PHP-скрипте, тем больше тестов потребуется для поиска вашего файла.

Вам не нужно передавать статический контент через некоторую форму маршрутизации URL; только ваш динамический контент. Для реальной скорости лучше генерировать готовые ответы, которые также называются кэшированием, особенно если динамический контент является дорогим с точки зрения циклов процессора. Другие методы кэширования включают в себя сохранение часто используемых данных базы данных в памяти, что делает memcached.

Если вы разрабатываете социальную сеть, эти вещи действительно имеют значение. Черт, Facebook написал компилятор PHP-to-C ++ для сохранения тактов.

Я подкрепляю рекомендацию по фреймворку, поскольку она действительно упростит организацию кода и может интегрироваться с решением на основе кэширования.

С точки зрения фреймворков PHP их много. Вот список многих фреймворков веб-приложений на многих языках и с той же страницы PHP . Посмотрите и решите, что вам больше нравится. Это то, что я сделал, и я закончил изучать Python для использования Django.

3 голосов
/ 11 декабря 2010

Это будет адский беспорядок.

Вы также не сможете обновлять части сайта или работать над ними, не вмешиваясь во все это.

Вы не сможете применить некоторую архитектуру программирования, такую ​​как MVC.

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

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

Что вы МОЖЕТЕ сделать, так это иметь единую точку входа, из которой исходят все запросы. Это помогает контролировать многое и называется файлом начальной загрузки.

Но самое главное:

alt text

2 голосов
/ 07 февраля 2017

Пришёл по этому вопросу в поиске, так как лучший ответ старый, вот более современный из этого вопроса

Зачем использовать одну страницу index.php для всего сайта?

Фронт-контроллер (index.php) гарантирует, что все, что является общим для всего сайта (например, аутентификация), всегда корректно обрабатывается, независимо от того, какую страницу вы запрашиваете. Если у вас есть 50 разных PHP-файлов, разбросанных повсюду, это сложно сделать. А что если вы решите изменить порядок загрузки файлов общей библиотеки? Если у вас есть только один файл, вы можете изменить его в одном месте. Если у вас есть 50 различных точек входа, вам необходимо изменить их все.

Кто-то может сказать, что загрузка всех распространенных вещей - это пустая трата ресурсов, и вам следует загружать только те файлы, которые необходимы для этой конкретной страницы. Правда. Но в современных PHP-фреймворках интенсивно используются ООП и автозагрузка, поэтому таких «отходов» больше не существует.

Фронт-контроллер также позволяет вам иметь красивые URL-адреса на вашем сайте, потому что вы абсолютно свободны в использовании любого URL-адреса, который вам нравится, и отправляете его на любой контроллер / метод, который вам нужен. В противном случае вы застрянете с каждым URL-адресом, заканчивающимся на .php, за которым следует ужасный список строк запроса, и единственный способ избежать этого - использовать еще более уродливые правила перезаписи в файле .htaccess. Даже WordPress, имеющий десятки различных точек входа (особенно в разделе администратора), заставляет самые распространенные запросы проходить через index.php, чтобы вы могли иметь гибкий постоянный формат.

Почти во всех веб-фреймворках на других языках используются отдельные точки входа, или, точнее, один скрипт вызывается для начальной загрузки процесса, который затем связывается с веб-сервером. Джанго работает так. CherryPy работает так. Это очень естественно сделать это в Python. Единственным широко используемым языком, позволяющим писать веб-приложения любым другим способом (кроме случаев, когда он используется как скрипт CGI старого стиля), является PHP. В PHP вы можете дать любому файлу расширение .php, и он будет выполняться веб-сервером. Это очень мощный инструмент, облегчающий изучение PHP. Но как только вы преодолеете определенный уровень сложности, подход с одной точкой входа начинает выглядеть намного привлекательнее.

1 голос
/ 11 декабря 2010

Зачем вам это нужно?

Из того, что я знаю, большинство CMS (и, вероятно, все современные) сделаны так, что запрашиваемая страница такая же index.php, , но Файл просто диспетчер в другие разделы.Код написан правильно в разных файлах, которые создаются вместе с , включая .

Редактировать: Если вы боитесь, что ваши включенные скрипты уязвимы, решения тривиальны.Разместите их вне корня сети.

Упрощенный пример:

<?php

/* This folder shouldn't even be in the site root, 
it should be in a totally different place on the server 
so there is no way someone could request something from it */
$safeRoot = '/path/to/safe/folder/';

include $safeRoot.'all_pages_need_this.php'; // aka The Bootstrap //

switch($_GET['page']){
    case 'home':
        include $safeRoot.'home.module.php';
        break;
   case 'blog':
        include $safeRoot.'blog.module.php';
        break;
   case 'store':
        include $safeRoot.'store.module.php';
        break;
   default:
       include $safeRoot.'404.module.php';
}
0 голосов
/ 11 декабря 2010

Это означает, что код (javascript + xhtml + php) будет очень большим (почти весь проект на одной странице). Да, и это будет медленно.

То есть у вас не будет кеширования HTML?
Это все чисто в одном файле, трудно обновлять и медленно интерпретировать? Господи, удачи.

0 голосов
/ 11 декабря 2010

То, на что вы ссылаетесь, называется единой точкой входа и является тем, что используют многие веб-приложения (особенно те, которые построены по шаблону MVC).

Код вашего файла точки входа не должен быть огромным, так как вы можете просто include() другие файлы по мере необходимости. Например:

<?php 

if ($_GET['module'] == 'messages') {
  include('inbox.php');
} 

if ($_GET['module'] == 'profile') {
  include('profile.php');
} etc..
...