Twigの小技まとめ

文字列省略(Twig1.6以降)

 

HTML参照文字エスケープ

 

リプレース

 

改行文字をbrに

 

ループ

 

ループの中で使える便利なやつ

 

正規表現マッチング

 

その他は随時更新。

 

参考URL)

  •  https://hrroct.hatenablog.com/entry/2017/04/28/184032
  • https://qiita.com/assa/items/4fef2f3abd95248ed626
  • https://twig.symfony.com/doc/2.x/filters/replace.html
  • https://tetra-themes.com/eccube3-dump-498/
  • http://www.tomcky.net/entry/2018/02/08/010639
  • http://mononofu.hatenablog.com/entry/20111209/1323431291

EC-CUBEでhreflangタグを設置する

Googleが推奨するhreflangタグ。SEO効果はほとんどないみたいだが、サーチコンソールに出るのが嫌な場合は対策が必要。

タグを設置するのは簡単だが、このタグはサイトごとではなくページ単位で有効なタグなので、ページ毎に設置する必要がある。その為、下層のページにはその下層のページのURLで設置する必要がある。

EC-CUBEの場合は、site_frame.tplに下記のように書くことで、下層を含む全ページに対応可能。(例では言語は’ja’のみ)

/data/Smarty/templates/default(またはsphoneなど)/site_frame.tpl

 

参考URL)

 

EC-CUBE2系+PHP5.4でファイル管理を開くとエラーになる場合の対処

エラーの発生条件

  • EC-CUBE2.13.2
  • PHP5.4

管理画面で、「コンテンツ管理」→「ファイル管理」を開くと、下記のエラーがでる。

 

どうやらPHP5.4から、関数のパラメータにスーパーグローバル変数と同じ名前の変数を使用することができなくなったことが原因らしい。

「data/class/pages/admin/contents/LC_Page_Admin_Contents_FileManager.php」を修正して対処する。

 

(参考サイト:https://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=10792&forum=9&post_id=50986

サブドメインで公開していたバーチャルホストをaliasを使ってメインサイトの配下に配置する

例えば、

  • www.hoge.com →サービスのメインサイト
  • help.hoge.com →サービスのヘルプサイト(バーチャルホスト)

のような形で運用していたものを、ファイル構成などを変更せず、

  • www.hoge.com
  • www.hoge.com/help

のように、メインサイト配下に内包して見せたい場合。主にSEO対策。

 

まず、help.hoge.comのapache設定ファイル(httpd.confなど)の内容をコピーしておく。

※今回はPlesk9下のバーチャルホストで動いているので、httpd.includeの内容をコピーしておく。

 

次に、alias用のapache設定ファイルを作成する。Plesk9配下で動いている場合は、confの下にvhost.confという名前で作成する必要がある。

参考にしたサイト)

 

SSL用にもこの設定ファイルをコピーしておく。Pleskの場合SSL用のファイル名は、vhost_ssl.confにする必要がある。内容はとりあえず同じでOK。

 

作成した設定ファイルをapacheに読み込んでもらうようにする。

参考にしたサイト):https://ex-cloud.jp/support/question/g-437

 

ヘルプサイトがワードプレスやCMSを使用している場合、.htaccessでリダイレクト設定(SEF 設定)を行っている場合があるので、静的URLでも動くよう修正する。

参考にしたサイト)

 

最後にWEBサーバをリロード

 

後はGoogleにインデックス登録してもらえるように、Search Console からsitemap.xmlなどを送信しておけばよいでしょう。

 

phpmyadminで大きなサイズのファイルをインポートする

.sqlファイルをインポートするときなど、制限があるとアップロードが途中で止まってしまう。

エラー:「アップロードしようとしたファイルが大きすぎるようです。…」など。

解決法としては、

  • エクスポート時にファイルを圧縮しておく。
  • Bigdumpを利用する。
  • sshで接続し、SCP転送する。

などがあるが、VPSやクラウド環境などの場合は、php.iniを編集した方が早いかも。

編集後、このままだと反映されないので、WEBサーバを再起動する必要があります。

以上。

参考サイト)

 

EC-CUBE(2系)で管理者権限の設定

動作確認はEC-CUBE2.13.2。結構古いけど。

