PHP: AWS SDK for PHP v2 で S3 にファイルをアップロード

S3 の指定バケットにファイルをアップロードしたい、そんなときは AWS SDK を利用しましょう。

今回の例では PHP 版の SDK を利用します。

Composer をインストールします。

~$ curl -sS https://getcomposer.org/installer | php
#!/usr/bin/env php
All settings correct for using Composer
Downloading...

Composer successfully installed to: /path/to/aws-sdk-php/composer.phar
Use it: php composer.phar

composer.json に以下の json を記述して、AWS SDK for PHP をインストールする準備をします。

{
    "require": {
        "aws/aws-sdk-php": "2.*"
    }
}

AWS SDK for PHP をインストールします。

つづきをみる

PHP: AWS SDK for PHP v2 で S3 上の指定文字列にマッチするオブジェクトの削除

AWS SDK for PHP 2 系 を使用しています

S3 を長い間、運用していると S3 上のオブジェクトの内、特定の文字列を含むオブジェクトを一括削除したいときがあります。

Aws\S3\S3Client\deleteObject の存在は知っていたので、指定バケット以下から特定の文字列を含むオブジェクトを引っこ抜き、その後、引っこ抜いたオブジェクトを個別に削除していくのがセオリーだと思います。

try {
    $client = Aws\S3\S3Client::factory([
        'key'     => 'YOUR ACCESS KEY',
        'secret'  => 'YOUR SECRET KEY',
        'profile' => 'YOUR PROFILE',
        'region'  => 'YOUR REGION CODE'
    ]);

    $client->deleteObject([
        'Bucket' => 'BUCKET NAME',
        'Key'    => 'DELETE TARGET KEY'
    ]);
} catch (Exception $ex) {
    throw $ex;
}

オプションの説明は Configuring the SDK が参考になります。 region に利用できる列挙体は Class Aws\Common\Enum\Region で確認できます。

[[MORE]]

ただ、引っこ抜く手間が面倒な場合もあります。
AWS SDK for PHP のドキュメントを確認してみると deleteMatchingObjects なるものがあります。

これは指定した正規表現にマッチしたオブジェクトを削除することができます。

try {
    $client = Aws\S3\S3Client::factory([
        'key'     => 'YOUR ACCESS KEY',
        'secret'  => 'YOUR SECRET KEY',
        'profile' => 'YOUR PROFILE',
        'region'  => 'YOUR REGION CODE'
    ]);

    $client->deleteMatchingObjects('BUCKET NAME', 'DIRECTORY PREFIX', '/YOUR REGEX CODE/');
} catch (Exception $ex) {
    throw $ex;
}

これ結構、便利です。

iOS 8 Safari のユーザーエージェント - iPhone, iPad, iPod touch

iOS バージョン 8 系のユーザーエージェント一覧です。

iOS 8.0

// iPhone
Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12A365 Safari/600.1.4

