【问题标题】:What are the advantages/disadvantages of monolithic PHP coding versus small specialized php scripts?单体 PHP 编码与小型专用 php 脚本的优缺点是什么?
【发布时间】:2009-10-13 21:15:19
【问题描述】:

我过去一直使用单一的 PHP 编码方法。

即我写了一个index.php,平均大小为70k-250k,使用

mod_rewrite

转动其余部分

REQUEST_URI 

传入参数传入 index.php 以控制正在发生的事情。

另一种方法是编写许多小的 php 脚本,每个脚本都有特定的用途。我认为我的一些更活跃的 ajax 脚本可能会从中受益。

让我一直思考这个过程的一件事是我不知道使用包含,尤其是条件包含会如何影响操作码缓存的性能。

由于我对此的偏执,我通常尽可能避免包含,但这会导致代码重复或保持单一。

由于我一直在使用 mod_rewrite,所以在这两种方法之间进行转换应该很简单。

期待你们的cmets。

编辑:我的一个目标应用程序目前每秒处理 80-100 次页面点击(我有一些不错的硬件)。其中大部分是ajax请求。一切正常,而且很活泼,但我是作为一个没有批评的 php 程序员开发的,需要它。

【问题讨论】:

  • 这看起来已经是每日 wtf 的候选人了

标签: php optimization opcode-cache


【解决方案1】:

模块化代码更易于理解和维护。一个巨大的单体代码库可以变成纸牌屋。它在实践中工作得很好,但改变任何较低的元素变得不可能。如果您将代码拆分为清晰的抽象,则进行更改会容易得多,而且如果您添加了开发人员,您将免于做噩梦。

【讨论】:

  • 我同意。在我的整体方法内部,什么都不做两次。一切都是函数。但是,将这些功能组分离成包含是否会引入性能损失?
  • 只要包含/要求的数量在合理范围内,性能就不会成为问题。您可能需要更多地使用硬盘驱动器,但这应该不会产生影响。
【解决方案2】:

使用包含文件维护和调试大型应用程序的便利性远远超过了不使用包含文件的性能优势。

返工是浪费。从一个应用程序复制和粘贴代码到另一个应用程序是维护地狱。

【讨论】:

  • 通常数据库查询成为 Web 应用程序的瓶颈,而不是源解析。特别是如果您可以缓存整个 html 页面。
  • 唉,我的页面只有大约 10% 可以被缓存,而且缓存会在大约一分钟后失效。数据库经过高度优化,昂贵的查询本身缓存在表中。
【解决方案3】:

除了其他 cmets(我完全同意)之外,还有另一种观点:我的经验是,如果将单体方法推向极端,则会花费宝贵的 RAM - 必须加载整个文件才能进行解释,无论是否需要它的所有内容,仅此一项就从每个实例获得的 8、16 或 32 MB 中消耗了很多。

【讨论】:

  • 我在想,由于操作码缓存,这可能不是真的,因为缓存是从内存加载的,对吧?执行单个缓存代码库与存储重复库的较小代码库?
【解决方案4】:

请不要忘记测试和维护代码。如果您能够将单元测试写入仅在单个文件中的项目,我无法想象。此外,很难预测您刚刚所做的更改会破坏哪些功能。在模块化架构的情况下,如果您更改某些模块,那么您只能破坏该模块和依赖于它的模块。即使是很小的更改也可能对单文件项目造成致命影响(您可能会忘记关闭引号,这会立即破坏所有页面)。我认为即使我们进行了很小的更改,您也必须重新测试所有功能。这对测试人员来说可能会很痛苦,尤其是您无法使用单元测试。

此外,如果我将所有代码都存储在一个文件中,那么您的代码很可能是错误的。这样的代码会倾向于使用全局变量。在这种情况下,很难在其他项目中重用此类代码。当然,您可以复制它,但请记住,当您复制某些内容时,您会复制其所有错误。想象一下您可以使用一组经过良好测试(感谢单元测试)库的项目。当新的错误出现时,它只是固定在一个地方。

还有一件事,当您在团队中工作时使用单个文件会很痛苦。即使只有 2 个开发人员,他们也会浪费大量时间来合并更改。

无论如何,如果您的项目不大,您可以使用单个文件 appoch。

【讨论】:

  • 感谢您的 cmets。我使用一个全局变量来传递数据库句柄。我确实将常量用于站点范围的偏好。我加载那些有要求的。除了解析我的 request_uri 之外的所有内容都已经是一个函数,并且错误修复相对轻松,通常只会破坏一个函数。是的,每次更改后我都会重新测试整个应用程序。我是测试组。 :)
【解决方案5】:

对于 Unix 命令行脚本,单片方法具有非常高的可移植性。

使用单个(hashbang)脚本甚至允许将脚本转储到usr/bin

sudo cp myprog /usr/bin
/* (...) */
sudo cp myprog /usr/games
/* (...) */

这允许从任何地方、任何路径调用程序,只需键入myprog,而不是/PATH/./myprog。确保它是可信的!

我们必须格外小心路径。


一些关于路径的简单例子:

/* Create a folder in the home directory, named as the script name, if not existing. -*/
if (!is_dir($_SERVER["HOME"]."/".$_SERVER["SCRIPT_NAME"])){
  @mkdir($_SERVER["HOME"]."/".$_SERVER["SCRIPT_NAME"]);
}

/* Program folder path: --------------------------------------------------------------*/
$PATH = $_SERVER["HOME"]."/".basename($_SERVER["SCRIPT_NAME"])."/";

/* Program running path, currently: --------------------------------------------------------------*/
$JOBPATH = getcwd();

处理POSIX SIGNALS

/* Register cleaning actions at SIGINT ------------------------------------- */
function shutdown() {
  // Perform actions at ctrl+c 
  echo "Good bye!";
  exit;
}
/* Register resize at SIGWINCH ---------------------------------------------- */
function consoleResize() {
  @ob_start;
  $W = (int)exec("tput cols");   // Columns count
  $H = (int)exec("tput lines");  // Lines count
  @ob_end_clean();
  // Shell window terminal resized!
}

/* Register action at SIGSTOP (Ctrl + z) ---------------------------------------------- */
function sigSTOP() {
  // Program paused!
}

/* Register action at SIGCONT (Type fg to resume) ---------------------------------------------- */
function sigCONT() {
  // Program restarted!
}

register_shutdown_function("shutdown");
declare(ticks = 1);
pcntl_signal(SIGINT, "shutdown");
pcntl_signal(SIGWINCH, "consoleResize");

这并不意味着我们必须在一个块中编写所有内容,而是将渲染合并到一个文件中允许 unix 环境中的许多额外功能。

有很多话要说,php作为cli脚本是一头神奇的野兽。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 2010-12-03
    相关资源
    最近更新 更多