20190929のPHPに関する記事は15件です。

Laravel5.8->6.0 へのバージョンアップ時につまずいた点

laravel/framework 6.0 にバージョンアップする際につまづいた点で、下記のコマンドを実行した際に下記のエラーとなりました。

composer update laravel/framework --with-dependencies
 composer update laravel/framework --with-dependencies
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Conclusion: remove fideloper/proxy 4.1.0
    - Conclusion: don't install fideloper/proxy 4.1.0
    - Conclusion: don't install laravel/framework v6.0.4
    - Conclusion: don't install laravel/framework v6.0.3
    - Conclusion: don't install laravel/framework v6.0.2
    - Conclusion: don't install laravel/framework v6.0.1
    - Installation request for fideloper/proxy (locked at 4.1.0, required as ^4.0) -> satisfiable by fideloper/proxy[4.1.0].
    - Conclusion: don't install laravel/framework v6.0.0
    - fideloper/proxy 4.1.0 requires illuminate/contracts ~5.0 -> satisfiable by laravel/framework[v5.8.17], illuminate/contracts[5.0.x-dev, 5.1.x-dev, 5.2.x-dev, 5.3.x-dev, 5.4.x-dev, 5.5.x-dev, 5.6.x-dev, 5.7.17, 5.7.18, 5.7.19, 5.7.x-dev, 5.8.x-dev, v5.0.0, v5.0.33, v5.1.1, v5.1.13, v5.1.16, v5.1.20, v5.1.22, v5.1.25, v5.1.28, v5.1.30, v5.1.31, v5.1.41, v5.1.8, v5.2.0, v5.2.19, v5.2.21, v5.2.24, v5.2.25, v5.2.26, v5.2.27, v5.2.28, v5.2.31, v5.2.32, v5.2.37, v5.2.43, v5.2.45, v5.2.6, v5.2.7, v5.3.0, v5.3.16, v5.3.23, v5.3.4, v5.4.0, v5.4.13, v5.4.17, v5.4.19, v5.4.27, v5.4.36, v5.4.9, v5.5.0, v5.5.16, v5.5.17, v5.5.2, v5.5.28, v5.5.33, v5.5.34, v5.5.35, v5.5.36, v5.5.37, v5.5.39, v5.5.40, v5.5.41, v5.5.43, v5.5.44, v5.6.0, v5.6.1, v5.6.10, v5.6.11, v5.6.12, v5.6.13, v5.6.14, v5.6.15, v5.6.16, v5.6.17, v5.6.19, v5.6.2, v5.6.20, v5.6.21, v5.6.22, v5.6.23, v5.6.24, v5.6.25, v5.6.26, v5.6.27, v5.6.28, v5.6.29, v5.6.3, v5.6.30, v5.6.31, v5.6.32, v5.6.33, v5.6.34, v5.6.35, v5.6.36, v5.6.37, v5.6.38, v5.6.39, v5.6.4, v5.6.5, v5.6.6, v5.6.7, v5.6.8, v5.6.9, v5.7.0, v5.7.1, v5.7.10, v5.7.11, v5.7.15, v5.7.2, v5.7.20, v5.7.21, v5.7.22, v5.7.23, v5.7.26, v5.7.27, v5.7.28, v5.7.3, v5.7.4, v5.7.5, v5.7.6, v5.7.7, v5.7.8, v5.7.9, v5.8.0, v5.8.11, v5.8.12, v5.8.14, v5.8.15, v5.8.17, v5.8.18, v5.8.19, v5.8.2, v5.8.20, v5.8.22, v5.8.24, v5.8.27, v5.8.28, v5.8.29, v5.8.3, v5.8.30, v5.8.31, v5.8.32, v5.8.33, v5.8.34, v5.8.35, v5.8.4, v5.8.8, v5.8.9].
    - Can only install one of: laravel/framework[6.x-dev, v5.8.17].
    - don't install illuminate/contracts 5.6.x-dev|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.0|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.1|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.10|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.11|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.12|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.13|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.14|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.15|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.16|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.17|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.19|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.2|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.20|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.21|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.22|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.23|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.24|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.25|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.26|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.27|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.28|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.29|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.3|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.30|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.31|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.32|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.33|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.34|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.35|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.36|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.37|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.38|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.39|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.4|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.5|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.6|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.7|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.8|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.6.9|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts 5.7.17|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts 5.7.18|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts 5.7.19|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts 5.7.x-dev|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.7.0|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.7.1|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.7.10|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.7.11|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.7.15|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.7.2|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.7.20|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.7.21|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.7.22|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.7.23|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.7.26|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.7.27|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.7.28|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.7.3|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.7.4|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.7.5|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.7.6|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.7.7|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.7.8|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.7.9|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts 5.8.x-dev|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.8.0|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.8.11|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.8.12|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.8.14|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.8.15|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.8.17|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.8.18|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.8.19|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.8.2|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.8.20|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.8.22|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.8.24|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.8.27|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.8.28|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.8.29|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.8.3|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.8.30|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.8.31|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.8.32|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.8.33|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.8.34|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.8.35|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.8.4|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.8.8|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.8.9|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts 5.0.x-dev|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts 5.1.x-dev|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts 5.2.x-dev|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts 5.3.x-dev|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts 5.4.x-dev|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts 5.5.x-dev|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.0.0|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.0.33|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.1.1|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.1.13|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.1.16|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.1.20|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.1.22|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.1.25|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.1.28|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.1.30|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.1.31|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.1.41|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.1.8|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.2.0|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.2.19|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.2.21|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.2.24|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.2.25|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.2.26|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.2.27|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.2.28|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.2.31|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.2.32|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.2.37|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.2.43|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.2.45|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.2.6|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.2.7|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.3.0|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.3.16|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.3.23|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.3.4|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.4.0|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.4.13|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.4.17|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.4.19|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.4.27|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.4.36|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.4.9|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.5.0|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.5.16|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.5.17|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.5.2|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.5.28|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.5.33|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.5.34|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.5.35|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.5.36|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.5.37|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.5.39|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.5.40|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.5.41|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.5.43|don't install laravel/framework 6.x-dev
    - don't install illuminate/contracts v5.5.44|don't install laravel/framework 6.x-dev
    - Installation request for laravel/framework ^6.0 -> satisfiable by laravel/framework[6.x-dev, v6.0.0, v6.0.1, v6.0.2, v6.0.3, v6.0.4].

その後の対応としては、 fideloper proxy 4.1.0 をcomposer.json から削除したり、laravel/frameworkをcomposer.jsonから削除したりしましたが同じエラーとなりました。(laravel/frameworkのエラー)

解決法

下記の操作で正常にlaravel6.0のインストールができました。
- 1.laravel/framework と、fideloper/proxy4.1.0 を composer.json から削除
- 2.composer update を実行

Laravel5.8 -> 6.0での変更点での修正した部分

ユニットテストで落ちていた部分に関して下記の変更を行いました。

以上です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CakePHP3 アソシエーションの設定済みテーブル/ドット記法/contain済みデータを表示させるまで(19/9/29)

■今回、画像投稿型の...

...あるテーマに沿ったサイトを
ポートフォリオとして制作中に確認できた、
今後に活かせる(未来の自分をハマらせない)ちょっとした内容ですが、
しっかり記録を残しておこうと思います。

■不明だったこと■
公式ドキュメントを参照にcontain、belongs to、hasmanyに
ついて学び、Model(テーブル)と、controllerに記述はしたものの、
「では、ctpファイル(表示させる部分)にはどのように記述すればいいの?」
ということがわからない状況が続いていました。

■解消できたこと■
特定のキーワード(Icesテーブル内の特定フィールド)を元に
「検索」された「記事」に「他ユーザが投稿した、投稿済みコメント」
を表示させ、さらに「投稿済みコメントの投稿ユーザ」の「ニックネーム」
を表示させ、さらにその「ニックネーム」をクリックすると、
そのユーザーの詳細情報に画面遷移させることができるようになりました。

