Hatena::ブログ(Diary)

yk5656 diary

記事一覧: Linux | Ansible | Swift | Ruby | PHP | JavaScript | MySQL | Git | Vim

2016-03-21(月)

PhpStormでPHPUnitを実行してみる

CakePHP3をインストールしてみる
の続き

PhpStormでPHPUnitを実行してみる。


PHPUnitの設定

PHPUnitをインストールし、

$ sudo yum -y install php-phpunit-PHPUnit

phpunit.xmlを用意する。

$ cd /vagrant/sample
$ mv phpunit.xml.dist phpunit.xml


PhpStormの設定

前回作成したCakePHP3のsampleをPhpStormで開く。
f:id:yk5656:20160421113945p:image

設定画面を開く。
f:id:yk5656:20160421113944p:image


PhpStormの設定(インタプリタの追加)

[Languages & Frameworks]-[PHP]で、Interpretersの画面を開く。
f:id:yk5656:20160421114104p:image:w550

[+]ボタンを押して、[Remote]を選択し、
f:id:yk5656:20160421114103p:image:w550

[Vagrant]を選択し、Vagrantのフォルダを設定する。
f:id:yk5656:20160421114102p:image:w550

以上で、インタプリタが追加される。
f:id:yk5656:20160421114101p:image:w550


PhpStormの設定(PHPUnitの設定)

[Languages & Frameworks]-[PHP]-[PHPUnit]で、[+]ボタンを押し、 [By Remote Interpreter]を選択する。
f:id:yk5656:20160421114337p:image

先ほど追加したインタプリタを選択する。
f:id:yk5656:20160421114336p:image

[Default configuration file]にphpunit.xmlのパスを設定する。
f:id:yk5656:20160421114335p:image:w550


PhpStormの設定(Runの追加)

[Run]-[Edit Configurations]を選択し、
f:id:yk5656:20160421114429p:image

PHPUnitを追加する。
Test Runnerは「Defined in the configuration file」にする。
f:id:yk5656:20160421114427p:image:w550


PHPUnitの実行

PHPUnitを実行すると、
f:id:yk5656:20160421114558p:image

PHPUnitの結果が表示される。
f:id:yk5656:20160421114556p:image:w600

2016-03-20(日)

PhpStormでデバッグしてみる

CakePHP3をインストールしてみる
の続き

PhpStormでデバッグしてみる。


PhpStormの設定

前回作成したCakePHP3のsampleをPhpStormで開く。
f:id:yk5656:20160421004845p:image

[PhpStorm]-[Preferences]で設定画面を開き、
f:id:yk5656:20160421004844p:image

サーバーを追加する。 サーバー名/サーバーのIPアドレスを入力し、パスマッピングの設定をする。
f:id:yk5656:20160421004842p:image:w580

[Run]-[Edit Configurations]を開き、
f:id:yk5656:20160421004943p:image

リモートデバッグの設定を追加する。
「PHP Remote Debug」を追加して、先ほど追加したサーバーを指定し、 Ide keyに適当なIDを設定する。
f:id:yk5656:20160421004942p:image:w580


Xdebugの設定

Xdebugをインストールし、

$ sudo yum install php-xdebug

下記の行を追加する。

$ sudo vi /etc/php.d/xdebug.ini
・・・
xdebug.remote_enable=1
xdebug.remote_connect_back=1

再起動して反映。

$ sudo systemctl restart httpd


ブックマークレットの準備

下記のページに行って、

Xdebug & Zend Debugger bookmarklets generator for PhpStorm
https://www.jetbrains.com/phpstorm/marklets/

[GENERATE]ボタンを押して、
「Start debugger」「Stop debugger」をブックマークバー等に保存する。
f:id:yk5656:20160421005223p:image:w300


デバッグの実施

とりあえず、適当にブレークポイントを設定しておく。
f:id:yk5656:20160421005435p:image

[Run]-[Debug]を選択し、
f:id:yk5656:20160421005434p:image

今回追加したリモートデバッグを選択すると、
f:id:yk5656:20160421005433p:image

デバッガが起動する。
f:id:yk5656:20160421005432p:image

