单片PHP编码与小型专用PHP脚本相比有哪些优点/缺点?

时间:2009-10-13 21:15:20

标签: php optimization opcode-cache

我历来用PHP编码的单片方法。

也就是说,我写了一个index.php,平均大小为70k-250k,并使用

mod_rewrite

转动剩下的

REQUEST_URI 

传入index.php的参数来控制发生的事情。

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

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

如果可能的话,由于我对此的偏执,我通常完全避免包含,但这会导致重复代码或保持整体。

因为我还在使用mod_rewrite,所以在两种方法之间进行转换应该很简单。

我期待你的评论。

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

5 个答案:

答案 0 :(得分:6)

模块化代码更易于理解和维护。巨大的整体代码库可以变得像一个纸牌屋。它在实践中工作得很好,但改变任何较低的元素变得不可能。如果您将代码拆分为明确的抽象,那么进行更改会更容易,如果您添加开发人员,您将为自己省去噩梦。

答案 1 :(得分:3)

使用包含文件维护和调试大型应用程序的难易程度远远超过了不使用包含文件的性能奖励。

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

答案 2 :(得分:1)

除了其他评论(我完全同意)之外,另一种观点是:我已经获得了这样的体验:如果驱动到极端,单片方法会花费宝贵的RAM - 整个文件必须被加载才能被解释,无论是否需要它的所有东西,只有你从每个实例获得的8,16或32 MB中吃掉了很多东西。

答案 3 :(得分:0)

请不要忘记测试和维护代码。如果你能够将单元测试编写到一个只有单个文件的项目中,我无法成像。此外,很难预测哪些功能可以通过你刚刚做出的改变来打破。在模块化架构的情况下,如果您更改某个模块,那么您只能破坏此模块和依赖于它的模块。即使是小的更改也可能对单个文件项目是致命的(您可以忘记关闭引用,这将立即中断所有页面)。我认为即使我们做了很小的改动,你也必须重新测试所有的功能。对于测试人员来说这可能是一种痛苦,特别是你无法使用单元测试。

此外,如果我将所有代码存储在一个文件中,那么您的代码可能会更糟糕。这样的代码将倾向于使用全局变量。在这种情况下,很难在其他项目中重用这些代码。因为你可以复制它,但要记住你复制的东西,你复制它的所有错误。想象一下你可以使用经过充分测试(告诉单元测试)库的项目。当出现新的bug时,它只是固定在一个地方。

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

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

答案 4 :(得分:0)

对于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 env中提供许多额外的功能。

有很多话要说,php作为cli脚本是一个了不起的野兽。