1

PHP スクリプトのプロファイリングを行った後、例外の作成に非常に時間がかかるように見えることがわかりました。

%Time            Real      User    System Calls         secs/call  Name
100.0    0.00 3448.05 0.00 8.89 0.00 1.81     1  0.0000 3448.0543  main
 64.7 2230.28 2230.28 0.02 0.02 0.00 0.00   892  2.5003    2.5003  sleep
 35.1    0.01 1211.84 0.00 8.16 0.00 1.49  1001  0.0000    1.2106  do_process
 34.7  986.81 1197.34 2.59 2.60 1.18 1.18  1330  0.7420    0.9003  file_get_contents
  6.1    0.00  210.53 0.00 0.01 0.00 0.01    28  0.0000    7.5191  __lambda_func
  6.1  210.53  210.53 0.01 0.01 0.01 0.01    28  7.5191    7.5191  ErrorException->__construct
  0.4    0.00   13.47 0.01 5.21 0.00 0.18   206  0.0000    0.0654  do_check
  0.4   13.15   13.15 5.08 5.08 0.15 0.15   402  0.0327    0.0327  preg_replace

つまり、1 回あたりの実際の (CPU ではない) 時間は 7.5 秒ですErrorException->__constructこれを改善する方法についてのアイデアを探しています!

関連コード:

set_error_handler(
  create_function(
    '$severity, $message, $file, $line',
    'throw new ErrorException($message, $severity, $severity, $file, $line);'
  )
);

$opts = array(
  'http' => array(
    'method'  => 'GET',
    'timeout' => 60
  )
);
$ctx = stream_context_create($opts);
try {
  $this->data = file_get_contents($url, false, $ctx);
} catch (Exception $e) {
  # The set_error_handler call ensures that we arrive here on any type
  # of error.
  $this->data = '';
  if(preg_match('/HTTP\/1.[0|1] 4[0-9][0-9] /', $e->getMessage()) == 1) {
    return 404;
  } else if(strpos($e->getMessage(), "php_network_getaddresses: getaddrinfo failed") !== false) {
    return 1000;
  } else {
    $this->message = $e->getMessage();
    return -1;
  }
}

明確な答えがなくても、どのような要因がリアルタイムに影響を与える可能性があるかを理解したいと思います。私の理解では、コンストラクターにはfile_get_contents呼び出し自体またはcatch句の時間が含まれていないため、これが遅くなる正当な理由 (大量のメモリを割り当てようとする以外) を実際に考えることはできません。

4

2 に答える 2

0

さらに多くのテストを行った結果、問題は APD プロファイリングが経過時間を測定する方法にあるようです。の前にエラーハンドラー内に他のステートメントを配置するthrowと、プロファイラーは、コメントで述べたように、それに対してすべての経過時間をカウントします。

したがって、経過時間が長いのは、実際に からの経過時間がプロファイラーに含まれているためだと確信していfile_get_contentsます。

代わりに XHProf を使用してみましたが、これにより、より正しい結果が得られるようです。少なくとも、ErrorException->__construct最小限の経過時間しかかからないことを示しています。

于 2013-09-14T02:22:07.287 に答える
0

への呼び出しで作成された古い学校のラムダ関数を使用していますcreate_function()。これには理由がありますか?その機能の動作が遅いためです。関数のコードで STRING を渡しますが、その文字列は実行時に評価する必要があります。オペコード キャッシュがそのコードをキャッシュする方法はありません。

于 2013-09-08T09:43:43.073 に答える