http://localhost:8080/sample/にアクセスし、「Start debugger」を押してデバッグを開始する。
f:id:yk5656:20160421005624p:image

リロードして、改めてアクセスすると、ブレークポイントで止まる。
f:id:yk5656:20160421005623p:image

ちなみに、「Start debugger」を押すと、Cookieに、「XDEBUG_SESSION」が保存され、
f:id:yk5656:20160421005622p:image:w400
「Stop debugger」を押すと削除される。


常にデバッグしたい場合

ブックマークレットで切り替えず、常にStart debuggerした状態にしたい場合、
xdebugの設定で、remote_autostartをONにして、idekeyを設定する。

$ sudo vi /etc/php.d/xdebug.ini
・・・
xdebug.remote_enable=1
xdebug.remote_connect_back=1
xdebug.remote_autostart=1
xdebug.idekey='PHPSTORM'

以上で、Star debuggerを押していなくても、デバッガが起動していれば ブレークポイントで止まる。
f:id:yk5656:20160421005828p:image:w550


CLIをデバッグしたい場合

remote_connect_backは$_SERVER['REMOTE_ADDR']でブラウザからのアクセス元のIPを取得しているみたいだが、 CLIの場合は取得できないので、ホストOSのIPアドレスを指定する必要がある。

下記のような感じで、xdebugの設定にホストOSのIPアドレスを指定すれば、 ブラウザからもCLIからでもデバッグできる。

$ sudo vi /etc/php.d/xdebug.ini
・・・
xdebug.remote_enable=1
xdebug.remote_host='10.0.2.2'
xdebug.remote_autostart=1
xdebug.idekey='PHPSTORM'

適当なPHPを作成して、

cd /vagrant/sample
vi test.php
<?php
$a = 'Hello';
$b = 'world!';
echo $a + ' ' + $b;

ブレークポイントを設定する。
f:id:yk5656:20160421005951p:image

実行すると

$ php test.php

ブレークポイントで止まる。
f:id:yk5656:20160421005950p:image

2016-02-28(日)

CakePHP3をインストールしてみる

CakePHP3をインストールしてみる。


サーバーの準備

VagrantでCentOS7を用意する。

mac$ vi Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "bento/centos-7.1"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.network "forwarded_port", guest: 80, host: 8080
  config.vm.synced_folder ".", "/vagrant", mount_options: ['dmode=777', 'fmode=666']
end
mac$ vagrant up
mac$ vagrant ssh

ルートになって必要そうなパッケージをインストールしていく。

$ su -
# yum -y install epel-release

Apacheをインストール。

# yum -y install httpd
# rm -df /var/www/html
# ln -s /vagrant /var/www/html
# sed -i -e 's/AllowOverride None/AllowOverride All/g' /etc/httpd/conf/httpd.conf
# systemctl enable httpd
# systemctl start httpd

PHPをインストール。

# yum -y install php php-pdo php-mysqlnd php-intl php-mbstring
# sed -i -e 's/;date.timezone =/date.timezone = Asia\/Tokyo/g' /etc/php.ini
# systemctl restart httpd

MariaDBをインストール。

# yum -y install mariadb mariadb-server
# systemctl enable mariadb
# systemctl start mariadb

終了。

# exit


CakePHP3のインストール

Composerをインストールする。

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

ComposerでCakePHP3をインストールする。 しかし、なぜか途中で止まってしまう。

$ php composer.phar create-project --prefer-dist cakephp/app sample
・・・
> Cake\Composer\Installer\PluginInstaller::postAutoloadDump

よく分からないが、とりあえずComposerで続きをインストールし、app.phpの作成とsaltの設定を行う。

$ cd /vagrant/sample
$ php ../composer.phar install
・・・
> App\Console\Installer::postInstall
Created `config/app.php` file
Set Folder Permissions ? (Default to Y) [Y,n]? y
Updated Security.salt value in config/app.php

データベースを用意し、

$ mysql -u root -e "CREATE DATABASE sample;"
$ mysql -u root -e "CREATE DATABASE test_sample;"

app.phpに設定する。

