Amazon Linuxでセッションの取扱で苦戦したのでメモとして残す。

※今回の内容はAmazon Linuxとは関係ないかもしれないけれども、LAMPの環境のPHPの初期設定の注意点になるかもしれないので、OS名を晒しておく。

※LAMP = Linux + Apache + MySQL + PHP(or Perl or Python)の環境の略

LAMP - Wikipedia


環境

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からデータを取得することを試みた。

PHPで並行処理


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の値を設定したら解決するかもしれないけれども試していない。