PHPでGS1からJANを作成

なかったので作りました。

 自己責任でお使いください

class gs1 {
    function gs1tojan($gs1) {
        //すべて半角数字または()であるかをチェック
        if (preg_match("/^[0-9()]+$/", $gs1))
            //最初の桁のインジケーターを判断
            if(mb_strlen($gs1)==18){
                if (strpos($gs1, '(010)') === 0|strpos($gs1, '(01)0') === 0) {
                    $janNoCheckDigit=mb_substr($gs1, 5, 12);
                    return $janNoCheckDigit.gs1::calcJanCodeDigit($janNoCheckDigit);
                }
            }else if(mb_strlen($gs1)==17){
                if (strpos($gs1, '(01)') === 0) {
                    $janNoCheckDigit=mb_substr($gs1, 4, 12);
                    return $janNoCheckDigit.gs1::calcJanCodeDigit($janNoCheckDigit);
                }
            }else if(mb_strlen($gs1)==16){
                if (strpos($gs1, '010') === 0) {
                    $janNoCheckDigit=mb_substr($gs1, 3, 12);
                    return $janNoCheckDigit.gs1::calcJanCodeDigit($janNoCheckDigit);
                }
            }else if(mb_strlen($gs1)==15){
                if (strpos($gs1, '01') === 0) {
                    $janNoCheckDigit=mb_substr($gs1, 2, 12);
                    return $janNoCheckDigit.gs1::calcJanCodeDigit($janNoCheckDigit);
                }
            }else if(mb_strlen($gs1)==14){
                if (strpos($gs1, '1') === 0) {
                    $janNoCheckDigit=mb_substr($gs1, 1, 12);
                    return $janNoCheckDigit.gs1::calcJanCodeDigit($janNoCheckDigit);
                }
            }
        }
        return false;
    }
    function calcJanCodeDigit($num) {
        $arr = str_split($num);
        $odd = 0;
        $mod = 0;
        for($i=0;$i<count($arr);$i++){
            if(($i+1) % 2 == 0) {
                //偶数の総和
                $mod += intval($arr[$i]);
            } else {
                //奇数の総和
                $odd += intval($arr[$i]);
            }
        }
        //偶数の和を3倍+奇数の総和を加算して、下1桁の数字を10から引く
        $cd = 10 - intval(substr((string)($mod * 3) + $odd,-1));
        //10なら1の位は0なので、0を返す。
        return $cd === 10 ? 0 : $cd;
    }   
}

PHPのバージョンを7.Xに上げたら、Notice: Array to string conversion in…’とエラーが出て、Arrayの配列結合演算子(+=)がきちんと動作しない

PHP5.6で問題なかったのにPHP7にバージョンアップしたら、Notice: Array to string conversion in…’とでて、Arrayが空っぽになった。

Arrayの($new_array +=$old_array)の部分でエラーが出ているから、配列結合演算子(+=)が悪いかと思ってたけど、実はそれは悪くなかった。

 

原因:

$old_arrayの作成で

$old_array=””;

$old_array[$num]=array(XXX => YYY);

$new_array +=$old_array

としてた。これが悪い!

 

解決:

$old_array=array(XXX => YYY);

$new_array[$num] +=$old_array

↑こうしましょう

$old_arrayに[$num]をつけるのはだめ

 

ApacheのPHP7にバージョンアップしたら実行時に500 Internal Server Errorが出て、php-fpmのエラーログに何も情報が表示されていない場合

.htaccessが悪い可能性が高いです。

私の場合は

.htaccessに

php_value post_max_size 100M
php_value upload_max_filesize 100M
php_flag display_errors On

が記載されていたことが原因でした。

php_valueとphp_flagを削除すると、ちゃんと動きました

どうもphp_valueやphp_flagはPHPのモジュール版でのみ有効で、php7ではセキュリティの観点からデフォルトで無効になっているようです。

