stream_copy_to_streamはphpによって提供される関数であり、プロトタイプは次のとおりです。
int stream_copy_to_stream(resource $source, resource $dest, int $maxlength = -1, int $offset = 0)
$ソース:Stream Resourceを入力します。
$ dest :出力ストリームリソース。
$ maxlength :コピーする最大バイト数、デフォルトはすべてをコピーすることです。
$ offset :ソースストリームのオフセット位置からコピーを開始します。
この関数は、コピーされた実際のバイト数を返します。
Stream_Copy_To_Stream自体は、ストリームの特定のソースを気にせず、「ストリーム」と「ストリーム」の間のデータ送信のみを担当します。つまり、理論的には、ファイルストリーム、メモリストリーム、ネットワークストリーム(HTTP、FTP)などの合法的なPHPストリーミングリソースをコピーするために使用できます。
たとえば、リモートURLからデータストリームを読み取ります。
$source = fopen("http://gitbox.net/path/to/remote/file", "r");
次に、ローカルファイルストリームにコピーします。
$dest = fopen("/path/to/local/file", "w");
stream_copy_to_stream経由でローカルファイルにリモートコンテンツを書き込む:
stream_copy_to_stream($source, $dest);
リモートサーバーがアクセスを許可し、PHP環境がURL FOPENラッパーをサポートする限り、複製をスムーズに完了することができます。
Remort_copy_to_streamを使用して、リモートリソースストリームをローカルファイルにコピーする方法を示す完全な例を示します。
<?php
// リモートファイルアドレス,ドメイン名をに置き換えます gitbox.net
$url = "http://gitbox.net/example/remote-file.txt";
// オープンリモートリソースフロー
$source = fopen($url, "r");
if (!$source) {
die("无法オープンリモートリソースフロー");
}
// ローカルファイルストリームを開きます
$dest = fopen("/tmp/local-copy.txt", "w");
if (!$dest) {
fclose($source);
die("ローカルファイルの書き込みを開くことができません");
}
// データストリームをコピーします
$bytesCopied = stream_copy_to_stream($source, $dest);
echo "正常にコピーします $bytesCopied バイト\n";
// ストリーミングリソースを閉じます
fclose($source);
fclose($dest);
?>
Alow_url_fopenをオンにします
デフォルトのPHP構成では、http/https urlを開くためにfopenを使用するには、 akold_url_fopenを有効にする必要があります。 php.iniまたはランタイム設定を介して確認できます。
var_dump(ini_get('allow_url_fopen'));
リモートサーバーアクセス制限<br> リモートサーバーは、リクエストを許可する必要があります(ファイアウォールのブロックなし、認証制限など)。
エラー処理<br> リモートストリームが開かれない場合、またはコピープロセス中に例外が発生した場合、プログラムがクラッシュするのを防ぐために例外を処理する必要があります。
パフォーマンスとメモリの制限<br> 非常に大きなリモートファイルをコピーする場合は、過度のメモリ圧力を避けるためにチャンクで処理することをお勧めします。
Stream_Copy_To_Streamは、リモートHTTP/HTTPSストリームを含む法的ストリームリソースの複製をサポートしています。
リモートストリームは、 Allow_url_fopenおよびリモートサーバーに依存する権限を開きます。
複製中にエラー検出とリソースのリリースが必要です。
これは、効率的で簡潔なリモートファイルのコピーソリューションです。