20200228のPHPに関する記事は11件です。

Laravelの外部キー制約でハマった話

はじめに

  1. Laravel初心者につき、お手柔らかに。
  2. 自分がハマってしまったので備忘録として。
  3. 「間違ってる!」、「○○したほうが良い!」みたいなことは教えてください。

ハマったこと

マイグレーションファイルを作成中のこと。外部制約キーを記述し、いざ$ php artisan migrateをすると、SQLSTATE[HY000]: General errorのエラーが。
参照元のテーブルや型の部分で間違いがあるのかと思い何度も確認したが間違いはなさそう。

原因

結論から述べると、マイグレーションファイルの順番(作成の順番)がまずかったようです。
最初のマイグレーションファイルがこれ↓
スクリーンショット 2020-02-28 17.12.51.png

issuesからcategoriesを参照したかったのにこの順番になっていたので、マイグレーションの際にエラーが出ていたようです。

コマンドから生成されるマイグレーションファイルはYYYY_MM_DD_hhmiss_create_テーブル名s_table.phpのような名前になっているので頭の日付の部分をいじって順番を変えて上げると解決します。こんな感じ↓
スクリーンショット 2020-02-28 17.12.28.png

前述したように、issuesからcategoriesを参照したいので、先にcategoriesをもってきます。
そうして$ php artisan migrate:refreshをするとうまくいきました。

まとめ

とても初歩的なところだと思いますが、Laravel初心者の僕は引っかかってしまったので参考までに。
アドバイス・ご指摘など有りましたらよろしくおねがいします!

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

初めてのWEBアプリ作成(1)

はじめに

 初めまして、RHEMS技術研究室所属の白瀬です。
今回は初めてWEBアプリ作成としてTrello風ToDoリストを作成するまでの工程を投稿していこうと思います。間違った点がありましたらご指摘いただけると嬉しいです。
環境はmacのdocker,iTerms2を使用しています。

コンテナ構築

 nginx・PHP・MYSQLのコンテナの構築をdockerで行いました。!
今回はnginxとPHPの連携させずに作って行きます。
(無題).png

全体のディレクトリ

├── docker-compose.yml
├── nginx
│   └── nginx.conf
├── php
│   ├── Dockerfile
│   └── php.ini
├── mysql
│   └── data
└── www
    └── html
        └── index.php

コマンド

docker-compose.yml

version: '3'
services:
  nginx:
    image: nginx:latest
    ports:
      - 8080:80
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
      - ./www/html:/var/www/html
    depends_on:
      - php

  php:
    build: ./php
    volumes:
      - ./www/html:/var/www/html
    depends_on:
      - db

  db:
    image: mysql:5.7
    ports:
      - 13306:3306
    volumes:
      - ./mysql/data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: secret


nginx.conf

server {
    listen 80;
    server_name _;

    root  /var/www/html;
    index index.php index.html;

    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;    
        fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include       fastcgi_params;
    }
}

Dockerfile

FROM php:7.2-fpm
COPY php.ini /usr/local/etc/php/

php.ini

date.timezone = "Asia/Tokyo"

index.php

<h1>Hello WORLD</h1>

すべて書き終えた後docker-compose.ymlがあるディレクトリまで移動し下記のコマンドを実行

docker-compose up -d

