楽しいだけで十分です

好きなことを書きます

PHPのソースコードが実行されるまでの流れ

PHPソースコードが、実行されるまでを勉強したのでメモ。
実際にコードを書く時に意識することはないですが、エラーのデバッグ時に役立つので、知っておいた方が良さそうです。

概略

PHPプログラムが実行される度に、内部的にソースコードコンパイルを行います。
コンパイルされた結果が、「オペコード(Opcodes: Operation codes)」と呼ばれる中間コードです。
そのオペコードを実行マシンが実行することで、PHPのプログラムが動作できます。

コンパイルの流れ図 f:id:yinm:20170123220457p:plain

少し詳細

ソースコードコンパイルするまでの流れを詳細に見ると、レキサー(Lexer)」「パーサー(Parser)」というプログラムの処理を行っています。
レキサーとは字句解析を行うプログラムのことで、PHPプログラムを解析し、構文をバラバラのトークンに分解します。
パーサーとは構文解析と意味解析(コード生成)を行うプログラムのことで、レキサーによって生成されたトークンをパースし、オペコードへ変換します。

参考

パーフェクトPHP

Webサーバー(Apache)のパーミッション

CentOS7を使って、Apacheの勉強をしていたのですが、パーミッションエラーなどでよくエラーになったので、整理してみました。
前半が、前提知識としてLinuxパーミッション設定の話、後半がApacheパーミッション設定の話になってます。

Linuxパーミッション

所有権

種類 意味
Owner (所有者) ファイル or ディレクトリの所有者
Group (グループ) ファイル所有者の所属グループ
Other (その他) その他の全てのユーザー

実行権

種類 アルファベット表記 数字表記
Read (読み込み) r 4
Write (書き込み) w 2
Execute (実行) x 1
権限なし - 0

実行権は、ファイルの場合とディレクトリの場合で意味が異なります。

ファイルの場合

種類 説明
Read lessコマンドなどを利用してファイルを読み込むこと
Write テキストエディタなどによる上書き・rmコマンドなどによる削除
Execute スクリプトファイルなどのプログラムを実行すること

ディレクトリの場合

種類 説明
Read lsコマンドなどを利用して、対象のディレクトリの中にあるファイルを確認すること
Write 対象のディレクトリのファイルを作成・削除すること
Execute cdコマンドなどで、対象のディレクトリにアクセスできる権限

Webサーバー(Apacheなど)のパーミッション

  • Apacheのユーザーである、apacheユーザーに権限があるかを意識すると良いです。
  • HTMLなどの静的なコンテンツでも、PHPのようなプログラムでも、基本的にはapacheユーザーに読み込み権限があれば動作します。

HTMLなどの静的コンテンツの場合

  • Webページはブラウザを通して一般ユーザーがアクセスするため、Otherに読み込み権限を与えればいいように感じますが、それは間違いです。
  • 実際には、ブラウザのリクエストを元にApacheがファイルを読み込み、その内容をブラウザに返しています。そのため、apacheユーザーに読み込み権限が必要です。

PHPを実行する場合

  • Apacheのデフォルト設定では、Apacheの一部である、モジュールの機能を利用してPHPを実行します。
  • この時には、ApachePHPスクリプトファイルを読み込んで、PHPモジュールとしてプログラムを実行するため、apacheユーザーに読み込み権限があれば実行できます。実行権限は不要です。

参考にしたサイト様

vagrant upした時に、`Vagrant was unable to mount VirtualBox shared folders. This is usually ~`というエラーが出た時の対処

Vagrantでfile_syncedを設定してvagrant upすると、次のようなエラーで怒られました。

Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=1000,gid=1000 var_www_html /var/www/html

The error output from the command was:

mount: unknown filesystem type 'vboxsf'

これを解決するまでにやったことのメモします。

解決するには

  • 次の2つのことをした後に、再起動(vagrant reload)をすると解決します。

カーネルのアップデート

  • 上記のエラーが出た時でも仮想マシンへの接続は可能なので、vagrant sshで接続後、次のコマンドを実行します。
[vagrant@localhost ~]$ sudo yum -y update kernel
[vagrant@localhost ~]$ sudo yum -y install kernel-devel kernel-headers dkms gcc gcc-c++

