0

我的 PHP webapp 遇到了一个非常奇怪的问题。我把它设计成模块化的,我的代码被分成更小的文件,所以它不会变得过于庞大。我的应用程序是一个非营利组织的资金申请管理系统,我遇到问题的模块计算并输出自申请提交以来的营业时间。

这个“时间”模块包含在我的应用程序的多个不同部分中。在某些地方,一切正常。然而,在一个特定的地方,模块似乎没有执行,而是输出了数字“12”。这可能是因为我的代码一次执行了太多操作,导致 PHP 内存不足吗?

“时间”模块:

<?php
/* Time Module
Added for Version: 1.1
Last Updated: 10/11/2012
*/

$timeSince = time() - (int)$item['timestamp']; //Calculate the number of seconds between now and the application's submission
$timeSince = $timeSince / 60 / 60; //60secs; 60mins - Convert the seconds to hours
$timeSince = round($timeSince); //Round up or down to give us a whole number

if( //Set the highlight color to green if we're within the review timeframe.
($timeSince <= 12 && $item['appStatus']=="0") ||
($timeSince <= 48 && $item['appStatus']=="1") ||
($timeSince <= 72 && $item['appStatus']=="2")
)
    $timeColor="#090";
elseif( //If we're slightly behind the timeframe, highlight as yellow
($timeSince <= 24 && $item['appStatus']=="0") ||
($timeSince <= 60 && $item['appStatus']=="1") ||
($timeSince <= 84 && $item['appStatus']=="2")
)
    $timeColor="#F90";
else //If we're far behind the timeframe, highlight as red
    $timeColor="#F33";
?>
Submitted: <?php echo date("F j, Y", $item['timestamp']) ?><br>

<?php if($item['appStatus']=="0" || $item['appStatus']=="1" || $item['appStatus']=="2") { ?>
<span style="color:<?php echo $timeColor ?>"><?php echo $timeSince ?></span> Hours Since Submission
<?php } ?>

包含文件的代码(在一行操作按钮下):

<div style="float:right; padding:10px; text-align:right;">
<?php if(isset($includePrefix)) { ?>
    <a href="appAssets/print.php?id=<?php echo $_GET['id'] ?>" target="_blank">
    <img src="appAssets/print.png" alt="Print This Application" align="middle" title="Print This Application" /></a>&nbsp;

    <a href="mailto:<?php echo $item['agencyEmail'] ?>">
    <img src="appAssets/email.png" alt="Email Agency" align="middle" title="Email Agency" /></a>

    <?php if(!$hide) { ?>
        <a href="#" id="disbursementLink">
        <img src="appAssets/dollar.png" alt="Disbursment Instructions" align="middle" title="Disbursement Instructions" /></a>
    <?php } ?>
    <br />
<?php } ?>

<?php include_once("time.php") ?>
</div>
4

2 回答 2

0

当我打开错误报告时,我发现由于某种原因,它包含了另一个名为“time.php”的文件,该文件位于站点的根目录中。这个特定的文件是我正在处理的一个测试脚本,我试图计算两个日期之间的营业时间(如果有人感兴趣,我可以分享它)。该文件输出数字“12”,因为那是我正在使用的测试日期之间的时间。

我的 webapp 由一个包含多个目录级别的 web 组成,因此 PHP 在这种情况下必须遵循它的规则。原始脚本的执行从站点的根目录开始,因此它必须先在那里查找文件,然后再查找子目录(“time”模块包含在另一个模块中,该模块位于“modules”子目录中)。由于站点根目录中有一个“time.php”,模块目录中有一个“time.php”,因此它倾向于站点根目录中的那个。

于 2013-01-17T16:59:14.507 回答
0

PHP 内存不足会产生一个非常具体的“内存不足”致命错误。我怀疑你的脚本正在做一些会使 PHP 耗尽内存的事情,因为你没有处理任何内存密集型的东西(没有图像/视频处理,没有加载大量的 SQL 数据)。

由于您没有看到错误,只是一个奇怪的输出 (12) 我假设您没有激活错误报告:

error_reporting(E_ALL); // or other level if it's more convenient
ini_set('display_errors', TRUE); // outputs errors to the browser
ini_set('scream.enabled', TRUE); // ignores the `@` error silencing operator

如果没有错误(忽略通知和警告),那么您的代码很可能正在运行。问题变成了协调代码的编写方式和它的预期工作方式。

在一种procedural programming方法中,您使用的变量是全局的。退出过程范围(在右括号之后)或退出模块范围(在一个文件结束之后)时,环境不会取消设置这些变量。

像这样的环境可以允许在某个时候设置全局变量,并且代码的另一部分可以稍后尝试使用它 - 期望它具有不同的值。甚至更有可能——当多次调用一个模块时,它的变量继续具有它们在上次执行时的值。

于 2013-01-17T16:40:43.960 回答