// iPad
Mozilla/5.0 (iPad; CPU OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12A365 Safari/600.1.4

// iPod touch
Mozilla/5.0 (iPod touch; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12A365 Safari/600.1.4

iOS 8.0.1

// iPad (by Google Search Appliance)
Mozilla/5.0 (iPad; CPU OS 8_0_1 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) GSA/4.2.0.37439 Mobile/12A402 Safari/9537.53

iOS 8.0.2

// iPhone
Mozilla/5.0 (iPhone; CPU iPhone OS 8_0_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12A405 Safari/600.1.4

// iPad
Mozilla/5.0 (iPad; CPU OS 8_0_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12A405 Safari/600.1.4

// iPod touch
Mozilla/5.0 (iPod touch; CPU iPhone OS 8_0_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12A405 Safari/600.1.4

iOS 8.1

// iPhone
Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B411 Safari/600.1.4

// iPod touch
Mozilla/5.0 (iPod touch; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B411 Safari/600.1.4

// iPad
Mozilla/5.0 (iPad; CPU OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B410 Safari/600.1.4

iOS 8.1.1

// iPhone
Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B435 Safari/600.1.4

// iPod touch
Mozilla/5.0 (iPod touch; CPU iPhone OS 8_1_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B435 Safari/600.1.4

// iPad
Mozilla/5.0 (iPad; CPU OS 8_1_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B435 Safari/600.1.4

iOS 8.1.2

// iPhone
Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B440 Safari/600.1.4

// iPod touch
Mozilla/5.0 (iPod touch; CPU iPhone OS 8_1_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B440 Safari/600.1.4

// iPad
Mozilla/5.0 (iPad; CPU OS 8_1_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B440 Safari/600.1.4

iOS 8.1.3

// iPhone 
Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B466 Safari/600.1.4

// iPod touch
Mozilla/5.0 (iPod touch; CPU iPhone OS 8_1_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B466 Safari/600.1.4

// iPad
Mozilla/5.0 (iPad; CPU OS 8_1_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B466 Safari/600.1.4

iOS 8.2

// iPhone
Mozilla/5.0 (iPhone; CPU iPhone OS 8_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12D508 Safari/600.1.4

// iPod touch
Mozilla/5.0 (iPod touch; CPU iPhone OS 8_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12D508 Safari/600.1.4

// iPad
Mozilla/5.0 (iPad; CPU OS 8_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12D508 Safari/600.1.4

iOS 8.3

// iPhone
Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12F70 Safari/600.1.4

iOS 8.4.1

// iPhone
Mozilla/5.0 (iPhone; CPU iPhone OS 8_4_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12H321 Safari/600.1.4

iOS 8 以外のユーザーエージェント

Linux: プロセスの一時停止と再開(CentOS)

終了までに時間のかかるバッチ処理を実行している際に、負荷的な面などから一時的に処理を停止させたい場合があります。

その際、kill コマンドでそれが実現できます。

プロセスの一時停止

# kill -s SIGSTOP {プロセスID}

一時停止しているプロセスの再開

# kill -s SIGCONT {プロセスID}

実際に上記のコマンドを実行するときには、まず ps コマンドにて一時停止させたい処理を探します。

つづきをみる

mysqldump コマンドで条件(WHERE)を指定してダンプする方法

mysqldump コマンドだけで条件を指定してダンプデータって取れるのかな?と思って公式マニュアル見てみたらちゃんと書いてありました。

(引用元: MySQL :: MySQL 5.1 リファレンスマニュアル :: 7.11 mysqldump - データベースバックアッププログラム

–where=’where_condition’, -w ‘where_condition’
あるWHERE状態に選択された行のみダンプします。ユーザのコマンドインタープリタにとって特別なキャラクタ、もしくはスペースを含んでいる場合、状態の周りをクオートで囲まなければいけません。
例:

--where="user='jimf'"
-w"userid>1"
-w"userid<1"

本当に指定した条件でダンプされるか試すためにテスト用のデータを作ります。

mysql> CREATE DATABASE testdb;
Query OK, 1 row affected (0.00 sec)

mysql> use testdb;
Database changed

mysql> CREATE TABLE users (id INTEGER, name VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB;
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO users (id, name, email) VALUES (1, 'test-1', '*****@xxxx.yyy'), (2, 'test-2', '*****@xxxx.zzz'), (3, 'test-3', '*****@xxxx.yyy'), (4, 'hoge-4', '*****@xxxx.zzz'), (5, 'fuga-5', '*****@xxxx.zzz');
Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM users;
+----+--------+----------------+
| id | name   | email          |
+----+--------+----------------+
|  1 | test-1 | *****@xxxx.yyy |
|  2 | test-2 | *****@xxxx.zzz |
|  3 | test-3 | *****@xxxx.yyy |
|  4 | hoge-4 | *****@xxxx.zzz |
|  5 | fuga-5 | *****@xxxx.zzz |
+----+--------+----------------+
5 rows in set (0.00 sec)

mysql> quit
Bye

これから叩くダンプコマンドの説明です。

$ mysqldump -u {ユーザー名} {データベース名} {デーブル名} -t --where="{条件}" > dump.sql

{条件} は SQL の WHERE 句に記述する条件と同じです。

ではテストデータの email@xxxx.zzz で終わる行だけをダンプしてみましょう。

$ mysqldump -u root testdb users -t --where="email LIKE '%@xxxx.zzz'" > dump-1.sql

dump-1.sql の中身をみてみましょう。

-- MySQL dump ***** ******************
--
-- Host: localhost    Database: testdb
-- ------------------------------------------------------
-- Server version       *******

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Dumping data for table `users`
--
-- WHERE:  email LIKE '%@xxxx.zzz'

LOCK TABLES `users` WRITE;
/*!40000 ALTER TABLE `users` DISABLE KEYS */;
INSERT INTO `users` VALUES (2,'test-2','*****@xxxx.zzz'),(4,'hoge-4','*****@xxxx.zzz'),(5,'fuga-5','*****@xxxx.zzz');
/*!40000 ALTER TABLE `users` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on Y-m-d H:i:s

Dumping data for table users の WHERE に条件が反映されていますね。

実際にリストアして SELECT してみましょう。

mysql> CREATE DATABASE testdb_1;
Query OK, 1 row affected (0.00 sec)

mysql> use testdb_1;
Database changed

mysql> CREATE TABLE users (id INTEGER, name VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB;
Query OK, 0 rows affected (0.01 sec)

mysql> quit
Bye

$ mysql -u root testdb_1  SELECT * FROM users;
+----+--------+----------------+
| id | name   | email          |
+----+--------+----------------+
|  2 | test-2 | *****@xxxx.zzz |
|  4 | hoge-4 | *****@xxxx.zzz |
|  5 | fuga-5 | *****@xxxx.zzz |
+----+--------+----------------+
3 rows in set (0.00 sec)

次に複数条件を試してみます。先程の条件にプラスして、nametest で始まる行をダンプしてみましょう。

$ mysqldump -u root testdb users -t --where="email LIKE '%@xxxx.zzz' AND name LIKE 'test%'" > dump-2.sql
$ less dump-2.sql
.
.
.
--
-- Dumping data for table `users`
--
-- WHERE:  email LIKE '%@xxxx.zzz' AND name LIKE 'test%'

LOCK TABLES `users` WRITE;
/*!40000 ALTER TABLE `users` DISABLE KEYS */;
INSERT INTO `users` VALUES (2,'test-2','*****@xxxx.zzz');
/*!40000 ALTER TABLE `users` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
.
.
.

IN も問題なく使えました。

$ mysqldump -u root testdb users -t --where="id IN (1, 3, 5)" > dump-3.sql
$ less dump-3.sql
.
.
.
--
-- Dumping data for table `users`
--
-- WHERE:  id IN (1, 3, 5)

LOCK TABLES `users` WRITE;
/*!40000 ALTER TABLE `users` DISABLE KEYS */;
INSERT INTO `users` VALUES (1,'test-1','*****@xxxx.yyy'),(3,'test-3','*****@xxxx.yyy'),(5,'fuga-5','*****@xxxx.zzz');
/*!40000 ALTER TABLE `users` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
.
.
.

便利。

参考 URL

MySQL おすすめ書籍

MySQL おすすめ書籍#1 MySQL おすすめ書籍#2