完整的网页只有一页!

时间:2010-12-11 19:54:01

标签: php design-patterns coding-style social-networking

喜 我正在一个伟大的网站(社交网络与PHP),我已经决定只创建一个PHP页面,(index.php),但这个PHP页面将包含PHP如果$ _GET值的条件和声明,并将显示重新排列的页面(但在同一页面index.php)。

这意味着代码(javascript + xhtml + php)将非常庞大(几乎所有项目都在一个页面中)。

我还将使用Htaccess重写这些页面的网址以避免任何恶意请求(因此它看起来就像普通网站一样)。

但是,在这样做之前,我只是想知道这种技术的优点和缺点,从所有其他方面看到它(安全性,服务器资源等......)

谢谢

7 个答案:

答案 0 :(得分:7)

我认为你要做的是正确有效地组织你的代码,我赞赏。

但是,如果我理解正确的话,你会将所有的javascript,html和PHP放在一个文件中,这是非常糟糕。您希望您的代码是模块化的,而不是集中在一个文件中。

我认为您应该考虑使用框架(例如Zend) - PHP框架专门用于帮助您的代码保持有序,模块化和安全。您的意图(有效地组织代码)非常棒,但您对如何组织代码的想法并不是很好。如果您完全不赞成不使用框架(例如,如果这是一个学习/学校项目),您至少应确保遵循best practices

答案 1 :(得分:4)

由于服务器资源的使用,这种方法并不好。为了获得对您的网络服务器说jQuery.js的访问权限:

  1. 确定jQuery.js实际上是通过index.php
  2. 通过php解析器传递index.php
  3. 等待php生成响应。
  4. 提供回复。
  5. 或者,你可以这样做:

    1. 确定/var/www/mysite/jQuery.js
    2. 中存在jQuery.js
    3. 将其作为回应。
    4. 同样对于任何“静态”的东西,即不是直接从PHP生成的。 PHP脚本中ifs的数量越大,查找文件所需的测试就越多。

      您无需通过某种形式的网址路由传递静态内容;只有你的动态内容。对于实际速度,最好还可以生成响应,称为缓存,特别是如果动态内容在生成cpu周期方面很昂贵。其他缓存技术包括将经常访问的数据库数据留在内存中,这就是memcached所做的。

      如果您正在开发社交网络,这些事情确实很重要。 Heck,facebook编写了一个PHP-to-C ++编译器来节省时钟周期。

      我是第二个框架建议,因为它确实可以使代码组织更容易,并且可以与基于缓存的解决方案集成。

      就PHP框架而言,有很多。以下是many web application frameworks in many languages的列表,来自同一页the PHP ones。看看并决定你最喜欢哪一个。这就是我所做的,最后我学习了Python来使用Django。

答案 2 :(得分:3)

这将是一团糟。

您也无法升级网站的某些部分或使用它们而不会弄乱整个网站。

您将无法应用某些编程架构,如MVC。

理论上它可以更快,因为你只有一个文件需要从磁盘中提取,但只能假设所有或至少几乎所有代码都将被执行。

因此,您必须为每个请求加载和编译整个文件,以及不需要的部分。所以它会减慢你的速度。

然而,您可以做的是拥有所有请求源自的单一入口点。这有助于控制很多,并称为引导程序文件。

但最重要的是:

alt text

答案 3 :(得分:2)

通过这个问题来搜索,因为最好的答案是旧的,这里是更现代的,来自这个问题

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

  

前端控制器(index.php)可确保始终正确处理整个站点通用的所有内容(例如,身份验证),无论您请求哪个页面。如果你有50个不同的PHP文件分散在各处,那么很难管理它。如果您决定更改公共库文件的加载顺序,该怎么办?如果您只有一个文件,则可以在一个位置进行更改。如果您有50个不同的入口点,则需要更改所有入口点。

     

有人可能会说,一直加载所有常见的东西都是浪费资源,你应该只加载这个特定页面所需的文件。真正。但是今天的PHP框架大量使用OOP和自动加载,所以这个"浪费"不再存在了。

     

前端控制器还使您可以轻松地在您的站点中拥有漂亮的URL,因为您可以完全自由地使用您想要的任何URL并将其发送到您需要的任何控制器/方法。否则,你会遇到以.php结尾的每个URL,后面跟着一个丑陋的查询字符串列表,唯一可以避免这种情况的方法就是在你的.htaccess文件中使用更加丑陋的重写规则。即使是WordPress,它有许多不同的入口点(特别是在管理部分),强制最常见的请求通过index.php,这样你就可以拥有灵活的永久链接格式。

     

其他语言中的几乎所有Web框架都使用单一入口点 - 或者更准确地说,调用单个脚本来引导进程,然后该进程与Web服务器进行通信。 Django就是这样的。 CherryPy就是这样的。在Python中以这种方式这样做非常自然。允许以任何其他方式编写Web应用程序的唯一广泛使用的语言(除非用作旧式CGI脚本)是PHP。在PHP中,您可以为任何文件提供.php扩展名,并且它将由Web服务器执行。这非常强大,它使PHP易于学习。但是,一旦你超过一定程度的复杂性,单点入门方法开始变得更具吸引力。

答案 4 :(得分:1)

你为什么要这样?

据我所知,大多数CMS(以及可能是所有现代的)都是这样做的,所以请求的页面是相同的index.php但是该文件只是其他部分的调度程序。代码在与includes一起构建的不同文件中正确编写。

编辑:如果您担心所包含的脚本容易受到攻击,那么解决方案就很简单了。把它们放在网络根目录之外。

简单示例:

<?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';
}

答案 5 :(得分:0)

您所指的是单一入口点,并且是许多Web应用程序(最值得注意的是遵循MVC模式构建的)使用的东西。

您的入口点文件的代码不一定非常大,因为您可以根据需要简单地include()其他文件。例如:

<?php 

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

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

答案 6 :(得分:0)

  

这意味着代码(javascript + xhtml + php)将非常庞大(几乎所有项目都在一个页面中)。   是的,它会很慢。

所以你不会有任何HTML缓存? 这一切都纯粹是在一个文件中,很难更新并且解释起来很慢?吉利,祝你好运。