例えば一部のメンバーは、商品管理メニューしか操作できないようにしたい時とか。

    1. まず「システム設定」→「マスターデータ設定」から「mtb_authority」を選択。
    2. 「追加のデータ」欄に、IDを指定(例えば2)し、値に権限名(例えば「商品管理者」)を入力。→「この内容で登録する」
    3. 「システム設定」→「マスターデータ設定」から「mtb_permission」を選択。
    4. 「基本情報管理」以下にアクセスできなくする場合、「追加のデータ」欄に、ID「/admin/basis/」、値「1」を設定。(この値が、ログインしたメンバーのID以下ならアクセス可能になる。ここを「2」にすれば追加した商品管理者もアクセス可能になる。)
    5. 他にもアクセス不可にしたいページがあれば、同様に「mtb_permission」に追加する。
    6. 「/data/class/SC_Session.php」を編集。
    7. 「/data/class/pages/error/LC_Page_Error_DispError.php」を編集。
    8.  「/data/Smarty/templates/admin/login_error.tpl」を編集。

以上。

  1. さらにメニューを非表示にしたい場合は、こちらなどを参照。

 

参考URL)

Smartyでループ内のindexを得る

Smartyのループの中で、現在何番目の処理かを知りたいときなどは、「index」プロパティを使用します。

 

例)リスト10件おきに広告を表示したいとき

 

参考URL)

CentOS5.5 keepalivedで負荷分散と冗長化

プライマリとスレーブのDB(MySQL)サーバを準備し、マスターがLVS(バランシング)も兼ねる。
通常はマスターに来たパケットを半分スレーブに流す。
またお互いに監視しあって、マスターがダウンした場合にスレーブがマスターに昇格するフェイルオーバ機能を作る。

2016-06-06_120846

※なおクラウドの場合、VIPが設定できなかったり、バケット転送ができないようになっている場合があるので、注意が必要。

以下、マスターのみの設定。

まずバランサのためipvsadm のインストール

いろいろ事前にインストールが必要らしい
# yum install -y kernel-devel

カーネルのIP_VSのバージョンを確認
# grep IP_VS_VERSION_CODE /usr/src/kernels/2.6.18-194.32.1.el5-i686/include/net/ip_vs.h
(32bitの場合は「2.6.18-194.32.1.el5-i686」を「2.6.18-194.32.1.el5-i386」に読み替える)
——————–
-> 0x010201
——————–
これはどうやらバージョン 1.2.1。

IP_VS_VERSION_CODE 1.2.1 に該当する ipvsadm は 1.24 である為、これをソースコードからインストール。

# cd /usr/local/src
# wget http://www.linux-vs.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
# tar zxvf ipvsadm-1.24.tar.gz
# cd ipvsadm-1.24
# mkdir -p /usr/src/linux
# ln -s /usr/src/kernels/2.6.18-194.32.1.el5-i686/include /usr/src/linux/include# make
# make -e BUILD_ROOT=/usr/local install

パスを通す
# cd ~/
# vi .bash_profile
以下を追記
——————–
PATH=${PATH}:/usr/local/sbin
export PATH
——————–
# source ~/.bash_profile

バージョン確認
# ipvsadm -v
——————–
-> ipvsadm v1.24 2005/12/10 (compiled with popt and IPVS v1.2.1)
——————–
v1.2.1なので、OK。

バランシング設定

192.168.10.100のVIPに来たDBアクセスをラウンドロビンさせる場合
# ipvsadm -A -t 192.168.10.100:3306 -s rr

追加された事を確認する。
# ipvsadm -Ln
—————————–
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.10.100:3306 rr
—————————–

VIP(192.168.10.100)で接続されたものを、次のサーバーへ転送する設定

192.168.10.100からリアルサーバのIPアドレスの192.168.10.101を追加。
# ipvsadm -a -t 192.168.10.100:3306 -r 192.168.10.101 -g

192.168.10.100からリアルサーバのIPアドレスの192.168.10.102を追加。
# ipvsadm -a -t 192.168.10.100:3306 -r 192.168.10.132 -g

確認
# ipvsadm -Ln
—————————–
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.10.100:3306 rr
-> 192.168.10.101:3306 Route 1 0 0
-> 192.168.10.102:3306 Route 1 0 0
—————————–

OSが再起動されたときに消えないように保存。
# ipvsadm -S

IPフォワード(パケット転送)の設定とARP設定
# vi /etc/sysctl.conf
————–
 :
