Amazon Linuxでセッションの取扱で苦戦したのでメモとして残す。
※今回の内容はAmazon Linuxとは関係ないかもしれないけれども、LAMPの環境のPHPの初期設定の注意点になるかもしれないので、OS名を晒しておく。
※LAMP = Linux + Apache + MySQL + PHP(or Perl or Python)の環境の略
環境
OS:Amazon Linux 2 AMI
Amazon Linux 2(セキュアなLinux環境でアプリを実行)| AWS
Apache:2.4.41
PHP:7.2.24
やりたかったこと
Googleにログインを介して、Google Analytics APIでアクセス解析のデータを取得したい。
Google Analytics APIの承認で苦戦したので、承認されるまでの流れをまとめてみた
データを取得する手順は、主の処理で
Googleにログインして、アクセストークンをセッションで管理する。
ログイン後に
<?php $cmd = "nohup php /path/to/dir/cmd.php セッションID > /dev/null &"; exec($cmd, $output, $result); var_dump($output); var_dump($result);
上記のようなコードで平行処理っぽくGoogle Analyticsからデータを取得することを試みた。
exec関数で実行するcmd.phpには下記のような処理を書いた。
cmd.php
<?php // $argv[1]にはセッションIDが格納されている session_id($argv[1]); session_start(); //Google Analytics APIの処理が続く
このコードでは何故かGoogle Analytics APIの処理が行われない。
主の処理の方の$outputや$resultの値を確認してもエラーが発生していない。
主の方でGoogle Analytics APIの処理を追加すると正常に動作するので、セッションが使えないというわけではない。
何が原因なのか?
phpinfo()でセッション周りの設定値を確認してみると、
session.save_pathの値がLocal Valueでは「/var/lib/php/session」となっており、Master Valueでは「no value」となっていた。
主の処理のexec関数でコマンドを実行する際に渡すセッションIDを元に、/var/lib/php/session以下のディレクトリを確認してみると、sess_セッションIDのファイルが生成されていた。中身を確認しても、Googleログイン時のアクセストークンが格納されている。
cmd.phpの方でsess_セッションIDが読み込めないとアタリを付けて、
<?php $path = session_save_path(); if(!strlen($path)) session_save_path("/var/lib/php/session"); // $argv[1]にはセッションIDが格納されている session_id($argv[1]); session_start(); //Google Analytics APIの処理が続く
セッションの保管ディレクトリのパスが空だった場合はLocal Valueの値を挿入するという処理を追加したら、無事にcmd.phpの方でGoogle Analyticsのデータを取得できるようになった。
php.iniでsession.save_pathのMaster Valueの値を設定したら解決するかもしれないけれども試していない。