ディレクトリごとFTPでアップロードしてくれるスクリプト – コマンドラインPHP

2009年8月23日

Filed under: Linux,PHP,pear — admin @ 3:17 AM

JavaScriptネタばかりで飽きてきたので、PHPネタでも書いてみる。
最近はまっているのは、webアプリケーションを作るためのPHPではなく、コマンドラインでいろいろできるPHPスクリプトを組むことです。

bashでも良いんだけど、やはり物足りないので、(と言ってもそこまで使いこなしていない・・・。)Pythonという選択肢もあるけど、Pythonわかんないので、PHPを使って、ディレクトリごとFTPでアップロードしてくれるスクリプトを書いてみた。

PEARライブラリを使ったソースコードになっているので、このクラスを使う場合、PEARのインストールが必要になってくる。

まずは、型となる ftp_dir_put.class を定義する。
ファイル名は ftp_dir_put.php で保存。

PHP:
  1. <?php
  2.  
  3. /*****************************************************
  4. *
  5. *  ftp_dir_put.class
  6. *
  7. *  ftpアップロードをディレクトリ単位で実行するクラス
  8. *  Terminal上での実行専用
  9. *
  10. *****************************************************/
  11.  
  12. require_once 'Net/FTP.php';
  13.  
  14. class ftp_dir_put {
  15.  
  16.   /*-------------------------------------
  17.   *  コンストラクタ
  18.   */
  19.   public function ftp_dir_put( $ftp_server, $ftp_user_name, $ftp_user_pass, $remote_dir, $local_dir, $mode ){
  20.     /*-------------------------------------
  21.     *  $target_hostオブジェクトを生成
  22.     */
  23.     $target_host = new Net_FTP( $ftp_server, 21 );
  24.  
  25.     //ftpサーバに接続
  26.     if( $target_host->connect( $ftp_server  ) ){
  27.  
  28.       print $ftp_server.' に接続しました'."\n";
  29.  
  30.       //接続後、ログイン認証
  31.       if( $target_host->login( $ftp_user_name, $ftp_user_pass ) ){
  32.         print $ftp_server.' にログインしました'."\n";
  33.         print $local_dir.' を '.$remote_dir.' にアップロードしています・・・'."\n";
  34.  
  35.         if( $target_host->putRecursive( $local_dir, $remote_dir, $mode ) ){
  36.  
  37.           print 'アップロードが終わりました'."\n";
  38.           if( $target_host->disconnect() ){
  39.             print 'ログアウトしました'."\n";
  40.           }
  41.           else{
  42.             print 'ログアウトに失敗しました'."\n";
  43.           }
  44.         }
  45.         else{
  46.           print 'アップロードに失敗しました'."\n";
  47.           if( $target_host->disconnect() ){
  48.             print 'ログアウトしました'."\n";
  49.           }
  50.           else{
  51.             print 'ログアウトに失敗しました'."\n";
  52.           }
  53.         }
  54.       }
  55.       else{
  56.         print 'ログイン失敗しました'."\n";
  57.       }
  58.     }
  59.     else{
  60.       print $ftp_server.' に接続できません'."\n";
  61.     }
  62.   }
  63. }
  64.  
  65. ?>

そして、この ftp_dir_put.class を newして実行するファイルを作成
ファイル名は、test_host.php とかで保存。

PHP:
  1. <?php
  2.  
  3. require_once 'ftp_dir_put.php';
  4.  
  5. function init(){
  6.  
  7.   /*-------------------------------------
  8.   *  プロパティセット
  9.   */
  10.   $ftp_server = 'host_name';       //ftpサーバーアドレス
  11.   $ftp_user_name = 'user_name';    //ユーザー名
  12.   $ftp_user_pass = 'user_pass';    //パスワード
  13.   $remote_dir = '/';               //サーバー側ディレクトリパス
  14.   $local_dir = '/var/www/html/';   //ローカル側ディレクトリパス
  15.   $mode = true;                    //オーバーライド
  16.  
  17.   /*-------------------------------------
  18.   *  実行オブジェクト
  19.   */
  20.   $test_init = new ftp_dir_put(
  21.     $ftp_server,
  22.     $ftp_user_name,
  23.     $ftp_user_pass,
  24.     $remote_dir,
  25.     $local_dir,
  26.     $mode
  27.   );
  28.  
  29. }
  30.  
  31. init();
  32.  
  33. ?>

これで、あとはコマンドラインにて、この test_host.php を実行

CODE:
  1. [user@host ~]$ php test_host.php

で、あとは勝手にアップロードしてくれる。
PEAR、凄いよ、PEAR。

phpでmkdirとrmdirをひたすら繰り返してみた

2009年7月7日

Filed under: PHP — admin @ 12:22 PM

Ajaxも飽きてきたのでそろそろPHPをやろうと思いやっとphpに入門しました。
とりあえず無駄にディレクトリを作ったり消したりしてみた。