素直にphp.iniで設定しましょう

 

CentOS7のPHP5.4をPHP7.xにアップデートしたらトラブった

当社の会社のHPの更新でPHPのアップデートを行った。

5.4系と7.x系だと処理の速さが違うのとセキュリティ対策(一応centosではデフォルトの5.4系でもサポートはしてくれている)が理由。

まぁ正直一番の理由はGoogleのPageSpeed insightsで当社のHPがすごく悪い結果だったから動作を少しでも早くするために重い腰を上げてアップデートした。

やったこと

参考:CentOS7のPHPを5.6/7.0/7.1/7.2/7.3系にバージョンアップする

【EPELリポジトリ】

yum install epel-release

rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

【PHPの削除】

cp /etc/php.ini /etc/php-old.ini

yum remove php-*

【PHP7.xのインストール】

yum install –disablerepo=* –enablerepo=epel,remi,remi-safe,remi-php73 php

yum install –disablerepo=* –enablerepo=epel,remi,remi-safe,remi-php73 php-mbstring

【MySQLとかいれる】

yum install php73-php-mysqlnd

※これ間違ってるから入れないでね

んでOSを再起動した

お使いのサーバーの PHP では WordPress に必要な MySQL 拡張を利用できないようです。

よく見るphp.iniにMysql.soのextensionが指定されていないときにでるエラーがでた。

MySQLいれたつもりだったからおかしいなと思いつつなんか色々MySQL関係を入れるか試してみる

当然デフォルトだと5.4系なので標準のはインストールできない

きっとExtensionがおかしいと思ってmysqli.soとかを追加したりしたけど動かない

正しくは

【Mysqlや他の必要な関連パッケージのインストール方法】

yum install –disablerepo=* –enablerepo=epel,remi,remi-safe,remi-php73 php-mysql

※73は7.3って意味

です

だからもし

Fatal error: Class ‘DOMDocument’ not found in 

が出て、php-xmlが必要な場合は

yum install –disablerepo=* –enablerepo=epel,remi,remi-safe,remi-php73 php-xml

をしましょう

 

CentOS7.6 にPHP7.2とNginx

個人的メモ

EPELリポジトリの追加

sudo rpm -ivh https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm

sudo yum -y update epel-release

Remiリポジトリの追加

sudo rpm –import http://rpms.famillecollet.com/RPM-GPG-KEY-remi

sudo rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

sudo yum -y update remi-release

 

sudo rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

sudo yum -y update nginx-release-centos

sudo yum -y –enablerepo=nginx install nginx

nginx -v

 

systemctl enable nginx

systemctl start nginx

firewall-cmd –add-service=http –zone=public –permanent

firewall-cmd –add-service=https –zone=public –permanent

firewall-cmd –reload

 

sudo groupadd -g 2222 hoge

sudo useradd -u 2222 -g hoge hoge

sudo usermod -s /bin/false hoge

sudo passwd hoge

パスの入力

 

PHP7.3インストール

sudo yum -y –enablerepo=remi-php73,epel install php-fpm php-gd php-gmp php-mbstring php-mcrypt php-opcache php-pdo php-pear-MDB2-Driver-mysqli php-pecl-memcached php-pecl-msgpack php-xml

PHPの確認

php -v

 

vi /etc/php-fpm.d/www.conf

user = hoge

; RPM: Keep a group allowed to write in log dir.

group = hoge

 

# 37行目あたり

listen = /var/run/php-fpm/php-fpm.sock

# 48行目あたり

listen.owner = hoge

listen.group = hoge

listen.mode = 0660

 

にする

 

sudo vi /etc/nginx/nginx.conf

# 2行目あたり

user  hoge;

 

sudo systemctl start php-fpm.service

sudo systemctl enable php-fpm.service

 

