PG WORKS

PHPやLinux(サーバー)などのノウハウや、便利なツールを紹介していきます。

【PHP】JpCarbonで祝日判定

前にCarbonを使った日付処理を公開しました。

zen6a.hateblo.jp

仕事で祝日を判定する処理が必要なり調べたところ、Composerで「JpCarbon」という祝日を判定できる記事を見つけました。

enomotodev.hatenablog.com

祝日を判定し祝日であれば、何の祝日なのか表示する

require 'home/○○○/bin/vendor/autoload.php';

use Carbon\Carbon;
use JpCarbon\JpCarbon;

$dt = new Carbon('2018-12-23');
$st = JpCarbon::createFromDate($dt->year, $dt->month, $dt->day)->holiday;

echo $st;

祝日でなければ結果は何も表示されません。

【CentOS7】firewallでポート制御しよう

Apacheサーバーをロードバランサーを使って負荷分散をした際に「memcached」利用することになりました。

memcachedはセキュリティの関係上、IP制限を設定しないといけないためその設定方法をメモ。

memcached のアクセス制御に関する注意喚起

ポートの許可

firewall-cmd --add-service=http --zone=public --permanent
firewall-cmd --add-service=https --zone=public --permanent
firewall-cmd --add-service=mysql --zone=public --permanent

特定のIPだけを許可

firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="許可するIPアドレス" port protocol="tcp" port="11211" accept"

↑「11211」はmemcachedのポートです。

設定完了後、下記の反映コマンドを実行することでポート制限が有効になります。

firewallの設定を反映

firewall-cmd --reload

firewallの設定を確認

firewall-cmd --list-all-zones

firewallの起動/停止/確認

service firewalld start
service firewalld stop
service firewalld status

firewall自動起動の有効・無効設定

#有効
systemctl enable firewalld

#無効
systemctl disable firewalld

memcachedがIP制限が複数できないため、firewallを使うことになりました。

設定が難しいイメージがあったので避けていましたが、想像してたよりも簡単にできたので、これを機に覚えていきたいと思います。

Apache2.4でのWebアクセス制御

とある事情で国内のみのアクセス制限することになり、下記のサイトからIPリストを取得

www.cgis.biz

早速「.htaccess」で設定したら、サイトが落ちかけました。。。

.htaccess」はアクセスがあるたびに設定内容を読み込むため、国内のIPリストを4000行書くと、サーバーが応答不能になるほど重くなります。

