それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

nginx で特定の拡張子をphpで処理する(SetHandler代替)

特定の拡張子をphpなどで処理する

css や js だけじゃなく 画像などをphpで処理したい。Apacheだと addhandler / sethandler で出来るアレ。nginx でもやろうかなと。

画像のリクエストログやリサイズをWebサーバーでやってるとかったるいので、phpで処理してキャッシュ制御すれば楽だよね。セッションチェックとかさ。

nginx での設定例

拡張子php と zip を php-fpmに飛ばしている例。

    location ~ \.(php|zip)$ {
      include fastcgi_params;
      fastcgi_param PATH_INFO $fastcgi_path_info;
      fastcgi_param SCRIPT_FILENAME /var/www/example.com/public/info.php$fastcgi_script_name;
      fastcgi_split_path_info ^(.+\.php)(/.+)$;
      fastcgi_pass unix:/path/to/php-fpm.sock;
    }

ポイント

SCRIPT_FILENAME の指定 。

php の場合は SCRIPT_FILENAME を使ってPATHINFOで実行するファイルを指定することが出来て、これをphp-fpm経由にしてあげれば、任意のファイルを好きなファイルで処理できる。便利。

PATHINFOで取得した場合

$_SERVER['ORIG_SCRIPT_FILENAME']
$_SERVER['ORIG_SCRIPT_NAME']

リクエストされたファイル名

$_SERVER['PATH_TRANSLATED']

php-fpm で php.iniの設定渡す/display_errorsなどをPHP_VALUEで設定する。

PHP_FLAGを使いたい。

apache の mod_phpapachefcgiなら簡単にできるんだけど、nginxだとfcgiでどうやって 初期設定を渡したら良いんだろうか。

こうすれば出来る。

fastcgi_param PHP_FLAG "display_errors=on \n display_startup_errors=on";
fastcgi_param PHP_VALUE "error_reporting=-1";

php をfpm で設定するときに、在るサイトだけ display_errors をオンにしたいとか在るんですよ。

日本語でググっても php-fpm.ini のグローバル設定を変えろ的な記事しかなかったので、アレコレ調べた。

サイトごとにエラー設定を変える。

トラブルが出ているサイトを一時的にdisplay_errors して見てみるとか。

デプロイ時だけエラーになってなんだコレ??ってphpのエラーを追いかけるときかに便利。

サイトごとのエラーログが便利。

fastcgi_param PHP_VALUE  "error_log=/var/log/nginx/my-site.error.log"

複数書きたいときは改行

改行で書くのが楽でいいよ。スペース区切りはダメ。

    fastcgi_param   PHP_VALUE "
        display_errors=on
        display_startup_errors=on
        error_reporting=E_ALL
        error_log=/var/log/nginx/comic-viewer.error.log";

または Name=Value\nName=Value にする.

だめな例

  fastcgi_param   PHP_VALUE "display_errors=on";
  fastcgi_param   PHP_VALUE "display_startup_errors=on";

PHP_VALUE は1つしか取ってくれない。 (そのうちに、nginxやphp-fpmのバージョンアップで解決するんじゃないかな。

ただし再起動が必要

 sudo systemctl restart  nginx php7.0-fpm

fpm の再起動をすると設定が反映される。再起動をしなくてもキャッシュが消えたら反映されると思うけど、php-fpmのキャッシュ機構は多分複雑だろうから追いかけ用途思っても時間が足りなくて出来てない。

前の記事

nginx + php-fpm で display_startup_erros=on にしてシンタックスエラーを表示する。 - それマグで!

PHP

phpで別アプリへのセッション受け渡し

php から別のアプリへセッションを受け渡したい

認証済みのセッションキーを、別のアプリへ受け渡ししたい。今回は mp4 と vlc でテストした。

渡す時

<?php
$url = 'http://example.com/sample.mp4';
$uri = "${uri}&PHPSESSID=".session_id();
$url = 'vlc-x-callback://x-callback-url/stream?url=$url'
header("Location: {$uri}");

受け取る時

ini_set("session.use_trans_sid",true;)
session_start();

フレームワークのサポートも、GET引数のチェックも何も要らない。便利。

引数の名前

デフォルトは "PHPSESSID" なので、ソレを入れても良い。 厳密にやるなら session_name()を使う。

$uri = "${uri}&".session_name()."=".session_id();
$uri = "${uri}&sid=".session_id();

サンプル

<?php

// これだけ
ini_set("session.use_trans_sid",true);
ini_set('session.use_only_cookies', 'off');
session_start();

if ( !empty($_SESSION['is_login']) && $_SESSION['is_login'] ) {
  echo "OK";
  http_response_code(200);
  return ;
}else{
  echo "OK";
  http_response_code(401);
  return ;
}

参考資料

http://php.net/manual/en/session.idpassing.php

セッション

ハンマーセッション!(7) (週刊少年マガジンコミックス)

ハンマーセッション!(7) (週刊少年マガジンコミックス)