$ sudo vi /etc/nginx/conf.d # 30行目あたり

    location ~ \.php$ {

        root   /usr/share/nginx/html;

        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;

        fastcgi_index  index.php;

        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

        include        fastcgi_params;

    } /default.conf

 

 

https://qiita.com/ksugawara61/items/0fcf3f72cc905bb6d654

ここと99%一緒なので↑みる

 

ついでにSSLいれてでHTTPS化する

cat medicalfields.jp.crt alphassl_intermediate_ca.cer > medicalfields.jp.pem

 

PEM routines:PEM_read_bio:bad end line.

がでたら

medicalfields.jp.pemのファイルを開いて

間に改行を入れて

—–END CERTIFICATE—–

—–BEGIN CERTIFICATE—–

にする

 

sudo vi /etc/nginx/conf.d/default.conf

server {

    listen 443 ssl;

    server_name _;

    ssl_certificate /etc/nginx/ssl/medicalfields.jp.pem;

    ssl_certificate_key /etc/nginx/ssl/medicalfields.jp.key;

~HTTPをコピペ~

}

 

 

/etc/nginx/conf.d/default.conf

server {

    listen 443 ssl;

    server_name _;

    ssl_certificate /etc/nginx/ssl/medicalfields.jp.pem;

    ssl_certificate_key /etc/nginx/ssl/medicalfields.jp.key;

    location / {

        root   /usr/share/nginx/html;

        index  index.html index.htm;

    }

 

    #error_page  404              /404.html;

 

    # redirect server error pages to the static page /50x.html

    #

    error_page   500 502 503 504  /50x.html;

    location = /50x.html {

        root   /usr/share/nginx/html;

    }

 

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80

    #

    #location ~ \.php$ {

    #    proxy_pass   http://127.0.0.1;

    #}

 

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

    #

    location ~ \.php$ {

        root           /usr/share/nginx/html;

        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;

        fastcgi_index  index.php;

        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

        include        fastcgi_params;

    }

 

    # deny access to .htaccess files, if Apache’s document root

    # concurs with nginx’s one

    #

    #location ~ /\.ht {

    #    deny  all;

    #}

 

}

server {    

listen 80;    

server_name _ ;    

# ここの部分で判定!!   

if ($http_x_forwarded_proto != https) {     

return 301 https://$host$request_uri;   

}

}

リダイレクトループ対策でIFいれる

 

ロードバランサー

ラウンドロビンのヘルスモニターはPINGで(HTTPだと何か動かない時があったりちょっと不安定だった)

vi /etc/sysconfig/network-scripts/ifcfg-lo:0

 

DEVICE=lo:0

IPADDR=157.7.94.188

NETMASK=255.255.255.255

ONBOOT=yes

 

service network restart

 

オブジェクトストレージをマウントした

https://support.conoha.jp/v/objectstoragemount/

 

 

mount -t svfs object_storage /mnt -o auth_url=https://identity.tyo1.conoha.io/v2.0,username=gncu7228652,password=パス,tenant=gnct7228652

再起動時にマウント

vi /etc/fstab

一番下に

object_storage /mnt svfs auth_url=https://identity.tyo1.conoha.io/v2.0,username=gncu7228652,password=password,tenant=gnct7228652,rw,_netdev 1

 

WindowsのソフトはCyberDuck

https://support.conoha.jp/v/objectstoragecyberduck/

PHPのMPDFの古いバージョンをPHP7.2でつかう

<b>Warning</b>: A non-numeric value encountered in <b>C:\xampp\htdocs\mpdf60\mpdf.php</b> on line <b>32511</b><br />
<br />
<b>Warning</b>: count(): Parameter must be an array or an object that implements Countable in <b>C:\xampp\htdocs\mpdf60\mpdf.php</b> on line <b>1770</b><br />
<br />
<b>Warning</b>: Cannot modify header information – headers already sent by (output started at C:\xampp\htdocs\mpdf60\mpdf.php:32511) in <b>C:\xampp\htdocs\mpdf60\mpdf.php</b> on line <b>7706</b><br />
<br />
<b>Warning</b>: Cannot modify header information – headers already sent by (output started at C:\xampp\htdocs\mpdf60\mpdf.php:32511) in <b>C:\xampp\htdocs\mpdf60\mpdf.php</b> on line <b>1746</b><br />
<B>mPDF error: </B>Some data has already been output to browser, can’t send PDF file

