40

我继承了一个 PHP 项目,结果证明它是一场噩梦。以下是要点:

  1. 所有原始开发人员都已离开
  2. 代码没有版本控制
  3. 通过重命名和编辑 PHP 文件,所有开发和测试都在实时服务器上完成。每个文件 index.php、index2.php、index3.php 等都有多个副本,不清楚哪些文件真正被使用
  4. 每个文件中有多个包含到包含其他文件的文件中包含其他文件等的文件。
  5. 该项目有多个开发人员,每个人都有自己的做事方式。例如,有一个大杂烩的 JavaScript 框架,一些数据库查询使用 SQL,另一些使用 XML 接口,还有一些调用数据库中的过程函数。

由于所有这些问题,发展缓慢得令人沮丧。除了向 Stack Overflow 发泄我的挫败感之外,还有什么关于如何开始处理这个烂摊子的建议吗?我自己对 PHP 开发还很陌生,但是第一步似乎是设置某种开发环境以便可以在不破坏实时服务器的情况下测试更改。关于如何从这里开始的任何提示?进行测试的典型方法是什么?在我的桌面上设置站点的本地版本似乎需要做很多工作(服务器是 Linux,但这里的桌面是 Windows)。我可以在实时服务器上创建一个子目录进行测试,或者..?数据库呢?

其次,是否可以启用某种分析来跟踪服务器上实际使用了哪些文件?我想删除实际上未包含的内容的重命名副本。更好的是,有没有办法判断文件的哪些部分没有被执行?有很多复制的功能和垃圾,我怀疑它们也没有被使用。同样,对于包含的内容,有任何关于整理混乱的提示吗?

好吧,我将停止在这里发泄,并让自己听从这里的每个人的摆布。:)

4

27 回答 27

56
  1. 首先,按原样获取版本控制中的文件。在完成之前不要继续通过#1。
  2. 建立测试环境。
  3. 清理文件
于 2008-12-09T18:58:41.903 回答
30

我已经做到了。你有我的同情。如果您的护照不是最新的或由于某些其他原因您无法避免这样做,我会这样做:

零步是将其纳入版本控制,无论它多么糟糕。如果它甚至可以工作,并且您破坏了某些东西,您需要能够回到工作状态 - 或者至少将您的更改与它进行比较以找出问题所在。在重构时进行频繁的小规模签入,当事情莫名其妙地出错时,您将有更少的代码可以回滚。(事情会莫名其妙地出错。)

之后,我将从数据库开始。确保所有内容都相对规范化,列名称清晰,等等。

接下来执行 PHP 代码。如果代码真的是拼凑而成,我会继续将其安装到框架中。看看CakePHPSymfony——他们的 Rails 式分离关注点的方式提出了一个问题:“这段代码应该去哪里?” 容易回答。这不是一项小任务,但一旦你完成了它,你可能比拥有一个构建良好的应用程序的一半要好。此外,一个好的 Web 框架的内置测试工具使重构 FAR 变得更容易——在更改现有功能之前编写一个测试来覆盖现有功能,并且您将知道更改后是否破坏了任何东西。

一旦对数据库进行了排序并在模型中包含模型代码,在控制器中包含控制器代码,那么您就可以担心表示级别的事情,例如标准化单个 JS/AJAX 库、清理 CSS 等。

至于开发环境:您绝对应该设置本地开发环境。那里有交钥匙 WAMP 包,或者您可以安装到 Linux 机器/VM(我推荐使用VirtualBox进行虚拟化)。您还应该有一个模拟实时服务器的单独集成测试环境。只有实时代码应该在实时服务器上运行。

至于调试/分析工具,我知道 Symfony 带有一组非常漂亮的工具,包括在您的页面上出现的一个小 JS 工具栏(仅在调试模式下),带有日志记录和分析信息。

祝你好运。

于 2008-12-09T19:25:33.113 回答
17