CentOS7標準の「firewall」で設定しようと思いましたが、検索エンジンを回避方法がわからず。。。
※ユーザーエージェントで回避するみたいですが、設定がよくわからなひ(汗

vhost.conf

<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /example
    ServerName example.com
    <Directory "/example">
       Options FollowSymLinks
       AllowOverride All
       Include /etc/httpd/conf.d/iplist
    </Directory>
</VirtualHost>

バーチャルホストの設定を「/etc/httpd/conf.d/vhost.conf」に書いています。

「example」というフォルダが対象(サンプルなので各自の設定に書き換えてください。

4000行もipを書くため別ファイルに分けました。

iplist

SetEnvIf User-Agent "Googlebot" bok
SetEnvIf User-Agent "Slurp" bok
SetEnvIf User-Agent "msnbot" bok
SetEnvIf User-Agent "bingbot" bok
<RequireAny>
Require all denied
Require env bok
Require ip 1.0.16.0/20
Require ip 1.0.64.0/18
Require ip 1.1.64.0/18
#
#続きのipをここに記載
#
</RequireAny>

設定エラーがでないか「configtest」で確認

service httpd configtest


Syntax OK

と表示されれば問題ないので、Apacheを再起動させます。

service httpd restart

サイトが落とせないのであれば、下記のコマンドで反映できます。

service httpd graceful

【jQuery】プログラミングサンプル集

jQueryを書くときに忘れやすいコードをまとめて紹介していきます。
※随時更新します。

最新のCDNは、前回アップした記事の「jQuery読み込み」を参照

zen6a.hateblo.jp

イベント関係

zen6a.hateblo.jp

チェックボックスの状態確認

if($("#id").prop('checked')) {
/*チェック済み*/
}else{
/*チェックなし*/
}

該当のチェックボックスにチェックをつける

$('#id').prop('checked',true);

/*チェックをはずすとき*/
$('#id').prop('checked',false);

チェックボックスにチェックが入ったものだけを取得し配列に格納

var ids = [];
$( '#checkbox:checked' ).each( function() {
  ids.push( $( this ).val() );
});

セレクトボックスを選択する

/*optionのvalueが1になっている項目に選択*/
$('#id').val(1);

セレクトボックスの選択をはずす

$('#id' option').attr('selected', false);

ID名の取得

$('#id').attr('id');

クラス名の取得

$('#id').attr('class');

クラス名の判定

$('#id').hasclass('class名');

表示/非表示の交互に切り替え

$('#id').toggle();

form値を取得してajaxでPOST

var formdata = $('#formname').serialize();
$.ajax({
    url: url,
    type:'POST',
    dataType: 'text',
    data : formdata,
}).done(function(data) {
/*成功時の処理*/
}).fail(function(XMLHttpRequest, textStatus, errorThrown) {
/*失敗時の処理*/
})

form値を追加

var formdata = $(form).serializeArray();
formdata.push({param1: 'value1', param2: 'value2'});
$.ajax({
    url: url,
    type:'POST',
    dataType: 'text',
    data : formdata,
}).done(function(data) {
/*成功時の処理*/
}).fail(function(XMLHttpRequest, textStatus, errorThrown) {
/*失敗時の処理*/
})

.onイベントの使い方(動的に追加したものも判定

$(document).on('click', '#button', function(){
/*ここに処理記述*/
});

コンソールにログを出力

console.log('サンプル');

デバックダイアログを表示

alert('サンプル');

formのsubmitボタンを押したときにajaxでさらにPOSTしたときの動作について

WordPressプラグインをカスタマイズすることがあり、
どうしてもフックができなくて致し方なく、submitボタンを押したときにajaxで追加でPOSTする処理を入れました。

しかし

PCだと正常に動作するのに、スマホだとエラー(undefinedエラー)になり更新されない現象が判明。

なので、一時的に非同期処理しないようにajax部分に「async:false」を追加すると反映されることが確認できました。

var formData = $('form').serialize();
$.ajax({
	type: "POST",
	dataType:"text",
	url:"sample.php"
	data: formData,
	async: false,
	}).done(function(res){
    });
});

似たようなサンプル作り、同じ現象になるか試したいと思います。

↓↓↓

プログラムのサンプルと結果を追記しました。

テスト結果「ダメなパターン」

index.php

<html>
<head>
	<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
</head>
<body>
	<form method="POST">
		<input type="text" name="txt" value="">
		<input type="submit" id="testpost" value="POST実行">
	</form>
<script type="text/javascript">
$(document).ready(function(){
    $(document).on('click', '#testpost', function(){
		var formData = $('form').serialize();
		$.ajax({
			type: "POST",
			dataType:"text",
			url:"ajaxpost.php",
			data: formData
		}).done(function(res){
			alert("ok");
		}).fail(function(jqXHR, textStatus, errorThrown){
			alert("ng"+jqXHR.status+':'+textStatus+':'+errorThrown);
		});
	});
});
</script>
</body>
</html>

ajaxpost.php
※テストでファイル作成しただけなので、何も記述しなくても問題ないです。

ajaxpost


「async: false」をなしで、スマホでテストした結果「ng」のほうに飛んでしまいます。

「jqXHR.status」「textStatus」「errorThrown」でエラーを出力してみると、

jqXHR.status=0
textStatus=error
errorThrown=

エラーの詳細が書かれてません。。。

似たようなエラーが出た場合は、「async: false」を追加、または、ajaxだけでPOSTする処理に変更したほうが良いかもしれません。

そもそも、2重POSTする時点でおかしいですが、似たようなエラーに遭遇された方に参考になれば嬉しいです。