2010-12-11 2 views
-3

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

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

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

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

спасибо

+3

Это не рекомендуется. Это предшествовало современной модульной структуре. Почему вы хотите вернуться к чему-то настолько архаичному? – 2010-12-11 19:56:12

+0

@armando Я просто хочу избежать распространения моего проекта во многих каталогах, которые могут вызвать некоторые ошибки в безопасности, говоря, что речь идет о социальной сети – SmootQ

+7

Это. Я даже не ... – shamittomar

ответ

4

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

  1. Определить, что jquery.js на самом деле проходит через index.php
  2. Pass index.php через PHP парсер
  3. Подождите РНР генерировать ответ.
  4. Служите этому ответу.

Или вы могли бы служить ему это:

  1. Определить jquery.js существует в /var/www/mysite/jQuery.js
  2. Подавать в качестве ответа.

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

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

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

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

С точки зрения фреймворков PHP их много. Вот список many web application frameworks in many languages и с той же страницы, the PHP ones. Взгляните и решите, что вам больше нравится. Это то, что я сделал, и я закончил изучение Python для использования Django.

+0

+1: Лучший ответ на вопрос. – shamittomar

+0

Идеальный ответ, но код заголовка (css, title, javascript, meta) почти одинаковый на страницах, поэтому зачем его вставлять в оператор if? – SmootQ

+0

спасибо, это было прекрасное объяснение. – SmootQ

7

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

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

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

+0

Может ли downvoters объяснить себя? Я не уверен, что случилось с моим ответом. Благодаря! – Cam

+0

Я могу сказать, что вы поняли мой вопрос .. но я хочу контролировать страницу сайта только php, если statments. на той же странице ... если да, то как использовать в zend framework – SmootQ

+2

@ Симо: Ну, вы не хотите использовать Zend, в первую очередь.Есть много других вариантов там для фреймворков, поэтому обходите магазин, прежде чем вы его выбираете! Кроме того, я, возможно, недооценил, насколько вы новичок в PHP - я думаю, вам может быть лучше не использовать рамки на данный момент, и попытаться изучить некоторые лучшие практики. Идея одной точки входа хорошая, но вы должны распространять свой код на несколько файлов. – Cam

0

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

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

<?php 

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

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

это выглядит очень уродливо. Итак, для каждой страницы, которую вы хотите добавить, вам нужно изменить код и включить другое условное заявление? ... думаю, какое-то управление маршрутом. но, пожалуйста, не включайте файлы на основе запроса uri. –

+3

@Joe Hopfgartner: Тот факт, что он выглядит уродливым, не имеет значения. Это основной пример того, как единая точка входа не должна означать гигантские файлы Бога. Не стесняйтесь публиковать ответ с помощью лучшего, возможно, регулярного URL-адреса URL-адреса URL-адреса URL-адреса. –

+0

Нет. Я не буду включать файлы на основе запроса. даже включить функцию, я не буду использовать ее .. Я напишу разный код между страницами в выражении if (но не для того, где код тот же.) – SmootQ

1

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

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

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

Simplistic пример:

<?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

Я просто хочу, чтобы мой проект находился в одном каталоге, а не во многих каталогах, что может вызвать некоторые ошибки. (много файлов = много каталогов = больше опасности) – SmootQ

+2

@ Симо: Это совершенно неверно. Организация кода во всех файлах сделает ваш код более легким в обслуживании, если он будет выполнен правильно, что сделает ваш код более безопасным. Сбрасывание вашего кода в один файл не волшебным образом защищает его. – Cam

+0

Это неправда. Также вы можете поместить весь свой код в безопасное место, недоступное браузеру (HTTP-запрос). Я поменяю ответ, чтобы проиллюстрировать это. –

0

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

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

+0

спасибо, за это объяснение – SmootQ

+1

simo: я не думаю, что ваш вопрос должен был быть опущен, я думаю, что это законный вопрос, но это старый стиль ведения дел. – 2010-12-11 20:56:06

3

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

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

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

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

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

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

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

alt text

+3

+1: для изображения. :) – shamittomar

+1

+1 для комментария к +1 для изображения;) –

+2

Да, как будто stackoverflow нужно больше походить на 312098129083290183102 форумов, которые существуют на межтрубках. –

1

Приехал на этот вопрос ищущего так, поскольку лучший ответ старый, вот более современный один, от этого вопроса

Why use a single index.php page for entire site?

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

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

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

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

Смежные вопросы