0

PHP Web アプリケーションで非常に奇妙な問題に遭遇しました。コードを小さなファイルに分割して、圧倒されすぎないようにモジュール化するように設計しました。私のアプリは、非営利団体の資金申請管理システムです。問題が発生しているモジュールは、申請が提出されてからの営業時間数を計算して出力します。

この「時間」モジュールは、アプリの複数の異なるセクションに含まれています。一部の場所では、すべてが正常に機能します。ただし、ある特定の場所では、モジュールが実行されていないようで、代わりに数値「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」という別のファイルが含まれていることがわかりました。この特定のファイルは、私が取り組んでいたテスト スクリプトであり、2 つの日付間の営業時間を計算しようとしていました (興味がある場合は共有できます)。このファイルは「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使用している変数はグローバルです。環境は、プロシージャ スコープを終了するとき (右中括弧の後) またはモジュール スコープを終了するとき (1 つのファイルの終了後) に、これらの変数の設定を解除しません。

このような環境では、ある時点でグローバル変数を設定することができ、コードの別のセクションが後でそれを使用しようとする可能性があります-異なる値を持つことを期待しています. またはさらに可能性が高い - モジュールを複数回呼び出すと、その変数は最後の実行時点での値を持ち続けます。

于 2013-01-17T16:40:43.960 に答える