2012-01-18 18 views
1

数日前、私のすべての音楽を通って各歌のid3タグを読み込んで、それらをmysqlデータベースに挿入するphpスクリプトを書いた。ここではコンテキストの抜粋です:実行時間の計算方法(phpディレクティブ 'max_execution_time'?)

exec ("find /songs -type f -iname '*mp3'", $song_path); 
$number_of_songs = count($song_path); 
for($i=0; $i<$number_of_songs; $i++){ 
    //read id3 tags 
    //store id3 tags into database 
} 

私はこのディレクティブが何をするかのより良い理解を得るためのapache2/php.iniでPHPディレクティブmax_execution_timeを変更しました。

max_execution_time = 10に設定すると、私のPHPスクリプトは約45秒間実行され、約150曲(数千曲)のid3タグを読み込み、スクリプトを終了して次のものを出力する前にmysqlデータベースに挿入します

致命的なエラー:行に/websites/.../public_html/GetID3()/getid3/module.audio.mp3.phpに超えた10秒の最大実行時間1894

画面へドキュメントから、'最大実行時間はシステムコール、ストリーム操作などの影響を受けません'http://www.php.net/manual/en/info.configuration.php#ini.max-execution-time

  1. 私は maximum_execution_time 10秒に設定し、スクリプト が終了する前に45秒間の合計で実行されているとの差から何を推測することができますか?これは が45秒のうちに意味するものなのですか?35はid3タグの読み込み、mysqlなどへのデータの挿入など、PHP以外の関連の操作を行うのに費やされました。

  2. 実行時間を計算して、それを の画面に印刷する方法はありますか?ダゴンが提案タイマーを使う

EDIT 、私はループの最後でgetTime()関数を呼び出し、ループのおよそ100 +回の反復がありました。ここに私のブラウザへの出力は次のようになります。

0.1163秒

0.8142秒

1.1379秒

1.5555秒

...

76.7847秒

77.2008秒

77.6071秒

致命的なエラー:/websites/.../public_html/GetID3()/getid3/module.audio.mp3に超えた10秒の最大実行時間。ライン505

+0

set_time_limit(http://php.net/set_time_limit)を使用していますか? 'を呼び出すと、set_time_limit()はタイムアウトカウンタをゼロから再起動します。つまり、タイムアウトがデフォルトの30秒で、スクリプトの実行に25秒(set_time_limit(20)などの呼び出しが行われた場合)、スクリプトはタイムアウトするまで合計45秒間実行されます。 – Corbin

+0

いいえ私はset_time_limitを使用していません – user784637

答えて

1

上のPHP私はスクリプトがactully 10秒以上実行されているとは思わない、あなたはそれで正しいタイマーを配置する必要があり

<!-- put this at the top of the page --> 
<?php 
function getTime() { 
    $timer = explode(' ', microtime()); 
    $timer = $timer[1] + $timer[0]; 
    return $timer; 
} 

$start = getTime(); 
?> 

<!-- put other code and html in here --> 

<!-- put this code at the bottom of the page --> 
<?php 
$end = getTime(); 
$time_took= round($end - $start,4).' seconds'; 
echo $time_took; 
?> 
+0

ありがとうダゴン私の元の投稿で私の編集を参照してください – user784637

1

スクリプトのこのタイプは、実際に実行されなければなりませんCLI環境ではなく、Webサーバーによって実行されるPHPプロセスで実行されます。 manual docsあたりとしてPHPのコマンドライン環境は、他のPHPのSAPIとどのように異なるかについて:

PHP in a shell environment tends to be used for a much more diverse range of purposes than typical Web-based scripts, and as these can be very long-running, the maximum execution time is set to unlimited.

それはあなたの質問に答えていませんが、それはあなたの問題を解決しない:)

+0

ちょっとrd、ありがとう男。私はcliを使ってスクリプトを処理しますが、この場合、ユーザーがログイン/ログアウトできるWebサイトを作ってid3タグを解析できるので、cgiからテストしています。 – user784637

+0

btwあなたはadam levineに似ています:栗色の歌手5 – user784637

+0

@LedZeppelin笑私がLAに住んでいたとき、私は酔っている少女が同じことを言ったときに夜遅くにそれに一緒に行かなかった。あなたのウェブサイトのユースケースについては、タグ解析を処理する新しいプロセスを生成する方が良いかもしれません。そうすれば、 "CLI"環境を利用することができます。また、この種の処理ジョブでは、ある種のキューシステムの使用を検討すべきです。そのような長い処理ジョブは、単一のWebサーバーPHPプロセスには適していないからです。 – rdlowrey

1

あなたがいないだけで試すように思えますスクリプトの期間を測定するだけでなく、それを制限しようとします。あなたの場合、max_execution_timeはあなたが望むものではありません。

基本的に「システムコール、ストリーム操作などの影響を受けない最大実行時間」が正しいです。リアルタイムのスクリプトの長さを制限する必要がある場合は、独自の時間測定を実装する必要があります。人々は通常、後にすべてのスクリプトを最適化するのに役立つであろう、それのためにいくつかのベンチマーククラスを記述しますが、どこか他のあなたが望む開始時

$timer['start'] = time(); 
$timer['max_exec_time'] = 10; // seconds 

if (time() > $timer['start'] + $timer['max_exec_time']) 
    break; // or exit; etc 

ループの終わりまたは単純十分でなければならない。

3
<!-- Paste this at the top of the page --> 
<?php 
    $mic_time = microtime(); 
    $mic_time = explode(" ",$mic_time); 
    $mic_time = $mic_time[1] + $mic_time[0]; 
    $start_time = $mic_time; 
?> 

<!-- Write Your script(executable code) here --> 

enter code here 

<!-- Paste this code at the bottom of the page --> 
<?php 
    $mic_time = microtime(); 
    $mic_time = explode(" ",$mic_time); 
    $mic_time = $mic_time[1] + $mic_time[0]; 
    $endtime = $mic_time; 
    $total_execution_time = ($endtime - $start_time); 
    echo "Total Executaion Time ".$total_execution_time." seconds"; 
?>