VirtualBox Guest Additionsのバージョンを合わせる

  • VirtualBox Guest Additionsは、VirtualBox 上に作成したゲストOSにインストールするソフトウェアで、ホストとゲストとの間での操作を便利にしてくれる機能が使えます。このバージョンがインストールしているVirtualBoxとゲストマシンのGuest Addtionsで一致しない場合に上記のエラーで失敗してしまいます。
  • 手動でバージョンを合わせる方法もありますが、「vagrant-vbguest」プラグインを使うと便利です。インストール方法は次のコマンド。
$ vagrant plugin install vagrant-vbguest

読書ノート書いてます

最近読書ノートを付けながら、技術書などを読むことにしています。
そのため、読むのに3倍くらい時間が掛かるようになった気がしてますが、なかなかいいかもと思っているのでメモ。

いいなと思っていること

  • 自分の成果が目に見えて残る
  • 漠然と読まなくなる
  • 復習するのが楽

一番いいなと思っていることが、自分の成果が目に見えて残ることです。
「ここまではちゃんと読みきった!」という事実が、「続きも読んでみよう」「最後まで読みきってみよう」という気持ちを湧き起こしてくれます。
また、次の読書まで間が空いてしまった時も、メモを見返せばある程度の内容を思い出せるので、再開がしやすいです。

一種のセーブポイントを作りながら勉強できるのは、精神衛生的にも良いです。
ガーッと勉強したのに、ほとんど忘れちゃったなあってなる時がままあって、つらくなることがよくあるので・・・。

何はともあれ、オススメです。読書ノート。

LaravelでWebアプリを作ろうと思ってるんです。

今年も既に2%くらい終わってしまいましたが、如何お過ごしでしょうか。
僕はというと、引っ越しと風邪で新年早々「わー!」っとなっております。わー。

さて、今年の上半期の目標のひとつに、Laravelを使ってWebアプリを作ることがあります。
目標を達成するには計画が大切なので、ロードマップを作ります。
大いに変更が出そうな気もしてますが、その辺はよしなにやって、最後は笑っていたい気持ちがあります。

何作るの?

  • 単語帳アプリ

車輪の再発明感があるアプリですが、自分で作ったら愛着湧いていいのではくらいの感じで決めてます。

そもそもなぜやりたいの?

  • PHPのモダンなプラクティスを身に付けたい
  • PHPのエコシステムの理解
  • フレームワークの理解
  • 設計力向上
  • 普通に自分が使ってみたいアプリ

割と勉強寄りな理由です。
仕事でメインで使っている言語がPHPなので、早く馴染みたいなと思ってるのが結構大きいです。
それと、設計の経験値をもっとバリバリ貯めて、綺麗な拡張しやすいコード書けるようになりたいと思ってます。

ロードマップ

  • 1 ~ 2月: パーフェクトPHPOOPの勉強
  • 3月 Laravel
  • 4 ~ 5月 アプリ開発
  • 6月 デプロイ

雑すぎる気がする
とりあえず、今月はPHPOOPの勉強に注力して、その成果からもう少し詳細な計画に落とし込むことにします。

Vimを最小構成で起動する

プラグインごとの挙動の確認したい時や、素のVimの挙動確認したい時の方法を調べてたので、メモ。
Macでターミナルから使用することを想定してます。

コマンド

  • vim -N -u NONE -i NONE --noplugin
  • テスト用の.vimrcを読み込む場合は、vim -N -u ~/test.vimrc -i NONE --noplugin

各オプションの解説

  • -Nオプションは、nocompatibleオプションを設定する。nocompatibleがあることで、vi互換モードになるのを防ぎ、Vimの便利機能が使用できるようになる

  • -uオプションは、読み込みたい.vimrcのパスを記述する。NONEにすることで読み込まない設定にできる

    • -uで.vimrcを指定すると、nocompatibleオプションが自動的にはセットされなくなる。そのため-Nオプションと合わせて使うことが多い
  • -iオプションは、読み込みたい.viminfoのパスを記述する。-uオプションと同様に、NONEにすることで読み込まない設定にできる

    • viminfoとは前回操作時の情報が保存されているファイルで、コマンド履歴や検索履歴など記録されている
  • --nopluginオプションは、plugin scriptを読み込まないようにする

参考

雑記

Vim scriptテクニックバイブル~Vim使いの魔法の杖で、-U NONEというオプションもあったけれど、ヘルプなどでも見当たらなかった。
今は使われてないオプションなのだろうか・・・?