■テーブル■
Users(ユーザ情報が入る:ここにニックネーム有り)
Ices(ブログ記事が入る)
Comments(ブログ記事に対して他ユーザがコメント時のデータが入る)

■環境■
AWS Cloud9:無料枠
MySQL:ver5.7.26
CakePHP:ver3.8.2
PHP:ver7.2.19

■結果■

ctpファイル内に下記のように記述することで、
上記の「解消できたこと」につながりました。

/src/Template/Ices/ranking.ctp
<?php foreach ($ices as $ice): ?>
     // // 一部省略  // //
<h3>ここからコメント</h3>
<?php if ($ice->comments): ?>
<p><?= h($ice->comments[0]->comment) ?></p>

  //↓このpタグ内がポイント//
<p>BY<?= $this->Html
->link( h($ice->comments[0]->user->nickname),
['controller' => 'Users', 
'action' => 'view', 
$ice->comments[0]->user['id']]) ?></p>
  //↑このpタグ内がポイント//


<?php else: ?>
<p>コメントはまだありません。</p>

<?php endif ?>

<?php endforeach; ?>

▽関係アリと思われる部分と解消方法▽

/src/Model/Table/CommentsTable.phpの、
foreignKeyがあったことで、Commentsテーブルに
紐づくUsersテーブルの情報が引っ張ってこれなかったようです。
そのモデル内の修正と、ctpファイルへの記述を変更し、
解決に至りました。

/src/Model/Table/UsersTable.php
parent::initialize($config);
        // // 一部省略  // //
        $this->hasMany('Comments',[
            'foreignKey' => 'user_id'
        ]);
        $this->hasMany('Ices', [
            'foreignKey' => 'user_id'
        ]);    
        $this->hasMany('Comments', [
            'foreignKey' => 'user_id'
        ]);
/src/Model/Table/IcesTable.php
public function initialize(array $config)
    {
          // // 一部省略  // //
        $this->belongsTo('Users', [
            'foreignKey' => 'user_id',
            'joinType' => 'INNER'
        ]);
        $this->hasMany('Comments', [
            'foreignKey' => 'ice_id'
        ]);
    }
/src/Model/Table/CommentsTable.php
public function initialize(array $config)
    {
          // // 一部省略  // //

        $this->belongsTo('Ices', [
            'foreignKey' => 'ice_id',
            'joinType' => 'INNER'
        ]);

        $this->belongsTo('Users', [
            //'foreignKey' => 'id',
            //↑これがあったから、ひっぱってこれなかった
            'joinType' => 'INNER'
        ]);
    }
/src/Controller/IcesController.php
public function search()
    {
        $ices = $this->Ices->find('all');
        $manufacturer = isset($this->request->query['manufacturer']) ? $this->request->query['manufacturer'] : null;
        $keyword = isset($this->request->query['keyword']) ? $this->request->query['keyword'] : null;

        if($manufacturer){
            $where = ['Ices.manufacturer' => $manufacturer];

            if ($keyword) {
            $where['OR']['Ices.ice_fraver LIKE'] = "%$keyword%";
            $where['OR']['Ices.simple_comment LIKE'] = "%$keyword%";
            }

            $ices = $this->Ices->find();


            $ices->where($where)
            //↓ここがポイント!!
            ->contain(['Comments.Users','Users'])
            //"Comments.Users"の意味は...
            //Icesテーブルに紐づく、
            //Commentsテーブルの情報と、
            //Commentsテーブルに紐づく、Usersテーブルの情報。
            //という意味で、
            //"Users"の部分は、
            //Icesテーブルに紐づく、
            //Userテーブルの情報を含む...
            //という意味になる。
            ->all();


            $this->set('manufacturer', $manufacturer);
            $this->set('keyword', $keyword);
            $this->set('ices', $this->paginate($ices));
            $this->render('ranking');
    }


    }

▽参考マニュアル(CakePHP公式ドキュメント)

https://book.cakephp.org/3.0/ja/orm/retrieving-data-and-resultsets.html
https://book.cakephp.org/3.0/ja/orm/associations.html

■最後に自分へ一言

debugをした結果、そこに取得希望のフィールドが表示されていなければ、
必ず取得の方法から見直すこと。
そうすれば、あとは表示方法を模索するだけ。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

VirtualBox上のCentOS7にdockerでpostgresql+PHP+Apache環境を構築

はじめに

かなり期間が空いてしましましたが、
ローカル環境にVirtualBoxを使用して開発環境を構築する作業の3回目です。
前々回はDBサーバ、
前回はWEBサーバを構築しました。
今回は、DBサーバ+WEBサーバ+PHPアプリの環境を構築します。
イメージとしては、DBの値を取得して、WEBサーバ上にPHPで表示します。

作業環境

  • MacOS X Yosemite 10.10.5

1.Docker Compose

今回は「Docker Compose」を使用して、複数のサーバを一度に操作する手順でまとめます。
インストール手順は、公式サイトの手順を参考に実施してください。

2.ディレクトリ構成

今回は以下の構成で各ファイルを用意しました。

docker-php-postgres
┣ docker-compose.yml   // Docker Composeの設定ファイル(3.参照)
┣ docker-file
┃ ┣ db
┃ ┃ ┣ Dockerfile   // DBサーバ用のDockerfile(4.参照)
┃ ┃ ┣ docker-entrypoint-initdb.d
┃ ┃   ┣ 01_createdb.sql   // DB作成用SQL
┃ ┣ web
┃   ┣ Dockerfile   // WEBサーバ用のDockerfile(6.参照)
┃   ┣ php.ini      // PHP設定ファイル(7.参照)
┣ volumes
  ┣ web
    ┣ html
      ┣ index.php   // PHPファイル(8.参照)

3. docker-compose.yml

version: '3'

services:

  web:
    build: ./docker-file/web/
    ports:
      - 8080:80
    volumes:
        - ./volumes/web/html/:/var/www/html:z   // :zを忘れないように。
    depends_on:
      - db

  db:
    build: ./docker-file/db/
    ports:
      - 5432:5432
    environment:
      - POSTGRES_USER=testuser
      - POSTGRES_PASSWORD=password

4. DBサーバ用Dockerfile

FROM postgres:9.3

RUN apt-get update

RUN apt-get install -y vim less

COPY ./docker-entrypoint-initdb.d/01_createdb.sql /docker-entrypoint-initdb.d/

EXPOSE 5432

5. DB作成用SQL

DB作成用SQLとテーブル作成SQLファイルをdocker-entrypoint-initdb.d配下に作成します。
今回は「01_createdb.sql」という名称で
testdbというDB、test_tableというテーブルを作成します。
test_tableテーブルには、idカラムとkeywordカラムを用意して、
適当な値を設定しておきます。

6. WEBサーバ用Dockerfile

# Apache モジュールが同梱された PHP コンテナイメージ
FROM php:apache

RUN apt-get update

RUN apt-get install -y vim less

# Postgres関連のPHPエクステンションをインストール
RUN set -ex apk --no-cache add postgresql-dev libpq-dev

RUN apt-get install -y libpq-dev && docker-php-ext-install pdo pdo_pgsql pgsql mbstring

# PHPの設定ファイルをコピー
COPY ./php.ini /usr/local/etc/php/

7. PHP設定ファイル

[Core]
display_errors = On
error_reporting = E_ALL
error_log = /var/log/apache2/error.log
log_errors = On

[Date]
date.timezone = 'Asia/Tokyo'

