• 締切済み

PHPでftpを行うと速度ダウン

PHPを使ってftp処理をしています。例えば、下記の通りのプログラムを作ったとします。 ---(※エラー処理を削除しています)--- <?php // 接続を確立する $conn_id = ftp_connect($ftp_server); // ユーザ名とパスワードでログインする $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); // ファイルをアップロードする $upload = ftp_put($conn_id, $destination_file, $source_file, FTP_BINARY); // FTP ストリームを閉じる ftp_close($conn_id); ?> ---------------------------------- 問題なく、ftp処理はできるのですが、MS-DOSプロンプトからftpした場合やffftpなどのソフトを使ってftpした場合と比べて格段に速度が落ちます。 具体的に言えば、サーバ側・クライアント側も光回線を使っていた場合に MS-DOSプロンプト:80Mbpsくらい PHPによるftp:10Mbpsくらい の速度に落ちます。実行速度はMRTGを使ってみています。 PHPの仕様上、どうしようもないものなのでしょうか。 もしくは速度アップの関数などあるのでしょうか。 ご存知の方、ご教授ください。

  • PHP
  • 回答数1
  • ありがとう数1

みんなの回答

回答No.1

PHPの仕様というよりも、諸々の設定とサーバの能力によるところじゃないでしょうか。 FTPは比較的単純なプロトコルでしょうから、それほどメモリやCPUに負担をかけるとは思えませんが、ファイルをアップロードすると言う事は、 ファイルをハードディスクからメモリに読み込む メモリ上のデータをFTPで転送 メモリ解放、次を読む。。。。。。 終了 と言うような感じで行なわれているでしょうから、php.iniやApacheのメモリ設定や、サーバのメモリ、サーバのCPUに依ると思います。 この辺のチューニング次第で恐らく解決出来ると思いますが、その方法は私は知りません。 とりあえずphp.iniのmemory_limitや、apacheのMaxMemFree、SendBufferSize等の設定をすればひょっとしたら。。。 参考まで。

goroneko-begin
質問者

お礼

回答ありがとうございます。 taketan_mydns_jpさんも言われている通りだと私も思っているのですが、同じマシンでバッチで組んだ場合と格段に速度が違います。 php.iniとかで速度を制限するようなコンフィグレーションがあるのかとか思っていたりしていますが、見つかりません・・・。 何なのでしょうね。最悪、PHPでバッチを作成し、execコマンドでそのバッチを実行しようかと目論んでいます。

