- 投稿日:2019-05-29T23:57:39+09:00
[PHP]セッションの有効期限が切れてもセッションが消えるわけじゃない。
session.gc_maxlifetimeの設定だけでは不十分
よくありがちな30分間操作がなければセッションを無効にする、といった処理。
セッションの有効期限(session.gc_maxlifetime)を30分に設定するだけでいいんじゃない?と思っていました。ini_set('session.gc_maxlifetime', 1800);https://php.net/manual/ja/session.configuration.php#ini.session.gc-maxlifetime
session.gc_maxlifetime は、データが 'ごみ' とみなされ、消去されるまでの秒数を指定します。 ガベージコレクション (ごみの収集) は、 セッションの開始時に行われます (session.gc_probability と session.gc_divisor に依存します)。
https://www.php.net/manual/ja/session.configuration.php#ini.session.gc-divisor
session.gc_divisorと session.gc_probabilityの組み合わせで すべてのセッションの初期化過程でgc(ガーベッジコネクション)プロセス も始動する確率を制御します。確率は gc_probability/gc_divisor で計算されます。例えば、1/100は各リクエスト毎に1%の確率でGCプロセスが 始動します。 session.gc_divisorのデフォルトは100です。
つまり、実際に削除(ガベージコレクション)が行われるのは次回のsession_start()時。かつ、デフォルトであれば1/100の確立。
また、この方法では有効時間が伸びない場合もあるようです。理由は後述。
毎回破棄したい場合
ini_set('session.gc_probability', 1); ini_set('session.gc_divisor', 1);https://www.php.net/manual/ja/function.session-gc.php
PHPは、デフォルトで確率ベースのセッション GC を行います。
確率ベースの GC は多少は機能しますが、いくつかの問題があります。 1) トラフィックが少ないサイトのセッションデータは、優先期間内に削除されないことがあります。 2) トラフィックの多いサイトでは、GC が頻繁になる可能性があります。 3) ユーザーの要求の際に GC が実行され、ユーザーは GC 遅延を感じます。ただこの方法だと上記の3)のように処理が重たくなることもあるようです。
自分でスクリプトを書いた方がいいかも。有効時間が伸びない場合
https://www.php.net/manual/ja/session.configuration.php#ini.session.gc-maxlifetime
注意: 異なる値を session.gc_maxlifetime に指定している 別々のスクリプトがセッションデータの保存場所を共有している場合、 一番小さい設定値に達した時点でデータが消去されます。このような場合には、 お互いに session.save_path を使用します。
複数のアプリケーションなどでセッションファイルの保存場所が同じ場合には、一番小さい設定値になってしまうようです。
この場合はsession.save_pathでセッションファイルの保存場所を変更する必要があります。参考
セッションの有効期間とか設定とか挙動とかを調べました
[php]ログインセッションの維持・有効期間について (session,cookie)
PHP のセッションに関する覚え書き
- 投稿日:2019-05-29T23:44:48+09:00
php-master-changes 2019-05-28
今日は JIT の修正、opcache の func_info の修正、opcache 最適化器の修正、libzip の検出に失敗する場合がある問題の修正、テストの並列実行対策、phpinfo() 関連コードの ZEND_COLD 指定、PHP 8 の ZPP エラー例外化で不要になったコードの削除、組み込み関数の一部に返り値型情報の追加、引数なしでの array_merge() / array_merge_recursive() が空配列を返すようにする修正、不要な zval コピーの削減、FFI で get/set オブジェクトハンドラを利用しないようにする修正、
2019-05-28
nikic: BIND_STATIC of implicit binding may be undef
- https://github.com/php/php-src/commit/fd23f9104a9772234a3469e341500cf1b9503f63
- [7.4~]
- アロー関数の JIT コンパイルの修正
- ZEND_BIND_STATIC は関数内の static 変数の利用時、ローカル変数扱いのポインタっぽい zval へ関数の op_array に紐づく静的変数テーブルから変数の実体を紐付けるよーな処理
- ZEND_BIND_IMPLICIT は元々アロー関数での暗黙的束縛用に ZEND_BIND_LEXICAL で extended_value に使うフラグだったが、ZEND_BIND_STATIC でもアロー関数時に付けるようにし、 opcache 側での型推論時に MAY_BE_UNDEF を付ける材料にしているもよう
nikic: Remove special handling of zero-arg funcs in func_info
- https://github.com/php/php-src/commit/a1284b4241ddfe30ee31058c2d44acf03df7aafc
- ext/opcache で、引数なし関数の func_info での特別扱いをやめた
- PHP 8 では変な引数で呼び出すと常時例外なのでいらないということらしい
paresy: Fixed bug #76345
- https://github.com/php/php-src/commit/a0c9d0849aa5e53c37f8fd68db80412364e8edaf
- [7.2~]
- ext/zip で、libzip の検出に失敗する場合がある問題の修正
cmb69: Prevent parallel test conflicts
- https://github.com/php/php-src/commit/c12d474653c6d10cd74391943bdb7af4509ed2d3
- [7.4~]
- ext/sockets で、テストで利用するポートをずらして並列実行対策
dstogov: Put phpinfo() related code into cold code segment
- https://github.com/php/php-src/commit/072f28938f1c8860432c22c03ce7bdc7e8112e61
- [7.4~]
- phpinfo() 関連のコードを ZEND_COLD 指定
- わりと真剣にこのみみっちい最適化の効果を知りたい(ちりつもなんだろうけど)
nikic: zend_func_info: Remove unnecessary type callbacks
- https://github.com/php/php-src/commit/bd4c9bce680b82fc31b84d82d7f272e02e15d4fa
- ext/opcache で、PHP 8 の ZPP エラー例外化で不要になったコードの削除
nikic: Add return type information to some ext/standard functions
- https://github.com/php/php-src/commit/521a919caf21f5c924539a9faeaaa8c2f6fb3096
- ext/standard な組み込み関数の一部に返り値型情報を追加
dtakken: Allow array_merge() / array_merge_recursive() without arguments
- https://github.com/php/php-src/commit/77cf3d7b1100dbb2b441b2a75f21b4e8ee0cb9b1
- [7.4~]
- 引数なしでの array_merge() / array_merge_recursive() が空配列を返すよう修正
array_merge(...$arrays)
とかやる際に便利- PR:4175
nikic: Remove FUNC_MAY_WARN
- https://github.com/php/php-src/commit/812665844426986145ffbf01bc7ff43fa09e4517
- ext/opcache で、FUNC_MAY_WARN フラグの削除
dstogov: Fixed register allocation
- https://github.com/php/php-src/commit/38c75f8fd3f286e097755402ee62a45f856748e9
- ext/opcache/jit で、レジスタ割り当ての修正
nikic: Update MAY_BE_NULL func_info for Zend functions
- https://github.com/php/php-src/commit/1493c735821a2271081ac111d64f2aeb8bf23b65
- ext/opcache で、PHP 8 で null を返さなくなる関数について func_info から MAY_BE_NULL を削除
nikic: Update MAY_BE_NULL for parts of ext/standard
- https://github.com/php/php-src/commit/d95c15e3717ad909a3e4736c4e26ee7a9331d7e1
- ext/opcache で、PHP 8 で null を返さなくなる関数について func_info から MAY_BE_NULL を削除
dstogov: Avoid double copying
nikic: Update MAY_BE_NULL info for more ext/standard functions
- https://github.com/php/php-src/commit/0d79c70cf3c10f60a2e8fbfd68903d8716b7b43c
- ext/opcache で、PHP 8 で null を返さなくなる関数について func_info から MAY_BE_NULL を削除
nikic: hebrev/hebrevc: Don't return false for empty string
- https://github.com/php/php-src/commit/4da316d18991ff4dbe0a7315045f7928d66a4381
- hebrev()、hebrevc() に空文字列を渡した際 false を返さないよう修正
- ext/opcache で、func_info の方も修正
nikic: Revert accidental changes
- https://github.com/php/php-src/commit/7791784bc9229433f03b0529a61c8e843a30c8ea
- ext/opcache で、func_info から MAY_BE_FALSE を誤って落としていた部分を復旧
nikic: JIT: Fix SWITCH_LONG/STRING codegen with exact type
- https://github.com/php/php-src/commit/0bd1fc225d90c5b0a002e201f2b2ca1d7e93bc35
- ext/opcache/jit で、switch のジャンプテーブル生成が誤っていたのを修正
nikic: SCCP: Don't perform partial object propagation for typed props
- https://github.com/php/php-src/commit/6893f1f98e1c73d4eece1827f0dc4fedc059a67d
- [7.4~]
- ext/opcache で、SCCP 最適化で型付プロパティについて代入の伝搬をやらないよう修正
dstogov: Avoid usage of internal get/set object handlers. They are going to be removed in PHP-8.
- https://github.com/php/php-src/commit/6738241aece97979bdb7531babcfdf12e3c4b45b
- [7.4~]
- ext/ffi で、PHP 8 で削除される get/set オブジェクトハンドラを利用しないよう修正
- FFI 経由でのスカラ値へのアクセスは cdata プロパティを通して行うようになる
nikic: SCCP: Fix handling of ASSIGN_OBJ_REF
- https://github.com/php/php-src/commit/f19dd674e012639f8511ff2e531f24e74ef701ac
- [7.4~]
- ext/opcache で、SCCP 最適化で型付プロパティへの参照については代入の伝搬をやらないよう修正
nikic: Fix type inference of SEND_UNPACK with empty array
- https://github.com/php/php-src/commit/59dfaa3f99b9be8b0848fe7bafce3c52a821a1fc
- [7.2~]
- ext/opcache で、空配列での SEND_UNPACK の型推論を修正
- 投稿日:2019-05-29T22:59:40+09:00
laravel-バリデーション正規表現(パイプ「|」利用)(頭が0つきの数字)
バリデーション時に、正規表現のパイプを利用し、00、01、02、0、1、2の値のみを通すようなバリデーションを作成しようと思います。
php$this->validate($request, [ 'number' =>['required', 'regex:/^([0-2]|0[0-2])$/']; ]);パイプを使う際は、'required|regex:/^([0-2]|0[0-2])+$/'と一行で、バリデーションルールを書いてしまうと、Laravel上だと、バリデーションごとにパイプを挟んでいるため、正規表現の中のパイプが他のバリデーションルールに切り替わったのかなとLaravelは判断するため、エラーになってしまいます。そのため、配列で一つずつ指定してあげる必要があります。
/^([0-2]|0[0-2])$/は「^」が行頭、「\$」が行末、パイプがor、[]は○○から○○まで、つまり0~2までもしくは、00~02となります。
前書いた正規表現記事
参考にさせていただいた記事-laravelバリデーション正規表現パイプ
- 投稿日:2019-05-29T22:46:12+09:00
PhpStorm-DB接続(MySql)
右上にあるDatabaseをクリック
画像のようにMySqlをクリック
画像のように
・Name (なんでもいい)
・Host (僕の場合Docker使用のため)
・User (Mysqlにログインできるユーザー)
・Password (Mysqlにログインできるユーザーのパスワード)
DriverFileがなければ、画像のような表示が出てきますので、Downloadボタンをクリック
完了し、パスワードが消えていたら、もう一度打ち直し、Test Connectionボタンをクリック
接続が完了すると、以下のように表示されます。
もう一度、Databaseを開き、0 of 7をクリックし、表示させたいDBのチェックボックスにチェックを入れる。
下記のように表示されました。DBの中身、テーブルの中身(カラムとデータ)も見ることができます。また、+ボタンを押下し、その中のConsoleをクリックすると、Console画面が開き、そこでクエリを書くと「Ctrl」+「Enter」で実行することができます。
- 投稿日:2019-05-29T22:43:21+09:00
0から始めるPHP:1日目
本日の目標
定数や変数を扱えるようになる。
定数
定数とは、定数である。つまり、ずっと同じ値を保つ。最初に定義したら、あとは中身は変わらない。
関数
define()
を用いて、定数を定義してみる。
defという定数を作り、その中にHelloを入れる。<?php define("def","Hello"); print(def); ?>define("定数の名称",”定数の中身”) といったように書く。
実際に定義ができているか確認のため、関数print()
で出力してみる。変数
変数とは、定数との逆で何かしら操作すると値が変わる。
PHPでは、変数を定義するときに型を指定する必要がなく、勝手にやってくれる(多分)
今回は例として整数の変数を定義してみる。<php $var = 0; ?>$変数名 = 代入する値 というよに書く。
変数の型は整数以外にも文字列や、論理型などがある。本日の成果
定数と変数の意味を理解して、定義できるようになった。
- 投稿日:2019-05-29T22:17:54+09:00
0から始めるPHP
目的
独学でPHP言語を勉強し、何を勉強したかを記事にしていきます。
誰の役に立つか分かりませんが...備忘録として書いていくので、雑かもしれませんが悪しからず・・・環境
MAMPサーバでPHPを実行します。
エディタはBBeditのフリー機能のみで。PHPの書き方
<?php ?>PHPは基本的に
<?php
と>
の間に、関数やらなんやら記述する。文字列の出力
とりあえず、動かしてみよう
print()
関数でHello Worldを表示させる。<?php print("Hello World"); ?>文字列の出力には、他にも
printf()
やecho()
といった関数がある。
それぞれの関数の仕様については後ほど、まとめる。(maybe...)改行の仕方
改行したい!というときには文末に
<br>\n
といれる。<?php print("Hello World<br>\n"); ?>これで改行ができた。
本日の成果
関数
print()
、printf()
、echo()
を用いて、文字列を出力できた
- 投稿日:2019-05-29T22:17:54+09:00
0から始めるPHP:0日目
目的
独学でPHP言語を勉強し、何を勉強したかを記事にしていきます。
誰の役に立つか分かりませんが...備忘録として書いていくので、雑かもしれませんが悪しからず・・・環境
MAMPサーバでPHPを実行します。
エディタはBBeditのフリー機能のみで。PHPの書き方
<?php ?>PHPは基本的に
<?php
と>
の間に、関数やらなんやら記述する。文字列の出力
とりあえず、動かしてみよう
print()
関数でHello Worldを表示させる。<?php print("Hello World"); ?>文字列の出力には、他にも
printf()
やecho()
といった関数がある。
それぞれの関数の仕様については後ほど、まとめる。(maybe...)改行の仕方
改行したい!というときには文末に
<br>\n
といれる。<?php print("Hello World<br>\n"); ?>これで改行ができた。
本日の成果
関数
print()
、printf()
、echo()
を用いて、文字列を出力できた
- 投稿日:2019-05-29T18:41:09+09:00
PHPのタイプヒントでbooleanを指定しているのにbooleanを指定しろと言われるんだが
問題のコード
type_hint.php<?php class Main{ public function type_hint_boolean(boolean $arg){ var_dump($arg); } public function type_hint_integer(integer $arg){ var_dump($arg); } } $main = new Main(); $main->type_hint_boolean(true); $main->type_hint_integer(1);出力
PHP Fatal error: Uncaught TypeError: Argument 1 passed to Main::type_hint_boolean() must be an instance of boolean, boolean given,
must be an instance of boolean, boolean given
booleanじゃなきゃいけないのにbooleanが渡されました???
ちなみにintegerの場合は以下のエラーmust be an instance of integer, integer given解答
boolean
やinteger
はタイプヒントでは使えずbool
,int
で指定する必要があるtype_hint.php<?php class Main{ public function type_hint_bool(bool $arg){ var_dump($arg); } public function type_hint_int(int $arg){ var_dump($arg); } } $main = new Main(); $main->type_hint_bool(true); $main->type_hint_int(1);出力
bool(true) int(1)解説
boolean
やinteger
を指定するとその名前のクラスのインスタンスのタイプヒントになってしまう
よって以下のコードは通るtype_hint.php<?php class Main{ public function type_hint_boolean(boolean $arg){ var_dump($arg); } public function type_hint_integer(integer $arg){ var_dump($arg); } } class boolean{ } class integer{ } $main = new Main(); $main->type_hint_boolean(new boolean()); $main->type_hint_integer(new integer());出力
object(boolean)#2 (0) { } object(integer)#2 (0) { }納得納得
参考
公式ドキュメント
PHP7調査(36)スカラ型のタイプヒントが書けるようになった
PHP: bool vs boolean type hinting
- 投稿日:2019-05-29T17:58:48+09:00
CentOS7でのSimpleSAMLphp環境構築
環境
・CentOS Linux release 7.5.1804 (Core)
・Apache/2.4.6
・PHP 5.6.40 ※後述
・SimpleSAMLphp 1.17.2SimpleSAMLphpとは?
シングルサインオンについて
Webサービスを利用するときにアカウントをを登録することが多いと思いますが、だいたいのサイトではIDとパスワードを登録してログイン時に入力することでユーザ認証を行うという流れだと思います。
この流れは良いのですが、利用するサービスが増えると登録して覚えておくべきIDとパスワードのセットも増えていき、ユーザの負担が大きい、パスワードを忘れてしまうことがある、同じパスワードを使い回してしまいセキュリティ的によろしくない、といった問題があります。この問題に対するアプローチの一つがシングルサインオンです。
シングルサインオンは、認証サーバ(IdP:Identity Provider)にアカウントを一つ登録しておき、その他のサービス(SP:Service Provider)へのアカウント登録の際にIdPのアカウントを利用してサインインするといったものです。よくある"Twitterでログイン"みたいなのもシングルサインオンですね。
SAMLについて
SAMLとはSecurity Assertion Markup Languageの略称で簡単に言うとシングルサインオンを実装するときに使う言語の一種です。
SimpleSAMLphp
今回題材としているSimpleSAMLphpとは、シングルサインオンを実装するためのSAMLベースのオープンソースソフトウェアです。リファレンスが英語のみで、実際に使用方法などを記述したサイトなども少なく、バージョンの違いなんかで動かなくなるようなちょっとトリッキーなものではありますが、シングルサインオンを実装するには非常に便利です。
今回は、IdPとSPそれぞれの環境構築と連携までを行います。CentOS初期設定
こちらの記事が参考になります。
VirtualBoxを使うならssh接続できたほうがいろいろと便利なので…。
https://qiita.com/ebkn/items/751ed657629ba8d4ab0aSimpleSAMLphp環境構築
こちらの記事が参考になります。
https://qiita.com/haya43/items/c74d2710cd9b57d2cbb4だいたいこの通りにやればうまくいきますが筆者が少々躓いたのとIdPの設定が少しことなっていることから加筆しながらなぞっていく形になります。
CentOSの設定
参照した記事ではIPアドレスなどいろいろコマンドラインで設定していますが、ssh接続の記事で設定しているので今回は無視します。
hostnameは変えておくとのちのちわかりやすいので変えておきます。# nmcli general hostname <変更するhostname> # systemctl restart systemd-hostnamed簡単に説明しておくとhostnameはいま設定しているVMの名前で、ウェブサイトとしてアクセスする際のURLになるのでわかりやすいものを付けるといいです。SPならばsp.local、IdPならばidp.localのようにしておくとURLを見ただけでSPかIdPか判別できます。
ssh接続してローカル環境のブラウザからアクセスする際には、ファイヤーウォールを停止しておかないとアクセスできないので停止しておきます。
# systemctl stop firewalld # systemctl disable firewalldアクセス制御の設定などをいい感じに設定できると停止しなくても良さそうですが、とりあえずアクセスできるようになることを目標とします。CentOSのVMをGUI起動して、VM内のブラウザからアクセスする場合はファイヤーウォールが起動していてもアクセスできたと思うので参考までに。
SELinuxを無効化します。
# vi /etc/selinux/configetc/selinux/config#SELINUX=enforcing SELINUX=disabledロケールを変更します。
# localectl set-locale LANG=ja_JP.utf8OSを再起動します。
# rebootApacheとPHPのインストール
Apache
# yum install -y httpd # systemctl start httpd # systemctl enable httpdブラウザからhttp://<設定したhostname>/にアクセスしてApacheのデフォルトページが表示されたらOK。
PHP
# yum -y install php php-mbstring # vi /etc/php.iniphp.ini;;;;;;;;;;;;;;;;;;;;;; ; Dynamic Extensions ; ;;;;;;;;;;;;;;;;;;;;;; extention=mbstring.so #追記# yum -y install php-xml # systemctl restart httpdテストページを作る。
# vi /var/www/html/phpinfo.phpphpinfo.php<?php phpinfo(); ?>http://<設定したhostname>/phpinfo.phpにアクセス、PHPのバージョン情報が表示されればOK。
SimpleSAMLphpインストール
wgetコマンドで入れます。
wgetコマンドがないよとエラーが出たらyumでインストール。# yum -y install wgethttps://simplesamlphp.org/download から最新のパッケージのリンクをコピーしてwgetのあとに入力してダウンロードします。先にSimpleSAMLphpのファイルを展開したいディレクトリに移動しておくといいかも。今回は/var/www/配下に展開するので先にcdコマンドで移動しておきます。
# cd /var/www # wget https://simplesamlphp.org/download?latestダウンロードしたファイルを展開
# tar xvf download?latest展開したファイルはsimplesamlphp-1.XX.XXみたいなファイル名になっていると思うのでわかりやすいように変更しておきます。
# mv simplesamlphp-1.XX.XX simplesamlHTTPS設定
参照先の記事まんまなので簡単にいきます。
mod_sslをインストール
# yum -y install mod_ssl秘密鍵・証明書等作成
# cd /etc/pki/tls/private/ # openssl genrsa -aes128 1024 > server.key Generating RSA private key, 1024 bit long modulus ..................++++++ ..........................................++++++ e is 65537 (0x10001) Enter pass phrase:(パスフレーズ) Verifying - Enter pass phrase:(同じパスフレーズ) # cd /etc/pki/tls/private/ # openssl req -new -key server.key > server.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:JP State or Province Name (full name) [Some-State]:Tokyo Locality Name (eg, city) []:空白 Organization Name (eg, company) [Internet Widgits Pty Ltd]:空白 Organizational Unit Name (eg, section) []:空白 Common Name (eg, YOUR name) []:設定したhostname Email Address []:空白 Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:空白 An optional company name []:空白 # cd /etc/pki/tls/private/ # openssl x509 -in server.csr -days 36500 -req -signkey server.key > /etc/pki/tls/private/server.crt Signature ok subject=/C=JP/ST=Tokyo/L=Hoge/O=Hoge Ltd/OU=Hoge/CN=sp.local Getting Private key Enter pass phrase for server.key:(上記で指定したパスフレーズ) # mv server.key server.key.bak # openssl rsa -in server.key.bak > server.key Enter pass phrase for server.key.back:(パスフレーズ) writing RSA keyここまでで秘密鍵と(オレオレ)証明書ができました。
さらに設定ファイルを編集# vi /etc/httpd/conf.d/ssl.confListen 443 https (中略) <VirtualHost _default_:443> SetEnv SIMPLESAMLPHP_CONFIG_DIR /var/www/simplesaml/config # 追記 # General setup for the virtual host, inherited from global configuration DocumentRoot "/var/www/simplesaml/www" # 編集 Alias /simplesaml "/var/www/simplesaml/www" # 追記 ServerName <設定したhostname>:443 # 編集 (中略) # SSL Protocol support: # List the enable protocol levels with which clients will be able to # connect. Disable SSLv2 access by default: SSLProtocol -all +TLSv1.2 # 編集 (中略) # Server Certificate: # Point SSLCertificateFile at a PEM encoded certificate. If # the certificate is encrypted, then you will be prompted for a # pass phrase. Note that a kill -HUP will prompt again. A new # certificate can be generated using the genkey(1) command. SSLCertificateFile /etc/pki/tls/private/server.crt # 編集 # Server Private Key: # If the key is not combined with the certificate, use this # directive to point at the key file. Keep in mind that if # you've both a RSA and a DSA private key you can configure # both in parallel (to also allow the use of DSA ciphers, etc.) SSLCertificateKeyFile /etc/pki/tls/private/server.key (中略) # 最後に追記 <Directory /var/www/simplesaml/www> <IfModule mod_authz_core.c> Require all granted </IfModule> </Directory> </VirtualHost>simplesamlディレクトリを置いた場所が/var/www/でない場合や、秘密鍵などを違うディレクトリに置いた、違う名前にしたような場合は適宜変更してください。
最後にapacheを再起動# systemctl restart httpdhttps://<設定したhostname>/simplesamlにアクセスしてSimpleSAMLphpの設定ページが表示されたらOK。
設定ページが表示されない場合
httpsではなくhttpでアクセスしていませんか?筆者も間違えてhttpでアクセスして表示されないという壁に直面しましたが、当時全く気が付かなかったので別の方法で対処しましたので以下に記します。参考までに。
httpd.confを編集
ssl.confはhttps(443ポートアクセス)の設定ファイルであり、/simplesamlが見つかりませんというエラーの場合ここで解決されることが多い。/simplesamlはエイリアスを設定しているのでこのエイリアス設定をhttp(80番ポートアクセス)の設定ファイルに書けばよいという寸法(?)
# vi /etc/httpd/conf/httpd.confhttpd.conf(設定ファイルの末尾に以下を追記) Alias /simplesaml /var/www/simplesaml/www <Directory /var/www/simplesaml/www> <IfModule mod_authz_core.c> Require all granted </IfModule> </Directory>Apacheを再起動して再びブラウザアクセスしてみると(おそらく)表示できると思います。
ここまでできたら次はSPとIdPの構築になりますが長くなってきたので次の記事で書こうと思います。出来次第リンクを貼ります。
- 投稿日:2019-05-29T16:06:00+09:00
PDOでPostgresqlから大量のデータをSELECTする(メモ)
何も考えずに70万件くらいのテーブルから全データSELECTしたらメモリが足りなくなってしまいました。(当然)
結論
メモリがたりない$selectSql = "SELECT * FROM でかいテーブル"; // query() すると結果のデータがPHPのメモリに乗ってしまい、メモリが足りない。 $statement = $this->query($selectSql); while($row = $statement->fetch(PDO::FETCH_ASSOC)){ //なんなりと }だいじょうぶ$selectSql = "SELECT * FROM でかいテーブル"; // 以下オプション付きでprepareすればOK。 $statement = $this->pdoSource->prepare($selectSql,[PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]); // 実行 $statement->execute(); //第二引数はデフォルト値と同じなので、省略しても良い while($row = $statement->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT)){ //なんなりと }感想
パラメタの無い単なるSELECT文をプリペアドステートメントで実行するという発想がなかった。。
注意点
//prepare の場合、rowCount() が取れない $selectSql = "SELECT * FROM でかいテーブル"; $statement = $this->pdoSource->prepare($selectSql,[PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]); $statement->execute(); $statement->rowCount();//0件参考
https://www.php.net/manual/ja/pdo.prepare.php
https://www.php.net/manual/ja/pdostatement.fetch.php
- 投稿日:2019-05-29T16:02:44+09:00
EC-CUBE4でmigrationを使いこなす
EC-CUBE4でmigrationを利用してデータベースを更新します。
composer install
するとmigration機能がインストールされているはずなので、そのまま利用します。テーブル追加・スキーマ更新
テーブル追加やスキーマの更新の場合はEntityを追加・修正し、コマンドを実行するだけです。
このあたりの説明は公式ドキュメントに記載されているので、こちらをご覧ください。
http://doc4.ec-cube.net/customize_entity
レコード追加
ファイル作成
INSERT文を実行するMigrationファイルを作成します。
EC-CUBEのルートディレクトリで下記コマンド実行します。
$ bin/console doctrine:migrations:generate Generated new migration class to "/var/www/html/app/DoctrineMigrations/Version20190529032556.php"記載されているファイルを編集します。
<?php declare(strict_types=1); namespace DoctrineMigrations; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; /** * Auto-generated Migration: Please modify to your needs! */ final class Version20190529063256 extends AbstractMigration { public function up(Schema $schema) : void { // this up() migration is auto-generated, please modify it to your needs } public function down(Schema $schema) : void { // this down() migration is auto-generated, please modify it to your needs } }upメソッドにINSERT文、downメソッドにINSERTしたレコードを削除するDELETE文を記載します。
<?php declare(strict_types=1); namespace DoctrineMigrations; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; /** * Auto-generated Migration: Please modify to your needs! */ final class Version20190529032556 extends AbstractMigration { public function up(Schema $schema) : void { // ギフト $sql =<<<EOL INSERT INTO dtb_csv (csv_type_id, entity_name, field_name, reference_field_name, disp_name, sort_no, enabled, create_date, update_date, discriminator_type) SELECT 4, 'Eccube\\\Entity\\\OrderItem', 'Gift', 'name', 'ギフト', max(sort_no) + 1, 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'csv' FROM dtb_csv WHERE csv_type_id = 4; EOL; $this->addSql($sql); } public function down(Schema $schema) : void { // ギフト $sql =<<<EOL DELETE FROM dtb_csv WHERE disp_name = 'ギフト'; EOL; $this->addSql($sql); } }実行
下記コマンドを実行すると
up
メソッドの処理が実行されます。
bin/console doctrine:migrations:migrate [日付]
※[日付]:クラス名に記載されている日付$ bin/console doctrine:migrations:migrate 20190529032556 Application Migrations WARNING! You are about to execute a database migration that could result in schema changes and data loss. Are you sure you wish to continue? (y/n)y # yを入力 Migrating up to 20190529032556 from 20181109101907 ++ migrating 20190529032556 -> INSERT INTO dtb_csv (csv_type_id, entity_name, field_name, reference_field_name, disp_name, sort_no, enabled, create_date, update_date, discriminator_type) SELECT 4, 'Eccube\Entity\OrderItem', 'Gift', 'name', 'ギフト', max(sort_no) + 1, 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'csv' FROM dtb_csv WHERE csv_type_id = 4; ++ migrated (0.04s) ------------------------ ++ finished in 0.04s ++ 1 migrations executed ++ 1 sql queries元に戻す
元に戻したい場合は下記コマンドを実行します。
down
メソッドの内容が処理されます。
bin/console doctrine:migrations:execute [日付] --down
※[日付]:クラス名に記載されている日付$ bin/console doctrine:migrations:execute 20190529032556 --down WARNING! You are about to execute a database migration that could result in schema changes and data lost. Are you sure you wish to continue? (y/n)y # yを入力 -- reverting 20190529032556 -> DELETE FROM dtb_csv WHERE disp_name = 'ギフト'; -- reverted (0.04s)
- 投稿日:2019-05-29T12:35:50+09:00
Wordpress 投稿画面で Advanced Custom Fields の関連記事をソートする
日付で新しい順(DESC)にしたい場合
functions.php/* 関連記事の調整 */ add_filter( 'acf/fields/relationship/query', 'custom_acf_relationship_query', 10, 3 ); function custom_acf_relationship_query( $args, $field, $post_id ) { $args['orderby'] = 'post_date'; //投稿日付順 $args['order'] = 'DESC'; //新しい順 return $args; }今開いている投稿を除外する場合
functions.php/* 関連記事の調整(開いている投稿を除外) */ add_filter( 'acf/fields/relationship/query', 'custom_acf_relationship_query', 10, 3 ); function custom_acf_relationship_query( $args, $field, $post_id ) { $args['post__not_in'] = array( $post_id ); //今開いている投稿を除外 $args['orderby'] = 'post_date'; //投稿日付順 $args['order'] = 'DESC'; //新しい順 return $args; }参考
https://www.nxworld.net/wordpress/wp-acf-custom-relationship-query-exclude-post.html