[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = auto
mbstring.http_input = auto
mbstring.http_output = auto
mbsting.encoding_translation = Off
mbstring.detect_order = auto

8. PHPファイル

DBのテーブル内容を取得して、出力する単純なPHPファイルです。

$conn = "host=docker-php-postgres_db_1 port=5432 dbname=testdb user=testuser password=password";
$link = pg_connect($conn);
if (!$link) {
    exit('接続失敗です。'.pg_last_error());
}

pg_set_client_encoding("sjis");

$result = pg_query('SELECT id, keyword FROM test_table');
if (!$result) {
    exit('クエリーが失敗しました。'.pg_last_error());
}

for ($i = 0 ; $i < pg_num_rows($result) ; $i++){
    $rows = pg_fetch_array($result, NULL, PGSQL_ASSOC);
    print('id='.$rows['id']);
    print(',keyword='.$rows['keyword'].'<br>');
}

$close_flag = pg_close($link);

if (!$close_flag){
    print('切断に失敗しました。<br>');
}

?>
</body>
</html>

9. コンテナ起動

3.〜8. のファイルが準備でき次第、以下のコマンドを実行します。
このコマンドはビルドまで行ってくれます。

$ docker-compose up -d

ビルドのみ行いたい場合は、以下のコマンドを実行します。

$ docker-compose build

コマンドを実行した後、コンテナが起動したかどうかを以下のコマンドで確認します。

$ docker-compose ps
root@localhost docker-php-postgres]# docker ps -a
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                    NAMES
f078f9167ad6        docker-php-postgres_web   "docker-php-entryp..."   41 seconds ago      Up 36 seconds       0.0.0.0:8080->80/tcp     docker-php-postgres_web_1
c51a280c6d44        docker-php-postgres_db    "docker-entrypoint..."   45 seconds ago      Up 41 seconds       0.0.0.0:5432->5432/tcp   docker-php-postgres_db_1

起動ができたら、ブラウザから起動したWEBサーバのindex.phpにアクセスしてみます。
アクセスして、テーブルの内容が表示されていたら、完了です。

http://【VirtualBox IPアドレス】:8080/index.php

スクリーンショット 2019-09-29 19.33.06.png

10. コンテナの停止

コンテナの停止は以下のコマンドを実行します。

$ docker-compose stop

これでDBサーバ+WEBサーバ+PHPアプリの環境を構築できました。
今回の学習したものをベースに、
dockerを使用した様々な環境構築を実施していきたいと思っています。

参考URL

https://www.key-p.com/blog/staff/archives/106755
https://docs.docker.com/compose/install/
https://qiita.com/uhooi/items/fb14d99d3323bd2eee9d
https://mizominton.hatenablog.jp/entry/docker-cakephp1.3
https://qiita.com/nagi244/items/e5de6fc062fdcc5004e9

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel5.8でブックマークアプリを作るチュートリアル(動画版)

Laravel5.8でブックマークアプリを作るチュートリアルを動画(Youtube)で作成しました。
いろいろ安定していない感ありますが、よろしかったらぜひ!

第1回 インストール&初期設定編

Laravelのインストールから初期設定までを行なっています。

第1回 インストール&初期設定編

第2回 アプリケーションのデモ

なぜか2回目のアプリの動作デモです。
最終的にはちょっと変わってしまいましたが。

第2回 アプリケーションのデモ

第3回 Router編

アプリケーションの入り口であるルーターについて。

第3回 Router編

第4回 データベース編

マイグレーションでデータベースを構築して、シーダーでダミーデータを入れるところまで。

第4回 データベース編

第5回 データベースのデータを表示しよう

登録したダミーデータからデータを取得して一覧ページを作成します。

第5回 データベースのデータを表示しよう

第6回 詳細ページの作成

データベースからID検索でレコードを取得して、詳細ページを作成します。
詳細ページ用のルーティングやモデルバイディングの解説もしてます。

第6回 詳細ページの作成

第7回 レコード追加機能の作成

データベースにレコードを新規登録する機能を作成します。

第7回 レコード追加機能の作成

第8回 レコード更新機能の作成

レコードの更新機能の作成と、ビューファイルを共通ファイルにしてインクルードする方法。

第8回 レコード更新機能の作成

第9回 レコードの削除とフラッシュメッセージ

レコードの削除機能とフラッシュメッセージを作成します。

第9回 レコードの削除とフラッシュメッセージ

第10回 入力フォームのチェック機能(バリデーション)

入力フォームのチェック(バリデーション)機能を作成します。

第10回 入力フォームのチェック機能(バリデーション)

第11回 ユーザー登録・認証機能の作成

ユーザー認証・登録機能を作成します。主にビューファイルの編集です。

第11回 ユーザー登録・認証機能の作成

第12回 タグCRUD(作成・読み込み・更新・削除)機能の作成

今までのおさらいも兼ねて、タグのCRUD機能の作成します。

第12回 タグCRUD(作成・読み込み・更新・削除)機能の作成

第13回 データベースのリレーション設定(ブックマークとタグの関連付け)

今までのおさらいも兼ねて、タグCRUD機能の作成します。

第13回 データベースのリレーション設定(ブックマークとタグの関連付け)

第14回 リレーション(タグ)の表示とデバッグツールについて

設定したリレーション(タグ)の表示とデバッグツール(Clockwork)を使用して、クエリの確認を行います。

第14回 リレーション(タグ)の表示とデバッグツールについて

ソースコードはこちら
https://github.com/k-ishiwata/BookmarkApp

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

XAMPPでPHPの環境構築をする方法!

どうも。Hiroyukiです!
本日は、初心に帰って環境構築のお話をします。

初心って言ってもプログラミング歴はまだまだ浅いボクなのですが(^^;)
ぜひ見て下さい!

プログラミング初学者に、立ちはだかる壁

「うしっ!! PHPでプログラミングをやるぞ!!!!」

となった時に初心者に立ちはだかる壁、
それが開発環境構築・・・。

「環境構築っすか? 手間だし、挫折しがちだし、苦手っす・・・」

と思う方もいらっしゃると思いますが、
この記事を見てサクッと終わらせちゃいましょう〜!

XAMPPのダウンロード

まず、下記のサイトから、各OS向けのXAMPP-VMをダウンロードして下さい。

XAMPP

https://www.apachefriends.org/jp/index.html

スクリーンショット 2019-09-29 15.05.16.png

ここでは、(ボクのPCがMacなのもあって)
「Mac OS」 向けの導入方法をご説明していきます。

Windowsユーザ向けの導入方法は、下記のサイトに詳しいので、こちらをご覧下さい!

XAMPPによるPHPのインストール(Windowsメイン)

https://www.sejuku.net/blog/29289

さて、ダウンロードが完了したら、ダウンロードファイルを展開して
XAMPPをアプリケーションフォルダへ移動させまーす

これで、インストールが無事完了。

XAMPPの使い方

コントロールパネルの

Generalタブから、XAMPPを起動させます。

「Start」ボタンを押すと、右上の赤丸が、緑色に変わると思います。

これで起動完了です!
スクリーンショット 2019-09-29 15.44.10.png

次に、

Servicesタブで、Apacheが立ち上がっているかどうかを確認します。

しばらく待てば自動で起動するはずですが、万一スタートされていないようでしたら

「Start」ボタンを押して起動して下さい!

スクリーンショット 2019-09-29 15.48.59.png

次に、

Volumesタブに移ります。

「Mout」ボタンを押すことで、仮想マシンのディレクトリを操作可能です。

「Mout」ボタン ⇨ 「Explore」ボタン の順で押しませう〜

スクリーンショット 2019-09-29 15.52.03.png

「Explore」ボタンを押しますと、XAMPPのディレクトリが開かれます!

下記を見ていただいたら分かるのですが、

lamppの「htdocs」がXAMPPのドキュメントルートとなりまして

開発する際は、この「htdocs」の中に開発ファイルを置いていく形です。

スクリーンショット 2019-09-29 16.00.23.png
これで、簡単ですが、操作方法の説明は終わりでーす。

PHPファイルを表示させてみよう!!

では、試しに
立ち上がったサーバ上にファイルを置いて、表示させてみましょ〜

早速ですが、下記のように適当なファイル(sample.php)を作り、

中身に「Hello World!」とでも書きます。

スクリーンショット 2019-09-29 16.07.45.png

そして、

sample.phpを、「htdocs」直下に置きます。

スクリーンショット 2019-09-29 16.12.26.png

先ほどの

XAMPPの Generalタブに戻り