とか出てきます。

phpのエラー表示でerror_reporting(0);にしましょう

よほど古くないとたいてい動きます。

またこれとは関係ないけどmPDFの

imgタグの data:image/jpg;base64

で画像が表示されない場合はbase64のJPGのMPDFのファイルサイズ制限は1MBでそれ以下になるようにしましょう(Base64はサイズが増えるからつまり750KBぐらいまでしか実質無理)

 

Apacheでセキュリティのため限られたIPのみのアクセスにしたい場合、PHPを使って.htaccessにアクセス元のグローバルIPを追加する方法

apacheなどのWEBサーバーを運用さしているときにプライベートのサーバーだと外部からのアクセスがあるとあまり宜しくない時がある。

その時は

order deny,allow
deny from all

で全部を拒否さして

allow from xxx.xxx.xxx.xxx

などで個別にアクセス出来るようにすると非常に安全になる。

でもIPが定まらないときすごくめんどくさい。

どうしようかなと思ったら.htaccessにPHPから追加出来ることがわかった。

これだと特定のディレクトリのURLにアクセスすることで、Apache全体にアクセス許可を与える事になってセキュリティがアップする。

簡単に言うと

http://yoursite.com/

にアクセス

403エラーForbidden あなたがアクセスしたページはインターネット上に存在はするが閲覧することが許可されていません。

http://yoursite.com/allowaccess.php

にアクセス

200 アクセス許可を与えました!

http://yoursite.com/

にアクセス

200 成功 ようこそ!

となる

これを応用してWordpressのログイン画面のwp-login.phpだけのアクセスを制限さしたり出来る。

特定のファイルだけアクセス制限したい場合は

すでにある.htaccessに

<Files wp-login.php>
Order deny,allow
Deny from all
</Files>

を最後に追加しましょう。

ディレクトリ全部の場合は

order deny,allow
deny from all

だけでいいです。でもその場合違うサブディレクトリを新しく作ってそこの.htaccessで

allow from all

をしてあげてね

アクセス権限を与えるやり方

ホームディレクトリの

.htaccess

# BEGIN WordPress
&amp;amp;lt;IfModule mod_rewrite.c&amp;amp;gt;
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
&amp;amp;lt;/IfModule&amp;amp;gt;

# END WordPress
&amp;amp;lt;Files wp-login.php&amp;amp;gt;
Order deny,allow
Deny from all
allow from 101.140.66.155
&amp;amp;lt;/Files&amp;amp;gt;

と同じディレクトリに新規でファイルを作成

allowaccess.php

 

&amp;amp;lt;?php
$file = dirname(__FILE__) . "/.htaccess"; // 一つ上のディレクトリなら /../.htaccess です。
$remainLastLetter = 8; // 最後に&amp;amp;lt;/Files&amp;amp;gt;などある場合は8を入力して文字を保護をしてください。

if (! file_exists($file)) {
    exit(".htaccessファイルが存在しないかアクセスできません。");
}
$ip = $_SERVER["REMOTE_ADDR"];

$addAllowIP = "allow from " . $ip;
$originalHtaccess = file_get_contents($file);
if (strpos($originalHtaccess, $addAllowIP) !== false) {
    exit("すでにIPが登録されています。");
}

$lastLetters = "";
if ($remainLastLetter &amp;amp;gt; 0)
    $lastLetters = substr($originalHtaccess, - $remainLastLetter);
