2010年07月15日

file_get_contents による比較的小さなファイルのダウンロード

PHP: file_get_contents - Manual

以下のようなコードで成功しますが、普通に考えてメモリ上に全ての大きさを占有してしまうので、あまり巨大なファイルを対象とするものではありません。( 大きなファイルには、readfile を使用します )

テスト仕様

ファイルサイズ : 50M
確認 : コマンドプロンプトより、FC /B オリジナルファイル ダウンロードファイル
<?
// 比較的小さなファイルのダウンロード
file_put_contents(
	"mysql.zip",
	file_get_contents("http://example.jp/mysql514.zip")
);

?>
OK


以下では、メモリは 4096 バイトしか使用しません。但しその分、全体の処理にかかる速度は落ちる事になります。また、ファイルの書き込みに file_put_contents を使用していますが、この部分でも open write close を繰り返すのでプログラムとして効率が良いとは言えません
<?
// 大きなファイルのダウンロード

ini_set("max_execution_time", 90 );	// ダウンロードに必要な時間( 秒 )

$fp = fopen("http://example.jp/mysql514.zip", "r" );
if ( $fp !== FALSE ) {
	file_put_contents("mysql.zip", "" );
	while( !feof( $fp ) ) {
		$buffer = fread( $fp, 4096 );
		if ( $buffer !== FALSE ) {
			file_put_contents("mysql.zip", $buffer, FILE_APPEND );
		}
	}
	fclose( $fp );
}

?>
OK


以下は、C 言語での記述と同等の書き方です。
<?
// 大きなファイルのダウンロード

ini_set("max_execution_time", 90 );	// ダウンロードに必要な時間( 秒 )

$fp = fopen("http://example.jp/mysql514.zip", "r" );
if ( $fp !== FALSE ) {

	$fp_out = fopen("mysql.zip", "w" );
	if ( $fp_out === FALSE ) {
		fclose( $fp );
		exit("出力ファイルを開く事ができません");
	}

	file_put_contents("mysql.zip", "" );
	while( !feof( $fp ) ) {
		$buffer = fread( $fp, 4096 );
		if ( $buffer !== FALSE ) {
			fwrite( $fp_out, $buffer );
		}
	}
	fclose( $fp_out );
	fclose( $fp );
}

?>
OK



posted by at 2010-07-15 12:03 | 通信 | このブログの読者になる | 更新情報をチェックする