嗯,第一件事。我遇到过你的情况,很糟糕。我认为您希望建立并运行一个开发环境,这在正确的轨道上。

开发环境

这将包括一个 Web 服务器/脚本引擎/数据库引擎堆栈,以及最有可能的 IDE。

对于LAMP堆栈安装程序,我建议使用以下之一:

进一步阅读 LAMP 堆栈:

O'Reilly 的 OnLamp 网站

对于一个好的PHP IDE,我建议使用以下之一:

IBM 开发人员网站上比较几种 IDE 的文章

对于源代码控制,您可以使用 Team Foundation Server、SVN 或 Git — 只需使用您知道的东西。我建议首先将所有内容都放在源代码控制中(对于您可能需要的任何紧急维护),然后计划进行相当大的检修。

大修

您提到您甚至不知道正在使用哪些文件,并且他们使用文件命名约定作为伪版本控制。一旦您的开发环境启动并运行,您可能希望在那里开始大修。有几件事可以帮助您:

  • 您的应用客户/用户
  • 细致而有条理的笔记
  • 一个好的日志框架

您的客户/用户很重要,因为听起来您是该项目的新手,他们会知道应用程序应该如何表现得比您更好(很可能)。

细致的笔记很重要,因为您将基本上从头开始重写任何需求/设计/最终用户文档。如果你要这样做,你需要了解内部结构。而且,如果您要了解有关此系统的任何内容,则需要自己写下来(或者您现在正在阅读预制文档而不是阅读 Stack Overflow);-)

最后,日志框架很重要,因为您需要修复问题,而您无法修复您不知道已损坏的内容。日志框架使您可以查看应用程序中没有任何明显 UI 的部分。将其插入应用程序的各个部分,然后查看日志,您可以很好地了解代码何时执行以及执行顺序。

您需要专注于捕获(在纸上)应用程序应该如何工作,然后慢慢删除不必要的文件,同时尽量不破坏任何东西。密切关注日志以帮助调试。确保您的客户没有尖叫某件东西坏了。确保您的笔记与记录的内容和客户所说的内容一致。

防止将来发生这种情况

重新检查一切回到源代码控制。希望此时您已经获得了一个更新、更健全、更好的目录结构。

建立一个测试结构。即使这只是意味着建立一个基本的单元测试框架并在每次部署后进行一些基本的冒烟测试,总比没有好。理想情况下,您应该有一位测试工程师或一位知识渊博且值得信赖的客户,他们可以在每次部署后花时间进行测试。

如果您培养了多个开发人员,请制定部署流程。控制对生产环境的更改应该是您的首要任务。(你最不想做的就是再次经历这个,对吗?)你应该有一个清晰而简单的过程来在环境边界之间移动(比如开发 -> 测试然后测试 -> 生产)。

于 2008-12-09T19:23:36.593 回答
16

大多数情况下,您可以使用 grep 判断文件是否正在使用。

grep -r "index2.php" *

您还可以使用 PHP 解析器来帮助您进行清理。这是一个示例脚本,它打印出声明的函数和函数调用:

#!/usr/bin/php
<?php
class Token {
    public $type;
    public $contents;

    public function __construct($rawToken) {
        if (is_array($rawToken)) {
            $this->type = $rawToken[0];
            $this->contents = $rawToken[1];
        } else {
            $this->type = -1;
            $this->contents = $rawToken;
        }
    }
}

$file = $argv[1];
$code = file_get_contents($file);

$rawTokens = token_get_all($code);
$tokens = array();
foreach ($rawTokens as $rawToken) {
    $tokens[] = new Token($rawToken);
}

function skipWhitespace(&$tokens, &$i) {
    global $lineNo;
    $i++;
    $token = $tokens[$i];
    while ($token->type == T_WHITESPACE) {
        $lineNo += substr($token->contents, "\n");
        $i++;
        $token = $tokens[$i];
    }
}