関連するQ&A

  • phpのftp_putについて

    はじめましてphp初心者です。 以下の内容を実行した際に うまく行かず困っています。 $ftp_server="【サーバー名】"; $ftp_user_name="【アカウント名】"; $ftp_user_pass="【パスワード】"; //サーバーに接続する $conn_id = ftp_connect($ftp_server); // ユーザ名とパスワードでログインする $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); // 接続できたか確認する if ((!$conn_id) || (!$login_result)) { echo "FTP接続に失敗しました。"; exit; } else { echo "FTP接続に成功しました。"; } $local_file="【ローカルのファイルパス】"; $remote_file="【FTPサーバー上のアップロードファイルパス】"; if (!ftp_put($conn_id, $remote_file, $local_file, FTP_ASCII)) { echo "FTPアップロードに失敗しました。"; exit; } else { echo "FTPアップロードに成功しました。"; } ftp_close($conn_id); ローカル、リモート共にファイルの位置は間違っていません。 また以上のように反映させた際に返ってくる答えは 「FTP接続に成功しました。」 「FTPアップロードに成功しました。」 と出てきます。 しかし、ffftpを確認したところ サバー側に変化がありません。 手動ではffftpでアップ可能です。 ご教授お願い致します。

    • 締切済み
    • PHP
  • CGI版PHPでのFTPの使用について

    現在、RedhatLinux6.2J,PostgreSQL7.1,php-4.0.4-pl1という環境でCGI版PHPを使用しています。 ftp()を使用しているのですがなかなかうまくいかず困っています。 現在下記の様なソースをPHPマニュアルからもってきて動かしています。 ==================================================================== #! /usr/local/bin/php -q <? $ftp_server = "ftpサーバーのIP"; $user = "username"; $pass = "passwd"; $conn_id = ftp_connect("$ftp_server"); $login_result = ftp_login($conn_id, $user, $pass); if ((!$conn_id) || (!$login_result)) { echo "Ftp connection has failed!"; echo "Attempted to connect to ".$ftp_server." for user ".$user; die; } else { echo "Connected to ".$ftp_server.", for user ".$user; } $local_file = "test.txt"; $remote_file = "up.txt"; $upload = ftp_put($conn_id, $remote_file, $local_file, FTP_ASCII); if (!$upload) { echo "Ftp upload has failed!"; } else { echo "Uploaded ".$local_file." to ".$ftp_server." as ".$remote_file; } ftp_quit($conn_id); ?> ==================================================================== $conn_id = ftp_connect("$ftp_server");のところで Fatal error:Call to undefined function: ftp_connect() in ./ftp_test.php on line 7 というエラーがでてしまい落ちてしまいます。 何かお分かりになる方おられましたらご教授願えますでしょうか? インストール時にしなければいけないことや php.iniファイル等で設定しなければいけない項目等ありましたらご教授お願いします。 また、passiveモードでの送受信の仕方についてもぜひご教授お願いいたします。 失礼します。

    • ベストアンサー
    • PHP
  • FTP サーバーにある画像を表示するには

    $lines = file('ftp://USER:PASS@ftp.example.com/data.txt'); FTP サーバーのテキストファイルにアクセスするには上記のように出来ますが、 サーバーにある画像を表示することは出来るのでしょうか? ↓ こんな感じで表示出来たら便利だと思ったのですが... echo "<img src=" . file('ftp://USER:PASS@ftp.example.com/image.jpg') . " />"; とりあえず今は一度保存して表示するようにしてますが、 なにかアドバイスあれば よろしくお願いします。 $conn_id = ftp_connect($ftp_server); ftp_login($conn_id, $user, $pass); ftp_get($conn_id, $url, $url, FTP_BINARY); FTP 関数一覧 http://us2.php.net/manual/ja/book.ftp.php

    • ベストアンサー
    • PHP
  • phpでファイルをアップロードできるか?

    phpでのファイルアップロードについて質問します。 再質問となりますが、実際にコードを作成してやってみてうまくいかないので、 あらためて質問させていただきました。 eラーニング教材(htmlで作成)で、動画ファイルをストリーミングさせることになりました。 ウェブサーバ側へのアップロードする画面として、move_uploaded_file()やis_uploaded_file()メソッドをつかっていましたが、ストリーミングサーバ側としてFTP通信でポート20、21からのみのアップロードのみ許可されているとのことです。 ftp_put()メソッドを使ってアップロードさせたところうまくいきません。 **************<コード>************* $ftp_server="【サーバー名】"; $ftp_user_name="【アカウント名】"; $ftp_user_pass="【パスワード】"; $conn_id = ftp_connect($ftp_server); $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); if ((!$conn_id) || (!$login_result)) { echo "FTP接続に失敗しました。"; exit; } else { echo "FTP接続に成功しました。"; } ここまででFTPの接続はできているようです。 その直後に、 $local_file="【ローカルのファイルパス】"; $remote_file="【FTPサーバー上のアップロードファイルパス】"; if (!ftp_put($conn_id, $remote_file, $local_file, FTP_BINARY)) { echo "FTPアップロードに失敗しました。"; exit; } else { echo "FTPアップロードに成功しました。"; } **************<コード>************* FTPアップロードに失敗します。 原因がわからなく、こまっています。 ポートの指定が必要なのでしょうか? おしえてください。 よろしくおねがいたします。 **************** FTP supportはenabled になっています。 phpのバージョンは4または5です。 IE7以上のブラウザ環境を想定しています。

    • ベストアンサー
    • PHP
  • ftp_getでローカルにファイルが見当たらない

    下記のようなスクリプトでFTPダウンロードを試みています。 ダウンロード元はホスティング会社のサーバで、 ダウンロード先は私のWindowsPCになります。 接続から読み込みまで万事うまく行き、エラー表示もなく、 Successfully written to C:\test\backup.zip というメッセージが表示されるところまでいくのですが、 C:\test\を開けてみると肝心のファイルが見当たりません。 サーバやPCの設定等もあるかもしれませんが、 どのような原因が考えられますでしょうか? よろしくお願いいたします。 <スクリプト> $local_file = "C:\\test\\backup.zip"; $server_file = "/tmp/backup.zip"; $conn_id = ftp_connect($ftpserver); $login_result = ftp_login($conn_id, $usr, $pass); ftp_pasv($conn_id, true); if(ftp_get($conn_id, $local_file, $server_file, FTP_BINARY)){ echo "Successfully written to {$local_file}"; } else { echo "There was a problem"; } ftp_close($conn_id);

    • ベストアンサー
    • PHP
  • phpでftpのアップロードができないのですが・・・

    phpでftpコマンドを使ったアップロードができません。どこが間違っているのでしょうか。 ftpで接続してログインするところまでは間違いなくできているのですが・・・よろしくお願いします。 file.php のフォーム部分 <form enctype="multipart/form-data" action="fileupload.php" method="post"> <input type="FILE" name="File"><br>     <input type="SUBMIT" value="送信">     <input type="RESET" vaiue="取消">     </form> fileupload.php のアップロード処理部分 //アップロード後のファイルの名前を仮にaaa.txtとする $file2 = "/public_html/aaa.txt"; if(isset($_REQUEST["File"])){ $file=$_REQUEST["File"]; } $ftp = ftp_connect($hostname) or die("接続失敗"); ftp_login($ftp,$user,$pass) or die("ログイン失敗"); ftp_put($ftp, $file2 , $file , FTP_ASCII) or die("アップロード失敗");

    • ベストアンサー
    • PHP
  • 続CGI版PHPでのFTPの使用について

    phpからのftp_login時に下記の様なエラーが出ました。 Unable to find ftpbuf 192 in <b>./ftp_test.php 情報お持ちの方いらっしゃましたら、ご教授お願いします。 エラーの出た部分のソースは下記のとおりです $login_result = ftp_login($ftp_server,$user,$pass); 前回URL:http://oshiete1.goo.ne.jp/kotaeru.php3?qid=100180

    • ベストアンサー
    • PHP
  • ftp_getできない?

    レンタルサーバの自前のファイルサーバからFTP接続にてファイルを取得しようとしているのですが、エラーとなってしまいます。 FTP接続はできているのですが、ファイルの取得に失敗(FALSE)してしまいます。 レンタルサーバの環境は OS:Linux PHP:4.4.1 試しにftp_nlist関数にてファイル一覧を取得しようとしましたが、やはり失敗(FALSE)してしまいます。 知り合いのレンタルサーバを借用して全く同じプログラムを実行すると正常に一覧の取得ができました。 FTP接続時・ログイン時にはエラーが発生していないのでFTPでの転送は可能だと思うのですが、全くわかりません。 どなたか分かる方ご教授お願いします。 以下、スクリプトです。 if($ftp=ftp_connect($ftp_host)){  if(ftp_login($ftp,$ftp_user,$ftp_pass)){   //ファイルリスト一覧取得    $file_list=ftp_nlist($ftp,".");   var_dump($file_list);   //ファイルダウンロード    if(!(ftp_get($ftp,$local_file,$remote_file,FTP_BINARY))){     エラー処理1;    }   }   else{     エラー処理2;   } } else{  エラー処理3; }

    • ベストアンサー
    • PHP
  • PHP ftp_fput()関数について

    下記のPHPスクリプトで、JPEGファイルをFTPサーバーにアップしようとしてるんですが、 サーバー側でエラーが出ます。どこが間違っているのか指摘していただけますか? ※ftp_chdir($ftp, $path); の$path は、相対パスか絶対パスか、URLか ※ftp_fput($ftp, $remote_file, $fp, FTP_BINARY)の、第二引数$remoto_file は、リモートでの ファイル名だけでよいのか、相対パスか、絶対パスかURLか ※ちなみに、FTPサーバーへのログインはできてます。 <?php //$photo = "akashi.jpg"; $photo = $_GET['photo']; // FTPサーバーに接続 $ftp_server="users109.lolipop.jp"; $ftp = ftp_connect($ftp_server); //$res = ftp_login($ftp, "root", " "); $res = ftp_login($ftp, " ", " "); if($res==FALSE){ echo("FTPサーバーのログインに失敗しました。"); exit(1); } //$path = "/home/users/1/raindrop.jp-5247423/web/tsukushinbo/upload_photo"; // 絶対パス $path = "../tsukushinbo/upload_photo"; // 相対パス ftp_chdir($ftp, $path); // サーバー側のディレクトリを変更 /* $cur = ftp_pwd($ftp); echo($cur); exit(1); */ // ローカル側でファイルをオープン /* $dir = dirname($photo); // ファイルあるいはディレクトリへのパスを含む文字列を受け取って、 親ディレクトリのパスを返します。 //$filename = $dir."/".$photo; echo($filename); exit(1); */ $fp = fopen("$photo", 'rb') or die; //$fp = fopen("$filename", 'r') or die; // ローカルでオープンされているファイルのポインタ。 ファイルの終端まで進むと読み込みが終了する。 // FTPサーバーに画像ファイルをアップロード $remote_file = $photo; // リモート上でのファイル名指定 if(ftp_fput($ftp, $remote_file, $fp, FTP_BINARY)){ // ローカルでオープンしている画像ファイルをバイナリモードでFTPサーバーにアップロードする echo "Successfully uploaded $file\n"; }else{ echo "There was a problem while uploading $file\n"; } fclose($fp); ftp_close($ftp); //header("Location: bbs.php"); ?>

    • ベストアンサー
    • PHP
  • phpでftp送信 さくらレンタルサーバ cron

    さくらレンタルサーバの cronで、phpを実行し、他サーバのFTPサーバ(PASSIVE)が使えないへ、アップロードするphpのPGで悩んでいます。 さくらレンタルサーバは、通常のftp関数が使えなかったので、「PHP FTP Client Class By TOMO」さんのソケットでFTP送信を行うクラスを使用して、PASSIVEモードで実装、テスト環境・成功するところまでは行けたのですが、相手方のサーバ仕様が使えないことが判明し、アクティブモードに書きかえるところで、悩んでいます。 // 接続を確立する $ftp = new ftp(); $ftp->debug = TRUE;//デバグモード if (!$ftp->ftp_connect($ftp_server)) { die("Cannot connect\n"); print "Cannot connect\n"; exit; } // ユーザ名とパスワードでログインする if (!$ftp->ftp_login($ftp_user_name, $ftp_user_pass)) { $ftp->ftp_quit(); die("Login failed\n"); print "Login failed\n"; exit; } ここから先、どのように書けばよいのやら。 そもそもさくらレンタルサーバのFTPはPASSIVEなので、アクティブ送信できないのでしょうか? 何からしてよいものやら時間がないので焦ってます!

    • ベストアンサー
    • PHP

専門家に質問してみよう