# あらかじめ、/ooiwa/ は、パーミッションを777にしてある。

PHP:
  1. $_dir = '/ooiwa/ahya';
  2. $permit = 0777;
  3.  
  4. if( !file_exists($_dir) ){
  5.    print '"'.$_dir.'" はありません。'."\n";
  6.    if( mkdir( $_dir , $permit ) ){
  7.       print '"'.$_dir.'" を生成しました。'."\n";
  8.    }else{
  9.       print '"'.$_dir.'" を生成できませんでした。'."\n";
  10.    }
  11. }else{
  12.    print '"'.$_dir.'" はすでに存在します。'."\n";
  13.    if( rmdir( $_dir ) ){
  14.       print '"'.$_dir.'" を削除しました。'."\n";
  15.    }else{
  16.       print '"'.$_dir.'" を削除できませんでした。'."\n";
  17.    }
  18. }

ディレクトリは、ルートディレクトリからみてどこにでも作成できるらしい。イケないファイルやディレクトリは外から見えない領域にこっそり作れちゃいますね。

ただし、あらかじめphpで作成する場所の親ディレクトリは、パーミッションを 777 にしておかなくてはいけないので、そこがめんどっちいです。chmod()とかでどうにかならないかと思いましたが無理でした。

まぁそれができてしまったらいくらでもクラックできてしまうしできなくて当然だよね。

pearでHTTP_Requestクラスを使うには (1)

2009年7月3日

Filed under: PHP,pear — admin @ 1:19 AM

phpネイティブだとHTTP_Request通信はソースをいっぱい書かなきゃいけないが、PEAR拡張モジュールを使うことによってかなりラクができる。

▼参考サイト

http://www.phppro.jp/school/pear/vol8/1

HTTP_Requestクラスを使うには、下記のコマンドを実行する。

CODE:
  1. [root@host]# pear install HTTP_Request

これで晴れてHTTP_Requestが使いまくりである。
リファレンスはまた後日。

phpで削除できなくなったファイルを削除する

2008年12月13日

Filed under: PHP — admin @ 10:46 PM

こんぬつわ。いまさらPHPの面白さがわかってきた僕です。

はるか昔に構築したXOOPSサイトの残骸で、パーミッショエラーで
FTP上から削除できなくなったファイルをどうにか削除する方法はないかと悩んでいました。

そこで思いついたのが、PHPでした。

unlink();というファイルを削除する関数があるので、
PHPスクリプトをつくって対処することにしました。

