PHP

【CentOS】CentOS6にffmpeg、ffmpeg-phpをインストールする。

かなりスパッとインストールできたので手順をめも。

1, まずはyumのアップデートを行う。

yum update

2, デベロップメントツールをインストール。

yum groupinstall "Development tools"

3, ProtectBaseをインストールする。

yum install yum-protectbase

4, 下記ディレクトリに移動。

cd /etc/yum.repos.d/

5, リポジトリに変更を加える前にバックアップを取る。

cp -prv ../yum.repos.d{,.orig}

6, CentOS-Base.repo, CentOS-Media.repo, virtualmin.repoの各リポジトリセクションに「protect=1」の記述を追加する。

sed -i '/gpgkey=/a\protect=1' CentOS-{Base,Media}.repo
sed -i '/gpgkey=/a\protect=1' virtualmin.repo

7, dag’sリポジトリを追加する。「/etc/yum.repos.d/dag.repo」を作成し下記を記述。

[dag]
name=Dag RPM Repository for Red Hat Enterprise Linux
baseurl=http://apt.sw.be/redhat/el$releasever/en/$basearch/dag
gpgcheck=1
gpgkey=http://dag.wieers.com/packages/RPM-GPG-KEY.dag.txt
enabled=1
protect=0

8, dag’s rpm gpg key をローカルへ保存し、インポートを行う。

# 下記URLより取得
wget http://dag.wieers.com/packages/RPM-GPG-KEY.dag.txt -P /tmp
# インポート
rpm --import /tmp/RPM-GPG-KEY.dag.txt

9, ffmpegをいくつかの開発パッケージと併せてインストール。

yum install ffmpeg-devel php-devel re2c php-xml ffmpeg

10, インストール後、下記コマンドでffmpegのバージョンを確認。

ffmpeg

↓

FFmpeg version 0.6.5, Copyright (c) 2000-2010 the FFmpeg developers
...
...
...

11, ffmpeg-phpのエクステンションをコンパイル、インストールする。

# 新規にディレクトリを作成
mkdir /srv/build

# 作成したディレクトリに移動
cd /srv/build

# ffmpeg-phpのソースを取得
wget http://downloads.sourceforge.net/project/ffmpeg-php/ffmpeg-php/0.6.0/ffmpeg-php-0.6.0.tbz2

# 解凍する
tar -xjf ffmpeg-php-0.6.0.tbz2

# 解凍したディレクトリに移動
cd ffmpeg-php-0.6.0/

# PHPの拡張モジュールをビルドする
phpize

# いつも通りのおまじないを実行
./configure

12, ここで、コンパイルエラーを防ぐために下記コマンドを実行。

sed -i 's#PIX_FMT_RGBA32#PIX_FMT_RGB32#' ./ffmpeg_frame.c

13, makeしてインストール。

make
make install

14, ffmpeg-phpエクステンションををロード。

echo -e "extension=ffmpeg.so\n" > /etc/php.d/ffmpeg.ini

15, アパッチを再起動。

service httpd restart

16, インストールはここで完了。下記コマンドでffmpegのインストール状況を確認可能。

php -i | grep ffmpeg
php -m | grep ffmpeg

 

【PHP】Composerのインストール方法めも。

覚えられないけどよくつかうのでとりあえずペタリ。

composer.jsonと同階層のディレクトリで下記を実行。

curl -sS https://getcomposer.org/installer | php

あとは下記コマンドでインストールを実行するだけ。

php composer.phar install

 

【PHP】Symfony2.3のインストール時、ICUのバージョンで怒られたら。

composer installでのインストール時、ICUのバージョンが足りないと下記のようなことを言われる。

Your requirements could not be resolved to an installable set of packages.
...
...

ICUのバージョンがたりねぇよとのことなので、アンインストール後サイドインストールを行う。

以下手順。

# ICUをアンインストール
yum remove libicu*

# ソースコードを取得
wget http://download.icu-project.org/files/icu4c/51.2/icu4c-51_2-src.tgz

# 解凍
tar zxf icu4c-51_2-src.tgz 

# 解凍したディレクトリに移動
cd icu/source/

# コンパイルしてからの
./configure
make

# インストール実行
make install

# intlモジュールを再インストール
pear install pecl/intl

# php_ini に追記
echo "extension=intl.so" > /etc/php.d/intl.ini