# Controls IP packet forwarding
#net.ipv4.ip_forward = 0
net.ipv4.ip_forward = 1
 :
————–

設定内容反映
# sysctl -p
# cat /proc/sys/net/ipv4/ip_forward
————–
->1
————–
1と表示されればOK

以下、マスターとスレーブ共通

ifcfg-eth0:0など、VIP用の設定ファイルを削除またはリネーム。当然ネットワークはrestart。
# cd /etc/sysconfig/network-scripts
# mv ifcfg-eth0:0 ifcfg-eth0:0.bak
  :
# /etc/init.d/network restart

ローカルループバックアドレスにVIPアドレスを設定する。
#vi /etc/sysconfig/network-scripts/ifcfg-lo:0
—————————–
DEVICE=lo:0
IPADDR=192.168.10.100
NETMASK=255.255.255.255
ONBOOT=yes
—————————–

ネットワーク再起動
# /etc/init.d/network restart

keepalivedインストール

残念ながらyumにkeepalivedは無い。

まず依存関係インストール
# yum -y install make kernel kernel-devel rpm-build openssl-devel

keepalivedソースコード取得
# cd /usr/local/src
# wget http://www.keepalived.org/software/keepalived-1.1.20.tar.gz
# tar zxvf keepalived-1.1.20.tar.gz
# cd ./keepalived-1.1.20
# chown -R root:root /root/keepalived-1.1.20
# ./configure

RPMからインストール
# cp /usr/local/src/keepalived-1.1.20.tar.gz /usr/src/redhat/SOURCES/
# rpmbuild -ba ./keepalived.spec
# cd /usr/src/redhat/RPMS/x86_64(32bitの場合はi386)
# rpm -ivh ./keepalived-1.1.20-5.x86_64.rpm(32bitの場合はkeepalived-1.1.20-5.i386.rpm)

# チェック
keepalived -version

keepalived.confの「notify_master」と「notify_backup」を使い下記を現在のLVS STATEにより切り替える

LVSとリアルサーバが同一筐体の場合、
・master機の時は、VIPに対するarp応答をする
・slave機の時は、VIPに対するarp応答をしない

このためのShellを作る。

MASTER時用
# touch /etc/keepalived/lvs_master.sh
————————————-
#!/bin/sh
#lvs master起動時にARP応答する

/bin/sed -i -e ‘s/net.ipv4.conf.all.arp_ignore = 1//g;s/net.ipv4.conf.all.arp_announce = 2//g’ /etc/sysctl.conf

/sbin/sysctl -p
————————————-

スレーブ時用
# touch /etc/keepalived/lvs_backup.sh
————————————-
#!/bin/sh
#lvs backup起動時にARP応答を無効化する

/bin/echo ‘net.ipv4.conf.all.arp_ignore = 1’|/usr/bin/tee -a /etc/sysctl.conf
/bin/echo ‘net.ipv4.conf.all.arp_announce = 2’|/usr/bin/tee -a /etc/sysctl.conf

/sbin/sysctl -p
————————————-

※net.ipv4.conf.all.arp_ignore = 1 および net.ipv4.conf.all.arp_announce = 2
は、MACアドレスを覚えさせないようにする為、arpに応答させないための設定。
arpに返答してしまうと、MACアドレスを覚えてしまい、ipとmacアドレスが関係付けられてしまい送りたい機器へ通信がいかなくなるため。

設定ファイル編集
# vi /etc/keepalived/keepalived.conf
マスター側
————————————-
global_defs {
notification_email {
# 通知を受けるメールアドレス
down_notice@fuga.com
}
notification_email_from mysql1@hoge.com
smtp_server localhost
smtp_connect_timeout 30
}

vrrp_instance VI_1 {
state MASTER
# バーチャルIPのインターフェイス
interface eth1
# VRRPのID(共通)
virtual_router_id 105
# 優先度。スレーブより高くしておく
priority 51
# Master から送信する死活情報の秒指定
advert_int 1
# Master が落ちて Slave に系切り替えし、再度 Master が起動した
# 場合に Slave -> Master へ系切り替えをしないようにしたい場合は
# この nopreempt(Option 不要) を有効にする
#nopreempt
authentication {
auth_type PASS
auth_pass secret
}
virtual_ipaddress {
# バーチャルIP(keepalived が起動時に有効化するIP)を指定。
# 必ずバーチャルで付与したIP(例えば ip addr show したとき、
#「eth1」ではなく「eth1:1」となっている方のIP)を指定。
192.168.10.100 dev eth1
}
notify_master “/bin/sh /etc/keepalived/lvs_master.sh”
notify_backup “/bin/sh /etc/keepalived/lvs_backup.sh”
}