「Go to Application」ボタンを押して下さい!

スクリーンショット 2019-09-29 16.15.07.png

すると、XAMPPのダッシュボードが表示されるのですが

URLの最後の部分に注目!!

スクリーンショット 2019-09-29 16.19.37.png

URL [192.168.●●.●/dashboard/]

となっていると思いますが、

最後の部分を、下記の通り、先ほどの表示させたいファイル名に変えて下さい。

URL [192.168.●●.●/sample.php/]

このように変更すると、、、

表示完了〜!

めでたしめでたしーーー!!

スクリーンショット 2019-09-29 16.30.45.png

無事ローカルで開発環境が構築されたのが分かると思います^^

ここまで説明してきて何ですが
MacではMAMPを利用して環境構築する方が多い様です。

また、そのやり方も含めて、

こういう基礎的な環境構築方法などを取り上げてご説明できればと思います。

では、Hiroyukiでした〜!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Google App EngineでWordPressを構築する

公式ページのアップデート版(非公式)です。
App Engine フレキシブル環境での WordPress のホスティング

作業手順

  1. GCPプロジェクト作成
  2. Cloud SQLインスタンス作成と設定
  3. WordPressプロジェクトの設定
  4. App Engine環境へのデプロイ

1. GCPプロジェクト作成

  1. GCPプロジェクトの課金が有効になっているか確認
  2. 必要なAPIが有効になっているか確認
  3. Cloud SDKをインストール
  4. サービスアカウントを作成
  5. PHPComposerをインストール
  6. Cloud SQLプロキシをダウンロード
  7. MySQLクライアントをインストール

2. Cloud SQLインスタンス作成と設定

  • Cloud SQLインスタンスを作成する
gcloud sql instances create [インスタンス名] \
    --activation-policy=ALWAYS \
    --tier=db-n1-standard-1
    --region=asia-northeast1
  • Cloud SQLプロキシを実行
./cloud_sql_proxy \
    -dir /tmp/cloudsql \
    -instances=[プロジェクトID]:asia-northeast1:[インスタンス名]=tcp:3306 \
    -credential_file=[サービスアカウントのJSONファイル]

以下のエラーが発生した場合は、ポート番号を変更してください。
listen tcp 127.0.0.1:3306: bind: address already in use

  • 新しいデータベースとユーザを作成
mysql -h 127.0.0.1 -u root --password=[パスワード]
mysql> create database [データベース名];
mysql> create user '[ユーザ名]'@'%' identified by '[パスワード]';
mysql> grant all on [データベース名].* to '[ユーザ名]'@'%';
mysql> exit

3. WordPressプロジェクトの設定

  • Githubからリポジトリをクローン
git clone https://github.com/GoogleCloudPlatform/php-docs-samples.git
  • サンプルディレクトリに移動(今回はフレキシブル環境の例です)
cd php-docs-samples/appengine/flexible/wordpress
  • 依存関係をインストール
composer install
  • ヘルパースクリプトを実行
php wordpress.php setup -n \
    --dir [WordPressのプロジェクト名] \
    --db_instance=[インスタンス名] \
    --db_name=[データベース名] \
    --db_user=[ユーザ名] \
    --project_id=[プロジェクトID] \
    --db_password=[パスワード] \
    --db_region=asia-northeast1

ヘルパースクリプトがwordpress/wp-config.phpに以下の内容を書き込みます。

if ($onGae) {
    / Production environment */
    define('DB_HOST', ':/cloudsql/[プロジェクトID]:asia-northeast1:[インスタンス名]');
    / The name of the database for WordPress /
    define('DB_NAME', '[データベース名]');
    / MySQL database username */
    define('DB_USER', '[ユーザ名]');
    / MySQL database password /
    define('DB_PASSWORD', '[パスワード]');
} else {
    / Local environment */
    define('DB_HOST', '127.0.0.1');
    / The name of the database for WordPress /
    define('DB_NAME', '[データベース名]');
    / MySQL database username */
    define('DB_USER', '[ユーザ名]');
    / MySQL database password /
    define('DB_PASSWORD', '[パスワード]');
}

App Engine環境へのデプロイ

  • WordPressプロジェクトへ移動
cd wordpress-project
  • デプロイを実行
gcloud app deploy -q \
    --promote --stop-previous-version app.yaml cron.yaml
  • サイトにアクセスして、表示を確認
gcloud app browse

Tips

GAE上のファイル、ディレクトリ権限を変更したい場合

  • app.yamlファイルで、skip_lockdown_document_rootをtrueにする
runtime_config:
  document_root: wordpress
  skip_lockdown_document_root: true

管理画面の言語を日本語に変更したい場合

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Google App Engine(GAE)でWordPressを構築する

公式ページのアップデート版(非公式)です。
App Engine フレキシブル環境での WordPress のホスティング

作業手順

  1. GCPプロジェクト作成
  2. Cloud SQLインスタンス作成と設定
  3. WordPressプロジェクトの設定
  4. App Engine環境へのデプロイ

1. GCPプロジェクト作成

  1. GCPプロジェクトの課金が有効になっているか確認
  2. 必要なAPIが有効になっているか確認
  3. Cloud SDKをインストール
  4. サービスアカウントを作成
  5. PHPComposerをインストール
  6. Cloud SQLプロキシをダウンロード
  7. MySQLクライアントをインストール

2. Cloud SQLインスタンス作成と設定

  • Cloud SQLインスタンスを作成する
gcloud sql instances create [インスタンス名] \
    --activation-policy=ALWAYS \
    --tier=db-n1-standard-1
    --region=asia-northeast1
  • Cloud SQLプロキシを実行
./cloud_sql_proxy \
    -dir /tmp/cloudsql \
    -instances=[プロジェクトID]:asia-northeast1:[インスタンス名]=tcp:3306 \
    -credential_file=[サービスアカウントのJSONファイル]

以下のエラーが発生した場合は、ポート番号を変更してください。
listen tcp 127.0.0.1:3306: bind: address already in use

  • 新しいデータベースとユーザを作成
mysql -h 127.0.0.1 -u root --password=[パスワード]
mysql> create database [データベース名];
mysql> create user '[ユーザ名]'@'%' identified by '[パスワード]';
mysql> grant all on [データベース名].* to '[ユーザ名]'@'%';
mysql> exit

3. WordPressプロジェクトの設定

  • Githubからリポジトリをクローン
git clone https://github.com/GoogleCloudPlatform/php-docs-samples.git
  • サンプルディレクトリに移動(今回はフレキシブル環境の例です)
cd php-docs-samples/appengine/flexible/wordpress
  • 依存関係をインストール
composer install
  • ヘルパースクリプトを実行
php wordpress.php setup -n \
    --dir [WordPressのプロジェクト名] \
    --db_instance=[インスタンス名] \
    --db_name=[データベース名] \
    --db_user=[ユーザ名] \
    --project_id=[プロジェクトID] \
    --db_password=[パスワード] \
    --db_region=asia-northeast1

ヘルパースクリプトがwordpress/wp-config.phpに以下の内容を書き込みます。

if ($onGae) {
    / Production environment */
    define('DB_HOST', ':/cloudsql/[プロジェクトID]:asia-northeast1:[インスタンス名]');
    / The name of the database for WordPress /
    define('DB_NAME', '[データベース名]');
    / MySQL database username */
    define('DB_USER', '[ユーザ名]');
    / MySQL database password /
    define('DB_PASSWORD', '[パスワード]');
} else {
    / Local environment */
    define('DB_HOST', '127.0.0.1');
    / The name of the database for WordPress /
    define('DB_NAME', '[データベース名]');
    / MySQL database username */
    define('DB_USER', '[ユーザ名]');
    / MySQL database password /
    define('DB_PASSWORD', '[パスワード]');
}

App Engine環境へのデプロイ

  • WordPressプロジェクトへ移動
cd wordpress-project
  • デプロイを実行
gcloud app deploy -q \
    --promote --stop-previous-version app.yaml cron.yaml
  • サイトにアクセスして、表示を確認