削除対象:
/xoops/uploads/photos/*.jpg
/xoops/uploads/thumbs/*.jpg
※ "*" は、[1-*]の数字

上記ディレクトリ内にあるjpgファイルをすべて削除したいので、
下記のようなスクリプトを作成。

PHP:
  1. <?php
  2. $dir_photo = "uploads/photos/";
  3. $dir_thum = "uploads/thumbs/";
  4.  
  5. for($i=0; $i<100;$i++){
  6.     $a = unlink($dir_photo . $i . ".jpg");
  7.     $b = unlink($dir_thum . $i . ".jpg");
  8.  
  9.     if($a == true || $b == true){
  10.         echo("[".$dir_photo.$i."jpg"."]"."true"."\n");
  11.         echo("[".$dir_thum.$i."jpg"."]"."true"."\n");
  12.     }else{
  13.         echo("[".$dir_photo.$i."jpg"."]"."false"."\n");
  14.         echo("[".$dir_thum.$i."jpg"."]"."false"."\n");
  15.     }
  16. }
  17. ?>

削除に成功したら、"true"、失敗したら"false"を返すようにした。
ファイル数の取得の仕方がわからなかったので、とりあえず
ループで100回まわすことにした。

で、実行した結果、無事にすべてのjpgファイルの削除に成功。
これでようやく残骸を削除することができた。

PHPって便利だねぇ。

JavaScriptでvar_dump()が使えるライブラリ – funny.js

2008年9月12日

Filed under: Ajax,JavaScript,PHP — admin @ 6:53 PM

PHPのvar_dump() が、JavaScriptで var_dump()できちゃうライブラリです。

var_dump() ver_0.5 ダウンロード

使い方は以下の通りです。
funny.jsを読み込んで、PHPと同じ感覚で、var_dump() しちゃってください。
シンタックスエラー以外は何かしら返ってくると思います。

HTML:
  1. <script src="funny.js" type="text/javascript"></script>
  2. <script type="text/javascript">
  3.  
  4. var a = 123;
  5. funny.var_dump( a );
  6.  
  7. </script>

var_dumpの基礎をつくった – for in文

2008年9月4日

Filed under: JavaScript,PHP — admin @ 6:23 PM

あれから自分でも var_dump関数 をつくってみました。

JavaScript:
  1. var_dump(document);
  2.  
  3. //var_dump
  4. function var_dump($obj) {
  5.     var $objList = "";
  6.     for($i in $obj) {
  7.         $objList += $i + ":" + $obj[$i] + "\n";
  8.     }
  9.     alert( $objList );
  10. }

windowとかやったら多分PC落ちるんじゃないかと・・・。

alert(); じゃなくて、documentに書き出す仕様をつくったらまた公開しまする。

MySQL インストールメモ

2008年6月6日

Filed under: MySQL,PHP — admin @ 7:14 PM

インスコメモです。

CODE:
  1. vi /etc/php.ini
  2. extension=php_mbstring.dll ←有効
  3. extension=php_mysql.dll ←有効

▽phpでmysqlを有効化する。

CODE:
  1. yum -y install php-mbstring php-mysql

SecureShell2関数を使う。 – SSH2インストール

2008年4月30日

Filed under: FedoraCore,PHP — admin @ 12:48 PM

SSH2インストール

参考URL

http://www.php.net/manual/ja/book.ssh2.php

・OpenSSLインストール

CODE:
  1. # yum install openssl-devel

・libssh2をダウンロードしてインストール

http://sourceforge.net/projects/libssh2/

CODE:
  1. # ./configure && make all install

・ssh2モジュールのインストール

CODE:
  1. # pecl download ssh2-beta
  2. # phpize && ./configure –with-ssh2

※phpizeがない場合、

CODE:
  1. # yum install php-dev

でインストールする。

config.h に
「#define LIBSSH2_APINO 200412301450」
を追記する。

CODE:
  1. # vi config.h
  2. # make

php.ini ファイルの extension_dir で指定された場所に ssh2.so をコピー。
php.iniにextention=ssh2.soを追記

php.ini の設定を再読込させるため、Web サーバを再起動します。

CODE:
  1. # /etc/rc.d/init.d/httpd restart

phpinfo()にてssh2のブロックが確認できれば成功です。

pearインストール メモ

2008年4月25日

Filed under: PHP — admin @ 5:29 PM

pearをインストールしてみた。

CODE:
  1. [ooiwa@EVA01_TEST ~]$ pwd
  2. /home/ooiwa/
  3. [ooiwa@EVA01_TEST ~]$ mkdir pear
  4. [ooiwa@EVA01_TEST ~]$ cd pear/
  5. [ooiwa@EVA01_TEST pear]$ wget http://pear.php.net/go-pear
  6. [ooiwa@EVA01_TEST pear]$ mv go-pear go-pear.php
  7. [ooiwa@EVA01_TEST pear]$ php -Cq go-pear.php
  8.  
  9. [ooiwa@EVA01_TEST pear]$ /home/ooiwa/pear/bin/pear install PEAR
  10. WARNING: channel "pear.php.net" has updated its protocols, use "channel-update pear.php.net" to update
  11. Did not download optional dependencies: pear/XML_RPC, use --alldeps to download automatically
  12. pear/PEAR can optionally use package "pear/XML_RPC" (version>= 1.4.0)
  13. downloading PEAR-1.7.1.tgz ...
  14. Starting to download PEAR-1.7.1.tgz (302,377 bytes)
  15. .........................done: 302,377 bytes
  16. downloading Archive_Tar-1.3.2.tgz ...
  17. Starting to download Archive_Tar-1.3.2.tgz (17,150 bytes)
  18. ...done: 17,150 bytes
  19. downloading Structures_Graph-1.0.2.tgz ...
  20. Starting to download Structures_Graph-1.0.2.tgz (30,947 bytes)
  21. ...done: 30,947 bytes
  22. downloading Console_Getopt-1.2.3.tgz ...
  23. Starting to download Console_Getopt-1.2.3.tgz (4,011 bytes)
  24. ...done: 4,011 bytes
  25. install ok: channel://pear.php.net/Archive_Tar-1.3.2
  26. install ok: channel://pear.php.net/Structures_Graph-1.0.2
  27. install ok: channel://pear.php.net/Console_Getopt-1.2.3
  28. install ok: channel://pear.php.net/PEAR-1.7.1
  29. PEAR: Optional feature webinstaller available (PEAR's web-based installer)
  30. PEAR: Optional feature gtkinstaller available (PEAR's PHP-GTK-based installer)
  31. PEAR: Optional feature gtk2installer available (PEAR's PHP-GTK2-based installer)
  32. PEAR: To install optional features use "pear install pear/PEAR#featurename"
  33. [ooiwa@EVA01_TEST pear]$ bin/pear list
  34. Installed packages, channel pear.php.net:
  35. =========================================
  36. Package          Version State
  37. Archive_Tar      1.3.2   stable
  38. Console_Getopt   1.2.3   stable
  39. PEAR             1.7.1   stable
  40. Structures_Graph 1.0.2   stable