virtual_server 192.168.10.100 3306 {

# ヘルスチェックの間隔(秒)
delay_loop 120

lvs_method DR
protocol TCP
real_server 172.16.10.101 3306 {
TCP_CHECK {
connect_port 3306
connect_timeout 30
}
}
real_server 172.16.10.102 3306 {
TCP_CHECK {
connect_port 3306
connect_timeout 30
}
}
}

————————————-

スレーブ側
————————————-
global_defs {
notification_email {
down_notice@fuga.com
}
notification_email_from mysql2@hoge.com
smtp_server localhost
smtp_connect_timeout 30
}

vrrp_instance VI_2 {
state BACKUP
interface eth1
virtual_router_id 105
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass secret
}
virtual_ipaddress {
192.168.10.100 dev eth1
}
notify_master “/bin/sh /etc/keepalived/lvs_master.sh”
notify_backup “/bin/sh /etc/keepalived/lvs_backup.sh”
}
————————————-

mysqlが落ちて、かつマシン(vrrp)が動いている場合、フェイルオーバが効かないので、mysqlが落ちた時に自身のkeepalivedを落とすスクリプト(PHP)を作成。
こちらからのまるパクリです。

# touch /etc/keeplalive/mysql_alivecheck.php
————————————-
hostname‘;

// 成功したときに実行したいコマンド
$SUCCESS_BIN = ”;

$result = db_connect_check($HOST, $USER, $PASS, $DB_NAME);

if (!$result) {
// 失敗
print “error\n”;
if ($FAIL_BIN) {
system($FAIL_BIN);
}
} else {
// OK
if ($SUCCESS_BIN) {
system($SUCCESS_BIN);
}
}
exit;

function db_connect_check($host, $user, $pass, $db_name) {
$con = mysql_connect($host, $user, $pass, true);
if (!$con) {
// エラー表示
print mysql_error();
return false;
}

if ($db_name) {
if (!mysql_select_db($db_name, $con)) {
// エラー表示
print mysql_error();
return false;
}
}
return true;
}
?>
————————————-
※これはPHPの例だが、”mysqladmin -ping”でチェックするshellスクリプトなどでもOK。
CRONに登録
# vi /etc/crontab
————————————-
*/1 * * * * root php /etc/keeplalive/mysql_alivecheck.php;
————————————-

CRONじゃなくループでまわしちゃいたいときなどは下記参照。
http://d.hatena.ne.jp/bose999/20100926/1285440284

ていうか、こういうスクリプト走らせなくても、keepalivedのvirtual_serverディレクティブで自分のリアルIPの3306ポート監視して、notify_downでkeepalived落とせばいいんじゃないの?って思った。
↓こんな風に。
http://d.hatena.ne.jp/interdb/20131219/1387380530
試してませんが。

最後にkeepalivedの自動起動設定
# chkconfig keepalived on

あとは必要に応じてiptablesで規制をするなどしてください。
今回許可が必要なのはtcp、以下MySQL、vrrp、icmpくらい。
必要に応じてHTTP,DNSなど。

# 参考サイト
http://sonarsrv.com/blog/server/server_debian/344.html
http://d.hatena.ne.jp/bose999/20100925/1285408588
http://d.hatena.ne.jp/bose999/20100926/1285440284
http://qiita.com/nagais/items/b9b1940cdaf9a17b4088
http://infra.makeall.net/archives/1475
http://infra.makeall.net/archives/1607
http://infra.makeall.net/archives/1665
http://knowledge.sakura.ad.jp/tech/274/3/
http://knowledge.sakura.ad.jp/tech/274/4/
http://tanyaolinux.blogspot.jp/2014/04/vip-permanent.html
http://k-1-ne-jp.blogspot.jp/2013/02/lvsipvsadm.html
http://q.hatena.ne.jp/1199870913
http://d.hatena.ne.jp/interdb/20131219/1387380530
http://rksz.hateblo.jp/entry/2013/03/19_keepalived_lvs_load_balancer_2013
http://oxynotes.com/?p=6361#2
http://techblog.raccoon.ne.jp/archives/47152095.html