gcloud app browse

Tips

GAE上のファイル、ディレクトリ権限を変更したい場合

  • app.yamlファイルで、skip_lockdown_document_rootをtrueにする
runtime_config:
  document_root: wordpress
  skip_lockdown_document_root: true

管理画面の言語を日本語に変更したい場合

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

自分の務めてる会社の1次入社試験(過去問)

2019-09-29_1206.png

自分の務めてる会社の入社試験(過去問)です。

これぐらいのことは出来てもらわないと困るという事で出題したのですが
どうもこの問題難しいのか?
ここまで漕ぎ着けて採用された人はひとりしかいない。

大手の会社にはこんなの簡単だよという人は
たくさんいると思いますが、自分の務めてる会社は
どちらかと言えば零細企業です。
こういう問題出しても中々、解けない人が多くて
採用まで至らないのが現状です。

※今は募集していません。

■問題

郵便番号入力すると検索結果を表示するようにせよ。
また下記の条件を満たしていることとする。
1.サジェスト機能がある。
2.PHP言語を使用。
3.非同期処理。

※基本的な事を知ってれば、たぶん数時間もしないで完成かと思います。

単なるこれだけでも、中々出来る人が来ない。
これが零細企業地方の現状です。

次、誰が採用問題作るだろうか?...orz

https://zip358.com/tool/postal_code_search/

WIN_20190929_13_04_24_Pro.gif

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SlackBotに挑戦(2) - Request Varification

SlackBotをまじめに学ぶ(2回目)

はじめに

前回、Heroku上にウェブアプリケーションを構築し、Slackワークスペースからスラッシュコマンドを受け取るところまでやりました。インターネット上にSlackからのリクエストを受け付ける先を公開したわけですが、送信元がSlackに限られるわけではなく、悪意があれば誰でもリクエストを送ることができるので、怖いですね。
ということで、公開したAPIへのリクエストが、自分が作ったSlack Appから送られたものかを検証する方法を実装しておきます。

ここに英語で書いてあることを、PHPとLaravelでやっているだけです。
https://api.slack.com/docs/verifying-requests-from-slack

今回使う環境

  • Heroku
    • PHP 7.3
    • Laravel 6.0.3
    • Clear DB
  • Windows
    • PHP 7.2.11
    • Laravel 6.0.3
    • Maria DB Ver 15.1

前回どおり、基本的にはWindowsでの作業です。

やってみよう

検証方法は2つあります。1つ目は推奨されていないのでさらっと行きます

1. Verification Token

この方法は推奨されていません。
何もしないより良いかなと思いますが、in comming monthで完全になくなると言っているので危ないかもしれません。

Verification token deprecation
We'll continue allowing apps to use verification tokens for now. However, we will retire them completely in coming months. We strongly recommend switching to request signing as soon as possible.

Basic InformationにあるVerification Tokenの値をメモします。
image.png

スラッシュコマンドのパラメータの一つとして、Verification Tokenの値がそのまま渡されます。
image.png

自分で作ったアプリケーションは、Basic Informationに表示されているTokenの値と、リクエストで渡ってきたTokenの値が一致するかを調べるだけです。一致するときは、正しいSlackのサーバーからきたと見なすことになります。Verification Tokenの値を秘密にしておく必要があります。

2. Signing Secret

こちらが新しく推奨されているSigning Secretという方法です。

検証手順は以下のとおりです。

  1. Signing SecretをBasic Informationから調べる
  2. リクエストヘッダーのX-Slack-Request-Timestampを取得する
  3. リクエストボディを無加工で取得する
  4. Slackが決めたルールで文字列を結合する
  5. Signing Secretと4で作った文字列から、sha256のハッシュ値をとる
  6. リクエストヘッダーのX-Slack-Signatureで渡ってきた値と比較する
  7. 一致するときは正しいリクエストとみなす

これをLaravelで実装していきます。

Controller

まずは、新しいContoroller(VerificationController.php)を作り、verifyメソッドとして実装します。

app/VerificationController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Log;

class VerificationController extends Controller
{
    public function verify(Request $request){
        $timestamp = $request->header('x-slack-request-timestamp');
        $signature = $request->header('x-slack-signature');
        $requestBody = $request->getContent();
        $secret = config('app.slack.signing_secret');

        $sigBasestring = 'v0:' . $timestamp . ':' . $requestBody;
        $hash = 'v0=' . hash_hmac('sha256', $sigBasestring, $secret);

        $debug = ['Timestamp'=>$timestamp,
            'Body'=>$requestBody,
            'Sig'=>$sigBasestring,
            'Secret'=>substr_replace($secret,'*',5),
            'Hash'=>$hash,
            'Signature'=>$signature,];


        return response()->json($debug);
    }

}

特に解説は不要ですね。
取得した値と計算した結果をreturnするだけのものです。

route設定

作ったメソッドを/api/verify-testでアクセスできるように登録します。エンドポイントは、https://slalack-bot.herokuapp.com/api/verify-test になります。

routes/api.php
Route::any('/verify-test', 'VerificationController@verify');

config/.env設定

.envにSigning Secretの値を登録する。
HerokuのConfigにセットするのを忘れずに。

.env
SLACK_SIGNING_SECRET=70cad**********

Laravelのconfig経由で、Signing Secretが取れるように登録します。

config/app.php
    /*
    |--------------------------------------------------------------------------
    | Class Aliases
    |--------------------------------------------------------------------------
    |
    | This array of class aliases will be registered when this application
    | is started. However, feel free to register as many as you wish as
    | the aliases are "lazy" loaded so they don't hinder performance.
    |
    */

    'aliases' => [

        'App' => Illuminate\Support\Facades\App::class,
        //省略
    ],

    //ここ追加
    'slack' => ['signing_secret'=>env('SLACK_SIGNING_SECRET')],

];

Herokuにデプロイすると、以下のURLでアクセスできるようなります。
https://slalack-bot.herokuapp.com/api/verify-test

スラッシュコマンド登録

Slackから/verify-testで呼び出すコマンドを登録します。RequestURLは https://slalack-bot.herokuapp.com/api/verify-test に設定します。

image.png

動作確認

slackのメッセージボックスから/verify-testを呼びます。追加のメッセージは何でも構いません。
image.png

呼びかけに応じて、リプライが来ます。
image.png

だらだらとJSONがかえってきていますが、大事なのは最後の2つだけです。Hashが自分で計算して作った値、SignatureがSlackから送られてきた値です。両者が一致しているので実装方法に誤りはなさそうです。
一致しているので、このリクエストはSlackから送られてきた正規なリクエストとみなして良いということです。

"Hash":"v0=098ea4338850dc6004b89d24f2a2d06ac12f6f138121df9ad0a74bec8db32521"
"Signature":"v0=098ea4338850dc6004b89d24f2a2d06ac12f6f138121df9ad0a74bec8db32521"

LaravelのMiddleware化する

各コントローラのメソッドでverifyメソッドと同じことをするのは面倒なので、Laravelのmiddlewareに実装して自動適用するように変えてみます。

Middlewareクラスの生成

artisanコマンドでひな型を作ります。

php artisan make:middleware SlackRequestVerification
Middleware created successfully.

検証ロジックを実装

作られたひな形のhandleメソッドに検証ロジックを実装します。VerificationControllerに書いた処理をそのまま持ってくるだけです。

App\Http\Middleware\SlackRequestVerification
<?php

namespace App\Http\Middleware;

use Closure;
use Log;