$startLetters = substr($originalHtaccess, 0, strlen($originalHtaccess) - $remainLastLetter);
$newHtaccess = $startLetters . $addAllowIP . "\n" . $lastLetters;
if (file_put_contents($file, $newHtaccess)) {
    echo $ip . "のアクセス許可を与えました";
} else {
    exit(".htaccessファイルの書き込みに失敗しました。アクセス権を確認してください。");
}

 

上をコピーして貼り付けてください。

自作なので汚くてすいません。

$remainLastLetterと$file は適宜変更してください。

これでhttp://yoursite.com/allowaccess.phpにアクセスするだけでアクセス権を得られてセキュリティがアップします!

※↑のPHPファイルと.htaccessファイルがおかしいのでサーバーにアップロードしました。

こちらからダウンロード

 

 

 

 

JPGのExifのorientationを削除する方法

マジで情報がなかった。

PHPの実装されたExif情報を操作するライブラリ「PEL」を使うやり方

 

もしコメントを入れたいなら↓で出来る

<?php
require_once(‘pel-0.9.1/PelJpeg.php’);

$filename = “DSC_3297.JPG”;
$jpeg = new PelJpeg($filename);
$app1 = $jpeg->getExif();

if ($app1) {
$tiff = $app1->getTiff();
$ifd0 = $tiff->getIfd();

if ($ifd0) {
$exif = $ifd0->getSubIfd(PelIfd::EXIF);
$text = “コメントです”;
$entry = $exif->getEntry(PelTag::USER_COMMENT);
if (!$entry) {
$entry = new PelEntryUserComment(mb_convert_encoding($text, “JIS”,
“auto”), “JIS”);
$exif->addEntry($entry);
} else {
$entry->setValue(mb_convert_encoding($text, “JIS”, “auto”), “JIS”);
}
file_put_contents($filename, $jpeg->getBytes());
}
}

しかしJPGの方向(orientation)を変えるのはどうしたらいいのだろうか

答え↓

$img_toPel = new PelJpeg ( $img_to );
$app1 = $img_toPel->getExif();

if ($app1) {
$tiff = $app1->getTiff();
$ifd0 = $tiff->getIfd();
$entry = $ifd0->getEntry(PelTag::ORIENTATION); // Orientation
echo $entry->getValue();
if (!$entry) {
$entry = new PelEntryShort( PelTag::ORIENTATION,1 );
$exif->addEntry($entry);
} else {
$entry->setValue(1);
}
file_put_contents ( $img_to, $img_toPel->getBytes () );
}

もしいろんな情報のExifを変えたい場合は

/pel/src/PelTag.php

のFormat: にそれぞれに適したフォーマット(PelTag::ORIENTATIONだったらPelEntryShort)が書いてる

書き方わかんない場合は

\pel\test\image-tests

を見たら一番早いそれぞれのGPS情報とかいろいろのサンプル書いてる

 

¥の挙動

PHPでファイルパスを指定するとき¥を使うけど、

¥を二回¥¥とやっても¥が一回しかないよー的な動作をしたり2つある的な動作もする。

もしD:\\とか場合だと正規表現できちんと認識させるためには\\\\\\\\としないといけない

$dir=”D:\\test”

if(preg_match(‘{^(?:[a-zA-Z]\:(\\\\\\\\|\/\/\/\/))([^\\\/\:\*\?\<\>\”\|]+(\\\\\\\\|\/\/\/\/){0,1})+$}’, $dir, $m))

はOK

if(preg_match(‘{^(?:[a-zA-Z]\:(\\\\|\/\/))([^\\\/\:\*\?\<\>\”\|]+(\\\\|\/\/){0,1})+$}’, $dir, $m))

はNG

file_get_contentsとかでエラーメッセージを出したくないとき

file_get_contentsとか404リクエストだとエラーメッセージが出る。

それはいらない場合

@file_get_contents

でエラーメッセージを表示しなくなる

@を付けるとそんな効果があるとはしらなかった。