function nextToken(&$j) {
    global $tokens, $i;
    $j = $i;
    do {
        $j++;
        $token = $tokens[$j];
    } while ($token->type == T_WHITESPACE);
    return $token;
}

for ($i = 0, $n = count($tokens); $i < $n; $i++) {
    $token = $tokens[$i];
    if ($token->type == T_FUNCTION) {
        skipWhitespace($tokens, $i);
        $functionName = $tokens[$i]->contents;
        echo 'Function: ' . $functionName . "\n";
    } elseif ($token->type == T_STRING) {
        skipWhitespace($tokens, $i);
        $nextToken = $tokens[$i];
        if ($nextToken->contents == '(') {
            echo 'Call: ' . $token->contents . "\n";
        }
    }
}
于 2008-12-09T22:56:58.333 回答
10

如果这是最坏的情况,代码全部被打乱,所有显示都与逻辑和数据库调用混合在一起,你可能会做我在一个 PHP 项目中必须做的事情。

我给了它三个尝试重构方法的开始。这就像骑着摩托车爬山,每次都走完 10% 的路程。所以我采取了另一种方法,结果效果更好。

  1. 我以用户身份登录,
  2. 并研究了我能找到的每个屏幕和每个用例。
  3. 我将html保存到静态文件,
  4. 并记录程序操作和明显的业务规则。

我这样做了整整 3 天,然后做笔记并与利益相关者进行了长时间的交谈。

在初步达成一致意见后,我使用良好一致的设计和抽象正确地重新实现了所有 html UI。滚动后,我每天可以做几个屏幕。