class SlackRequestVerification
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $timestamp = $request->header('x-slack-request-timestamp');
        $signature = $request->header('x-slack-signature');
        $requestBody = $request->getContent();
        $secret = config('app.slack.signing_secret');

        $sigBasestring = 'v0:' . $timestamp . ':' . $requestBody;
        $hash = 'v0=' . hash_hmac('sha256', $sigBasestring, $secret);

        $debug = ['Timestamp'=>$timestamp,
            'Body'=>$requestBody,
            'Sig'=>$sigBasestring,
            'Secret'=>substr_replace($secret,'*',5),
            'Hash'=>$hash,
            'Signature'=>$signature,];

        \Log::debug($debug);

        //不一致なら500で終わり
        if( $hash !== $signature ){
            return response()->json([
                'ok'=>false,
                'error' => 'signature error',
            ], '500');
        }

        //念のため、verificationをした証拠を入れておく
        $verified = [
            'slack_signing_verification'=>true, 
            'slack_use_secret'=>substr_replace($secret,'*',5),
            'slack_verify_hash'=>$hash,
        ];
        $request->merge($verified);

        //次の処理へ
        return $next($request);
    }
}

Middlewareの登録

HttpのKernelに登録します。今回はSlackからのリクエストはすべて/api/*で受けるので、apiのmiddlewareグループに登録しました。

app/Http/Kernel.php
    /**
     * The application's route middleware groups.
     *
     * @var array
     */
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            //ここに追加
            \App\Http\Middleware\SlackRequestVerification::class,

            'throttle:60,1',
            'bindings',
        ],
    ];

ここまでの変更をHerokuにデプロイします。

動作確認

正常動作

前回作った/debugを呼び出ししてみます。
image.png

image.png

無事、middlewareを経由して処理されて、Verificationが正常に終わり、Controllerに処理が伝わりました。middlewareでrequestに追加した3つの値も確認できました。

エラー

ブラウザでGETのリクエストを送ってみると、エラーメッセージが受け取れます。
https://slalack-bot.herokuapp.com/api/debug

{"ok":false,"error":"signature error"}

まとめ

Slack Signing VerificationをLaravelアプリに実装しました。Slackのサーバーから正しく届いたメッセージであることを確認する方法を入れたので、安心感が増しました。

参考資料

https://qiita.com/girlie_mac/items/21fedcc6ce07aa44a670

https://api.slack.com/docs/verifying-requests-from-slack

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CentOS 7にPHP 7.2をインストール(IUS Community Project)

はじめに

IUS Community Projectを利用してCentOS7にPHP7.2をインストール
親記事:PHP EOLと各種インストール方法
参考:Usage - IUS

サポート

本手法で導入した場合、PHP: Supported Versions/PHP: Unsupported Branchesより、2020-11-30がEOLになると思われる。
それ以降に報告された脆弱性への対応は実施されない可能性がある。

LOG

インストール

# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

# yum install -y https://centos7.iuscommunity.org/ius-release.rpm
... 略

# yum install -y mod_php72u php72u-cli which
... 略

各種確認

# which php
/usr/bin/php

# php -v
PHP 7.2.22 (cli) (built: Aug 30 2019 15:12:58) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

# yum info mod_php72u
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: nrt.edge.kernel.org
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Installed Packages
Name        : mod_php72u
Arch        : x86_64
Version     : 7.2.22
Release     : 1.el7.ius
Size        : 10 M
Repo        : installed
From repo   : ius
Summary     : PHP module for the Apache HTTP Server
URL         : http://www.php.net/
License     : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA
Description : The mod_php72u package contains the module which adds support for the PHP
            : language to Apache HTTP Server.

# yum info php72u-cli
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: ftp.riken.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Installed Packages
Name        : php72u-cli
Arch        : x86_64
Version     : 7.2.22
Release     : 1.el7.ius
Size        : 15 M
Repo        : installed
From repo   : ius
Summary     : Command-line interface for PHP
URL         : http://www.php.net/
License     : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA and PostgreSQL
Description : The php-cli package contains the command-line interface
            : executing PHP scripts, /usr/bin/php, and the CGI interface.
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel Statsを使ったソースコードの分析

2019年9月1日にv2.0がリリースされました?

v2.0になってからこのパッケージの存在を知ったので、写経用に作成していたLaravelプロジェクトの更新を兼ねてインストールしてみました。

インストール条件

v2.0を使用する場合は次の条件を満たしている必要があります。

  • PHP 7.2以上
  • Laravel v5.8以上もしくはLumen v5.8以上

Lumenでも使用可能とのことですが、今回はLaravelでの使用方法を記述します。

インストール

次のコマンドを実行することでインストールできます。

$ composer require "wnx/laravel-stats" --dev

サービスプロバイダーの設定は自動で行われますが、手動で行う場合はconfig/app.phpに次のコードを追加できます。

'providers' => [
    // ...
    \Wnx\LaravelStats\StatsServiceProvider::class,
]

別途コンフィグファイルを作成する場合は以下のコマンドを実行することで作成されます。

$ php artisan vendor:publish --provider="Wnx\LaravelStats\StatsServiceProvider"

実行が完了すると以下のようなファイルがconfig/stats.phpとして作成されます。(以下のコードはコメントを書き換えています。)

<?php

return [

    /*
     * 出力対象のパス
     */
    'paths' => [
        base_path('app'),
        base_path('database'),
        base_path('tests'),
    ],

    /*
     * 出力対象外とするファイル・ディレクトリ
     */
    'exclude' => [
        base_path('tests/bootstrap.php'),
        // base_path('app/helpers.php'),
        // base_path('app/Services'),
    ],

    /*
     * 独自で出力対象を増やす場合はここに追加する。後述。
     */
    'custom_component_classifier' => [
        // \App\Classifiers\CustomerExportClassifier::class
    ],

    /*
     * 対象外とするルール。
     * デフォルトではvendorディレクトリ以下とコアクラスが対象外となっている。
     *
     * 以下の2ファイルがデフォルトで用意されている。
     * - \Wnx\LaravelStats\RejectionStrategies\RejectVendorClasses::class
     * - \Wnx\LaravelStats\RejectionStrategies\RejectInternalClasses::class
     *
     * 上記ファイルのルール以外にしたい場合は、`Wnx\LaravelStats\Contracts\RejectionStrategy`を実装したクラスを別途作成する必要がある。
     */
    'rejection_strategy' => \Wnx\LaravelStats\RejectionStrategies\RejectVendorClasses::class,

    /*
     * 対象外とする名前空間。
     * `Str::startsWith()`で対象外かを判別している。
     *
     * `Illuminate`を指定することでIlluminate全体を対象外に出来る。
     * また`Illuminate\Support`のように一部を対象外にすることも可能。
     */
    'ignored_namespaces' => [
        'Wnx\LaravelStats',
        'Illuminate',
        'Symfony',
    ],

];

使い方

artisanコマンドで実行することができます。

$ php artisan stats

以下の画像のような出力結果になります。

laravel-stats.png

オプション

オプション 説明
--json json形式で出力
--components[=COMPONENTS] 出力対象を指定して出力
-h, --help ヘルプの表示
-q, --quiet 結果を出力しない
-V, --version バージョンの表示
--ansi ANSIで出力
--no-ansi ANSIで出力しない
-n, --no-interaction 対話形式にしない
--env[=ENV] 実行環境を指定して出力
-v, -vv, -vvv, --verbose 出力メッセージを詳細にする。

-v, -vv, -vvvを実行してみましたが、私が実行した環境では出力結果が変わりませんでした?

-v, -vv, -vvvについては下記がヘルプに記載されています。

Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

出力の分類方法

Laravel Statsでは以下の条件で分類しています。

