1

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

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

mod_rewrite

把剩下的

REQUEST_URI 

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

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

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

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

因为无论如何我都在使用 mod_rewrite,所以这两种方法之间的转换应该很简单。

我期待你的评论。

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

4

5 回答 5

6

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

于 2009-10-13T21:18:13.413 回答
3

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

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

于 2009-10-13T21:21:41.043 回答
1

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

于 2009-10-13T21:41:53.303 回答
0

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

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

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

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

于 2009-10-13T21:42:32.177 回答
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 信号

/* 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 脚本是一个了不起的野兽。

于 2020-05-15T17:16:10.070 回答