$ vi config/app.php
・・・
   'Datasources' => [
        'default' => [
            ・・・
            'username' => 'root',
            'password' => '',
            'database' => 'sample',
        ・・・
        'test' => [
            ・・・
            'username' => 'root',
            'password' => '',
            'database' => 'test_sample',
・・・

以上で、 http://localhost:8080/ にアクセスすると、CakePHP3のページが表示される。
f:id:yk5656:20160420224010p:image:w550

2014-12-28(日)

Ubenchでベンチマークを取得してみる

PHPで、Ubenchでベンチマークを取得してみる。


https://github.com/devster/ubench
からUbench.phpをダウンロードして設置する。

$ vi test.php
<?php
require_once 'Ubench.php';

$bench = new Ubench;

$bench->start();

// 計測するダミーの処理
$tmp = array();
for ($i = 0; $i < 100000; $i++) {
  $tmp[] = $i;
}
$tmp = array();
// ここまで

$bench->end();

echo "かかった時間 = " . $bench->getTime() . "\n"; 
echo "ピーク時の使用メモリ = " . $bench->getMemoryPeak() . "\n"; 
echo "最終使用メモリ = " . $bench->getMemoryUsage() . "\n"; 

実行すると、下記のような感じで出力される。

$ php test.php 
かかった時間 = 35ms
ピーク時の使用メモリ = 14.50Mb
最終使用メモリ = 768.00Kb

2014-12-27(土)

配列の特定のカラムの値をキーに設定

PHPで、配列の特定のカラムの値をキーに設定してみる。

<?php
$arr = array(
  array('id' => 100, 'name' => 'aaa'),
  array('id' => 200, 'name' => 'bbb'),
  array('id' => 300, 'name' => 'ccc'),
);

$arr = array_combine(array_column($arr, 'id'), $arr);

print_r($arr);

下記のように出力される。

Array
(
    [100] => Array
        (
            [id] => 100
            [name] => aaa
        )

    [200] => Array
        (
            [id] => 200
            [name] => bbb
        )

    [300] => Array
        (
            [id] => 300
            [name] => ccc
        )

)

2014-12-20(土)

PHPのComposerを試してみる

VirtualBoxにCentOSをとりあえずインストール
の続き

PHPのComposerを試してみる。


準備

rootになってPHPをインストールする。

$ su -
# yum -y install php php-dom

PHPUnitをインストールする場合、php-domが入っていないと、下記のようなエラーがでるので、

・・・ the requested PHP extension dom is missing from your system.

今回はphp-domもインストールしておく。

Composerのインストール

Composerをインストールする。

# curl -sS https://getcomposer.org/installer | php
# mv composer.phar /usr/local/bin/composer

入った。

# composer
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
・・・

Composerで色々インストールしてみる

色々インストールしてみる。

# vi composer.json
{
    "require": {
        "phing/phing": "*",
        "phpunit/phpunit": "*",
        "squizlabs/php_codesniffer": "*",
        "phpmd/phpmd" : "*",
        "sebastian/phpcpd": "*",
        "phploc/phploc": "*"
    },
    "config": {
        "vendor-dir": "/usr/local/src/vendor/",
        "bin-dir" : "/usr/local/bin/"
    }
}
インストール先は、どこがいいのかよく分からなかったので、とりあえず/usr/local/src/vendorにして、
実行ファイルへのリンクを/usr/local/binにした。

インストールを実行。

# composer install

下記の箇所にインストールされる。

# ls -l /usr/local/bin/
合計 1052
-rwxr-xr-x 1 root root 1075150  35 20:07 2015 composer
lrwxrwxrwx 1 root root      45  35 20:35 2015 pdepend -> ../src/vendor/pdepend/pdepend/src/bin/pdepend
lrwxrwxrwx 1 root root      35  35 20:34 2015 phing -> ../src/vendor/phing/phing/bin/phing
lrwxrwxrwx 1 root root      54  35 20:35 2015 phpcbf -> ../src/vendor/squizlabs/php_codesniffer/scripts/phpcbf
lrwxrwxrwx 1 root root      37  35 20:35 2015 phpcpd -> ../src/vendor/sebastian/phpcpd/phpcpd
lrwxrwxrwx 1 root root      53  35 20:35 2015 phpcs -> ../src/vendor/squizlabs/php_codesniffer/scripts/phpcs
lrwxrwxrwx 1 root root      34  35 20:35 2015 phploc -> ../src/vendor/phploc/phploc/phploc
lrwxrwxrwx 1 root root      39  35 20:35 2015 phpmd -> ../src/vendor/phpmd/phpmd/src/bin/phpmd
lrwxrwxrwx 1 root root      37  35 20:35 2015 phpunit -> ../src/vendor/phpunit/phpunit/phpunit

(補足)GitHubでエラーが出た場合

インストール中にGitHubで下記のようなエラーが出た場合、適当なGitHubアカウントのユーザー名とパスワードを入れれば、インストールを再開できる。

Could not fetch https://api.github.com/・・・, enter your GitHub credentials to go over the API rate limit
A token will be created and stored in "/root/.composer/auth.json", your password will never be stored
To revoke access to this token you can visit https://github.com/settings/applications
Username: (適当なGitHubアカウントのユーザー名)
Password: (適当なGitHubアカウントのパスワード)
【参考】
madroom project: Travis CIでComposer installする時にGitHubのAPI上限エラー
http://madroom-project.blogspot.jp/2013/02/travis-cicomposer-installgithubapi.html

2014-12-19(金)

PHPでExcelをCSVに変換してみる

PHPでExcelをCSVに変換してみる


excel2csv.php

ExcelをCSVに変換するPHPを作成。

<?php

// Excelの準備
$excel = new COM("excel.application") or die;
$excel->DisplayAlerts = 0;

foreach (array_slice($argv, 1) as $file_path)
{
  // ファイルを開く
  $book = $excel->Workbooks->Open($file_path);

  // CSVに変換する
  foreach ($book->Worksheets as $sheet) {
    $sheet->SaveAs($file_path . ".{$sheet->Name}.csv", 6);
  }

  // ファイルを閉じる
  $book->Close();
}

// Excelを終了
$excel->Quit();

excel2csv.bat

Excelファイルをドラッグ&ドロップできるようBATを作成。

@echo off
%~d0
cd %~dp0

php excel2csv.php %*

sample.xlsx

サンプルのExcelファイルを用意。
f:id:yk5656:20150208212902j:image

f:id:yk5656:20150208212901j:image

実行結果

実行すると、下記のようにCSVファイルが生成される。
f:id:yk5656:20150324234658j:image

2014-12-18(木)

PHPでExcelとCSVの読み込み速度を比較してみる(PHPExcelの場合)

PHPでExcelとCSVの読み込み速度を比較してみる
の続き

PHPExcelを使った場合も試してみる。


検証用プログラム

php_excel.php

<?php
$time = microtime(true);

// PHPExcelライブラリ読み込み
require_once 'PHPExcel.php';
require_once 'PHPExcel/IOFactory.php';

// ファイルを開く
$obj = PHPExcel_IOFactory::createReader('Excel2007');
$file = $obj->load('sample.xlsx');

// 各セルの値を合計する
$count = 0;
$file->setActiveSheetIndex(0);
$sheet = $file->getActiveSheet();
foreach ($sheet->getRowIterator() as $row) {
  foreach ($row->getCellIterator() as $cell) {
    $count += $cell->getCalculatedValue();
  }
}

// 結果を表示
echo "合計=" . $count . "\n";
echo sprintf("%.4f秒", microtime(true) - $time);

結果

> php php_excel.php
合計=1000000
0.6007> php php_excel.php
合計=1000000
0.6029> php php_excel.php
合計=1000000
0.6074> php php_excel.php
合計=1000000
0.6031> php php_excel.php
合計=1000000
0.6090

まとめ


Excelファイルの読み込み(COM) ※前回の結果約3.9秒
Excelファイルの読み込み(PHPExcel)約0.6秒

COMよりPHPExcelのほうが速い。

2014-12-17(水)

PHPでExcelとCSVの読み込み速度を比較してみる

PHPで、Excelファイルの読み込みに時間がかかるので、
CSVファイルの場合とどれくらい違うのか比較してみる。


100x100マスのExcelファイルを用意し、
全てのセルの数値を合計するプログラムを書いて、
どれくらい時間がかかるか比べてみる。

検証用データ


sample.xlsx

f:id:yk5656:20150322235912p:image:w560

12100
23101
100101199


sample.csv

上記のExcelファイルからCSVファイルを生成する。


検証用プログラム


Excelの場合

excel.php

<?php
$time = microtime(true);

// Excelの準備
$excel = new COM("excel.application") or die;
$excel->DisplayAlerts = 0;

// ファイルを開く
$file = $excel->Workbooks->Open(dirname(__FILE__) . "/sample.xlsx");

// 各セルの値を合計する
$count = 0;
foreach ($file->Worksheets as $sheet) {
  for ($rows = 1; $rows <= 100; $rows++) {
    for ($cols = 1; $cols <= 100; $cols++) {
      $count += (int)$sheet->Cells($rows, $cols)->Value;
    }
  }
}

// ファイルを閉じる
$file->Close();

// Excelを終了
$excel->Quit();

// 結果を表示
echo "合計=" . $count . "\n";
echo sprintf("%.4f秒", microtime(true) - $time);

CSVの場合

csv.php

<?php
$time = microtime(true);

// ファイルを開く
$file = fopen(dirname(__FILE__) . "/sample.csv", "r");

// 各セルの値を合計する
$count = 0;
while (($line = fgetcsv($file, 1000, ",")) !== false) {
  foreach ($line as $value) {
    $count += (int)$value;
  }
}

// ファイルを閉じる
fclose($file); 

// 結果を表示
echo "合計=" . $count . "\n";
echo sprintf("%.4f秒", microtime(true) - $time);


結果


Excelの場合
> php excel.php
合計=1000000
3.9025> php excel.php
合計=1000000
3.9993> php excel.php
合計=1000000
3.8887> php excel.php
合計=1000000
3.9860> php excel.php
合計=1000000
3.9707

CSVの場合
> php csv.php
合計=1000000
0.0081> php csv.php
合計=1000000
0.0081>php csv.php
合計=1000000
0.0080>php csv.php
合計=1000000
0.0081>php csv.php
合計=1000000
0.0080


まとめ

Excelファイルの読み込み約3.9秒
CSVファイルの読み込み約0.008秒


Excelファイルの読み込みは時間がかかる。

2014-12-16(火)

PHPExcelでExcelファイルを読み込んでみる

Windows環境にて、PHPExcelを使ってExcelファイルを読み込んでみる。


【参考】
PHPExcelの使い方・エクセル操作方法のまとめ
http://mizyupon-rpg.com/posts/719.html

下記のExcelファイルを読み込んでみる。

sample.xlsx

f:id:yk5656:20150208212902j:image

f:id:yk5656:20150208212901j:image

準備

PHPExcelをダウンロードして、下記のような感じで配置する。

適当なフォルダ

├PHPExcel/
├PHPExcel.php
├sample.php
└sample.xlsx

sample.php

<?php
// PHPExcelライブラリ読み込み
require_once 'PHPExcel.php';
require_once 'PHPExcel/IOFactory.php';

// ファイルを開く
$obj = PHPExcel_IOFactory::createReader('Excel2007');
$file = $obj->load('sample.xlsx');

foreach ($file->getSheetNames() as $i => $sheet_name) {
  // シート名を表示
  echo mb_convert_encoding($sheet_name, "SJIS", "UTF-8") . "\n";

  // セルの値を表示
  $file->setActiveSheetIndex(0);
  $sheet = $file->getActiveSheet();
  foreach ($sheet->getRowIterator() as $row) {
    foreach ($row->getCellIterator() as $cell) {
      echo mb_convert_encoding($cell->getCalculatedValue(), "SJIS", "UTF-8") . " ";
    }
    echo "\n";
  }
  echo "\n";
}
【補足】
getCalculatedValue()ではなく、getValue()で値を取得すると、計算式がそのまま取得される。

確認

実行すると、下記のように表示される。
f:id:yk5656:20150208212900j:image