分類 条件
Controller ルーティングに登録されている。php artisan route:listに表示されるコントローラ
Model Illuminate\Database\Eloquent\Modelが継承されているクラス
Command Illuminate\Console\Commandが継承されているクラス
Rule Illuminate\Contracts\Validation\Ruleが継承されているクラス
Policy AuthServiceProviderに登録されているポリシー
Middleware App\Http\Kernelに登録されているミドルウェア
Event Illuminate\Foundation\Events\Dispatchableトレイトを使用しているクラス
Event Listener EventServiceProviderに登録されているクラス
Mail Illuminate\Mail\Mailableが継承されているクラス
Notification Illuminate\Notifications\Notificationが継承されているクラス
Nova Action Laravel\Nova\Actions\Actionが継承されているクラス
Nova Filter Laravel\Nova\Filters\Filterが継承されているクラス
Nova Lens Laravel\Nova\Lenses\Lensが継承されているクラス
Nova Resource Laravel\Nova\Resourceが継承されているクラス
Job Illuminate\Foundation\Bus\Dispatchableトレイトを使用しているクラス
Migration Illuminate\Database\Migrations\Migrationが継承されているクラス
Request Illuminate\Foundation\Http\FormRequestが継承されているクラス
Resource Illuminate\Http\Resources\Json\Resource, Illuminate\Http\Resources\Json\JsonResourceまたはIlluminate\Http\Resources\Json\ResourceCollectionが継承されているクラス
Seeder Illuminate\Database\Seederが継承されているクラス
ServiceProvider Illuminate\Support\ServiceProviderが継承されているクラス
Dusk Tests Laravel\Dusk\TestCaseが継承されているクラス
BrowserKit Test Laravel\BrowserKitTesting\TestCaseが継承されているクラス
PHPUnit Test PHPUnit\Framework\TestCaseが継承されているクラス

出力分類の追加

プロジェクト毎に作成しているファイルを分析対象にする場合は、Wnx\LaravelStats\Contracts\Classifierを実装したクラスを作成することで分析対象とすることができます。

例としてapp/Classifiers/RepositoryClassifier.phpを作成すると以下のようなファイルになります。

<?php

namespace App\Classifiers;

use Wnx\LaravelStats\ReflectionClass;
use Wnx\LaravelStats\Contracts\Classifier;

class RepositoryClassifier implements Classifier
{
    /**
     * 出力時の分類名
     * この場合はRepositoriesで表示される
     */
    public function name(): string
    {
        return 'Repositories';
    }

    /**
     * 出力対象とする条件
     */
    public function satisfies(ReflectionClass $class): bool
    {
        return $class->isSubclassOf(\App\Repositories\BaseRepository::class);
    }

    /**
     * Code LLoCに行数を含めるか
     */
    public function countsTowardsApplicationCode(): bool
    {
        return true;
    }

    /**
     * Test LLoCに行数を含めるか
     */
    public function countsTowardsTests(): bool
    {
        return true;
    }
}

作成したファイルをconfig/stats.phpcustom_component_classifierに追加することで出力対象が追加されます。

<?php
    ...
    'custom_component_classifier' => [
        \App\Classifiers\RepositoryClassifier::class
    ],
    ...

あとがき

このパッケージをインストールすることでファイルごとの行数やメソッド数、クラス数を分析することでどこが複雑になっているかを手軽に調べることができるようになると思います。

Laravel StatsとPHP Insightsを併せて利用することでよりプロジェクトのコード分析が捗ると思うので一度使用してみてはいかがでしょうか。

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【CakePHP 2.x】 テーブルにカラムを追加しても反映されない

経緯

先日、CakePHPで構成されるWebアプリケーションに新たにデータ項目が追加されることになりました。そこでデータベースのテーブルにカラムを新規に追加しました。しかしコントローラーでモデルを参照しても、追加したカラムのデータを一向に読み取ることができず、ソースコードを何度も見返しても原因がわかりませんでした。

キャッシュファイルが原因

CakePHPのキャッシングによって、次回以降の重いクエリなどのリソースの読み込みにかかる時間を短縮できます。公式のドキュメントによると、Cacheクラスを使用することでキャッシュを利用することができ、以下にある組み込みキャッシュエンジンを使用できるそうです。

  • FileCache
  • ApcCache
  • Wincache
  • XcacheEngine
  • emcacheEngine
  • MemcachedEngine

2.3以降ではFileCacheがデフォルトのキャッシュエンジンに設定されており、特定のディレクトリにキャッシュファイルが生成されます。今回のケースでは、app/tmp/cache/modelsに該当のモデルのキャッシュファイルが存在しました。テーブルにカラムを追加した後も、キャッシュファイル内の古い情報を参照し続けたことが原因になります。

ちなみにキャッシュの設定はapp/Config/core.phpで行うことができます。

core.php
Cache::config('default', array(
    'engine' => 'File',
    'duration' => 3600,
    'path' => CACHE,
    'prefix' => 'cake_'
));

参考

公式ドキュメント:キャッシュ
https://book.cakephp.org/2.0/ja/core-libraries/caching.html

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Google Authenticator のブラウザ版を作ってみた

はじめに

多要素認証(MFA)に使われる Google AuthenticatorMicrosoft Authenticator は、モバイル端末で使えるソフトウェアトークンだ。
ソフトウェアトークンとはワンタイムパスワード(使い捨てパスワード)を表示するアプリのことで、2段階認証アプリとも呼ばれる。
auth.png
今回たまたま、2段階認証アプリのブラウザ動作版をサクっと作る機会があったので、その実装方法を解説する。

例えば・・・従業員アカウントの秘密鍵(QRコードのotpauth URIにあるsecret)を情報システム部門で管理し、秘密鍵からワンタイムパスワードを表示する社内イントラのサイトを作れば、社内からしかログインできないシステムを容易に構築できるという寸法だ。

ワンタイムパスワードの計算方法

GoogleやMicrosoftの2段階認証アプリでは、次のワンタイムパスワード(以下OTPと略す)に対応している。

TOTPの計算方法(アルゴリズム)はRFCで公開されているから仕様書を読めば誰でも実装できる。RFC6238ではJavaの実装例も載っているので、Javaが読めれば他のプログラミング言語に移植するのも容易だろう。
TOTPは一定時間ごとに変化するHOTP(RFC4226)であり、ハッシュアルゴリズムにHMAC-SHA-1を使っているからRFC2404の実装でもある。

TOTPの仕組みはシンプルで、【サーバとクライアントで共有する秘密鍵】と【現在時刻(UNIX Time)をtime step(デフォルト30秒)で除したカウンター値】をSHA1でハッシュし、クライアントとサーバで一致するか確認しているだけだ。

ということで、秘密鍵から6桁のOTPを求めるコードをPHPで書くと、次のようになる。

PHP
function secret2otp($secret) {
  // 秘密鍵はBase32文字列で来るのでデコード
  $n = $bs = 0;
  $seed = '';
  for ($i = 0; $i < strlen($secret); $i++) {
    $n <<= 5;
    $n += stripos('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567', $secret[$i]);
    $bs = ($bs + 5) % 8;
    @$seed .= $bs < 5 ? chr(($n & (255 << $bs)) >> $bs) : null;
  }
  // UNIX Timeをtime stepで除したカウンタ値と鍵を合わせ、SHA1でハッシュ
  $hash = hash_hmac('sha1', str_pad(pack('N', intval(time() / 30)), 8, "\x00", STR_PAD_LEFT), $seed, false);
  // 下6桁を返す
  return sprintf('%06u', (hexdec(substr($hash, hexdec($hash[39]) * 2, 8)) & 0x7fffffff) % 1000000);
}

PHPにはBase32をデコードする関数は無いので、160ビット(32文字)の秘密鍵を最初にデコードする処理があるぶん長くなっているが、実処理がシンプルなのはお分かりいただけると思う。

ブラウザで動かすのならJavaScriptで書く方法もあるが、秘密鍵をクライアント側に渡さないで済む方法を思いつかなかったので、サーバ側で処理することにした。

実装方法

では、ブラウザで動かすための実装について具体的に解説していこう。
デモを用意したので、まずは見てもらいたい。もちろん設定された秘密鍵は適当である。
http://demo.mindwood.jp/WebAuthenticator.php?uid=example
image.png

IDから秘密鍵を求める

アカウントに相当するIDはGETパラメータで受け取ることにした。つまり、ID(デモでは "example")はURLに含まれる。
秘密鍵をハードコーディングしているが、実際には、CSVファイルやRDB、LDAP等のディレクトリサービスから秘密鍵を取得するのが現実的だろう。