実行し終えたらlocalホスト(http://localhost:8080/)に接続して画像のようになりました。
スクリーンショット 2020-02-28 16.44.01.png
残りはこれをToDoリストように書き換えていくだけだと思っています。

あとがき

自分がWEBアプリを作ってみてくれ言われ何をしたらいいか分からずdocker trello 作成などといった検索をかけていましたが的はずれなことをしていました。
誰でもはじめはわからないことばかりなので皆さんも人に聞きましょう。
自分は4日ほど悩んでました…

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

isset について

issetを使う機会が多かったのでメモを残しておきます。

issetとは

変数にnull以外の値がセットされているかどうか検証する。

まず、3つの変数を初期化しておく。

qiita.php
$a = 'a';
$b = null;
$c = ['aa'=>'a', 'bb'=>null];

以下の状態でNoticeエラーが発生するのはどれか。

qiita.php
echo $a."\n"; //a
echo $b."\n";//出力なし
echo $d."\n";//Noticeエラー
echo $c['aa']."\n";//a
echo $c['bb']."\n";//出力なし
echo $c['dd']."\n";//Noticeエラー

変数d,c['dd']は初期化されていないので参照した瞬間にNoticeエラーになる。

以下の関数を定義

qiita.php
function echoBool($bl){
  if($bl) echo 'YES';
  else echo 'NO';
}

isset()をechoBoolした結果

qiita.php
echoBool(isset($a)); //YES
echoBool(isset($b)); //NO
echoBool(isset($c)); //YES
echoBool(isset($d); //NO    *
echoBool(isset($c['aa'])); //YES
echoBool(isset($c['bb'])); //NO
echoBool(isset($c['dd'])); //NO  *

*の場合もNoticeエラーは発生しない。
issetの特性上、初期化していない変数を参照した時もNoticeエラーが発生しない。

この特性を使って、問い合わせフォームなどのバリデーションチェック実装時などに、「初期化されているか分からない変数」の中身を参照したいときに利用する。

何かご指摘ありましたら遠慮なくコメント下さい。

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

PHP

Now Writing...

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

WordPressが嫌で自作CMSに乗り換えたらいい感じになった、という話

今まで技術ブログをWordPressで運用していましたが、WordPressが嫌で自作CMSに乗り換えたら良い感じになったので、今回やったことを紹介します。

どんな自作CMSを作ったのか

自作CMSで一番やりたかったのは、Markdownでシンプルに記事投稿ができるようになること。
無駄なボタンやオプションを剥ぎ落として、とにかく記事執筆に専念できるようにしています。

スクリーンショット 2020-02-28 11.57.27.png

それとブログ部分については、WordPressではやれなかった色々な施策を行い、「PageSpeed Insights」で高スコアが出るようになりました。

(WordPress時のスコアをスクショしていなかった。。。)

スクリーンショット 2020-02-28 11.50.57.png

スクリーンショット 2020-02-28 11.51.37.png

実際に自作CMSで運用している「MooLog」を見ると分かりますが、気持ちよくページ遷移ができます。

WordPressで不満だったこと

もちろん、WordPressはユーザー数が多いこともあり、テーマやプラグインが豊富、レンタルサーバーでサポートされている等、WordPressを使う環境が揃っているのが魅力です。

ただ、WordPressで70点のブログを作るのは簡単にできるのですが、自分にとって90点、100点のブログ環境を作ろうとなると急にきつくなり、「別にWordPressである必要なくない?」となる欠点があります。

当初は自分でWordPressのプラグインやテーマを作ろうとしましたが、そのためにもWordPress独自のアーキテクチャだったりDB周りだったりを理解する必要があり、すごく面倒臭くなってしまいました。

どのように自作CMSを作ったのか

自作CMSで運用している環境は下記の通りです。

  • PHP 7.2.28
  • CodeIgniter 3.1.6
  • MySQL 14.14
  • Apache 2.4.6
  • CentOS 7 (vultrというVPSで運用)
  • git 1.8.3.1 (本番にリポジトリ作って自動デプロイ)

自作CMSは0から作るのではなく、CodeIgniter3というFWをベースに作りました。

CodeIgniter Web Framework

CodeIgniterは最近流行のLaravelほどがっつりと機能を持ったFWではないですが、高速に動くのに定評があるFWです。

ただ、デフォルトだとunittestとmigration周りの機能が弱いので、以下のオープンソースを利用して、テストをしやすくしたり、cliでmigrationできるようにしました。

kenjis/ci-phpunit-test: An easier way to use PHPUnit with CodeIgniter 3.x.

kenjis/codeigniter-cli: Cli for CodeIgniter 3.0

フロントエンドは、turbolinksを使って高速化を測っており、他にもwebpack4でjsファイルを圧縮したり、css,jsファイルを1つにまとめてリクエスト数を減らしています。

また、CMS部分ではjQueryをがっつり使っていますが、ブログ部分では素のJavaScriptで書いています。

自作CMSを運用してわかった欠点

とは言っても自作CMSにも欠点があり、当初は「Markdownが気持ちよく書ける、シンプルなCMS」を目指していたのに、いつの間にか「この機能も付けたそう」みたいなのが増えて、問題点とやるべきことがどんどん増えています。

例えば、「今月書く予定の記事TODOリスト」を作ろうとしたり、「テンプレート機能」を付け足そうとしたり、細かいバグの修正をしたり、結構時間が取られてしまいます。

今現在も修正を続けているのですが、徐々にWordPressっぽくなっており、「最初からWordPressで良かったのでは?」と思わなくもないです。

自作CMSを運用してわかったWordPressの良い点

自作CMSを運用して、改めてWordPressの偉大さを思い知らされました。(人間は何かを失った時に初めてその物の大切さに気づく、みたいな)

自作CMS+VPSで運用するとなると、基本的にCMSを自作する以外にもやることが多く、

  • PHPとかMySQLとかインストールする
  • サーバー周りのセキュリティの設定をする(fail2banとか)
  • ドメイン周りの設定(sslとか)
  • デプロイ周りの設定
  • Apacheのパーミッションとか設定とか

などのように色々やらないといけません。一方、WordPress+レンタルサーバーだと、PHPでHello Worldできなくてもボタン1つ押すだけで全部やってくれると言う凄まじい環境が揃っています。

最近はWordPressをdisってる意見が挙がっており、逆に静的サイトageが多いですが、今回で色々勉強になりました。

まとめ

自作CMSはいいぞ

WordPressもいいぞ

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

laravel6のbladeファイル内で変数・配列を新規作成する。

bladeファイル内で変数・配列を新規作成する。

{{-- laravel6標準ではphpタグでしかできない。(blade構文を拡張して追加・作成する方法はある) --}}
<?php    $v[0]='hogehoge';    ?> 

{{-- 配列の場合は、値の確認もphpタグで --}}
<?php    dump( $v );    ?> 


{{-- 配列の場合下記ではエラーになる。恐らく後からblade内で追加した配列だからだと思われる。 --}}
{{ dump( $v ) }}

{{--しかし下記はエラーにならない --}}
{{ dump( $v[0] ) }}

参考情報

なぜ記事を書いたか

laravel6で配列をbladeで新規作成して確認する方法がまとまった記事が見つけられなかったから。
特に確認方法でハマりやすく入門時はできないと勘違いしていた。

その他

laravel入門にはこの記事おすすめですよ!
Laravel 5.7で基本的なCRUDを作る - Qiita
laravel6でもほとんどそのまま動きました。

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

PHPの有名どころライブラリ群メモ

PHPの有名どころライブラリ群メモ

PSR実装

PSR-3 Logger

  • monolog
    • 最古のPSR-3実装。とりあえずこれを使っておけば問題ない
    • Symfony2で採用された

PSR-7 Http Message

PSR-11 Container Interface

PSR-15 HTTP Handlers

PSR-17 HTTP Factories

PSR-7,15,17 + PSR-11(Container Interface) を使うアーキテクチャなら、FactoryInterfaceをDIすればPSR-7実装の影響範囲は設定箇所だけになる。

PSR-11を使わないアーキテクチャなら、PSR-7を自動判定(auto-discovery)してくれるライブラリを使うといい。

ルーティング

PSR-15(HTTP Handlers) 準拠でないもの

HTTP例外

例外だけ切り出したものは見つからなかった。

ちょっと巨大すぎるので、例外部分のみを参考にするくらいがいいかもしれない。

CLI

DBAL + SQLビルダ

SQLビルダ

DBALにクエリビルダも付いていることが多いので、古きこれらのライブラリを今から使う価値はあまり無さそう

  • Idiorm
  • FluentPDO
    • 開発終了?

ORM

日付時刻

  • carbon
    • ver1系(php5用)はMutableなことに注意
  • chronos
    • Immutableなのでphp-5.6なら採用してもいいかもしれない

ユーティリティ

デバッグ

環境設定

テンプレートエンジン

  • xiaoler/blade
    • Laravelで採用されている Blade を単体で使うためのもの
    • phperには慣れ親しんだ構文で書けるのが特徴
  • twig
    • テンプレートエンジンはphpとは切り離されるべきという哲学
  • smarty3
    • 最古
  • league/plates
    • 生php + α という感じ
  • phptal/phptal
    • HTMLの属性に埋め込むという変わったアプローチ

framework

  • Laravel6
    • 一番hot
  • Symfony5
    • php界にコンポネント指向を広めた偉大なframework、Symfony2の後継
    • 単体で使えるコンポネントもたくさんある
  • CakePHP4

    • 規約重視の哲学
    • CakePHP3あたりから徐々にコンポネント指向になってきた
  • phalcon

    • php拡張でできているので高速

microframework

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

LIMIT句を使用してページネーションに必要な件数分を取得する図

LIMIT 取得開始行, 取得件数;

取得開始行」は0から始まる数値を指定するため、仮に11〜15までの5件分を取得したい場合は以下のような指定になる。

LIMIT 10, 5;

4ページ目のデータ行を7件分取得する場合のSQL

SELECT * FROM members LIMIT 21,7;

仮にこの取得したパラメータ「4」から「21」を指定するための逆算を行う。
そのためには、過去のページ数に表示件数分を掛ける必要がある。

// offsetとは基準値から差分を相殺した値のこと
$offset = ($page - 1) * 7;

これで各ページごとに、毎回必要な件数分のデータだけを取得することができるようになる。

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

【PHP】比較演算子「==」と「===」の違い

はじめに

業務でphpを使い始めてから4ヶ月目ですが、正直なんとなくの知識でコードを書いていたので、あやふやだった部分を学習し記事にすることで理解を深めていこうと思います。

「==」 と 「===」の違い

2つの値が等しいかどうか確認する場合、基本的には「==」ではなく「===」を使いましょう、とネットのどの記事にも書いてありますがそれは一体なぜなのか??
ここで、整数型の1と文字列の1を比較して見ます。

var_dump(1 == '1'); //bool(true)
var_dump(1 === '1'); //bool(false)

このような結果となります。
なぜ「==」の方はtrueとなってしまうのか??
それは「==」だと比較する際にphpが自動キャストを行うからです!

自動キャスト

キャストというのはデータ型の変換を意味します。
phpは異なる型同士で演算を行う場合、自動キャストを行います。
特に文字列型はキャストがされやすい型で、「数値っぽい文字列」数値型にキャストしてから比較を行います。

   1 == '1'   
php「右側の文字列、数値っぽいなあ。せや、変換して比較したろ!」

    

   1 == 1    
php「一致しました^^」

このようにphpがデータの型を勝手に変換してしまうためtrueとなってしまいます。
こういった自動キャストが発生することに気づかずプログラミングを進めてしまうと、予期せぬバグが発生してしまう可能性があります。

「===」を使いましょう

以上のような自動キャストを発生させないためにも、厳密な比較をしてくれる「===」を使いましょう。
こちらを使えばphpの余計なお節介をされずにすみます。
今回はざっくりと自動キャストについて触れたため、自動キャストの詳しいルールなど気になった方は別途調べてみてください。

おわりに

初投稿ということで記事を書くことに慣れていなく、読みづらかったら申し訳ないです。。
おかしなところなどございましたら遠慮なくコメントで指摘して頂けると嬉しいです。
よろしくお願い致します!

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

brew install php@7.4を実行した時にエラーが出た話

目的

  • エラー解決の方法をまとめる

エラー概要

  • 下記コマンドを実行後エラーが出力された。

    $ brew install php@7.4
    
  • エラー文を下記に記載する。

    xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
    Error: The following formula
      [#<Dependency: "python" []>, #<Options: []>]
    cannot be installed as binary package and must be built from source.
    Install the Command Line Tools:
      xcode-select --install
    
  • エラー文の和訳を下記に記載する。

        xcrun:エラー:無効なアクティブな開発者パス(/ Library / Developer / CommandLineTools)、xcrunがありません:/ Library / Developer / CommandLineTools / usr / bin / xcrun
        エラー:次の式
          [#<依存関係: "python" []>、#<オプション:[]>]
        バイナリパッケージとしてインストールすることはできず、ソースからビルドする必要があります。
        コマンドラインツールをインストールします。
          xcode-select --install
        ```
    

原因

  • xcrunと言うものがないことが原因らしい。

解決方法

  1. 下記コマンドを実行して必要な物をインストールする。

    $ xcode-select --install
    
  2. 下記のようなポップアップが表示されるので「インストール」をクリックする。

    スクリーンショット 2020-02-28 0.24.04.png

  3. 下記のウインドウが開いたら「同意する」をクリックする。

    スクリーンショット 2020-02-28 0.25.15.png

  4. インストールが開始されるので少々待つ。

    スクリーンショット 2020-02-28 0.25.26.png

  5. 下記のウインドウが開いたらインストールが完了している。「完了」をクリックする。

    スクリーンショット 2020-02-28 0.30.44.png

  6. 今一度下記コマンドを実行する。(下記のエラーが出ればOK、すでにインストールされているという内容のエラーである。)

    $ xcode-select --install
    >xcode-select: error: command line tools are already installed, use "Software Update" to install updates
    
  7. 再度PHPをインストールするコマンドを実行する。

    $ brew install php@7.4
    
  8. エラーコードは出なくなった。インストール時の出力を下記に記載する。

    ==> Installing dependencies for php: apr, apr-util, argon2, aspell, brotli, c-ares, libidn, libmetalink, libssh2, jansson, jemalloc, libev, libevent, nghttp2, openldap, rtmpdump, curl-openssl, libtool, unixodbc, freetds, libpng, freetype, libffi, pcre, gdbm, readline, sqlite, xz, python, glib, gmp, icu4c, jpeg, libpq, libsodium, libzip, oniguruma, tidy-html5, libtiff and webp
    ==> Installing php dependency: apr
    ==> Downloading https://homebrew.bintray.com/bottles/apr-1.7.0.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/27/277c42fcf2f5ca298a14279d1325f58da89ee4ec2132b3ccca9bf8dfdc354c48?__gda__=exp=1582818809~hmac=f2d3781a3f55ede73a8228a670fd4bb3
    ######################################################################## 100.0%
    ==> Pouring apr-1.7.0.catalina.bottle.tar.gz
    ==> Caveats
    apr is keg-only, which means it was not symlinked into /usr/local,
    because Apple's CLT package contains apr.
    
    If you need to have apr first in your PATH run:
      echo 'export PATH="/usr/local/opt/apr/bin:$PATH"' >> ~/.bash_profile
    
    ==> Summary
    ?  /usr/local/Cellar/apr/1.7.0: 59 files, 1.4MB
    ==> Installing php dependency: apr-util
    ==> Downloading https://homebrew.bintray.com/bottles/apr-util-1.6.1_3.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/42/425955a21c3fec8e78f365cd7fc4c6c4ec95d074f720a9b24e8237af90cc4dcc?__gda__=exp=1582818813~hmac=4d929232031855699c88b06a937ed7c1
    ######################################################################## 100.0%
    ==> Pouring apr-util-1.6.1_3.catalina.bottle.tar.gz
    ==> Caveats
    apr-util is keg-only, which means it was not symlinked into /usr/local,
    because Apple's CLT package contains apr.
    
    If you need to have apr-util first in your PATH run:
      echo 'export PATH="/usr/local/opt/apr-util/bin:$PATH"' >> ~/.bash_profile
    
    ==> Summary
    ?  /usr/local/Cellar/apr-util/1.6.1_3: 54 files, 785.7KB
    ==> Installing php dependency: argon2
    ==> Downloading https://homebrew.bintray.com/bottles/argon2-20190702_1.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/f8/f8e550c8597728bb9edc5a548497fd7b1219203932cd0f93ecc97a4fbf0bdad8?__gda__=exp=1582818817~hmac=4ee916b7082f81e1725d6316e61eab6c
    ######################################################################## 100.0%
    ==> Pouring argon2-20190702_1.catalina.bottle.tar.gz
    ?  /usr/local/Cellar/argon2/20190702_1: 12 files, 599.2KB
    ==> Installing php dependency: aspell
    ==> Downloading https://homebrew.bintray.com/bottles/aspell-0.60.8.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/f3/f34a5b53fa80f6f0ea3cef83d04eceed93f918153463e0b77a596374a842249d?__gda__=exp=1582818821~hmac=7b4174d19afed7b3c48ca30adae637f8
    ######################################################################## 100.0%
    ==> Pouring aspell-0.60.8.catalina.bottle.tar.gz
    ?  /usr/local/Cellar/aspell/0.60.8: 767 files, 322.4MB
    ==> Installing php dependency: brotli
    ==> Downloading https://homebrew.bintray.com/bottles/brotli-1.0.7.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/81/81be7d1d110787a534cd57cc1ec6bb5032d81e3928d9103ce1e654560c6848ca?__gda__=exp=1582818842~hmac=298075c6a3cd2d1c760e0d8995bc45e7
    ######################################################################## 100.0%
    ==> Pouring brotli-1.0.7.catalina.bottle.tar.gz
    ?  /usr/local/Cellar/brotli/1.0.7: 25 files, 2.2MB
    ==> Installing php dependency: c-ares
    ==> Downloading https://homebrew.bintray.com/bottles/c-ares-1.15.0.catalina.bottle.tar.gz
    ######################################################################## 100.0%
    ==> Pouring c-ares-1.15.0.catalina.bottle.tar.gz
    ?  /usr/local/Cellar/c-ares/1.15.0: 72 files, 487.1KB
    ==> Installing php dependency: libidn
    ==> Downloading https://homebrew.bintray.com/bottles/libidn-1.35.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/a7/a720f31e3d82a3e537ae2fbaf88bdfcf537b3452615a170c72714c111df4a661?__gda__=exp=1582818853~hmac=52687b3d0d6f43a4c1e222899d84f59a
    ######################################################################## 100.0%
    ==> Pouring libidn-1.35.catalina.bottle.tar.gz
    ==> Caveats
    Emacs Lisp files have been installed to:
      /usr/local/share/emacs/site-lisp/libidn
    ==> Summary
    ?  /usr/local/Cellar/libidn/1.35: 72 files, 1.4MB
    ==> Installing php dependency: libmetalink
    ==> Downloading https://homebrew.bintray.com/bottles/libmetalink-0.1.3.catalina.bottle.tar.gz
    ######################################################################## 100.0%
    ==> Pouring libmetalink-0.1.3.catalina.bottle.tar.gz
    ?  /usr/local/Cellar/libmetalink/0.1.3: 31 files, 182.9KB
    ==> Installing php dependency: libssh2
    ==> Downloading https://homebrew.bintray.com/bottles/libssh2-1.9.0_1.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/2c/2c4dcf8149663f9a133deac5bc42ce308d1ced90227cac391ca30b0ab2d381f9?__gda__=exp=1582818862~hmac=ab4aaaefec8fb67734e8b292b0ec9e82
    ######################################################################## 100.0%
    ==> Pouring libssh2-1.9.0_1.catalina.bottle.tar.gz
    ?  /usr/local/Cellar/libssh2/1.9.0_1: 184 files, 941KB
    ==> Installing php dependency: jansson
    ==> Downloading https://homebrew.bintray.com/bottles/jansson-2.12.catalina.bottle.tar.gz
    ######################################################################## 100.0%
    ==> Pouring jansson-2.12.catalina.bottle.tar.gz
    ?  /usr/local/Cellar/jansson/2.12: 11 files, 162.9KB
    ==> Installing php dependency: jemalloc
    ==> Downloading https://homebrew.bintray.com/bottles/jemalloc-5.2.1.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/13/13080a13f5e1a0699adaed5ba9906616850c2e8a75a829f8be6a2e6183fb16e5?__gda__=exp=1582818871~hmac=bd6b81c3263bfa3ec7984d9e0e0bfe1a
    ######################################################################## 100.0%
    ==> Pouring jemalloc-5.2.1.catalina.bottle.tar.gz
    ?  /usr/local/Cellar/jemalloc/5.2.1: 16 files, 2MB
    ==> Installing php dependency: libev
    ==> Downloading https://homebrew.bintray.com/bottles/libev-4.31.catalina.bottle.tar.gz
    ######################################################################## 100.0%
    ==> Pouring libev-4.31.catalina.bottle.tar.gz
    ?  /usr/local/Cellar/libev/4.31: 12 files, 451.3KB
    ==> Installing php dependency: libevent
    ==> Downloading https://homebrew.bintray.com/bottles/libevent-2.1.11_1.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/9d/9d262f9ffb2268340a89c713826d8ca068bcac06c30baf49e6184ab4660d977a?__gda__=exp=1582818882~hmac=ff4a6fa9eac7556fad02a6429e4046de
    ######################################################################## 100.0%
    ==> Pouring libevent-2.1.11_1.catalina.bottle.tar.gz
    ?  /usr/local/Cellar/libevent/2.1.11_1: 1,063 files, 5MB
    ==> Installing php dependency: nghttp2
    ==> Downloading https://homebrew.bintray.com/bottles/nghttp2-1.40.0.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/7d/7d8e5ffd4a51ee4c511f19b37d0285880d27239e0880113b6ad1412432aa9d11?__gda__=exp=1582818889~hmac=d17dd8c2d092360925cf7fec31cc91f2
    ######################################################################## 100.0%
    ==> Pouring nghttp2-1.40.0.catalina.bottle.tar.gz
    ?  /usr/local/Cellar/nghttp2/1.40.0: 26 files, 2.7MB
    ==> Installing php dependency: openldap
    ==> Downloading https://homebrew.bintray.com/bottles/openldap-2.4.49.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/26/26efb37f53ae1a3815213adf9ab815c66b7197a3d212f994dd4e5b4140cf3e4e?__gda__=exp=1582818892~hmac=a1323e810a84f9db03ef763591a96981
    ######################################################################## 100.0%
    ==> Pouring openldap-2.4.49.catalina.bottle.tar.gz
    ==> Caveats
    openldap is keg-only, which means it was not symlinked into /usr/local,
    because macOS already provides this software and installing another version in
    parallel can cause all kinds of trouble.
    
    If you need to have openldap first in your PATH run:
      echo 'export PATH="/usr/local/opt/openldap/bin:$PATH"' >> ~/.bash_profile
      echo 'export PATH="/usr/local/opt/openldap/sbin:$PATH"' >> ~/.bash_profile
    
    For compilers to find openldap you may need to set:
      export LDFLAGS="-L/usr/local/opt/openldap/lib"
      export CPPFLAGS="-I/usr/local/opt/openldap/include"
    
    ==> Summary
    ?  /usr/local/Cellar/openldap/2.4.49: 328 files, 6.7MB
    ==> Installing php dependency: rtmpdump
    ==> Downloading https://homebrew.bintray.com/bottles/rtmpdump-2.4+20151223_1.catalina.bottle.tar.gz
    ######################################################################## 100.0%
    ==> Pouring rtmpdump-2.4+20151223_1.catalina.bottle.tar.gz
    ?  /usr/local/Cellar/rtmpdump/2.4+20151223_1: 20 files, 443.4KB
    ==> Installing php dependency: curl-openssl
    ==> Downloading https://homebrew.bintray.com/bottles/curl-openssl-7.68.0.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/c4/c4dd2e8a36d2e4487d9d8c483d42be8b2aa3c5a0a326c10b35aeca82fccd8c0f?__gda__=exp=1582818904~hmac=571f4b21636431a1d9ef06c557839443
    ######################################################################## 100.0%
    ==> Pouring curl-openssl-7.68.0.catalina.bottle.tar.gz
    ==> Caveats
    curl-openssl is keg-only, which means it was not symlinked into /usr/local,
    because macOS already provides this software and installing another version in
    parallel can cause all kinds of trouble.
    
    If you need to have curl-openssl first in your PATH run:
      echo 'export PATH="/usr/local/opt/curl-openssl/bin:$PATH"' >> ~/.bash_profile
    
    For compilers to find curl-openssl you may need to set:
      export LDFLAGS="-L/usr/local/opt/curl-openssl/lib"
      export CPPFLAGS="-I/usr/local/opt/curl-openssl/include"
    
    For pkg-config to find curl-openssl you may need to set:
      export PKG_CONFIG_PATH="/usr/local/opt/curl-openssl/lib/pkgconfig"
    
    ==> Summary
    ?  /usr/local/Cellar/curl-openssl/7.68.0: 456 files, 3.4MB
    ==> Installing php dependency: libtool
    ==> Downloading https://homebrew.bintray.com/bottles/libtool-2.4.6_1.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/38/38212486e78db33048438cffe38b6914f13553e7bb8c7d3d2fbecb18a6481d3c?__gda__=exp=1582818908~hmac=130c8c5a3f79ba8697226122d5728099
    ######################################################################## 100.0%
    ==> Pouring libtool-2.4.6_1.catalina.bottle.tar.gz
    ==> Caveats
    In order to prevent conflicts with Apple's own libtool we have prepended a "g"
    so, you have instead: glibtool and glibtoolize.
    ==> Summary
    ?  /usr/local/Cellar/libtool/2.4.6_1: 71 files, 3.7MB
    ==> Installing php dependency: unixodbc
    ==> Downloading https://homebrew.bintray.com/bottles/unixodbc-2.3.7.catalina.bottle.1.tar.gz
    ==> Downloading from https://akamai.bintray.com/03/03ba378d971af98d07652f978548ffacb4c155ba11dd36af9d46af36e2d5674b?__gda__=exp=1582818912~hmac=efb8bc9f866a054e3cd679232d1cd0c3
    ######################################################################## 100.0%
    ==> Pouring unixodbc-2.3.7.catalina.bottle.1.tar.gz
    ?  /usr/local/Cellar/unixodbc/2.3.7: 46 files, 1.9MB
    ==> Installing php dependency: freetds
    ==> Downloading https://homebrew.bintray.com/bottles/freetds-1.1.24.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/36/363d44ed3a0ec8f9768987bc6d873913dd30818933ea9bb9c290580dbd6d11ab?__gda__=exp=1582818915~hmac=6a75fe2584c3fdb8191aa24f792faa73
    ######################################################################## 100.0%
    ==> Pouring freetds-1.1.24.catalina.bottle.tar.gz
    ?  /usr/local/Cellar/freetds/1.1.24: 66 files, 3.5MB
    ==> Installing php dependency: libpng
    ==> Downloading https://homebrew.bintray.com/bottles/libpng-1.6.37.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/c8/c8e74da602c21f978cd7ee3d489979b4fc6681e71f678a1d99012943ee3a909f?__gda__=exp=1582818919~hmac=65f5c5c989008e57fec50b0373e0d4fd
    ######################################################################## 100.0%
    ==> Pouring libpng-1.6.37.catalina.bottle.tar.gz
    ?  /usr/local/Cellar/libpng/1.6.37: 27 files, 1.2MB
    ==> Installing php dependency: freetype
    ==> Downloading https://homebrew.bintray.com/bottles/freetype-2.10.1.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/dd/ddd686141a969caec11ea248324e3736f6db50a54673187be103dde39cb01ebf?__gda__=exp=1582818922~hmac=b02f5e3ce47dc74d07c17a18141ee96c
    ######################################################################## 100.0%
    ==> Pouring freetype-2.10.1.catalina.bottle.tar.gz
    ?  /usr/local/Cellar/freetype/2.10.1: 61 files, 2.2MB
    ==> Installing php dependency: libffi
    ==> Downloading https://homebrew.bintray.com/bottles/libffi-3.2.1.catalina.bottle.tar.gz
    ######################################################################## 100.0%
    ==> Pouring libffi-3.2.1.catalina.bottle.tar.gz
    ==> Caveats
    libffi is keg-only, which means it was not symlinked into /usr/local,
    because some formulae require a newer version of libffi.
    
    For compilers to find libffi you may need to set:
      export LDFLAGS="-L/usr/local/opt/libffi/lib"
    
    For pkg-config to find libffi you may need to set:
      export PKG_CONFIG_PATH="/usr/local/opt/libffi/lib/pkgconfig"
    
    ==> Summary
    ?  /usr/local/Cellar/libffi/3.2.1: 16 files, 300.7KB
    ==> Installing php dependency: pcre
    ==> Downloading https://homebrew.bintray.com/bottles/pcre-8.44.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/f8/f8ac266e04f984fa55091a43f0fdc39a40d57c2489d289a186c88ccedaba7eeb?__gda__=exp=1582818931~hmac=61228c226c610e48e353419df861e9e8
    ######################################################################## 100.0%
    ==> Pouring pcre-8.44.catalina.bottle.tar.gz
    ?  /usr/local/Cellar/pcre/8.44: 204 files, 5.5MB
    ==> Installing php dependency: gdbm
    ==> Downloading https://homebrew.bintray.com/bottles/gdbm-1.18.1.catalina.bottle.1.tar.gz
    ######################################################################## 100.0%
    ==> Pouring gdbm-1.18.1.catalina.bottle.1.tar.gz
    ?  /usr/local/Cellar/gdbm/1.18.1: 20 files, 602.8KB
    ==> Installing php dependency: readline
    ==> Downloading https://homebrew.bintray.com/bottles/readline-8.0.4.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/6a/6ae1c8e7c783f32bd22c6085caa4d838fed7fb386da7e40ca47b87ec9b1237d6?__gda__=exp=1582818942~hmac=ebac9456e17b393d45f7e9415ea5c5e3
    ######################################################################## 100.0%
    ==> Pouring readline-8.0.4.catalina.bottle.tar.gz
    ==> Caveats
    readline is keg-only, which means it was not symlinked into /usr/local,
    because macOS provides the BSD libedit library, which shadows libreadline.
    In order to prevent conflicts when programs look for libreadline we are
    defaulting this GNU Readline installation to keg-only.
    
    For compilers to find readline you may need to set:
      export LDFLAGS="-L/usr/local/opt/readline/lib"
      export CPPFLAGS="-I/usr/local/opt/readline/include"
    
    For pkg-config to find readline you may need to set:
      export PKG_CONFIG_PATH="/usr/local/opt/readline/lib/pkgconfig"
    
    ==> Summary
    ?  /usr/local/Cellar/readline/8.0.4: 48 files, 1.5MB
    ==> Installing php dependency: sqlite
    ==> Downloading https://homebrew.bintray.com/bottles/sqlite-3.31.1.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/e0/e09e8c96db88178e4f47b0cdab6477c46fa582326900ec9309c3ce1b9f7ff9aa?__gda__=exp=1582818945~hmac=2c50e62518d35724bc04bdacbed29792
    ######################################################################## 100.0%
    ==> Pouring sqlite-3.31.1.catalina.bottle.tar.gz
    ==> Caveats
    sqlite is keg-only, which means it was not symlinked into /usr/local,
    because macOS provides an older sqlite3.
    
    If you need to have sqlite first in your PATH run:
      echo 'export PATH="/usr/local/opt/sqlite/bin:$PATH"' >> ~/.bash_profile
    
    For compilers to find sqlite you may need to set:
      export LDFLAGS="-L/usr/local/opt/sqlite/lib"
      export CPPFLAGS="-I/usr/local/opt/sqlite/include"
    
    For pkg-config to find sqlite you may need to set:
      export PKG_CONFIG_PATH="/usr/local/opt/sqlite/lib/pkgconfig"
    
    ==> Summary
    ?  /usr/local/Cellar/sqlite/3.31.1: 11 files, 4MB
    ==> Installing php dependency: xz
    ==> Downloading https://homebrew.bintray.com/bottles/xz-5.2.4.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/5a/5aa90b77d5e772dacd38146bbb7ff2fa43f210e3779def2c0f16cbdae8589aa3?__gda__=exp=1582818949~hmac=0457e5b1e3c2479b062e105d9529557e
    ######################################################################## 100.0%
    ==> Pouring xz-5.2.4.catalina.bottle.tar.gz
    ?  /usr/local/Cellar/xz/5.2.4: 92 files, 1MB
    ==> Installing php dependency: python
    ==> Downloading https://homebrew.bintray.com/bottles/python-3.7.6_1.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/38/3871ef8b53270576c46489ae397f245b84772c405085238790cf5faa1853b33a?__gda__=exp=1582818952~hmac=c9375e123cb128e1ffa60068e0065ded
    ######################################################################## 100.0%
    ==> Pouring python-3.7.6_1.catalina.bottle.tar.gz
    ==> /usr/local/Cellar/python/3.7.6_1/bin/python3 -s setup.py --no-user-cfg install --force --verbose --install-scripts=/usr/local/Cellar/python/3.7.6_1/bin --install-lib=/usr/l
    ==> /usr/local/Cellar/python/3.7.6_1/bin/python3 -s setup.py --no-user-cfg install --force --verbose --install-scripts=/usr/local/Cellar/python/3.7.6_1/bin --install-lib=/usr/l
    ==> /usr/local/Cellar/python/3.7.6_1/bin/python3 -s setup.py --no-user-cfg install --force --verbose --install-scripts=/usr/local/Cellar/python/3.7.6_1/bin --install-lib=/usr/l
    ==> Caveats
    Python has been installed as
      /usr/local/bin/python3
    
    Unversioned symlinks `python`, `python-config`, `pip` etc. pointing to
    `python3`, `python3-config`, `pip3` etc., respectively, have been installed into
      /usr/local/opt/python/libexec/bin
    
    You can install Python packages with
      pip3 install <package>
    They will install into the site-package directory
      /usr/local/lib/python3.7/site-packages
    
    See: https://docs.brew.sh/Homebrew-and-Python
    ==> Summary
    ?  /usr/local/Cellar/python/3.7.6_1: 3,977 files, 61MB
    ==> Installing php dependency: glib
    ==> Downloading https://homebrew.bintray.com/bottles/glib-2.62.5.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/ff/ffe825b5349fa644019af75ab82581fe312c689ab4c6add223ee119e1f35733d?__gda__=exp=1582818975~hmac=15d55697b0725c34ea51e0782a75df0e
    ######################################################################## 100.0%
    ==> Pouring glib-2.62.5.catalina.bottle.tar.gz
    ==> Caveats
    Bash completion has been installed to:
      /usr/local/etc/bash_completion.d
    ==> Summary
    ?  /usr/local/Cellar/glib/2.62.5: 435 files, 15.5MB
    ==> Installing php dependency: gmp
    ==> Downloading https://homebrew.bintray.com/bottles/gmp-6.2.0.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/2e/2e6acd6e62d1b8ef0800061e113aea30a63f56b32b99c010234c0420fd6d3ecf?__gda__=exp=1582818981~hmac=62c42e81972cc0a18886fea789616644
    ######################################################################## 100.0%
    ==> Pouring gmp-6.2.0.catalina.bottle.tar.gz
    ?  /usr/local/Cellar/gmp/6.2.0: 20 files, 3.2MB
    ==> Installing php dependency: icu4c
    ==> Downloading https://homebrew.bintray.com/bottles/icu4c-64.2.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/e9/e9ae7bb5a76b48e82f56bc744eaaa1e9bdb5ca49ea6b5a2e4d52f57ad331f063?__gda__=exp=1582818985~hmac=7c3a12000919259856aca1456a11137e
    ######################################################################## 100.0%
    ==> Pouring icu4c-64.2.catalina.bottle.tar.gz
    ==> Caveats
    icu4c is keg-only, which means it was not symlinked into /usr/local,
    because macOS provides libicucore.dylib (but nothing else).
    
    If you need to have icu4c first in your PATH run:
      echo 'export PATH="/usr/local/opt/icu4c/bin:$PATH"' >> ~/.bash_profile
      echo 'export PATH="/usr/local/opt/icu4c/sbin:$PATH"' >> ~/.bash_profile
    
    For compilers to find icu4c you may need to set:
      export LDFLAGS="-L/usr/local/opt/icu4c/lib"
      export CPPFLAGS="-I/usr/local/opt/icu4c/include"
    
    For pkg-config to find icu4c you may need to set:
      export PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig"
    
    ==> Summary
    ?  /usr/local/Cellar/icu4c/64.2: 257 files, 69.3MB
    ==> Installing php dependency: jpeg
    ==> Downloading https://homebrew.bintray.com/bottles/jpeg-9d.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/8f/8f7b82a952fb3937889c7f22da1403e5338cd320495917eb26b0c5b2e614791c?__gda__=exp=1582818991~hmac=f6095ad96f1524b71693e95daf53ae11
    ######################################################################## 100.0%
    ==> Pouring jpeg-9d.catalina.bottle.tar.gz
    ?  /usr/local/Cellar/jpeg/9d: 21 files, 775.2KB
    ==> Installing php dependency: libpq
    ==> Downloading https://homebrew.bintray.com/bottles/libpq-12.2.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/64/64bab543c341a2e26246aa434c8ef27c48985f397996a975751f2c5ea91cd3c3?__gda__=exp=1582818995~hmac=e262fb3d2bd0116e4e047d1fcb36f28b
    ######################################################################## 100.0%
    ==> Pouring libpq-12.2.catalina.bottle.tar.gz
    ==> Caveats
    libpq is keg-only, which means it was not symlinked into /usr/local,
    because conflicts with postgres formula.
    
    If you need to have libpq first in your PATH run:
      echo 'export PATH="/usr/local/opt/libpq/bin:$PATH"' >> ~/.bash_profile
    
    For compilers to find libpq you may need to set:
      export LDFLAGS="-L/usr/local/opt/libpq/lib"
      export CPPFLAGS="-I/usr/local/opt/libpq/include"
    
    For pkg-config to find libpq you may need to set:
      export PKG_CONFIG_PATH="/usr/local/opt/libpq/lib/pkgconfig"
    
    ==> Summary
    ?  /usr/local/Cellar/libpq/12.2: 2,240 files, 23.8MB
    ==> Installing php dependency: libsodium
    ==> Downloading https://homebrew.bintray.com/bottles/libsodium-1.0.18_1.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/db/db372521cd0b1861a5b578bee22426f3a1f4f7cb3c382be1f842da4715dc65bd?__gda__=exp=1582819005~hmac=b1719932c78dd721b5c91e5e01cd0d0f
    ######################################################################## 100.0%
    ==> Pouring libsodium-1.0.18_1.catalina.bottle.tar.gz
    ?  /usr/local/Cellar/libsodium/1.0.18_1: 73 files, 1012.8KB
    ==> Installing php dependency: libzip
    ==> Downloading https://homebrew.bintray.com/bottles/libzip-1.6.1.catalina.bottle.tar.gz
    ######################################################################## 100.0%
    ==> Pouring libzip-1.6.1.catalina.bottle.tar.gz
    ?  /usr/local/Cellar/libzip/1.6.1: 135 files, 598.5KB
    ==> Installing php dependency: oniguruma
    ==> Downloading https://homebrew.bintray.com/bottles/oniguruma-6.9.4.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/05/05e25bc53db0cf338a7f765da76c66260972d6b4e259be415bc17807a8b60fe9?__gda__=exp=1582819014~hmac=4162f73fbfb682871a1591cd1ae35a3e
    ######################################################################## 100.0%
    ==> Pouring oniguruma-6.9.4.catalina.bottle.tar.gz
    ?  /usr/local/Cellar/oniguruma/6.9.4: 17 files, 1.3MB
    ==> Installing php dependency: tidy-html5
    ==> Downloading https://homebrew.bintray.com/bottles/tidy-html5-5.6.0.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/fb/fb2134180fbdb92cc10f3fad33c769073adceb7796e465db7dbc3778f7d3547a?__gda__=exp=1582819017~hmac=11c55ddefda47fe9d139207d8f3f8be0
    ######################################################################## 100.0%
    ==> Pouring tidy-html5-5.6.0.catalina.bottle.tar.gz
    ?  /usr/local/Cellar/tidy-html5/5.6.0: 14 files, 2.6MB
    ==> Installing php dependency: libtiff
    ==> Downloading https://homebrew.bintray.com/bottles/libtiff-4.1.0.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/44/449bd9123e73e4c4eab85b77322d769cc9df0f6adab05e9b9319b012d1215a68?__gda__=exp=1582819021~hmac=c5a5f7355528adb9b159a3501bcee6b2
    ######################################################################## 100.0%
    ==> Pouring libtiff-4.1.0.catalina.bottle.tar.gz
    ?  /usr/local/Cellar/libtiff/4.1.0: 247 files, 3.7MB
    ==> Installing php dependency: webp
    ==> Downloading https://homebrew.bintray.com/bottles/webp-1.1.0.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/27/27c76a7054277ff5a2e844c5996fc731d8644acbaaa505d35dba42c4a48a0c51?__gda__=exp=1582819025~hmac=10924b18bf5bf57f77e57dfe35f6a184
    ######################################################################## 100.0%
    ==> Pouring webp-1.1.0.catalina.bottle.tar.gz
    ?  /usr/local/Cellar/webp/1.1.0: 39 files, 2.1MB
    ==> Installing php
    ==> Downloading https://homebrew.bintray.com/bottles/php-7.4.3.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/93/9370af1b117049783f81968fc800d1710224581cb8d9f396c38d9eef8aedf3ac?__gda__=exp=1582819028~hmac=03e1443c8f4e7eebc970641b392b094c
    ######################################################################## 100.0%
    ==> Pouring php-7.4.3.catalina.bottle.tar.gz
    ==> /usr/local/Cellar/php/7.4.3/bin/pear config-set php_ini /usr/local/etc/php/7.4/php.ini system
    ==> /usr/local/Cellar/php/7.4.3/bin/pear config-set php_dir /usr/local/share/pear system
    ==> /usr/local/Cellar/php/7.4.3/bin/pear config-set doc_dir /usr/local/share/pear/doc system
    ==> /usr/local/Cellar/php/7.4.3/bin/pear config-set ext_dir /usr/local/lib/php/pecl/20190902 system
    ==> /usr/local/Cellar/php/7.4.3/bin/pear config-set bin_dir /usr/local/opt/php/bin system
    ==> /usr/local/Cellar/php/7.4.3/bin/pear config-set data_dir /usr/local/share/pear/data system
    ==> /usr/local/Cellar/php/7.4.3/bin/pear config-set cfg_dir /usr/local/share/pear/cfg system
    ==> /usr/local/Cellar/php/7.4.3/bin/pear config-set www_dir /usr/local/share/pear/htdocs system
    ==> /usr/local/Cellar/php/7.4.3/bin/pear config-set man_dir /usr/local/share/man system
    ==> /usr/local/Cellar/php/7.4.3/bin/pear config-set test_dir /usr/local/share/pear/test system
    ==> /usr/local/Cellar/php/7.4.3/bin/pear config-set php_bin /usr/local/opt/php/bin/php system
    ==> /usr/local/Cellar/php/7.4.3/bin/pear update-channels
    ==> Caveats
    To enable PHP in Apache add the following to httpd.conf and restart Apache:
        LoadModule php7_module /usr/local/opt/php/lib/httpd/modules/libphp7.so
    
        <FilesMatch \.php$>
            SetHandler application/x-httpd-php
        </FilesMatch>
    
    Finally, check DirectoryIndex includes index.php
        DirectoryIndex index.php index.html
    
    The php.ini and php-fpm.ini file can be found in:
        /usr/local/etc/php/7.4/
    
    To have launchd start php now and restart at login:
      brew services start php
    Or, if you don't want/need a background service you can just run:
      php-fpm
    ==> Summary
    ?  /usr/local/Cellar/php/7.4.3: 517 files, 76MB
    ==> Caveats
    ==> apr
    apr is keg-only, which means it was not symlinked into /usr/local,
    because Apple's CLT package contains apr.
    
    If you need to have apr first in your PATH run:
      echo 'export PATH="/usr/local/opt/apr/bin:$PATH"' >> ~/.bash_profile
    
    ==> apr-util
    apr-util is keg-only, which means it was not symlinked into /usr/local,
    because Apple's CLT package contains apr.
    
    If you need to have apr-util first in your PATH run:
      echo 'export PATH="/usr/local/opt/apr-util/bin:$PATH"' >> ~/.bash_profile
    
    ==> libidn
    Emacs Lisp files have been installed to:
      /usr/local/share/emacs/site-lisp/libidn
    ==> openldap
    openldap is keg-only, which means it was not symlinked into /usr/local,
    because macOS already provides this software and installing another version in
    parallel can cause all kinds of trouble.
    
    If you need to have openldap first in your PATH run:
      echo 'export PATH="/usr/local/opt/openldap/bin:$PATH"' >> ~/.bash_profile
      echo 'export PATH="/usr/local/opt/openldap/sbin:$PATH"' >> ~/.bash_profile
    
    For compilers to find openldap you may need to set:
      export LDFLAGS="-L/usr/local/opt/openldap/lib"
      export CPPFLAGS="-I/usr/local/opt/openldap/include"
    
    ==> curl-openssl
    curl-openssl is keg-only, which means it was not symlinked into /usr/local,
    because macOS already provides this software and installing another version in
    parallel can cause all kinds of trouble.
    
    If you need to have curl-openssl first in your PATH run:
      echo 'export PATH="/usr/local/opt/curl-openssl/bin:$PATH"' >> ~/.bash_profile
    
    For compilers to find curl-openssl you may need to set:
      export LDFLAGS="-L/usr/local/opt/curl-openssl/lib"
      export CPPFLAGS="-I/usr/local/opt/curl-openssl/include"
    
    For pkg-config to find curl-openssl you may need to set:
      export PKG_CONFIG_PATH="/usr/local/opt/curl-openssl/lib/pkgconfig"
    
    ==> libtool
    In order to prevent conflicts with Apple's own libtool we have prepended a "g"
    so, you have instead: glibtool and glibtoolize.
    ==> libffi
    libffi is keg-only, which means it was not symlinked into /usr/local,
    because some formulae require a newer version of libffi.
    
    For compilers to find libffi you may need to set:
      export LDFLAGS="-L/usr/local/opt/libffi/lib"
    
    For pkg-config to find libffi you may need to set:
      export PKG_CONFIG_PATH="/usr/local/opt/libffi/lib/pkgconfig"
    
    ==> readline
    readline is keg-only, which means it was not symlinked into /usr/local,
    because macOS provides the BSD libedit library, which shadows libreadline.
    In order to prevent conflicts when programs look for libreadline we are
    defaulting this GNU Readline installation to keg-only.
    
    For compilers to find readline you may need to set:
      export LDFLAGS="-L/usr/local/opt/readline/lib"
      export CPPFLAGS="-I/usr/local/opt/readline/include"
    
    For pkg-config to find readline you may need to set:
      export PKG_CONFIG_PATH="/usr/local/opt/readline/lib/pkgconfig"
    
    ==> sqlite
    sqlite is keg-only, which means it was not symlinked into /usr/local,
    because macOS provides an older sqlite3.
    
    If you need to have sqlite first in your PATH run:
      echo 'export PATH="/usr/local/opt/sqlite/bin:$PATH"' >> ~/.bash_profile
    
    For compilers to find sqlite you may need to set:
      export LDFLAGS="-L/usr/local/opt/sqlite/lib"
      export CPPFLAGS="-I/usr/local/opt/sqlite/include"
    
    For pkg-config to find sqlite you may need to set:
      export PKG_CONFIG_PATH="/usr/local/opt/sqlite/lib/pkgconfig"
    
    ==> python
    Python has been installed as
      /usr/local/bin/python3
    
    Unversioned symlinks `python`, `python-config`, `pip` etc. pointing to
    `python3`, `python3-config`, `pip3` etc., respectively, have been installed into
      /usr/local/opt/python/libexec/bin
    
    You can install Python packages with
      pip3 install <package>
    They will install into the site-package directory
      /usr/local/lib/python3.7/site-packages
    
    See: https://docs.brew.sh/Homebrew-and-Python
    ==> glib
    Bash completion has been installed to:
      /usr/local/etc/bash_completion.d
    ==> icu4c
    icu4c is keg-only, which means it was not symlinked into /usr/local,
    because macOS provides libicucore.dylib (but nothing else).
    
    If you need to have icu4c first in your PATH run:
      echo 'export PATH="/usr/local/opt/icu4c/bin:$PATH"' >> ~/.bash_profile
      echo 'export PATH="/usr/local/opt/icu4c/sbin:$PATH"' >> ~/.bash_profile
    
    For compilers to find icu4c you may need to set:
      export LDFLAGS="-L/usr/local/opt/icu4c/lib"
      export CPPFLAGS="-I/usr/local/opt/icu4c/include"
    
    For pkg-config to find icu4c you may need to set:
      export PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig"
    
    ==> libpq
    libpq is keg-only, which means it was not symlinked into /usr/local,
    because conflicts with postgres formula.
    
    If you need to have libpq first in your PATH run:
      echo 'export PATH="/usr/local/opt/libpq/bin:$PATH"' >> ~/.bash_profile
    
    For compilers to find libpq you may need to set:
      export LDFLAGS="-L/usr/local/opt/libpq/lib"
      export CPPFLAGS="-I/usr/local/opt/libpq/include"
    
    For pkg-config to find libpq you may need to set:
      export PKG_CONFIG_PATH="/usr/local/opt/libpq/lib/pkgconfig"
    
    ==> php
    To enable PHP in Apache add the following to httpd.conf and restart Apache:
        LoadModule php7_module /usr/local/opt/php/lib/httpd/modules/libphp7.so
    
        <FilesMatch \.php$>
            SetHandler application/x-httpd-php
        </FilesMatch>
    
    Finally, check DirectoryIndex includes index.php
        DirectoryIndex index.php index.html
    
    The php.ini and php-fpm.ini file can be found in:
        /usr/local/etc/php/7.4/
    
    To have launchd start php now and restart at login:
      brew services start php
    Or, if you don't want/need a background service you can just run:
      php-fpm
    
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPでmkdir時に4桁のパーミッションを文字列型の変数の値より指定するには

PHPのmkdir関数でディレクトリを作成する際に8進数4桁のパーミッションを指定する場合、mkdir関数の第2引数へ

mkdir('/var/dat/hogefuga', 0755, true);

のような形で指定することで、0755(rwxr-xr-x)というパーミッションのディレクトリが作成されます。

変数でセットする場合も、

$perm = 0755;
mkdir('/var/dat/hogefuga', 0755, true);

とすることで、上記と同様のパーミッションでディレクトリを作成することができます。

しかし、変数が文字列型である場合、例えば

$perm = '0755';
mkdir('/var/dat/hogefuga', 0755, true);

である場合、0755(rwxr-xr-x)とならず(例えば、-wxr---tのようになり)、意図したパーミッションとならない場合があります。

変数が文字列型であるケースとしては、Webシステムから送信された値や、DBやAPI、ファイル等から取得した値を使用するケースが挙げられます。

原因

文字列型の値は、10進数の数値として扱われます。つまり、0755(8進数)ではなく、755(10進数)として扱われます。
これにより、意図したパーミッションでディレクトリを作成することが出来ません。

対応

octdec関数で文字列型を8進数の整数へ変換することで、この問題を解消することができます。

<?php
$perm = '0755';
$mydir = '/var/dat/hogefuga';

mkdir($mydir, octdec($perm), true);

参考

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