以上で完了。
この後、再び「php composer.phar install」を実行すればよい。

 

【PHP】配列の値を部分一致検索する。

めも。

今回必要だったのは下記のようなシチュエーション。

配列1の各要素を配列2の要素すべてと部分一致するかを評価し、
真の場合その要素を配列中から取り除くといった処理を行いたい。

ようは親配列(配列1)から無視リスト(配列2)の要素を取り除きたかったのである。

class hoge extends fuga{

	protected $return = array();

	public function execute(){
		// 何らかの配列
		$array = array(
			'foo_1',
			'foo_2',
			'foo_3',
			'bar_1',
			'bar_2',
			'bar_3',
		);
		// 配列にフィルターをかける
		array_walk_recursive($array, array('self', 'arrayLikeFilter'));
		$array = $this->return;

		var_dump($array);
		die();
	}

	// 配列から取り除きたい値リストを返却する関数
	protected function _getIgnore() {
		return array(
			'foo_'
		);
	}

	protected function arrayLikeFilter(&$value, $key) {
		$add = true;
		foreach($this->_getIgnore() as $file) {
			$p = "/$file/i";
			if(preg_match($p, $value)) {
				$add = false;
			}
		}
		if($add) {
			$this->return[] = $value;
		}
	}
}

上記クラスexecute()メソッドの実行結果は下記となる。

array(3) {
  [0]=>
  string(5) "bar_1"
  [1]=>
  string(5) "bar_2"
  [2]=>
  string(5) "bar_3"
}

みごとにライク検索で「foo_」から始まる値のキーを取り除く事ができた。
ただし処理的にかなり重い部類に入ると思われるので、巨大な配列を処理する際は注意されたし。

 

【PHP】コンソール上の標準出力に色を付ける。

めも。

下記のようにANSI エスケープシーケンスを用いる。

以下例。

$str = 'ほげ';

// 文字を赤くする
echo "\033[0;31m$str\033[0m";

// 文字の背景を赤くする
echo "\033[41m$str\033[0m"

// 文字の色を反転させる
echo "\033[7m$str\033[0m";

といった感じ。

ルールは下記の通り。

\033[コードm文字列\033[0m

コードの部分は下記のようなものが指定可能

■文字色

Black 0;30
Blue 0;34
Green 0;32
Cyan 0;36
Red 0;31
Purple 0;35
Brown 0;33
Light Gray 0;37
Dark Gray 1;30
Light Blue 1;34
Light Green 1;32
Light Cyan 1;36
Light Red 1;31
Light Purple 1;35
Yellow 1;33
White 1;37

■背景色

Black 44
Cyan 46
Red 41
Purple 45
Brown 43
Light Gray 47

■その他

下線 4
色の反転 7

 

【PHP】コンソールの標準出力で値の入力を受け取る。

めも。

// 警告文を出す際のなんらかの条件式
if(true) {
	// コンソール上に表示する出力文
	echo '警告文 [y/n] : ';
	$input = null;
	while(1) {
		$input = fgets(STDIN, 4096);
		if($input == "n\n" || $input == "no\n") {
			// 処理を終了する
			die();
		}
		if($input == "y\n" || $input == "yes\n") {
			// 処理を続行する
			break;
		}
		echo '[y] [yes] [n] [no] のいずれかを入力してください : '; 
	}
}

こんな感じでOK。
ちなみにSTDINはstdinへのオープン済みストリーム。そのためfopenなどでのストリームオープン無しに利用することが可能。
fgets(STDIN)とするとその地点で入力待機状態になるため、コンソール上から値を入力することができる。

 

【PHP】glob()関数の取得結果からファイルのみを抽出する。

めも。

前回のエントリ←で書いたディレクトリ内再帰取得関数などでファイルリストを取得した後に。

$list = glob('/path/to/dir');
$list = array_filter($list, 'is_file');

シンプルだね。

 

【PHP】指定したディレクトリ下のファイルを再帰的に取得する。

めも。

下記の再帰関数にパスを渡せばOK。

function scanDir($dir) {
	$list = $tmp = array();
	foreach(glob($dir.'*/', GLOB_ONLYDIR) as $child) {
		if ($tmp = self::scanDir($child)) {
			$list = array_merge($list, $tmp);
		}
	}
	foreach(glob($dir.'{*.*}', GLOB_BRACE) as $file) {
		$list[] = $file;
	}
	return $list;
}