PHP
$uid=$_GET['uid'];
if($uid=='example') $sec='MINDWOOD2QIITA3SECRETKEY4DEMO567';  // 秘密鍵(もちろん架空)
if($uid=='xxxxxxx') $sec='AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';
if(is_null($sec)) {
    header('HTTP/1.1 404 Not Found');
    exit;
}
$title="$uid のワンタイムパスワード";  // タイトルを設定

未知のIDなら404 Not Foundをブラウザに返す。

なお、Apacheのmod_rewriteモジュールが許可された環境なら、パラメータ指定の動的なURLを、静的なURLにマッピングできる。

動的URL(パラメータ渡し)
http://example.com/WebAuthenticator.php?uid=example
静的URL(ディレクトリ渡し)
http://example.com/WebAuthenticator/example

参考までにmod_rewriteのApache定義例を示す。htaccessAliasを使っているため環境に応じて修正を要する。

/var/www/html/auth/.htaccess
RewriteEngine on
RewriteBase /WebAuthenticator
RewriteRule ^([0-9A-Za-z]+)$ WebAuthenticator.php?uid=$1
/etc/httpd/conf.d/auth.conf
Alias /WebAuthenticator /var/www/html/auth/
<Directory "/var/www/html/auth">
    Options -Indexes
    AllowOverride All
    Require all granted
</Directory>

HTMLコード

HTMLも至ってシンプルである。PHPタグで、冒頭の関数からOTPを算出し表示しているだけだ。

HTML
<body>
    <h1><?php echo $title; ?></h1>
    <div id="code">
        <span>
            <?php echo secret2otp($sec); ?><!-- OTPを表示 -->
        </span>
    </div>
</body>

以上で完成としても良いのだが、少し味気ないので、jQueryで肉付けする。

残り時間を表示させてみよう

OTPは30秒ごとに更新される。つまり使用期限がある。
30秒経つとOTPは変わってしまうため、ソフトウェアトークン同様、残り時間を画面に表示してみる。
ここでは、進捗度を表すサークルバー(プログレスサークル)のjQuery実装、jquery-circle-progressで飾る。

まず、プログレスサークルの表示エリアをDIVタグで確保する。

HTML
<div id="circle">
    <strong></strong>
</div>

setIntervalで1秒ごとに残り時間を更新する。

JavaScript
setInterval(function() {
    var now = new Date();
    var left = 30 - (now.getSeconds() % 30);  // 秒を30で割った余りを残り時間とする
    $('#code span').css('color', left < 6 ? 'red':'green');  // 残り5秒以下なら赤くする
    $('#circle strong').show();
    $('#circle strong').fadeOut(900);  // 文字をふわっと表示させるアニメーション効果
    $('#circle strong').text(left);
    $('#circle').circleProgress({  // ここの書き方は公式ドキュメントを参照
        startAngle: -1.55,
        reverse: true,
        value: left / 30,
        animationStartValue: (1 + left) / 30,
        size: 100,
        thickness: 16,
        fill: { gradient: ['#0681c4', '#07c6c1'] }
    });
    if (left == 30) {
        location.reload();
    }
}, 1000);

NTPで時刻同期している前提だが、もしWebサーバとクライアントの間でタイムラグがあるなら次のように調整すると良い。

JavaScript
now.setSeconds(now.getSeconds() - 3);  // 3秒ずらす

なお、プログレスサークルを使って、サーバ側の進捗をリアルタイムに表示させる方法については、別記事に拙稿を書いているので興味のある人は参照して欲しい。
:point_right_tone2: プログレスサークルをLaravelの非同期処理でリアルタイムに表示

OTPをコピペできるようにしよう

クリップボードにOTPをコピーできると便利なので、コピーボタンを置いておこう。

HTML
<div id="copy">
    <button>COPY</button>
</div>

コピーボタンがクリックされたときの挙動を書く。
document.execCommand('copy') で現在選択されている文字をコピーできる。
コピーされたときにダイアログで通知するのはウザいのでCSSで軽くアニメーションするだけに留めている。

JavaScript
$('#copy').on('click', function() {
    var clipboard = $('<textarea></textarea>');
    clipboard.addClass('clipboard');
    clipboard.html($('#code span').html().trim());
    $(this).append(clipboard);
    clipboard.select();  // 選択させる
    document.execCommand('copy');  // 現在選択している部分をコピー
    clipboard.remove();
    // イベント発火をユーザーに分かり易くするためアニメーション効果を入れる
    $('#code').addClass('animated rubberBand').one('animationend', function () {
        $('#code').removeClass('animated rubberBand');
    });
});

完成版

完成したソースコードはGistに置いた。
https://gist.github.com/mindwood2/5ad399b33a03c0cc47c1e7ef57194cd9

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CentOS 7にPHP 7.1をインストール(IUS Community Project)

はじめに

IUS Community Projectを利用してCentOS7にPHP7.1をインストール
親記事:PHP EOLと各種インストール方法
参考:Usage - IUS

サポート

本手法で導入した場合、PHP: Supported Versions/PHP: Unsupported Branchesより、2019-12-01がEOLになると思われる。
それ以降に報告された脆弱性への対応は実施されない可能性がある。

LOG

インストール

# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

# yum install -y https://centos7.iuscommunity.org/ius-release.rpm
... 略

# yum install -y mod_php71u php71u-cli which
... 略

各種確認

# which php
/usr/bin/php

# php -v
PHP 7.1.32 (cli) (built: Aug 30 2019 15:31:43) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

# yum info mod_php71u
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: ftp.riken.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Installed Packages
Name        : mod_php71u
Arch        : x86_64
Version     : 7.1.32
Release     : 1.el7.ius
Size        : 9.2 M
Repo        : installed
From repo   : ius
Summary     : PHP module for the Apache HTTP Server
URL         : http://www.php.net/
License     : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA
Description : The mod_php package contains the module which adds support for the PHP language
            : to Apache HTTP Server.

# yum info php71u-cli
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: nrt.edge.kernel.org
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Installed Packages
Name        : php71u-cli
Arch        : x86_64
Version     : 7.1.32
Release     : 1.el7.ius
Size        : 14 M
Repo        : installed
From repo   : ius
Summary     : Command-line interface for PHP
URL         : http://www.php.net/
License     : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA and PostgreSQL
Description : The php-cli package contains the command-line interface
            : executing PHP scripts, /usr/bin/php, and the CGI interface.
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CentOS 6にPHP 7.1をインストール(IUS Community Project)

はじめに

IUS Community Projectを利用してCentOS6にPHP7.1をインストール
親記事:PHP EOLと各種インストール方法
参考:Usage - IUS

サポート

本手法で導入した場合、PHP: Supported Versions/PHP: Unsupported Branchesより、2019-12-01がEOLになると思われる。
それ以降に報告された脆弱性への対応は実施されない可能性がある。

LOG

インストール

# cat /etc/redhat-release
CentOS release 6.10 (Final)

# yum install -y https://centos6.iuscommunity.org/ius-release.rpm
... 略

# yum install -y mod_php71u php71u-cli
... 略

各種確認

# which php
/usr/bin/php

# php -v
PHP 7.1.32 (cli) (built: Aug 30 2019 15:13:15) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

# yum info mod_php71u
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * epel: nrt.edge.kernel.org
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
Installed Packages
Name        : mod_php71u
Arch        : x86_64
Version     : 7.1.32
Release     : 1.el6.ius
Size        : 9.1 M
Repo        : installed
From repo   : ius
Summary     : PHP module for the Apache HTTP Server
URL         : http://www.php.net/
License     : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA
Description : The mod_php package contains the module which adds support for the PHP language
            : to Apache HTTP Server.

# yum info php71u-cli
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * epel: nrt.edge.kernel.org
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
Installed Packages
Name        : php71u-cli
Arch        : x86_64
Version     : 7.1.32
Release     : 1.el6.ius
Size        : 12 M
Repo        : installed
From repo   : ius
Summary     : Command-line interface for PHP
URL         : http://www.php.net/
License     : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA and PostgreSQL
Description : The php-cli package contains the command-line interface
            : executing PHP scripts, /usr/bin/php, and the CGI interface.
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む