然后我将结果返回给利益相关者,并浏览了一堆用例。(利益相关者对第 1 步和第 2 步非常满意,因为他们根本不喜欢第一个实现(惊喜),现在看起来有改进的希望,而不仅仅是恢复正常的旧应用程序。

结果证明这是辛勤工作的结束(也是利益相关者感知到的项目风险的结束。)

原来,第一批工作人员被他们自己的错误意大利面缠住了,以至于工作内容实际上相对较少,所以复制它的范围比每个人都想象的要小。

但关键的决定是原始代码,无论是内容还是结构,都是不可重构的,我需要从一个完全外部的角度使用一个设计合理的新框架来工作。

于 2008-12-09T23:24:31.820 回答
10
  1. 设置一个开发服务器(正如 Greg Hewgill 提到的,VirtualBox 和 Virtual PC 是很好的选择)。

  2. 将当前站点文件(包括相关的 Web 服务器和 PHP 配置!)放入版本控制中。

  3. 找出正在使用的文件 - 使用您的开发服务器设置通过删除所有 fooN.php 文件进行测试,看看它是否仍然有效。

  4. 祈祷...很多(好吧,这不是必需的,但听起来你会需要它)。

于 2008-12-09T18:57:02.780 回答
7

您可能会考虑的一件事是在开发环境中安装 PHP“xdebug”扩展,将其设置为跟踪所有函数调用,然后尽可能充分地(可能通过自动化 UI 测试)运行整个应用程序。然后,您将能够分析/解析 xdebug 跟踪文件以查找应用程序使用的所有文件/函数。

于 2008-12-09T19:38:46.330 回答
6

这个线程上的其他人有很好的建议。我也遇到过这种情况。可能每个人在他们的职业生涯中都有一次进入一个看起来像是被龙卷风袭击的项目。

我要补充的一个建议是,在您进行其他人描述的任何清理工作之前,您需要获得管理层的支持。

  • 根据此线程上的建议制定计划。
  • 描述创建开发和测试环境所需的任何新硬件或软件,并为它们定价。
  • 找出需要培训哪些新技能才能设置和使用开发和测试环境。估计您获得这些技能所需的时间和费用。例如书籍或付费培训。
  • 估算一个工作时间表,让您进行清理工作。将代码置于源代码控制下需要多长时间?多长时间了解数据库?多长时间了解 PHP 和 javascript 代码?
  • 将此呈现给您的经理,并根据对他的底线的好处来表达目标。例如,一旦一切都清理干净,进行更改或推出新功能将更快,调试错误将更可预测,并且增加新员工将更容易。

当然,您需要继续处理当前的混乱,因为它是一个实时站点。管理实时站点具有优先权,因此清理工作必须是后台任务。这意味着它将需要更长的时间。我清理一个中等规模的项目作为后台任务的经验通常需要六到十二个月。由于该站点将在此期间继续发展,您完成的一些清理任务可能需要修改或重新完成。确保你的经理也明白这一切。

如果经理拒绝你清理这个烂摊子的计划,或者不重视清理它,那么至少你会知道为什么所有其他开发人员都离开了这家公司!

我有一些关于如何进行的具体建议:

  • 除了所有其他很好的建议之外,我建议使用Joel 测试作为基准。你的清理计划应该会产生一个在 Joel 测试中得分很高的工作环境。
  • 阅读我对“了解不熟悉的数据库的最佳方法是什么? ”的回答。
  • 在网站上启用日志记录,以便您可以分析实际调用了哪些 PHP 页面。至少这告诉您 index2.php、index3.php、index4.php 等中的哪一个是真正过时的。
  • PHP 有一个函数get_included_files()可以返回当前请求中包含的所有文件的数组。通过记录此信息,您可以找出正在使用的 PHP 文件,即使它们没有显示在 Web 服务器日志中。
  • 您确实需要一个与您的生产服务器相匹配的测试和开发环境。在 Windows 上测试并在 Linux 上部署是没有好处的。在开发过程中使用 MySQL 5.0 而在生产中使用 MySQL 4.0 是不好的。您可能可以使用更适中(尽管兼容)的硬件平台。
于 2008-12-09T20:29:04.857 回答
5

您可以通过将其放在页面底部附近来查看所有包含/必需文件的列表:

<?php var_dump(get_included_files()); ?>
于 2008-12-12T01:45:50.237 回答
5

我会:

  1. 坐下来深呼吸;
  2. 确定这是否真的是您想要工作的地方;
  3. 假设是的,那么我会卷起我的袖子,一次挑一个烂摊子去工作,然后开始工作。

我知道我们不能一次只完成一项任务。但是,您可以将工作限制在一次解决一个烂摊子上,同时处理出现的日常任务。

于 2008-12-09T19:09:19.480 回答
4

考虑重写并使用旧站点作为功能规范

令人惊讶的是,据我所知,甚至没有人提到这一点,但还有另一种选择:放弃代码,只使用网站本身的功能作为新的功能集规范(即,这是有史以来的第一个项目),然后基于这些功能,使用已建立的框架(例如 Symfony、Laravel 或 Drupal)重新构建站点。

是的,有些人会对重写这个邪恶的词感到畏缩......但在某些情况下,这实际上是一个更好的方法,你暗示了一些原因:

  • 你自己对 PHP 开发还很陌生
  • 你可能会更好地从一些干净的东西而不是你继承的纯废代码开始
  • 归根结底,大多数用户根本不在乎源代码,如果它看起来对他们“有效”,如果你试图告诉他们某些事情是非常错误的,他们可能会认为你疯了
  • 如果您在一个统一的框架内学习源代码修订控制和数据库设计的实践,您将获得更多乐趣并活得更久

当然,这个职位的每个人以前都必须使用这样的代码,但有时已经足够了,最好放弃意大利面并从一个新盘子开始。

如果您阅读Joel关于为什么重写是不好的文章,您会注意到他引用的几乎所有情况都不适用于您。

于 2008-12-10T00:02:56.687 回答
3
  1. 现在备份代码。

  2. 版本控制。

  3. 创建一个测试站点。该站点是否在 Apache 下运行?您甚至可以在自己的计算机上安装 Apache+ PHP + MySQL,并使用它进行测试。

  4. 处理安全问题。确保站点受到保护,免受 sql 注入和电子邮件注入。至少,您可以搜索数据库调用并添加调用mysql_real_escape_string()(好吧,如果它使用 MySQL 数据库)......一旦您更好地理解代码,您可以稍后进行真正的修复。对于电子邮件注入...编写一个过滤器函数来过滤垃圾邮件发送者代码,并确保过滤电子邮件中使用的所有表单字段。(是的,它添加了更多的意大利面条代码,但在您准备好对代码进行重大重构之前需要一段时间。)

  5. 之后,我建议增量升级。你是新手,代码是一团糟,所以需要一段时间才能理解这一切......并完全理解领域。因此,只需稍微完成您的工作,修复需要修复的内容,添加需要添加的内容。当你这样做时,你正在学习系统是如何组合在一起的。一旦您更好地了解代码的组织方式(或未组织方式),您就可以开始计划对系统进行重大重构/重写。希望您可以逐个组件地完成它,这样您就总能获得一个新的里程碑。

于 2008-12-09T23:06:56.567 回答
2

我认为您的所有 5 点都针对我继承的一些经典 ASP 项目,还有一个 PHP 项目......

我完全同意其他人的观点,即尽快将其纳入源代码控制并使用 VMWare、VirtualBox 等作为测试环境。

确保也对数据库进行版本控制,特别是如果过程中有额外的逻辑(不仅仅是直接插入、更新、删除)。数据库版本控制比 php 页面更受关注。您需要将所有对象生成为 sql 脚本并将这些脚本放入源代码管理中。然后,当您更改数据库结构、程序等时,您需要更新脚本,以便您也拥有这些更改的历史记录。

至于弄清楚在数据库方面使用了什么,我建议查看ApexSQL Clean。我在一个包含数百个 ASP 文件、200 多个表和大约 400 个存储过程的项目中使用了它。我能够识别出大约 20 个未使用的表和大约 25% 的存储过程。使用 ApexSQL Clean,您可以将所有 php 文件与表、视图和存储过程一起添加到依赖项检查中。获取 30 天试用版并检查一下,它将为您节省大量时间。

对于网站使用的文件,我有上个月的网络服务器日志,并对它们进行搜索以查找我不确定的任何内容。我也喜欢 Aistina 建议修改文件以在访问时记录的变化。也许让它进入您设置的数据库中的一个表,该表是文件名和访问计数,并且每次加载该文件时它都会增加计数。然后在一段时间后,您可以查看计数并确定可以执行的操作。

于 2008-12-09T19:24:04.317 回答
2

这里有一些想法:

  • PHP 和 Apache 在 Windows 上也可以正常工作。也许您毕竟可以进行全 Windows 安装?
  • 尝试grep在所有 PHP 文件中使用“include”和“require”(或某些 Windows 替代方案)。然后列出所有找到的包含文件。将列表与文件夹中的文件进行比较。您应该能够摆脱至少一些未引用的文件。
  • 或者,列出所有文件名并搜索所有文件。你可以制作像这样的依赖图。
于 2008-12-09T19:30:09.890 回答
2

这确实是一团糟。但是开始创造性地在哪里切断这个东西的一些触角:

  1. 获取版本控制。我推荐 Git。
  2. 设置本地开发服务器。查找 WAMP、LAMP 或 MAMP 包以帮助您入门,因为您是新手。
  3. 找到入口点(index.php 等)。检查您的服务器访问日志以查看它们是什么。
  4. 在一些正则表达式黑魔法上卷起你的袖子,并在所有文件上转储一个包含/要求树。但要注意任何 include( $filename ) 动态包含。如果您有任何这些,您需要在 $filename 上进行一些登录以找出可能包含的内容,尽管它周围的代码应该为您提供线索。运气好的话,您可以通过这种方式剔除所有未使用的文件。
  5. 使用更多的正则表达式黑魔法来检查代码库中其他地方是否引用了函数和方法。可能有一个 IDE 可以帮助您解决这个问题。试试 NetBeans(我曾经用它来帮助我重构一个 C++ 项目,所以在这里可能会有所帮助。)
  6. 正如其他人回答的那样,“如有必要,找出是否使用了某些类而没有使用某些类,您可以将 get_declared_classes 与 get_defined_vars 和 gettype 结合使用来查看正在实例化哪些类型。” 您也可以只编写一些代码来查找代码库中的所有新语句。
  7. 等等……想想你怎么能削弱这个怪物。并尝试在可能的地方重新组织代码。
于 2008-12-09T19:31:19.933 回答
2

我要做的第一件事是使用某种虚拟机建立一个测试环境。VirtualBox 或 Virtual PC 将是不错的选择。这样你就可以开始改变事情而不必担心破坏生产环境。无论这看起来有多少工作(使用数据库和 Web 服务器以及所有东西),最终它都是值得的。最大的好处之一是,如果您发现需要帮助,您可以复制 VM 并将其提供给其他人。

于 2008-12-09T18:50:25.490 回答
2

你肯定需要一个开发环境。如果您不想在 Windows 机器上运行该站点,您可以获取一些 Linux 发行版的 VMWare 映像。

于 2008-12-09T18:53:52.083 回答
2

第一步当然是将其置于版本控制之下。这样至少你可以回到原来的工作版本。其次,覆盖 include、require 等函数可能是个好主意,例如,将包含的文件的文件名写入某个日志文件,这样您就可以找出实际包含哪些文件(因此希望排除了很多index2.php、index3.php等。

如有必要,要查明是否使用了某些类而未使用某些类,您可以将 get_declared_classes 与 get_defined_vars 和 gettype 结合使用,以查看正在实例化哪些类型。

至于第 4 和第 5 题,这些可能更难解决,但这应该会让你有希望地开始。

于 2008-12-09T19:01:50.837 回答
2

关于如何处理这个问题的很多有用的帖子。

不想重复其他人所说的话:

  1. 获取运行的 prod 环境的副本。它可以是虚拟机,也可以是另一台真机。但你需要成为上帝。如果产品数据库在另一个盒子上,你也需要一个开发版本。
  2. 将其全部投入版本控制。在另一个盒子上。至少每周备份一次。
  3. 确保您知道分支在您的版本控制应用程序中是如何工作的。你可能会需要它。
  4. 锁定 prod 服务器。您不希望对其进行任何不超出版本控制的进一步更改。
  5. 创建将代码从版本控制发布到产品服务器的指令。可发布更改的最小单位应该是整个代码库。

接下来的步骤取决于用户对它的依附程度。如果由于某种原因不能改变太多,您将需要一种渐进的方法。如果仍然需要进行开发和维护,那么这可能是您唯一的选择。请记住使用该分支功能将此类模块与您的重写工作分开。

为了使结构有意义,您必须基本上在现有结构旁边创建一个新结构。一个新的 DB 处理程序通常是一个很好的起点,它包含在每个页面都应该加载的通用包含文件中。这里的目标是创建一个可以在以后扩展的最小包含结构,而无需告诉每个页面加载其他文件。

现在您需要开始将功能转移到新的包含文件中。您将需要一种同时打开多个文件的方法,例如多文件编辑器或 screen+vi(或 emacs)。从在不同地方重复的实用功能和代码块开始。尽量不要因为一次修复很多事情而分心。当其他问题得到解决时,某些类型的问题将不得不移动位置。你稍后会回到他们身边。

不要觉得你需要添加第三方框架。快速添加这样的东西会导致完全重写。在这一点上,这将比仅仅驯服它的包含结构要多得多的工作。所以先整理一下。

当您移动功能时,您需要让文件使用新的包含文件。您为您执行此操作的前几个文件将在一段时间内追逐冲突。这会让人感到沮丧和毫无意义,但这可能是最难的部分。几个文件后,它会变得更容易。有时您可以通过将十几个包含替换为一个来将半打页面迁移到新的包含文件。该操作的另一面是您可以删除一些文件。

如果您坚持下去,您最终会达到所有包含文件都是您编写的文件的地步,并且您将跨越整个包含布局。到那时,进行更具侵入性的更改将变得容易得多,例如放入第三方框架。

于 2008-12-10T04:31:47.813 回答
2

我知道你的感受。我继承了这样一个项目的发展。它陪伴了我一年,老实说,它让我成为了今天的开发者。没有比埋头苦干更好的个人晋升机会了。

以下是对我帮助最大的事情:

  • 识别哪些是系统的关键文件。您会找到它们,因为您的大部分工作都将在它们中完成
  • 创建项目的本地版本(包括数据库)并将其置于版本控制之下
  • 仅适用于少量更改的文件
  • 在彻底测试之前不要在生产版本中放入任何东西,然后准备好放回旧版本
  • 了解系统用户的处理方式(会话、cookies)。创建一个超级用户,然后当您需要在系统上实时测试您的代码时,将其放在如下块中:

    if($_POST['your_registered_user_name']{
       //Your live code being tested, which will be visible only to you when you are logged in
    }
    

    其他用户将无法感受到这些变化。当我无法替换本地机器上的系统状态时,这种技术帮助了我很多

  • 编写测试,并为您编写的所有代码遵循严格的工程指南

于 2008-12-09T22:09:39.957 回答
2
  1. 将其置于修订控制之下。

  2. 决定命名约定和文件/目录结构。

  3. 确保你有像样的工具/IDE。

  4. 如果您还没有设置单独的开发/测试环境

然后 ...

  1. 不幸的是,您需要筛选所有这 1、2、3 个文件并确定哪些正在使用,哪些可以丢弃。除了一个文件一个文件的蛮力碾压之外别无他法。

  2. 即使我有一个 RCS,我仍然经常将我认为未使用的脚本移动到一个隐藏的位置,比如 .mausoleum,然后让 RCS 忽略该位置。很高兴能够在不返回 repo 的情况下在本地查看。

  3. 尽可能将 HTML 和 PHP 分开。我不能强调这一点!如果在每个文件中都这样做,那很好。只要您有单独的 PHP 和 HTML 块。当然,HTML 会到处出现回声,但请尝试将所有测试、开关和其他所有内容移出 HTML 块并移入 PHP 块。在解决问题时,仅此一项就可能是巨大的。

  4. 如果代码主要是程序性的——我假设在你的情况下是——最好先做一些清理,然后再进行任何严重的重构或重构到类中。

  5. 当您找到可以逻辑组合的文件/脚本时,请这样做。(我见过的项目——可能与你的不同——幸存文件的总数大约是我们开始时的 1/4)。

一旦你走到这一步,你就可以开始适当的重构或重构为类。

好机会!

于 2009-03-02T17:50:19.167 回答
1

是的,版本控制绝对是第 0 步。

我还推荐一个好的代码搜索工具

Agent Ransack非常好(假设你在 Windows 上) http://www.mythicsoft.com/agenttransack/Page.aspx?page=download

如果没有代码搜索,我会盲目飞行。

于 2009-01-11T19:55:53.323 回答
1

我自己刚刚经历了这个。

我的第一条建议是不要在第一天尝试改变一切。如果你真的想解决这个问题,你需要朋友。在你建议如何改变他们几个月(几年?)所做的一切之前,你需要尊重你的同事。

首先,尽快将代码置于版本控制之下。如果这对您来说不容易,至少开始每天备份,即使这意味着只是压缩文件并用日期命名 zip 文件。如果那里没有人知道版本控制,请购买有关 CVS 或 SVN 的实用程序员书籍,然后自己进行设置。这些书可以在一天内读完,您可以快速启动并运行。如果没有其他人想使用版本控制,您可以自己使用它......然后当有人丢失文件时,您可以使用您的存储库中的副本来节省一天的时间。其他人迟早会看到版本控制的智慧。

其次,尽可能地深入研究代码。生活它并呼吸它一个月。向在场的人表明您将学习他们的代码。

第三,当你浏览代码时,做大量的笔记。写下所有困扰你的关于代码的事情。把你的想法写在纸上。您可以在第一个月之后组织它。

第四,安装代码分析器(例如 xdebug)。这将告诉您在每个页面上调用了哪些文件和函数,以及每段代码运行多长时间。您可以使用它来找出包含问题,并找到缓慢的代码。先优化那些。

经过一个月的辛勤工作,筛选代码并做笔记,将您的笔记变成适当的文档。不同的部分可以从安全、缓存、架构到其他任何困扰你的东西。对于你提出的每一个批评,提供一个更好的解决方案,并估计修复需要多长时间。这是您摆脱所有竞争性 javascript 框架等的地方。

尽可能多地修改本文档。 我怎么强调都不过分。

确保您的听众可以告诉您这样做是为了公司的利益,而不仅仅是您的个人喜好。

亲自将其呈现给您的老板。约个时间讨论一下。

他们可能会因为你写了它而解雇你。如果他们这样做了,没有他们你会过得更好,因为他们不想进步,你的职业生涯就会停滞不前。

他们可能想要实施您的所有建议。这不太可能,但有可能。然后你会很高兴(除非你的建议失败)。

他们很可能会想要实施您的一些建议,这总比没有好。至少,这将有助于缓解您的担忧。

至于测试,请在 Apache 中设置另一个“虚拟主机”(Windows 和 Linux 都支持)。虚拟主机允许您在单个服务器上运行多个站点。大多数大型站点至少有 3 个虚拟主机(或实际服务器):dev.domain.com(用于日常开发)、staging.domain.com(供 QA 人员在发布前进行测试)和 www.domain。 com(您的生产服务器)。您还应该使用不同的登录名和密码设置数据库的开发、暂存和生产版本,以免意外混淆它们。

另一种解决方案是在 Linux 服务器上为每个开发人员提供自己的虚拟主机,他们可以通过 FTP/SCP 或使用 samba 的网络共享工作。

祝你好运!

于 2008-12-11T02:29:24.160 回答
1
  1. 开始在项目中使用版本控制(我推荐 git)
  2. 为所有代码编写单元测试
  3. 开始使用 ORM(我强烈推荐学说)
  4. 开始使用一些框架(我推荐 symfony/nette)
  5. 开始重构 php 代码
于 2010-12-02T07:54:46.387 回答
0

照哈珀谢尔比所说的去做...

但是,我还要补充一点,如果您没有得到管理层的支持来清理它,您可能希望接受这样一个事实,即这可能是有原因的。... 只是在说。;-)

于 2008-12-09T19:29:07.660 回答
0

尝试在网站上获取详细的统计数据,并找出入口和出口点的位置。一种很好的方式来找出哪些文件被击中(然后查看这些文件以查看哪些包含被拉出)。

于 2008-12-09T18:58:24.040 回答
0

除了其他人所说的很棒的东西之外,为了首先了解正在使用的文件,您可以在您的开发服务器(甚至是生产服务器,这不会破坏)上安装操作码缓存,如 APC 或 eaccelerator任何事物)。然后,在您的开发服务器上单击 Web 应用程序(或让用户在您的生产服务器上执行此操作)。

现在查看缓存管理页面中的缓存文件列表。如果文件没有被您的操作码缓存列为缓存,则很有可能它没有被任何东西加载。

这不是一个完整的解决方案,但如果每个目录有 10 个 index.php 文件(例如 index.php、index2.php 等),至少您会知道您的应用程序正在使用哪个文件。

于 2008-12-11T02:35:54.863 回答