-1

簡単な PHP スクリプトを cron ジョブとして実行しています。その目的は、Web ページのヘッダーをチェックし、さまざまな項目が変更されたかどうかを報告することです。

過去にこのスクリプトのさまざまなバージョンを使用してきましたが、常に正常に機能していましたが、現在は、スクリプトが 100Mb を超えるメモリを使用している場合に電子メールで警告を送信するサーバーで使用しています (もちろん、ホワイトリストに登録されたスクリプトは別として)。 )、驚くべきことに、私のヘッダー チェック スクリプトは、少なくとも 1 日に数回、大量のメモリ使用量を報告することがあります。

スクリプトは 5 分ごとに実行されており、メモリの問題は 1 日に 5 ~ 6 回発生しています。自然に解決しているように見えますが、このような単純な作業のためにこの大量のメモリを時々使用しないようにしたいと考えています。

警告メールでは、この単純なスクリプトで約 290Mb の使用量が報告されています。

<?php

  $message = "";

  function array_find ($needle, $haystack, $search_keys = false) { 
    if (!is_array($haystack)) return false;
    foreach ($haystack as $key => $value) {
      $what = ($search_keys) ? $key : $value;
      if (strpos($what, $needle) !== false) return $key;
    }
    return false;
  }

  $url = 'http://www.EXAMPLE.com/';

  $haystack = get_headers($url);
  $needle = "PHPSESSID";

  if (!((array_find($needle, $haystack)) != '')) {
    $message .= "No PHPSESSID in headers";
  }

  if (!(strpos($haystack[0], '200'))) {
    $message .= "No 200 OK";
  }

  if ($message != '') {
    mail("example@example.com", "Headers Changed", $message, "From: Example <example@example.com>");
  }

  exit;

?>

サーバーは、CENTOS 5.8、Apache 2.2.16、PHP 5.3.3 を実行する VPS です。

ご協力ありがとうございます。

4

3 に答える 3

2

おそらく、1日に5〜6回大きな干し草の山を食べているだけですか?

PHP はメモリを大量に消費する獣です。あれは事実です。比較的大きな配列のデータを扱う場合、メモリの消費量は目に見える以上のものになる可能性があります。

これについては、 "How big are PHP arrays (and values)? (Hint: BIG!)"という名前の興味深い記事があり、強くお勧めします。

于 2012-04-05T11:45:09.897 に答える
1

get_headers($url) と memory_get_usage() のみでファイルを作成してみて、結果を確認してください...

<?php 
$url = "http://www.example.com";
get_headers($url);
echo memory_get_usage();
?>

私の経験では、PHP >= 5 での get_headers() は大量のメモリを消費します。記事「get_headers() 関数でメモリリークが発生する」を確認できます。

PS: xDebug を使用して、スクリプトのメモリ使用量を追跡することもできます。

于 2012-07-18T07:39:00.837 に答える
1

各主要部分の後に memory_get_usage() を実行してみてください。それはあなたがそれを絞り込むのに役立つはずです.

于 2012-04-05T11:58:43.613 に答える